cdk-opennext 0.3.0 → 0.3.1

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 CHANGED
@@ -8426,7 +8426,7 @@
8426
8426
  },
8427
8427
  "name": "cdk-opennext",
8428
8428
  "readme": {
8429
- "markdown": "# About\n\nCDK construct to deploy a NextJs 15 or higher application using the\n[OpenNext AWS adapter](https://github.com/opennextjs/opennextjs-aws).\n\nIt works best if [deployed in an Nx\nmonorepo](https://opennext.js.org/aws/config/nx).\n\nThis OpenNext CDK construct is based on [the reference\nconstruct](https://opennext.js.org/aws/reference-implementation)\nprovided by OpenNext. The example has been modernised, and the deploy\nto ECS option has been removed.\n\n# Usage\n\n1. Install:\n\n```sh\nnpm install esbuild @opennextjs/aws cdk-opennext\n```\n\n2. Build your app: `npx next build`\n\n3. Build with open-next: `npx open-next build`\n\n4. Add the `NextjsSite` construct:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n openNextPath: \".open-next\",\n})\n```\n\n`openNextPath` is optional and defaults to \".open-next\".\n\nYou can customize the Lambda function configuration using `defaultFunctionProps`:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Duration } from \"aws-cdk-lib/core\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n defaultFunctionProps: {\n memorySize: 2048,\n timeout: Duration.seconds(30),\n environment: {\n MY_ENV_VAR: \"value\",\n },\n },\n})\n```\n\n# How it works\n\nThis package assumes that the Next and OpenNext build are done outside\nof this construct. Therefore this package does not pull in the\n`@opennextjs/aws` package, but it should be a dependency of your package.\n\nObviously you don't wantt to build this manually all the time, that's\nwhere Nx comes in.\n\n## Use with Nx\n\nConfiguring Nx is also covered in [the OpeNext documentation](https://opennext.js.org/aws/config/nx).\n\nIn your Nx `project.json` add a \"build\" target to build next:\n\n```json\n\"build\": {\n \"options\": {\n \"command\": \"next build\"\n },\n \"inputs\": [\n \"default\",\n \"^production\",\n \"!{projectRoot}/.next\",\n \"!{projectRoot}/.open-next\",\n \"!{projectRoot}/open-next.config.ts\",\n \"!{projectRoot}/cdk.json\",\n \"!{projectRoot}/cdk.context.json\"\n ],\n \"outputs\": [\"{projectRoot}/.next\"]\n},\n```\n\nIf you enable caching, it will only build when your NextJs app has actually changed.\n\nThen add a target to build OpenNext:\n\n```json\n\"build-open-next\": {\n \"executor\": \"nx:run-commands\",\n \"dependsOn\": [\"build\"],\n \"cache\": true,\n \"inputs\": [\"{projectRoot}/open-next.config.ts\", \"{projectRoot}/.next\"],\n \"outputs\": [\"{projectRoot}/.open-next\"],\n \"options\": {\n \"cwd\": \"{projectRoot}\",\n \"command\": \"open-next build\"\n }\n},\n```\n\nAnd finally for your cdk deploy target, depend on the open next build:\n\n```json\n\"deploy\": {\n \"dependsOn\": [\"build-open-next\"]\n}\n```\n\nSet the output to standalone in `next.config.ts`, this is key:\n\n```ts\nconst nextConfig: NextConfig = {\n output: \"standalone\",\n ...\n}\n```\n\nYour `open-next.config.ts` can look like this:\n\n```ts\nimport type { OpenNextConfig } from \"@opennextjs/aws/types/open-next\"\n\nconst config = {\n default: {\n install: {\n packages: [\"@swc/helpers@0.5.15\", \"styled-jsx@5.1.6\", \"@next/env@16.0.1\", \"pg\"],\n arch: \"arm64\",\n },\n },\n buildCommand: \"exit 0\", // Nx builds Next for us\n packageJsonPath: \"../../\", // Root directory of monorepo\n} satisfies OpenNextConfig\n\nexport default config\n```\n\nThe packages to install depend on your particular config. If you don't\nuse postgres for example, remove \"pg\".\n\n# SST v2 compatibility\n\nSwitching to this construct is a fairly major update. All functions will be replaced.\n\nNot yet implemented functionality:\n\n- [ ] Warmer function\n\n# Comparison to other implementations\n\n- [SST v2](https://github.com/sst/v2): this is what I used in the\n past, but it's now community supported, PRs are being merged slowly,\n and it's getting very hard to integrate in modern monorepos.\n- [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs/):\n seems actively maintained, but README.md feels very dated. It's now\n also based on OpenNext but unclear how it tracks against OpenNext.\n- [cdklabs/cdk-nextjs](https://github.com/cdklabs/cdk-nextjs): not\n based on the OpenNext adapter. Needs NAT gateway and EFS, so very\n expensive to run.\n- [open-next-cdk](https://github.com/datasprayio/open-next-cdk): no\n longer maintained it seems\n"
8429
+ "markdown": "# About\n\nCDK construct to deploy a NextJs 15 or higher application using the\n[OpenNext AWS adapter](https://github.com/opennextjs/opennextjs-aws).\n\nIt works best if [deployed in an Nx\nmonorepo](https://opennext.js.org/aws/config/nx).\n\nThis OpenNext CDK construct is based on [the reference\nconstruct](https://opennext.js.org/aws/reference-implementation)\nprovided by OpenNext. The example has been modernised, and the deploy\nto ECS option has been removed.\n\n# Usage\n\n1. Install:\n\n```sh\nnpm install --save-dev esbuild @opennextjs/aws cdk-opennext\n```\n\n2. Build your app: `npx next build`\n\n3. Build with open-next: `npx open-next build`\n\n4. Add the `NextjsSite` construct:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n openNextPath: \".open-next\",\n})\n```\n\n`openNextPath` is optional and defaults to \".open-next\".\n\nYou can customize the Lambda function configuration using `defaultFunctionProps`:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Duration } from \"aws-cdk-lib/core\"\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n defaultFunctionProps: {\n memorySize: 2048,\n timeout: Duration.seconds(30),\n environment: {\n MY_ENV_VAR: \"value\",\n },\n },\n})\n```\n\n## Custom Domain\n\nYou can configure a custom domain in three ways:\n\n### Option 1: Route 53 Hosted Zone (automatic certificate and DNS)\n\nProvide a hosted zone and the construct will automatically create a DNS-validated\ncertificate and set up A/AAAA records:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { HostedZone } from \"aws-cdk-lib/aws-route53\"\n\nconst hostedZone = HostedZone.fromLookup(this, \"HostedZone\", {\n domainName: \"example.com\",\n})\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n customDomain: {\n domainName: \"app.example.com\",\n hostedZone: hostedZone,\n },\n})\n```\n\n### Option 2: Bring Your Own Certificate (external DNS)\n\nProvide your own ACM certificate when DNS is managed externally. The certificate\nmust be in us-east-1 for CloudFront:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Certificate } from \"aws-cdk-lib/aws-certificatemanager\"\n\nconst certificate = Certificate.fromCertificateArn(\n this,\n \"Certificate\",\n \"arn:aws:acm:us-east-1:123456789012:certificate/...\"\n)\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n customDomain: {\n domainName: \"app.example.com\",\n certificate: certificate,\n },\n})\n// Configure your DNS provider to point app.example.com to site.distribution.distributionDomainName\n```\n\n### Option 3: Bring Your Own Certificate with Route 53 DNS\n\nProvide both a certificate and hosted zone to use your own certificate while\nstill having the construct manage DNS records:\n\n```typescript\nimport { NextjsSite } from \"cdk-opennext\"\nimport { Certificate } from \"aws-cdk-lib/aws-certificatemanager\"\nimport { HostedZone } from \"aws-cdk-lib/aws-route53\"\n\nconst hostedZone = HostedZone.fromLookup(this, \"HostedZone\", {\n domainName: \"example.com\",\n})\n\nconst certificate = Certificate.fromCertificateArn(\n this,\n \"Certificate\",\n \"arn:aws:acm:us-east-1:123456789012:certificate/...\"\n)\n\nconst site = new NextjsSite(this, \"NextjsSite\", {\n customDomain: {\n domainName: \"app.example.com\",\n hostedZone: hostedZone,\n certificate: certificate,\n },\n})\n```\n\n# How it works\n\nThis package assumes that the Next and OpenNext build are done outside\nof this construct. Therefore this package does not pull in the\n`@opennextjs/aws` package, but it should be a dependency of your package.\n\nObviously you don't wantt to build this manually all the time, that's\nwhere Nx comes in.\n\n## Use with Nx\n\nConfiguring Nx is also covered in [the OpeNext documentation](https://opennext.js.org/aws/config/nx).\n\nIn your Nx `project.json` add a \"build\" target to build next:\n\n```json\n\"build\": {\n \"options\": {\n \"command\": \"next build\"\n },\n \"inputs\": [\n \"default\",\n \"^production\",\n \"!{projectRoot}/.next\",\n \"!{projectRoot}/.open-next\",\n \"!{projectRoot}/open-next.config.ts\",\n \"!{projectRoot}/cdk.json\",\n \"!{projectRoot}/cdk.context.json\"\n ],\n \"outputs\": [\"{projectRoot}/.next\"]\n},\n```\n\nIf you enable caching, it will only build when your NextJs app has actually changed.\n\nThen add a target to build OpenNext:\n\n```json\n\"build-open-next\": {\n \"executor\": \"nx:run-commands\",\n \"dependsOn\": [\"build\"],\n \"cache\": true,\n \"inputs\": [\"{projectRoot}/open-next.config.ts\", \"{projectRoot}/.next\"],\n \"outputs\": [\"{projectRoot}/.open-next\"],\n \"options\": {\n \"cwd\": \"{projectRoot}\",\n \"command\": \"open-next build\"\n }\n},\n```\n\nAnd finally for your cdk deploy target, depend on the open next build:\n\n```json\n\"deploy\": {\n \"dependsOn\": [\"build-open-next\"]\n}\n```\n\nSet the output to standalone in `next.config.ts`, this is key:\n\n```ts\nconst nextConfig: NextConfig = {\n output: \"standalone\",\n ...\n}\n```\n\nYour `open-next.config.ts` can look like this:\n\n```ts\nimport type { OpenNextConfig } from \"@opennextjs/aws/types/open-next\"\n\nconst config = {\n default: {\n install: {\n packages: [\"@swc/helpers@0.5.15\", \"styled-jsx@5.1.6\", \"@next/env@16.0.1\", \"pg\"],\n arch: \"arm64\",\n },\n },\n buildCommand: \"exit 0\", // Nx builds Next for us\n packageJsonPath: \"../../\", // Root directory of monorepo\n} satisfies OpenNextConfig\n\nexport default config\n```\n\nThe packages to install depend on your particular config. If you don't\nuse postgres for example, remove \"pg\".\n\n# SST v2 compatibility\n\nSwitching to this construct is a fairly major update. All functions will be replaced.\n\nNot yet implemented functionality:\n\n- [ ] Warmer function\n\n# Comparison to other implementations\n\n- [SST v2](https://github.com/sst/v2): this is what I used in the\n past, but it's now community supported, PRs are being merged slowly,\n and it's getting very hard to integrate in modern monorepos.\n- [cdk-nextjs-standalone](https://github.com/jetbridge/cdk-nextjs/):\n seems actively maintained, but README.md feels very dated. It's now\n also based on OpenNext but unclear how it tracks against OpenNext.\n- [cdklabs/cdk-nextjs](https://github.com/cdklabs/cdk-nextjs): not\n based on the OpenNext adapter. Needs NAT gateway and EFS, so very\n expensive to run.\n- [open-next-cdk](https://github.com/datasprayio/open-next-cdk): no\n longer maintained it seems\n"
8430
8430
  },
