cdklabs-projen-project-types 0.2.15 → 0.2.17
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 +10 -297
- package/API.md +0 -396
- package/lib/cdk.js +2 -2
- package/lib/cdklabs.js +3 -3
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -2
- package/lib/jsii.js +1 -1
- package/lib/rosetta.js +1 -1
- package/lib/yarn/monorepo-release.js +1 -1
- package/lib/yarn/monorepo.js +2 -2
- package/lib/yarn/typescript-workspace-release.js +1 -1
- package/lib/yarn/typescript-workspace.js +4 -2
- package/package.json +7 -7
- package/lib/cdk-cli-integ-tests.d.ts +0 -102
- package/lib/cdk-cli-integ-tests.js +0 -362
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.CdkCliIntegTestsWorkflow = void 0;
|
|
5
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
-
const projen_1 = require("projen");
|
|
7
|
-
const NOT_FLAGGED_EXPR = "!contains(github.event.pull_request.labels.*.name, 'pr/exempt-integ-test')";
|
|
8
|
-
/**
|
|
9
|
-
* Add a workflow for running the tests
|
|
10
|
-
*
|
|
11
|
-
* This MUST be a separate workflow that runs in privileged context. We have a couple
|
|
12
|
-
* of options:
|
|
13
|
-
*
|
|
14
|
-
* - `workflow_run`: we can trigger a privileged workflow run after the unprivileged
|
|
15
|
-
* `pull_request` workflow finishes and reuse its output artifacts. The
|
|
16
|
-
* problem is that the second run is disconnected from the PR so we would need
|
|
17
|
-
* to script in visibility for approvals and success (by posting comments, for
|
|
18
|
-
* example)
|
|
19
|
-
* - Use only a `pull_request_target` workflow on the PR: this either would run
|
|
20
|
-
* a privileged workflow on any user code submission (might be fine given the
|
|
21
|
-
* workflow's `permissions`, but I'm sure this will make our security team uneasy
|
|
22
|
-
* anyway), OR this would mean any build needs human confirmation which means slow
|
|
23
|
-
* feedback.
|
|
24
|
-
* - Use a `pull_request` for a regular fast-feedback build, and a separate
|
|
25
|
-
* `pull_request_target` for the integ tests. This means we're building twice.
|
|
26
|
-
*
|
|
27
|
-
* Ultimately, our build isn't heavy enough to put in a lot of effort deduping
|
|
28
|
-
* it, so we'll go with the simplest solution which is the last one: 2
|
|
29
|
-
* independent workflows.
|
|
30
|
-
*
|
|
31
|
-
* projen doesn't make it easy to copy the relevant parts of the 'build' workflow,
|
|
32
|
-
* so they're unfortunately duplicated here.
|
|
33
|
-
*/
|
|
34
|
-
class CdkCliIntegTestsWorkflow extends projen_1.Component {
|
|
35
|
-
constructor(repo, props) {
|
|
36
|
-
super(repo);
|
|
37
|
-
const buildWorkflow = repo.buildWorkflow;
|
|
38
|
-
const runTestsWorkflow = repo.github?.addWorkflow('integ');
|
|
39
|
-
if (!buildWorkflow || !runTestsWorkflow) {
|
|
40
|
-
throw new Error('Expected build and run tests workflow');
|
|
41
|
-
}
|
|
42
|
-
buildWorkflow.workflow;
|
|
43
|
-
props.allowUpstreamVersions?.forEach((pack) => {
|
|
44
|
-
if (!props.localPackages.includes(pack)) {
|
|
45
|
-
throw new Error(`Package in allowUpstreamVersions but not in localPackages: ${pack}`);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
let maxWorkersArg = '';
|
|
49
|
-
if (props.maxWorkers) {
|
|
50
|
-
maxWorkersArg = ` --maxWorkers=${props.maxWorkers}`;
|
|
51
|
-
}
|
|
52
|
-
runTestsWorkflow.on({
|
|
53
|
-
pullRequestTarget: {
|
|
54
|
-
branches: ['main'],
|
|
55
|
-
},
|
|
56
|
-
// Needs to trigger and report success on merge queue builds as well
|
|
57
|
-
mergeGroup: {},
|
|
58
|
-
// Never hurts to be able to run this manually
|
|
59
|
-
workflowDispatch: {},
|
|
60
|
-
});
|
|
61
|
-
// The 'build' part runs on the 'integ-approval' environment, which requires
|
|
62
|
-
// approval. The actual runs access the real environment, not requiring approval
|
|
63
|
-
// anymore.
|
|
64
|
-
//
|
|
65
|
-
// This is for 2 reasons:
|
|
66
|
-
// - The build job is the first one that runs. That means you get asked approval
|
|
67
|
-
// immediately after push, instead of 5 minutes later after the build completes.
|
|
68
|
-
// - The build job is only one job, versus the tests which are a matrix build.
|
|
69
|
-
// If the matrix test job needs approval, the Pull Request timeline gets spammed
|
|
70
|
-
// with an approval request for every individual run.
|
|
71
|
-
const JOB_PREPARE = 'prepare';
|
|
72
|
-
runTestsWorkflow.addJob(JOB_PREPARE, {
|
|
73
|
-
environment: props.approvalEnvironment,
|
|
74
|
-
runsOn: [props.buildRunsOn],
|
|
75
|
-
permissions: {
|
|
76
|
-
contents: projen_1.github.workflows.JobPermission.READ,
|
|
77
|
-
},
|
|
78
|
-
env: {
|
|
79
|
-
CI: 'true',
|
|
80
|
-
},
|
|
81
|
-
// Don't run again on the merge queue, we already got confirmation that it works and the
|
|
82
|
-
// tests are quite expensive.
|
|
83
|
-
if: `github.event_name != 'merge_group' && ${NOT_FLAGGED_EXPR}`,
|
|
84
|
-
steps: [
|
|
85
|
-
{
|
|
86
|
-
name: 'Checkout',
|
|
87
|
-
uses: 'actions/checkout@v4',
|
|
88
|
-
with: {
|
|
89
|
-
// IMPORTANT! This must be `head.sha` not `head.ref`, otherwise we
|
|
90
|
-
// are vulnerable to a TOCTOU attack.
|
|
91
|
-
ref: '${{ github.event.pull_request.head.sha }}',
|
|
92
|
-
repository: '${{ github.event.pull_request.head.repo.full_name }}',
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
// We used to fetch tags from the repo using 'checkout', but if it's a fork
|
|
96
|
-
// the tags won't be there, so we have to fetch them from upstream.
|
|
97
|
-
//
|
|
98
|
-
// The tags are necessary to realistically bump versions
|
|
99
|
-
{
|
|
100
|
-
name: 'Fetch tags from origin repo',
|
|
101
|
-
run: [
|
|
102
|
-
// Can be either aws/aws-cdk-cli or aws/aws-cdk-cli-testing
|
|
103
|
-
// (Must clone over HTTPS because we have no SSH auth set up)
|
|
104
|
-
`git remote add upstream https://github.com/${props.sourceRepo}.git`,
|
|
105
|
-
'git fetch upstream \'refs/tags/*:refs/tags/*\'',
|
|
106
|
-
].join('\n'),
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
name: 'Setup Node.js',
|
|
110
|
-
uses: 'actions/setup-node@v4',
|
|
111
|
-
with: {
|
|
112
|
-
'node-version': 'lts/*',
|
|
113
|
-
},
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
name: 'Install dependencies',
|
|
117
|
-
run: 'yarn install --check-files',
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
name: 'Bump to realistic versions',
|
|
121
|
-
run: 'yarn workspaces run bump',
|
|
122
|
-
env: {
|
|
123
|
-
TESTING_CANDIDATE: 'true',
|
|
124
|
-
},
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
name: 'build',
|
|
128
|
-
run: 'npx projen build',
|
|
129
|
-
env: {
|
|
130
|
-
// This is necessary to prevent projen from resetting the version numbers to
|
|
131
|
-
// 0.0.0 during its synthesis.
|
|
132
|
-
RELEASE: 'true',
|
|
133
|
-
},
|
|
134
|
-
},
|
|
135
|
-
{
|
|
136
|
-
name: 'Upload artifact',
|
|
137
|
-
uses: 'actions/upload-artifact@v4.4.0',
|
|
138
|
-
with: {
|
|
139
|
-
name: 'build-artifact',
|
|
140
|
-
path: 'packages/**/dist/js/*.tgz',
|
|
141
|
-
overwrite: 'true',
|
|
142
|
-
},
|
|
143
|
-
},
|
|
144
|
-
],
|
|
145
|
-
});
|
|
146
|
-
const verdaccioConfig = {
|
|
147
|
-
storage: './storage',
|
|
148
|
-
auth: { htpasswd: { file: './htpasswd' } },
|
|
149
|
-
uplinks: { npmjs: { url: 'https://registry.npmjs.org/' } },
|
|
150
|
-
packages: {},
|
|
151
|
-
};
|
|
152
|
-
for (const pack of props.localPackages) {
|
|
153
|
-
const allowUpstream = props.allowUpstreamVersions?.includes(pack);
|
|
154
|
-
verdaccioConfig.packages[pack] = {
|
|
155
|
-
access: '$all',
|
|
156
|
-
publish: '$all',
|
|
157
|
-
proxy: allowUpstream ? 'npmjs' : 'none',
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
;
|
|
161
|
-
verdaccioConfig.packages['**'] = {
|
|
162
|
-
access: '$all',
|
|
163
|
-
proxy: 'npmjs',
|
|
164
|
-
};
|
|
165
|
-
// bash only expands {...} if there's a , in there, otherwise it will leave the
|
|
166
|
-
// braces in literally. So we need to do case analysis here. Thanks, I hate it.
|
|
167
|
-
const tarballBashExpr = props.localPackages.length === 1
|
|
168
|
-
? `packages/${props.localPackages[0]}/dist/js/*.tgz`
|
|
169
|
-
: `packages/{${props.localPackages.join(',')}}/dist/js/*.tgz`;
|
|
170
|
-
// We create a matrix job for the test.
|
|
171
|
-
// This job will run all the different test suites in parallel.
|
|
172
|
-
const JOB_INTEG_MATRIX = 'integ_matrix';
|
|
173
|
-
runTestsWorkflow.addJob(JOB_INTEG_MATRIX, {
|
|
174
|
-
environment: props.testEnvironment,
|
|
175
|
-
runsOn: [props.testRunsOn],
|
|
176
|
-
needs: [JOB_PREPARE],
|
|
177
|
-
permissions: {
|
|
178
|
-
contents: projen_1.github.workflows.JobPermission.READ,
|
|
179
|
-
idToken: projen_1.github.workflows.JobPermission.WRITE,
|
|
180
|
-
},
|
|
181
|
-
env: {
|
|
182
|
-
// Otherwise Maven is too noisy
|
|
183
|
-
MAVEN_ARGS: '--no-transfer-progress',
|
|
184
|
-
// This is not actually a canary, but this prevents the tests from making
|
|
185
|
-
// assumptions about the availability of source packages.
|
|
186
|
-
IS_CANARY: 'true',
|
|
187
|
-
CI: 'true',
|
|
188
|
-
// This is necessary because the new versioning of @aws-cdk/cli-lib-alpha
|
|
189
|
-
// matches the CLI and not the framework.
|
|
190
|
-
CLI_LIB_VERSION_MIRRORS_CLI: 'true',
|
|
191
|
-
},
|
|
192
|
-
// Don't run again on the merge queue, we already got confirmation that it works and the
|
|
193
|
-
// tests are quite expensive.
|
|
194
|
-
if: `github.event_name != 'merge_group' && ${NOT_FLAGGED_EXPR}`,
|
|
195
|
-
strategy: {
|
|
196
|
-
failFast: false,
|
|
197
|
-
matrix: {
|
|
198
|
-
domain: {
|
|
199
|
-
suite: [
|
|
200
|
-
'cli-integ-tests',
|
|
201
|
-
'init-csharp',
|
|
202
|
-
'init-fsharp',
|
|
203
|
-
'init-go',
|
|
204
|
-
'init-java',
|
|
205
|
-
'init-javascript',
|
|
206
|
-
'init-python',
|
|
207
|
-
'init-typescript-app',
|
|
208
|
-
'init-typescript-lib',
|
|
209
|
-
'tool-integrations',
|
|
210
|
-
],
|
|
211
|
-
},
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
steps: [
|
|
215
|
-
{
|
|
216
|
-
name: 'Download build artifacts',
|
|
217
|
-
uses: 'actions/download-artifact@v4',
|
|
218
|
-
with: {
|
|
219
|
-
name: 'build-artifact',
|
|
220
|
-
path: 'packages',
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
name: 'Set up JDK 18',
|
|
225
|
-
if: 'matrix.suite == \'init-java\' || matrix.suite == \'cli-integ-tests\'',
|
|
226
|
-
uses: 'actions/setup-java@v4',
|
|
227
|
-
with: {
|
|
228
|
-
'java-version': '18',
|
|
229
|
-
'distribution': 'corretto',
|
|
230
|
-
},
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
name: 'Authenticate Via OIDC Role',
|
|
234
|
-
id: 'creds',
|
|
235
|
-
uses: 'aws-actions/configure-aws-credentials@v4',
|
|
236
|
-
with: {
|
|
237
|
-
'aws-region': 'us-east-1',
|
|
238
|
-
'role-duration-seconds': props.enableAtmosphere ? 60 * 60 : 4 * 60 * 60,
|
|
239
|
-
// Expect this in Environment Variables
|
|
240
|
-
'role-to-assume': props.enableAtmosphere ? props.enableAtmosphere.oidcRoleArn : '${{ vars.AWS_ROLE_TO_ASSUME_FOR_TESTING }}',
|
|
241
|
-
'role-session-name': 'run-tests@aws-cdk-cli-integ',
|
|
242
|
-
'output-credentials': true,
|
|
243
|
-
},
|
|
244
|
-
},
|
|
245
|
-
// This is necessary for the init tests to succeed, they set up a git repo.
|
|
246
|
-
{
|
|
247
|
-
name: 'Set git identity',
|
|
248
|
-
run: [
|
|
249
|
-
'git config --global user.name "aws-cdk-cli-integ"',
|
|
250
|
-
'git config --global user.email "noreply@example.com"',
|
|
251
|
-
].join('\n'),
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
name: 'Install Verdaccio',
|
|
255
|
-
run: 'npm install -g verdaccio pm2',
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
name: 'Create Verdaccio config',
|
|
259
|
-
run: [
|
|
260
|
-
'mkdir -p $HOME/.config/verdaccio',
|
|
261
|
-
`echo '${JSON.stringify(verdaccioConfig)}' > $HOME/.config/verdaccio/config.yaml`,
|
|
262
|
-
].join('\n'),
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
name: 'Start Verdaccio',
|
|
266
|
-
run: [
|
|
267
|
-
'pm2 start verdaccio -- --config $HOME/.config/verdaccio/config.yaml',
|
|
268
|
-
'sleep 5 # Wait for Verdaccio to start',
|
|
269
|
-
].join('\n'),
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
name: 'Configure npm to use local registry',
|
|
273
|
-
run: [
|
|
274
|
-
// This token is a bogus token. It doesn't represent any actual secret, it just needs to exist.
|
|
275
|
-
'echo \'//localhost:4873/:_authToken="MWRjNDU3OTE1NTljYWUyOTFkMWJkOGUyYTIwZWMwNTI6YTgwZjkyNDE0NzgwYWQzNQ=="\' > ~/.npmrc',
|
|
276
|
-
'echo \'registry=http://localhost:4873/\' >> ~/.npmrc',
|
|
277
|
-
].join('\n'),
|
|
278
|
-
},
|
|
279
|
-
{
|
|
280
|
-
name: 'Find an locally publish all tarballs',
|
|
281
|
-
run: [
|
|
282
|
-
`for pkg in ${tarballBashExpr}; do`,
|
|
283
|
-
' npm publish $pkg',
|
|
284
|
-
'done',
|
|
285
|
-
].join('\n'),
|
|
286
|
-
},
|
|
287
|
-
{
|
|
288
|
-
name: 'Download and install the test artifact',
|
|
289
|
-
run: [
|
|
290
|
-
'npm install @aws-cdk-testing/cli-integ',
|
|
291
|
-
// Move the installed files to the current directory, because as
|
|
292
|
-
// currently configured the tests won't run from an installed
|
|
293
|
-
// node_modules directory.
|
|
294
|
-
'mv ./node_modules/@aws-cdk-testing/cli-integ/* .',
|
|
295
|
-
].join('\n'),
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
name: 'Determine latest package versions',
|
|
299
|
-
id: 'versions',
|
|
300
|
-
run: [
|
|
301
|
-
'CLI_VERSION=$(cd ${TMPDIR:-/tmp} && npm view aws-cdk version)',
|
|
302
|
-
'echo "CLI version: ${CLI_VERSION}"',
|
|
303
|
-
'echo "cli_version=${CLI_VERSION}" >> $GITHUB_OUTPUT',
|
|
304
|
-
'LIB_VERSION=$(cd ${TMPDIR:-/tmp} && npm view aws-cdk-lib version)',
|
|
305
|
-
'echo "lib version: ${LIB_VERSION}"',
|
|
306
|
-
'echo "lib_version=${LIB_VERSION}" >> $GITHUB_OUTPUT',
|
|
307
|
-
].join('\n'),
|
|
308
|
-
},
|
|
309
|
-
{
|
|
310
|
-
name: 'Run the test suite: ${{ matrix.suite }}',
|
|
311
|
-
run: [
|
|
312
|
-
`bin/run-suite${maxWorkersArg} --use-cli-release=\${{ steps.versions.outputs.cli_version }} --framework-version=\${{ steps.versions.outputs.lib_version }} \${{ matrix.suite }}`,
|
|
313
|
-
].join('\n'),
|
|
314
|
-
env: {
|
|
315
|
-
JSII_SILENCE_WARNING_DEPRECATED_NODE_VERSION: 'true',
|
|
316
|
-
JSII_SILENCE_WARNING_UNTESTED_NODE_VERSION: 'true',
|
|
317
|
-
JSII_SILENCE_WARNING_KNOWN_BROKEN_NODE_VERSION: 'true',
|
|
318
|
-
DOCKERHUB_DISABLED: 'true',
|
|
319
|
-
...(props.enableAtmosphere ?
|
|
320
|
-
{
|
|
321
|
-
CDK_INTEG_ATMOSPHERE_ENABLED: 'true',
|
|
322
|
-
CDK_INTEG_ATMOSPHERE_ENDPOINT: props.enableAtmosphere.endpoint,
|
|
323
|
-
CDK_INTEG_ATMOSPHERE_POOL: props.enableAtmosphere.pool,
|
|
324
|
-
} :
|
|
325
|
-
{
|
|
326
|
-
AWS_REGIONS: ['us-east-2', 'eu-west-1', 'eu-north-1', 'ap-northeast-1', 'ap-south-1'].join(','),
|
|
327
|
-
}),
|
|
328
|
-
CDK_MAJOR_VERSION: '2',
|
|
329
|
-
RELEASE_TAG: 'latest',
|
|
330
|
-
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}',
|
|
331
|
-
},
|
|
332
|
-
},
|
|
333
|
-
],
|
|
334
|
-
});
|
|
335
|
-
// Add a job that collates all matrix jobs into a single status
|
|
336
|
-
// This is required so that we can setup required status checks
|
|
337
|
-
// and if we ever change the test matrix, we don't need to update
|
|
338
|
-
// the status check configuration.
|
|
339
|
-
runTestsWorkflow.addJob('integ', {
|
|
340
|
-
permissions: {},
|
|
341
|
-
runsOn: [props.testRunsOn],
|
|
342
|
-
needs: [JOB_PREPARE, JOB_INTEG_MATRIX],
|
|
343
|
-
if: 'always()',
|
|
344
|
-
steps: [
|
|
345
|
-
{
|
|
346
|
-
name: 'Integ test result',
|
|
347
|
-
run: `echo \${{ needs.${JOB_INTEG_MATRIX}.result }}`,
|
|
348
|
-
},
|
|
349
|
-
{
|
|
350
|
-
// Don't fail the job if the test was successful or intentionally skipped
|
|
351
|
-
if: `\${{ !(contains(fromJSON('["success", "skipped"]'), needs.${JOB_PREPARE}.result) && contains(fromJSON('["success", "skipped"]'), needs.${JOB_INTEG_MATRIX}.result)) }}`,
|
|
352
|
-
name: 'Set status based on matrix job',
|
|
353
|
-
run: 'exit 1',
|
|
354
|
-
},
|
|
355
|
-
],
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
exports.CdkCliIntegTestsWorkflow = CdkCliIntegTestsWorkflow;
|
|
360
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
361
|
-
CdkCliIntegTestsWorkflow[_a] = { fqn: "cdklabs-projen-project-types.CdkCliIntegTestsWorkflow", version: "0.2.15" };
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWNsaS1pbnRlZy10ZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jZGstY2xpLWludGVnLXRlc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQXVEO0FBRXZELE1BQU0sZ0JBQWdCLEdBQUcsNEVBQTRFLENBQUM7QUFxRnRHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSxrQkFBUztJQUNyRCxZQUFZLElBQTRCLEVBQUUsS0FBb0M7UUFDNUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRVosTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0MsYUFBcUIsQ0FBQyxRQUFrQyxDQUFDO1FBRTNELEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUM1QyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN4RixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsYUFBYSxHQUFHLGlCQUFpQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEQsQ0FBQztRQUVELGdCQUFnQixDQUFDLEVBQUUsQ0FB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QVcsRUFBRSxRQUFRO3dCQUNyQixZQUFZLEVBQUUsNkJBQTZCO3FCQUM1QztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsK0RBQStEO1FBQy9ELCtEQUErRDtRQUMvRCxpRUFBaUU7UUFDakUsa0NBQWtDO1FBQ2xDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDL0IsV0FBVyxFQUFFLEVBQUU7WUFDZixNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQzFCLEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQztZQUN0QyxFQUFFLEVBQUUsVUFBVTtZQUNkLEtBQUssRUFBRTtnQkFDTDtvQkFDRSxJQUFJLEVBQUUsbUJBQW1CO29CQUN6QixHQUFHLEVBQUUsbUJBQW1CLGdCQUFnQixZQUFZO2lCQUNyRDtnQkFDRDtvQkFDRSx5RUFBeUU7b0JBQ3pFLEVBQUUsRUFBRSw2REFBNkQsV0FBVyxrRUFBa0UsZ0JBQWdCLGNBQWM7b0JBQzVLLElBQUksRUFBRSxnQ0FBZ0M7b0JBQ3RDLEdBQUcsRUFBRSxRQUFRO2lCQUNkO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQTVVSCw0REE2VUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGdpdGh1YiwgamF2YXNjcmlwdCB9IGZyb20gJ3Byb2plbic7XG5cbmNvbnN0IE5PVF9GTEFHR0VEX0VYUFIgPSBcIiFjb250YWlucyhnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmxhYmVscy4qLm5hbWUsICdwci9leGVtcHQtaW50ZWctdGVzdCcpXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYXRtb3NwaGVyZSBzZXJ2aWNlIHVzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF0bW9zcGhlcmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIEF0bW9zcGhlcmUgc2VydmljZSBlbmRwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGljaCBwb29sIHRvIHJldHJpZXZlIGVudmlyb25tZW50cyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9vbDogc3RyaW5nO1xuICAvKipcbiAgICogT0lEQyByb2xlIHRvIGFzc3VtZSBwcmlvciB0byB1c2luZyBhdG1vc3BoZXJlLiBNdXN0IGJlIGFsbG93IGxpc3RlZFxuICAgKiBvbiB0aGUgc2VydmljZSBlbmRwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IG9pZGNSb2xlQXJuOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2RrQ2xpSW50ZWdUZXN0c1dvcmtmbG93UHJvcHMge1xuICAvKipcbiAgICogUnVubmVycyBmb3IgdGhlIHdvcmtmbG93XG4gICAqL1xuICByZWFkb25seSBidWlsZFJ1bnNPbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSdW5uZXJzIGZvciB0aGUgd29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RSdW5zT246IHN0cmluZztcblxuICAvKipcbiAgICogR2l0SHViIGVudmlyb25tZW50IG5hbWUgZm9yIGFwcHJvdmFsc1xuICAgKlxuICAgKiBNVVNUIGJlIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZSBtYW51YWwgYXBwcm92YWwuXG4gICAqL1xuICByZWFkb25seSBhcHByb3ZhbEVudmlyb25tZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdpdEh1YiBlbnZpcm9ubWVudCBuYW1lIGZvciBydW5uaW5nIHRoZSB0ZXN0c1xuICAgKlxuICAgKiBNVVNUIGJlIGNvbmZpZ3VyZWQgd2l0aG91dCBhcHByb3ZhbHMsIGFuZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFycyBhbmQgc2VjcmV0czpcbiAgICpcbiAgICogLSB2YXJzOiBBV1NfUk9MRV9UT19BU1NVTUVfRk9SX1RFU1RJTkdcbiAgICpcbiAgICogQW5kIHRoZSByb2xlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8gYWxsb3cgdGhlIEFzc3VtZVJvbGUgb3BlcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdGVzdEVudmlyb25tZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2VzIHRoYXQgYXJlIGxvY2FsbHkgdHJhbnNmZXJlZCAod2Ugd2lsbCBuZXZlciB1c2UgdGhlIHVwc3RyZWFtIHZlcnNpb25zKVxuICAgKlxuICAgKiBUYWtlcyBwYWNrYWdlIG5hbWVzOyB0aGVzZSBhcmUgZXhwZWN0ZWQgdG8gbGl2ZSBpbiBgcGFja2FnZXMvPE5BTUU+L2Rpc3QvanNgLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9jYWxQYWNrYWdlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZpY2lhbCByZXBvIHRoaXMgd29ya2Zsb3cgaXMgdXNlZCBmb3JcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVJlcG86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgZ2l2ZW4sIGFsbG93cyBhY2Nlc3NpbmcgdXBzdHJlYW0gdmVyc2lvbnMgb2YgdGhlc2UgcGFja2FnZXNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyB1cHN0cmVhbSB2ZXJzaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dVcHN0cmVhbVZlcnNpb25zPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBhdG1vc3BoZXJlIHNlcnZpY2UgdG8gcmV0cmlldmUgQVdTIHRlc3QgZW52aXJvbm1lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF0bW9zcGhlcmUgaXMgbm90IHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUF0bW9zcGhlcmU/OiBBdG1vc3BoZXJlT3B0aW9ucztcblxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHdvcmtlcnMgdGhlIHdvcmtlci1wb29sIHdpbGwgc3Bhd24gZm9yIHJ1bm5pbmcgdGVzdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGNsaSBpbnRlZyB0ZXN0IHBhY2thZ2UgZGV0ZXJtaW5lcyBhIHNlbnNpYmxlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IG1heFdvcmtlcnM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWRkIGEgd29ya2Zsb3cgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzXG4gKlxuICogVGhpcyBNVVNUIGJlIGEgc2VwYXJhdGUgd29ya2Zsb3cgdGhhdCBydW5zIGluIHByaXZpbGVnZWQgY29udGV4dC4gV2UgaGF2ZSBhIGNvdXBsZVxuICogb2Ygb3B0aW9uczpcbiAqXG4gKiAtIGB3b3JrZmxvd19ydW5gOiB3ZSBjYW4gdHJpZ2dlciBhIHByaXZpbGVnZWQgd29ya2Zsb3cgcnVuIGFmdGVyIHRoZSB1bnByaXZpbGVnZWRcbiAqICAgYHB1bGxfcmVxdWVzdGAgd29ya2Zsb3cgZmluaXNoZXMgYW5kIHJldXNlIGl0cyBvdXRwdXQgYXJ0aWZhY3RzLiBUaGVcbiAqICAgcHJvYmxlbSBpcyB0aGF0IHRoZSBzZWNvbmQgcnVuIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBQUiBzbyB3ZSB3b3VsZCBuZWVkXG4gKiAgIHRvIHNjcmlwdCBpbiB2aXNpYmlsaXR5IGZvciBhcHByb3ZhbHMgYW5kIHN1Y2Nlc3MgKGJ5IHBvc3RpbmcgY29tbWVudHMsIGZvclxuICogICBleGFtcGxlKVxuICogLSBVc2Ugb25seSBhIGBwdWxsX3JlcXVlc3RfdGFyZ2V0YCB3b3JrZmxvdyBvbiB0aGUgUFI6IHRoaXMgZWl0aGVyIHdvdWxkIHJ1blxuICogICBhIHByaXZpbGVnZWQgd29ya2Zsb3cgb24gYW55IHVzZXIgY29kZSBzdWJtaXNzaW9uIChtaWdodCBiZSBmaW5lIGdpdmVuIHRoZVxuICogICB3b3JrZmxvdydzIGBwZXJtaXNzaW9uc2AsIGJ1dCBJJ20gc3VyZSB0aGlzIHdpbGwgbWFrZSBvdXIgc2VjdXJpdHkgdGVhbSB1bmVhc3lcbiAqICAgYW55d2F5KSwgT1IgdGhpcyB3b3VsZCBtZWFuIGFueSBidWlsZCBuZWVkcyBodW1hbiBjb25maXJtYXRpb24gd2hpY2ggbWVhbnMgc2xvd1xuICogICBmZWVkYmFjay5cbiAqIC0gVXNlIGEgYHB1bGxfcmVxdWVzdGAgZm9yIGEgcmVndWxhciBmYXN0LWZlZWRiYWNrIGJ1aWxkLCBhbmQgYSBzZXBhcmF0ZVxuICogICBgcHVsbF9yZXF1ZXN0X3RhcmdldGAgZm9yIHRoZSBpbnRlZyB0ZXN0cy4gVGhpcyBtZWFucyB3ZSdyZSBidWlsZGluZyB0d2ljZS5cbiAqXG4gKiBVbHRpbWF0ZWx5LCBvdXIgYnVpbGQgaXNuJ3QgaGVhdnkgZW5vdWdoIHRvIHB1dCBpbiBhIGxvdCBvZiBlZmZvcnQgZGVkdXBpbmdcbiAqIGl0LCBzbyB3ZSdsbCBnbyB3aXRoIHRoZSBzaW1wbGVzdCBzb2x1dGlvbiB3aGljaCBpcyB0aGUgbGFzdCBvbmU6IDJcbiAqIGluZGVwZW5kZW50IHdvcmtmbG93cy5cbiAqXG4gKiBwcm9qZW4gZG9lc24ndCBtYWtlIGl0IGVhc3kgdG8gY29weSB0aGUgcmVsZXZhbnQgcGFydHMgb2YgdGhlICdidWlsZCcgd29ya2Zsb3csXG4gKiBzbyB0aGV5J3JlIHVuZm9ydHVuYXRlbHkgZHVwbGljYXRlZCBoZXJlLlxuICovXG5leHBvcnQgY2xhc3MgQ2RrQ2xpSW50ZWdUZXN0c1dvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocmVwbzogamF2YXNjcmlwdC5Ob2RlUHJvamVjdCwgcHJvcHM6IENka0NsaUludGVnVGVzdHNXb3JrZmxvd1Byb3BzKSB7XG4gICAgc3VwZXIocmVwbyk7XG5cbiAgICBjb25zdCBidWlsZFdvcmtmbG93ID0gcmVwby5idWlsZFdvcmtmbG93O1xuICAgIGNvbnN0IHJ1blRlc3RzV29ya2Zsb3cgPSByZXBvLmdpdGh1Yj8uYWRkV29ya2Zsb3coJ2ludGVnJyk7XG4gICAgaWYgKCFidWlsZFdvcmtmbG93IHx8ICFydW5UZXN0c1dvcmtmbG93KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGJ1aWxkIGFuZCBydW4gdGVzdHMgd29ya2Zsb3cnKTtcbiAgICB9XG4gICAgKChidWlsZFdvcmtmbG93IGFzIGFueSkud29ya2Zsb3cgYXMgZ2l0aHViLkdpdGh1YldvcmtmbG93KTtcblxuICAgIHByb3BzLmFsbG93VXBzdHJlYW1WZXJzaW9ucz8uZm9yRWFjaCgocGFjaykgPT4ge1xuICAgICAgaWYgKCFwcm9wcy5sb2NhbFBhY2thZ2VzLmluY2x1ZGVzKHBhY2spKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFja2FnZSBpbiBhbGxvd1Vwc3RyZWFtVmVyc2lvbnMgYnV0IG5vdCBpbiBsb2NhbFBhY2thZ2VzOiAke3BhY2t9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgbWF4V29ya2Vyc0FyZyA9ICcnO1xuICAgIGlmIChwcm9wcy5tYXhXb3JrZXJzKSB7XG4gICAgICBtYXhXb3JrZXJzQXJnID0gYCAtLW1heFdvcmtlcnM9JHtwcm9wcy5tYXhXb3JrZXJzfWA7XG4gICAgfVxuXG4gICAgcnVuVGVzdHNXb3JrZmxvdy5vbih7XG4gICAgICBwdWxsUmVxdWVzdFRhcmdldDoge1xuICAgICAgICBicmFuY2hlczogWydtYWluJ10sXG4gICAgICB9LFxuICAgICAgLy8gTmVlZHMgdG8gdHJpZ2dlciBhbmQgcmVwb3J0IHN1Y2Nlc3Mgb24gbWVyZ2UgcXVldWUgYnVpbGRzIGFzIHdlbGxcbiAgICAgIG1lcmdlR3JvdXA6IHt9LFxuICAgICAgLy8gTmV2ZXIgaHVydHMgdG8gYmUgYWJsZSB0byBydW4gdGhpcyBtYW51YWxseVxuICAgICAgd29ya2Zsb3dEaXNwYXRjaDoge30sXG4gICAgfSk7XG4gICAgLy8gVGhlICdidWlsZCcgcGFydCBydW5zIG9uIHRoZSAnaW50ZWctYXBwcm92YWwnIGVudmlyb25tZW50LCB3aGljaCByZXF1aXJlc1xuICAgIC8vIGFwcHJvdmFsLiBUaGUgYWN0dWFsIHJ1bnMgYWNjZXNzIHRoZSByZWFsIGVudmlyb25tZW50LCBub3QgcmVxdWlyaW5nIGFwcHJvdmFsXG4gICAgLy8gYW55bW9yZS5cbiAgICAvL1xuICAgIC8vIFRoaXMgaXMgZm9yIDIgcmVhc29uczpcbiAgICAvLyAtIFRoZSBidWlsZCBqb2IgaXMgdGhlIGZpcnN0IG9uZSB0aGF0IHJ1bnMuIFRoYXQgbWVhbnMgeW91IGdldCBhc2tlZCBhcHByb3ZhbFxuICAgIC8vICAgaW1tZWRpYXRlbHkgYWZ0ZXIgcHVzaCwgaW5zdGVhZCBvZiA1IG1pbnV0ZXMgbGF0ZXIgYWZ0ZXIgdGhlIGJ1aWxkIGNvbXBsZXRlcy5cbiAgICAvLyAtIFRoZSBidWlsZCBqb2IgaXMgb25seSBvbmUgam9iLCB2ZXJzdXMgdGhlIHRlc3RzIHdoaWNoIGFyZSBhIG1hdHJpeCBidWlsZC5cbiAgICAvLyAgIElmIHRoZSBtYXRyaXggdGVzdCBqb2IgbmVlZHMgYXBwcm92YWwsIHRoZSBQdWxsIFJlcXVlc3QgdGltZWxpbmUgZ2V0cyBzcGFtbWVkXG4gICAgLy8gICB3aXRoIGFuIGFwcHJvdmFsIHJlcXVlc3QgZm9yIGV2ZXJ5IGluZGl2aWR1YWwgcnVuLlxuICAgIGNvbnN0IEpPQl9QUkVQQVJFID0gJ3ByZXBhcmUnO1xuICAgIHJ1blRlc3RzV29ya2Zsb3cuYWRkSm9iKEpPQl9QUkVQQVJFLCB7XG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuYXBwcm92YWxFbnZpcm9ubWVudCxcbiAgICAgIHJ1bnNPbjogW3Byb3BzLmJ1aWxkUnVuc09uXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgIH0sXG4gICAgICBlbnY6IHtcbiAgICAgICAgQ0k6ICd0cnVlJyxcbiAgICAgIH0sXG4gICAgICAvLyBEb24ndCBydW4gYWdhaW4gb24gdGhlIG1lcmdlIHF1ZXVlLCB3ZSBhbHJlYWR5IGdvdCBjb25maXJtYXRpb24gdGhhdCBpdCB3b3JrcyBhbmQgdGhlXG4gICAgICAvLyB0ZXN0cyBhcmUgcXVpdGUgZXhwZW5zaXZlLlxuICAgICAgaWY6IGBnaXRodWIuZXZlbnRfbmFtZSAhPSAnbWVyZ2VfZ3JvdXAnICYmICR7Tk9UX0ZMQUdHRURfRVhQUn1gLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjQnLFxuICAgICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAgIC8vIElNUE9SVEFOVCEgVGhpcyBtdXN0IGJlIGBoZWFkLnNoYWAgbm90IGBoZWFkLnJlZmAsIG90aGVyd2lzZSB3ZVxuICAgICAgICAgICAgLy8gYXJlIHZ1bG5lcmFibGUgdG8gYSBUT0NUT1UgYXR0YWNrLlxuICAgICAgICAgICAgcmVmOiAnJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QuaGVhZC5zaGEgfX0nLFxuICAgICAgICAgICAgcmVwb3NpdG9yeTogJyR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQucmVwby5mdWxsX25hbWUgfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFdlIHVzZWQgdG8gZmV0Y2ggdGFncyBmcm9tIHRoZSByZXBvIHVzaW5nICdjaGVja291dCcsIGJ1dCBpZiBpdCdzIGEgZm9ya1xuICAgICAgICAvLyB0aGUgdGFncyB3b24ndCBiZSB0aGVyZSwgc28gd2UgaGF2ZSB0byBmZXRjaCB0aGVtIGZyb20gdXBzdHJlYW0uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSB0YWdzIGFyZSBuZWNlc3NhcnkgdG8gcmVhbGlzdGljYWxseSBidW1wIHZlcnNpb25zXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRmV0Y2ggdGFncyBmcm9tIG9yaWdpbiByZXBvJyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgIC8vIENhbiBiZSBlaXRoZXIgYXdzL2F3cy1jZGstY2xpIG9yIGF3cy9hd3MtY2RrLWNsaS10ZXN0aW5nXG4gICAgICAgICAgICAvLyAoTXVzdCBjbG9uZSBvdmVyIEhUVFBTIGJlY2F1c2Ugd2UgaGF2ZSBubyBTU0ggYXV0aCBzZXQgdXApXG4gICAgICAgICAgICBgZ2l0IHJlbW90ZSBhZGQgdXBzdHJlYW0gaHR0cHM6Ly9naXRodWIuY29tLyR7cHJvcHMuc291cmNlUmVwb30uZ2l0YCxcbiAgICAgICAgICAgICdnaXQgZmV0Y2ggdXBzdHJlYW0gXFwncmVmcy90YWdzLyo6cmVmcy90YWdzLypcXCcnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZS5qcycsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ25vZGUtdmVyc2lvbic6ICdsdHMvKicsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdJbnN0YWxsIGRlcGVuZGVuY2llcycsXG4gICAgICAgICAgcnVuOiAneWFybiBpbnN0YWxsIC0tY2hlY2stZmlsZXMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0J1bXAgdG8gcmVhbGlzdGljIHZlcnNpb25zJyxcbiAgICAgICAgICBydW46ICd5YXJuIHdvcmtzcGFjZXMgcnVuIGJ1bXAnLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgVEVTVElOR19DQU5ESURBVEU6ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2J1aWxkJyxcbiAgICAgICAgICBydW46ICducHggcHJvamVuIGJ1aWxkJyxcbiAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgcHJvamVuIGZyb20gcmVzZXR0aW5nIHRoZSB2ZXJzaW9uIG51bWJlcnMgdG9cbiAgICAgICAgICAgIC8vIDAuMC4wIGR1cmluZyBpdHMgc3ludGhlc2lzLlxuICAgICAgICAgICAgUkVMRUFTRTogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnVXBsb2FkIGFydGlmYWN0JyxcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy91cGxvYWQtYXJ0aWZhY3RAdjQuNC4wJyxcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICBuYW1lOiAnYnVpbGQtYXJ0aWZhY3QnLFxuICAgICAgICAgICAgcGF0aDogJ3BhY2thZ2VzLyoqL2Rpc3QvanMvKi50Z3onLFxuICAgICAgICAgICAgb3ZlcndyaXRlOiAndHJ1ZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJkYWNjaW9Db25maWcgPSB7XG4gICAgICBzdG9yYWdlOiAnLi9zdG9yYWdlJyxcbiAgICAgIGF1dGg6IHsgaHRwYXNzd2Q6IHsgZmlsZTogJy4vaHRwYXNzd2QnIH0gfSxcbiAgICAgIHVwbGlua3M6IHsgbnBtanM6IHsgdXJsOiAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvJyB9IH0sXG4gICAgICBwYWNrYWdlczoge30gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcGFjayBvZiBwcm9wcy5sb2NhbFBhY2thZ2VzKSB7XG4gICAgICBjb25zdCBhbGxvd1Vwc3RyZWFtID0gcHJvcHMuYWxsb3dVcHN0cmVhbVZlcnNpb25zPy5pbmNsdWRlcyhwYWNrKTtcblxuICAgICAgdmVyZGFjY2lvQ29uZmlnLnBhY2thZ2VzW3BhY2tdID0ge1xuICAgICAgICBhY2Nlc3M6ICckYWxsJyxcbiAgICAgICAgcHVibGlzaDogJyRhbGwnLFxuICAgICAgICBwcm94eTogYWxsb3dVcHN0cmVhbSA/ICducG1qcycgOiAnbm9uZScsXG4gICAgICB9O1xuICAgIH07XG4gICAgdmVyZGFjY2lvQ29uZmlnLnBhY2thZ2VzWycqKiddID0ge1xuICAgICAgYWNjZXNzOiAnJGFsbCcsXG4gICAgICBwcm94eTogJ25wbWpzJyxcbiAgICB9O1xuXG4gICAgLy8gYmFzaCBvbmx5IGV4cGFuZHMgey4uLn0gaWYgdGhlcmUncyBhICwgaW4gdGhlcmUsIG90aGVyd2lzZSBpdCB3aWxsIGxlYXZlIHRoZVxuICAgIC8vIGJyYWNlcyBpbiBsaXRlcmFsbHkuIFNvIHdlIG5lZWQgdG8gZG8gY2FzZSBhbmFseXNpcyBoZXJlLiBUaGFua3MsIEkgaGF0ZSBpdC5cbiAgICBjb25zdCB0YXJiYWxsQmFzaEV4cHIgPSBwcm9wcy5sb2NhbFBhY2thZ2VzLmxlbmd0aCA9PT0gMVxuICAgICAgPyBgcGFja2FnZXMvJHtwcm9wcy5sb2NhbFBhY2thZ2VzWzBdfS9kaXN0L2pzLyoudGd6YFxuICAgICAgOiBgcGFja2FnZXMveyR7cHJvcHMubG9jYWxQYWNrYWdlcy5qb2luKCcsJyl9fS9kaXN0L2pzLyoudGd6YDtcblxuICAgIC8vIFdlIGNyZWF0ZSBhIG1hdHJpeCBqb2IgZm9yIHRoZSB0ZXN0LlxuICAgIC8vIFRoaXMgam9iIHdpbGwgcnVuIGFsbCB0aGUgZGlmZmVyZW50IHRlc3Qgc3VpdGVzIGluIHBhcmFsbGVsLlxuICAgIGNvbnN0IEpPQl9JTlRFR19NQVRSSVggPSAnaW50ZWdfbWF0cml4JztcbiAgICBydW5UZXN0c1dvcmtmbG93LmFkZEpvYihKT0JfSU5URUdfTUFUUklYLCB7XG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMudGVzdEVudmlyb25tZW50LFxuICAgICAgcnVuc09uOiBbcHJvcHMudGVzdFJ1bnNPbl0sXG4gICAgICBuZWVkczogW0pPQl9QUkVQQVJFXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7XG4gICAgICAgIGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCxcbiAgICAgICAgaWRUb2tlbjogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgfSxcbiAgICAgIGVudjoge1xuICAgICAgICAvLyBPdGhlcndpc2UgTWF2ZW4gaXMgdG9vIG5vaXN5XG4gICAgICAgIE1BVkVOX0FSR1M6ICctLW5vLXRyYW5zZmVyLXByb2dyZXNzJyxcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYWN0dWFsbHkgYSBjYW5hcnksIGJ1dCB0aGlzIHByZXZlbnRzIHRoZSB0ZXN0cyBmcm9tIG1ha2luZ1xuICAgICAgICAvLyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgYXZhaWxhYmlsaXR5IG9mIHNvdXJjZSBwYWNrYWdlcy5cbiAgICAgICAgSVNfQ0FOQVJZOiAndHJ1ZScsXG4gICAgICAgIENJOiAndHJ1ZScsXG4gICAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5ldyB2ZXJzaW9uaW5nIG9mIEBhd3MtY2RrL2NsaS1saWItYWxwaGFcbiAgICAgICAgLy8gbWF0Y2hlcyB0aGUgQ0xJIGFuZCBub3QgdGhlIGZyYW1ld29yay5cbiAgICAgICAgQ0xJX0xJQl9WRVJTSU9OX01JUlJPUlNfQ0xJOiAndHJ1ZScsXG4gICAgICB9LFxuICAgICAgLy8gRG9uJ3QgcnVuIGFnYWluIG9uIHRoZSBtZXJnZSBxdWV1ZSwgd2UgYWxyZWFkeSBnb3QgY29uZmlybWF0aW9uIHRoYXQgaXQgd29ya3MgYW5kIHRoZVxuICAgICAgLy8gdGVzdHMgYXJlIHF1aXRlIGV4cGVuc2l2ZS5cbiAgICAgIGlmOiBgZ2l0aHViLmV2ZW50X25hbWUgIT0gJ21lcmdlX2dyb3VwJyAmJiAke05PVF9GTEFHR0VEX0VYUFJ9YCxcbiAgICAgIHN0cmF0ZWd5OiB7XG4gICAgICAgIGZhaWxGYXN0OiBmYWxzZSxcbiAgICAgICAgbWF0cml4OiB7XG4gICAgICAgICAgZG9tYWluOiB7XG4gICAgICAgICAgICBzdWl0ZTogW1xuICAgICAgICAgICAgICAnY2xpLWludGVnLXRlc3RzJyxcbiAgICAgICAgICAgICAgJ2luaXQtY3NoYXJwJyxcbiAgICAgICAgICAgICAgJ2luaXQtZnNoYXJwJyxcbiAgICAgICAgICAgICAgJ2luaXQtZ28nLFxuICAgICAgICAgICAgICAnaW5pdC1qYXZhJyxcbiAgICAgICAgICAgICAgJ2luaXQtamF2YXNjcmlwdCcsXG4gICAgICAgICAgICAgICdpbml0LXB5dGhvbicsXG4gICAgICAgICAgICAgICdpbml0LXR5cGVzY3JpcHQtYXBwJyxcbiAgICAgICAgICAgICAgJ2luaXQtdHlwZXNjcmlwdC1saWInLFxuICAgICAgICAgICAgICAndG9vbC1pbnRlZ3JhdGlvbnMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRG93bmxvYWQgYnVpbGQgYXJ0aWZhY3RzJyxcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgbmFtZTogJ2J1aWxkLWFydGlmYWN0JyxcbiAgICAgICAgICAgIHBhdGg6ICdwYWNrYWdlcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTZXQgdXAgSkRLIDE4JyxcbiAgICAgICAgICBpZjogJ21hdHJpeC5zdWl0ZSA9PSBcXCdpbml0LWphdmFcXCcgfHwgbWF0cml4LnN1aXRlID09IFxcJ2NsaS1pbnRlZy10ZXN0c1xcJycsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtamF2YUB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ2phdmEtdmVyc2lvbic6ICcxOCcsXG4gICAgICAgICAgICAnZGlzdHJpYnV0aW9uJzogJ2NvcnJldHRvJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0F1dGhlbnRpY2F0ZSBWaWEgT0lEQyBSb2xlJyxcbiAgICAgICAgICBpZDogJ2NyZWRzJyxcbiAgICAgICAgICB1c2VzOiAnYXdzLWFjdGlvbnMvY29uZmlndXJlLWF3cy1jcmVkZW50aWFsc0B2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgJ2F3cy1yZWdpb24nOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICAgICdyb2xlLWR1cmF0aW9uLXNlY29uZHMnOiBwcm9wcy5lbmFibGVBdG1vc3BoZXJlID8gNjAgKiA2MCA6IDQgKiA2MCAqIDYwLFxuICAgICAgICAgICAgLy8gRXhwZWN0IHRoaXMgaW4gRW52aXJvbm1lbnQgVmFyaWFibGVzXG4gICAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiBwcm9wcy5lbmFibGVBdG1vc3BoZXJlID8gcHJvcHMuZW5hYmxlQXRtb3NwaGVyZS5vaWRjUm9sZUFybiA6ICcke3sgdmFycy5BV1NfUk9MRV9UT19BU1NVTUVfRk9SX1RFU1RJTkcgfX0nLFxuICAgICAgICAgICAgJ3JvbGUtc2Vzc2lvbi1uYW1lJzogJ3J1bi10ZXN0c0Bhd3MtY2RrLWNsaS1pbnRlZycsXG4gICAgICAgICAgICAnb3V0cHV0LWNyZWRlbnRpYWxzJzogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGluaXQgdGVzdHMgdG8gc3VjY2VlZCwgdGhleSBzZXQgdXAgYSBnaXQgcmVwby5cbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTZXQgZ2l0IGlkZW50aXR5JyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgICdnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIubmFtZSBcImF3cy1jZGstY2xpLWludGVnXCInLFxuICAgICAgICAgICAgJ2dpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCBcIm5vcmVwbHlAZXhhbXBsZS5jb21cIicsXG4gICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdJbnN0YWxsIFZlcmRhY2NpbycsXG4gICAgICAgICAgcnVuOiAnbnBtIGluc3RhbGwgLWcgdmVyZGFjY2lvIHBtMicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnQ3JlYXRlIFZlcmRhY2NpbyBjb25maWcnLFxuICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgJ21rZGlyIC1wICRIT01FLy5jb25maWcvdmVyZGFjY2lvJyxcbiAgICAgICAgICAgIGBlY2hvICcke0pTT04uc3RyaW5naWZ5KHZlcmRhY2Npb0NvbmZpZyl9JyA+ICRIT01FLy5jb25maWcvdmVyZGFjY2lvL2NvbmZpZy55YW1sYCxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1N0YXJ0IFZlcmRhY2NpbycsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAncG0yIHN0YXJ0IHZlcmRhY2NpbyAtLSAtLWNvbmZpZyAkSE9NRS8uY29uZmlnL3ZlcmRhY2Npby9jb25maWcueWFtbCcsXG4gICAgICAgICAgICAnc2xlZXAgNSAjIFdhaXQgZm9yIFZlcmRhY2NpbyB0byBzdGFydCcsXG4gICAgICAgICAgXS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDb25maWd1cmUgbnBtIHRvIHVzZSBsb2NhbCByZWdpc3RyeScsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAvLyBUaGlzIHRva2VuIGlzIGEgYm9ndXMgdG9rZW4uIEl0IGRvZXNuJ3QgcmVwcmVzZW50IGFueSBhY3R1YWwgc2VjcmV0LCBpdCBqdXN0IG5lZWRzIHRvIGV4aXN0LlxuICAgICAgICAgICAgJ2VjaG8gXFwnLy9sb2NhbGhvc3Q6NDg3My86X2F1dGhUb2tlbj1cIk1XUmpORFUzT1RFMU5UbGpZV1V5T1RGa01XSmtPR1V5WVRJd1pXTXdOVEk2WVRnd1pqa3lOREUwTnpnd1lXUXpOUT09XCJcXCcgPiB+Ly5ucG1yYycsXG4gICAgICAgICAgICAnZWNobyBcXCdyZWdpc3RyeT1odHRwOi8vbG9jYWxob3N0OjQ4NzMvXFwnID4+IH4vLm5wbXJjJyxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0ZpbmQgYW4gbG9jYWxseSBwdWJsaXNoIGFsbCB0YXJiYWxscycsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICBgZm9yIHBrZyBpbiAke3RhcmJhbGxCYXNoRXhwcn07IGRvYCxcbiAgICAgICAgICAgICcgIG5wbSBwdWJsaXNoICRwa2cnLFxuICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIHRlc3QgYXJ0aWZhY3QnLFxuICAgICAgICAgIHJ1bjogW1xuICAgICAgICAgICAgJ25wbSBpbnN0YWxsIEBhd3MtY2RrLXRlc3RpbmcvY2xpLWludGVnJyxcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGluc3RhbGxlZCBmaWxlcyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnksIGJlY2F1c2UgYXNcbiAgICAgICAgICAgIC8vIGN1cnJlbnRseSBjb25maWd1cmVkIHRoZSB0ZXN0cyB3b24ndCBydW4gZnJvbSBhbiBpbnN0YWxsZWRcbiAgICAgICAgICAgIC8vIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkuXG4gICAgICAgICAgICAnbXYgLi9ub2RlX21vZHVsZXMvQGF3cy1jZGstdGVzdGluZy9jbGktaW50ZWcvKiAuJyxcbiAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0RldGVybWluZSBsYXRlc3QgcGFja2FnZSB2ZXJzaW9ucycsXG4gICAgICAgICAgaWQ6ICd2ZXJzaW9ucycsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICAnQ0xJX1ZFUlNJT049JChjZCAke1RNUERJUjotL3RtcH0gJiYgbnBtIHZpZXcgYXdzLWNkayB2ZXJzaW9uKScsXG4gICAgICAgICAgICAnZWNobyBcIkNMSSB2ZXJzaW9uOiAke0NMSV9WRVJTSU9OfVwiJyxcbiAgICAgICAgICAgICdlY2hvIFwiY2xpX3ZlcnNpb249JHtDTElfVkVSU0lPTn1cIiA+PiAkR0lUSFVCX09VVFBVVCcsXG4gICAgICAgICAgICAnTElCX1ZFUlNJT049JChjZCAke1RNUERJUjotL3RtcH0gJiYgbnBtIHZpZXcgYXdzLWNkay1saWIgdmVyc2lvbiknLFxuICAgICAgICAgICAgJ2VjaG8gXCJsaWIgdmVyc2lvbjogJHtMSUJfVkVSU0lPTn1cIicsXG4gICAgICAgICAgICAnZWNobyBcImxpYl92ZXJzaW9uPSR7TElCX1ZFUlNJT059XCIgPj4gJEdJVEhVQl9PVVRQVVQnLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnUnVuIHRoZSB0ZXN0IHN1aXRlOiAke3sgbWF0cml4LnN1aXRlIH19JyxcbiAgICAgICAgICBydW46IFtcbiAgICAgICAgICAgIGBiaW4vcnVuLXN1aXRlJHttYXhXb3JrZXJzQXJnfSAtLXVzZS1jbGktcmVsZWFzZT1cXCR7eyBzdGVwcy52ZXJzaW9ucy5vdXRwdXRzLmNsaV92ZXJzaW9uIH19IC0tZnJhbWV3b3JrLXZlcnNpb249XFwke3sgc3RlcHMudmVyc2lvbnMub3V0cHV0cy5saWJfdmVyc2lvbiB9fSBcXCR7eyBtYXRyaXguc3VpdGUgfX1gLFxuICAgICAgICAgIF0uam9pbignXFxuJyksXG4gICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICBKU0lJX1NJTEVOQ0VfV0FSTklOR19ERVBSRUNBVEVEX05PREVfVkVSU0lPTjogJ3RydWUnLFxuICAgICAgICAgICAgSlNJSV9TSUxFTkNFX1dBUk5JTkdfVU5URVNURURfTk9ERV9WRVJTSU9OOiAndHJ1ZScsXG4gICAgICAgICAgICBKU0lJX1NJTEVOQ0VfV0FSTklOR19LTk9XTl9CUk9LRU5fTk9ERV9WRVJTSU9OOiAndHJ1ZScsXG4gICAgICAgICAgICBET0NLRVJIVUJfRElTQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgICAgIC4uLihwcm9wcy5lbmFibGVBdG1vc3BoZXJlID9cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIENES19JTlRFR19BVE1PU1BIRVJFX0VOQUJMRUQ6ICd0cnVlJyxcbiAgICAgICAgICAgICAgICBDREtfSU5URUdfQVRNT1NQSEVSRV9FTkRQT0lOVDogcHJvcHMuZW5hYmxlQXRtb3NwaGVyZS5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICBDREtfSU5URUdfQVRNT1NQSEVSRV9QT09MOiBwcm9wcy5lbmFibGVBdG1vc3BoZXJlLnBvb2wsXG4gICAgICAgICAgICAgIH0gOlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgQVdTX1JFR0lPTlM6IFsndXMtZWFzdC0yJywgJ2V1LXdlc3QtMScsICdldS1ub3J0aC0xJywgJ2FwLW5vcnRoZWFzdC0xJywgJ2FwLXNvdXRoLTEnXS5qb2luKCcsJyksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgQ0RLX01BSk9SX1ZFUlNJT046ICcyJyxcbiAgICAgICAgICAgIFJFTEVBU0VfVEFHOiAnbGF0ZXN0JyxcbiAgICAgICAgICAgIEdJVEhVQl9UT0tFTjogJyR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYSBqb2IgdGhhdCBjb2xsYXRlcyBhbGwgbWF0cml4IGpvYnMgaW50byBhIHNpbmdsZSBzdGF0dXNcbiAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgd2UgY2FuIHNldHVwIHJlcXVpcmVkIHN0YXR1cyBjaGVja3NcbiAgICAvLyBhbmQgaWYgd2UgZXZlciBjaGFuZ2UgdGhlIHRlc3QgbWF0cml4LCB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZVxuICAgIC8vIHRoZSBzdGF0dXMgY2hlY2sgY29uZmlndXJhdGlvbi5cbiAgICBydW5UZXN0c1dvcmtmbG93LmFkZEpvYignaW50ZWcnLCB7XG4gICAgICBwZXJtaXNzaW9uczoge30sXG4gICAgICBydW5zT246IFtwcm9wcy50ZXN0UnVuc09uXSxcbiAgICAgIG5lZWRzOiBbSk9CX1BSRVBBUkUsIEpPQl9JTlRFR19NQVRSSVhdLFxuICAgICAgaWY6ICdhbHdheXMoKScsXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0ludGVnIHRlc3QgcmVzdWx0JyxcbiAgICAgICAgICBydW46IGBlY2hvIFxcJHt7IG5lZWRzLiR7Sk9CX0lOVEVHX01BVFJJWH0ucmVzdWx0IH19YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIC8vIERvbid0IGZhaWwgdGhlIGpvYiBpZiB0aGUgdGVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBpbnRlbnRpb25hbGx5IHNraXBwZWRcbiAgICAgICAgICBpZjogYFxcJHt7ICEoY29udGFpbnMoZnJvbUpTT04oJ1tcInN1Y2Nlc3NcIiwgXCJza2lwcGVkXCJdJyksIG5lZWRzLiR7Sk9CX1BSRVBBUkV9LnJlc3VsdCkgJiYgY29udGFpbnMoZnJvbUpTT04oJ1tcInN1Y2Nlc3NcIiwgXCJza2lwcGVkXCJdJyksIG5lZWRzLiR7Sk9CX0lOVEVHX01BVFJJWH0ucmVzdWx0KSkgfX1gLFxuICAgICAgICAgIG5hbWU6ICdTZXQgc3RhdHVzIGJhc2VkIG9uIG1hdHJpeCBqb2InLFxuICAgICAgICAgIHJ1bjogJ2V4aXQgMScsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|