@cdktn/provider-generator 0.23.0-pre.4 → 0.23.0-pre.40
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/ambient.d.ts +0 -1
- package/{lib → build}/__tests__/edge-provider-schema/builder.d.ts +1 -0
- package/build/__tests__/edge-provider-schema/builder.js +106 -0
- package/build/__tests__/edge-provider-schema/cli.d.ts +2 -0
- package/build/__tests__/edge-provider-schema/cli.js +67 -0
- package/{lib → build}/__tests__/edge-provider-schema/index.d.ts +1 -0
- package/build/__tests__/edge-provider-schema/index.js +154 -0
- package/build/__tests__/edge-provider-schema.test.d.ts +2 -0
- package/build/__tests__/edge-provider-schema.test.js +46 -0
- package/build/__tests__/provider.test.d.ts +2 -0
- package/build/__tests__/provider.test.js +158 -0
- package/build/get/__tests__/constructs-maker.test.d.ts +2 -0
- package/build/get/__tests__/constructs-maker.test.js +113 -0
- package/build/get/__tests__/generator/complex-computed-types.test.d.ts +2 -0
- package/build/get/__tests__/generator/complex-computed-types.test.js +42 -0
- package/build/get/__tests__/generator/deep-nested-attributes.test.d.ts +2 -0
- package/build/get/__tests__/generator/deep-nested-attributes.test.js +50 -0
- package/build/get/__tests__/generator/description-escaping.test.d.ts +2 -0
- package/build/get/__tests__/generator/description-escaping.test.js +65 -0
- package/build/get/__tests__/generator/empty-provider-resources.test.d.ts +2 -0
- package/build/get/__tests__/generator/empty-provider-resources.test.js +40 -0
- package/build/get/__tests__/generator/export-sharding.test.d.ts +2 -0
- package/build/get/__tests__/generator/export-sharding.test.js +82 -0
- package/build/get/__tests__/generator/module-generator.test.d.ts +2 -0
- package/build/get/__tests__/generator/module-generator.test.js +476 -0
- package/build/get/__tests__/generator/nested-types.test.d.ts +2 -0
- package/build/get/__tests__/generator/nested-types.test.js +51 -0
- package/build/get/__tests__/generator/provider.test.d.ts +2 -0
- package/build/get/__tests__/generator/provider.test.js +51 -0
- package/build/get/__tests__/generator/resource-types.test.d.ts +2 -0
- package/build/get/__tests__/generator/resource-types.test.js +78 -0
- package/build/get/__tests__/generator/skipped-attributes.test.d.ts +2 -0
- package/build/get/__tests__/generator/skipped-attributes.test.js +55 -0
- package/build/get/__tests__/generator/types.test.d.ts +2 -0
- package/build/get/__tests__/generator/types.test.js +289 -0
- package/build/get/__tests__/generator/versions-file.test.d.ts +2 -0
- package/build/get/__tests__/generator/versions-file.test.js +74 -0
- package/{lib → build}/get/__tests__/util.d.ts +1 -0
- package/build/get/__tests__/util.js +59 -0
- package/{lib → build}/get/constructs-maker.d.ts +2 -1
- package/build/get/constructs-maker.js +530 -0
- package/{lib → build}/get/generator/custom-defaults.d.ts +1 -0
- package/build/get/generator/custom-defaults.js +403 -0
- package/{lib → build}/get/generator/emitter/attributes-emitter.d.ts +1 -0
- package/build/get/generator/emitter/attributes-emitter.js +161 -0
- package/{lib → build}/get/generator/emitter/index.d.ts +1 -0
- package/{lib → build}/get/generator/emitter/index.js +1 -1
- package/{lib → build}/get/generator/emitter/resource-emitter.d.ts +1 -0
- package/build/get/generator/emitter/resource-emitter.js +144 -0
- package/{lib → build}/get/generator/emitter/struct-emitter.d.ts +1 -0
- package/build/get/generator/emitter/struct-emitter.js +500 -0
- package/{lib → build}/get/generator/loop-detection.d.ts +1 -0
- package/build/get/generator/loop-detection.js +56 -0
- package/{lib → build}/get/generator/models/attribute-model.d.ts +1 -0
- package/build/get/generator/models/attribute-model.js +160 -0
- package/{lib → build}/get/generator/models/attribute-type-model.d.ts +1 -0
- package/build/get/generator/models/attribute-type-model.js +376 -0
- package/{lib → build}/get/generator/models/index.d.ts +1 -0
- package/{lib → build}/get/generator/models/index.js +1 -1
- package/{lib → build}/get/generator/models/resource-model.d.ts +1 -0
- package/build/get/generator/models/resource-model.js +106 -0
- package/{lib → build}/get/generator/models/scope.d.ts +1 -0
- package/build/get/generator/models/scope.js +36 -0
- package/{lib → build}/get/generator/models/struct.d.ts +1 -0
- package/build/get/generator/models/struct.js +90 -0
- package/{lib → build}/get/generator/module-generator.d.ts +1 -0
- package/build/get/generator/module-generator.js +184 -0
- package/{lib → build}/get/generator/provider-generator.d.ts +1 -0
- package/build/get/generator/provider-generator.js +225 -0
- package/{lib → build}/get/generator/resource-parser.d.ts +1 -0
- package/build/get/generator/resource-parser.js +497 -0
- package/{lib → build}/get/generator/sanitized-comments.d.ts +1 -0
- package/build/get/generator/sanitized-comments.js +44 -0
- package/{lib → build}/get/generator/skipped-attributes.d.ts +1 -0
- package/build/get/generator/skipped-attributes.js +29 -0
- package/{lib → build}/index.d.ts +1 -0
- package/{lib → build}/index.js +1 -1
- package/{lib → build}/util.d.ts +1 -0
- package/build/util.js +30 -0
- package/package.json +11 -11
- package/{lib → src}/__tests__/__snapshots__/edge-provider-schema.test.ts.snap +1 -1
- package/{lib → src}/__tests__/__snapshots__/provider.test.ts.snap +14953 -890
- package/{lib → src}/get/__tests__/generator/__snapshots__/complex-computed-types.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/description-escaping.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/export-sharding.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/module-generator.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/nested-types.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/provider.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/resource-types.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/skipped-attributes.test.ts.snap +1 -1
- package/{lib → src}/get/__tests__/generator/__snapshots__/types.test.ts.snap +92 -1
- package/src/get/__tests__/generator/fixtures/map-of-map-of-string.test.fixture.json +27 -0
- package/tsconfig.json +6 -3
- package/lib/__tests__/edge-provider-schema/builder.js +0 -106
- package/lib/__tests__/edge-provider-schema/cli.d.ts +0 -1
- package/lib/__tests__/edge-provider-schema/cli.js +0 -67
- package/lib/__tests__/edge-provider-schema/index.js +0 -154
- package/lib/__tests__/edge-provider-schema.test.d.ts +0 -1
- package/lib/__tests__/edge-provider-schema.test.js +0 -46
- package/lib/__tests__/provider.test.d.ts +0 -1
- package/lib/__tests__/provider.test.js +0 -158
- package/lib/get/__tests__/constructs-maker.test.d.ts +0 -1
- package/lib/get/__tests__/constructs-maker.test.js +0 -113
- package/lib/get/__tests__/generator/complex-computed-types.test.d.ts +0 -1
- package/lib/get/__tests__/generator/complex-computed-types.test.js +0 -42
- package/lib/get/__tests__/generator/deep-nested-attributes.test.d.ts +0 -1
- package/lib/get/__tests__/generator/deep-nested-attributes.test.js +0 -50
- package/lib/get/__tests__/generator/description-escaping.test.d.ts +0 -1
- package/lib/get/__tests__/generator/description-escaping.test.js +0 -65
- package/lib/get/__tests__/generator/empty-provider-resources.test.d.ts +0 -1
- package/lib/get/__tests__/generator/empty-provider-resources.test.js +0 -40
- package/lib/get/__tests__/generator/export-sharding.test.d.ts +0 -1
- package/lib/get/__tests__/generator/export-sharding.test.js +0 -82
- package/lib/get/__tests__/generator/module-generator.test.d.ts +0 -1
- package/lib/get/__tests__/generator/module-generator.test.js +0 -476
- package/lib/get/__tests__/generator/nested-types.test.d.ts +0 -1
- package/lib/get/__tests__/generator/nested-types.test.js +0 -51
- package/lib/get/__tests__/generator/provider.test.d.ts +0 -1
- package/lib/get/__tests__/generator/provider.test.js +0 -51
- package/lib/get/__tests__/generator/resource-types.test.d.ts +0 -1
- package/lib/get/__tests__/generator/resource-types.test.js +0 -78
- package/lib/get/__tests__/generator/skipped-attributes.test.d.ts +0 -1
- package/lib/get/__tests__/generator/skipped-attributes.test.js +0 -55
- package/lib/get/__tests__/generator/types.test.d.ts +0 -1
- package/lib/get/__tests__/generator/types.test.js +0 -280
- package/lib/get/__tests__/generator/versions-file.test.d.ts +0 -1
- package/lib/get/__tests__/generator/versions-file.test.js +0 -74
- package/lib/get/__tests__/util.js +0 -59
- package/lib/get/constructs-maker.js +0 -530
- package/lib/get/generator/custom-defaults.js +0 -403
- package/lib/get/generator/emitter/attributes-emitter.js +0 -161
- package/lib/get/generator/emitter/resource-emitter.js +0 -144
- package/lib/get/generator/emitter/struct-emitter.js +0 -500
- package/lib/get/generator/loop-detection.js +0 -56
- package/lib/get/generator/models/attribute-model.js +0 -160
- package/lib/get/generator/models/attribute-type-model.js +0 -376
- package/lib/get/generator/models/resource-model.js +0 -106
- package/lib/get/generator/models/scope.js +0 -36
- package/lib/get/generator/models/struct.js +0 -90
- package/lib/get/generator/module-generator.js +0 -184
- package/lib/get/generator/provider-generator.js +0 -225
- package/lib/get/generator/resource-parser.js +0 -497
- package/lib/get/generator/sanitized-comments.js +0 -44
- package/lib/get/generator/skipped-attributes.js +0 -29
- package/lib/util.js +0 -30
- /package/{lib → src}/get/__tests__/generator/fixtures/aws-provider.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_acm_certificate.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_cloudfront_distribution.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_fms_admin_account.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_quicksight_template.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_s3_bucket.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_security_group.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/aws_wafv2_web_acl.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/block-type-nested-computed-list.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/block-type-set-list.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/boolean-list.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/boolean-map.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/comment-ending-sequence.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/computed-complex-nested.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/computed-complex.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/computed-optional-complex.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/data_aws_quicksight_analysis.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/datadog_dashboard.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/datadog_spans_metric.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/deep-attributes.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/deeply-nested-block-types.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/description-escaping.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/elasticstack-provider.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/empty-provider-resources.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/ignored-attributes.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/incompatible-attribute-names.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/incompatible-resource-names.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/list-list-object.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/list-list-string.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/list-of-string-map.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/map-of-string-list.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/markdown-description-with-code-blocks.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/module-get-x.test.fixture.tf +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/module-no-newline-1.test.fixture.tf +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/module-no-newline-2.test.fixture.tf +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/module-no-outputs.test.fixture.tf +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/module-no-variable-type.test.fixture.tf +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/module-with-star-default.test.fixture.tf +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/name-conflict.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/nested-type-without-attributes.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/nested-types.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/number-list.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/number-map.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/primitive-boolean.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/primitive-dynamic.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/primitive-number.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/primitive-string.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/single-block-type.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/string-list.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/string-map.test.fixture.json +0 -0
- /package/{lib → src}/get/__tests__/generator/fixtures/stripe-schema.test.fixture.json +0 -0
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
// Copyright (c) HashiCorp, Inc
|
|
27
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
28
|
+
const fs = __importStar(require("fs"));
|
|
29
|
+
const os = __importStar(require("os"));
|
|
30
|
+
const path = __importStar(require("path"));
|
|
31
|
+
const commons_1 = require("@cdktn/commons");
|
|
32
|
+
const constructs_maker_1 = require("../../constructs-maker");
|
|
33
|
+
const util_1 = require("../util");
|
|
34
|
+
const child_process_1 = require("child_process");
|
|
35
|
+
const onTf1_6AndNewer = (name, fn, timeout) => {
|
|
36
|
+
const terraformBinaryName = process.env.TERRAFORM_BINARY_NAME || "terraform";
|
|
37
|
+
const output = (0, child_process_1.execSync)(`${terraformBinaryName} version -json`);
|
|
38
|
+
if (!output) {
|
|
39
|
+
throw new Error("Could not determine Terraform version");
|
|
40
|
+
}
|
|
41
|
+
const tfVersion = JSON.parse(output.toString()).terraform_version;
|
|
42
|
+
const [major, minor] = tfVersion.toString().split(".");
|
|
43
|
+
if (Number(major) < 1 || (Number(major) === 1 && Number(minor) < 6)) {
|
|
44
|
+
test.skip(`${name} (requires Terraform >= 1.6.0; but is ${tfVersion})`, fn, timeout);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
test(name, fn, timeout);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
test("generate some modules", async () => {
|
|
51
|
+
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "module-generator.test"));
|
|
52
|
+
const constraint = new commons_1.TerraformModuleConstraint("terraform-aws-modules/eks/aws@7.0.1");
|
|
53
|
+
const maker = new constructs_maker_1.ConstructsMaker({
|
|
54
|
+
codeMakerOutput: workdir,
|
|
55
|
+
targetLanguage: commons_1.Language.TYPESCRIPT,
|
|
56
|
+
}, process.env.CDKTF_EXPERIMENTAL_PROVIDER_SCHEMA_CACHE_PATH);
|
|
57
|
+
await maker.generate([constraint]);
|
|
58
|
+
const output = fs.readFileSync(path.join(workdir, "modules/terraform-aws-modules/aws/eks.ts"), "utf-8");
|
|
59
|
+
expect(output).toMatchSnapshot();
|
|
60
|
+
}, 120000);
|
|
61
|
+
(0, util_1.expectModuleToMatchSnapshot)("no module outputs", "generator", [
|
|
62
|
+
"module-no-outputs.test.fixture.tf",
|
|
63
|
+
]);
|
|
64
|
+
(0, util_1.expectModuleToMatchSnapshot)("typeless variables", "generator", [
|
|
65
|
+
"module-no-variable-type.test.fixture.tf",
|
|
66
|
+
]);
|
|
67
|
+
(0, util_1.expectModuleToMatchSnapshot)("no newline", "generator", [
|
|
68
|
+
"module-no-newline-1.test.fixture.tf",
|
|
69
|
+
"module-no-newline-2.test.fixture.tf",
|
|
70
|
+
]);
|
|
71
|
+
test("generate multiple aws modules", async () => {
|
|
72
|
+
jest.setTimeout(120000);
|
|
73
|
+
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "module-generator-aws.test"));
|
|
74
|
+
const constraints = [
|
|
75
|
+
new commons_1.TerraformModuleConstraint("terraform-aws-modules/vpc/aws@2.78.0"),
|
|
76
|
+
new commons_1.TerraformModuleConstraint("terraform-aws-modules/rds-aurora/aws@4.1.0"),
|
|
77
|
+
];
|
|
78
|
+
const maker = new constructs_maker_1.ConstructsMaker({
|
|
79
|
+
codeMakerOutput: workdir,
|
|
80
|
+
targetLanguage: commons_1.Language.TYPESCRIPT,
|
|
81
|
+
}, process.env.CDKTF_EXPERIMENTAL_PROVIDER_SCHEMA_CACHE_PATH);
|
|
82
|
+
await maker.generate(constraints);
|
|
83
|
+
const vpcOutput = fs.readFileSync(path.join(workdir, "modules/terraform-aws-modules/aws/vpc.ts"), "utf-8");
|
|
84
|
+
expect(vpcOutput).toMatchSnapshot();
|
|
85
|
+
const rdsOutput = fs.readFileSync(path.join(workdir, "modules/terraform-aws-modules/aws/rds-aurora.ts"), "utf-8");
|
|
86
|
+
expect(rdsOutput).toMatchSnapshot();
|
|
87
|
+
}, 120000);
|
|
88
|
+
test("generate nested module", async () => {
|
|
89
|
+
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "module-generator-nested.test"));
|
|
90
|
+
const constraint = new commons_1.TerraformModuleConstraint("terraform-aws-modules/vpc/aws//modules/vpc-endpoints@3.19.0");
|
|
91
|
+
const maker = new constructs_maker_1.ConstructsMaker({
|
|
92
|
+
codeMakerOutput: workdir,
|
|
93
|
+
targetLanguage: commons_1.Language.TYPESCRIPT,
|
|
94
|
+
}, process.env.CDKTF_EXPERIMENTAL_PROVIDER_SCHEMA_CACHE_PATH);
|
|
95
|
+
await maker.generate([constraint]);
|
|
96
|
+
const output = fs.readFileSync(path.join(workdir, "modules/terraform-aws-modules/aws/vpc/modules/vpc-endpoints.ts"), "utf-8");
|
|
97
|
+
expect(output).toMatchSnapshot();
|
|
98
|
+
}, 120000);
|
|
99
|
+
(0, util_1.expectModuleToMatchSnapshot)("getX variables", "generator", [
|
|
100
|
+
"module-get-x.test.fixture.tf",
|
|
101
|
+
]);
|
|
102
|
+
(0, util_1.expectModuleToMatchSnapshot)("handle */* in module variable default string", "generator", ["module-with-star-default.test.fixture.tf"]);
|
|
103
|
+
onTf1_6AndNewer("generate module that can't be initialized", async () => {
|
|
104
|
+
jest.setTimeout(120000);
|
|
105
|
+
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "module-generator.test-no-init"));
|
|
106
|
+
const constraint = new commons_1.TerraformModuleConstraint("milliHQ/next-js/aws@1.0.0-canary.5");
|
|
107
|
+
const maker = new constructs_maker_1.ConstructsMaker({
|
|
108
|
+
codeMakerOutput: workdir,
|
|
109
|
+
targetLanguage: commons_1.Language.TYPESCRIPT,
|
|
110
|
+
}, process.env.CDKTF_EXPERIMENTAL_PROVIDER_SCHEMA_CACHE_PATH);
|
|
111
|
+
await maker.generate([constraint]);
|
|
112
|
+
const output = fs.readFileSync(path.join(workdir, "modules/milliHQ/aws/next-js.ts"), "utf-8");
|
|
113
|
+
// yes, this is a lot of code, but this test is skipped for some Terraform versions
|
|
114
|
+
// which then shows snapshots as obsolete which fails the test
|
|
115
|
+
// this way, there's no such problem if the test is skipped
|
|
116
|
+
expect(output).toMatchInlineSnapshot(`
|
|
117
|
+
"// generated by cdktn get
|
|
118
|
+
// milliHQ/next-js/aws
|
|
119
|
+
import { TerraformModule, TerraformModuleUserConfig } from 'cdktn';
|
|
120
|
+
import { Construct } from 'constructs';
|
|
121
|
+
export interface NextJsConfig extends TerraformModuleUserConfig {
|
|
122
|
+
/**
|
|
123
|
+
* ACM certificate arn for custom_domain
|
|
124
|
+
*/
|
|
125
|
+
readonly cloudfrontAcmCertificateArn?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Aliases for custom_domain
|
|
128
|
+
*
|
|
129
|
+
*/
|
|
130
|
+
readonly cloudfrontAliases?: string[];
|
|
131
|
+
/**
|
|
132
|
+
* Header keys that should be used to calculate the cache key in CloudFront.
|
|
133
|
+
* Authorization
|
|
134
|
+
*/
|
|
135
|
+
readonly cloudfrontCacheKeyHeaders?: string[];
|
|
136
|
+
/**
|
|
137
|
+
* Controls whether the main CloudFront distribution should be created.
|
|
138
|
+
* true
|
|
139
|
+
*/
|
|
140
|
+
readonly cloudfrontCreateDistribution?: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* When using an external CloudFront distribution provide its arn.
|
|
143
|
+
*/
|
|
144
|
+
readonly cloudfrontExternalArn?: string;
|
|
145
|
+
/**
|
|
146
|
+
* When using an external CloudFront distribution provide its id.
|
|
147
|
+
*/
|
|
148
|
+
readonly cloudfrontExternalId?: string;
|
|
149
|
+
/**
|
|
150
|
+
* The minimum version of the SSL protocol that you want CloudFront to use for HTTPS connections. One of SSLv3, TLSv1, TLSv1_2016, TLSv1.1_2016, TLSv1.2_2018 or TLSv1.2_2019.
|
|
151
|
+
* TLSv1
|
|
152
|
+
*/
|
|
153
|
+
readonly cloudfrontMinimumProtocolVersion?: string;
|
|
154
|
+
/**
|
|
155
|
+
* Id of a custom request policy that overrides the default policy (AllViewer). Can be custom or managed.
|
|
156
|
+
*/
|
|
157
|
+
readonly cloudfrontOriginRequestPolicy?: string;
|
|
158
|
+
/**
|
|
159
|
+
* Price class for the CloudFront distributions (main & proxy config). One of PriceClass_All, PriceClass_200, PriceClass_100.
|
|
160
|
+
* PriceClass_100
|
|
161
|
+
*/
|
|
162
|
+
readonly cloudfrontPriceClass?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Id of a response headers policy. Can be custom or managed. Default is empty.
|
|
165
|
+
*/
|
|
166
|
+
readonly cloudfrontResponseHeadersPolicy?: string;
|
|
167
|
+
/**
|
|
168
|
+
* An optional webacl2 arn or webacl id to associate with the cloudfront distribution
|
|
169
|
+
*/
|
|
170
|
+
readonly cloudfrontWebaclId?: string;
|
|
171
|
+
/**
|
|
172
|
+
* Controls whether resources for image optimization support should be created or not.
|
|
173
|
+
* true
|
|
174
|
+
*/
|
|
175
|
+
readonly createImageOptimization?: boolean;
|
|
176
|
+
/**
|
|
177
|
+
* Use locally built packages rather than download them from npm.
|
|
178
|
+
*/
|
|
179
|
+
readonly debugUseLocalPackages?: boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Identifier for the deployment group (only lowercase alphanumeric characters and hyphens are allowed).
|
|
182
|
+
* tf-next
|
|
183
|
+
*/
|
|
184
|
+
readonly deploymentName?: string;
|
|
185
|
+
/**
|
|
186
|
+
* Controls whether it should be possible to run multiple deployments in parallel (requires multiple_deployments_base_domain).
|
|
187
|
+
*/
|
|
188
|
+
readonly enableMultipleDeployments?: boolean;
|
|
189
|
+
/**
|
|
190
|
+
* Amount of memory in MB the worker Lambda Function for image optimization can use. Valid value between 128 MB to 10,240 MB, in 1 MB increments.
|
|
191
|
+
* 2,048
|
|
192
|
+
*/
|
|
193
|
+
readonly imageOptimizationLambdaMemorySize?: number;
|
|
194
|
+
/**
|
|
195
|
+
* Whether to deploy additional lambda JSON policies. If false, lambda_policy_json will not be attached to the lambda function. (Necessary since policy strings are only known after apply when using Terraforms data.aws_iam_policy_document)
|
|
196
|
+
*/
|
|
197
|
+
readonly lambdaAttachPolicyJson?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Set to true if the Lambda functions should be attached to a VPC. Use this setting if VPC resources should be accessed by the Lambda functions. When setting this to true, use vpc_security_group_ids and vpc_subnet_ids to specify the VPC networking. Note that attaching to a VPC would introduce a delay on to cold starts
|
|
200
|
+
*/
|
|
201
|
+
readonly lambdaAttachToVpc?: boolean;
|
|
202
|
+
/**
|
|
203
|
+
* Additional policy document as JSON to attach to the Lambda Function role
|
|
204
|
+
*/
|
|
205
|
+
readonly lambdaPolicyJson?: string;
|
|
206
|
+
/**
|
|
207
|
+
* ARN of IAM policy that scopes aws_iam_role access for the lambda
|
|
208
|
+
*/
|
|
209
|
+
readonly lambdaRolePermissionsBoundary?: string;
|
|
210
|
+
/**
|
|
211
|
+
* Default wildcard domain where new deployments should be available. Should be in the form of *.example.com.
|
|
212
|
+
*/
|
|
213
|
+
readonly multipleDeploymentsBaseDomain?: string;
|
|
214
|
+
/**
|
|
215
|
+
* Tag metadata to label AWS resources that support tags.
|
|
216
|
+
* The property type contains a map, they have special handling, please see {@link cdk.tf/module-map-inputs the docs}
|
|
217
|
+
*/
|
|
218
|
+
readonly tags?: { [key: string]: string };
|
|
219
|
+
/**
|
|
220
|
+
* Tag metadata to label AWS S3 buckets. Overrides tags with the same name in input variable tags.
|
|
221
|
+
* The property type contains a map, they have special handling, please see {@link cdk.tf/module-map-inputs the docs}
|
|
222
|
+
*/
|
|
223
|
+
readonly tagsS3Bucket?: { [key: string]: string };
|
|
224
|
+
/**
|
|
225
|
+
* The list of Security Group IDs to be used by the Lambda functions. lambda_attach_to_vpc should be set to true for these to be applied.
|
|
226
|
+
*
|
|
227
|
+
*/
|
|
228
|
+
readonly vpcSecurityGroupIds?: string[];
|
|
229
|
+
/**
|
|
230
|
+
* The list of VPC subnet IDs to attach the Lambda functions. lambda_attach_to_vpc should be set to true for these to be applied.
|
|
231
|
+
*
|
|
232
|
+
*/
|
|
233
|
+
readonly vpcSubnetIds?: string[];
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Defines an NextJs based on a Terraform module
|
|
237
|
+
*
|
|
238
|
+
* Docs at Terraform Registry: {@link https://registry.terraform.io/modules/milliHQ/next-js/aws/1.0.0-canary.5 milliHQ/next-js/aws}
|
|
239
|
+
*/
|
|
240
|
+
export class NextJs extends TerraformModule {
|
|
241
|
+
private readonly inputs: { [name: string]: any } = { }
|
|
242
|
+
public constructor(scope: Construct, id: string, config: NextJsConfig = {}) {
|
|
243
|
+
super(scope, id, {
|
|
244
|
+
...config,
|
|
245
|
+
source: 'milliHQ/next-js/aws',
|
|
246
|
+
version: '1.0.0-canary.5',
|
|
247
|
+
});
|
|
248
|
+
this.cloudfrontAcmCertificateArn = config.cloudfrontAcmCertificateArn;
|
|
249
|
+
this.cloudfrontAliases = config.cloudfrontAliases;
|
|
250
|
+
this.cloudfrontCacheKeyHeaders = config.cloudfrontCacheKeyHeaders;
|
|
251
|
+
this.cloudfrontCreateDistribution = config.cloudfrontCreateDistribution;
|
|
252
|
+
this.cloudfrontExternalArn = config.cloudfrontExternalArn;
|
|
253
|
+
this.cloudfrontExternalId = config.cloudfrontExternalId;
|
|
254
|
+
this.cloudfrontMinimumProtocolVersion = config.cloudfrontMinimumProtocolVersion;
|
|
255
|
+
this.cloudfrontOriginRequestPolicy = config.cloudfrontOriginRequestPolicy;
|
|
256
|
+
this.cloudfrontPriceClass = config.cloudfrontPriceClass;
|
|
257
|
+
this.cloudfrontResponseHeadersPolicy = config.cloudfrontResponseHeadersPolicy;
|
|
258
|
+
this.cloudfrontWebaclId = config.cloudfrontWebaclId;
|
|
259
|
+
this.createImageOptimization = config.createImageOptimization;
|
|
260
|
+
this.debugUseLocalPackages = config.debugUseLocalPackages;
|
|
261
|
+
this.deploymentName = config.deploymentName;
|
|
262
|
+
this.enableMultipleDeployments = config.enableMultipleDeployments;
|
|
263
|
+
this.imageOptimizationLambdaMemorySize = config.imageOptimizationLambdaMemorySize;
|
|
264
|
+
this.lambdaAttachPolicyJson = config.lambdaAttachPolicyJson;
|
|
265
|
+
this.lambdaAttachToVpc = config.lambdaAttachToVpc;
|
|
266
|
+
this.lambdaPolicyJson = config.lambdaPolicyJson;
|
|
267
|
+
this.lambdaRolePermissionsBoundary = config.lambdaRolePermissionsBoundary;
|
|
268
|
+
this.multipleDeploymentsBaseDomain = config.multipleDeploymentsBaseDomain;
|
|
269
|
+
this.tags = config.tags;
|
|
270
|
+
this.tagsS3Bucket = config.tagsS3Bucket;
|
|
271
|
+
this.vpcSecurityGroupIds = config.vpcSecurityGroupIds;
|
|
272
|
+
this.vpcSubnetIds = config.vpcSubnetIds;
|
|
273
|
+
}
|
|
274
|
+
public get cloudfrontAcmCertificateArn(): string | undefined {
|
|
275
|
+
return this.inputs['cloudfront_acm_certificate_arn'] as string | undefined;
|
|
276
|
+
}
|
|
277
|
+
public set cloudfrontAcmCertificateArn(value: string | undefined) {
|
|
278
|
+
this.inputs['cloudfront_acm_certificate_arn'] = value;
|
|
279
|
+
}
|
|
280
|
+
public get cloudfrontAliases(): string[] | undefined {
|
|
281
|
+
return this.inputs['cloudfront_aliases'] as string[] | undefined;
|
|
282
|
+
}
|
|
283
|
+
public set cloudfrontAliases(value: string[] | undefined) {
|
|
284
|
+
this.inputs['cloudfront_aliases'] = value;
|
|
285
|
+
}
|
|
286
|
+
public get cloudfrontCacheKeyHeaders(): string[] | undefined {
|
|
287
|
+
return this.inputs['cloudfront_cache_key_headers'] as string[] | undefined;
|
|
288
|
+
}
|
|
289
|
+
public set cloudfrontCacheKeyHeaders(value: string[] | undefined) {
|
|
290
|
+
this.inputs['cloudfront_cache_key_headers'] = value;
|
|
291
|
+
}
|
|
292
|
+
public get cloudfrontCreateDistribution(): boolean | undefined {
|
|
293
|
+
return this.inputs['cloudfront_create_distribution'] as boolean | undefined;
|
|
294
|
+
}
|
|
295
|
+
public set cloudfrontCreateDistribution(value: boolean | undefined) {
|
|
296
|
+
this.inputs['cloudfront_create_distribution'] = value;
|
|
297
|
+
}
|
|
298
|
+
public get cloudfrontExternalArn(): string | undefined {
|
|
299
|
+
return this.inputs['cloudfront_external_arn'] as string | undefined;
|
|
300
|
+
}
|
|
301
|
+
public set cloudfrontExternalArn(value: string | undefined) {
|
|
302
|
+
this.inputs['cloudfront_external_arn'] = value;
|
|
303
|
+
}
|
|
304
|
+
public get cloudfrontExternalId(): string | undefined {
|
|
305
|
+
return this.inputs['cloudfront_external_id'] as string | undefined;
|
|
306
|
+
}
|
|
307
|
+
public set cloudfrontExternalId(value: string | undefined) {
|
|
308
|
+
this.inputs['cloudfront_external_id'] = value;
|
|
309
|
+
}
|
|
310
|
+
public get cloudfrontMinimumProtocolVersion(): string | undefined {
|
|
311
|
+
return this.inputs['cloudfront_minimum_protocol_version'] as string | undefined;
|
|
312
|
+
}
|
|
313
|
+
public set cloudfrontMinimumProtocolVersion(value: string | undefined) {
|
|
314
|
+
this.inputs['cloudfront_minimum_protocol_version'] = value;
|
|
315
|
+
}
|
|
316
|
+
public get cloudfrontOriginRequestPolicy(): string | undefined {
|
|
317
|
+
return this.inputs['cloudfront_origin_request_policy'] as string | undefined;
|
|
318
|
+
}
|
|
319
|
+
public set cloudfrontOriginRequestPolicy(value: string | undefined) {
|
|
320
|
+
this.inputs['cloudfront_origin_request_policy'] = value;
|
|
321
|
+
}
|
|
322
|
+
public get cloudfrontPriceClass(): string | undefined {
|
|
323
|
+
return this.inputs['cloudfront_price_class'] as string | undefined;
|
|
324
|
+
}
|
|
325
|
+
public set cloudfrontPriceClass(value: string | undefined) {
|
|
326
|
+
this.inputs['cloudfront_price_class'] = value;
|
|
327
|
+
}
|
|
328
|
+
public get cloudfrontResponseHeadersPolicy(): string | undefined {
|
|
329
|
+
return this.inputs['cloudfront_response_headers_policy'] as string | undefined;
|
|
330
|
+
}
|
|
331
|
+
public set cloudfrontResponseHeadersPolicy(value: string | undefined) {
|
|
332
|
+
this.inputs['cloudfront_response_headers_policy'] = value;
|
|
333
|
+
}
|
|
334
|
+
public get cloudfrontWebaclId(): string | undefined {
|
|
335
|
+
return this.inputs['cloudfront_webacl_id'] as string | undefined;
|
|
336
|
+
}
|
|
337
|
+
public set cloudfrontWebaclId(value: string | undefined) {
|
|
338
|
+
this.inputs['cloudfront_webacl_id'] = value;
|
|
339
|
+
}
|
|
340
|
+
public get createImageOptimization(): boolean | undefined {
|
|
341
|
+
return this.inputs['create_image_optimization'] as boolean | undefined;
|
|
342
|
+
}
|
|
343
|
+
public set createImageOptimization(value: boolean | undefined) {
|
|
344
|
+
this.inputs['create_image_optimization'] = value;
|
|
345
|
+
}
|
|
346
|
+
public get debugUseLocalPackages(): boolean | undefined {
|
|
347
|
+
return this.inputs['debug_use_local_packages'] as boolean | undefined;
|
|
348
|
+
}
|
|
349
|
+
public set debugUseLocalPackages(value: boolean | undefined) {
|
|
350
|
+
this.inputs['debug_use_local_packages'] = value;
|
|
351
|
+
}
|
|
352
|
+
public get deploymentName(): string | undefined {
|
|
353
|
+
return this.inputs['deployment_name'] as string | undefined;
|
|
354
|
+
}
|
|
355
|
+
public set deploymentName(value: string | undefined) {
|
|
356
|
+
this.inputs['deployment_name'] = value;
|
|
357
|
+
}
|
|
358
|
+
public get enableMultipleDeployments(): boolean | undefined {
|
|
359
|
+
return this.inputs['enable_multiple_deployments'] as boolean | undefined;
|
|
360
|
+
}
|
|
361
|
+
public set enableMultipleDeployments(value: boolean | undefined) {
|
|
362
|
+
this.inputs['enable_multiple_deployments'] = value;
|
|
363
|
+
}
|
|
364
|
+
public get imageOptimizationLambdaMemorySize(): number | undefined {
|
|
365
|
+
return this.inputs['image_optimization_lambda_memory_size'] as number | undefined;
|
|
366
|
+
}
|
|
367
|
+
public set imageOptimizationLambdaMemorySize(value: number | undefined) {
|
|
368
|
+
this.inputs['image_optimization_lambda_memory_size'] = value;
|
|
369
|
+
}
|
|
370
|
+
public get lambdaAttachPolicyJson(): boolean | undefined {
|
|
371
|
+
return this.inputs['lambda_attach_policy_json'] as boolean | undefined;
|
|
372
|
+
}
|
|
373
|
+
public set lambdaAttachPolicyJson(value: boolean | undefined) {
|
|
374
|
+
this.inputs['lambda_attach_policy_json'] = value;
|
|
375
|
+
}
|
|
376
|
+
public get lambdaAttachToVpc(): boolean | undefined {
|
|
377
|
+
return this.inputs['lambda_attach_to_vpc'] as boolean | undefined;
|
|
378
|
+
}
|
|
379
|
+
public set lambdaAttachToVpc(value: boolean | undefined) {
|
|
380
|
+
this.inputs['lambda_attach_to_vpc'] = value;
|
|
381
|
+
}
|
|
382
|
+
public get lambdaPolicyJson(): string | undefined {
|
|
383
|
+
return this.inputs['lambda_policy_json'] as string | undefined;
|
|
384
|
+
}
|
|
385
|
+
public set lambdaPolicyJson(value: string | undefined) {
|
|
386
|
+
this.inputs['lambda_policy_json'] = value;
|
|
387
|
+
}
|
|
388
|
+
public get lambdaRolePermissionsBoundary(): string | undefined {
|
|
389
|
+
return this.inputs['lambda_role_permissions_boundary'] as string | undefined;
|
|
390
|
+
}
|
|
391
|
+
public set lambdaRolePermissionsBoundary(value: string | undefined) {
|
|
392
|
+
this.inputs['lambda_role_permissions_boundary'] = value;
|
|
393
|
+
}
|
|
394
|
+
public get multipleDeploymentsBaseDomain(): string | undefined {
|
|
395
|
+
return this.inputs['multiple_deployments_base_domain'] as string | undefined;
|
|
396
|
+
}
|
|
397
|
+
public set multipleDeploymentsBaseDomain(value: string | undefined) {
|
|
398
|
+
this.inputs['multiple_deployments_base_domain'] = value;
|
|
399
|
+
}
|
|
400
|
+
public get tags(): { [key: string]: string } | undefined {
|
|
401
|
+
return this.inputs['tags'] as { [key: string]: string } | undefined;
|
|
402
|
+
}
|
|
403
|
+
public set tags(value: { [key: string]: string } | undefined) {
|
|
404
|
+
this.inputs['tags'] = value;
|
|
405
|
+
}
|
|
406
|
+
public get tagsS3Bucket(): { [key: string]: string } | undefined {
|
|
407
|
+
return this.inputs['tags_s3_bucket'] as { [key: string]: string } | undefined;
|
|
408
|
+
}
|
|
409
|
+
public set tagsS3Bucket(value: { [key: string]: string } | undefined) {
|
|
410
|
+
this.inputs['tags_s3_bucket'] = value;
|
|
411
|
+
}
|
|
412
|
+
public get vpcSecurityGroupIds(): string[] | undefined {
|
|
413
|
+
return this.inputs['vpc_security_group_ids'] as string[] | undefined;
|
|
414
|
+
}
|
|
415
|
+
public set vpcSecurityGroupIds(value: string[] | undefined) {
|
|
416
|
+
this.inputs['vpc_security_group_ids'] = value;
|
|
417
|
+
}
|
|
418
|
+
public get vpcSubnetIds(): string[] | undefined {
|
|
419
|
+
return this.inputs['vpc_subnet_ids'] as string[] | undefined;
|
|
420
|
+
}
|
|
421
|
+
public set vpcSubnetIds(value: string[] | undefined) {
|
|
422
|
+
this.inputs['vpc_subnet_ids'] = value;
|
|
423
|
+
}
|
|
424
|
+
public get apiEndpointOutput() {
|
|
425
|
+
return this.getString('api_endpoint')
|
|
426
|
+
}
|
|
427
|
+
public get apiEndpointAccessPolicyArnOutput() {
|
|
428
|
+
return this.getString('api_endpoint_access_policy_arn')
|
|
429
|
+
}
|
|
430
|
+
public get cloudfrontCustomErrorResponseOutput() {
|
|
431
|
+
return this.getString('cloudfront_custom_error_response')
|
|
432
|
+
}
|
|
433
|
+
public get cloudfrontDefaultCacheBehaviorOutput() {
|
|
434
|
+
return this.getString('cloudfront_default_cache_behavior')
|
|
435
|
+
}
|
|
436
|
+
public get cloudfrontDefaultRootObjectOutput() {
|
|
437
|
+
return this.getString('cloudfront_default_root_object')
|
|
438
|
+
}
|
|
439
|
+
public get cloudfrontDomainNameOutput() {
|
|
440
|
+
return this.getString('cloudfront_domain_name')
|
|
441
|
+
}
|
|
442
|
+
public get cloudfrontHostedZoneIdOutput() {
|
|
443
|
+
return this.getString('cloudfront_hosted_zone_id')
|
|
444
|
+
}
|
|
445
|
+
public get cloudfrontOrderedCacheBehaviorsOutput() {
|
|
446
|
+
return this.getString('cloudfront_ordered_cache_behaviors')
|
|
447
|
+
}
|
|
448
|
+
public get cloudfrontOriginsOutput() {
|
|
449
|
+
return this.getString('cloudfront_origins')
|
|
450
|
+
}
|
|
451
|
+
public get uploadBucketIdOutput() {
|
|
452
|
+
return this.getString('upload_bucket_id')
|
|
453
|
+
}
|
|
454
|
+
protected synthesizeAttributes() {
|
|
455
|
+
return this.inputs;
|
|
456
|
+
}
|
|
457
|
+
protected synthesizeHclAttributes(): { [name: string]: any } {
|
|
458
|
+
return Object.fromEntries(
|
|
459
|
+
Object.entries(this.inputs)
|
|
460
|
+
.filter(([, val]) => val !== undefined)
|
|
461
|
+
.map(([key, val]) => {
|
|
462
|
+
return [
|
|
463
|
+
key,
|
|
464
|
+
{
|
|
465
|
+
value: val,
|
|
466
|
+
type: "any",
|
|
467
|
+
},
|
|
468
|
+
];
|
|
469
|
+
})
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
"
|
|
474
|
+
`);
|
|
475
|
+
}, 120000);
|
|
476
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLWdlbmVyYXRvci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2dldC9fX3Rlc3RzX18vZ2VuZXJhdG9yL21vZHVsZS1nZW5lcmF0b3IudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3Qiw0Q0FBcUU7QUFDckUsNkRBQXlEO0FBQ3pELGtDQUFzRDtBQUN0RCxpREFBeUM7QUFFekMsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsSUFBWSxFQUNaLEVBQXVCLEVBQ3ZCLE9BQWdCLEVBQ2hCLEVBQUU7SUFDRixNQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLElBQUksV0FBVyxDQUFDO0lBQzdFLE1BQU0sTUFBTSxHQUFHLElBQUEsd0JBQVEsRUFBQyxHQUFHLG1CQUFtQixnQkFBZ0IsQ0FBQyxDQUFDO0lBRWhFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztJQUVsRSxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxJQUFJ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LENBQ3hELENBQUM7SUFDRixNQUFNLFVBQVUsR0FBRyxJQUFJLG1DQUF5QixDQUM5QyxvQ0FBb0MsQ0FDckMsQ0FBQztJQUVGLE1BQU0sS0FBSyxHQUFHLElBQUksa0NBQWUsQ0FDL0I7UUFDRSxlQUFlLEVBQUUsT0FBTztRQUN4QixjQUFjLEVBQUUsa0JBQVEsQ0FBQyxVQUFVO0tBQ3BDLEVBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FDMUQsQ0FBQztJQUNGLE1BQU0sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFbkMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsRUFDcEQsT0FBTyxDQUNSLENBQUM7SUFFRixtRkFBbUY7SUFDbkYsOERBQThEO0lBQzlELDJEQUEyRDtJQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzV3BDLENBQUMsQ0FBQztBQUNMLENBQUMsRUFDRCxNQUFNLENBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTGFuZ3VhZ2UsIFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQgfSBmcm9tIFwiQGNka3RuL2NvbW1vbnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdHNNYWtlciB9IGZyb20gXCIuLi8uLi9jb25zdHJ1Y3RzLW1ha2VyXCI7XG5pbXBvcnQgeyBleHBlY3RNb2R1bGVUb01hdGNoU25hcHNob3QgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuXG5jb25zdCBvblRmMV82QW5kTmV3ZXIgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46ICgpID0+IFByb21pc2U8dm9pZD4sXG4gIHRpbWVvdXQ/OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgdGVycmFmb3JtQmluYXJ5TmFtZSA9IHByb2Nlc3MuZW52LlRFUlJBRk9STV9CSU5BUllfTkFNRSB8fCBcInRlcnJhZm9ybVwiO1xuICBjb25zdCBvdXRwdXQgPSBleGVjU3luYyhgJHt0ZXJyYWZvcm1CaW5hcnlOYW1lfSB2ZXJzaW9uIC1qc29uYCk7XG5cbiAgaWYgKCFvdXRwdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZGV0ZXJtaW5lIFRlcnJhZm9ybSB2ZXJzaW9uXCIpO1xuICB9XG5cbiAgY29uc3QgdGZWZXJzaW9uID0gSlNPTi5wYXJzZShvdXRwdXQudG9TdHJpbmcoKSkudGVycmFmb3JtX3ZlcnNpb247XG5cbiAgY29uc3QgW21ham9yLCBtaW5vcl0gPSB0ZlZlcnNpb24udG9TdHJpbmcoKS5zcGxpdChcIi5cIik7XG4gIGlmIChOdW1iZXIobWFqb3IpIDwgMSB8fCAoTnVtYmVyKG1ham9yKSA9PT0gMSAmJiBOdW1iZXIobWlub3IpIDwgNikpIHtcbiAgICB0ZXN0LnNraXAoXG4gICAgICBgJHtuYW1lfSAocmVxdWlyZXMgVGVycmFmb3JtID49IDEuNi4wOyBidXQgaXMgJHt0ZlZlcnNpb259KWAsXG4gICAgICBmbixcbiAgICAgIHRpbWVvdXQsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0ZXN0KG5hbWUsIGZuLCB0aW1lb3V0KTtcbiAgfVxufTtcblxudGVzdChcImdlbmVyYXRlIHNvbWUgbW9kdWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IHdvcmtkaXIgPSBmcy5ta2R0ZW1wU3luYyhcbiAgICBwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwibW9kdWxlLWdlbmVyYXRvci50ZXN0XCIpLFxuICApO1xuICBjb25zdCBjb25zdHJhaW50ID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoXG4gICAgXCJ0ZXJyYWZvcm0tYXdzLW1vZHVsZXMvZWtzL2F3c0A3LjAuMVwiLFxuICApO1xuXG4gIGNvbnN0IG1ha2VyID0gbmV3IENvbnN0cnVjdHNNYWtlcihcbiAgICB7XG4gICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICB0YXJnZXRMYW5ndWFnZTogTGFuZ3VhZ2UuVFlQRVNDUklQVCxcbiAgICB9LFxuICAgIHByb2Nlc3MuZW52LkNES1RGX0VYUEVSSU1FTlRBTF9QUk9WSURFUl9TQ0hFTUFfQ0FDSEVfUEFUSCxcbiAgKTtcbiAgYXdhaXQgbWFrZXIuZ2VuZXJhdGUoW2NvbnN0cmFpbnRdKTtcblxuICBjb25zdCBvdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKHdvcmtkaXIsIFwibW9kdWxlcy90ZXJyYWZvcm0tYXdzLW1vZHVsZXMvYXdzL2Vrcy50c1wiKSxcbiAgICBcInV0Zi04XCIsXG4gICk7XG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2hTbmFwc2hvdCgpO1xufSwgMTIwMDAwKTtcblxuZXhwZWN0TW9kdWxlVG9NYXRjaFNuYXBzaG90KFwibm8gbW9kdWxlIG91dHB1dHNcIiwgXCJnZW5lcmF0b3JcIiwgW1xuICBcIm1vZHVsZS1uby1vdXRwdXRzLnRlc3QuZml4dHVyZS50ZlwiLFxuXSk7XG5cbmV4cGVjdE1vZHVsZVRvTWF0Y2hTbmFwc2hvdChcInR5cGVsZXNzIHZhcmlhYmxlc1wiLCBcImdlbmVyYXRvclwiLCBbXG4gIFwibW9kdWxlLW5vLXZhcmlhYmxlLXR5cGUudGVzdC5maXh0dXJlLnRmXCIsXG5dKTtcblxuZXhwZWN0TW9kdWxlVG9NYXRjaFNuYXBzaG90KFwibm8gbmV3bGluZVwiLCBcImdlbmVyYXRvclwiLCBbXG4gIFwibW9kdWxlLW5vLW5ld2xpbmUtMS50ZXN0LmZpeHR1cmUudGZcIixcbiAgXCJtb2R1bGUtbm8tbmV3bGluZS0yLnRlc3QuZml4dHVyZS50ZlwiLFxuXSk7XG5cbnRlc3QoXCJnZW5lcmF0ZSBtdWx0aXBsZSBhd3MgbW9kdWxlc1wiLCBhc3luYyAoKSA9PiB7XG4gIGplc3Quc2V0VGltZW91dCgxMjAwMDApO1xuXG4gIGNvbnN0IHdvcmtkaXIgPSBmcy5ta2R0ZW1wU3luYyhcbiAgICBwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwibW9kdWxlLWdlbmVyYXRvci1hd3MudGVzdFwiKSxcbiAgKTtcbiAgY29uc3QgY29uc3RyYWludHMgPSBbXG4gICAgbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoXCJ0ZXJyYWZvcm0tYXdzLW1vZHVsZXMvdnBjL2F3c0AyLjc4LjBcIiksXG4gICAgbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoXCJ0ZXJyYWZvcm0tYXdzLW1vZHVsZXMvcmRzLWF1cm9yYS9hd3NANC4xLjBcIiksXG4gIF07XG5cbiAgY29uc3QgbWFrZXIgPSBuZXcgQ29uc3RydWN0c01ha2VyKFxuICAgIHtcbiAgICAgIGNvZGVNYWtlck91dHB1dDogd29ya2RpcixcbiAgICAgIHRhcmdldExhbmd1YWdlOiBMYW5ndWFnZS5UWVBFU0NSSVBULFxuICAgIH0sXG4gICAgcHJvY2Vzcy5lbnYuQ0RLVEZfRVhQRVJJTUVOVEFMX1BST1ZJREVSX1NDSEVNQV9DQUNIRV9QQVRILFxuICApO1xuICBhd2FpdCBtYWtlci5nZW5lcmF0ZShjb25zdHJhaW50cyk7XG5cbiAgY29uc3QgdnBjT3V0cHV0ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcIm1vZHVsZXMvdGVycmFmb3JtLWF3cy1tb2R1bGVzL2F3cy92cGMudHNcIiksXG4gICAgXCJ1dGYtOFwiLFxuICApO1xuICBleHBlY3QodnBjT3V0cHV0KS50b01hdGNoU25hcHNob3QoKTtcblxuICBjb25zdCByZHNPdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKHdvcmtkaXIsIFwibW9kdWxlcy90ZXJyYWZvcm0tYXdzLW1vZHVsZXMvYXdzL3Jkcy1hdXJvcmEudHNcIiksXG4gICAgXCJ1dGYtOFwiLFxuICApO1xuICBleHBlY3QocmRzT3V0cHV0KS50b01hdGNoU25hcHNob3QoKTtcbn0sIDEyMDAwMCk7XG5cbnRlc3QoXCJnZW5lcmF0ZSBuZXN0ZWQgbW9kdWxlXCIsIGFzeW5jICgpID0+IHtcbiAgY29uc3Qgd29ya2RpciA9IGZzLm1rZHRlbXBTeW5jKFxuICAgIHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJtb2R1bGUtZ2VuZXJhdG9yLW5lc3RlZC50ZXN0XCIpLFxuICApO1xuICBjb25zdCBjb25zdHJhaW50ID0gbmV3IFRlcnJhZm9ybU1vZHVsZUNvbnN0cmFpbnQoXG4gICAgXCJ0ZXJyYWZvcm0tYXdzLW1vZHVsZXMvdnBjL2F3cy8vbW9kdWxlcy92cGMtZW5kcG9pbnRzQDMuMTkuMFwiLFxuICApO1xuXG4gIGNvbnN0IG1ha2VyID0gbmV3IENvbnN0cnVjdHNNYWtlcihcbiAgICB7XG4gICAgICBjb2RlTWFrZXJPdXRwdXQ6IHdvcmtkaXIsXG4gICAgICB0YXJnZXRMYW5ndWFnZTogTGFuZ3VhZ2UuVFlQRVNDUklQVCxcbiAgICB9LFxuICAgIHByb2Nlc3MuZW52LkNES1RGX0VYUEVSSU1FTlRBTF9QUk9WSURFUl9TQ0hFTUFfQ0FDSEVfUEFUSCxcbiAgKTtcbiAgYXdhaXQgbWFrZXIuZ2VuZXJhdGUoW2NvbnN0cmFpbnRdKTtcblxuICBjb25zdCBvdXRwdXQgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKFxuICAgICAgd29ya2RpcixcbiAgICAgIFwibW9kdWxlcy90ZXJyYWZvcm0tYXdzLW1vZHVsZXMvYXdzL3ZwYy9tb2R1bGVzL3ZwYy1lbmRwb2ludHMudHNcIixcbiAgICApLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgZXhwZWN0KG91dHB1dCkudG9NYXRjaFNuYXBzaG90KCk7XG59LCAxMjAwMDApO1xuXG5leHBlY3RNb2R1bGVUb01hdGNoU25hcHNob3QoXCJnZXRYIHZhcmlhYmxlc1wiLCBcImdlbmVyYXRvclwiLCBbXG4gIFwibW9kdWxlLWdldC14LnRlc3QuZml4dHVyZS50ZlwiLFxuXSk7XG5cbmV4cGVjdE1vZHVsZVRvTWF0Y2hTbmFwc2hvdChcbiAgXCJoYW5kbGUgKi8qIGluIG1vZHVsZSB2YXJpYWJsZSBkZWZhdWx0IHN0cmluZ1wiLFxuICBcImdlbmVyYXRvclwiLFxuICBbXCJtb2R1bGUtd2l0aC1zdGFyLWRlZmF1bHQudGVzdC5maXh0dXJlLnRmXCJdLFxuKTtcblxub25UZjFfNkFuZE5ld2VyKFxuICBcImdlbmVyYXRlIG1vZHVsZSB0aGF0IGNhbid0IGJlIGluaXRpYWxpemVkXCIsXG4gIGFzeW5jICgpID0+IHtcbiAgICBqZXN0LnNldFRpbWVvdXQoMTIwMDAwKTtcblxuICAgIGNvbnN0IHdvcmtkaXIgPSBmcy5ta2R0ZW1wU3luYyhcbiAgICAgIHBhdGguam9pbihvcy50bXBkaXIoKSwgXCJtb2R1bGUtZ2VuZXJhdG9yLnRlc3Qtbm8taW5pdFwiKSxcbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cmFpbnQgPSBuZXcgVGVycmFmb3JtTW9kdWxlQ29uc3RyYWludChcbiAgICAgIFwibWlsbGlIUS9uZXh0LWpzL2F3c0AxLjAuMC1jYW5hcnkuNVwiLFxuICAgICk7XG5cbiAgICBjb25zdCBtYWtlciA9IG5ldyBDb25zdHJ1Y3RzTWFrZXIoXG4gICAgICB7XG4gICAgICAgIGNvZGVNYWtlck91dHB1dDogd29ya2RpcixcbiAgICAgICAgdGFyZ2V0TGFuZ3VhZ2U6IExhbmd1YWdlLlRZUEVTQ1JJUFQsXG4gICAgICB9LFxuICAgICAgcHJvY2Vzcy5lbnYuQ0RLVEZfRVhQRVJJTUVOVEFMX1BST1ZJREVSX1NDSEVNQV9DQUNIRV9QQVRILFxuICAgICk7XG4gICAgYXdhaXQgbWFrZXIuZ2VuZXJhdGUoW2NvbnN0cmFpbnRdKTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbih3b3JrZGlyLCBcIm1vZHVsZXMvbWlsbGlIUS9hd3MvbmV4dC1qcy50c1wiKSxcbiAgICAgIFwidXRmLThcIixcbiAgICApO1xuXG4gICAgLy8geWVzLCB0aGlzIGlzIGEgbG90IG9mIGNvZGUsIGJ1dCB0aGlzIHRlc3QgaXMgc2tpcHBlZCBmb3Igc29tZSBUZXJyYWZvcm0gdmVyc2lvbnNcbiAgICAvLyB3aGljaCB0aGVuIHNob3dzIHNuYXBzaG90cyBhcyBvYnNvbGV0ZSB3aGljaCBmYWlscyB0aGUgdGVzdFxuICAgIC8vIHRoaXMgd2F5LCB0aGVyZSdzIG5vIHN1Y2ggcHJvYmxlbSBpZiB0aGUgdGVzdCBpcyBza2lwcGVkXG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaElubGluZVNuYXBzaG90KGBcbiAgICAgIFwiLy8gZ2VuZXJhdGVkIGJ5IGNka3RuIGdldFxuICAgICAgLy8gbWlsbGlIUS9uZXh0LWpzL2F3c1xuICAgICAgaW1wb3J0IHsgVGVycmFmb3JtTW9kdWxlLCBUZXJyYWZvcm1Nb2R1bGVVc2VyQ29uZmlnIH0gZnJvbSAnY2RrdG4nO1xuICAgICAgaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG4gICAgICBleHBvcnQgaW50ZXJmYWNlIE5leHRKc0NvbmZpZyBleHRlbmRzIFRlcnJhZm9ybU1vZHVsZVVzZXJDb25maWcge1xuICAgICAgICAvKipcbiAgICAgICAgKiBBQ00gY2VydGlmaWNhdGUgYXJuIGZvciBjdXN0b21fZG9tYWluXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGNsb3VkZnJvbnRBY21DZXJ0aWZpY2F0ZUFybj86IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICogQWxpYXNlcyBmb3IgY3VzdG9tX2RvbWFpblxuICAgICAgICAqXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGNsb3VkZnJvbnRBbGlhc2VzPzogc3RyaW5nW107XG4gICAgICAgIC8qKlxuICAgICAgICAqIEhlYWRlciBrZXlzIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBjYWNoZSBrZXkgaW4gQ2xvdWRGcm9udC5cbiAgICAgICAgKiBBdXRob3JpemF0aW9uXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGNsb3VkZnJvbnRDYWNoZUtleUhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgICAgICAgLyoqXG4gICAgICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgbWFpbiBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiBzaG91bGQgYmUgY3JlYXRlZC5cbiAgICAgICAgKiB0cnVlXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGNsb3VkZnJvbnRDcmVhdGVEaXN0cmlidXRpb24/OiBib29sZWFuO1xuICAgICAgICAvKipcbiAgICAgICAgKiBXaGVuIHVzaW5nIGFuIGV4dGVybmFsIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHByb3ZpZGUgaXRzIGFybi5cbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgY2xvdWRmcm9udEV4dGVybmFsQXJuPzogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgKiBXaGVuIHVzaW5nIGFuIGV4dGVybmFsIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIHByb3ZpZGUgaXRzIGlkLlxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBjbG91ZGZyb250RXh0ZXJuYWxJZD86IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgU1NMIHByb3RvY29sIHRoYXQgeW91IHdhbnQgQ2xvdWRGcm9udCB0byB1c2UgZm9yIEhUVFBTIGNvbm5lY3Rpb25zLiBPbmUgb2YgU1NMdjMsIFRMU3YxLCBUTFN2MV8yMDE2LCBUTFN2MS4xXzIwMTYsIFRMU3YxLjJfMjAxOCBvciBUTFN2MS4yXzIwMTkuXG4gICAgICAgICogVExTdjFcbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgY2xvdWRmcm9udE1pbmltdW1Qcm90b2NvbFZlcnNpb24/OiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIElkIG9mIGEgY3VzdG9tIHJlcXVlc3QgcG9saWN5IHRoYXQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHBvbGljeSAoQWxsVmlld2VyKS4gQ2FuIGJlIGN1c3RvbSBvciBtYW5hZ2VkLlxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBjbG91ZGZyb250T3JpZ2luUmVxdWVzdFBvbGljeT86IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICogUHJpY2UgY2xhc3MgZm9yIHRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbnMgKG1haW4gJiBwcm94eSBjb25maWcpLiBPbmUgb2YgUHJpY2VDbGFzc19BbGwsIFByaWNlQ2xhc3NfMjAwLCBQcmljZUNsYXNzXzEwMC5cbiAgICAgICAgKiBQcmljZUNsYXNzXzEwMFxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBjbG91ZGZyb250UHJpY2VDbGFzcz86IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICogSWQgb2YgYSByZXNwb25zZSBoZWFkZXJzIHBvbGljeS4gQ2FuIGJlIGN1c3RvbSBvciBtYW5hZ2VkLiBEZWZhdWx0IGlzIGVtcHR5LlxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5Pzogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgKiBBbiBvcHRpb25hbCB3ZWJhY2wyIGFybiBvciB3ZWJhY2wgaWQgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGNsb3VkZnJvbnQgZGlzdHJpYnV0aW9uXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGNsb3VkZnJvbnRXZWJhY2xJZD86IHN0cmluZztcbiAgICAgICAgLyoqXG4gICAgICAgICogQ29udHJvbHMgd2hldGhlciByZXNvdXJjZXMgZm9yIGltYWdlIG9wdGltaXphdGlvbiBzdXBwb3J0IHNob3VsZCBiZSBjcmVhdGVkIG9yIG5vdC5cbiAgICAgICAgKiB0cnVlXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGNyZWF0ZUltYWdlT3B0aW1pemF0aW9uPzogYm9vbGVhbjtcbiAgICAgICAgLyoqXG4gICAgICAgICogVXNlIGxvY2FsbHkgYnVpbHQgcGFja2FnZXMgcmF0aGVyIHRoYW4gZG93bmxvYWQgdGhlbSBmcm9tIG5wbS5cbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgZGVidWdVc2VMb2NhbFBhY2thZ2VzPzogYm9vbGVhbjtcbiAgICAgICAgLyoqXG4gICAgICAgICogSWRlbnRpZmllciBmb3IgdGhlIGRlcGxveW1lbnQgZ3JvdXAgKG9ubHkgbG93ZXJjYXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCBoeXBoZW5zIGFyZSBhbGxvd2VkKS5cbiAgICAgICAgKiB0Zi1uZXh0XG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGRlcGxveW1lbnROYW1lPzogc3RyaW5nO1xuICAgICAgICAvKipcbiAgICAgICAgKiBDb250cm9scyB3aGV0aGVyIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBydW4gbXVsdGlwbGUgZGVwbG95bWVudHMgaW4gcGFyYWxsZWwgKHJlcXVpcmVzIG11bHRpcGxlX2RlcGxveW1lbnRzX2Jhc2VfZG9tYWluKS5cbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgZW5hYmxlTXVsdGlwbGVEZXBsb3ltZW50cz86IGJvb2xlYW47XG4gICAgICAgIC8qKlxuICAgICAgICAqIEFtb3VudCBvZiBtZW1vcnkgaW4gTUIgdGhlIHdvcmtlciBMYW1iZGEgRnVuY3Rpb24gZm9yIGltYWdlIG9wdGltaXphdGlvbiBjYW4gdXNlLiBWYWxpZCB2YWx1ZSBiZXR3ZWVuIDEyOCBNQiB0byAxMCwyNDAgTUIsIGluIDEgTUIgaW5jcmVtZW50cy5cbiAgICAgICAgKiAyLDA0OFxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSBpbWFnZU9wdGltaXphdGlvbkxhbWJkYU1lbW9yeVNpemU/OiBudW1iZXI7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFdoZXRoZXIgdG8gZGVwbG95IGFkZGl0aW9uYWwgbGFtYmRhIEpTT04gcG9saWNpZXMuIElmIGZhbHNlLCBsYW1iZGFfcG9saWN5X2pzb24gd2lsbCBub3QgYmUgYXR0YWNoZWQgdG8gdGhlIGxhbWJkYSBmdW5jdGlvbi4gKE5lY2Vzc2FyeSBzaW5jZSBwb2xpY3kgc3RyaW5ncyBhcmUgb25seSBrbm93biBhZnRlciBhcHBseSB3aGVuIHVzaW5nIFRlcnJhZm9ybXMgZGF0YS5hd3NfaWFtX3BvbGljeV9kb2N1bWVudClcbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgbGFtYmRhQXR0YWNoUG9saWN5SnNvbj86IGJvb2xlYW47XG4gICAgICAgIC8qKlxuICAgICAgICAqIFNldCB0byB0cnVlIGlmIHRoZSBMYW1iZGEgZnVuY3Rpb25zIHNob3VsZCBiZSBhdHRhY2hlZCB0byBhIFZQQy4gVXNlIHRoaXMgc2V0dGluZyBpZiBWUEMgcmVzb3VyY2VzIHNob3VsZCBiZSBhY2Nlc3NlZCBieSB0aGUgTGFtYmRhIGZ1bmN0aW9ucy4gV2hlbiBzZXR0aW5nIHRoaXMgdG8gdHJ1ZSwgdXNlIHZwY19zZWN1cml0eV9ncm91cF9pZHMgYW5kIHZwY19zdWJuZXRfaWRzIHRvIHNwZWNpZnkgdGhlIFZQQyBuZXR3b3JraW5nLiBOb3RlIHRoYXQgYXR0YWNoaW5nIHRvIGEgVlBDIHdvdWxkIGludHJvZHVjZSBhIGRlbGF5IG9uIHRvIGNvbGQgc3RhcnRzXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGxhbWJkYUF0dGFjaFRvVnBjPzogYm9vbGVhbjtcbiAgICAgICAgLyoqXG4gICAgICAgICogQWRkaXRpb25hbCBwb2xpY3kgZG9jdW1lbnQgYXMgSlNPTiB0byBhdHRhY2ggdG8gdGhlIExhbWJkYSBGdW5jdGlvbiByb2xlXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IGxhbWJkYVBvbGljeUpzb24/OiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIEFSTiBvZiBJQU0gcG9saWN5IHRoYXQgc2NvcGVzIGF3c19pYW1fcm9sZSBhY2Nlc3MgZm9yIHRoZSBsYW1iZGFcbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgbGFtYmRhUm9sZVBlcm1pc3Npb25zQm91bmRhcnk/OiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIERlZmF1bHQgd2lsZGNhcmQgZG9tYWluIHdoZXJlIG5ldyBkZXBsb3ltZW50cyBzaG91bGQgYmUgYXZhaWxhYmxlLiBTaG91bGQgYmUgaW4gdGhlIGZvcm0gb2YgKi5leGFtcGxlLmNvbS5cbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgbXVsdGlwbGVEZXBsb3ltZW50c0Jhc2VEb21haW4/OiBzdHJpbmc7XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRhZyBtZXRhZGF0YSB0byBsYWJlbCBBV1MgcmVzb3VyY2VzIHRoYXQgc3VwcG9ydCB0YWdzLlxuICAgICAgICAqIFRoZSBwcm9wZXJ0eSB0eXBlIGNvbnRhaW5zIGEgbWFwLCB0aGV5IGhhdmUgc3BlY2lhbCBoYW5kbGluZywgcGxlYXNlIHNlZSB7QGxpbmsgY2RrLnRmL21vZHVsZS1tYXAtaW5wdXRzIHRoZSBkb2NzfVxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGFnIG1ldGFkYXRhIHRvIGxhYmVsIEFXUyBTMyBidWNrZXRzLiBPdmVycmlkZXMgdGFncyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gaW5wdXQgdmFyaWFibGUgdGFncy5cbiAgICAgICAgKiBUaGUgcHJvcGVydHkgdHlwZSBjb250YWlucyBhIG1hcCwgdGhleSBoYXZlIHNwZWNpYWwgaGFuZGxpbmcsIHBsZWFzZSBzZWUge0BsaW5rIGNkay50Zi9tb2R1bGUtbWFwLWlucHV0cyB0aGUgZG9jc31cbiAgICAgICAgKi9cbiAgICAgICAgcmVhZG9ubHkgdGFnc1MzQnVja2V0PzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgICAgICAgLyoqXG4gICAgICAgICogVGhlIGxpc3Qgb2YgU2VjdXJpdHkgR3JvdXAgSURzIHRvIGJlIHVzZWQgYnkgdGhlIExhbWJkYSBmdW5jdGlvbnMuIGxhbWJkYV9hdHRhY2hfdG9fdnBjIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBmb3IgdGhlc2UgdG8gYmUgYXBwbGllZC5cbiAgICAgICAgKlxuICAgICAgICAqL1xuICAgICAgICByZWFkb25seSB2cGNTZWN1cml0eUdyb3VwSWRzPzogc3RyaW5nW107XG4gICAgICAgIC8qKlxuICAgICAgICAqIFRoZSBsaXN0IG9mIFZQQyBzdWJuZXQgSURzIHRvIGF0dGFjaCB0aGUgTGFtYmRhIGZ1bmN0aW9ucy4gbGFtYmRhX2F0dGFjaF90b192cGMgc2hvdWxkIGJlIHNldCB0byB0cnVlIGZvciB0aGVzZSB0byBiZSBhcHBsaWVkLlxuICAgICAgICAqXG4gICAgICAgICovXG4gICAgICAgIHJlYWRvbmx5IHZwY1N1Ym5ldElkcz86IHN0cmluZ1tdO1xuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAqIERlZmluZXMgYW4gTmV4dEpzIGJhc2VkIG9uIGEgVGVycmFmb3JtIG1vZHVsZVxuICAgICAgKlxuICAgICAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL21vZHVsZXMvbWlsbGlIUS9uZXh0LWpzL2F3cy8xLjAuMC1jYW5hcnkuNSBtaWxsaUhRL25leHQtanMvYXdzfVxuICAgICAgKi9cbiAgICAgIGV4cG9ydCBjbGFzcyBOZXh0SnMgZXh0ZW5kcyBUZXJyYWZvcm1Nb2R1bGUge1xuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0czogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gPSB7IH1cbiAgICAgICAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogTmV4dEpzQ29uZmlnID0ge30pIHtcbiAgICAgICAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgICAgIHNvdXJjZTogJ21pbGxpSFEvbmV4dC1qcy9hd3MnLFxuICAgICAgICAgICAgdmVyc2lvbjogJzEuMC4wLWNhbmFyeS41JyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRBY21DZXJ0aWZpY2F0ZUFybiA9IGNvbmZpZy5jbG91ZGZyb250QWNtQ2VydGlmaWNhdGVBcm47XG4gICAgICAgICAgdGhpcy5jbG91ZGZyb250QWxpYXNlcyA9IGNvbmZpZy5jbG91ZGZyb250QWxpYXNlcztcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRDYWNoZUtleUhlYWRlcnMgPSBjb25maWcuY2xvdWRmcm9udENhY2hlS2V5SGVhZGVycztcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRDcmVhdGVEaXN0cmlidXRpb24gPSBjb25maWcuY2xvdWRmcm9udENyZWF0ZURpc3RyaWJ1dGlvbjtcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRFeHRlcm5hbEFybiA9IGNvbmZpZy5jbG91ZGZyb250RXh0ZXJuYWxBcm47XG4gICAgICAgICAgdGhpcy5jbG91ZGZyb250RXh0ZXJuYWxJZCA9IGNvbmZpZy5jbG91ZGZyb250RXh0ZXJuYWxJZDtcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRNaW5pbXVtUHJvdG9jb2xWZXJzaW9uID0gY29uZmlnLmNsb3VkZnJvbnRNaW5pbXVtUHJvdG9jb2xWZXJzaW9uO1xuICAgICAgICAgIHRoaXMuY2xvdWRmcm9udE9yaWdpblJlcXVlc3RQb2xpY3kgPSBjb25maWcuY2xvdWRmcm9udE9yaWdpblJlcXVlc3RQb2xpY3k7XG4gICAgICAgICAgdGhpcy5jbG91ZGZyb250UHJpY2VDbGFzcyA9IGNvbmZpZy5jbG91ZGZyb250UHJpY2VDbGFzcztcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3kgPSBjb25maWcuY2xvdWRmcm9udFJlc3BvbnNlSGVhZGVyc1BvbGljeTtcbiAgICAgICAgICB0aGlzLmNsb3VkZnJvbnRXZWJhY2xJZCA9IGNvbmZpZy5jbG91ZGZyb250V2ViYWNsSWQ7XG4gICAgICAgICAgdGhpcy5jcmVhdGVJbWFnZU9wdGltaXphdGlvbiA9IGNvbmZpZy5jcmVhdGVJbWFnZU9wdGltaXphdGlvbjtcbiAgICAgICAgICB0aGlzLmRlYnVnVXNlTG9jYWxQYWNrYWdlcyA9IGNvbmZpZy5kZWJ1Z1VzZUxvY2FsUGFja2FnZXM7XG4gICAgICAgICAgdGhpcy5kZXBsb3ltZW50TmFtZSA9IGNvbmZpZy5kZXBsb3ltZW50TmFtZTtcbiAgICAgICAgICB0aGlzLmVuYWJsZU11bHRpcGxlRGVwbG95bWVudHMgPSBjb25maWcuZW5hYmxlTXVsdGlwbGVEZXBsb3ltZW50cztcbiAgICAgICAgICB0aGlzLmltYWdlT3B0aW1pemF0aW9uTGFtYmRhTWVtb3J5U2l6ZSA9IGNvbmZpZy5pbWFnZU9wdGltaXphdGlvbkxhbWJkYU1lbW9yeVNpemU7XG4gICAgICAgICAgdGhpcy5sYW1iZGFBdHRhY2hQb2xpY3lKc29uID0gY29uZmlnLmxhbWJkYUF0dGFjaFBvbGljeUpzb247XG4gICAgICAgICAgdGhpcy5sYW1iZGFBdHRhY2hUb1ZwYyA9IGNvbmZpZy5sYW1iZGFBdHRhY2hUb1ZwYztcbiAgICAgICAgICB0aGlzLmxhbWJkYVBvbGljeUpzb24gPSBjb25maWcubGFtYmRhUG9saWN5SnNvbjtcbiAgICAgICAgICB0aGlzLmxhbWJkYVJvbGVQZXJtaXNzaW9uc0JvdW5kYXJ5ID0gY29uZmlnLmxhbWJkYVJvbGVQZXJtaXNzaW9uc0JvdW5kYXJ5O1xuICAgICAgICAgIHRoaXMubXVsdGlwbGVEZXBsb3ltZW50c0Jhc2VEb21haW4gPSBjb25maWcubXVsdGlwbGVEZXBsb3ltZW50c0Jhc2VEb21haW47XG4gICAgICAgICAgdGhpcy50YWdzID0gY29uZmlnLnRhZ3M7XG4gICAgICAgICAgdGhpcy50YWdzUzNCdWNrZXQgPSBjb25maWcudGFnc1MzQnVja2V0O1xuICAgICAgICAgIHRoaXMudnBjU2VjdXJpdHlHcm91cElkcyA9IGNvbmZpZy52cGNTZWN1cml0eUdyb3VwSWRzO1xuICAgICAgICAgIHRoaXMudnBjU3VibmV0SWRzID0gY29uZmlnLnZwY1N1Ym5ldElkcztcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGNsb3VkZnJvbnRBY21DZXJ0aWZpY2F0ZUFybigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1snY2xvdWRmcm9udF9hY21fY2VydGlmaWNhdGVfYXJuJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgY2xvdWRmcm9udEFjbUNlcnRpZmljYXRlQXJuKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snY2xvdWRmcm9udF9hY21fY2VydGlmaWNhdGVfYXJuJ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGNsb3VkZnJvbnRBbGlhc2VzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfYWxpYXNlcyddIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgY2xvdWRmcm9udEFsaWFzZXModmFsdWU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfYWxpYXNlcyddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250Q2FjaGVLZXlIZWFkZXJzKCk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfY2FjaGVfa2V5X2hlYWRlcnMnXSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0IGNsb3VkZnJvbnRDYWNoZUtleUhlYWRlcnModmFsdWU6IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfY2FjaGVfa2V5X2hlYWRlcnMnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgY2xvdWRmcm9udENyZWF0ZURpc3RyaWJ1dGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfY3JlYXRlX2Rpc3RyaWJ1dGlvbiddIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBjbG91ZGZyb250Q3JlYXRlRGlzdHJpYnV0aW9uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfY3JlYXRlX2Rpc3RyaWJ1dGlvbiddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250RXh0ZXJuYWxBcm4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfZXh0ZXJuYWxfYXJuJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgY2xvdWRmcm9udEV4dGVybmFsQXJuKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snY2xvdWRmcm9udF9leHRlcm5hbF9hcm4nXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgY2xvdWRmcm9udEV4dGVybmFsSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfZXh0ZXJuYWxfaWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBjbG91ZGZyb250RXh0ZXJuYWxJZCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfZXh0ZXJuYWxfaWQnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgY2xvdWRmcm9udE1pbmltdW1Qcm90b2NvbFZlcnNpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfbWluaW11bV9wcm90b2NvbF92ZXJzaW9uJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgY2xvdWRmcm9udE1pbmltdW1Qcm90b2NvbFZlcnNpb24odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5wdXRzWydjbG91ZGZyb250X21pbmltdW1fcHJvdG9jb2xfdmVyc2lvbiddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250T3JpZ2luUmVxdWVzdFBvbGljeSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1snY2xvdWRmcm9udF9vcmlnaW5fcmVxdWVzdF9wb2xpY3knXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBjbG91ZGZyb250T3JpZ2luUmVxdWVzdFBvbGljeSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfb3JpZ2luX3JlcXVlc3RfcG9saWN5J10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGNsb3VkZnJvbnRQcmljZUNsYXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydjbG91ZGZyb250X3ByaWNlX2NsYXNzJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgY2xvdWRmcm9udFByaWNlQ2xhc3ModmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5wdXRzWydjbG91ZGZyb250X3ByaWNlX2NsYXNzJ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGNsb3VkZnJvbnRSZXNwb25zZUhlYWRlcnNQb2xpY3koKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfcmVzcG9uc2VfaGVhZGVyc19wb2xpY3knXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBjbG91ZGZyb250UmVzcG9uc2VIZWFkZXJzUG9saWN5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snY2xvdWRmcm9udF9yZXNwb25zZV9oZWFkZXJzX3BvbGljeSddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250V2ViYWNsSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2Nsb3VkZnJvbnRfd2ViYWNsX2lkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgY2xvdWRmcm9udFdlYmFjbElkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snY2xvdWRmcm9udF93ZWJhY2xfaWQnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgY3JlYXRlSW1hZ2VPcHRpbWl6YXRpb24oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydjcmVhdGVfaW1hZ2Vfb3B0aW1pemF0aW9uJ10gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0IGNyZWF0ZUltYWdlT3B0aW1pemF0aW9uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2NyZWF0ZV9pbWFnZV9vcHRpbWl6YXRpb24nXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgZGVidWdVc2VMb2NhbFBhY2thZ2VzKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1snZGVidWdfdXNlX2xvY2FsX3BhY2thZ2VzJ10gYXMgYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0IGRlYnVnVXNlTG9jYWxQYWNrYWdlcyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5wdXRzWydkZWJ1Z191c2VfbG9jYWxfcGFja2FnZXMnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgZGVwbG95bWVudE5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ2RlcGxveW1lbnRfbmFtZSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0IGRlcGxveW1lbnROYW1lKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snZGVwbG95bWVudF9uYW1lJ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGVuYWJsZU11bHRpcGxlRGVwbG95bWVudHMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydlbmFibGVfbXVsdGlwbGVfZGVwbG95bWVudHMnXSBhcyBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgZW5hYmxlTXVsdGlwbGVEZXBsb3ltZW50cyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5wdXRzWydlbmFibGVfbXVsdGlwbGVfZGVwbG95bWVudHMnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgaW1hZ2VPcHRpbWl6YXRpb25MYW1iZGFNZW1vcnlTaXplKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydpbWFnZV9vcHRpbWl6YXRpb25fbGFtYmRhX21lbW9yeV9zaXplJ10gYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgaW1hZ2VPcHRpbWl6YXRpb25MYW1iZGFNZW1vcnlTaXplKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snaW1hZ2Vfb3B0aW1pemF0aW9uX2xhbWJkYV9tZW1vcnlfc2l6ZSddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBsYW1iZGFBdHRhY2hQb2xpY3lKc29uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1snbGFtYmRhX2F0dGFjaF9wb2xpY3lfanNvbiddIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBsYW1iZGFBdHRhY2hQb2xpY3lKc29uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ2xhbWJkYV9hdHRhY2hfcG9saWN5X2pzb24nXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgbGFtYmRhQXR0YWNoVG9WcGMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydsYW1iZGFfYXR0YWNoX3RvX3ZwYyddIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBsYW1iZGFBdHRhY2hUb1ZwYyh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5wdXRzWydsYW1iZGFfYXR0YWNoX3RvX3ZwYyddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBsYW1iZGFQb2xpY3lKc29uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydsYW1iZGFfcG9saWN5X2pzb24nXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCBsYW1iZGFQb2xpY3lKc29uKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snbGFtYmRhX3BvbGljeV9qc29uJ10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGxhbWJkYVJvbGVQZXJtaXNzaW9uc0JvdW5kYXJ5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRzWydsYW1iZGFfcm9sZV9wZXJtaXNzaW9uc19ib3VuZGFyeSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0IGxhbWJkYVJvbGVQZXJtaXNzaW9uc0JvdW5kYXJ5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1snbGFtYmRhX3JvbGVfcGVybWlzc2lvbnNfYm91bmRhcnknXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgbXVsdGlwbGVEZXBsb3ltZW50c0Jhc2VEb21haW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHNbJ211bHRpcGxlX2RlcGxveW1lbnRzX2Jhc2VfZG9tYWluJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgbXVsdGlwbGVEZXBsb3ltZW50c0Jhc2VEb21haW4odmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuaW5wdXRzWydtdWx0aXBsZV9kZXBsb3ltZW50c19iYXNlX2RvbWFpbiddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCB0YWdzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1sndGFncyddIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIHNldCB0YWdzKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ3RhZ3MnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgdGFnc1MzQnVja2V0KCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1sndGFnc19zM19idWNrZXQnXSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgdGFnc1MzQnVja2V0KHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dHNbJ3RhZ3NfczNfYnVja2V0J10gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IHZwY1NlY3VyaXR5R3JvdXBJZHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1sndnBjX3NlY3VyaXR5X2dyb3VwX2lkcyddIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBzZXQgdnBjU2VjdXJpdHlHcm91cElkcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1sndnBjX3NlY3VyaXR5X2dyb3VwX2lkcyddID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCB2cGNTdWJuZXRJZHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlucHV0c1sndnBjX3N1Ym5ldF9pZHMnXSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgc2V0IHZwY1N1Ym5ldElkcyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLmlucHV0c1sndnBjX3N1Ym5ldF9pZHMnXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgYXBpRW5kcG9pbnRPdXRwdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCdhcGlfZW5kcG9pbnQnKVxuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgYXBpRW5kcG9pbnRBY2Nlc3NQb2xpY3lBcm5PdXRwdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCdhcGlfZW5kcG9pbnRfYWNjZXNzX3BvbGljeV9hcm4nKVxuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgY2xvdWRmcm9udEN1c3RvbUVycm9yUmVzcG9uc2VPdXRwdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCdjbG91ZGZyb250X2N1c3RvbV9lcnJvcl9yZXNwb25zZScpXG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250RGVmYXVsdENhY2hlQmVoYXZpb3JPdXRwdXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nKCdjbG91ZGZyb250X2RlZmF1bHRfY2FjaGVfYmVoYXZpb3InKVxuICAgICAgICB9XG4gICAgICAgIHB1YmxpYyBnZXQgY2xvdWRmcm9udERlZmF1bHRSb290T2JqZWN0T3V0cHV0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygnY2xvdWRmcm9udF9kZWZhdWx0X3Jvb3Rfb2JqZWN0JylcbiAgICAgICAgfVxuICAgICAgICBwdWJsaWMgZ2V0IGNsb3VkZnJvbnREb21haW5OYW1lT3V0cHV0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygnY2xvdWRmcm9udF9kb21haW5fbmFtZScpXG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250SG9zdGVkWm9uZUlkT3V0cHV0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygnY2xvdWRmcm9udF9ob3N0ZWRfem9uZV9pZCcpXG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250T3JkZXJlZENhY2hlQmVoYXZpb3JzT3V0cHV0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZygnY2xvdWRmcm9udF9vcmRlcmVkX2NhY2hlX2JlaGF2aW9ycycpXG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCBjbG91ZGZyb250T3JpZ2luc091dHB1dCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoJ2Nsb3VkZnJvbnRfb3JpZ2lucycpXG4gICAgICAgIH1cbiAgICAgICAgcHVibGljIGdldCB1cGxvYWRCdWNrZXRJZE91dHB1dCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmcoJ3VwbG9hZF9idWNrZXRfaWQnKVxuICAgICAgICB9XG4gICAgICAgIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5pbnB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgcHJvdGVjdGVkIHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKCk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5pbnB1dHMpXG4gICAgICAgICAgICAgIC5maWx0ZXIoKFssIHZhbF0pID0+IHZhbCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhbnlcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcIlxuICAgIGApO1xuICB9LFxuICAxMjAwMDAsXG4pO1xuIl19
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
// Copyright (c) HashiCorp, Inc
|
|
27
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
28
|
+
const fs = __importStar(require("fs"));
|
|
29
|
+
const os = __importStar(require("os"));
|
|
30
|
+
const path = __importStar(require("path"));
|
|
31
|
+
const codemaker_1 = require("codemaker");
|
|
32
|
+
const provider_generator_1 = require("../../generator/provider-generator");
|
|
33
|
+
test("generate a resource with nested types", async () => {
|
|
34
|
+
const code = new codemaker_1.CodeMaker();
|
|
35
|
+
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "nested-types.test"));
|
|
36
|
+
const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "nested-types.test.fixture.json"), "utf-8"));
|
|
37
|
+
new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll();
|
|
38
|
+
await code.save(workdir);
|
|
39
|
+
const output = fs.readFileSync(path.join(workdir, "providers/test/nested-types-resource/index.ts"), "utf-8");
|
|
40
|
+
expect(output).toMatchSnapshot();
|
|
41
|
+
});
|
|
42
|
+
test("generate a resource with nested type and no attributes", async () => {
|
|
43
|
+
const code = new codemaker_1.CodeMaker();
|
|
44
|
+
const workdir = fs.mkdtempSync(path.join(os.tmpdir(), "nested-type-without-attributes.test"));
|
|
45
|
+
const spec = JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", "nested-type-without-attributes.test.fixture.json"), "utf-8"));
|
|
46
|
+
new provider_generator_1.TerraformProviderGenerator(code, spec).generateAll();
|
|
47
|
+
await code.save(workdir);
|
|
48
|
+
const output = fs.readFileSync(path.join(workdir, "providers/test/nested-type-without-attributes-resource/index.ts"), "utf-8");
|
|
49
|
+
expect(output).toMatchSnapshot();
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGVkLXR5cGVzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2V0L19fdGVzdHNfXy9nZW5lcmF0b3IvbmVzdGVkLXR5cGVzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsdUNBQXlCO0FBQ3pCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IseUNBQXNDO0FBQ3RDLDJFQUFnRjtBQUVoRixJQUFJLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7SUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDckIsRUFBRSxDQUFDLFlBQVksQ0FDYixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsZ0NBQWdDLENBQUMsRUFDbEUsT0FBTyxDQUNSLENBQ0YsQ0FBQztJQUNGLElBQUksK0NBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSwrQ0FBK0MsQ0FBQyxFQUNuRSxPQUFPLENBQ1IsQ0FBQztJQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUNuQyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyx3REFBd0QsRUFBRSxLQUFLLElBQUksRUFBRTtJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLHFCQUFTLEVBQUUsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsV0FBVyxDQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxxQ0FBcUMsQ0FBQyxDQUM5RCxDQUFDO0lBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDckIsRUFBRSxDQUFDLFlBQVksQ0FDYixJQUFJLENBQUMsSUFBSSxDQUNQLFNBQVMsRUFDVCxVQUFVLEVBQ1Ysa0RBQWtELENBQ25ELEVBQ0QsT0FBTyxDQUNSLENBQ0YsQ0FBQztJQUNGLElBQUksK0NBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3pELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6QixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUM1QixJQUFJLENBQUMsSUFBSSxDQUNQLE9BQU8sRUFDUCxpRUFBaUUsQ0FDbEUsRUFDRCxPQUFPLENBQ1IsQ0FBQztJQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztBQUNuQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29kZU1ha2VyIH0gZnJvbSBcImNvZGVtYWtlclwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IgfSBmcm9tIFwiLi4vLi4vZ2VuZXJhdG9yL3Byb3ZpZGVyLWdlbmVyYXRvclwiO1xuXG50ZXN0KFwiZ2VuZXJhdGUgYSByZXNvdXJjZSB3aXRoIG5lc3RlZCB0eXBlc1wiLCBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IGNvZGUgPSBuZXcgQ29kZU1ha2VyKCk7XG4gIGNvbnN0IHdvcmtkaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksIFwibmVzdGVkLXR5cGVzLnRlc3RcIikpO1xuICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcImZpeHR1cmVzXCIsIFwibmVzdGVkLXR5cGVzLnRlc3QuZml4dHVyZS5qc29uXCIpLFxuICAgICAgXCJ1dGYtOFwiLFxuICAgICksXG4gICk7XG4gIG5ldyBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvcihjb2RlLCBzcGVjKS5nZW5lcmF0ZUFsbCgpO1xuICBhd2FpdCBjb2RlLnNhdmUod29ya2Rpcik7XG5cbiAgY29uc3Qgb3V0cHV0ID0gZnMucmVhZEZpbGVTeW5jKFxuICAgIHBhdGguam9pbih3b3JrZGlyLCBcInByb3ZpZGVycy90ZXN0L25lc3RlZC10eXBlcy1yZXNvdXJjZS9pbmRleC50c1wiKSxcbiAgICBcInV0Zi04XCIsXG4gICk7XG4gIGV4cGVjdChvdXRwdXQpLnRvTWF0Y2hTbmFwc2hvdCgpO1xufSk7XG5cbnRlc3QoXCJnZW5lcmF0ZSBhIHJlc291cmNlIHdpdGggbmVzdGVkIHR5cGUgYW5kIG5vIGF0dHJpYnV0ZXNcIiwgYXN5bmMgKCkgPT4ge1xuICBjb25zdCBjb2RlID0gbmV3IENvZGVNYWtlcigpO1xuICBjb25zdCB3b3JrZGlyID0gZnMubWtkdGVtcFN5bmMoXG4gICAgcGF0aC5qb2luKG9zLnRtcGRpcigpLCBcIm5lc3RlZC10eXBlLXdpdGhvdXQtYXR0cmlidXRlcy50ZXN0XCIpLFxuICApO1xuICBjb25zdCBzcGVjID0gSlNPTi5wYXJzZShcbiAgICBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgXCJmaXh0dXJlc1wiLFxuICAgICAgICBcIm5lc3RlZC10eXBlLXdpdGhvdXQtYXR0cmlidXRlcy50ZXN0LmZpeHR1cmUuanNvblwiLFxuICAgICAgKSxcbiAgICAgIFwidXRmLThcIixcbiAgICApLFxuICApO1xuICBuZXcgVGVycmFmb3JtUHJvdmlkZXJHZW5lcmF0b3IoY29kZSwgc3BlYykuZ2VuZXJhdGVBbGwoKTtcbiAgYXdhaXQgY29kZS5zYXZlKHdvcmtkaXIpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICBwYXRoLmpvaW4oXG4gICAgICB3b3JrZGlyLFxuICAgICAgXCJwcm92aWRlcnMvdGVzdC9uZXN0ZWQtdHlwZS13aXRob3V0LWF0dHJpYnV0ZXMtcmVzb3VyY2UvaW5kZXgudHNcIixcbiAgICApLFxuICAgIFwidXRmLThcIixcbiAgKTtcbiAgZXhwZWN0KG91dHB1dCkudG9NYXRjaFNuYXBzaG90KCk7XG59KTtcbiJdfQ==
|