8431
8431
  "repository": {
8432
8432
  "type": "git",
@@ -8513,15 +8513,35 @@
8513
8513
  {
8514
8514
  "abstract": true,
8515
8515
  "docs": {
8516
+ "remarks": "Required if `hostedZone` is not provided. The certificate must be in\nus-east-1 for CloudFront distributions.\n\nWhen provided without `hostedZone`, no DNS aliases will be created\nand you must configure DNS records externally.",
8517
+ "stability": "stable",
8518
+ "summary": "The ACM certificate to use for the custom domain."
8519
+ },
8520
+ "immutable": true,
8521
+ "locationInModule": {
8522
+ "filename": "src/open-next.ts",
8523
+ "line": 129
8524
+ },
8525
+ "name": "certificate",
8526
+ "optional": true,
8527
+ "type": {
8528
+ "fqn": "aws-cdk-lib.aws_certificatemanager.ICertificate"
8529
+ }
8530
+ },
8531
+ {
8532
+ "abstract": true,
8533
+ "docs": {
8534
+ "remarks": "Required if `certificate` is not provided. When provided, a DNS-validated\ncertificate will be created automatically and DNS aliases will be set up.",
8516
8535
  "stability": "stable",
8517
8536
  "summary": "Import the underlying Route 53 hosted zone."
8518
8537
  },
8519
8538
  "immutable": true,
8520
8539
  "locationInModule": {
8521
8540
  "filename": "src/open-next.ts",
8522
- "line": 115
8541
+ "line": 118
8523
8542
  },
8524
8543
  "name": "hostedZone",
8544
+ "optional": true,
8525
8545
  "type": {
8526
8546
  "fqn": "aws-cdk-lib.aws_route53.IHostedZone"
8527
8547
  }
@@ -8542,7 +8562,7 @@
8542
8562
  },
8543
8563
  "locationInModule": {
8544
8564
  "filename": "src/open-next.ts",
8545
- "line": 172
8565
+ "line": 186
8546
8566
  },
8547
8567
  "parameters": [
8548
8568
  {
@@ -8568,7 +8588,7 @@
8568
8588
  "kind": "class",
8569
8589
  "locationInModule": {
8570
8590
  "filename": "src/open-next.ts",
8571
- "line": 143
8591
+ "line": 157
8572
8592
  },
8573
8593
  "name": "NextjsSite",
8574
8594
  "properties": [
@@ -8579,7 +8599,7 @@
8579
8599
  "immutable": true,
8580
8600
  "locationInModule": {
8581
8601
  "filename": "src/open-next.ts",
8582
- "line": 166
8602
+ "line": 180
8583
8603
  },
8584
8604
  "name": "customDomainUrl",
8585
8605
  "type": {
@@ -8593,7 +8613,7 @@
8593
8613
  "immutable": true,
8594
8614
  "locationInModule": {
8595
8615
  "filename": "src/open-next.ts",
8596
- "line": 158
8616
+ "line": 172
8597
8617
  },
8598
8618
  "name": "defaultServerFunction",
8599
8619
  "type": {
@@ -8607,7 +8627,7 @@
8607
8627
  "immutable": true,
8608
8628
  "locationInModule": {
8609
8629
  "filename": "src/open-next.ts",
8610
- "line": 154
8630
+ "line": 168
8611
8631
  },
8612
8632
  "name": "distribution",
8613
8633
  "type": {
@@ -8621,7 +8641,7 @@
8621
8641
  "immutable": true,
8622
8642
  "locationInModule": {
8623
8643
  "filename": "src/open-next.ts",
8624
- "line": 162
8644
+ "line": 176
8625
8645
  },
8626
8646
  "name": "url",
8627
8647
  "type": {
@@ -8641,7 +8661,7 @@
8641
8661
  "kind": "interface",
8642
8662
  "locationInModule": {
8643
8663
  "filename": "src/open-next.ts",
8644
- "line": 118
8664
+ "line": 132
8645
8665
  },
8646
8666
  "name": "NextjsSiteProps",
8647
8667
  "properties": [
@@ -8655,7 +8675,7 @@
8655
8675
  "immutable": true,
8656
8676
  "locationInModule": {
8657
8677
  "filename": "src/open-next.ts",
8658
- "line": 127
8678
+ "line": 141
8659
8679
  },
8660
8680
  "name": "customDomain",
8661
8681
  "optional": true,
@@ -8673,7 +8693,7 @@
8673
8693
  "immutable": true,
8674
8694
  "locationInModule": {
8675
8695
  "filename": "src/open-next.ts",
8676
- "line": 140
8696
+ "line": 154
8677
8697
  },
8678
8698
  "name": "defaultFunctionProps",
8679
8699
  "optional": true,
@@ -8691,7 +8711,7 @@
8691
8711
  "immutable": true,
8692
8712
  "locationInModule": {
8693
8713
  "filename": "src/open-next.ts",
8694
- "line": 134
8714
+ "line": 148
8695
8715
  },
8696
8716
  "name": "openNextPath",
8697
8717
  "optional": true,
@@ -8703,6 +8723,6 @@
8703
8723
  "symbolId": "src/open-next:NextjsSiteProps"
8704
8724
  }
8705
8725
  },
8706
- "version": "0.3.0",
8707
- "fingerprint": "bQpCK/zB6xodVIEx20PfUfdbup8ZkCrbTCjlDIW016Y="
8726
+ "version": "0.3.1",
8727
+ "fingerprint": "PIAnQ66gq+87dLJ8DrR96JBoqL3lnOQ6ptbChHnNj8w="
8708
8728
  }
package/API.md CHANGED
@@ -1063,6 +1063,7 @@ const distributionDomainProps: DistributionDomainProps = { ... }
1063
1063
  | **Name** | **Type** | **Description** |
1064
1064
  | --- | --- | --- |
1065
1065
  | <code><a href="#cdk-opennext.DistributionDomainProps.property.domainName">domainName</a></code> | <code>string</code> | The domain to be assigned to the website URL (ie. domain.com). |
1066
+ | <code><a href="#cdk-opennext.DistributionDomainProps.property.certificate">certificate</a></code> | <code>aws-cdk-lib.aws_certificatemanager.ICertificate</code> | The ACM certificate to use for the custom domain. |
1066
1067
  | <code><a href="#cdk-opennext.DistributionDomainProps.property.hostedZone">hostedZone</a></code> | <code>aws-cdk-lib.aws_route53.IHostedZone</code> | Import the underlying Route 53 hosted zone. |
1067
1068
 
1068
1069
  ---
@@ -1081,7 +1082,25 @@ Supports domains that are hosted either on [Route 53](https://aws.amazon.com/rou
1081
1082
 
1082
1083
  ---
1083
1084
 
1084
- ##### `hostedZone`<sup>Required</sup> <a name="hostedZone" id="cdk-opennext.DistributionDomainProps.property.hostedZone"></a>
1085
+ ##### `certificate`<sup>Optional</sup> <a name="certificate" id="cdk-opennext.DistributionDomainProps.property.certificate"></a>
1086
+
1087
+ ```typescript
1088
+ public readonly certificate: ICertificate;
1089
+ ```
1090
+
1091
+ - *Type:* aws-cdk-lib.aws_certificatemanager.ICertificate
1092
+
1093
+ The ACM certificate to use for the custom domain.
1094
+
1095
+ Required if `hostedZone` is not provided. The certificate must be in
1096
+ us-east-1 for CloudFront distributions.
1097
+
1098
+ When provided without `hostedZone`, no DNS aliases will be created
1099
+ and you must configure DNS records externally.
1100
+
1101
+ ---
1102
+
1103
+ ##### `hostedZone`<sup>Optional</sup> <a name="hostedZone" id="cdk-opennext.DistributionDomainProps.property.hostedZone"></a>
1085
1104
 
1086
1105
  ```typescript
1087
1106
  public readonly hostedZone: IHostedZone;
@@ -1091,6 +1110,9 @@ public readonly hostedZone: IHostedZone;
1091
1110
 
1092
1111
  Import the underlying Route 53 hosted zone.
1093
1112
 
1113
+ Required if `certificate` is not provided. When provided, a DNS-validated
1114
+ certificate will be created automatically and DNS aliases will be set up.
1115
+
1094
1116
  ---
1095
1117
 
1096
1118
  ### NextjsSiteProps <a name="NextjsSiteProps" id="cdk-opennext.NextjsSiteProps"></a>
package/README.md CHANGED
@@ -16,7 +16,7 @@ to ECS option has been removed.
16
16
  1. Install:
17
17
 
18
18
  ```sh
19
- npm install esbuild @opennextjs/aws cdk-opennext
19
+ npm install --save-dev esbuild @opennextjs/aws cdk-opennext
20
20
  ```
21
21
 
22
22
  2. Build your app: `npx next build`
@@ -52,6 +52,84 @@ const site = new NextjsSite(this, "NextjsSite", {
52
52
  })
53
53
  ```
54
54
 
55
+ ## Custom Domain
56
+
57
+ You can configure a custom domain in three ways:
58
+
59
+ ### Option 1: Route 53 Hosted Zone (automatic certificate and DNS)
60
+
61
+ Provide a hosted zone and the construct will automatically create a DNS-validated
62
+ certificate and set up A/AAAA records:
63
+
64
+ ```typescript
65
+ import { NextjsSite } from "cdk-opennext"
66
+ import { HostedZone } from "aws-cdk-lib/aws-route53"
67
+
68
+ const hostedZone = HostedZone.fromLookup(this, "HostedZone", {
69
+ domainName: "example.com",
70
+ })
71
+
72
+ const site = new NextjsSite(this, "NextjsSite", {
73
+ customDomain: {
74
+ domainName: "app.example.com",
75
+ hostedZone: hostedZone,
76
+ },
77
+ })
78
+ ```
79
+
80
+ ### Option 2: Bring Your Own Certificate (external DNS)
81
+
82
+ Provide your own ACM certificate when DNS is managed externally. The certificate
83
+ must be in us-east-1 for CloudFront:
84
+
85
+ ```typescript
86
+ import { NextjsSite } from "cdk-opennext"
87
+ import { Certificate } from "aws-cdk-lib/aws-certificatemanager"
88
+
89
+ const certificate = Certificate.fromCertificateArn(
90
+ this,
91
+ "Certificate",
92
+ "arn:aws:acm:us-east-1:123456789012:certificate/..."
93
+ )
94
+
95
+ const site = new NextjsSite(this, "NextjsSite", {
96
+ customDomain: {
97
+ domainName: "app.example.com",
98
+ certificate: certificate,
99
+ },
100
+ })
101
+ // Configure your DNS provider to point app.example.com to site.distribution.distributionDomainName
102
+ ```
103
+
104
+ ### Option 3: Bring Your Own Certificate with Route 53 DNS
105
+
106
+ Provide both a certificate and hosted zone to use your own certificate while
107
+ still having the construct manage DNS records:
108
+
109
+ ```typescript
110
+ import { NextjsSite } from "cdk-opennext"
111
+ import { Certificate } from "aws-cdk-lib/aws-certificatemanager"
112
+ import { HostedZone } from "aws-cdk-lib/aws-route53"
113
+
114
+ const hostedZone = HostedZone.fromLookup(this, "HostedZone", {
115
+ domainName: "example.com",
116
+ })
117
+
118
+ const certificate = Certificate.fromCertificateArn(
119
+ this,
120
+ "Certificate",
121
+ "arn:aws:acm:us-east-1:123456789012:certificate/..."
122
+ )
123
+
124
+ const site = new NextjsSite(this, "NextjsSite", {
125
+ customDomain: {
126
+ domainName: "app.example.com",
127
+ hostedZone: hostedZone,
128
+ certificate: certificate,
129
+ },
130
+ })
131
+ ```
132
+
55
133
  # How it works
56
134
 
57
135
  This package assumes that the Next and OpenNext build are done outside
@@ -1,3 +1,4 @@
1
+ import { ICertificate } from "aws-cdk-lib/aws-certificatemanager";
1
2
  import { Distribution } from "aws-cdk-lib/aws-cloudfront";
2
3
  import { Function as CdkFunction, type FunctionOptions, Runtime } from "aws-cdk-lib/aws-lambda";
3
4
  import { IHostedZone } from "aws-cdk-lib/aws-route53";
@@ -23,8 +24,21 @@ export interface DistributionDomainProps {
23
24
  readonly domainName: string;
24
25
  /**
25
26
  * Import the underlying Route 53 hosted zone.
27
+ *
28
+ * Required if `certificate` is not provided. When provided, a DNS-validated
29
+ * certificate will be created automatically and DNS aliases will be set up.
30
+ */
31
+ readonly hostedZone?: IHostedZone;
32
+ /**
33
+ * The ACM certificate to use for the custom domain.
34
+ *
35
+ * Required if `hostedZone` is not provided. The certificate must be in
36
+ * us-east-1 for CloudFront distributions.
37
+ *
38
+ * When provided without `hostedZone`, no DNS aliases will be created
39
+ * and you must configure DNS records externally.
26
40
  */
27
- readonly hostedZone: IHostedZone;
41
+ readonly certificate?: ICertificate;
28
42
  }
29
43
  export interface NextjsSiteProps {
30
44
  /**
package/lib/open-next.js CHANGED
@@ -37,6 +37,14 @@ class NextjsSite extends constructs_1.Construct {
37
37
  this.openNextPath = props.openNextPath ?? ".open-next";
38
38
  this.openNextOutput = JSON.parse((0, fs_1.readFileSync)(path.join(this.openNextPath, "open-next.output.json"), "utf-8"));
39
39
  this._customDomainName = props.customDomain?.domainName;
40
+ // Validate customDomain props: either certificate or hostedZone must be provided
41
+ if (props.customDomain &&
42
+ !props.customDomain.certificate &&
43
+ !props.customDomain.hostedZone) {
44
+ throw new Error("customDomain requires either a certificate or a hostedZone. " +
45
+ "Provide a hostedZone to automatically create a DNS-validated certificate, " +
46
+ "or provide your own certificate.");
47
+ }
40
48
  this.bucket = new aws_s3_1.Bucket(this, "S3Bucket", {
41
49
  publicReadAccess: false,
42
50
  blockPublicAccess: aws_s3_1.BlockPublicAccess.BLOCK_ALL,
@@ -46,10 +54,11 @@ class NextjsSite extends constructs_1.Construct {
46
54
  });
47
55
  this.table = this.createRevalidationTable();
48
56
  this.queue = this.createRevalidationQueue();
49
- // Create certificate in us-east-1 for CloudFront (required for CloudFront)
50
- const certificate = props.customDomain
51
- ? this.createCertificate(props.customDomain)
52
- : undefined;
57
+ // Use provided certificate or create one if hostedZone is available
58
+ const certificate = props.customDomain?.certificate ??
59
+ (props.customDomain?.hostedZone
60
+ ? this.createCertificate(props.customDomain.domainName, props.customDomain.hostedZone)
61
+ : undefined);
53
62
  const origins = this.createOrigins(props.defaultFunctionProps);
54
63
  this.serverCachePolicy = this.createServerCachePolicy();
55
64
  this.staticCachePolicy = this.createStaticCachePolicy();
@@ -67,12 +76,12 @@ class NextjsSite extends constructs_1.Construct {
67
76
  });
68
77
  }
69
78
  }
70
- createCertificate(domainProps) {
79
+ createCertificate(domainName, hostedZone) {
71
80
  // CloudFront requires certificates to be in us-east-1
72
81
  // DnsValidatedCertificate handles cross-region certificate creation automatically
73
82
  return new aws_certificatemanager_1.DnsValidatedCertificate(this, "Certificate", {
74
- domainName: domainProps.domainName,
75
- hostedZone: domainProps.hostedZone,
83
+ domainName,
84
+ hostedZone,
76
85
  region: "us-east-1",
77
86
  });
78
87
  }
@@ -281,5 +290,5 @@ class NextjsSite extends constructs_1.Construct {
281
290
  }
282
291
  exports.NextjsSite = NextjsSite;
283
292
  _a = JSII_RTTI_SYMBOL_1;
284
- NextjsSite[_a] = { fqn: "cdk-opennext.NextjsSite", version: "0.3.0" };
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1uZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29wZW4tbmV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJCQUFpQztBQUNqQyw2QkFBNEI7QUFDNUIsK0VBQTRFO0FBQzVFLCtEQWdCbUM7QUFDbkMsK0VBQStFO0FBQy9FLDJEQUFtRjtBQUVuRix1REFRK0I7QUFDL0IsbUZBQXFFO0FBQ3JFLG1EQUE4RDtBQUM5RCx5REFBd0Y7QUFDeEYseUVBQWtFO0FBQ2xFLCtDQUE4RDtBQUM5RCxxRUFBd0U7QUFDeEUsaURBQTJDO0FBQzNDLDJDQUFxRjtBQUNyRixtRUFBdUQ7QUFDdkQsMkNBQXNDO0FBcUd0QyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQWV2QyxJQUFXLHFCQUFxQjtRQUM5QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjtZQUMzQixDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDckMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQTtRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzlCLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FDM0QsQ0FBQTtRQUVuQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUE7UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3pDLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsaUJBQWlCLEVBQUUsMEJBQWlCLENBQUMsU0FBUztZQUM5QyxpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLGFBQWEsRUFBRSxvQkFBYSxDQUFDLE9BQU87WUFDcEMsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUMzQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBRTNDLDJFQUEyRTtRQUMzRSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWTtZQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7WUFDNUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUViLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDOUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ3hFLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3hELElBQUkscUJBQU8sQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQUMvQixJQUFJLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVO2dCQUNuQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVO2dCQUN6QyxNQUFNLEVBQUUsMEJBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxzQ0FBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDeEUsQ0FBQyxDQUFBO1lBRUYsSUFBSSx3QkFBVSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtnQkFDdEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVTtnQkFDbkMsVUFBVSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVTtnQkFDekMsTUFBTSxFQUFFLDBCQUFZLENBQUMsU0FBUyxDQUFDLElBQUksc0NBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3hFLENBQUMsQ0FBQTtRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsV0FBb0M7UUFDNUQsc0RBQXNEO1FBQ3RELGtGQUFrRjtRQUNsRixPQUFPLElBQUksZ0RBQXVCLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtZQUN0RCxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVU7WUFDbEMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVO1lBQ2xDLE1BQU0sRUFBRSxXQUFXO1NBQ3BCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxzQkFBSyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUNqRCxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtZQUN6RCxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtZQUNyRCxnQ0FBZ0MsRUFBRTtnQkFDaEMsMEJBQTBCLEVBQUUsSUFBSTthQUNqQztZQUNELE9BQU8sRUFBRSxzQkFBTyxDQUFDLFFBQVEsRUFBRTtZQUMzQixzQkFBc0IsRUFBRTtnQkFDdEI7b0JBQ0UsU0FBUyxFQUFFLFlBQVk7b0JBQ3ZCLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTSxFQUFFO29CQUMxRCxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtpQkFDL0Q7YUFDRjtZQUNELGFBQWEsRUFBRSxvQkFBYSxDQUFDLE9BQU87U0FDckMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsc0JBQXNCLENBQUE7UUFFMUUsTUFBTSxRQUFRLEdBQUcsSUFBSSxxQkFBVyxDQUFDLElBQUksRUFBRSw0QkFBNEIsRUFBRTtZQUNuRSxXQUFXLEVBQUUsa0NBQWtDO1lBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLGVBQWU7WUFDM0MsOENBQThDO1lBQzlDLElBQUksRUFBRSxpQkFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztZQUN2RSxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsT0FBTyxFQUFFLGVBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsV0FBVyxFQUFFO2dCQUNYLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxTQUFTO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLG1CQUFRLENBQUMsSUFBSSxFQUFFLDhCQUE4QixFQUFFO1lBQzFFLFNBQVMsRUFBRSx3QkFBYSxDQUFDLE9BQU87WUFDaEMsYUFBYSxFQUFFLG9CQUFhLENBQUMsT0FBTztTQUNyQyxDQUFDLENBQUE7UUFFRixNQUFNLFFBQVEsR0FBRyxJQUFJLDJCQUFRLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzFELGNBQWMsRUFBRSxRQUFRO1lBQ3hCLFFBQVEsRUFBRSxnQkFBZ0I7U0FDM0IsQ0FBQyxDQUFBO1FBRUYsSUFBSSxxQkFBYyxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUMvQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7WUFDbkMsVUFBVSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO2FBQy9CO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRU8sYUFBYSxDQUFDLG9CQUEyQztRQUMvRCxNQUFNLEVBQ0osRUFBRSxFQUFFLFFBQVEsRUFDWixPQUFPLEVBQUUsYUFBYSxFQUN0QixjQUFjLEVBQUUsV0FBVyxFQUMzQixHQUFHLFdBQVcsRUFDZixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFBO1FBQy9CLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pDLElBQUksb0NBQWdCLENBQUMsSUFBSSxFQUFFLDJCQUEyQixJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pFLE9BQU8sRUFBRSxDQUFDLDBCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUM5QixvQkFBb0IsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDN0IsS0FBSyxFQUFFLEtBQUs7YUFDYixDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUc7WUFDZCxFQUFFLEVBQUUsdUNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUN0RCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO2FBQ2hDLENBQUM7WUFDRixPQUFPLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUNoQyxTQUFTLEVBQ1QsYUFBYSxFQUNiLGNBQWMsRUFDZCxvQkFBb0IsQ0FDckI7WUFDRCxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUN2QyxnQkFBZ0IsRUFDaEIsV0FBVyxFQUNYLGdCQUFnQixDQUNqQjtZQUNELEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQ25DLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDM0QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO29CQUM5QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUE7Z0JBQzVELENBQUM7Z0JBQ0QsT0FBTyxHQUFHLENBQUE7WUFDWixDQUFDLEVBQ0QsRUFBZ0MsQ0FDakM7U0FDRixDQUFBO1FBQ0QsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixNQUFNLEtBQUssR0FBRyxJQUFJLGVBQUssQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDakQsSUFBSSxFQUFFLElBQUk7WUFDVixzQkFBc0IsRUFBRSxlQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUM3QyxDQUFDLENBQUE7UUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLHFCQUFXLENBQUMsSUFBSSxFQUFFLHNCQUFzQixFQUFFO1lBQzdELFdBQVcsRUFBRSxxQkFBcUI7WUFDbEMsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNO2dCQUMvRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDUCxJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLEVBQ0osSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxDQUNsRTtnQkFDSCxDQUFDLENBQUMsRUFBRSxDQUNQO1lBQ0QsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixZQUFZLEVBQUUseUJBQVksQ0FBQyxNQUFNO1lBQ2pDLE9BQU8sRUFBRSxlQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztTQUM5QixDQUFDLENBQUE7UUFDRixRQUFRLENBQUMsY0FBYyxDQUFDLElBQUkseUNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO1FBQ3BFLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVPLGNBQWM7UUFDcEIsT0FBTztZQUNMLGlCQUFpQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUN6Qyx1QkFBdUIsRUFBRSxRQUFRO1lBQ2pDLG1CQUFtQixFQUFFLFlBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTTtZQUMxQyxzQkFBc0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7WUFDM0MseUJBQXlCLEVBQUUsWUFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNO1lBQ2hELGtCQUFrQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUN4Qyw0Q0FBNEM7WUFDNUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNuQyxpQkFBaUIsRUFBRSxTQUFTO1NBQzdCLENBQUE7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsU0FBcUI7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDckMsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7SUFFTyxvQkFBb0IsQ0FDMUIsR0FBVyxFQUNYLE1BQThCLEVBQzlCLFFBQWlCLEVBQ2pCLE9BQThCO1FBRTlCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN6QyxNQUFNLEVBQUUsR0FBRyxJQUFJLHFCQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxVQUFVLEVBQUU7WUFDakQsR0FBRyxPQUFPO1lBQ1YsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXO1lBQ2hELFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxJQUFJLHlCQUFZLENBQUMsTUFBTTtZQUMxRCxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsSUFBSSxJQUFJO1lBQ3ZDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkUsV0FBVyxFQUFFO2dCQUNYLEdBQUcsT0FBTyxFQUFFLFdBQVc7Z0JBQ3ZCLEdBQUcsV0FBVzthQUNmO1NBQ0YsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUM5QixRQUFRLEVBQUUsZ0NBQW1CLENBQUMsSUFBSTtZQUNsQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsdUJBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLHVCQUFVLENBQUMsUUFBUTtTQUNoRixDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFekIsNkNBQTZDO1FBQzdDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUE7UUFDbEMsQ0FBQztRQUVELE9BQU8sSUFBSSxtQ0FBVSxDQUFDLFNBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ25ELEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNsQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLE9BQWdDLEVBQ2hDLEtBQXNCLEVBQ3RCLFdBQXFDO1FBRXJDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSx5QkFBa0IsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDNUUsSUFBSSxFQUFFLDZCQUFZLENBQUMsVUFBVSxDQUFDOzs7Ozs7SUFNaEMsQ0FBQztTQUNBLENBQUMsQ0FBQTtRQUNGLE1BQU0sY0FBYyxHQUFHO1lBQ3JCO2dCQUNFLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFNBQVMsRUFBRSxrQ0FBaUIsQ0FBQyxjQUFjO2FBQzVDO1NBQ0YsQ0FBQTtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksNkJBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQzFELFdBQVcsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDN0UsV0FBVztZQUNYLGVBQWUsRUFBRTtnQkFDZixNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQVEsRUFBRSwrREFBK0Q7Z0JBQ3pGLG9CQUFvQixFQUFFLHFDQUFvQixDQUFDLGlCQUFpQjtnQkFDNUQsY0FBYyxFQUFFLCtCQUFjLENBQUMsU0FBUztnQkFDeEMsYUFBYSxFQUFFLDhCQUFhLENBQUMsc0JBQXNCO2dCQUNuRCxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDbkMsbUJBQW1CLEVBQUUsb0NBQW1CLENBQUMsNkJBQTZCO2dCQUN0RSxvQkFBb0IsRUFBRSxjQUFjO2FBQ3JDO1lBQ0QsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTO2lCQUMvQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssR0FBRyxDQUFDO2lCQUNoQyxNQUFNLENBQ0wsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hCLE1BQU0sZUFBZSxHQUFvQjtvQkFDdkMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBRSxFQUFFLCtEQUErRDtvQkFDeEksb0JBQW9CLEVBQUUscUNBQW9CLENBQUMsaUJBQWlCO29CQUM1RCxjQUFjLEVBQUUsK0JBQWMsQ0FBQyxzQkFBc0I7b0JBQ3JELGFBQWEsRUFBRSw4QkFBYSxDQUFDLHNCQUFzQjtvQkFDbkQsV0FBVyxFQUNULFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSTt3QkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7d0JBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCO29CQUM1QixHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJO3dCQUMxQixDQUFDLENBQUMsRUFBRTt3QkFDSixDQUFDLENBQUM7NEJBQ0UsbUJBQW1CLEVBQ2pCLG9DQUFtQixDQUFDLDZCQUE2Qjt5QkFDcEQsQ0FBQztvQkFDTixvQkFBb0IsRUFBRSxjQUFjO2lCQUNyQyxDQUFBO2dCQUNELEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFBO2dCQUN2QyxPQUFPLEdBQUcsQ0FBQTtZQUNaLENBQUMsRUFDRCxFQUFxQyxDQUN0QztTQUNKLENBQUMsQ0FBQTtRQUNGLE9BQU8sWUFBWSxDQUFBO0lBQ3JCLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyxJQUFJLDRCQUFXLENBQUMsSUFBSSxFQUFFLDJCQUEyQixFQUFFO1lBQ3hELG1CQUFtQixFQUFFLHlDQUF3QixDQUFDLEdBQUcsRUFBRTtZQUNuRCxjQUFjLEVBQUUsb0NBQW1CLENBQUMsU0FBUyxDQUMzQyxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVix3QkFBd0IsQ0FDekI7WUFDRCxjQUFjLEVBQUUsb0NBQW1CLENBQUMsSUFBSSxFQUFFO1lBQzFDLFVBQVUsRUFBRSxlQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLEVBQUUsZUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUIsTUFBTSxFQUFFLGVBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3pCLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyw0QkFBVyxDQUFDLGlCQUFpQixDQUFBO0lBQ3RDLENBQUM7O0FBelZILGdDQTBWQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIlxuaW1wb3J0IHtcbiAgQWxsb3dlZE1ldGhvZHMsXG4gIHR5cGUgQmVoYXZpb3JPcHRpb25zLFxuICBDYWNoZUNvb2tpZUJlaGF2aW9yLFxuICBDYWNoZUhlYWRlckJlaGF2aW9yLFxuICBDYWNoZVBvbGljeSxcbiAgQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLFxuICBDYWNoZWRNZXRob2RzLFxuICBEaXN0cmlidXRpb24sXG4gIHR5cGUgSUNhY2hlUG9saWN5LFxuICB0eXBlIElPcmlnaW4sXG4gIFZpZXdlclByb3RvY29sUG9saWN5LFxuICBGdW5jdGlvbkV2ZW50VHlwZSxcbiAgT3JpZ2luUmVxdWVzdFBvbGljeSxcbiAgRnVuY3Rpb24gYXMgQ2xvdWRmcm9udEZ1bmN0aW9uLFxuICBGdW5jdGlvbkNvZGUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiXG5pbXBvcnQgeyBIdHRwT3JpZ2luLCBTM0J1Y2tldE9yaWdpbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udC1vcmlnaW5zXCJcbmltcG9ydCB7IFRhYmxlVjIgYXMgVGFibGUsIEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmcgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCJcbmltcG9ydCB7IHR5cGUgSUdyYW50YWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCB7XG4gIENvZGUsXG4gIEZ1bmN0aW9uIGFzIENka0Z1bmN0aW9uLFxuICB0eXBlIEZ1bmN0aW9uT3B0aW9ucyxcbiAgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgSW52b2tlTW9kZSxcbiAgUnVudGltZSxcbiAgQXJjaGl0ZWN0dXJlLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBTcXNFdmVudFNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLWV2ZW50LXNvdXJjZXNcIlxuaW1wb3J0IHsgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0IHsgQWFhYVJlY29yZCwgQVJlY29yZCwgSUhvc3RlZFpvbmUsIFJlY29yZFRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiXG5pbXBvcnQgeyBDbG91ZEZyb250VGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzLXRhcmdldHNcIlxuaW1wb3J0IHsgQmxvY2tQdWJsaWNBY2Nlc3MsIEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgU291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zMy1kZXBsb3ltZW50XCJcbmltcG9ydCB7IFF1ZXVlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zcXNcIlxuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgUmVtb3ZhbFBvbGljeSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWIvY29yZVwiXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCJcblxudHlwZSBCYXNlRnVuY3Rpb24gPSB7XG4gIGhhbmRsZXI6IHN0cmluZ1xuICBidW5kbGU6IHN0cmluZ1xufVxuXG50eXBlIE9wZW5OZXh0RnVuY3Rpb25PcmlnaW4gPSB7XG4gIHR5cGU6IFwiZnVuY3Rpb25cIlxuICBzdHJlYW1pbmc/OiBib29sZWFuXG59ICYgQmFzZUZ1bmN0aW9uXG5cbnR5cGUgT3Blbk5leHRTM09yaWdpbiA9IHtcbiAgdHlwZTogXCJzM1wiXG4gIG9yaWdpblBhdGg6IHN0cmluZ1xuICBjb3B5OiB7XG4gICAgZnJvbTogc3RyaW5nXG4gICAgdG86IHN0cmluZ1xuICAgIGNhY2hlZDogYm9vbGVhblxuICAgIHZlcnNpb25lZFN1YkRpcj86IHN0cmluZ1xuICB9W11cbn1cblxudHlwZSBPcGVuTmV4dE9yaWdpbnMgPSBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luIHwgT3Blbk5leHRTM09yaWdpblxuXG5pbnRlcmZhY2UgT3Blbk5leHRPdXRwdXQge1xuICBlZGdlRnVuY3Rpb25zOiB7XG4gICAgW2tleTogc3RyaW5nXTogQmFzZUZ1bmN0aW9uXG4gIH1cbiAgb3JpZ2luczoge1xuICAgIHMzOiBPcGVuTmV4dFMzT3JpZ2luXG4gICAgZGVmYXVsdDogT3Blbk5leHRGdW5jdGlvbk9yaWdpblxuICAgIGltYWdlT3B0aW1pemVyOiBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luXG4gICAgW2tleTogc3RyaW5nXTogT3Blbk5leHRPcmlnaW5zXG4gIH1cbiAgYmVoYXZpb3JzOiB7XG4gICAgcGF0dGVybjogc3RyaW5nXG4gICAgb3JpZ2luPzogc3RyaW5nXG4gICAgZWRnZUZ1bmN0aW9uPzogc3RyaW5nXG4gIH1bXVxuICBhZGRpdGlvbmFsUHJvcHM/OiB7XG4gICAgZGlzYWJsZUluY3JlbWVudGFsQ2FjaGU/OiBib29sZWFuXG4gICAgZGlzYWJsZVRhZ0NhY2hlPzogYm9vbGVhblxuICAgIGluaXRpYWxpemF0aW9uRnVuY3Rpb24/OiBCYXNlRnVuY3Rpb25cbiAgICB3YXJtZXI/OiBCYXNlRnVuY3Rpb25cbiAgICByZXZhbGlkYXRpb25GdW5jdGlvbj86IEJhc2VGdW5jdGlvblxuICB9XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIExhbWJkYSBmdW5jdGlvbnMsIGV4Y2x1ZGluZyBoYW5kbGVyIGFuZCBjb2RlIHdoaWNoIGFyZSBzZXQgYnkgdGhlIGNvbnN0cnVjdC5cbiAqIEV4dGVuZHMgRnVuY3Rpb25PcHRpb25zIGFuZCBhZGRzIHJ1bnRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEZ1bmN0aW9uUHJvcHMgZXh0ZW5kcyBGdW5jdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFJ1bnRpbWUuTk9ERUpTXzI0X1hcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW50aW1lXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzdHJpYnV0aW9uRG9tYWluUHJvcHMge1xuICAvKipcbiAgICogVGhlIGRvbWFpbiB0byBiZSBhc3NpZ25lZCB0byB0aGUgd2Vic2l0ZSBVUkwgKGllLiBkb21haW4uY29tKS5cbiAgICpcbiAgICogU3VwcG9ydHMgZG9tYWlucyB0aGF0IGFyZSBob3N0ZWQgZWl0aGVyIG9uIFtSb3V0ZSA1M10oaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9yb3V0ZTUzLykgb3IgZXh0ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBJbXBvcnQgdGhlIHVuZGVybHlpbmcgUm91dGUgNTMgaG9zdGVkIHpvbmUuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lOiBJSG9zdGVkWm9uZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1NpdGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tRG9tYWluIGZvciB0aGlzIHdlYnNpdGUuIFRoaXMgZG9tYWluIG11c3QgYmUgaG9zdGVkIGluXG4gICAqIHJvdXRlNTMsIGFuZCB3ZSBtdXN0IGJlIGFibGUgdG8gY3JlYXRlIGFuIEFDTSBjZXJ0aWZpY2F0ZSBmb3IgdGhpc1xuICAgKiBkb21haW4uXG4gICAqXG4gICAqIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gbWlncmF0ZSBleHRlcm5hbGx5IGhvc3RlZCBkb21haW5zIHRvIFJvdXRlIDUzIGJ5XG4gICAqIFtmb2xsb3dpbmcgdGhpcyBndWlkZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1JvdXRlNTMvbGF0ZXN0L0RldmVsb3Blckd1aWRlL01pZ3JhdGluZ0ROUy5odG1sKS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbURvbWFpbj86IERpc3RyaWJ1dGlvbkRvbWFpblByb3BzXG5cbiAgLyoqXG4gICAqIFNob3VsZCBwb2ludCB0byB0aGUgLm9wZW4tbmV4dCBkaXJlY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiLm9wZW4tbmV4dFwiXG4gICAqL1xuICByZWFkb25seSBvcGVuTmV4dFBhdGg/OiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAvKipcbiAgICogRGVmYXVsdCBwcm9wcyB0byBhcHBseSB0byBhbGwgTGFtYmRhIGZ1bmN0aW9ucyBjcmVhdGVkIGJ5IHRoaXMgY29uc3RydWN0LlxuICAgKiBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZpYyBmdW5jdGlvbiBjb25maWd1cmF0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRGdW5jdGlvblByb3BzPzogRGVmYXVsdEZ1bmN0aW9uUHJvcHNcbn1cblxuZXhwb3J0IGNsYXNzIE5leHRqc1NpdGUgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIG9wZW5OZXh0T3V0cHV0OiBPcGVuTmV4dE91dHB1dFxuICBwcml2YXRlIGJ1Y2tldDogQnVja2V0XG4gIHByaXZhdGUgdGFibGU6IFRhYmxlXG4gIHByaXZhdGUgcXVldWU6IFF1ZXVlXG5cbiAgcHJpdmF0ZSBzdGF0aWNDYWNoZVBvbGljeTogSUNhY2hlUG9saWN5XG4gIHByaXZhdGUgc2VydmVyQ2FjaGVQb2xpY3k6IENhY2hlUG9saWN5XG5cbiAgcHJpdmF0ZSBvcGVuTmV4dFBhdGg6IHN0cmluZ1xuXG4gIHB1YmxpYyByZWFkb25seSBkaXN0cmlidXRpb246IERpc3RyaWJ1dGlvblxuICBwcml2YXRlIF9kZWZhdWx0U2VydmVyRnVuY3Rpb24hOiBDZGtGdW5jdGlvblxuICBwcml2YXRlIF9jdXN0b21Eb21haW5OYW1lPzogc3RyaW5nXG5cbiAgcHVibGljIGdldCBkZWZhdWx0U2VydmVyRnVuY3Rpb24oKTogQ2RrRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0U2VydmVyRnVuY3Rpb25cbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7dGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZX1gXG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1c3RvbURvbWFpblVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21Eb21haW5OYW1lXG4gICAgICA/IGBodHRwczovLyR7dGhpcy5fY3VzdG9tRG9tYWluTmFtZX1gXG4gICAgICA6IGBodHRwczovLyR7dGhpcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZX1gXG4gIH1cblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzU2l0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKVxuICAgIHRoaXMub3Blbk5leHRQYXRoID0gcHJvcHMub3Blbk5leHRQYXRoID8/IFwiLm9wZW4tbmV4dFwiXG4gICAgdGhpcy5vcGVuTmV4dE91dHB1dCA9IEpTT04ucGFyc2UoXG4gICAgICByZWFkRmlsZVN5bmMocGF0aC5qb2luKHRoaXMub3Blbk5leHRQYXRoLCBcIm9wZW4tbmV4dC5vdXRwdXQuanNvblwiKSwgXCJ1dGYtOFwiKVxuICAgICkgYXMgT3Blbk5leHRPdXRwdXRcblxuICAgIHRoaXMuX2N1c3RvbURvbWFpbk5hbWUgPSBwcm9wcy5jdXN0b21Eb21haW4/LmRvbWFpbk5hbWVcblxuICAgIHRoaXMuYnVja2V0ID0gbmV3IEJ1Y2tldCh0aGlzLCBcIlMzQnVja2V0XCIsIHtcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IGZhbHNlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IEJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgZW5mb3JjZVNTTDogdHJ1ZSxcbiAgICB9KVxuICAgIHRoaXMudGFibGUgPSB0aGlzLmNyZWF0ZVJldmFsaWRhdGlvblRhYmxlKClcbiAgICB0aGlzLnF1ZXVlID0gdGhpcy5jcmVhdGVSZXZhbGlkYXRpb25RdWV1ZSgpXG5cbiAgICAvLyBDcmVhdGUgY2VydGlmaWNhdGUgaW4gdXMtZWFzdC0xIGZvciBDbG91ZEZyb250IChyZXF1aXJlZCBmb3IgQ2xvdWRGcm9udClcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IHByb3BzLmN1c3RvbURvbWFpblxuICAgICAgPyB0aGlzLmNyZWF0ZUNlcnRpZmljYXRlKHByb3BzLmN1c3RvbURvbWFpbilcbiAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBvcmlnaW5zID0gdGhpcy5jcmVhdGVPcmlnaW5zKHByb3BzLmRlZmF1bHRGdW5jdGlvblByb3BzKVxuICAgIHRoaXMuc2VydmVyQ2FjaGVQb2xpY3kgPSB0aGlzLmNyZWF0ZVNlcnZlckNhY2hlUG9saWN5KClcbiAgICB0aGlzLnN0YXRpY0NhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVTdGF0aWNDYWNoZVBvbGljeSgpXG4gICAgdGhpcy5kaXN0cmlidXRpb24gPSB0aGlzLmNyZWF0ZURpc3RyaWJ1dGlvbihvcmlnaW5zLCBwcm9wcywgY2VydGlmaWNhdGUpXG4gICAgaWYgKHByb3BzLmN1c3RvbURvbWFpbiAmJiBwcm9wcy5jdXN0b21Eb21haW4uaG9zdGVkWm9uZSkge1xuICAgICAgbmV3IEFSZWNvcmQodGhpcywgXCJBbGlhc1JlY29yZFwiLCB7XG4gICAgICAgIHpvbmU6IHByb3BzLmN1c3RvbURvbWFpbi5ob3N0ZWRab25lLFxuICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5jdXN0b21Eb21haW4uZG9tYWluTmFtZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuZGlzdHJpYnV0aW9uKSksXG4gICAgICB9KVxuXG4gICAgICBuZXcgQWFhYVJlY29yZCh0aGlzLCBcIkFsaWFzUmVjb3JkQUFBQVwiLCB7XG4gICAgICAgIHpvbmU6IHByb3BzLmN1c3RvbURvbWFpbi5ob3N0ZWRab25lLFxuICAgICAgICByZWNvcmROYW1lOiBwcm9wcy5jdXN0b21Eb21haW4uZG9tYWluTmFtZSxcbiAgICAgICAgdGFyZ2V0OiBSZWNvcmRUYXJnZXQuZnJvbUFsaWFzKG5ldyBDbG91ZEZyb250VGFyZ2V0KHRoaXMuZGlzdHJpYnV0aW9uKSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ2VydGlmaWNhdGUoZG9tYWluUHJvcHM6IERpc3RyaWJ1dGlvbkRvbWFpblByb3BzKSB7XG4gICAgLy8gQ2xvdWRGcm9udCByZXF1aXJlcyBjZXJ0aWZpY2F0ZXMgdG8gYmUgaW4gdXMtZWFzdC0xXG4gICAgLy8gRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUgaGFuZGxlcyBjcm9zcy1yZWdpb24gY2VydGlmaWNhdGUgY3JlYXRpb24gYXV0b21hdGljYWxseVxuICAgIHJldHVybiBuZXcgRG5zVmFsaWRhdGVkQ2VydGlmaWNhdGUodGhpcywgXCJDZXJ0aWZpY2F0ZVwiLCB7XG4gICAgICBkb21haW5OYW1lOiBkb21haW5Qcm9wcy5kb21haW5OYW1lLFxuICAgICAgaG9zdGVkWm9uZTogZG9tYWluUHJvcHMuaG9zdGVkWm9uZSxcbiAgICAgIHJlZ2lvbjogXCJ1cy1lYXN0LTFcIixcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZXZhbGlkYXRpb25UYWJsZSgpIHtcbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBcIlJldmFsaWRhdGlvblRhYmxlXCIsIHtcbiAgICAgIHBhcnRpdGlvbktleTogeyBuYW1lOiBcInRhZ1wiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgc29ydEtleTogeyBuYW1lOiBcInBhdGhcIiwgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlTcGVjaWZpY2F0aW9uOiB7XG4gICAgICAgIHBvaW50SW5UaW1lUmVjb3ZlcnlFbmFibGVkOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGJpbGxpbmc6IEJpbGxpbmcub25EZW1hbmQoKSxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4ZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluZGV4TmFtZTogXCJyZXZhbGlkYXRlXCIsXG4gICAgICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwicGF0aFwiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICAgIHNvcnRLZXk6IHsgbmFtZTogXCJyZXZhbGlkYXRlZEF0XCIsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuTlVNQkVSIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pXG5cbiAgICBjb25zdCBpbml0Rm4gPSB0aGlzLm9wZW5OZXh0T3V0cHV0LmFkZGl0aW9uYWxQcm9wcz8uaW5pdGlhbGl6YXRpb25GdW5jdGlvblxuXG4gICAgY29uc3QgaW5zZXJ0Rm4gPSBuZXcgQ2RrRnVuY3Rpb24odGhpcywgXCJSZXZhbGlkYXRpb25JbnNlcnRGdW5jdGlvblwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJOZXh0LmpzIHJldmFsaWRhdGlvbiBkYXRhIGluc2VydFwiLFxuICAgICAgaGFuZGxlcjogaW5pdEZuPy5oYW5kbGVyID8/IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgLy8gY29kZTogQ29kZS5mcm9tQXNzZXQoaW5pdEZuPy5idW5kbGUgPz8gXCJcIiksXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwiZHluYW1vZGItcHJvdmlkZXJcIikpLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjRfWCxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgQ0FDSEVfRFlOQU1PX1RBQkxFOiB0YWJsZS50YWJsZU5hbWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlckxvZ0dyb3VwID0gbmV3IExvZ0dyb3VwKHRoaXMsIFwiUmV2YWxpZGF0aW9uUHJvdmlkZXJMb2dHcm91cFwiLCB7XG4gICAgICByZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX0RBWSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodGhpcywgXCJSZXZhbGlkYXRpb25Qcm92aWRlclwiLCB7XG4gICAgICBvbkV2ZW50SGFuZGxlcjogaW5zZXJ0Rm4sXG4gICAgICBsb2dHcm91cDogcHJvdmlkZXJMb2dHcm91cCxcbiAgICB9KVxuXG4gICAgbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiUmV2YWxpZGF0aW9uUmVzb3VyY2VcIiwge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHZlcnNpb246IERhdGUubm93KCkudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIHJldHVybiB0YWJsZVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPcmlnaW5zKGRlZmF1bHRGdW5jdGlvblByb3BzPzogRGVmYXVsdEZ1bmN0aW9uUHJvcHMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzMzogczNPcmlnaW4sXG4gICAgICBkZWZhdWx0OiBkZWZhdWx0T3JpZ2luLFxuICAgICAgaW1hZ2VPcHRpbWl6ZXI6IGltYWdlT3JpZ2luLFxuICAgICAgLi4ucmVzdE9yaWdpbnNcbiAgICB9ID0gdGhpcy5vcGVuTmV4dE91dHB1dC5vcmlnaW5zXG4gICAgZm9yIChjb25zdCBjb3B5IG9mIHMzT3JpZ2luLmNvcHkpIHtcbiAgICAgIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMsIGBPcGVuTmV4dEJ1Y2tldERlcGxveW1lbnQke2NvcHkuZnJvbX1gLCB7XG4gICAgICAgIHNvdXJjZXM6IFtTb3VyY2UuYXNzZXQocGF0aC5qb2luKHRoaXMub3Blbk5leHRQYXRoLCBcIi4uXCIsIGNvcHkuZnJvbSkpXSxcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogY29weS50byxcbiAgICAgICAgcHJ1bmU6IGZhbHNlLFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2lucyA9IHtcbiAgICAgIHMzOiBTM0J1Y2tldE9yaWdpbi53aXRoT3JpZ2luQWNjZXNzQ29udHJvbCh0aGlzLmJ1Y2tldCwge1xuICAgICAgICBvcmlnaW5JZDogXCJTM0J1Y2tldFwiLFxuICAgICAgICBvcmlnaW5QYXRoOiBzM09yaWdpbi5vcmlnaW5QYXRoLFxuICAgICAgfSksXG4gICAgICBkZWZhdWx0OiB0aGlzLmNyZWF0ZUZ1bmN0aW9uT3JpZ2luKFxuICAgICAgICBcImRlZmF1bHRcIixcbiAgICAgICAgZGVmYXVsdE9yaWdpbixcbiAgICAgICAgXCJOZXh0SnNTZXJ2ZXJcIixcbiAgICAgICAgZGVmYXVsdEZ1bmN0aW9uUHJvcHNcbiAgICAgICksXG4gICAgICBpbWFnZU9wdGltaXplcjogdGhpcy5jcmVhdGVGdW5jdGlvbk9yaWdpbihcbiAgICAgICAgXCJpbWFnZU9wdGltaXplclwiLFxuICAgICAgICBpbWFnZU9yaWdpbixcbiAgICAgICAgXCJJbWFnZU9wdGltaXplclwiXG4gICAgICApLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMocmVzdE9yaWdpbnMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3JpZ2luSWQgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSlcbiAgICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHRoaXMuY3JlYXRlRnVuY3Rpb25PcmlnaW4oa2V5LCB2YWx1ZSwgb3JpZ2luSWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgSHR0cE9yaWdpbj5cbiAgICAgICksXG4gICAgfVxuICAgIHJldHVybiBvcmlnaW5zXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvblF1ZXVlKCkge1xuICAgIGNvbnN0IHF1ZXVlID0gbmV3IFF1ZXVlKHRoaXMsIFwiUmV2YWxpZGF0aW9uUXVldWVcIiwge1xuICAgICAgZmlmbzogdHJ1ZSxcbiAgICAgIHJlY2VpdmVNZXNzYWdlV2FpdFRpbWU6IER1cmF0aW9uLnNlY29uZHMoMjApLFxuICAgIH0pXG4gICAgY29uc3QgY29uc3VtZXIgPSBuZXcgQ2RrRnVuY3Rpb24odGhpcywgXCJSZXZhbGlkYXRpb25GdW5jdGlvblwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJOZXh0LmpzIHJldmFsaWRhdG9yXCIsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KFxuICAgICAgICB0aGlzLm9wZW5OZXh0T3V0cHV0LmFkZGl0aW9uYWxQcm9wcz8ucmV2YWxpZGF0aW9uRnVuY3Rpb24/LmJ1bmRsZVxuICAgICAgICAgID8gcGF0aC5qb2luKFxuICAgICAgICAgICAgICB0aGlzLm9wZW5OZXh0UGF0aCxcbiAgICAgICAgICAgICAgXCIuLlwiLFxuICAgICAgICAgICAgICB0aGlzLm9wZW5OZXh0T3V0cHV0LmFkZGl0aW9uYWxQcm9wcz8ucmV2YWxpZGF0aW9uRnVuY3Rpb24/LmJ1bmRsZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogXCJcIlxuICAgICAgKSxcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICBhcmNoaXRlY3R1cmU6IEFyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICB9KVxuICAgIGNvbnN1bWVyLmFkZEV2ZW50U291cmNlKG5ldyBTcXNFdmVudFNvdXJjZShxdWV1ZSwgeyBiYXRjaFNpemU6IDUgfSkpXG4gICAgcmV0dXJuIHF1ZXVlXG4gIH1cblxuICBwcml2YXRlIGdldEVudmlyb25tZW50KCkge1xuICAgIHJldHVybiB7XG4gICAgICBDQUNIRV9CVUNLRVRfTkFNRTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIENBQ0hFX0JVQ0tFVF9LRVlfUFJFRklYOiBcIl9jYWNoZVwiLFxuICAgICAgQ0FDSEVfQlVDS0VUX1JFR0lPTjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgUkVWQUxJREFUSU9OX1FVRVVFX1VSTDogdGhpcy5xdWV1ZS5xdWV1ZVVybCxcbiAgICAgIFJFVkFMSURBVElPTl9RVUVVRV9SRUdJT046IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbixcbiAgICAgIENBQ0hFX0RZTkFNT19UQUJMRTogdGhpcy50YWJsZS50YWJsZU5hbWUsXG4gICAgICAvLyBUaG9zZSAyIGFyZSB1c2VkIG9ubHkgZm9yIGltYWdlIG9wdGltaXplclxuICAgICAgQlVDS0VUX05BTUU6IHRoaXMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBCVUNLRVRfS0VZX1BSRUZJWDogXCJfYXNzZXRzXCIsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBncmFudFBlcm1pc3Npb25zKGdyYW50YWJsZTogSUdyYW50YWJsZSkge1xuICAgIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGdyYW50YWJsZSlcbiAgICB0aGlzLnRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShncmFudGFibGUpXG4gICAgdGhpcy5xdWV1ZS5ncmFudFNlbmRNZXNzYWdlcyhncmFudGFibGUpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZ1bmN0aW9uT3JpZ2luKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9yaWdpbjogT3Blbk5leHRGdW5jdGlvbk9yaWdpbixcbiAgICBvcmlnaW5JZD86IHN0cmluZyxcbiAgICBmblByb3BzPzogRGVmYXVsdEZ1bmN0aW9uUHJvcHNcbiAgKSB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSB0aGlzLmdldEVudmlyb25tZW50KClcbiAgICBjb25zdCBmbiA9IG5ldyBDZGtGdW5jdGlvbih0aGlzLCBgJHtrZXl9RnVuY3Rpb25gLCB7XG4gICAgICAuLi5mblByb3BzLFxuICAgICAgcnVudGltZTogZm5Qcm9wcz8ucnVudGltZSA/PyBSdW50aW1lLk5PREVKU18yNF9YLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBmblByb3BzPy5hcmNoaXRlY3R1cmUgPz8gQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIG1lbW9yeVNpemU6IGZuUHJvcHM/Lm1lbW9yeVNpemUgPz8gMTAyNCxcbiAgICAgIGhhbmRsZXI6IG9yaWdpbi5oYW5kbGVyLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKHRoaXMub3Blbk5leHRQYXRoLCBcIi4uXCIsIG9yaWdpbi5idW5kbGUpKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIC4uLmZuUHJvcHM/LmVudmlyb25tZW50LFxuICAgICAgICAuLi5lbnZpcm9ubWVudCxcbiAgICAgIH0sXG4gICAgfSlcbiAgICBjb25zdCBmblVybCA9IGZuLmFkZEZ1bmN0aW9uVXJsKHtcbiAgICAgIGF1dGhUeXBlOiBGdW5jdGlvblVybEF1dGhUeXBlLk5PTkUsXG4gICAgICBpbnZva2VNb2RlOiBvcmlnaW4uc3RyZWFtaW5nID8gSW52b2tlTW9kZS5SRVNQT05TRV9TVFJFQU0gOiBJbnZva2VNb2RlLkJVRkZFUkVELFxuICAgIH0pXG4gICAgdGhpcy5ncmFudFBlcm1pc3Npb25zKGZuKVxuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGRlZmF1bHQgc2VydmVyIGZ1bmN0aW9uXG4gICAgaWYgKGtleSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgICAgIHRoaXMuX2RlZmF1bHRTZXJ2ZXJGdW5jdGlvbiA9IGZuXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBIdHRwT3JpZ2luKEZuLnBhcnNlRG9tYWluTmFtZShmblVybC51cmwpLCB7XG4gICAgICAuLi4ob3JpZ2luSWQgPyB7IG9yaWdpbklkIH0gOiB7fSksXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGlzdHJpYnV0aW9uKFxuICAgIG9yaWdpbnM6IFJlY29yZDxzdHJpbmcsIElPcmlnaW4+LFxuICAgIHByb3BzOiBOZXh0anNTaXRlUHJvcHMsXG4gICAgY2VydGlmaWNhdGU/OiBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZVxuICApIHtcbiAgICBjb25zdCBjbG91ZGZyb250RnVuY3Rpb24gPSBuZXcgQ2xvdWRmcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZ1bmN0aW9uXCIsIHtcbiAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcblx0XHRcdGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcblx0XHRcdFx0dmFyIHJlcXVlc3QgPSBldmVudC5yZXF1ZXN0O1xuXHRcdFx0XHRyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG5cdFx0XHRcdHJldHVybiByZXF1ZXN0O1xuXHRcdFx0fVxuXHRcdFx0YCksXG4gICAgfSlcbiAgICBjb25zdCBmbkFzc29jaWF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkZnJvbnRGdW5jdGlvbixcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBkb21haW5OYW1lczogcHJvcHMuY3VzdG9tRG9tYWluID8gW3Byb3BzLmN1c3RvbURvbWFpbi5kb21haW5OYW1lXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogb3JpZ2lucy5kZWZhdWx0ISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5zZXJ2ZXJDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IGZuQXNzb2NpYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMub3Blbk5leHRPdXRwdXQuYmVoYXZpb3JzXG4gICAgICAgIC5maWx0ZXIoKGIpID0+IGIucGF0dGVybiAhPT0gXCIqXCIpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgYmVoYXZpb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IChiZWhhdmlvci5vcmlnaW4gPyBvcmlnaW5zW2JlaGF2aW9yLm9yaWdpbl0gOiBvcmlnaW5zLmRlZmF1bHQpISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgICAgY2FjaGVQb2xpY3k6XG4gICAgICAgICAgICAgICAgYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0aWNDYWNoZVBvbGljeVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlcnZlckNhY2hlUG9saWN5LFxuICAgICAgICAgICAgICAuLi4oYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6XG4gICAgICAgICAgICAgICAgICAgICAgT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogZm5Bc3NvY2lhdGlvbnMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2NbYmVoYXZpb3IucGF0dGVybl0gPSBiZWhhdmlvck9wdGlvbnNcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz5cbiAgICAgICAgKSxcbiAgICB9KVxuICAgIHJldHVybiBkaXN0cmlidXRpb25cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VydmVyQ2FjaGVQb2xpY3koKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIk9wZW5OZXh0U2VydmVyQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFxuICAgICAgICBcImFjY2VwdFwiLFxuICAgICAgICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICAgICAgICBcInJzY1wiLFxuICAgICAgICBcIm5leHQtcm91dGVyLXByZWZldGNoXCIsXG4gICAgICAgIFwibmV4dC1yb3V0ZXItc3RhdGUtdHJlZVwiLFxuICAgICAgICBcIm5leHQtdXJsXCIsXG4gICAgICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiXG4gICAgICApLFxuICAgICAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uZGF5cygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5kYXlzKDApLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0NhY2hlUG9saWN5KCkge1xuICAgIHJldHVybiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRFxuICB9XG59XG4iXX0=
293
+ NextjsSite[_a] = { fqn: "cdk-opennext.NextjsSite", version: "0.3.1" };
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1uZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29wZW4tbmV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDJCQUFpQztBQUNqQyw2QkFBNEI7QUFDNUIsK0VBQTBGO0FBQzFGLCtEQWdCbUM7QUFDbkMsK0VBQStFO0FBQy9FLDJEQUFtRjtBQUVuRix1REFRK0I7QUFDL0IsbUZBQXFFO0FBQ3JFLG1EQUE4RDtBQUM5RCx5REFBd0Y7QUFDeEYseUVBQWtFO0FBQ2xFLCtDQUE4RDtBQUM5RCxxRUFBd0U7QUFDeEUsaURBQTJDO0FBQzNDLDJDQUFxRjtBQUNyRixtRUFBdUQ7QUFDdkQsMkNBQXNDO0FBbUh0QyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQWV2QyxJQUFXLHFCQUFxQjtRQUM5QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxXQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtJQUM5RCxDQUFDO0lBRUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQjtZQUMzQixDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDckMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQzNELENBQUM7SUFFRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQTtRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQzlCLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsdUJBQXVC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b20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IERuc1ZhbGlkYXRlZENlcnRpZmljYXRlLCBJQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiXG5pbXBvcnQge1xuICBBbGxvd2VkTWV0aG9kcyxcbiAgdHlwZSBCZWhhdmlvck9wdGlvbnMsXG4gIENhY2hlQ29va2llQmVoYXZpb3IsXG4gIENhY2hlSGVhZGVyQmVoYXZpb3IsXG4gIENhY2hlUG9saWN5LFxuICBDYWNoZVF1ZXJ5U3RyaW5nQmVoYXZpb3IsXG4gIENhY2hlZE1ldGhvZHMsXG4gIERpc3RyaWJ1dGlvbixcbiAgdHlwZSBJQ2FjaGVQb2xpY3ksXG4gIHR5cGUgSU9yaWdpbixcbiAgVmlld2VyUHJvdG9jb2xQb2xpY3ksXG4gIEZ1bmN0aW9uRXZlbnRUeXBlLFxuICBPcmlnaW5SZXF1ZXN0UG9saWN5LFxuICBGdW5jdGlvbiBhcyBDbG91ZGZyb250RnVuY3Rpb24sXG4gIEZ1bmN0aW9uQ29kZSxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCJcbmltcG9ydCB7IEh0dHBPcmlnaW4sIFMzQnVja2V0T3JpZ2luIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250LW9yaWdpbnNcIlxuaW1wb3J0IHsgVGFibGVWMiBhcyBUYWJsZSwgQXR0cmlidXRlVHlwZSwgQmlsbGluZyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIlxuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0IHtcbiAgQ29kZSxcbiAgRnVuY3Rpb24gYXMgQ2RrRnVuY3Rpb24sXG4gIHR5cGUgRnVuY3Rpb25PcHRpb25zLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICBJbnZva2VNb2RlLFxuICBSdW50aW1lLFxuICBBcmNoaXRlY3R1cmUsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB7IFNxc0V2ZW50U291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtZXZlbnQtc291cmNlc1wiXG5pbXBvcnQgeyBMb2dHcm91cCwgUmV0ZW50aW9uRGF5cyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiXG5pbXBvcnQgeyBBYWFhUmVjb3JkLCBBUmVjb3JkLCBJSG9zdGVkWm9uZSwgUmVjb3JkVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCJcbmltcG9ydCB7IENsb3VkRnJvbnRUYXJnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0c1wiXG5pbXBvcnQgeyBCbG9ja1B1YmxpY0FjY2VzcywgQnVja2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBTb3VyY2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIlxuaW1wb3J0IHsgUXVldWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiXG5pbXBvcnQgeyBDdXN0b21SZXNvdXJjZSwgRHVyYXRpb24sIEZuLCBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYi9jb3JlXCJcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIlxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIlxuXG50eXBlIEJhc2VGdW5jdGlvbiA9IHtcbiAgaGFuZGxlcjogc3RyaW5nXG4gIGJ1bmRsZTogc3RyaW5nXG59XG5cbnR5cGUgT3Blbk5leHRGdW5jdGlvbk9yaWdpbiA9IHtcbiAgdHlwZTogXCJmdW5jdGlvblwiXG4gIHN0cmVhbWluZz86IGJvb2xlYW5cbn0gJiBCYXNlRnVuY3Rpb25cblxudHlwZSBPcGVuTmV4dFMzT3JpZ2luID0ge1xuICB0eXBlOiBcInMzXCJcbiAgb3JpZ2luUGF0aDogc3RyaW5nXG4gIGNvcHk6IHtcbiAgICBmcm9tOiBzdHJpbmdcbiAgICB0bzogc3RyaW5nXG4gICAgY2FjaGVkOiBib29sZWFuXG4gICAgdmVyc2lvbmVkU3ViRGlyPzogc3RyaW5nXG4gIH1bXVxufVxuXG50eXBlIE9wZW5OZXh0T3JpZ2lucyA9IE9wZW5OZXh0RnVuY3Rpb25PcmlnaW4gfCBPcGVuTmV4dFMzT3JpZ2luXG5cbmludGVyZmFjZSBPcGVuTmV4dE91dHB1dCB7XG4gIGVkZ2VGdW5jdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBCYXNlRnVuY3Rpb25cbiAgfVxuICBvcmlnaW5zOiB7XG4gICAgczM6IE9wZW5OZXh0UzNPcmlnaW5cbiAgICBkZWZhdWx0OiBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luXG4gICAgaW1hZ2VPcHRpbWl6ZXI6IE9wZW5OZXh0RnVuY3Rpb25PcmlnaW5cbiAgICBba2V5OiBzdHJpbmddOiBPcGVuTmV4dE9yaWdpbnNcbiAgfVxuICBiZWhhdmlvcnM6IHtcbiAgICBwYXR0ZXJuOiBzdHJpbmdcbiAgICBvcmlnaW4/OiBzdHJpbmdcbiAgICBlZGdlRnVuY3Rpb24/OiBzdHJpbmdcbiAgfVtdXG4gIGFkZGl0aW9uYWxQcm9wcz86IHtcbiAgICBkaXNhYmxlSW5jcmVtZW50YWxDYWNoZT86IGJvb2xlYW5cbiAgICBkaXNhYmxlVGFnQ2FjaGU/OiBib29sZWFuXG4gICAgaW5pdGlhbGl6YXRpb25GdW5jdGlvbj86IEJhc2VGdW5jdGlvblxuICAgIHdhcm1lcj86IEJhc2VGdW5jdGlvblxuICAgIHJldmFsaWRhdGlvbkZ1bmN0aW9uPzogQmFzZUZ1bmN0aW9uXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgTGFtYmRhIGZ1bmN0aW9ucywgZXhjbHVkaW5nIGhhbmRsZXIgYW5kIGNvZGUgd2hpY2ggYXJlIHNldCBieSB0aGUgY29uc3RydWN0LlxuICogRXh0ZW5kcyBGdW5jdGlvbk9wdGlvbnMgYW5kIGFkZHMgcnVudGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RnVuY3Rpb25Qcm9wcyBleHRlbmRzIEZ1bmN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3IgdGhlIExhbWJkYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgUnVudGltZS5OT0RFSlNfMjRfWFxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXN0cmlidXRpb25Eb21haW5Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZG9tYWluIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSB3ZWJzaXRlIFVSTCAoaWUuIGRvbWFpbi5jb20pLlxuICAgKlxuICAgKiBTdXBwb3J0cyBkb21haW5zIHRoYXQgYXJlIGhvc3RlZCBlaXRoZXIgb24gW1JvdXRlIDUzXShodHRwczovL2F3cy5hbWF6b24uY29tL3JvdXRlNTMvKSBvciBleHRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZG9tYWluTmFtZTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEltcG9ydCB0aGUgdW5kZXJseWluZyBSb3V0ZSA1MyBob3N0ZWQgem9uZS5cbiAgICpcbiAgICogUmVxdWlyZWQgaWYgYGNlcnRpZmljYXRlYCBpcyBub3QgcHJvdmlkZWQuIFdoZW4gcHJvdmlkZWQsIGEgRE5TLXZhbGlkYXRlZFxuICAgKiBjZXJ0aWZpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhbmQgRE5TIGFsaWFzZXMgd2lsbCBiZSBzZXQgdXAuXG4gICAqL1xuICByZWFkb25seSBob3N0ZWRab25lPzogSUhvc3RlZFpvbmVcblxuICAvKipcbiAgICogVGhlIEFDTSBjZXJ0aWZpY2F0ZSB0byB1c2UgZm9yIHRoZSBjdXN0b20gZG9tYWluLlxuICAgKlxuICAgKiBSZXF1aXJlZCBpZiBgaG9zdGVkWm9uZWAgaXMgbm90IHByb3ZpZGVkLiBUaGUgY2VydGlmaWNhdGUgbXVzdCBiZSBpblxuICAgKiB1cy1lYXN0LTEgZm9yIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9ucy5cbiAgICpcbiAgICogV2hlbiBwcm92aWRlZCB3aXRob3V0IGBob3N0ZWRab25lYCwgbm8gRE5TIGFsaWFzZXMgd2lsbCBiZSBjcmVhdGVkXG4gICAqIGFuZCB5b3UgbXVzdCBjb25maWd1cmUgRE5TIHJlY29yZHMgZXh0ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGNlcnRpZmljYXRlPzogSUNlcnRpZmljYXRlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzU2l0ZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBjdXN0b21Eb21haW4gZm9yIHRoaXMgd2Vic2l0ZS4gVGhpcyBkb21haW4gbXVzdCBiZSBob3N0ZWQgaW5cbiAgICogcm91dGU1MywgYW5kIHdlIG11c3QgYmUgYWJsZSB0byBjcmVhdGUgYW4gQUNNIGNlcnRpZmljYXRlIGZvciB0aGlzXG4gICAqIGRvbWFpbi5cbiAgICpcbiAgICogTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBtaWdyYXRlIGV4dGVybmFsbHkgaG9zdGVkIGRvbWFpbnMgdG8gUm91dGUgNTMgYnlcbiAgICogW2ZvbGxvd2luZyB0aGlzIGd1aWRlXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vUm91dGU1My9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvTWlncmF0aW5nRE5TLmh0bWwpLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRG9tYWluPzogRGlzdHJpYnV0aW9uRG9tYWluUHJvcHNcblxuICAvKipcbiAgICogU2hvdWxkIHBvaW50IHRvIHRoZSAub3Blbi1uZXh0IGRpcmVjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCIub3Blbi1uZXh0XCJcbiAgICovXG4gIHJlYWRvbmx5IG9wZW5OZXh0UGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHByb3BzIHRvIGFwcGx5IHRvIGFsbCBMYW1iZGEgZnVuY3Rpb25zIGNyZWF0ZWQgYnkgdGhpcyBjb25zdHJ1Y3QuXG4gICAqIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNwZWNpZmljIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEZ1bmN0aW9uUHJvcHM/OiBEZWZhdWx0RnVuY3Rpb25Qcm9wc1xufVxuXG5leHBvcnQgY2xhc3MgTmV4dGpzU2l0ZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgb3Blbk5leHRPdXRwdXQ6IE9wZW5OZXh0T3V0cHV0XG4gIHByaXZhdGUgYnVja2V0OiBCdWNrZXRcbiAgcHJpdmF0ZSB0YWJsZTogVGFibGVcbiAgcHJpdmF0ZSBxdWV1ZTogUXVldWVcblxuICBwcml2YXRlIHN0YXRpY0NhY2hlUG9saWN5OiBJQ2FjaGVQb2xpY3lcbiAgcHJpdmF0ZSBzZXJ2ZXJDYWNoZVBvbGljeTogQ2FjaGVQb2xpY3lcblxuICBwcml2YXRlIG9wZW5OZXh0UGF0aDogc3RyaW5nXG5cbiAgcHVibGljIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbjogRGlzdHJpYnV0aW9uXG4gIHByaXZhdGUgX2RlZmF1bHRTZXJ2ZXJGdW5jdGlvbiE6IENka0Z1bmN0aW9uXG4gIHByaXZhdGUgX2N1c3RvbURvbWFpbk5hbWU/OiBzdHJpbmdcblxuICBwdWJsaWMgZ2V0IGRlZmF1bHRTZXJ2ZXJGdW5jdGlvbigpOiBDZGtGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRTZXJ2ZXJGdW5jdGlvblxuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYGh0dHBzOi8vJHt0aGlzLmRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lfWBcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VzdG9tRG9tYWluVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbURvbWFpbk5hbWVcbiAgICAgID8gYGh0dHBzOi8vJHt0aGlzLl9jdXN0b21Eb21haW5OYW1lfWBcbiAgICAgIDogYGh0dHBzOi8vJHt0aGlzLmRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lfWBcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNTaXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG4gICAgdGhpcy5vcGVuTmV4dFBhdGggPSBwcm9wcy5vcGVuTmV4dFBhdGggPz8gXCIub3Blbi1uZXh0XCJcbiAgICB0aGlzLm9wZW5OZXh0T3V0cHV0ID0gSlNPTi5wYXJzZShcbiAgICAgIHJlYWRGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwib3Blbi1uZXh0Lm91dHB1dC5qc29uXCIpLCBcInV0Zi04XCIpXG4gICAgKSBhcyBPcGVuTmV4dE91dHB1dFxuXG4gICAgdGhpcy5fY3VzdG9tRG9tYWluTmFtZSA9IHByb3BzLmN1c3RvbURvbWFpbj8uZG9tYWluTmFtZVxuXG4gICAgLy8gVmFsaWRhdGUgY3VzdG9tRG9tYWluIHByb3BzOiBlaXRoZXIgY2VydGlmaWNhdGUgb3IgaG9zdGVkWm9uZSBtdXN0IGJlIHByb3ZpZGVkXG4gICAgaWYgKFxuICAgICAgcHJvcHMuY3VzdG9tRG9tYWluICYmXG4gICAgICAhcHJvcHMuY3VzdG9tRG9tYWluLmNlcnRpZmljYXRlICYmXG4gICAgICAhcHJvcHMuY3VzdG9tRG9tYWluLmhvc3RlZFpvbmVcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJjdXN0b21Eb21haW4gcmVxdWlyZXMgZWl0aGVyIGEgY2VydGlmaWNhdGUgb3IgYSBob3N0ZWRab25lLiBcIiArXG4gICAgICAgICAgXCJQcm92aWRlIGEgaG9zdGVkWm9uZSB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIEROUy12YWxpZGF0ZWQgY2VydGlmaWNhdGUsIFwiICtcbiAgICAgICAgICBcIm9yIHByb3ZpZGUgeW91ciBvd24gY2VydGlmaWNhdGUuXCJcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBCdWNrZXQodGhpcywgXCJTM0J1Y2tldFwiLCB7XG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiBmYWxzZSxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBCbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICBhdXRvRGVsZXRlT2JqZWN0czogdHJ1ZSxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgfSlcbiAgICB0aGlzLnRhYmxlID0gdGhpcy5jcmVhdGVSZXZhbGlkYXRpb25UYWJsZSgpXG4gICAgdGhpcy5xdWV1ZSA9IHRoaXMuY3JlYXRlUmV2YWxpZGF0aW9uUXVldWUoKVxuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGNlcnRpZmljYXRlIG9yIGNyZWF0ZSBvbmUgaWYgaG9zdGVkWm9uZSBpcyBhdmFpbGFibGVcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9XG4gICAgICBwcm9wcy5jdXN0b21Eb21haW4/LmNlcnRpZmljYXRlID8/XG4gICAgICAocHJvcHMuY3VzdG9tRG9tYWluPy5ob3N0ZWRab25lXG4gICAgICAgID8gdGhpcy5jcmVhdGVDZXJ0aWZpY2F0ZShcbiAgICAgICAgICAgIHByb3BzLmN1c3RvbURvbWFpbi5kb21haW5OYW1lLFxuICAgICAgICAgICAgcHJvcHMuY3VzdG9tRG9tYWluLmhvc3RlZFpvbmVcbiAgICAgICAgICApXG4gICAgICAgIDogdW5kZWZpbmVkKVxuXG4gICAgY29uc3Qgb3JpZ2lucyA9IHRoaXMuY3JlYXRlT3JpZ2lucyhwcm9wcy5kZWZhdWx0RnVuY3Rpb25Qcm9wcylcbiAgICB0aGlzLnNlcnZlckNhY2hlUG9saWN5ID0gdGhpcy5jcmVhdGVTZXJ2ZXJDYWNoZVBvbGljeSgpXG4gICAgdGhpcy5zdGF0aWNDYWNoZVBvbGljeSA9IHRoaXMuY3JlYXRlU3RhdGljQ2FjaGVQb2xpY3koKVxuICAgIHRoaXMuZGlzdHJpYnV0aW9uID0gdGhpcy5jcmVhdGVEaXN0cmlidXRpb24ob3JpZ2lucywgcHJvcHMsIGNlcnRpZmljYXRlKVxuICAgIGlmIChwcm9wcy5jdXN0b21Eb21haW4gJiYgcHJvcHMuY3VzdG9tRG9tYWluLmhvc3RlZFpvbmUpIHtcbiAgICAgIG5ldyBBUmVjb3JkKHRoaXMsIFwiQWxpYXNSZWNvcmRcIiwge1xuICAgICAgICB6b25lOiBwcm9wcy5jdXN0b21Eb21haW4uaG9zdGVkWm9uZSxcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuY3VzdG9tRG9tYWluLmRvbWFpbk5hbWUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmRpc3RyaWJ1dGlvbikpLFxuICAgICAgfSlcblxuICAgICAgbmV3IEFhYWFSZWNvcmQodGhpcywgXCJBbGlhc1JlY29yZEFBQUFcIiwge1xuICAgICAgICB6b25lOiBwcm9wcy5jdXN0b21Eb21haW4uaG9zdGVkWm9uZSxcbiAgICAgICAgcmVjb3JkTmFtZTogcHJvcHMuY3VzdG9tRG9tYWluLmRvbWFpbk5hbWUsXG4gICAgICAgIHRhcmdldDogUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgQ2xvdWRGcm9udFRhcmdldCh0aGlzLmRpc3RyaWJ1dGlvbikpLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNlcnRpZmljYXRlKGRvbWFpbk5hbWU6IHN0cmluZywgaG9zdGVkWm9uZTogSUhvc3RlZFpvbmUpIHtcbiAgICAvLyBDbG91ZEZyb250IHJlcXVpcmVzIGNlcnRpZmljYXRlcyB0byBiZSBpbiB1cy1lYXN0LTFcbiAgICAvLyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSBoYW5kbGVzIGNyb3NzLXJlZ2lvbiBjZXJ0aWZpY2F0ZSBjcmVhdGlvbiBhdXRvbWF0aWNhbGx5XG4gICAgcmV0dXJuIG5ldyBEbnNWYWxpZGF0ZWRDZXJ0aWZpY2F0ZSh0aGlzLCBcIkNlcnRpZmljYXRlXCIsIHtcbiAgICAgIGRvbWFpbk5hbWUsXG4gICAgICBob3N0ZWRab25lLFxuICAgICAgcmVnaW9uOiBcInVzLWVhc3QtMVwiLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJldmFsaWRhdGlvblRhYmxlKCkge1xuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFwiUmV2YWxpZGF0aW9uVGFibGVcIiwge1xuICAgICAgcGFydGl0aW9uS2V5OiB7IG5hbWU6IFwidGFnXCIsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICBzb3J0S2V5OiB7IG5hbWU6IFwicGF0aFwiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgcG9pbnRJblRpbWVSZWNvdmVyeUVuYWJsZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgYmlsbGluZzogQmlsbGluZy5vbkRlbWFuZCgpLFxuICAgICAgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlczogW1xuICAgICAgICB7XG4gICAgICAgICAgaW5kZXhOYW1lOiBcInJldmFsaWRhdGVcIixcbiAgICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJwYXRoXCIsIHR5cGU6IEF0dHJpYnV0ZVR5cGUuU1RSSU5HIH0sXG4gICAgICAgICAgc29ydEtleTogeyBuYW1lOiBcInJldmFsaWRhdGVkQXRcIiwgdHlwZTogQXR0cmlidXRlVHlwZS5OVU1CRVIgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSlcblxuICAgIGNvbnN0IGluaXRGbiA9IHRoaXMub3Blbk5leHRPdXRwdXQuYWRkaXRpb25hbFByb3BzPy5pbml0aWFsaXphdGlvbkZ1bmN0aW9uXG5cbiAgICBjb25zdCBpbnNlcnRGbiA9IG5ldyBDZGtGdW5jdGlvbih0aGlzLCBcIlJldmFsaWRhdGlvbkluc2VydEZ1bmN0aW9uXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk5leHQuanMgcmV2YWxpZGF0aW9uIGRhdGEgaW5zZXJ0XCIsXG4gICAgICBoYW5kbGVyOiBpbml0Rm4/LmhhbmRsZXIgPz8gXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAvLyBjb2RlOiBDb2RlLmZyb21Bc3NldChpbml0Rm4/LmJ1bmRsZSA/PyBcIlwiKSxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbih0aGlzLm9wZW5OZXh0UGF0aCwgXCJkeW5hbW9kYi1wcm92aWRlclwiKSksXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yNF9YLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBDQUNIRV9EWU5BTU9fVEFCTEU6IHRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGNvbnN0IHByb3ZpZGVyTG9nR3JvdXAgPSBuZXcgTG9nR3JvdXAodGhpcywgXCJSZXZhbGlkYXRpb25Qcm92aWRlckxvZ0dyb3VwXCIsIHtcbiAgICAgIHJldGVudGlvbjogUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pXG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcih0aGlzLCBcIlJldmFsaWRhdGlvblByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiBpbnNlcnRGbixcbiAgICAgIGxvZ0dyb3VwOiBwcm92aWRlckxvZ0dyb3VwLFxuICAgIH0pXG5cbiAgICBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJSZXZhbGlkYXRpb25SZXNvdXJjZVwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdmVyc2lvbjogRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHRhYmxlXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU9yaWdpbnMoZGVmYXVsdEZ1bmN0aW9uUHJvcHM/OiBEZWZhdWx0RnVuY3Rpb25Qcm9wcykge1xuICAgIGNvbnN0IHtcbiAgICAgIHMzOiBzM09yaWdpbixcbiAgICAgIGRlZmF1bHQ6IGRlZmF1bHRPcmlnaW4sXG4gICAgICBpbWFnZU9wdGltaXplcjogaW1hZ2VPcmlnaW4sXG4gICAgICAuLi5yZXN0T3JpZ2luc1xuICAgIH0gPSB0aGlzLm9wZW5OZXh0T3V0cHV0Lm9yaWdpbnNcbiAgICBmb3IgKGNvbnN0IGNvcHkgb2YgczNPcmlnaW4uY29weSkge1xuICAgICAgbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgYE9wZW5OZXh0QnVja2V0RGVwbG95bWVudCR7Y29weS5mcm9tfWAsIHtcbiAgICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwiLi5cIiwgY29weS5mcm9tKSldLFxuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBjb3B5LnRvLFxuICAgICAgICBwcnVuZTogZmFsc2UsXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBvcmlnaW5zID0ge1xuICAgICAgczM6IFMzQnVja2V0T3JpZ2luLndpdGhPcmlnaW5BY2Nlc3NDb250cm9sKHRoaXMuYnVja2V0LCB7XG4gICAgICAgIG9yaWdpbklkOiBcIlMzQnVja2V0XCIsXG4gICAgICAgIG9yaWdpblBhdGg6IHMzT3JpZ2luLm9yaWdpblBhdGgsXG4gICAgICB9KSxcbiAgICAgIGRlZmF1bHQ6IHRoaXMuY3JlYXRlRnVuY3Rpb25PcmlnaW4oXG4gICAgICAgIFwiZGVmYXVsdFwiLFxuICAgICAgICBkZWZhdWx0T3JpZ2luLFxuICAgICAgICBcIk5leHRKc1NlcnZlclwiLFxuICAgICAgICBkZWZhdWx0RnVuY3Rpb25Qcm9wc1xuICAgICAgKSxcbiAgICAgIGltYWdlT3B0aW1pemVyOiB0aGlzLmNyZWF0ZUZ1bmN0aW9uT3JpZ2luKFxuICAgICAgICBcImltYWdlT3B0aW1pemVyXCIsXG4gICAgICAgIGltYWdlT3JpZ2luLFxuICAgICAgICBcIkltYWdlT3B0aW1pemVyXCJcbiAgICAgICksXG4gICAgICAuLi5PYmplY3QuZW50cmllcyhyZXN0T3JpZ2lucykucmVkdWNlKFxuICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBjb25zdCBvcmlnaW5JZCA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgxKVxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdGhpcy5jcmVhdGVGdW5jdGlvbk9yaWdpbihrZXksIHZhbHVlLCBvcmlnaW5JZClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY1xuICAgICAgICB9LFxuICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBIdHRwT3JpZ2luPlxuICAgICAgKSxcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbnNcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmV2YWxpZGF0aW9uUXVldWUoKSB7XG4gICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUodGhpcywgXCJSZXZhbGlkYXRpb25RdWV1ZVwiLCB7XG4gICAgICBmaWZvOiB0cnVlLFxuICAgICAgcmVjZWl2ZU1lc3NhZ2VXYWl0VGltZTogRHVyYXRpb24uc2Vjb25kcygyMCksXG4gICAgfSlcbiAgICBjb25zdCBjb25zdW1lciA9IG5ldyBDZGtGdW5jdGlvbih0aGlzLCBcIlJldmFsaWRhdGlvbkZ1bmN0aW9uXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIk5leHQuanMgcmV2YWxpZGF0b3JcIixcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHRoaXMub3Blbk5leHRPdXRwdXQuYWRkaXRpb25hbFByb3BzPy5yZXZhbGlkYXRpb25GdW5jdGlvbj8uYnVuZGxlXG4gICAgICAgICAgPyBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgIHRoaXMub3Blbk5leHRQYXRoLFxuICAgICAgICAgICAgICBcIi4uXCIsXG4gICAgICAgICAgICAgIHRoaXMub3Blbk5leHRPdXRwdXQuYWRkaXRpb25hbFByb3BzPy5yZXZhbGlkYXRpb25GdW5jdGlvbj8uYnVuZGxlXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBcIlwiXG4gICAgICApLFxuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjJfWCxcbiAgICAgIGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgIH0pXG4gICAgY29uc3VtZXIuYWRkRXZlbnRTb3VyY2UobmV3IFNxc0V2ZW50U291cmNlKHF1ZXVlLCB7IGJhdGNoU2l6ZTogNSB9KSlcbiAgICByZXR1cm4gcXVldWVcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW52aXJvbm1lbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIENBQ0hFX0JVQ0tFVF9OQU1FOiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgQ0FDSEVfQlVDS0VUX0tFWV9QUkVGSVg6IFwiX2NhY2hlXCIsXG4gICAgICBDQUNIRV9CVUNLRVRfUkVHSU9OOiBTdGFjay5vZih0aGlzKS5yZWdpb24sXG4gICAgICBSRVZBTElEQVRJT05fUVVFVUVfVVJMOiB0aGlzLnF1ZXVlLnF1ZXVlVXJsLFxuICAgICAgUkVWQUxJREFUSU9OX1FVRVVFX1JFR0lPTjogU3RhY2sub2YodGhpcykucmVnaW9uLFxuICAgICAgQ0FDSEVfRFlOQU1PX1RBQkxFOiB0aGlzLnRhYmxlLnRhYmxlTmFtZSxcbiAgICAgIC8vIFRob3NlIDIgYXJlIHVzZWQgb25seSBmb3IgaW1hZ2Ugb3B0aW1pemVyXG4gICAgICBCVUNLRVRfTkFNRTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIEJVQ0tFVF9LRVlfUFJFRklYOiBcIl9hc3NldHNcIixcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdyYW50UGVybWlzc2lvbnMoZ3JhbnRhYmxlOiBJR3JhbnRhYmxlKSB7XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRhYmxlKVxuICAgIHRoaXMudGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKGdyYW50YWJsZSlcbiAgICB0aGlzLnF1ZXVlLmdyYW50U2VuZE1lc3NhZ2VzKGdyYW50YWJsZSlcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRnVuY3Rpb25PcmlnaW4oXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3JpZ2luOiBPcGVuTmV4dEZ1bmN0aW9uT3JpZ2luLFxuICAgIG9yaWdpbklkPzogc3RyaW5nLFxuICAgIGZuUHJvcHM/OiBEZWZhdWx0RnVuY3Rpb25Qcm9wc1xuICApIHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuZ2V0RW52aXJvbm1lbnQoKVxuICAgIGNvbnN0IGZuID0gbmV3IENka0Z1bmN0aW9uKHRoaXMsIGAke2tleX1GdW5jdGlvbmAsIHtcbiAgICAgIC4uLmZuUHJvcHMsXG4gICAgICBydW50aW1lOiBmblByb3BzPy5ydW50aW1lID8/IFJ1bnRpbWUuTk9ERUpTXzI0X1gsXG4gICAgICBhcmNoaXRlY3R1cmU6IGZuUHJvcHM/LmFyY2hpdGVjdHVyZSA/PyBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgbWVtb3J5U2l6ZTogZm5Qcm9wcz8ubWVtb3J5U2l6ZSA/PyAxMDI0LFxuICAgICAgaGFuZGxlcjogb3JpZ2luLmhhbmRsZXIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4odGhpcy5vcGVuTmV4dFBhdGgsIFwiLi5cIiwgb3JpZ2luLmJ1bmRsZSkpLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgLi4uZm5Qcm9wcz8uZW52aXJvbm1lbnQsXG4gICAgICAgIC4uLmVudmlyb25tZW50LFxuICAgICAgfSxcbiAgICB9KVxuICAgIGNvbnN0IGZuVXJsID0gZm4uYWRkRnVuY3Rpb25Vcmwoe1xuICAgICAgYXV0aFR5cGU6IEZ1bmN0aW9uVXJsQXV0aFR5cGUuTk9ORSxcbiAgICAgIGludm9rZU1vZGU6IG9yaWdpbi5zdHJlYW1pbmcgPyBJbnZva2VNb2RlLlJFU1BPTlNFX1NUUkVBTSA6IEludm9rZU1vZGUuQlVGRkVSRUQsXG4gICAgfSlcbiAgICB0aGlzLmdyYW50UGVybWlzc2lvbnMoZm4pXG5cbiAgICAvLyBTdG9yZSByZWZlcmVuY2UgdG8gZGVmYXVsdCBzZXJ2ZXIgZnVuY3Rpb25cbiAgICBpZiAoa2V5ID09PSBcImRlZmF1bHRcIikge1xuICAgICAgdGhpcy5fZGVmYXVsdFNlcnZlckZ1bmN0aW9uID0gZm5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEh0dHBPcmlnaW4oRm4ucGFyc2VEb21haW5OYW1lKGZuVXJsLnVybCksIHtcbiAgICAgIC4uLihvcmlnaW5JZCA/IHsgb3JpZ2luSWQgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEaXN0cmlidXRpb24oXG4gICAgb3JpZ2luczogUmVjb3JkPHN0cmluZywgSU9yaWdpbj4sXG4gICAgcHJvcHM6IE5leHRqc1NpdGVQcm9wcyxcbiAgICBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZVxuICApIHtcbiAgICBjb25zdCBjbG91ZGZyb250RnVuY3Rpb24gPSBuZXcgQ2xvdWRmcm9udEZ1bmN0aW9uKHRoaXMsIFwiQ2xvdWRGcm9udEZ1bmN0aW9uXCIsIHtcbiAgICAgIGNvZGU6IEZ1bmN0aW9uQ29kZS5mcm9tSW5saW5lKGBcblx0XHRcdGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcblx0XHRcdFx0dmFyIHJlcXVlc3QgPSBldmVudC5yZXF1ZXN0O1xuXHRcdFx0XHRyZXF1ZXN0LmhlYWRlcnNbXCJ4LWZvcndhcmRlZC1ob3N0XCJdID0gcmVxdWVzdC5oZWFkZXJzLmhvc3Q7XG5cdFx0XHRcdHJldHVybiByZXF1ZXN0O1xuXHRcdFx0fVxuXHRcdFx0YCksXG4gICAgfSlcbiAgICBjb25zdCBmbkFzc29jaWF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZnVuY3Rpb246IGNsb3VkZnJvbnRGdW5jdGlvbixcbiAgICAgICAgZXZlbnRUeXBlOiBGdW5jdGlvbkV2ZW50VHlwZS5WSUVXRVJfUkVRVUVTVCxcbiAgICAgIH0sXG4gICAgXVxuXG4gICAgY29uc3QgZGlzdHJpYnV0aW9uID0gbmV3IERpc3RyaWJ1dGlvbih0aGlzLCBcIkRpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBkb21haW5OYW1lczogcHJvcHMuY3VzdG9tRG9tYWluID8gW3Byb3BzLmN1c3RvbURvbWFpbi5kb21haW5OYW1lXSA6IHVuZGVmaW5lZCxcbiAgICAgIGNlcnRpZmljYXRlLFxuICAgICAgZGVmYXVsdEJlaGF2aW9yOiB7XG4gICAgICAgIG9yaWdpbjogb3JpZ2lucy5kZWZhdWx0ISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0FMTCxcbiAgICAgICAgY2FjaGVkTWV0aG9kczogQ2FjaGVkTWV0aG9kcy5DQUNIRV9HRVRfSEVBRF9PUFRJT05TLFxuICAgICAgICBjYWNoZVBvbGljeTogdGhpcy5zZXJ2ZXJDYWNoZVBvbGljeSxcbiAgICAgICAgb3JpZ2luUmVxdWVzdFBvbGljeTogT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgZnVuY3Rpb25Bc3NvY2lhdGlvbnM6IGZuQXNzb2NpYXRpb25zLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxCZWhhdmlvcnM6IHRoaXMub3Blbk5leHRPdXRwdXQuYmVoYXZpb3JzXG4gICAgICAgIC5maWx0ZXIoKGIpID0+IGIucGF0dGVybiAhPT0gXCIqXCIpXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgYmVoYXZpb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJlaGF2aW9yT3B0aW9uczogQmVoYXZpb3JPcHRpb25zID0ge1xuICAgICAgICAgICAgICBvcmlnaW46IChiZWhhdmlvci5vcmlnaW4gPyBvcmlnaW5zW2JlaGF2aW9yLm9yaWdpbl0gOiBvcmlnaW5zLmRlZmF1bHQpISwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICAgIHZpZXdlclByb3RvY29sUG9saWN5OiBWaWV3ZXJQcm90b2NvbFBvbGljeS5SRURJUkVDVF9UT19IVFRQUyxcbiAgICAgICAgICAgICAgYWxsb3dlZE1ldGhvZHM6IEFsbG93ZWRNZXRob2RzLkFMTE9XX0dFVF9IRUFEX09QVElPTlMsXG4gICAgICAgICAgICAgIGNhY2hlZE1ldGhvZHM6IENhY2hlZE1ldGhvZHMuQ0FDSEVfR0VUX0hFQURfT1BUSU9OUyxcbiAgICAgICAgICAgICAgY2FjaGVQb2xpY3k6XG4gICAgICAgICAgICAgICAgYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0aWNDYWNoZVBvbGljeVxuICAgICAgICAgICAgICAgICAgOiB0aGlzLnNlcnZlckNhY2hlUG9saWN5LFxuICAgICAgICAgICAgICAuLi4oYmVoYXZpb3Iub3JpZ2luID09PSBcInMzXCJcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIG9yaWdpblJlcXVlc3RQb2xpY3k6XG4gICAgICAgICAgICAgICAgICAgICAgT3JpZ2luUmVxdWVzdFBvbGljeS5BTExfVklFV0VSX0VYQ0VQVF9IT1NUX0hFQURFUixcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBmdW5jdGlvbkFzc29jaWF0aW9uczogZm5Bc3NvY2lhdGlvbnMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2NbYmVoYXZpb3IucGF0dGVybl0gPSBiZWhhdmlvck9wdGlvbnNcbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIEJlaGF2aW9yT3B0aW9ucz5cbiAgICAgICAgKSxcbiAgICB9KVxuICAgIHJldHVybiBkaXN0cmlidXRpb25cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU2VydmVyQ2FjaGVQb2xpY3koKSB7XG4gICAgcmV0dXJuIG5ldyBDYWNoZVBvbGljeSh0aGlzLCBcIk9wZW5OZXh0U2VydmVyQ2FjaGVQb2xpY3lcIiwge1xuICAgICAgcXVlcnlTdHJpbmdCZWhhdmlvcjogQ2FjaGVRdWVyeVN0cmluZ0JlaGF2aW9yLmFsbCgpLFxuICAgICAgaGVhZGVyQmVoYXZpb3I6IENhY2hlSGVhZGVyQmVoYXZpb3IuYWxsb3dMaXN0KFxuICAgICAgICBcImFjY2VwdFwiLFxuICAgICAgICBcImFjY2VwdC1lbmNvZGluZ1wiLFxuICAgICAgICBcInJzY1wiLFxuICAgICAgICBcIm5leHQtcm91dGVyLXByZWZldGNoXCIsXG4gICAgICAgIFwibmV4dC1yb3V0ZXItc3RhdGUtdHJlZVwiLFxuICAgICAgICBcIm5leHQtdXJsXCIsXG4gICAgICAgIFwieC1wcmVyZW5kZXItcmV2YWxpZGF0ZVwiXG4gICAgICApLFxuICAgICAgY29va2llQmVoYXZpb3I6IENhY2hlQ29va2llQmVoYXZpb3Iubm9uZSgpLFxuICAgICAgZGVmYXVsdFR0bDogRHVyYXRpb24uZGF5cygwKSxcbiAgICAgIG1heFR0bDogRHVyYXRpb24uZGF5cygzNjUpLFxuICAgICAgbWluVHRsOiBEdXJhdGlvbi5kYXlzKDApLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0YXRpY0NhY2hlUG9saWN5KCkge1xuICAgIHJldHVybiBDYWNoZVBvbGljeS5DQUNISU5HX09QVElNSVpFRFxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -76,7 +76,7 @@
76
76
  "publishConfig": {
77
77
  "access": "public"
78
78
  },
79
- "version": "0.3.0",
79
+ "version": "0.3.1",
80
80
  "jest": {
81
81
  "coverageProvider": "v8",
82
82
  "testMatch": [