@mavogel/cdk-vscode-server 0.0.62 → 0.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/.jsii +117 -178
  2. package/API.md +96 -199
  3. package/CLAUDE.md +214 -57
  4. package/README.md +39 -1
  5. package/assets/idle-monitor-enabler/idle-monitor-enabler.lambda/index.js +67 -0
  6. package/assets/installer/installer.lambda/index.js +67 -30
  7. package/awslint.json +5 -0
  8. package/examples/git-repo/main.ts +30 -0
  9. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
  10. package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
  11. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +8 -8
  12. package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +257 -94
  13. package/integ-tests/{integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.al2023.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  14. package/integ-tests/{integ.ubuntu.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.al2023.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  15. package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
  16. package/integ-tests/integ.al2023.ts.snapshot/manifest.json +19 -3
  17. package/integ-tests/integ.al2023.ts.snapshot/tree.json +1 -1
  18. package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.assets.json +2 -2
  19. package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.template.json +1 -1
  20. package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.assets.json +8 -8
  21. package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.template.json +270 -94
  22. package/integ-tests/{integ.ubuntu.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.custom-domain.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  23. package/integ-tests/{integ.al2023.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.custom-domain.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  24. package/integ-tests/integ.custom-domain.ts.snapshot/integ.json +1 -1
  25. package/integ-tests/integ.custom-domain.ts.snapshot/manifest.json +19 -3
  26. package/integ-tests/integ.custom-domain.ts.snapshot/tree.json +1 -1
  27. package/integ-tests/integ.stop-on-idle.ts +1 -4
  28. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +2 -2
  29. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +4 -4
  30. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +23 -9
  31. package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +755 -194
  32. package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.22c8a6c357b704e370bef317ae1b52c59f684aa7640422a3d1dfe813d1f77853.lambda/index.js +67 -0
  33. package/integ-tests/{integ.custom-domain.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.stop-on-idle.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  34. package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +353 -72
  35. package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -1
  36. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
  37. package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
  38. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +8 -8
  39. package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +270 -94
  40. package/integ-tests/{integ.al2023.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.ubuntu.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
  41. package/integ-tests/{integ.custom-domain.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.ubuntu.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
  42. package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
  43. package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +19 -3
  44. package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +1 -1
  45. package/integ-tests/integ.ubuntu24.ts +69 -0
  46. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +33 -0
  47. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +337 -0
  48. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.assets.json +118 -0
  49. package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.template.json +2725 -0
  50. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
  51. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
  52. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
  53. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
  54. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
  55. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
  56. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
  57. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
  58. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
  59. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
  60. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
  61. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
  62. package/integ-tests/integ.ubuntu24.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
  63. package/integ-tests/integ.ubuntu24.ts.snapshot/integ.json +23 -0
  64. package/integ-tests/integ.ubuntu24.ts.snapshot/manifest.json +1473 -0
  65. package/integ-tests/integ.ubuntu24.ts.snapshot/tree.json +1 -0
  66. package/lib/idle-monitor/idle-monitor-function.js +2 -2
  67. package/lib/idle-monitor/idle-monitor.js +5 -2
  68. package/lib/idle-monitor-enabler/idle-monitor-enabler-function.d.ts +13 -0
  69. package/lib/idle-monitor-enabler/idle-monitor-enabler-function.js +22 -0
  70. package/lib/idle-monitor-enabler/idle-monitor-enabler.d.ts +25 -0
  71. package/lib/idle-monitor-enabler/idle-monitor-enabler.js +76 -0
  72. package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.d.ts +9 -0
  73. package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.js +48 -0
  74. package/lib/index.d.ts +0 -1
  75. package/lib/index.js +1 -2
  76. package/lib/installer/installer-function.js +2 -2
  77. package/lib/installer/installer.d.ts +100 -0
  78. package/lib/installer/installer.js +658 -301
  79. package/lib/installer/installer.lambda.js +64 -30
  80. package/lib/secret-retriever/secret-retriever-function.js +2 -2
  81. package/lib/vscode-server.d.ts +40 -0
  82. package/lib/vscode-server.js +27 -4
  83. package/package.json +12 -12
  84. package/.claude/hooks/file_checker.sh +0 -178
  85. package/.qlty/.gitignore +0 -7
  86. package/.qlty/configs/.yamllint.yaml +0 -21
  87. package/.qlty/qlty.toml +0 -115
  88. package/assets/status-check/status-check.lambda/index.js +0 -123
  89. package/integ-tests/integ.al2023.ts.snapshot/cdk.out +0 -1
  90. package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +0 -1
  91. package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +0 -1
  92. package/integ-tests/integ.ubuntu.ts.snapshot/cdk.out +0 -1
  93. package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +0 -1
  94. package/lib/status-check/status-check-function.d.ts +0 -13
  95. package/lib/status-check/status-check-function.js +0 -22
  96. package/lib/status-check/status-check.d.ts +0 -36
  97. package/lib/status-check/status-check.js +0 -109
  98. package/lib/status-check/status-check.lambda.d.ts +0 -2
  99. package/lib/status-check/status-check.lambda.js +0 -104
@@ -19,7 +19,7 @@ class Installer {
19
19
  documentName = options.documentName;
20
20
  }
21
21
  else {
22
- const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, vscode_server_1.LinuxFlavorType.UBUNTU_22, options.customDomainName);
22
+ const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, vscode_server_1.LinuxFlavorType.UBUNTU_22, options.customDomainName, options.repoUrl, options.assetZipS3Path, options.branchZipS3Path, options.folderZipS3Path);
23
23
  documentName = document.name;
24
24
  }
25
25
  const cloudWatchLogGroupName = options.cloudWatchLogGroupName ?? `/aws/ssm/${documentName}`;
@@ -45,7 +45,7 @@ class Installer {
45
45
  documentName = options.documentName;
46
46
  }
47
47
  else {
48
- const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, vscode_server_1.LinuxFlavorType.AMAZON_LINUX_2023, options.customDomainName);
48
+ const document = this.createSSMDocument(scope, devServerBasePath, devServerPort, options.vsCodeUser, options.homeFolder, vscode_server_1.LinuxFlavorType.AMAZON_LINUX_2023, options.customDomainName, options.repoUrl, options.assetZipS3Path, options.branchZipS3Path, options.folderZipS3Path);
49
49
  documentName = document.name;
50
50
  }
51
51
  const cloudWatchLogGroupName = options.cloudWatchLogGroupName ?? `/aws/ssm/${documentName}`;
@@ -65,7 +65,403 @@ class Installer {
65
65
  * @internal
66
66
  */
67
67
  constructor() { }
68
- createSSMDocument(scope, devServerBasePath, devServerPort, vsCodeUser, homeFolder, linuxFlavor, customDomainName) {
68
+ /**
69
+ * Creates the InstallCloudWatchAgent step for SSM document
70
+ * This step is identical for both Ubuntu and Amazon Linux
71
+ */
72
+ createInstallCloudWatchAgentStep() {
73
+ return {
74
+ action: 'aws:configurePackage',
75
+ name: 'InstallCloudWatchAgent',
76
+ inputs: {
77
+ name: 'AmazonCloudWatchAgent',
78
+ action: 'Install',
79
+ },
80
+ };
81
+ }
82
+ /**
83
+ * Creates the ConfigureCloudWatchAgent step for SSM document
84
+ * This step is identical for both Ubuntu and Amazon Linux
85
+ */
86
+ createConfigureCloudWatchAgentStep() {
87
+ return {
88
+ action: 'aws:runDocument',
89
+ name: 'ConfigureCloudWatchAgent',
90
+ inputs: {
91
+ documentType: 'SSMDocument',
92
+ documentPath: 'AmazonCloudWatch-ManageAgent',
93
+ documentParameters: {
94
+ action: 'configure',
95
+ mode: 'ec2',
96
+ optionalConfigurationSource: 'default',
97
+ optionalRestart: 'yes',
98
+ },
99
+ },
100
+ };
101
+ }
102
+ /**
103
+ * Creates the UpdateProfile step for SSM document
104
+ * This step is identical for both Ubuntu and Amazon Linux
105
+ */
106
+ createUpdateProfileStep(vsCodeUser, region, account) {
107
+ return {
108
+ action: 'aws:runShellScript',
109
+ name: 'UpdateProfile',
110
+ inputs: {
111
+ runCommand: [
112
+ '#!/bin/bash',
113
+ 'echo LANG=en_US.utf-8 >> /etc/environment',
114
+ 'echo LC_ALL=en_US.UTF-8 >> /etc/environment',
115
+ `echo 'PATH=$PATH:/home/${vsCodeUser}/.local/bin' >> /home/${vsCodeUser}/.bashrc`,
116
+ `echo 'export PATH' >> /home/${vsCodeUser}/.bashrc`,
117
+ `echo 'export AWS_REGION=${region}' >> /home/${vsCodeUser}/.bashrc`,
118
+ `echo 'export AWS_ACCOUNTID=${account}' >> /home/${vsCodeUser}/.bashrc`,
119
+ `echo 'export NEXT_TELEMETRY_DISABLED=1' >> /home/${vsCodeUser}/.bashrc`,
120
+ `echo "export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '" >> /home/${vsCodeUser}/.bashrc`,
121
+ `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
122
+ ],
123
+ },
124
+ };
125
+ }
126
+ /**
127
+ * Creates the InstallAWSCLI step for SSM document
128
+ * This step is identical for both Ubuntu and Amazon Linux
129
+ */
130
+ createInstallAWSCLIStep(vsCodeUser) {
131
+ return {
132
+ action: 'aws:runShellScript',
133
+ name: 'InstallAWSCLI',
134
+ inputs: {
135
+ runCommand: [
136
+ '#!/bin/bash',
137
+ 'mkdir -p /tmp',
138
+ 'curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip',
139
+ `chown -R ${vsCodeUser}:${vsCodeUser} /tmp/aws-cli.zip`,
140
+ 'unzip -q -d /tmp /tmp/aws-cli.zip',
141
+ 'sudo /tmp/aws/install',
142
+ 'rm -rf /tmp/aws',
143
+ 'echo "AWS CLI installed. Checking configuration"',
144
+ 'aws --version',
145
+ ],
146
+ },
147
+ };
148
+ }
149
+ /**
150
+ * Creates the CloneRepo step for SSM document
151
+ * This step is identical for both Ubuntu and Amazon Linux
152
+ */
153
+ createCloneRepoStep(vsCodeUser, homeFolder) {
154
+ return {
155
+ action: 'aws:runShellScript',
156
+ name: 'CloneRepo',
157
+ inputs: {
158
+ runCommand: [
159
+ '#!/bin/bash',
160
+ `if [[ -z "{{ RepoUrl }}" ]]
161
+ then
162
+ echo "No Repo"
163
+ else
164
+ mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
165
+ sudo -u ${vsCodeUser} git clone {{ RepoUrl }} ${homeFolder}
166
+ echo "Repo {{ RepoUrl }} cloned. Checking configuration"
167
+ ls -la ${homeFolder}
168
+ sudo -u ${vsCodeUser} git -C ${homeFolder} remote -v
169
+ fi`,
170
+ ],
171
+ },
172
+ };
173
+ }
174
+ /**
175
+ * Creates the DownloadAssets step for SSM document
176
+ * This step is identical for both Ubuntu and Amazon Linux
177
+ */
178
+ createDownloadAssetsStep(vsCodeUser, homeFolder) {
179
+ return {
180
+ action: 'aws:runShellScript',
181
+ name: 'DownloadAssets',
182
+ inputs: {
183
+ runCommand: [
184
+ '#!/bin/bash',
185
+ `if [[ -z "{{ AssetZipS3Path }}" ]]
186
+ then
187
+ echo "No assets"
188
+ else
189
+ mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
190
+ mkdir -p /tmp
191
+ aws s3 cp s3://{{ AssetZipS3Path }} /tmp/asset.zip
192
+ chown -R ${vsCodeUser}:${vsCodeUser} /tmp/asset.zip
193
+ unzip -o /tmp/asset.zip -d ${homeFolder}
194
+ chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
195
+ if [[ -d ${homeFolder}/.git ]]
196
+ then
197
+ sudo -u ${vsCodeUser} git -C ${homeFolder} add .
198
+ sudo -u ${vsCodeUser} git -C ${homeFolder} commit -m 'chore: workshop commit'
199
+ else
200
+ sudo -u ${vsCodeUser} git -C ${homeFolder} init
201
+ sudo -u ${vsCodeUser} git -C ${homeFolder} add .
202
+ sudo -u ${vsCodeUser} git -C ${homeFolder} commit -m 'chore: initial commit'
203
+ fi
204
+ echo "Assets downloaded. Checking configuration: ${homeFolder}"
205
+ ls -la ${homeFolder}
206
+ sudo -u ${vsCodeUser} git -C ${homeFolder} branch
207
+ fi`,
208
+ ],
209
+ },
210
+ };
211
+ }
212
+ /**
213
+ * Creates the DownloadFolders step for SSM document
214
+ * This step is identical for both Ubuntu and Amazon Linux
215
+ */
216
+ createDownloadFoldersStep(vsCodeUser, homeFolder) {
217
+ return {
218
+ action: 'aws:runShellScript',
219
+ name: 'DownloadFolders',
220
+ inputs: {
221
+ runCommand: [
222
+ '#!/bin/bash',
223
+ `if [[ -z "{{ FolderZipS3Path }}" ]]
224
+ then
225
+ echo "No folders"
226
+ else
227
+ rm -rf /tmp/folder
228
+ mkdir -p /tmp/folder && chown -R ${vsCodeUser}:${vsCodeUser} /tmp/folder
229
+ aws s3 cp s3://{{ FolderZipS3Path }} /tmp/asset-folder.zip
230
+ chown -R ${vsCodeUser}:${vsCodeUser} /tmp/asset-folder.zip
231
+ unzip -o /tmp/asset-folder.zip -d /tmp/folder
232
+ chown -R ${vsCodeUser}:${vsCodeUser} /tmp/folder
233
+ mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
234
+ cd "${homeFolder}" && cd ..
235
+ if [[ $(pwd) == "/" ]]
236
+ then
237
+ targetRootFolder=""
238
+ else
239
+ targetRootFolder=$(pwd)
240
+ chown -R ${vsCodeUser}:${vsCodeUser} .
241
+ fi
242
+ find "/tmp/folder" -maxdepth 1 -mindepth 1 -type d | while read sourceFolder; do
243
+ folder="$(basename $sourceFolder)"
244
+ echo "Processing folder: $folder"
245
+ targetFolder=$targetRootFolder/$folder
246
+ if [[ $targetRootFolder == "" ]]
247
+ then
248
+ mv $sourceFolder /
249
+ else
250
+ mv $sourceFolder $targetRootFolder
251
+ fi
252
+ chown -R ${vsCodeUser}:${vsCodeUser} $targetFolder
253
+ sudo -u ${vsCodeUser} git -C $targetFolder init
254
+ sudo -u ${vsCodeUser} git -C $targetFolder add .
255
+ sudo -u ${vsCodeUser} git -C $targetFolder commit -m "chore: initial commit"
256
+ echo "Folder downloaded. Checking configuration: $targetFolder"
257
+ ls -la $targetFolder
258
+ done
259
+ rm -rf /tmp/folder
260
+ fi`,
261
+ ],
262
+ },
263
+ };
264
+ }
265
+ /**
266
+ * Creates the InstallCDK step for SSM document
267
+ * This step is identical for both Ubuntu and Amazon Linux
268
+ */
269
+ createInstallCDKStep() {
270
+ return {
271
+ action: 'aws:runShellScript',
272
+ name: 'InstallCDK',
273
+ inputs: {
274
+ runCommand: [
275
+ '#!/bin/bash',
276
+ 'npm install -g aws-cdk',
277
+ 'echo "AWS CDK installed. Checking configuration"',
278
+ 'cdk --version',
279
+ ],
280
+ },
281
+ };
282
+ }
283
+ /**
284
+ * Creates the InstallQCLI step for SSM document
285
+ * This step is identical for both Ubuntu and Amazon Linux
286
+ */
287
+ createInstallQCLIStep(vsCodeUser) {
288
+ return {
289
+ action: 'aws:runShellScript',
290
+ name: 'InstallQCLI',
291
+ inputs: {
292
+ runCommand: [
293
+ '#!/bin/bash',
294
+ 'curl --proto \'=https\' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-$(uname -m)-linux.zip" -o /tmp/q.zip',
295
+ `chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q.zip`,
296
+ 'unzip -q -d /tmp /tmp/q.zip',
297
+ `chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q`,
298
+ 'chmod +x /tmp/q/install.sh',
299
+ `sudo -u ${vsCodeUser} /tmp/q/install.sh --no-confirm`,
300
+ 'rm -rf /tmp/q',
301
+ 'q --version',
302
+ 'echo "Amazon Q CLI installed"',
303
+ ],
304
+ },
305
+ };
306
+ }
307
+ /**
308
+ * Creates the Installuv step for SSM document
309
+ * This step is identical for both Ubuntu and Amazon Linux
310
+ */
311
+ createInstalluvStep(vsCodeUser) {
312
+ return {
313
+ action: 'aws:runShellScript',
314
+ name: 'Installuv',
315
+ inputs: {
316
+ runCommand: [
317
+ '#!/bin/bash',
318
+ `sudo -u ${vsCodeUser} --login curl -fsSL https://astral.sh/uv/install.sh -o /tmp/uv_install.sh`,
319
+ `sudo -u ${vsCodeUser} --login bash /tmp/uv_install.sh`,
320
+ `if uv generate-shell-completion bash &>/dev/null; then
321
+ echo 'eval "$(uv generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
322
+ fi`,
323
+ `if uvx generate-shell-completion bash &>/dev/null; then
324
+ echo 'eval "$(uvx generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
325
+ fi`,
326
+ 'echo "uv installed. Checking configuration"',
327
+ `sudo -u ${vsCodeUser} --login uv --version`,
328
+ ],
329
+ },
330
+ };
331
+ }
332
+ /**
333
+ * Creates the ConfigureCodeServer step for SSM document
334
+ * This step is identical for both Ubuntu and Amazon Linux
335
+ */
336
+ createConfigureCodeServerStep(vsCodeUser, homeFolder, devServerBasePath, devServerPort, serverNameDirective) {
337
+ return {
338
+ action: 'aws:runShellScript',
339
+ name: 'ConfigureCodeServer',
340
+ inputs: {
341
+ runCommand: [
342
+ '#!/bin/bash',
343
+ `export HOME=/home/${vsCodeUser}`,
344
+ 'curl -fsSL https://code-server.dev/install.sh | sh -s -- --version 4.100.3',
345
+ `systemctl enable --now code-server@${vsCodeUser} 2>&1`,
346
+ `tee /etc/nginx/conf.d/code-server.conf <<EOF
347
+ server {
348
+ listen 80;
349
+ listen [::]:80;
350
+ # server_name \\$\\{CloudFrontDistribution.DomainName\\};
351
+ ${serverNameDirective}
352
+ location / {
353
+ proxy_pass http://localhost:8080/;
354
+ proxy_set_header Host \\$host;
355
+ proxy_set_header Upgrade \\$http_upgrade;
356
+ proxy_set_header Connection upgrade;
357
+ proxy_set_header Accept-Encoding gzip;
358
+ }
359
+ location /${devServerBasePath} {
360
+ proxy_pass http://localhost:${devServerPort}/${devServerBasePath};
361
+ proxy_set_header Host \\$host;
362
+ proxy_set_header Upgrade \\$http_upgrade;
363
+ proxy_set_header Connection upgrade;
364
+ proxy_set_header Accept-Encoding gzip;
365
+ }
366
+ }
367
+ EOF`,
368
+ `mkdir -p /home/${vsCodeUser}/.config/code-server`,
369
+ `tee /home/${vsCodeUser}/.config/code-server/config.yaml <<EOF
370
+ cert: false
371
+ auth: password
372
+ hashed-password: "$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)"
373
+ EOF`,
374
+ `mkdir -p /home/${vsCodeUser}/.local/share/code-server/User/`,
375
+ `touch /home/${vsCodeUser}/.hushlogin`,
376
+ `mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}`,
377
+ `tee /home/${vsCodeUser}/.local/share/code-server/User/settings.json <<EOF
378
+ {
379
+ "extensions.autoUpdate": false,
380
+ "extensions.autoCheckUpdates": false,
381
+ "telemetry.telemetryLevel": "off",
382
+ "security.workspace.trust.startupPrompt": "never",
383
+ "security.workspace.trust.enabled": false,
384
+ "security.workspace.trust.banner": "never",
385
+ "security.workspace.trust.emptyWindow": false,
386
+ "auto-run-command.rules": [
387
+ {
388
+ "command": "workbench.action.terminal.new"
389
+ }
390
+ ]
391
+ }
392
+ EOF`,
393
+ `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
394
+ `systemctl restart code-server@${vsCodeUser}`,
395
+ 'systemctl restart nginx',
396
+ `sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
397
+ `sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
398
+ `sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
399
+ `sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
400
+ `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
401
+ 'echo "Nginx installed. Checking configuration"',
402
+ 'nginx -t 2>&1',
403
+ 'systemctl status nginx',
404
+ 'echo "CodeServer installed. Checking configuration"',
405
+ 'code-server -v',
406
+ `systemctl status code-server@${vsCodeUser}`,
407
+ ],
408
+ },
409
+ };
410
+ }
411
+ /**
412
+ * Creates the DownloadBranches step for SSM document
413
+ * This step is identical for both Ubuntu and Amazon Linux
414
+ */
415
+ createDownloadBranchesStep(vsCodeUser, homeFolder) {
416
+ return {
417
+ action: 'aws:runShellScript',
418
+ name: 'DownloadBranches',
419
+ inputs: {
420
+ runCommand: [
421
+ '#!/bin/bash',
422
+ `if [[ -z "{{ BranchZipS3Path }}" ]]
423
+ then
424
+ echo "No branches"
425
+ else
426
+ rm -rf /tmp/branch
427
+ rm -rf /tmp/git
428
+ mkdir -p /tmp/branch && chown -R ${vsCodeUser}:${vsCodeUser} /tmp/branch
429
+ mkdir -p /tmp/git && chown -R ${vsCodeUser}:${vsCodeUser} /tmp/git
430
+ aws s3 cp s3://{{ BranchZipS3Path }} /tmp/asset-branch.zip
431
+ chown -R ${vsCodeUser}:${vsCodeUser} /tmp/asset-branch.zip
432
+ unzip -o /tmp/asset-branch.zip -d /tmp/branch
433
+ chown -R ${vsCodeUser}:${vsCodeUser} /tmp/branch
434
+ mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
435
+ sudo -u ${vsCodeUser} git -C ${homeFolder} init
436
+ mv ${homeFolder}/.git /tmp/git
437
+ rm -rf ${homeFolder}
438
+ mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
439
+ mv /tmp/git/.git ${homeFolder}
440
+ find /tmp/branch -maxdepth 1 -mindepth 1 -type d | while read sourceFolder; do
441
+ branch="$(basename $sourceFolder)"
442
+ echo "Processing branch: $branch"
443
+ sudo -u ${vsCodeUser} git -C ${homeFolder} checkout -b $branch 2>&1
444
+ cp -a $sourceFolder/. ${homeFolder}
445
+ sudo -u ${vsCodeUser} git -C ${homeFolder} add .
446
+ sudo -u ${vsCodeUser} git -C ${homeFolder} commit -m "chore: initial commit $branch"
447
+ mv ${homeFolder}/.git /tmp/git
448
+ rm -rf ${homeFolder}
449
+ mkdir ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}
450
+ mv /tmp/git/.git ${homeFolder}
451
+ done
452
+ sudo -u ${vsCodeUser} git -C ${homeFolder} checkout main 2>&1
453
+ sudo -u ${vsCodeUser} git -C ${homeFolder} restore .
454
+ rm -rf /tmp/branch
455
+ rm -rf /tmp/git
456
+ echo "Branches downloaded. Checking configuration: ${homeFolder}"
457
+ sudo -u ${vsCodeUser} git -C ${homeFolder} branch
458
+ ls -la ${homeFolder}
459
+ fi`,
460
+ ],
461
+ },
462
+ };
463
+ }
464
+ createSSMDocument(scope, devServerBasePath, devServerPort, vsCodeUser, homeFolder, linuxFlavor, customDomainName, repoUrl, assetZipS3Path, branchZipS3Path, folderZipS3Path) {
69
465
  // Generate nginx server_name directive based on custom domain
70
466
  const serverNameDirective = customDomainName
71
467
  ? `server_name *.cloudfront.net ${customDomainName};`
@@ -88,45 +484,37 @@ class Installer {
88
484
  },
89
485
  NodeVersion: {
90
486
  type: 'String',
91
- default: '20',
92
- allowedValues: ['22', '20', '18'],
487
+ default: '22',
488
+ allowedValues: ['24', '22', '20', '18'],
489
+ },
490
+ RepoUrl: {
491
+ type: 'String',
492
+ default: repoUrl ?? '',
493
+ },
494
+ AssetZipS3Path: {
495
+ type: 'String',
496
+ default: assetZipS3Path ?? '',
93
497
  },
94
- DotNetVersion: {
498
+ BranchZipS3Path: {
95
499
  type: 'String',
96
- default: '8.0',
97
- allowedValues: ['8.0', '7.0'],
500
+ default: branchZipS3Path ?? '',
501
+ },
502
+ FolderZipS3Path: {
503
+ type: 'String',
504
+ default: folderZipS3Path ?? '',
98
505
  },
99
506
  },
100
507
  // all mainSteps scripts are in in /var/lib/amazon/ssm/<instanceid>/document/orchestration/<uuid>/<StepName>/_script.sh
101
508
  mainSteps: [
102
- {
103
- action: 'aws:configurePackage',
104
- name: 'InstallCloudWatchAgent',
105
- inputs: {
106
- name: 'AmazonCloudWatchAgent',
107
- action: 'Install',
108
- },
109
- },
110
- {
111
- action: 'aws:runDocument',
112
- name: 'ConfigureCloudWatchAgent',
113
- inputs: {
114
- documentType: 'SSMDocument',
115
- documentPath: 'AmazonCloudWatch-ManageAgent',
116
- documentParameters: {
117
- action: 'configure',
118
- mode: 'ec2',
119
- optionalConfigurationSource: 'default',
120
- optionalRestart: 'yes',
121
- },
122
- },
123
- },
509
+ this.createInstallCloudWatchAgentStep(),
510
+ this.createConfigureCloudWatchAgentStep(),
124
511
  {
125
512
  action: 'aws:runShellScript',
126
513
  name: 'InstallAptPackagesApt',
127
514
  inputs: {
128
515
  runCommand: [
129
516
  '#!/bin/bash',
517
+ 'dpkg --configure -a',
130
518
  'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q apt-utils',
131
519
  'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q needrestart unattended-upgrades',
132
520
  "sed -i 's/#$nrconf{kernelhints} = -1;/$nrconf{kernelhints} = 0;/' /etc/needrestart/needrestart.conf",
@@ -143,7 +531,8 @@ class Installer {
143
531
  inputs: {
144
532
  runCommand: [
145
533
  '#!/bin/bash',
146
- 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl gnupg whois argon2 openssl locales locales-all unzip apt-transport-https ca-certificates software-properties-common nginx',
534
+ 'dpkg --configure -a',
535
+ 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl gnupg whois argon2 unzip nginx openssl locales locales-all apt-transport-https ca-certificates software-properties-common',
147
536
  ],
148
537
  },
149
538
  },
@@ -153,68 +542,69 @@ class Installer {
153
542
  inputs: {
154
543
  runCommand: [
155
544
  '#!/bin/bash',
156
- "echo 'Adding user: ${VSCodeUser}'",
157
- `adduser --disabled-password --gecos '' ${vsCodeUser}`,
158
- `echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd`,
159
- `usermod -aG sudo ${vsCodeUser}`,
545
+ 'dpkg --configure -a',
546
+ `if [[ "${vsCodeUser}" == "ubuntu" ]]
547
+ then
548
+ echo 'Using existing user: ${vsCodeUser}'
549
+ else
550
+ echo 'Adding user: ${vsCodeUser}'
551
+ adduser --disabled-password --gecos '' ${vsCodeUser}
552
+ echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd
553
+ usermod -aG sudo ${vsCodeUser}
554
+ fi`,
160
555
  `tee /etc/sudoers.d/91-vscode-user <<EOF
161
556
  ${vsCodeUser} ALL=(ALL) NOPASSWD:ALL
162
557
  EOF`,
163
558
  `mkdir -p /home/${vsCodeUser} && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
559
+ `mkdir -p /home/${vsCodeUser}/.local/bin && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
164
560
  'echo "User added. Checking configuration"',
165
561
  `getent passwd ${vsCodeUser}`,
166
562
  ],
167
563
  },
168
564
  },
565
+ this.createUpdateProfileStep(vsCodeUser, core_1.Stack.of(scope).region, core_1.Stack.of(scope).account),
566
+ this.createInstallAWSCLIStep(vsCodeUser),
169
567
  {
170
568
  action: 'aws:runShellScript',
171
- name: 'InstallNodeApt',
172
- inputs: {
173
- runCommand: [
174
- '#!/bin/bash',
175
- 'curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg',
176
- 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_{{ NodeVersion }}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list',
177
- 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q nodejs',
178
- 'npm install -g npm@latest',
179
- 'echo "Node and npm installed. Checking configuration"',
180
- 'node -v',
181
- 'npm -v',
182
- ],
183
- },
184
- },
185
- {
186
- action: 'aws:runShellScript',
187
- name: 'InstallDockerApt',
569
+ name: 'InstallGitApt',
188
570
  inputs: {
189
571
  runCommand: [
190
572
  '#!/bin/bash',
191
- 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg',
192
- 'echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release --codename --short) stable" > /etc/apt/sources.list.d/docker.list',
193
- 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q docker-ce docker-ce-cli containerd.io',
194
- `systemctl restart code-server@${vsCodeUser}.service`,
195
- 'systemctl start docker.service',
196
- 'echo "Docker installed. Checking configuration"',
197
- 'docker --version',
198
- 'systemctl status docker.service',
573
+ 'dpkg --configure -a',
574
+ 'add-apt-repository ppa:git-core/ppa',
575
+ 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q git',
576
+ `sudo -u ${vsCodeUser} git config --global user.email "participant@example.com"`,
577
+ `sudo -u ${vsCodeUser} git config --global user.name "Workshop Participant"`,
578
+ `sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
579
+ 'echo "Git installed. Checking configuration"',
580
+ 'git --version',
199
581
  ],
200
582
  },
201
583
  },
584
+ this.createCloneRepoStep(vsCodeUser, homeFolder),
585
+ this.createDownloadAssetsStep(vsCodeUser, homeFolder),
586
+ this.createDownloadFoldersStep(vsCodeUser, homeFolder),
587
+ this.createDownloadBranchesStep(vsCodeUser, homeFolder),
588
+ this.createConfigureCodeServerStep(vsCodeUser, homeFolder, devServerBasePath, devServerPort, serverNameDirective),
202
589
  {
203
590
  action: 'aws:runShellScript',
204
- name: 'InstallGitApt',
591
+ name: 'InstallNodeApt',
205
592
  inputs: {
206
593
  runCommand: [
207
594
  '#!/bin/bash',
208
- 'add-apt-repository ppa:git-core/ppa',
209
- 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q git',
210
- `sudo -u ${vsCodeUser} git config --global user.email "${vsCodeUser}@example.com"`,
211
- `sudo -u ${vsCodeUser} git config --global user.name "Workshop ${vsCodeUser}"`,
212
- `sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
213
- 'echo "Git installed. Checking configuration"',
214
- 'git --version',
595
+ 'curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg',
596
+ 'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_{{ NodeVersion }}.x nodistro main" > /etc/apt/sources.list.d/nodesource.list',
597
+ 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q nodejs',
598
+ 'npm install -g npm@latest',
599
+ 'echo "Node and npm installed. Checking configuration"',
600
+ 'node -v',
601
+ 'npm -v',
215
602
  ],
216
603
  },
217
604
  },
605
+ this.createInstallCDKStep(),
606
+ this.createInstallQCLIStep(vsCodeUser),
607
+ this.createInstalluvStep(vsCodeUser),
218
608
  {
219
609
  action: 'aws:runShellScript',
220
610
  name: 'InstallPythonApt',
@@ -224,11 +614,20 @@ EOF`,
224
614
  // Ubuntu 24 default is Python 3.12
225
615
  // The default installed Python version will map to Python3
226
616
  '#!/bin/bash',
617
+ 'dpkg --configure -a',
227
618
  'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q python3-pip python3-venv python3-boto3 python3-pytest',
228
619
  `echo 'alias pytest=pytest-3' >> /home/${vsCodeUser}/.bashrc`,
229
- `systemctl restart code-server@${vsCodeUser}.service`,
230
620
  'systemctl start multipathd.service packagekit.service',
231
621
  'systemctl restart unattended-upgrades.service',
622
+ 'systemctl restart networkd-dispatcher.service',
623
+ `sudo -u ${vsCodeUser} --login code-server --install-extension ms-python.python --force`,
624
+ `if [ -f /home/${vsCodeUser}/.local/share/code-server/User/settings.json ]; then
625
+ sed -i "2i\\\\ \\"python.testing.pytestEnabled\\": true," /home/${vsCodeUser}/.local/share/code-server/User/settings.json
626
+ else
627
+ echo '{
628
+ "python.testing.pytestEnabled": true
629
+ }' > /home/${vsCodeUser}/.local/share/code-server/User/settings.json
630
+ fi`,
232
631
  'echo "Python and Pip installed. Checking configuration"',
233
632
  'python3 --version',
234
633
  'pip3 --version',
@@ -237,121 +636,75 @@ EOF`,
237
636
  },
238
637
  {
239
638
  action: 'aws:runShellScript',
240
- name: 'InstallAWSCLI',
639
+ name: 'InstallJavaApt',
241
640
  inputs: {
242
641
  runCommand: [
243
642
  '#!/bin/bash',
244
- 'curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip',
245
- 'unzip -q -d /tmp /tmp/aws-cli.zip',
246
- 'sudo /tmp/aws/install',
247
- 'rm -rf /tmp/aws',
248
- 'echo "AWS CLI installed. Checking configuration"',
249
- 'aws --version',
643
+ 'dpkg --configure -a',
644
+ 'curl -fsSL https://apt.corretto.aws/corretto.key | gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg',
645
+ 'echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" > /etc/apt/sources.list.d/corretto.list',
646
+ 'DEBIAN_FRONTEND=noninteractive apt-get update',
647
+ 'DEBIAN_FRONTEND=noninteractive apt-get install -y -q java-21-amazon-corretto-jdk java-17-amazon-corretto-jdk java-1.8.0-amazon-corretto-jdk maven',
648
+ `echo 'export JAVA_8_HOME=$(update-alternatives --list java | grep "java-1.8.0-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
649
+ `echo 'export JAVA_8_PATH=$(update-alternatives --list java | grep "java-1.8.0-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
650
+ `echo 'export JAVA_17_PATH=$(update-alternatives --list java | grep "java-17-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
651
+ `echo 'export JAVA_17_HOME=$(update-alternatives --list java | grep "java-17-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
652
+ `echo 'export JAVA_21_PATH=$(update-alternatives --list java | grep "java-21-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
653
+ `echo 'export JAVA_21_HOME=$(update-alternatives --list java | grep "java-21-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
654
+ `echo 'export JAVA_HOME=$(update-alternatives --list java | grep "java-21-amazon-corretto" | head -1)' >> /home/${vsCodeUser}/.bashrc`,
655
+ `echo 'export PATH=$PATH:$JAVA_HOME/bin:/usr/share/maven/bin' >> /home/${vsCodeUser}/.bashrc`,
656
+ `sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
657
+ 'echo "Java and Maven installed. Checking configuration"',
658
+ 'java -version 2>&1',
659
+ 'mvn --version',
660
+ 'update-alternatives --list java',
250
661
  ],
251
662
  },
252
663
  },
253
664
  {
254
665
  action: 'aws:runShellScript',
255
- name: 'ConfigureCodeServer',
666
+ name: 'InstallDotnetApt',
256
667
  inputs: {
257
668
  runCommand: [
258
669
  '#!/bin/bash',
259
- `export HOME=/home/${vsCodeUser}`,
260
- 'curl -fsSL https://code-server.dev/install.sh | bash -s -- 2>&1',
261
- `systemctl enable --now code-server@${vsCodeUser} 2>&1`,
262
- `tee /etc/nginx/conf.d/code-server.conf <<EOF
263
- server {
264
- listen 80;
265
- listen [::]:80;
266
- # server_name distribution.distributionDomainName;
267
- ${serverNameDirective}
268
- location / {
269
- proxy_pass http://localhost:8080/;
270
- proxy_set_header Host \\$host;
271
- proxy_set_header Upgrade \\$http_upgrade;
272
- proxy_set_header Connection upgrade;
273
- proxy_set_header Accept-Encoding gzip;
274
- }
275
- location /${devServerBasePath} {
276
- proxy_pass http://localhost:${devServerPort}/${devServerBasePath};
277
- proxy_set_header Host \\$host;
278
- proxy_set_header Upgrade \\$http_upgrade;
279
- proxy_set_header Connection upgrade;
280
- proxy_set_header Accept-Encoding gzip;
281
- }
282
- }
283
- EOF`,
284
- `mkdir -p /home/${vsCodeUser}/.config/code-server`,
285
- `tee /home/${vsCodeUser}/.config/code-server/config.yaml <<EOF
286
- cert: false
287
- auth: password
288
- hashed-password: "$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)"
289
- EOF`,
290
- `mkdir -p /home/${vsCodeUser}/.local/share/code-server/User/`,
291
- `touch /home/${vsCodeUser}/.hushlogin`,
292
- `mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}`,
293
- `tee /home/${vsCodeUser}/.local/share/code-server/User/settings.json <<EOF
294
- {
295
- "extensions.autoUpdate": false,
296
- "extensions.autoCheckUpdates": false,
297
- "telemetry.telemetryLevel": "off",
298
- "security.workspace.trust.startupPrompt": "never",
299
- "security.workspace.trust.enabled": false,
300
- "security.workspace.trust.banner": "never",
301
- "security.workspace.trust.emptyWindow": false,
302
- "python.testing.pytestEnabled": true,
303
- "auto-run-command.rules": [
304
- {
305
- "command": "workbench.action.terminal.new"
306
- }
307
- ]
308
- }
309
- EOF`,
310
- `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
311
- `systemctl restart code-server@${vsCodeUser}`,
312
- 'systemctl restart nginx',
313
- `sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
314
- `sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
315
- `sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
316
- `sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
317
- `sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
670
+ 'dpkg --configure -a',
671
+ 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q dotnet-sdk-8.0',
672
+ 'dotnet tool install -g Microsoft.Web.LibraryManager.Cli',
673
+ `echo 'PATH=$PATH:/home/${vsCodeUser}/.dotnet/tools' >> /home/${vsCodeUser}/.bashrc`,
318
674
  `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
319
- 'echo "Nginx installed. Checking configuration"',
320
- 'nginx -t 2>&1',
321
- 'systemctl status nginx',
322
- 'echo "CodeServer installed. Checking configuration"',
323
- 'code-server -v',
324
- `systemctl status code-server@${vsCodeUser}`,
675
+ 'echo "Dotnet installed. Checking configuration"',
676
+ 'dotnet --list-sdks',
325
677
  ],
326
678
  },
327
679
  },
328
680
  {
329
681
  action: 'aws:runShellScript',
330
- name: 'UpdateProfile',
682
+ name: 'InstallDockerApt',
331
683
  inputs: {
332
684
  runCommand: [
333
685
  '#!/bin/bash',
334
- 'echo LANG=en_US.utf-8 >> /etc/environment',
335
- 'echo LC_ALL=en_US.UTF-8 >> /etc/environment',
336
- `echo 'PATH=$PATH:/home/${vsCodeUser}/.local/bin' >> /home/${vsCodeUser}/.bashrc`,
337
- `echo 'export PATH' >> /home/${vsCodeUser}/.bashrc`,
338
- `echo 'export AWS_REGION=${core_1.Stack.of(scope).region}' >> /home/${vsCodeUser}/.bashrc`,
339
- `echo 'export AWS_ACCOUNTID=${core_1.Stack.of(scope).account}' >> /home/${vsCodeUser}/.bashrc`,
340
- `echo 'export NEXT_TELEMETRY_DISABLED=1' >> /home/${vsCodeUser}/.bashrc`,
341
- `echo "export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '" >> /home/${vsCodeUser}/.bashrc`,
342
- `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
686
+ 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg',
687
+ 'echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release --codename --short) stable" > /etc/apt/sources.list.d/docker.list',
688
+ 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q docker-ce docker-ce-cli containerd.io',
689
+ `usermod -aG docker ${vsCodeUser}`,
690
+ `systemctl restart code-server@${vsCodeUser}.service`,
691
+ 'systemctl start docker.service',
692
+ 'echo "Docker installed. Checking configuration"',
693
+ 'docker --version',
694
+ 'systemctl status docker.service',
343
695
  ],
344
696
  },
345
697
  },
346
698
  {
347
699
  action: 'aws:runShellScript',
348
- name: 'InstallCDK',
700
+ name: 'InstallGolangApt',
349
701
  inputs: {
350
702
  runCommand: [
351
703
  '#!/bin/bash',
352
- 'npm install -g aws-cdk',
353
- 'echo "AWS CDK installed. Checking configuration"',
354
- 'cdk --version',
704
+ 'apt-get -q update && DEBIAN_FRONTEND=noninteractive apt-get install -y -q golang',
705
+ `echo 'PATH=$PATH:/home/${vsCodeUser}/go/bin' >> /home/${vsCodeUser}/.bashrc`,
706
+ 'echo "Golang installed. Checking configuration"',
707
+ 'go version',
355
708
  ],
356
709
  },
357
710
  },
@@ -373,39 +726,30 @@ EOF`,
373
726
  },
374
727
  NodeVersion: {
375
728
  type: 'String',
376
- default: '20',
377
- allowedValues: ['22', '20', '18'],
729
+ default: '22',
730
+ allowedValues: ['24', '22', '20', '18'],
731
+ },
732
+ RepoUrl: {
733
+ type: 'String',
734
+ default: repoUrl ?? '',
378
735
  },
379
- DotNetVersion: {
736
+ AssetZipS3Path: {
380
737
  type: 'String',
381
- default: '8.0',
382
- allowedValues: ['8.0', '7.0'],
738
+ default: assetZipS3Path ?? '',
739
+ },
740
+ BranchZipS3Path: {
741
+ type: 'String',
742
+ default: branchZipS3Path ?? '',
743
+ },
744
+ FolderZipS3Path: {
745
+ type: 'String',
746
+ default: folderZipS3Path ?? '',
383
747
  },
384
748
  },
385
749
  // all mainSteps scripts are in in /var/lib/amazon/ssm/<instanceid>/document/orchestration/<uuid>/<StepName>/_script.sh
386
750
  mainSteps: [
387
- {
388
- action: 'aws:configurePackage',
389
- name: 'InstallCloudWatchAgent',
390
- inputs: {
391
- name: 'AmazonCloudWatchAgent',
392
- action: 'Install',
393
- },
394
- },
395
- {
396
- action: 'aws:runDocument',
397
- name: 'ConfigureCloudWatchAgent',
398
- inputs: {
399
- documentType: 'SSMDocument',
400
- documentPath: 'AmazonCloudWatch-ManageAgent',
401
- documentParameters: {
402
- action: 'configure',
403
- mode: 'ec2',
404
- optionalConfigurationSource: 'default',
405
- optionalRestart: 'yes',
406
- },
407
- },
408
- },
751
+ this.createInstallCloudWatchAgentStep(),
752
+ this.createConfigureCloudWatchAgentStep(),
409
753
  {
410
754
  action: 'aws:runShellScript',
411
755
  name: 'InstallBasePackagesDnf',
@@ -422,24 +766,55 @@ EOF`,
422
766
  inputs: {
423
767
  runCommand: [
424
768
  '#!/bin/bash',
425
- `echo 'Adding user: ${vsCodeUser}'`,
426
- `adduser -c '' ${vsCodeUser}`,
427
- `passwd -l ${vsCodeUser}`,
428
- `echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd`,
429
- `usermod -aG wheel ${vsCodeUser}`,
769
+ `if [[ "${vsCodeUser}" == "ec2-user" ]]
770
+ then
771
+ echo 'Using existing user: ${vsCodeUser}'
772
+ else
773
+ echo 'Adding user: ${vsCodeUser}'
774
+ adduser -c '' ${vsCodeUser}
775
+ passwd -l ${vsCodeUser}
776
+ echo "${vsCodeUser}:{{ VSCodePassword }}" | chpasswd
777
+ usermod -aG wheel ${vsCodeUser}
778
+ fi`,
779
+ `tee /etc/sudoers.d/91-vscode-user <<EOF
780
+ ${vsCodeUser} ALL=(ALL) NOPASSWD:ALL
781
+ EOF`,
782
+ `mkdir -p /home/${vsCodeUser} && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
783
+ `mkdir -p /home/${vsCodeUser}/.local/bin && chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
430
784
  'echo "User added. Checking configuration"',
431
785
  `getent passwd ${vsCodeUser}`,
432
786
  ],
433
787
  },
434
788
  },
789
+ this.createUpdateProfileStep(vsCodeUser, core_1.Stack.of(scope).region, core_1.Stack.of(scope).account),
790
+ this.createInstallAWSCLIStep(vsCodeUser),
791
+ {
792
+ action: 'aws:runShellScript',
793
+ name: 'InstallGitDnf',
794
+ inputs: {
795
+ runCommand: [
796
+ '#!/bin/bash',
797
+ 'dnf install -y git',
798
+ `sudo -u ${vsCodeUser} git config --global user.email "participant@example.com"`,
799
+ `sudo -u ${vsCodeUser} git config --global user.name "Workshop Participant"`,
800
+ `sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
801
+ 'echo "Git installed. Checking configuration"',
802
+ 'git --version',
803
+ ],
804
+ },
805
+ },
806
+ this.createCloneRepoStep(vsCodeUser, homeFolder),
807
+ this.createDownloadAssetsStep(vsCodeUser, homeFolder),
808
+ this.createDownloadFoldersStep(vsCodeUser, homeFolder),
809
+ this.createDownloadBranchesStep(vsCodeUser, homeFolder),
810
+ this.createConfigureCodeServerStep(vsCodeUser, homeFolder, devServerBasePath, devServerPort, serverNameDirective),
435
811
  {
436
812
  action: 'aws:runShellScript',
437
813
  name: 'InstallNodeDnf',
438
814
  inputs: {
439
815
  runCommand: [
440
816
  '#!/bin/bash',
441
- 'dnf install -y nodejs20 npm',
442
- 'ln -s -f /usr/bin/node-20 /usr/bin/node',
817
+ 'dnf install -y nodejs npm',
443
818
  'npm install -g npm@latest',
444
819
  'echo "Node and npm installed. Checking configuration"',
445
820
  'node -v',
@@ -449,32 +824,49 @@ EOF`,
449
824
  },
450
825
  {
451
826
  action: 'aws:runShellScript',
452
- name: 'InstallDockerDnf',
827
+ name: 'InstallCDK',
453
828
  inputs: {
454
829
  runCommand: [
455
830
  '#!/bin/bash',
456
- 'dnf install -y docker',
457
- `usermod -aG docker ${vsCodeUser}`,
458
- `systemctl restart code-server@${vsCodeUser}.service`,
459
- 'systemctl start docker.service',
460
- 'echo "Docker installed. Checking configuration"',
461
- 'docker --version',
462
- 'systemctl status docker.service',
831
+ 'npm install -g aws-cdk',
832
+ 'echo "AWS CDK installed. Checking configuration"',
833
+ 'cdk --version',
463
834
  ],
464
835
  },
465
836
  },
466
837
  {
467
838
  action: 'aws:runShellScript',
468
- name: 'InstallGitDnf',
839
+ name: 'InstallQCLI',
469
840
  inputs: {
470
841
  runCommand: [
471
842
  '#!/bin/bash',
472
- 'dnf install -y git',
473
- `sudo -u ${vsCodeUser} git config --global user.email "${vsCodeUser}@example.com"`,
474
- `sudo -u ${vsCodeUser} git config --global user.name "Workshop ${vsCodeUser}"`,
475
- `sudo -u ${vsCodeUser} git config --global init.defaultBranch "main"`,
476
- 'echo "Git installed. Checking configuration"',
477
- 'git --version',
843
+ 'curl --proto \'=https\' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-$(uname -m)-linux.zip" -o /tmp/q.zip',
844
+ `chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q.zip`,
845
+ 'unzip -q -d /tmp /tmp/q.zip',
846
+ `chown -R ${vsCodeUser}:${vsCodeUser} /tmp/q`,
847
+ 'chmod +x /tmp/q/install.sh',
848
+ `sudo -u ${vsCodeUser} /tmp/q/install.sh --no-confirm`,
849
+ 'rm -rf /tmp/q',
850
+ 'echo "Amazon Q CLI installed"',
851
+ ],
852
+ },
853
+ },
854
+ {
855
+ action: 'aws:runShellScript',
856
+ name: 'Installuv',
857
+ inputs: {
858
+ runCommand: [
859
+ '#!/bin/bash',
860
+ `sudo -u ${vsCodeUser} --login curl -fsSL https://astral.sh/uv/install.sh -o /tmp/uv_install.sh`,
861
+ `sudo -u ${vsCodeUser} --login bash /tmp/uv_install.sh`,
862
+ `if uv generate-shell-completion bash &>/dev/null; then
863
+ echo 'eval "$(uv generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
864
+ fi`,
865
+ `if uvx generate-shell-completion bash &>/dev/null; then
866
+ echo 'eval "$(uvx generate-shell-completion bash)"' >> /home/${vsCodeUser}/.bashrc
867
+ fi`,
868
+ 'echo "uv installed. Checking configuration"',
869
+ `sudo -u ${vsCodeUser} --login uv --version`,
478
870
  ],
479
871
  },
480
872
  },
@@ -494,130 +886,83 @@ EOF`,
494
886
  "echo 'alias=python3=python3.11' >> ~/.bashrc",
495
887
  "echo 'alias pip3=pip3.11' >> ~/.bashrc",
496
888
  'python3.11 -m pip install --upgrade pip 2>&1',
889
+ `sudo -u ${vsCodeUser} --login code-server --install-extension ms-python.python --force`,
890
+ `if [ -f /home/${vsCodeUser}/.local/share/code-server/User/settings.json ]; then
891
+ sed -i "2i\\\\ \\"python.testing.pytestEnabled\\": true," /home/${vsCodeUser}/.local/share/code-server/User/settings.json
892
+ else
893
+ echo '{
894
+ "python.testing.pytestEnabled": true
895
+ }' > /home/${vsCodeUser}/.local/share/code-server/User/settings.json
896
+ fi`,
497
897
  'echo "Python and Pip installed. Checking configuration"',
498
898
  'python3.11 --version',
499
899
  'python3.11 -m pip --version 2>&1',
500
900
  ],
501
901
  },
502
902
  },
503
- // add go, dotnet
504
903
  {
505
904
  action: 'aws:runShellScript',
506
- name: 'InstallAWSCLI',
905
+ name: 'InstallJavaDnf',
507
906
  inputs: {
508
907
  runCommand: [
509
908
  '#!/bin/bash',
510
- 'curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-$(uname -m).zip -o /tmp/aws-cli.zip',
511
- 'unzip -q -d /tmp /tmp/aws-cli.zip',
512
- 'sudo /tmp/aws/install',
513
- 'rm -rf /tmp/aws',
514
- 'echo "AWS CLI installed. Checking configuration"',
515
- 'aws --version',
909
+ 'dnf install -y java-21-amazon-corretto java-17-amazon-corretto java-1.8.0-amazon-corretto maven',
910
+ `echo 'export JAVA_8_HOME=/usr/lib/jvm/java-1.8.0-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
911
+ `echo 'export JAVA_8_PATH=/usr/lib/jvm/java-1.8.0-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
912
+ `echo 'export JAVA_17_PATH=/usr/lib/jvm/java-17-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
913
+ `echo 'export JAVA_17_HOME=/usr/lib/jvm/java-17-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
914
+ `echo 'export JAVA_21_PATH=/usr/lib/jvm/java-21-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
915
+ `echo 'export JAVA_21_HOME=/usr/lib/jvm/java-21-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
916
+ `echo 'export JAVA_HOME=/usr/lib/jvm/java-21-amazon-corretto' >> /home/${vsCodeUser}/.bashrc`,
917
+ `echo 'export PATH=$PATH:$JAVA_HOME/bin:/usr/share/maven/bin' >> /home/${vsCodeUser}/.bashrc`,
918
+ `sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
919
+ 'echo "Java and Maven installed. Checking configuration"',
920
+ 'java -version 2>&1',
921
+ 'mvn --version',
516
922
  ],
517
923
  },
518
924
  },
519
925
  {
520
926
  action: 'aws:runShellScript',
521
- name: 'ConfigureCodeServer',
927
+ name: 'InstallDotnetDnf',
522
928
  inputs: {
523
929
  runCommand: [
524
930
  '#!/bin/bash',
525
- `export HOME=/home/${vsCodeUser}`,
526
- 'curl -fsSL https://code-server.dev/install.sh | bash -s -- 2>&1',
527
- `systemctl enable --now code-server@${vsCodeUser} 2>&1`,
528
- `tee /etc/nginx/conf.d/code-server.conf <<EOF
529
- server {
530
- listen 80;
531
- listen [::]:80;
532
- # server_name distribution.distributionDomainName;
533
- ${serverNameDirective}
534
- location / {
535
- proxy_pass http://localhost:8080/;
536
- proxy_set_header Host \\$host;
537
- proxy_set_header Upgrade \\$http_upgrade;
538
- proxy_set_header Connection upgrade;
539
- proxy_set_header Accept-Encoding gzip;
540
- }
541
- location /${devServerBasePath} {
542
- proxy_pass http://localhost:${devServerPort}/${devServerBasePath};
543
- proxy_set_header Host \\$host;
544
- proxy_set_header Upgrade \\$http_upgrade;
545
- proxy_set_header Connection upgrade;
546
- proxy_set_header Accept-Encoding gzip;
547
- }
548
- }
549
- EOF`,
550
- `mkdir -p /home/${vsCodeUser}/.config/code-server`,
551
- `tee /home/${vsCodeUser}/.config/code-server/config.yaml <<EOF
552
- cert: false
553
- auth: password
554
- hashed-password: "$(echo -n {{ VSCodePassword }} | argon2 $(openssl rand -base64 12) -e)"
555
- EOF`,
556
- `mkdir -p /home/${vsCodeUser}/.local/share/code-server/User/`,
557
- `touch /home/${vsCodeUser}/.hushlogin`,
558
- `mkdir -p ${homeFolder} && chown -R ${vsCodeUser}:${vsCodeUser} ${homeFolder}`,
559
- `tee /home/${vsCodeUser}/.local/share/code-server/User/settings.json <<EOF
560
- {
561
- "extensions.autoUpdate": false,
562
- "extensions.autoCheckUpdates": false,
563
- "telemetry.telemetryLevel": "off",
564
- "security.workspace.trust.startupPrompt": "never",
565
- "security.workspace.trust.enabled": false,
566
- "security.workspace.trust.banner": "never",
567
- "security.workspace.trust.emptyWindow": false,
568
- "python.testing.pytestEnabled": true,
569
- "auto-run-command.rules": [
570
- {
571
- "command": "workbench.action.terminal.new"
572
- }
573
- ]
574
- }
575
- EOF`,
576
- `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
577
- `systemctl restart code-server@${vsCodeUser}`,
578
- 'systemctl restart nginx',
579
- `sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.aws-toolkit-vscode --force`,
580
- `sudo -u ${vsCodeUser} --login code-server --install-extension AmazonWebServices.amazon-q-vscode --force`,
581
- `sudo -u ${vsCodeUser} --login code-server --install-extension synedra.auto-run-command --force`,
582
- `sudo -u ${vsCodeUser} --login code-server --install-extension vscjava.vscode-java-pack --force`,
583
- `sudo -u ${vsCodeUser} --login code-server --install-extension ms-vscode.live-server --force`,
931
+ 'dnf install -y dotnet-sdk-8.0',
932
+ 'dotnet tool install -g Microsoft.Web.LibraryManager.Cli',
933
+ `echo 'PATH=$PATH:/home/${vsCodeUser}/.dotnet/tools' >> /home/${vsCodeUser}/.bashrc`,
584
934
  `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
585
- 'echo "Nginx installed. Checking configuration"',
586
- 'nginx -t 2>&1',
587
- 'systemctl status nginx',
588
- 'echo "CodeServer installed. Checking configuration"',
589
- 'code-server -v',
590
- `systemctl status code-server@${vsCodeUser}`,
935
+ 'echo "Dotnet installed. Checking configuration"',
936
+ 'dotnet --list-sdks',
591
937
  ],
592
938
  },
593
939
  },
594
940
  {
595
941
  action: 'aws:runShellScript',
596
- name: 'UpdateProfile',
942
+ name: 'InstallDockerDnf',
597
943
  inputs: {
598
944
  runCommand: [
599
945
  '#!/bin/bash',
600
- 'echo LANG=en_US.utf-8 >> /etc/environment',
601
- 'echo LC_ALL=en_US.UTF-8 >> /etc/environment',
602
- `echo 'PATH=$PATH:/home/${vsCodeUser}/.local/bin' >> /home/${vsCodeUser}/.bashrc`,
603
- `echo 'export PATH' >> /home/${vsCodeUser}/.bashrc`,
604
- `echo 'export AWS_REGION=${core_1.Stack.of(scope).region}' >> /home/${vsCodeUser}/.bashrc`,
605
- `echo 'export AWS_ACCOUNTID=${core_1.Stack.of(scope).account}' >> /home/${vsCodeUser}/.bashrc`,
606
- `echo 'export NEXT_TELEMETRY_DISABLED=1' >> /home/${vsCodeUser}/.bashrc`,
607
- `echo "export PS1='\\[\\033[01;32m\\]\\u:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '" >> /home/${vsCodeUser}/.bashrc`,
608
- `chown -R ${vsCodeUser}:${vsCodeUser} /home/${vsCodeUser}`,
946
+ 'dnf install -y docker',
947
+ `usermod -aG docker ${vsCodeUser}`,
948
+ `systemctl restart code-server@${vsCodeUser}.service`,
949
+ 'systemctl start docker.service',
950
+ 'echo "Docker installed. Checking configuration"',
951
+ 'docker --version',
952
+ 'systemctl status docker.service',
609
953
  ],
610
954
  },
611
955
  },
612
956
  {
613
957
  action: 'aws:runShellScript',
614
- name: 'InstallCDK',
958
+ name: 'InstallGolangDnf',
615
959
  inputs: {
616
960
  runCommand: [
617
961
  '#!/bin/bash',
618
- 'npm install -g aws-cdk',
619
- 'echo "AWS CDK installed. Checking configuration"',
620
- 'cdk --version',
962
+ 'dnf install -y golang',
963
+ `echo 'PATH=$PATH:/home/${vsCodeUser}/go/bin' >> /home/${vsCodeUser}/.bashrc`,
964
+ 'echo "Golang installed. Checking configuration"',
965
+ 'go version',
621
966
  ],
622
967
  },
623
968
  },
@@ -636,7 +981,7 @@ class CustomResourceInstaller extends Installer {
636
981
  constructor(scope, options) {
637
982
  super();
638
983
  const onEvent = new installer_function_1.InstallerFunction(scope, 'InstallerOnEventHandler', {
639
- timeout: core_1.Duration.seconds(300), // TODO configurable
984
+ timeout: core_1.Duration.minutes(15), // 15 minutes to allow for VS Code Server installation
640
985
  memorySize: 512, // TODO configurable
641
986
  });
642
987
  cdk_nag_1.NagSuppressions.addResourceSuppressions([onEvent], [
@@ -664,14 +1009,26 @@ class CustomResourceInstaller extends Installer {
664
1009
  resource: 'instance',
665
1010
  resourceName: options.instanceId,
666
1011
  }, core_1.Stack.of(scope));
1012
+ // SendCommand supports resource-level permissions
667
1013
  onEvent.addToRolePolicy(new aws_iam_1.PolicyStatement({
668
- actions: [
669
- 'ssm:SendCommand',
670
- 'ssm:GetCommandInvocation',
671
- 'ssm:ListCommandInvocations',
672
- ],
1014
+ actions: ['ssm:SendCommand'],
673
1015
  resources: [documentArn, cwManageAgentArn, targetEc2InstanceArn],
674
1016
  }));
1017
+ // GetCommandInvocation and ListCommandInvocations require wildcard resources
1018
+ // They don't support resource-level permissions
1019
+ onEvent.addToRolePolicy(new aws_iam_1.PolicyStatement({
1020
+ actions: ['ssm:GetCommandInvocation', 'ssm:ListCommandInvocations'],
1021
+ resources: ['*'],
1022
+ }));
1023
+ // Suppress cdk-nag warning for wildcard permissions on GetCommandInvocation
1024
+ // These SSM actions don't support resource-level permissions per AWS documentation
1025
+ cdk_nag_1.NagSuppressions.addResourceSuppressions(onEvent, [
1026
+ {
1027
+ id: 'AwsSolutions-IAM5',
1028
+ reason: 'ssm:GetCommandInvocation and ssm:ListCommandInvocations do not support resource-level permissions and require wildcard resources',
1029
+ appliesTo: ['Resource::*'],
1030
+ },
1031
+ ], true);
675
1032
  const provider = new custom_resources_1.Provider(scope, 'InstallerProvider', {
676
1033
  onEventHandler: onEvent,
677
1034
  });
@@ -692,7 +1049,7 @@ class CustomResourceInstaller extends Installer {
692
1049
  new core_1.CustomResource(scope, 'SSMInstallerCustomResource', {
693
1050
  serviceToken: provider.serviceToken,
694
1051
  properties: {
695
- ServiceTimeout: 305, // TODO configurable
1052
+ ServiceTimeout: core_1.Duration.minutes(15).toSeconds() + 5, // Lambda timeout + 5 seconds buffer
696
1053
  InstanceId: options.instanceId,
697
1054
  DocumentName: options.documentName,
698
1055
  CloudWatchLogGroupName: options.cloudWatchLogGroupName,
@@ -702,4 +1059,4 @@ class CustomResourceInstaller extends Installer {
702
1059
  }
703
1060
  _bind() { }
704
1061
  }
705
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RhbGxlci9pbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXNEO0FBRXRELDJDQUEyQztBQUMzQywyQ0FBd0U7QUFDeEUsbUVBQXdEO0FBQ3hELHFDQUEwQztBQUUxQyw2REFBeUQ7QUFDekQsb0RBQW1EO0FBOERuRCxNQUFzQixTQUFTO0lBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBeUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFNBQVM7WUFDMUIsS0FBSyxDQUFDLEtBQWdCO2dCQUMzQixJQUFJLFlBQVksQ0FBQztnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO2dCQUM3RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQztnQkFDcEQsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZELFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUNyQyxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixPQUFPLENBQUMsVUFBVSxFQUNsQixPQUFPLENBQUMsVUFBVSxFQUNsQiwrQkFBZSxDQUFDLFNBQVMsRUFDekIsT0FBTyxDQUFDLGdCQUFnQixDQUN6QixDQUFDO29CQUNGLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSyxDQUFDO2dCQUNoQyxDQUFDO2dCQUVELE1BQU0sc0JBQXNCLEdBQzFCLE9BQU8sQ0FBQyxzQkFBc0IsSUFBSSxZQUFZLFlBQVksRUFBRSxDQUFDO2dCQUUvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHVCQUF1QixDQUFD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Yi9hd3MtaWFtJztcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBBcm4sIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW5zdGFsbGVyRnVuY3Rpb24gfSBmcm9tICcuL2luc3RhbGxlci1mdW5jdGlvbic7XG5pbXBvcnQgeyBMaW51eEZsYXZvclR5cGUgfSBmcm9tICcuLi92c2NvZGUtc2VydmVyJztcblxuaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlYzIgaW5zdGFuY2UgaWQgdG8gaW5zdGFsbCB0aGUgc3NtIGRvY3VtZW50IG9uXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gc3NtIGRvY3VtZW50IHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBzc20gZG9jdW1lbnQgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xvdWR3YXRjaCBsb2cgZ3JvdXAgZm9yIHRoZSBpbnN0YWxsIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9XG4gICAqL1xuICByZWFkb25seSBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVVc2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVQYXNzd29yZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZSBmb2xkZXIgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSByZXN0IHBhdGggdnMgY29kZSBzZXJ2ZXIgd2lsbCBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgYXBwXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdnNjb2RlciBzZXJ2ZXIgd2lsbCBiZSBzZXJ2ZWQgaW4gdGhlIGluc3RhbmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwODFcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlclBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gZG9tYWluIG5hbWUgZm9yIHRoZSBWUyBDb2RlIHNlcnZlclxuICAgKiBVc2VkIHRvIGNvbmZpZ3VyZSBuZ2lueCBzZXJ2ZXJfbmFtZSBkaXJlY3RpdmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2VzICouY2xvdWRmcm9udC5uZXQgb25seVxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRG9tYWluTmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsZXJPcHRpb25zIGV4dGVuZHMgSW5zdGFsbGVyT3B0aW9uc0Jhc2Uge31cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluc3RhbGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgdWJ1bnR1KG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMixcbiAgICAgICAgICAgIG9wdGlvbnMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IGRvY3VtZW50Lm5hbWUhO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSA9XG4gICAgICAgICAgb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lID8/IGAvYXdzL3NzbS8ke2RvY3VtZW50TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IGluc3RhbGxlciA9IG5ldyBDdXN0b21SZXNvdXJjZUluc3RhbGxlcihzY29wZSwge1xuICAgICAgICAgIGluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgICBkb2N1bWVudE5hbWU6IGRvY3VtZW50TmFtZSxcbiAgICAgICAgICBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lOiBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICAgIHZzQ29kZVVzZXI6IG9wdGlvbnMudnNDb2RlVXNlcixcbiAgICAgICAgICB2c0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgICAgICBob21lRm9sZGVyOiBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBpbnN0YWxsZXI7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgYW1hem9uTGludXgyMDIzKG9wdGlvbnM6IEluc3RhbGxlck9wdGlvbnMpOiBJbnN0YWxsZXIge1xuICAgIHJldHVybiBuZXcgKGNsYXNzIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgICAgIHB1YmxpYyBfYmluZChzY29wZTogQ29uc3RydWN0KTogSW5zdGFsbGVyIHtcbiAgICAgICAgbGV0IGRvY3VtZW50TmFtZTtcbiAgICAgICAgY29uc3QgZGV2U2VydmVyQmFzZVBhdGggPSBvcHRpb25zLmRldlNlcnZlckJhc2VQYXRoID8/ICdhcHAnO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJQb3J0ID0gb3B0aW9ucy5kZXZTZXJ2ZXJQb3J0ID8/IDgwODE7XG4gICAgICAgIGlmIChvcHRpb25zLmRvY3VtZW50TmFtZSAmJiBvcHRpb25zLmRvY3VtZW50TmFtZSAhPSAnJykge1xuICAgICAgICAgIGRvY3VtZW50TmFtZSA9IG9wdGlvbnMuZG9jdW1lbnROYW1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5jcmVhdGVTU01Eb2N1bWVudChcbiAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgZGV2U2VydmVyQmFzZVBhdGgsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJQb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgICAgb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICAgICAgTGludXhGbGF2b3JUeXBlLkFNQVpPTl9MSU5VWF8yMDIzLFxuICAgICAgICAgICAgb3B0aW9ucy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID1cbiAgICAgICAgICBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPz8gYC9hd3Mvc3NtLyR7ZG9jdW1lbnROYW1lfWA7XG5cbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyKHNjb3BlLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICAgIGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lLFxuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgICAgdnNDb2RlVXNlcjogb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgICAgIGhvbWVGb2xkZXI6IG9wdGlvbnMuaG9tZUZvbGRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIGluc3RhbmNlSWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBkb2N1bWVudE5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lITogc3RyaW5nO1xuICBwdWJsaWMgdnNDb2RlUGFzc3dvcmQhOiBzdHJpbmc7XG4gIHB1YmxpYyB2c0NvZGVQYXNzd29yZFRlc3QhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IGFueTtcblxuICBwcml2YXRlIGNyZWF0ZVNTTURvY3VtZW50KFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgZGV2U2VydmVyQmFzZVBhdGg6IHN0cmluZyxcbiAgICBkZXZTZXJ2ZXJQb3J0OiBudW1iZXIsXG4gICAgdnNDb2RlVXNlcjogc3RyaW5nLFxuICAgIGhvbWVGb2xkZXI6IHN0cmluZyxcbiAgICBsaW51eEZsYXZvcjogTGludXhGbGF2b3JUeXBlLFxuICAgIGN1c3RvbURvbWFpbk5hbWU/OiBzdHJpbmcsXG4gICk6IHNzbS5DZm5Eb2N1bWVudCB7XG4gICAgLy8gR2VuZXJhdGUgbmdpbnggc2VydmVyX25hbWUgZGlyZWN0aXZlIGJhc2VkIG9uIGN1c3RvbSBkb21haW5cbiAgICBjb25zdCBzZXJ2ZXJOYW1lRGlyZWN0aXZlID0gY3VzdG9tRG9tYWluTmFtZVxuICAgICAgPyBgc2VydmVyX25hbWUgKi5jbG91ZGZyb250Lm5ldCAke2N1c3RvbURvbWFpbk5hbWV9O2BcbiAgICAgIDogJ3NlcnZlcl9uYW1lICouY2xvdWRmcm9udC5uZXQ7JztcblxuICAgIGxldCBzc21Eb2N1bWVudDogc3NtLkNmbkRvY3VtZW50O1xuICAgIHN3aXRjaCAobGludXhGbGF2b3IpIHtcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yMjpcbiAgICAgIGNhc2UgTGludXhGbGF2b3JUeXBlLlVCVU5UVV8yNDpcbiAgICAgICAgLy8gQ3JlYXRlIGFuIFNTTSBkb2N1bWVudCB3aXRoIG11bHRpcGxlIGFjdGlvbnMgdG8gaW5zdGFsbCB0aGUgc29mdHdhcmVcbiAgICAgICAgc3NtRG9jdW1lbnQgPSBuZXcgc3NtLkNmbkRvY3VtZW50KHNjb3BlLCAnc3NtLWRvY3VtZW50LXVidW50dScsIHtcbiAgICAgICAgICBuYW1lOiBgdnNjb2RlLXNlcnZlci11YnVudHUtJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfWAsXG4gICAgICAgICAgZG9jdW1lbnRUeXBlOiAnQ29tbWFuZCcsXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgc2NoZW1hVmVyc2lvbjogJzIuMicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jvb3RzdHJhcCBWU0NvZGUgY29kZS1zZXJ2ZXIgaW5zdGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBWU0NvZGVQYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN0YWNrLm9mKHNjb3BlKS5zdGFja0lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBOb2RlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcyMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWycyMicsICcyMCcsICcxOCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBEb3ROZXRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzguMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWyc4LjAnLCAnNy4wJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYWxsIG1haW5TdGVwcyBzY3JpcHRzIGFyZSBpbiBpbiAvdmFyL2xpYi9hbWF6b24vc3NtLzxpbnN0YW5jZWlkPi9kb2N1bWVudC9vcmNoZXN0cmF0aW9uLzx1dWlkPi88U3RlcE5hbWU+L19zY3JpcHQuc2hcbiAgICAgICAgICAgIG1haW5TdGVwczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOmNvbmZpZ3VyZVBhY2thZ2UnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdBbWF6b25DbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnSW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6ICdTU01Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhdGg6ICdBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50JyxcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50UGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb25maWd1cmUnLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAnZWMyJyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxDb25maWd1cmF0aW9uU291cmNlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUmVzdGFydDogJ3llcycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQXB0UGFja2FnZXNBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBhcHQtdXRpbHMnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBuZWVkcmVzdGFydCB1bmF0dGVuZGVkLXVwZ3JhZGVzJyxcbiAgICAgICAgICAgICAgICAgICAgXCJzZWQgLWkgJ3MvIyRucmNvbmZ7a2VybmVsaGludHN9ID0gLTE7LyRucmNvbmZ7a2VybmVsaGludHN9ID0gMDsvJyAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmZcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzZWQgLWkgJ3MvIyRucmNvbmZ7dmVyYm9zaXR5fSA9IDI7LyRucmNvbmZ7dmVyYm9zaXR5fSA9IDA7LycgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mXCIsXG4gICAgICAgICAgICAgICAgICAgIFwic2VkIC1pIFxcXCJzLyNcXCRucmNvbmZ7cmVzdGFydH0gPSAnaSc7L1xcJG5yY29uZntyZXN0YXJ0fSA9ICdhJzsvXFxcIiAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmZcIixcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBcHQgaGVscGVyIHBhY2thZ2VzIGFkZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY2F0IC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQmFzZVBhY2thZ2VzQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgY3VybCBnbnVwZyB3aG9pcyBhcmdvbjIgb3BlbnNzbCBsb2NhbGVzIGxvY2FsZXMtYWxsIHVuemlwIGFwdC10cmFuc3BvcnQtaHR0cHMgY2EtY2VydGlmaWNhdGVzIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIG5naW54JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0FkZFVzZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICBcImVjaG8gJ0FkZGluZyB1c2VyOiAke1ZTQ29kZVVzZXJ9J1wiLFxuICAgICAgICAgICAgICAgICAgICBgYWRkdXNlciAtLWRpc2FibGVkLXBhc3N3b3JkIC0tZ2Vjb3MgJycgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiJHt2c0NvZGVVc2VyfTp7eyBWU0NvZGVQYXNzd29yZCB9fVwiIHwgY2hwYXNzd2RgLFxuICAgICAgICAgICAgICAgICAgICBgdXNlcm1vZCAtYUcgc3VkbyAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL3N1ZG9lcnMuZC85MS12c2NvZGUtdXNlciA8PEVPRlxuJHt2c0NvZGVVc2VyfSBBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiVXNlciBhZGRlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgYGdldGVudCBwYXNzd2QgJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsTm9kZUFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdjdXJsIC1mc1NMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLXJlcG8uZ3BnLmtleSB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9ub2Rlc291cmNlLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFthcmNoPSQoZHBrZyAtLXByaW50LWFyY2hpdGVjdHVyZSkgc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3Mvbm9kZXNvdXJjZS5ncGddIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfe3sgTm9kZVZlcnNpb24gfX0ueCBub2Rpc3RybyBtYWluXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBub2RlanMnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgbnBtQGxhdGVzdCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiTm9kZSBhbmQgbnBtIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgLXYnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIC12JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IGdwZyAtLWRlYXJtb3IgLW8gL3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiZGViIFtzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9kb2NrZXItYXJjaGl2ZS1rZXlyaW5nLmdwZ10gaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3VidW50dSAkKGxzYl9yZWxlYXNlIC0tY29kZW5hbWUgLS1zaG9ydCkgc3RhYmxlXCIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb2NrZXIubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGRvY2tlci1jZSBkb2NrZXItY2UtY2xpIGNvbnRhaW5lcmQuaW8nLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfS5zZXJ2aWNlYCxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiRG9ja2VyIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY2tlciAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBkb2NrZXIuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR2l0QXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FkZC1hcHQtcmVwb3NpdG9yeSBwcGE6Z2l0LWNvcmUvcHBhJyxcbiAgICAgICAgICAgICAgICAgICAgJ2FwdC1nZXQgLXEgdXBkYXRlICYmIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IGluc3RhbGwgLXkgLXEgZ2l0JyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIHVzZXIuZW1haWwgXCIke3ZzQ29kZVVzZXJ9QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgJHt2c0NvZGVVc2VyfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dpdCAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFB5dGhvbkFwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyMiBkZWZhdWx0IGlzIFB5dGhvbiAzLjEwXG4gICAgICAgICAgICAgICAgICAgIC8vIFVidW50dSAyNCBkZWZhdWx0IGlzIFB5dGhvbiAzLjEyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGluc3RhbGxlZCBQeXRob24gdmVyc2lvbiB3aWxsIG1hcCB0byBQeXRob24zXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIHB5dGhvbjMtcGlwIHB5dGhvbjMtdmVudiBweXRob24zLWJvdG8zIHB5dGhvbjMtcHl0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2FsaWFzIHB5dGVzdD1weXRlc3QtMycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgbXVsdGlwYXRoZC5zZXJ2aWNlIHBhY2thZ2VraXQuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCB1bmF0dGVuZGVkLXVwZ3JhZGVzLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIlB5dGhvbiBhbmQgUGlwIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3BpcDMgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxBV1NDTEknLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL2F3c2NsaS1leGUtbGludXgtJCh1bmFtZSAtbSkuemlwIC1vIC90bXAvYXdzLWNsaS56aXAnLFxuICAgICAgICAgICAgICAgICAgICAndW56aXAgLXEgLWQgL3RtcCAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N1ZG8gL3RtcC9hd3MvaW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgICAgICdybSAtcmYgL3RtcC9hd3MnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFXUyBDTEkgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnYXdzIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdDb25maWd1cmVDb2RlU2VydmVyJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgYGV4cG9ydCBIT01FPS9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2NvZGUtc2VydmVyLmRldi9pbnN0YWxsLnNoIHwgYmFzaCAtcyAtLSAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICAgICAgICAgICAgYHRlZSAvZXRjL25naW54L2NvbmYuZC9jb2RlLXNlcnZlci5jb25mIDw8RU9GXG5zZXJ2ZXIge1xuICAgIGxpc3RlbiA4MDtcbiAgICBsaXN0ZW4gWzo6XTo4MDtcbiAgICAjIHNlcnZlcl9uYW1lIGRpc3RyaWJ1dGlvbi5kaXN0cmlidXRpb25Eb21haW5OYW1lO1xuICAgICR7c2VydmVyTmFtZURpcmVjdGl2ZX1cbiAgICBsb2NhdGlvbiAvIHtcbiAgICAgIHByb3h5X3Bhc3MgaHR0cDovL2xvY2FsaG9zdDo4MDgwLztcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCBcXFxcJGhvc3Q7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgXFxcXCRodHRwX3VwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQWNjZXB0LUVuY29kaW5nIGd6aXA7XG4gICAgfVxuICAgIGxvY2F0aW9uIC8ke2RldlNlcnZlckJhc2VQYXRofSB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6JHtkZXZTZXJ2ZXJQb3J0fS8ke2RldlNlcnZlckJhc2VQYXRofTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCBcXFxcJGhvc3Q7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgXFxcXCRodHRwX3VwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQWNjZXB0LUVuY29kaW5nIGd6aXA7XG4gICAgfVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlcmAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2hvbWUvJHt2c0NvZGVVc2VyfS8uY29uZmlnL2NvZGUtc2VydmVyL2NvbmZpZy55YW1sIDw8RU9GXG5jZXJ0OiBmYWxzZVxuYXV0aDogcGFzc3dvcmRcbmhhc2hlZC1wYXNzd29yZDogXCIkKGVjaG8gLW4ge3sgVlNDb2RlUGFzc3dvcmQgfX0gfCBhcmdvbjIgJChvcGVuc3NsIHJhbmQgLWJhc2U2NCAxMikgLWUpXCJcbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL2AsXG4gICAgICAgICAgICAgICAgICAgIGB0b3VjaCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5odXNobG9naW5gLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfWAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9zZXR0aW5ncy5qc29uIDw8RU9GXG57XG4gIFwiZXh0ZW5zaW9ucy5hdXRvVXBkYXRlXCI6IGZhbHNlLFxuICBcImV4dGVuc2lvbnMuYXV0b0NoZWNrVXBkYXRlc1wiOiBmYWxzZSxcbiAgXCJ0ZWxlbWV0cnkudGVsZW1ldHJ5TGV2ZWxcIjogXCJvZmZcIixcbiAgXCJzZWN1cml0eS53b3Jrc3BhY2UudHJ1c3Quc3RhcnR1cFByb21wdFwiOiBcIm5ldmVyXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmVuYWJsZWRcIjogZmFsc2UsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmJhbm5lclwiOiBcIm5ldmVyXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmVtcHR5V2luZG93XCI6IGZhbHNlLFxuICBcInB5dGhvbi50ZXN0aW5nLnB5dGVzdEVuYWJsZWRcIjogdHJ1ZSxcbiAgXCJhdXRvLXJ1bi1jb21tYW5kLnJ1bGVzXCI6IFtcbiAgICB7XG4gICAgICBcImNvbW1hbmRcIjogXCJ3b3JrYmVuY2guYWN0aW9uLnRlcm1pbmFsLm5ld1wiXG4gICAgfVxuICBdXG59XG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCBuZ2lueCcsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmF3cy10b29sa2l0LXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gQW1hem9uV2ViU2VydmljZXMuYW1hem9uLXEtdnNjb2RlIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBzeW5lZHJhLmF1dG8tcnVuLWNvbW1hbmQgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIHZzY2phdmEudnNjb2RlLWphdmEtcGFjayAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gbXMtdnNjb2RlLmxpdmUtc2VydmVyIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIk5naW54IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25naW54IC10IDI+JjEnLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHN0YXR1cyBuZ2lueCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQ29kZVNlcnZlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjb2RlLXNlcnZlciAtdicsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgc3RhdHVzIGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnVXBkYXRlUHJvZmlsZScsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIExBTkc9ZW5fVVMudXRmLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIExDX0FMTD1lbl9VUy5VVEYtOCA+PiAvZXRjL2Vudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ1BBVEg9JFBBVEg6L2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvYmluJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IFBBVEgnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgQVdTX1JFR0lPTj0ke1N0YWNrLm9mKHNjb3BlKS5yZWdpb259JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19BQ0NPVU5USUQ9JHtTdGFjay5vZihzY29wZSkuYWNjb3VudH0nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgTkVYVF9URUxFTUVUUllfRElTQUJMRUQ9MScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gXCJleHBvcnQgUFMxPSdcXFxcW1xcXFwwMzNbMDE7MzJtXFxcXF1cXFxcdTpcXFxcW1xcXFwwMzNbMDE7MzRtXFxcXF1cXFxcd1xcXFxbXFxcXDAzM1swMG1cXFxcXVxcXFwkICdcIiA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbENESycsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICducG0gaW5zdGFsbCAtZyBhd3MtY2RrJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0RLIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NkayAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMzpcbiAgICAgICAgc3NtRG9jdW1lbnQgPSBuZXcgc3NtLkNmbkRvY3VtZW50KHNjb3BlLCAnc3NtLWRvY3VtZW50LWFsMjAyMycsIHtcbiAgICAgICAgICBuYW1lOiBgdnNjb2RlLXNlcnZlci1hbDIwMjMtJHtTdGFjay5vZihzY29wZSkuc3RhY2tOYW1lfWAsXG4gICAgICAgICAgZG9jdW1lbnRUeXBlOiAnQ29tbWFuZCcsXG4gICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgc2NoZW1hVmVyc2lvbjogJzIuMicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0Jvb3RzdHJhcCBWU0NvZGUgY29kZS1zZXJ2ZXIgaW5zdGFuY2UnLFxuICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICBWU0NvZGVQYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFN0YWNrLm9mKHNjb3BlKS5zdGFja0lkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBOb2RlVmVyc2lvbjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICcyMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWycyMicsICcyMCcsICcxOCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBEb3ROZXRWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzguMCcsXG4gICAgICAgICAgICAgICAgYWxsb3dlZFZhbHVlczogWyc4LjAnLCAnNy4wJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gYWxsIG1haW5TdGVwcyBzY3JpcHRzIGFyZSBpbiBpbiAvdmFyL2xpYi9hbWF6b24vc3NtLzxpbnN0YW5jZWlkPi9kb2N1bWVudC9vcmNoZXN0cmF0aW9uLzx1dWlkPi88U3RlcE5hbWU+L19zY3JpcHQuc2hcbiAgICAgICAgICAgIG1haW5TdGVwczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOmNvbmZpZ3VyZVBhY2thZ2UnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdBbWF6b25DbG91ZFdhdGNoQWdlbnQnLFxuICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnSW5zdGFsbCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0NvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFR5cGU6ICdTU01Eb2N1bWVudCcsXG4gICAgICAgICAgICAgICAgICBkb2N1bWVudFBhdGg6ICdBbWF6b25DbG91ZFdhdGNoLU1hbmFnZUFnZW50JyxcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50UGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjb25maWd1cmUnLFxuICAgICAgICAgICAgICAgICAgICBtb2RlOiAnZWMyJyxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxDb25maWd1cmF0aW9uU291cmNlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUmVzdGFydDogJ3llcycsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQmFzZVBhY2thZ2VzRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IC0tYWxsb3dlcmFzaW5nIHdob2lzIGFyZ29uMiB1bnppcCBuZ2lueCBjdXJsIGdudXBnIG9wZW5zc2wnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWRkVXNlckRuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdBZGRpbmcgdXNlcjogJHt2c0NvZGVVc2VyfSdgLFxuICAgICAgICAgICAgICAgICAgICBgYWRkdXNlciAtYyAnJyAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHBhc3N3ZCAtbCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gXCIke3ZzQ29kZVVzZXJ9Ont7IFZTQ29kZVBhc3N3b3JkIH19XCIgfCBjaHBhc3N3ZGAsXG4gICAgICAgICAgICAgICAgICAgIGB1c2VybW9kIC1hRyB3aGVlbCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJVc2VyIGFkZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBgZ2V0ZW50IHBhc3N3ZCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxOb2RlRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IG5vZGVqczIwIG5wbScsXG4gICAgICAgICAgICAgICAgICAgICdsbiAtcyAtZiAvdXNyL2Jpbi9ub2RlLTIwIC91c3IvYmluL25vZGUnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgbnBtQGxhdGVzdCcsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiTm9kZSBhbmQgbnBtIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ25vZGUgLXYnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIC12JyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgZG9ja2VyJyxcbiAgICAgICAgICAgICAgICAgICAgYHVzZXJtb2QgLWFHIGRvY2tlciAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkRvY2tlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdkb2NrZXIgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEdpdERuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBnaXQnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCBcIiR7dnNDb2RlVXNlcn1AZXhhbXBsZS5jb21cImAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgXCJXb3Jrc2hvcCAke3ZzQ29kZVVzZXJ9XCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgaW5pdC5kZWZhdWx0QnJhbmNoIFwibWFpblwiYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJHaXQgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZ2l0IC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsUHl0aG9uRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gQUwyMDIzIGN1cnJlbnRseSBzaGlwcyB3aXRoIFB5dGhvbiAzLjkgcHJlaW5zdGFsbGVkLCBidXQgMy4xMSBpcyBhdmFpbGFibGUgaW4gdGhlIHJlcG9zaXRvcnlcbiAgICAgICAgICAgICAgICAgICAgLy8gSW5zdGFsbCAzLjExIGFsb25nc2lkZSAzLjkgYW5kIHNldHVwIHNvbWUgYWxpYXMgc28gdGhhdCAzLjExIGlzIGxvYWRlZCB3aGVuIHBhcnRpY2lwYW50IHJ1bnMgUHl0aG9uM1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBQeXRob24gMy4xMiBiZWNvbWUgYXZhaWxhYmxlLCB1cGRhdGUgYmVsb3dcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IHB5dGhvbjMuMTEgcHl0aG9uMy4xMS1waXAgcHl0aG9uMy12aXJ0dWFsZW52IHB5dGhvbjMtcHl0ZXN0IHB5dGhvbjMtYm90bzMnLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnYWxpYXMgcHl0ZXN0PXB5dGVzdC0zJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnYWxpYXMgcHl0aG9uMz1weXRob24zLjExJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnYWxpYXMgcGlwMz1waXAzLjExJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBcImVjaG8gJ2FsaWFzPXB5dGhvbjM9cHl0aG9uMy4xMScgPj4gfi8uYmFzaHJjXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZWNobyAnYWxpYXMgcGlwMz1waXAzLjExJyA+PiB+Ly5iYXNocmNcIixcbiAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbjMuMTEgLW0gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJQeXRob24gYW5kIFBpcCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC1tIHBpcCAtLXZlcnNpb24gMj4mMScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC8vIGFkZCBnbywgZG90bmV0XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQVdTQ0xJJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9hd3NjbGkuYW1hem9uYXdzLmNvbS9hd3NjbGktZXhlLWxpbnV4LSQodW5hbWUgLW0pLnppcCAtbyAvdG1wL2F3cy1jbGkuemlwJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VuemlwIC1xIC1kIC90bXAgL3RtcC9hd3MtY2xpLnppcCcsXG4gICAgICAgICAgICAgICAgICAgICdzdWRvIC90bXAvYXdzL2luc3RhbGwnLFxuICAgICAgICAgICAgICAgICAgICAncm0gLXJmIC90bXAvYXdzJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0xJIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2F3cyAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQ29uZmlndXJlQ29kZVNlcnZlcicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgIGBleHBvcnQgSE9NRT0vaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9jb2RlLXNlcnZlci5kZXYvaW5zdGFsbC5zaCB8IGJhc2ggLXMgLS0gMj4mMScsXG4gICAgICAgICAgICAgICAgICAgIGBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0gMj4mMWAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2V0Yy9uZ2lueC9jb25mLmQvY29kZS1zZXJ2ZXIuY29uZiA8PEVPRlxuc2VydmVyIHtcbiAgICBsaXN0ZW4gODA7XG4gICAgbGlzdGVuIFs6Ol06ODA7XG4gICAgIyBzZXJ2ZXJfbmFtZSBkaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uRG9tYWluTmFtZTtcbiAgICAke3NlcnZlck5hbWVEaXJlY3RpdmV9XG4gICAgbG9jYXRpb24gLyB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC87XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbiAgICBsb2NhdGlvbiAvJHtkZXZTZXJ2ZXJCYXNlUGF0aH0ge1xuICAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7ZGV2U2VydmVyUG9ydH0vJHtkZXZTZXJ2ZXJCYXNlUGF0aH07XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEhvc3QgXFxcXCRob3N0O1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBVcGdyYWRlIFxcXFwkaHR0cF91cGdyYWRlO1xuICAgICAgcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uIHVwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIEFjY2VwdC1FbmNvZGluZyBnemlwO1xuICAgIH1cbn1cbkVPRmAsXG4gICAgICAgICAgICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5jb25maWcvY29kZS1zZXJ2ZXJgLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9gLFxuICAgICAgICAgICAgICAgICAgICBgdG91Y2ggL2hvbWUvJHt2c0NvZGVVc2VyfS8uaHVzaGxvZ2luYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvbiA8PEVPRlxue1xuICBcImV4dGVuc2lvbnMuYXV0b1VwZGF0ZVwiOiBmYWxzZSxcbiAgXCJleHRlbnNpb25zLmF1dG9DaGVja1VwZGF0ZXNcIjogZmFsc2UsXG4gIFwidGVsZW1ldHJ5LnRlbGVtZXRyeUxldmVsXCI6IFwib2ZmXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LnN0YXJ0dXBQcm9tcHRcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbmFibGVkXCI6IGZhbHNlLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5iYW5uZXJcIjogXCJuZXZlclwiLFxuICBcInNlY3VyaXR5LndvcmtzcGFjZS50cnVzdC5lbXB0eVdpbmRvd1wiOiBmYWxzZSxcbiAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWUsXG4gIFwiYXV0by1ydW4tY29tbWFuZC5ydWxlc1wiOiBbXG4gICAge1xuICAgICAgXCJjb21tYW5kXCI6IFwid29ya2JlbmNoLmFjdGlvbi50ZXJtaW5hbC5uZXdcIlxuICAgIH1cbiAgXVxufVxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHJlc3RhcnQgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBBbWF6b25XZWJTZXJ2aWNlcy5hd3MtdG9vbGtpdC12c2NvZGUgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIEFtYXpvbldlYlNlcnZpY2VzLmFtYXpvbi1xLXZzY29kZSAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gc3luZWRyYS5hdXRvLXJ1bi1jb21tYW5kIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiB2c2NqYXZhLnZzY29kZS1qYXZhLXBhY2sgLS1mb3JjZWAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXZzY29kZS5saXZlLXNlcnZlciAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOZ2lueCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICduZ2lueCAtdCAyPiYxJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgbmdpbngnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkNvZGVTZXJ2ZXIgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnY29kZS1zZXJ2ZXIgLXYnLFxuICAgICAgICAgICAgICAgICAgICBgc3lzdGVtY3RsIHN0YXR1cyBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ1VwZGF0ZVByb2ZpbGUnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQU5HPWVuX1VTLnV0Zi04ID4+IC9ldGMvZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBMQ19BTEw9ZW5fVVMuVVRGLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19SRUdJT049JHtTdGFjay5vZihzY29wZSkucmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfQUNDT1VOVElEPSR7U3RhY2sub2Yoc2NvcGUpLmFjY291bnR9JyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvIFwiZXhwb3J0IFBTMT0nXFxcXFtcXFxcMDMzWzAxOzMybVxcXFxdXFxcXHU6XFxcXFtcXFxcMDMzWzAxOzM0bVxcXFxdXFxcXHdcXFxcW1xcXFwwMzNbMDBtXFxcXF1cXFxcJCAnXCIgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxDREsnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnbnBtIGluc3RhbGwgLWcgYXdzLWNkaycsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiQVdTIENESyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjZGsgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMaW51eCBmbGF2b3I6ICR7bGludXhGbGF2b3J9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNzbURvY3VtZW50O1xuICB9XG59XG5cbmludGVyZmFjZSBDdXN0b21SZXNvdXJjZUluc3RhbGxlck9wdGlvbnMgZXh0ZW5kcyBJbnN0YWxsZXJPcHRpb25zIHt9XG5cbmNsYXNzIEN1c3RvbVJlc291cmNlSW5zdGFsbGVyIGV4dGVuZHMgSW5zdGFsbGVyIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgb3B0aW9uczogQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IG9uRXZlbnQ6IEZ1bmN0aW9uID0gbmV3IEluc3RhbGxlckZ1bmN0aW9uKFxuICAgICAgc2NvcGUsXG4gICAgICAnSW5zdGFsbGVyT25FdmVudEhhbmRsZXInLFxuICAgICAge1xuICAgICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICAgIG1lbW9yeVNpemU6IDUxMiwgLy8gVE9ETyBjb25maWd1cmFibGVcbiAgICAgIH0sXG4gICAgKTtcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBbb25FdmVudF0sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAnRm9yIHRoaXMgZXZlbnQgaGFuZGxlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUwxJyxcbiAgICAgICAgICByZWFzb246ICdGb3IgdGhpcyBsYW1iZGEgdGhlIGxhdGVzdCBydW50aW1lIGlzIG5vdCBuZWVkZWQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIGNvbnN0IGRvY3VtZW50QXJuID0gQXJuLmZvcm1hdChcbiAgICAgIHtcbiAgICAgICAgc2VydmljZTogJ3NzbScsXG4gICAgICAgIHJlc291cmNlOiAnZG9jdW1lbnQnLFxuICAgICAgICByZXNvdXJjZU5hbWU6IG9wdGlvbnMuZG9jdW1lbnROYW1lLFxuICAgICAgfSxcbiAgICAgIFN0YWNrLm9mKHNjb3BlKSxcbiAgICApO1xuXG4gICAgY29uc3QgY3dNYW5hZ2VBZ2VudEFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6ICdzc20nLFxuICAgICAgICByZXNvdXJjZTogJ2RvY3VtZW50JyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiAnQW1hem9uQ2xvdWRXYXRjaC1NYW5hZ2VBZ2VudCcsXG4gICAgICB9LFxuICAgICAgU3RhY2sub2Yoc2NvcGUpLFxuICAgICk7XG5cbiAgICBjb25zdCB0YXJnZXRFYzJJbnN0YW5jZUFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6ICdlYzInLFxuICAgICAgICByZXNvdXJjZTogJ2luc3RhbmNlJyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBvcHRpb25zLmluc3RhbmNlSWQsXG4gICAgICB9LFxuICAgICAgU3RhY2sub2Yoc2NvcGUpLFxuICAgICk7XG5cbiAgICBvbkV2ZW50LmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ3NzbTpTZW5kQ29tbWFuZCcsXG4gICAgICAgICAgJ3NzbTpHZXRDb21tYW5kSW52b2NhdGlvbicsXG4gICAgICAgICAgJ3NzbTpMaXN0Q29tbWFuZEludm9jYXRpb25zJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbZG9jdW1lbnRBcm4sIGN3TWFuYWdlQWdlbnRBcm4sIHRhcmdldEVjMkluc3RhbmNlQXJuXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcihzY29wZSwgJ0luc3RhbGxlclByb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IG9uRXZlbnQsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW3Byb3ZpZGVyXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGb3IgdGhpcyBwcm92aWRlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHdpbGRjYXJkcyBhcmUgZmluZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1MMScsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgcHJvdmlkZXIgdGhlIGxhdGVzdCBydW50aW1lIGlzIG5vdCBuZWVkZWQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZShzY29wZSwgJ1NTTUluc3RhbGxlckN1c3RvbVJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNlcnZpY2VUaW1lb3V0OiAzMDUsIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICAgIEluc3RhbmNlSWQ6IG9wdGlvbnMuaW5zdGFuY2VJZCxcbiAgICAgICAgRG9jdW1lbnROYW1lOiBvcHRpb25zLmRvY3VtZW50TmFtZSxcbiAgICAgICAgQ2xvdWRXYXRjaExvZ0dyb3VwTmFtZTogb3B0aW9ucy5jbG91ZFdhdGNoTG9nR3JvdXBOYW1lLFxuICAgICAgICBWU0NvZGVQYXNzd29yZDogb3B0aW9ucy52c0NvZGVQYXNzd29yZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgX2JpbmQoKSB7fVxufVxuIl19
1062
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luc3RhbGxlci9pbnN0YWxsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBQXNEO0FBRXRELDJDQUEyQztBQUMzQywyQ0FBd0U7QUFDeEUsbUVBQXdEO0FBQ3hELHFDQUEwQztBQUUxQyw2REFBeUQ7QUFDekQsb0RBQW1EO0FBMEduRCxNQUFzQixTQUFTO0lBQ3RCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBeUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsS0FBTSxTQUFRLFNBQVM7WUFDMUIsS0FBSyxDQUFDLEtBQWdCO2dCQUMzQixJQUFJLFlBQVksQ0FBQztnQkFDakIsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksS0FBSyxDQUFDO2dCQUM3RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQztnQkFDcEQsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxFQUFFLENBQUM7b0JBQ3ZELFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUNyQyxLQUFLLEVBQ0wsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixPQUFPLENBQUMsVUFBVSxFQUNsQixPQUFPLENBQUMsVUFBVSxFQUNsQiwrQkFBZSxDQUFDLFNBQVMsRUFDekIsT0FBTyxDQUFDLGdCQUFnQixFQUN4QixPQUFPLENBQUMsT0FBTyxFQUNmLE9BQU8sQ0FBQyxjQUFjLEVBQ3RCLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCLE9BQU8sQ0FBQyxlQUFlLENBQ3hCLENBQUM7b0JBQ0YsWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFLLENBQUM7Z0JBQ2hDLENBQUM7Z0JBRUQsTUFBTSxzQkFBc0IsR0FD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QUFPLENBQUMsVUFBVTtnQkFDOUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO2dCQUNsQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsc0JBQXNCO2dCQUN0RCxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7YUFDdkM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSyxLQUFJLENBQUM7Q0FDbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IEZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNzbSc7XG5pbXBvcnQgeyBBcm4sIEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSW5zdGFsbGVyRnVuY3Rpb24gfSBmcm9tICcuL2luc3RhbGxlci1mdW5jdGlvbic7XG5pbXBvcnQgeyBMaW51eEZsYXZvclR5cGUgfSBmcm9tICcuLi92c2NvZGUtc2VydmVyJztcblxuaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBlYzIgaW5zdGFuY2UgaWQgdG8gaW5zdGFsbCB0aGUgc3NtIGRvY3VtZW50IG9uXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gc3NtIGRvY3VtZW50IHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBzc20gZG9jdW1lbnQgb2YgdGhlIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZG9jdW1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xvdWR3YXRjaCBsb2cgZ3JvdXAgZm9yIHRoZSBpbnN0YWxsIGxvZ3NcbiAgICpcbiAgICogQGRlZmF1bHQgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9XG4gICAqL1xuICByZWFkb25seSBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVVc2VyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXNzd29yZCBvZiB0aGUgdXNlciB1bmRlciB3aGljaCB0aGUgdnNjb2RlIHNlcnZlciBydW5zXG4gICAqL1xuICByZWFkb25seSB2c0NvZGVQYXNzd29yZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9tZSBmb2xkZXIgb2YgdGhlIHVzZXIgdW5kZXIgd2hpY2ggdGhlIHZzY29kZSBzZXJ2ZXIgcnVuc1xuICAgKi9cbiAgcmVhZG9ubHkgaG9tZUZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSByZXN0IHBhdGggdnMgY29kZSBzZXJ2ZXIgd2lsbCBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgYXBwXG4gICAqL1xuICByZWFkb25seSBkZXZTZXJ2ZXJCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdnNjb2RlciBzZXJ2ZXIgd2lsbCBiZSBzZXJ2ZWQgaW4gdGhlIGluc3RhbmNlXG4gICAqXG4gICAqIEBkZWZhdWx0IDgwODFcbiAgICovXG4gIHJlYWRvbmx5IGRldlNlcnZlclBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXN0b20gZG9tYWluIG5hbWUgZm9yIHRoZSBWUyBDb2RlIHNlcnZlclxuICAgKiBVc2VkIHRvIGNvbmZpZ3VyZSBuZ2lueCBzZXJ2ZXJfbmFtZSBkaXJlY3RpdmVcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2VzICouY2xvdWRmcm9udC5uZXQgb25seVxuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tRG9tYWluTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVtb3RlIGdpdCByZXBvc2l0b3J5IFVSTCB0byBjbG9uZSBpbnRvIHRoZSBob21lIGZvbGRlci5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIHRoZSByZXBvc2l0b3J5IHdpbGwgYmUgY2xvbmVkIGludG8gdGhlIHVzZXIncyBob21lIGZvbGRlciBkdXJpbmcgaW5zdGFuY2Ugc2V0dXAuXG4gICAqIFVzZWZ1bCBmb3IgcHJlLXBvcHVsYXRpbmcgd29ya3Nob3AgZW52aXJvbm1lbnRzIHdpdGggc3RhcnRlciBjb2RlLlxuICAgKlxuICAgKiBAZXhhbXBsZSAnaHR0cHM6Ly9naXRodWIuY29tL2F3cy1zYW1wbGVzL215LXdvcmtzaG9wLXJlcG8uZ2l0J1xuICAgKiBAZGVmYXVsdCAtIG5vIHJlcG8gY2xvbmVkXG4gICAqL1xuICByZWFkb25seSByZXBvVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTMyBwYXRoIHRvIGEgemlwIGZpbGUgY29udGFpbmluZyBhc3NldHMgdG8gZXh0cmFjdCBpbnRvIHRoZSBob21lIGZvbGRlci5cbiAgICpcbiAgICogVGhlIHppcCBjb250ZW50cyB3aWxsIGJlIGV4dHJhY3RlZCB0byB0aGUgdXNlcidzIGhvbWUgZm9sZGVyIGFuZCBjb21taXR0ZWQgdG8gZ2l0LlxuICAgKiBVc2UgdGhpcyB0byBwcm92aWRlIHdvcmtzaG9wIG1hdGVyaWFscywgc2FtcGxlIGRhdGEsIG9yIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqXG4gICAqIEBleGFtcGxlICdteS13b3Jrc2hvcC1idWNrZXQvYXNzZXRzL3dvcmtzaG9wLW1hdGVyaWFscy56aXAnXG4gICAqIEBkZWZhdWx0IC0gbm8gYXNzZXRzIGRvd25sb2FkZWRcbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0WmlwUzNQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTMyBwYXRoIHRvIGEgemlwIGZpbGUgY29udGFpbmluZyBnaXQgYnJhbmNoZXMgdG8gY3JlYXRlIGluIHRoZSBob21lIGZvbGRlciByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBFYWNoIHRvcC1sZXZlbCBmb2xkZXIgaW4gdGhlIHppcCBiZWNvbWVzIGEgc2VwYXJhdGUgZ2l0IGJyYW5jaCB3aXRoIHRoYXQgZm9sZGVyJ3MgY29udGVudHMuXG4gICAqIElkZWFsIGZvciBjcmVhdGluZyBzdGVwLWJ5LXN0ZXAgd29ya3Nob3AgYnJhbmNoZXMgKGUuZy4sIHN0ZXAtMSwgc3RlcC0yLCBzb2x1dGlvbikuXG4gICAqXG4gICAqIEBleGFtcGxlICdteS13b3Jrc2hvcC1idWNrZXQvYnJhbmNoZXMvbGFiLWJyYW5jaGVzLnppcCcgKGNvbnRhaW5pbmcgZm9sZGVyczogc3RlcC0xLywgc3RlcC0yLywgc29sdXRpb24vKVxuICAgKiBAZGVmYXVsdCAtIG5vIGJyYW5jaGVzIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaFppcFMzUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUzMgcGF0aCB0byBhIHppcCBmaWxlIGNvbnRhaW5pbmcgbXVsdGlwbGUgZm9sZGVycyB0byBjcmVhdGUgYXMgc2VwYXJhdGUgZ2l0IHJlcG9zaXRvcmllcy5cbiAgICpcbiAgICogRWFjaCB0b3AtbGV2ZWwgZm9sZGVyIGluIHRoZSB6aXAgYmVjb21lcyBhIHNlcGFyYXRlIHN1YmZvbGRlciBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSxcbiAgICogaW5pdGlhbGl6ZWQgYXMgaXRzIG93biBnaXQgcmVwb3NpdG9yeS4gVXNlZnVsIGZvciBtdWx0aS1wcm9qZWN0IHdvcmtzaG9wcy5cbiAgICpcbiAgICogQGV4YW1wbGUgJ215LXdvcmtzaG9wLWJ1Y2tldC9mb2xkZXJzL3dvcmtzaG9wLXByb2plY3RzLnppcCcgKGNvbnRhaW5pbmcgZm9sZGVyczogZnJvbnRlbmQvLCBiYWNrZW5kLywgaW5mcmFzdHJ1Y3R1cmUvKVxuICAgKiBAZGVmYXVsdCAtIG5vIGZvbGRlcnMgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyWmlwUzNQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxlck9wdGlvbnMgZXh0ZW5kcyBJbnN0YWxsZXJPcHRpb25zQmFzZSB7fVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5zdGFsbGVyIHtcbiAgcHVibGljIHN0YXRpYyB1YnVudHUob3B0aW9uczogSW5zdGFsbGVyT3B0aW9ucyk6IEluc3RhbGxlciB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBJbnN0YWxsZXIge1xuICAgICAgcHVibGljIF9iaW5kKHNjb3BlOiBDb25zdHJ1Y3QpOiBJbnN0YWxsZXIge1xuICAgICAgICBsZXQgZG9jdW1lbnROYW1lO1xuICAgICAgICBjb25zdCBkZXZTZXJ2ZXJCYXNlUGF0aCA9IG9wdGlvbnMuZGV2U2VydmVyQmFzZVBhdGggPz8gJ2FwcCc7XG4gICAgICAgIGNvbnN0IGRldlNlcnZlclBvcnQgPSBvcHRpb25zLmRldlNlcnZlclBvcnQgPz8gODA4MTtcbiAgICAgICAgaWYgKG9wdGlvbnMuZG9jdW1lbnROYW1lICYmIG9wdGlvbnMuZG9jdW1lbnROYW1lICE9ICcnKSB7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gb3B0aW9ucy5kb2N1bWVudE5hbWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZVNTTURvY3VtZW50KFxuICAgICAgICAgICAgc2NvcGUsXG4gICAgICAgICAgICBkZXZTZXJ2ZXJCYXNlUGF0aCxcbiAgICAgICAgICAgIGRldlNlcnZlclBvcnQsXG4gICAgICAgICAgICBvcHRpb25zLnZzQ29kZVVzZXIsXG4gICAgICAgICAgICBvcHRpb25zLmhvbWVGb2xkZXIsXG4gICAgICAgICAgICBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzIyLFxuICAgICAgICAgICAgb3B0aW9ucy5jdXN0b21Eb21haW5OYW1lLFxuICAgICAgICAgICAgb3B0aW9ucy5yZXBvVXJsLFxuICAgICAgICAgICAgb3B0aW9ucy5hc3NldFppcFMzUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnMuYnJhbmNoWmlwUzNQYXRoLFxuICAgICAgICAgICAgb3B0aW9ucy5mb2xkZXJaaXBTM1BhdGgsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb2N1bWVudE5hbWUgPSBkb2N1bWVudC5uYW1lITtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPVxuICAgICAgICAgIG9wdGlvbnMuY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSA/PyBgL2F3cy9zc20vJHtkb2N1bWVudE5hbWV9YDtcblxuICAgICAgICBjb25zdCBpbnN0YWxsZXIgPSBuZXcgQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXIoc2NvcGUsIHtcbiAgICAgICAgICBpbnN0YW5jZUlkOiBvcHRpb25zLmluc3RhbmNlSWQsXG4gICAgICAgICAgZG9jdW1lbnROYW1lOiBkb2N1bWVudE5hbWUsXG4gICAgICAgICAgY2xvdWRXYXRjaExvZ0dyb3VwTmFtZTogY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSxcbiAgICAgICAgICB2c0NvZGVVc2VyOiBvcHRpb25zLnZzQ29kZVVzZXIsXG4gICAgICAgICAgdnNDb2RlUGFzc3dvcmQ6IG9wdGlvbnMudnNDb2RlUGFzc3dvcmQsXG4gICAgICAgICAgaG9tZUZvbGRlcjogb3B0aW9ucy5ob21lRm9sZGVyLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gaW5zdGFsbGVyO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGFtYXpvbkxpbnV4MjAyMyhvcHRpb25zOiBJbnN0YWxsZXJPcHRpb25zKTogSW5zdGFsbGVyIHtcbiAgICByZXR1cm4gbmV3IChjbGFzcyBleHRlbmRzIEluc3RhbGxlciB7XG4gICAgICBwdWJsaWMgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IEluc3RhbGxlciB7XG4gICAgICAgIGxldCBkb2N1bWVudE5hbWU7XG4gICAgICAgIGNvbnN0IGRldlNlcnZlckJhc2VQYXRoID0gb3B0aW9ucy5kZXZTZXJ2ZXJCYXNlUGF0aCA/PyAnYXBwJztcbiAgICAgICAgY29uc3QgZGV2U2VydmVyUG9ydCA9IG9wdGlvbnMuZGV2U2VydmVyUG9ydCA/PyA4MDgxO1xuICAgICAgICBpZiAob3B0aW9ucy5kb2N1bWVudE5hbWUgJiYgb3B0aW9ucy5kb2N1bWVudE5hbWUgIT0gJycpIHtcbiAgICAgICAgICBkb2N1bWVudE5hbWUgPSBvcHRpb25zLmRvY3VtZW50TmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuY3JlYXRlU1NNRG9jdW1lbnQoXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGRldlNlcnZlckJhc2VQYXRoLFxuICAgICAgICAgICAgZGV2U2VydmVyUG9ydCxcbiAgICAgICAgICAgIG9wdGlvbnMudnNDb2RlVXNlcixcbiAgICAgICAgICAgIG9wdGlvbnMuaG9tZUZvbGRlcixcbiAgICAgICAgICAgIExpbnV4Rmxhdm9yVHlwZS5BTUFaT05fTElOVVhfMjAyMyxcbiAgICAgICAgICAgIG9wdGlvbnMuY3VzdG9tRG9tYWluTmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMucmVwb1VybCxcbiAgICAgICAgICAgIG9wdGlvbnMuYXNzZXRaaXBTM1BhdGgsXG4gICAgICAgICAgICBvcHRpb25zLmJyYW5jaFppcFMzUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnMuZm9sZGVyWmlwUzNQYXRoLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZG9jdW1lbnROYW1lID0gZG9jdW1lbnQubmFtZSE7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lID1cbiAgICAgICAgICBvcHRpb25zLmNsb3VkV2F0Y2hMb2dHcm91cE5hbWUgPz8gYC9hd3Mvc3NtLyR7ZG9jdW1lbnROYW1lfWA7XG5cbiAgICAgICAgY29uc3QgaW5zdGFsbGVyID0gbmV3IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyKHNjb3BlLCB7XG4gICAgICAgICAgaW5zdGFuY2VJZDogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgICAgIGRvY3VtZW50TmFtZTogZG9jdW1lbnROYW1lLFxuICAgICAgICAgIGNsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IGNsb3VkV2F0Y2hMb2dHcm91cE5hbWUsXG4gICAgICAgICAgdnNDb2RlVXNlcjogb3B0aW9ucy52c0NvZGVVc2VyLFxuICAgICAgICAgIHZzQ29kZVBhc3N3b3JkOiBvcHRpb25zLnZzQ29kZVBhc3N3b3JkLFxuICAgICAgICAgIGhvbWVGb2xkZXI6IG9wdGlvbnMuaG9tZUZvbGRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbGxlcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG5cbiAgcHVibGljIGluc3RhbmNlSWQhOiBzdHJpbmc7XG4gIHB1YmxpYyBkb2N1bWVudE5hbWUhOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG91ZFdhdGNoTG9nR3JvdXBOYW1lITogc3RyaW5nO1xuICBwdWJsaWMgdnNDb2RlUGFzc3dvcmQhOiBzdHJpbmc7XG4gIHB1YmxpYyB2c0NvZGVQYXNzd29yZFRlc3QhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgX2JpbmQoc2NvcGU6IENvbnN0cnVjdCk6IGFueTtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgSW5zdGFsbENsb3VkV2F0Y2hBZ2VudCBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbnN0YWxsQ2xvdWRXYXRjaEFnZW50U3RlcCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6Y29uZmlndXJlUGFja2FnZScsXG4gICAgICBuYW1lOiAnSW5zdGFsbENsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgbmFtZTogJ0FtYXpvbkNsb3VkV2F0Y2hBZ2VudCcsXG4gICAgICAgIGFjdGlvbjogJ0luc3RhbGwnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIENvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudCBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb25maWd1cmVDbG91ZFdhdGNoQWdlbnRTdGVwKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5Eb2N1bWVudCcsXG4gICAgICBuYW1lOiAnQ29uZmlndXJlQ2xvdWRXYXRjaEFnZW50JyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBkb2N1bWVudFR5cGU6ICdTU01Eb2N1bWVudCcsXG4gICAgICAgIGRvY3VtZW50UGF0aDogJ0FtYXpvbkNsb3VkV2F0Y2gtTWFuYWdlQWdlbnQnLFxuICAgICAgICBkb2N1bWVudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBhY3Rpb246ICdjb25maWd1cmUnLFxuICAgICAgICAgIG1vZGU6ICdlYzInLFxuICAgICAgICAgIG9wdGlvbmFsQ29uZmlndXJhdGlvblNvdXJjZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIG9wdGlvbmFsUmVzdGFydDogJ3llcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgVXBkYXRlUHJvZmlsZSBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVQcm9maWxlU3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nLCBhY2NvdW50OiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ1VwZGF0ZVByb2ZpbGUnLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICdlY2hvIExBTkc9ZW5fVVMudXRmLTggPj4gL2V0Yy9lbnZpcm9ubWVudCcsXG4gICAgICAgICAgJ2VjaG8gTENfQUxMPWVuX1VTLlVURi04ID4+IC9ldGMvZW52aXJvbm1lbnQnLFxuICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICBgZWNobyAnZXhwb3J0IFBBVEgnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgYGVjaG8gJ2V4cG9ydCBBV1NfUkVHSU9OPSR7cmVnaW9ufScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICBgZWNobyAnZXhwb3J0IEFXU19BQ0NPVU5USUQ9JHthY2NvdW50fScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICBgZWNobyAnZXhwb3J0IE5FWFRfVEVMRU1FVFJZX0RJU0FCTEVEPTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgYGVjaG8gXCJleHBvcnQgUFMxPSdcXFxcW1xcXFwwMzNbMDE7MzJtXFxcXF1cXFxcdTpcXFxcW1xcXFwwMzNbMDE7MzRtXFxcXF1cXFxcd1xcXFxbXFxcXDAzM1swMG1cXFxcXVxcXFwkICdcIiA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgIGBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgSW5zdGFsbEFXU0NMSSBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbnN0YWxsQVdTQ0xJU3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0luc3RhbGxBV1NDTEknLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICdta2RpciAtcCAvdG1wJyxcbiAgICAgICAgICAnY3VybCAtZnNTTCBodHRwczovL2F3c2NsaS5hbWF6b25hd3MuY29tL2F3c2NsaS1leGUtbGludXgtJCh1bmFtZSAtbSkuemlwIC1vIC90bXAvYXdzLWNsaS56aXAnLFxuICAgICAgICAgIGBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9hd3MtY2xpLnppcGAsXG4gICAgICAgICAgJ3VuemlwIC1xIC1kIC90bXAgL3RtcC9hd3MtY2xpLnppcCcsXG4gICAgICAgICAgJ3N1ZG8gL3RtcC9hd3MvaW5zdGFsbCcsXG4gICAgICAgICAgJ3JtIC1yZiAvdG1wL2F3cycsXG4gICAgICAgICAgJ2VjaG8gXCJBV1MgQ0xJIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAnYXdzIC0tdmVyc2lvbicsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgQ2xvbmVSZXBvIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNsb25lUmVwb1N0ZXAodnNDb2RlVXNlcjogc3RyaW5nLCBob21lRm9sZGVyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0Nsb25lUmVwbycsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgYGlmIFtbIC16IFwie3sgUmVwb1VybCB9fVwiIF1dXG50aGVuXG4gIGVjaG8gXCJObyBSZXBvXCJcbmVsc2VcbiAgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNsb25lIHt7IFJlcG9VcmwgfX0gJHtob21lRm9sZGVyfVxuICBlY2hvIFwiUmVwbyB7eyBSZXBvVXJsIH19IGNsb25lZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiXG4gIGxzIC1sYSAke2hvbWVGb2xkZXJ9XG4gIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSByZW1vdGUgLXZcbmZpYCxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBEb3dubG9hZEFzc2V0cyBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEb3dubG9hZEFzc2V0c1N0ZXAodnNDb2RlVXNlcjogc3RyaW5nLCBob21lRm9sZGVyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0Rvd25sb2FkQXNzZXRzJyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICBgaWYgW1sgLXogXCJ7eyBBc3NldFppcFMzUGF0aCB9fVwiIF1dXG50aGVuXG4gIGVjaG8gXCJObyBhc3NldHNcIlxuZWxzZVxuICBta2RpciAtcCAke2hvbWVGb2xkZXJ9ICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAke2hvbWVGb2xkZXJ9XG4gIG1rZGlyIC1wIC90bXBcbiAgYXdzIHMzIGNwIHMzOi8ve3sgQXNzZXRaaXBTM1BhdGggfX0gL3RtcC9hc3NldC56aXBcbiAgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvYXNzZXQuemlwXG4gIHVuemlwIC1vIC90bXAvYXNzZXQuemlwIC1kICR7aG9tZUZvbGRlcn1cbiAgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1cbiAgaWYgIFtbIC1kICR7aG9tZUZvbGRlcn0vLmdpdCBdXVxuICB0aGVuXG4gICAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGFkZCAuXG4gICAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGNvbW1pdCAtbSAnY2hvcmU6IHdvcmtzaG9wIGNvbW1pdCdcbiAgZWxzZVxuICAgIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBpbml0XG4gICAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGFkZCAuXG4gICAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGNvbW1pdCAtbSAnY2hvcmU6IGluaXRpYWwgY29tbWl0J1xuICBmaVxuICBlY2hvIFwiQXNzZXRzIGRvd25sb2FkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb246ICR7aG9tZUZvbGRlcn1cIlxuICBscyAtbGEgJHtob21lRm9sZGVyfVxuICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gYnJhbmNoXG5maWAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgRG93bmxvYWRGb2xkZXJzIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURvd25sb2FkRm9sZGVyc1N0ZXAodnNDb2RlVXNlcjogc3RyaW5nLCBob21lRm9sZGVyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0Rvd25sb2FkRm9sZGVycycsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgYGlmIFtbIC16IFwie3sgRm9sZGVyWmlwUzNQYXRoIH19XCIgXV1cbnRoZW5cbiAgZWNobyBcIk5vIGZvbGRlcnNcIlxuZWxzZVxuICBybSAtcmYgL3RtcC9mb2xkZXJcbiAgbWtkaXIgLXAgL3RtcC9mb2xkZXIgJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvZm9sZGVyXG4gIGF3cyBzMyBjcCBzMzovL3t7IEZvbGRlclppcFMzUGF0aCB9fSAvdG1wL2Fzc2V0LWZvbGRlci56aXBcbiAgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvYXNzZXQtZm9sZGVyLnppcFxuICB1bnppcCAtbyAvdG1wL2Fzc2V0LWZvbGRlci56aXAgLWQgL3RtcC9mb2xkZXJcbiAgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvZm9sZGVyXG4gIG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1cbiAgY2QgXCIke2hvbWVGb2xkZXJ9XCIgJiYgY2QgLi5cbiAgaWYgW1sgJChwd2QpID09ICBcIi9cIiBdXVxuICB0aGVuXG4gICAgdGFyZ2V0Um9vdEZvbGRlcj1cIlwiXG4gIGVsc2VcbiAgICB0YXJnZXRSb290Rm9sZGVyPSQocHdkKVxuICAgIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAuXG4gIGZpXG4gIGZpbmQgXCIvdG1wL2ZvbGRlclwiIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgfCB3aGlsZSByZWFkIHNvdXJjZUZvbGRlcjsgZG9cbiAgICBmb2xkZXI9XCIkKGJhc2VuYW1lICRzb3VyY2VGb2xkZXIpXCJcbiAgICBlY2hvIFwiUHJvY2Vzc2luZyBmb2xkZXI6ICRmb2xkZXJcIlxuICAgIHRhcmdldEZvbGRlcj0kdGFyZ2V0Um9vdEZvbGRlci8kZm9sZGVyXG4gICAgaWYgW1sgJHRhcmdldFJvb3RGb2xkZXIgPT0gXCJcIiBdXVxuICAgIHRoZW5cbiAgICAgIG12ICRzb3VyY2VGb2xkZXIgL1xuICAgIGVsc2VcbiAgICAgIG12ICRzb3VyY2VGb2xkZXIgJHRhcmdldFJvb3RGb2xkZXJcbiAgICBmaVxuICAgIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAkdGFyZ2V0Rm9sZGVyXG4gICAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAkdGFyZ2V0Rm9sZGVyIGluaXRcbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR0YXJnZXRGb2xkZXIgYWRkIC5cbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR0YXJnZXRGb2xkZXIgY29tbWl0IC1tIFwiY2hvcmU6IGluaXRpYWwgY29tbWl0XCJcbiAgICBlY2hvIFwiRm9sZGVyIGRvd25sb2FkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb246ICR0YXJnZXRGb2xkZXJcIlxuICAgIGxzIC1sYSAkdGFyZ2V0Rm9sZGVyXG4gIGRvbmVcbiAgcm0gLXJmIC90bXAvZm9sZGVyXG5maWAsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgSW5zdGFsbENESyBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbnN0YWxsQ0RLU3RlcCgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0luc3RhbGxDREsnLFxuICAgICAgaW5wdXRzOiB7XG4gICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICducG0gaW5zdGFsbCAtZyBhd3MtY2RrJyxcbiAgICAgICAgICAnZWNobyBcIkFXUyBDREsgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICdjZGsgLS12ZXJzaW9uJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBJbnN0YWxsUUNMSSBzdGVwIGZvciBTU00gZG9jdW1lbnRcbiAgICogVGhpcyBzdGVwIGlzIGlkZW50aWNhbCBmb3IgYm90aCBVYnVudHUgYW5kIEFtYXpvbiBMaW51eFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVJbnN0YWxsUUNMSVN0ZXAodnNDb2RlVXNlcjogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgIG5hbWU6ICdJbnN0YWxsUUNMSScsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgJ2N1cmwgLS1wcm90byBcXCc9aHR0cHNcXCcgLS10bHN2MS4yIC1zU2YgXCJodHRwczovL2Rlc2t0b3AtcmVsZWFzZS5xLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tL2xhdGVzdC9xLSQodW5hbWUgLW0pLWxpbnV4LnppcFwiIC1vIC90bXAvcS56aXAnLFxuICAgICAgICAgIGBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9xLnppcGAsXG4gICAgICAgICAgJ3VuemlwIC1xIC1kIC90bXAgL3RtcC9xLnppcCcsXG4gICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL3FgLFxuICAgICAgICAgICdjaG1vZCAreCAvdG1wL3EvaW5zdGFsbC5zaCcsXG4gICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAvdG1wL3EvaW5zdGFsbC5zaCAtLW5vLWNvbmZpcm1gLFxuICAgICAgICAgICdybSAtcmYgL3RtcC9xJyxcbiAgICAgICAgICAncSAtLXZlcnNpb24nLFxuICAgICAgICAgICdlY2hvIFwiQW1hem9uIFEgQ0xJIGluc3RhbGxlZFwiJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBJbnN0YWxsdXYgc3RlcCBmb3IgU1NNIGRvY3VtZW50XG4gICAqIFRoaXMgc3RlcCBpcyBpZGVudGljYWwgZm9yIGJvdGggVWJ1bnR1IGFuZCBBbWF6b24gTGludXhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlSW5zdGFsbHV2U3RlcCh2c0NvZGVVc2VyOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgbmFtZTogJ0luc3RhbGx1dicsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGN1cmwgLWZzU0wgaHR0cHM6Ly9hc3RyYWwuc2gvdXYvaW5zdGFsbC5zaCAtbyAvdG1wL3V2X2luc3RhbGwuc2hgLFxuICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBiYXNoIC90bXAvdXZfaW5zdGFsbC5zaGAsXG4gICAgICAgICAgYGlmIHV2IGdlbmVyYXRlLXNoZWxsLWNvbXBsZXRpb24gYmFzaCAmPi9kZXYvbnVsbDsgdGhlblxuICBlY2hvICdldmFsIFwiJCh1diBnZW5lcmF0ZS1zaGVsbC1jb21wbGV0aW9uIGJhc2gpXCInID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY1xuZmlgLFxuICAgICAgICAgIGBpZiB1dnggZ2VuZXJhdGUtc2hlbGwtY29tcGxldGlvbiBiYXNoICY+L2Rldi9udWxsOyB0aGVuXG4gIGVjaG8gJ2V2YWwgXCIkKHV2eCBnZW5lcmF0ZS1zaGVsbC1jb21wbGV0aW9uIGJhc2gpXCInID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY1xuZmlgLFxuICAgICAgICAgICdlY2hvIFwidXYgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiB1diAtLXZlcnNpb25gLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIENvbmZpZ3VyZUNvZGVTZXJ2ZXIgc3RlcCBmb3IgU1NNIGRvY3VtZW50XG4gICAqIFRoaXMgc3RlcCBpcyBpZGVudGljYWwgZm9yIGJvdGggVWJ1bnR1IGFuZCBBbWF6b24gTGludXhcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQ29uZmlndXJlQ29kZVNlcnZlclN0ZXAoXG4gICAgdnNDb2RlVXNlcjogc3RyaW5nLFxuICAgIGhvbWVGb2xkZXI6IHN0cmluZyxcbiAgICBkZXZTZXJ2ZXJCYXNlUGF0aDogc3RyaW5nLFxuICAgIGRldlNlcnZlclBvcnQ6IG51bWJlcixcbiAgICBzZXJ2ZXJOYW1lRGlyZWN0aXZlOiBzdHJpbmcsXG4gICk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICBuYW1lOiAnQ29uZmlndXJlQ29kZVNlcnZlcicsXG4gICAgICBpbnB1dHM6IHtcbiAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgYGV4cG9ydCBIT01FPS9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICdjdXJsIC1mc1NMIGh0dHBzOi8vY29kZS1zZXJ2ZXIuZGV2L2luc3RhbGwuc2ggfCBzaCAtcyAtLSAtLXZlcnNpb24gNC4xMDAuMycsXG4gICAgICAgICAgYHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfSAyPiYxYCxcbiAgICAgICAgICBgdGVlIC9ldGMvbmdpbngvY29uZi5kL2NvZGUtc2VydmVyLmNvbmYgPDxFT0ZcbnNlcnZlciB7XG4gICAgbGlzdGVuIDgwO1xuICAgIGxpc3RlbiBbOjpdOjgwO1xuICAgICMgc2VydmVyX25hbWUgXFxcXCRcXFxce0Nsb3VkRnJvbnREaXN0cmlidXRpb24uRG9tYWluTmFtZVxcXFx9O1xuICAgICR7c2VydmVyTmFtZURpcmVjdGl2ZX1cbiAgICBsb2NhdGlvbiAvIHtcbiAgICAgIHByb3h5X3Bhc3MgaHR0cDovL2xvY2FsaG9zdDo4MDgwLztcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCBcXFxcJGhvc3Q7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgXFxcXCRodHRwX3VwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQWNjZXB0LUVuY29kaW5nIGd6aXA7XG4gICAgfVxuICAgIGxvY2F0aW9uIC8ke2RldlNlcnZlckJhc2VQYXRofSB7XG4gICAgICBwcm94eV9wYXNzIGh0dHA6Ly9sb2NhbGhvc3Q6JHtkZXZTZXJ2ZXJQb3J0fS8ke2RldlNlcnZlckJhc2VQYXRofTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgSG9zdCBcXFxcJGhvc3Q7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIFVwZ3JhZGUgXFxcXCRodHRwX3VwZ3JhZGU7XG4gICAgICBwcm94eV9zZXRfaGVhZGVyIENvbm5lY3Rpb24gdXBncmFkZTtcbiAgICAgIHByb3h5X3NldF9oZWFkZXIgQWNjZXB0LUVuY29kaW5nIGd6aXA7XG4gICAgfVxufVxuRU9GYCxcbiAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8uY29uZmlnL2NvZGUtc2VydmVyYCxcbiAgICAgICAgICBgdGVlIC9ob21lLyR7dnNDb2RlVXNlcn0vLmNvbmZpZy9jb2RlLXNlcnZlci9jb25maWcueWFtbCA8PEVPRlxuY2VydDogZmFsc2VcbmF1dGg6IHBhc3N3b3JkXG5oYXNoZWQtcGFzc3dvcmQ6IFwiJChlY2hvIC1uIHt7IFZTQ29kZVBhc3N3b3JkIH19IHwgYXJnb24yICQob3BlbnNzbCByYW5kIC1iYXNlNjQgMTIpIC1lKVwiXG5FT0ZgLFxuICAgICAgICAgIGBta2RpciAtcCAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL2AsXG4gICAgICAgICAgYHRvdWNoIC9ob21lLyR7dnNDb2RlVXNlcn0vLmh1c2hsb2dpbmAsXG4gICAgICAgICAgYG1rZGlyIC1wICR7aG9tZUZvbGRlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9ICR7aG9tZUZvbGRlcn1gLFxuICAgICAgICAgIGB0ZWUgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9zZXR0aW5ncy5qc29uIDw8RU9GXG57XG4gIFwiZXh0ZW5zaW9ucy5hdXRvVXBkYXRlXCI6IGZhbHNlLFxuICBcImV4dGVuc2lvbnMuYXV0b0NoZWNrVXBkYXRlc1wiOiBmYWxzZSxcbiAgXCJ0ZWxlbWV0cnkudGVsZW1ldHJ5TGV2ZWxcIjogXCJvZmZcIixcbiAgXCJzZWN1cml0eS53b3Jrc3BhY2UudHJ1c3Quc3RhcnR1cFByb21wdFwiOiBcIm5ldmVyXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmVuYWJsZWRcIjogZmFsc2UsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmJhbm5lclwiOiBcIm5ldmVyXCIsXG4gIFwic2VjdXJpdHkud29ya3NwYWNlLnRydXN0LmVtcHR5V2luZG93XCI6IGZhbHNlLFxuICBcImF1dG8tcnVuLWNvbW1hbmQucnVsZXNcIjogW1xuICAgIHtcbiAgICAgIFwiY29tbWFuZFwiOiBcIndvcmtiZW5jaC5hY3Rpb24udGVybWluYWwubmV3XCJcbiAgICB9XG4gIF1cbn1cbkVPRmAsXG4gICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICBgc3lzdGVtY3RsIHJlc3RhcnQgY29kZS1zZXJ2ZXJAJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgJ3N5c3RlbWN0bCByZXN0YXJ0IG5naW54JyxcbiAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBBbWF6b25XZWJTZXJ2aWNlcy5hd3MtdG9vbGtpdC12c2NvZGUgLS1mb3JjZWAsXG4gICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gQW1hem9uV2ViU2VydmljZXMuYW1hem9uLXEtdnNjb2RlIC0tZm9yY2VgLFxuICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIG1zLXZzY29kZS5saXZlLXNlcnZlciAtLWZvcmNlYCxcbiAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBzeW5lZHJhLmF1dG8tcnVuLWNvbW1hbmQgLS1mb3JjZWAsXG4gICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAnZWNobyBcIk5naW54IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAnbmdpbnggLXQgMj4mMScsXG4gICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgbmdpbngnLFxuICAgICAgICAgICdlY2hvIFwiQ29kZVNlcnZlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgJ2NvZGUtc2VydmVyIC12JyxcbiAgICAgICAgICBgc3lzdGVtY3RsIHN0YXR1cyBjb2RlLXNlcnZlckAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBEb3dubG9hZEJyYW5jaGVzIHN0ZXAgZm9yIFNTTSBkb2N1bWVudFxuICAgKiBUaGlzIHN0ZXAgaXMgaWRlbnRpY2FsIGZvciBib3RoIFVidW50dSBhbmQgQW1hem9uIExpbnV4XG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURvd25sb2FkQnJhbmNoZXNTdGVwKHZzQ29kZVVzZXI6IHN0cmluZywgaG9tZUZvbGRlcjogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgIG5hbWU6ICdEb3dubG9hZEJyYW5jaGVzJyxcbiAgICAgIGlucHV0czoge1xuICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICBgaWYgW1sgLXogXCJ7eyBCcmFuY2haaXBTM1BhdGggfX1cIiBdXVxudGhlblxuICBlY2hvIFwiTm8gYnJhbmNoZXNcIlxuZWxzZVxuICBybSAtcmYgL3RtcC9icmFuY2hcbiAgcm0gLXJmIC90bXAvZ2l0XG4gIG1rZGlyIC1wIC90bXAvYnJhbmNoICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvdG1wL2JyYW5jaFxuICBta2RpciAtcCAvdG1wL2dpdCAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9naXRcbiAgYXdzIHMzIGNwIHMzOi8ve3sgQnJhbmNoWmlwUzNQYXRoIH19IC90bXAvYXNzZXQtYnJhbmNoLnppcFxuICBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9hc3NldC1icmFuY2guemlwXG4gIHVuemlwIC1vIC90bXAvYXNzZXQtYnJhbmNoLnppcCAtZCAvdG1wL2JyYW5jaFxuICBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9icmFuY2hcbiAgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gaW5pdFxuICBtdiAke2hvbWVGb2xkZXJ9Ly5naXQgL3RtcC9naXRcbiAgcm0gLXJmICR7aG9tZUZvbGRlcn1cbiAgbWtkaXIgLXAgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICBtdiAvdG1wL2dpdC8uZ2l0ICR7aG9tZUZvbGRlcn1cbiAgZmluZCAvdG1wL2JyYW5jaCAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIHwgd2hpbGUgcmVhZCBzb3VyY2VGb2xkZXI7IGRvXG4gICAgYnJhbmNoPVwiJChiYXNlbmFtZSAkc291cmNlRm9sZGVyKVwiXG4gICAgZWNobyBcIlByb2Nlc3NpbmcgYnJhbmNoOiAkYnJhbmNoXCJcbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gY2hlY2tvdXQgLWIgJGJyYW5jaCAyPiYxXG4gICAgY3AgLWEgJHNvdXJjZUZvbGRlci8uICR7aG9tZUZvbGRlcn1cbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gYWRkIC5cbiAgICBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IC1DICR7aG9tZUZvbGRlcn0gY29tbWl0IC1tIFwiY2hvcmU6IGluaXRpYWwgY29tbWl0ICRicmFuY2hcIlxuICAgIG12ICR7aG9tZUZvbGRlcn0vLmdpdCAvdG1wL2dpdFxuICAgIHJtIC1yZiAke2hvbWVGb2xkZXJ9XG4gICAgbWtkaXIgJHtob21lRm9sZGVyfSAmJiBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gJHtob21lRm9sZGVyfVxuICAgIG12IC90bXAvZ2l0Ly5naXQgJHtob21lRm9sZGVyfVxuICBkb25lXG4gIHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgLUMgJHtob21lRm9sZGVyfSBjaGVja291dCBtYWluIDI+JjFcbiAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IHJlc3RvcmUgLlxuICBybSAtcmYgL3RtcC9icmFuY2hcbiAgcm0gLXJmIC90bXAvZ2l0XG4gIGVjaG8gXCJCcmFuY2hlcyBkb3dubG9hZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uOiAke2hvbWVGb2xkZXJ9XCJcbiAgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCAtQyAke2hvbWVGb2xkZXJ9IGJyYW5jaFxuICBscyAtbGEgJHtob21lRm9sZGVyfVxuZmlgLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTU01Eb2N1bWVudChcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGRldlNlcnZlckJhc2VQYXRoOiBzdHJpbmcsXG4gICAgZGV2U2VydmVyUG9ydDogbnVtYmVyLFxuICAgIHZzQ29kZVVzZXI6IHN0cmluZyxcbiAgICBob21lRm9sZGVyOiBzdHJpbmcsXG4gICAgbGludXhGbGF2b3I6IExpbnV4Rmxhdm9yVHlwZSxcbiAgICBjdXN0b21Eb21haW5OYW1lPzogc3RyaW5nLFxuICAgIHJlcG9Vcmw/OiBzdHJpbmcsXG4gICAgYXNzZXRaaXBTM1BhdGg/OiBzdHJpbmcsXG4gICAgYnJhbmNoWmlwUzNQYXRoPzogc3RyaW5nLFxuICAgIGZvbGRlclppcFMzUGF0aD86IHN0cmluZyxcbiAgKTogc3NtLkNmbkRvY3VtZW50IHtcbiAgICAvLyBHZW5lcmF0ZSBuZ2lueCBzZXJ2ZXJfbmFtZSBkaXJlY3RpdmUgYmFzZWQgb24gY3VzdG9tIGRvbWFpblxuICAgIGNvbnN0IHNlcnZlck5hbWVEaXJlY3RpdmUgPSBjdXN0b21Eb21haW5OYW1lXG4gICAgICA/IGBzZXJ2ZXJfbmFtZSAqLmNsb3VkZnJvbnQubmV0ICR7Y3VzdG9tRG9tYWluTmFtZX07YFxuICAgICAgOiAnc2VydmVyX25hbWUgKi5jbG91ZGZyb250Lm5ldDsnO1xuXG4gICAgbGV0IHNzbURvY3VtZW50OiBzc20uQ2ZuRG9jdW1lbnQ7XG4gICAgc3dpdGNoIChsaW51eEZsYXZvcikge1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzIyOlxuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuVUJVTlRVXzI0OlxuICAgICAgICAvLyBDcmVhdGUgYW4gU1NNIGRvY3VtZW50IHdpdGggbXVsdGlwbGUgYWN0aW9ucyB0byBpbnN0YWxsIHRoZSBzb2Z0d2FyZVxuICAgICAgICBzc21Eb2N1bWVudCA9IG5ldyBzc20uQ2ZuRG9jdW1lbnQoc2NvcGUsICdzc20tZG9jdW1lbnQtdWJ1bnR1Jywge1xuICAgICAgICAgIG5hbWU6IGB2c2NvZGUtc2VydmVyLXVidW50dS0ke1N0YWNrLm9mKHNjb3BlKS5zdGFja05hbWV9YCxcbiAgICAgICAgICBkb2N1bWVudFR5cGU6ICdDb21tYW5kJyxcbiAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICBzY2hlbWFWZXJzaW9uOiAnMi4yJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQm9vdHN0cmFwIFZTQ29kZSBjb2RlLXNlcnZlciBpbnN0YW5jZScsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgIFZTQ29kZVBhc3N3b3JkOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogU3RhY2sub2Yoc2NvcGUpLnN0YWNrSWQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIE5vZGVWZXJzaW9uOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogJzIyJyxcbiAgICAgICAgICAgICAgICBhbGxvd2VkVmFsdWVzOiBbJzI0JywgJzIyJywgJzIwJywgJzE4J10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFJlcG9Vcmw6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXBvVXJsID8/ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBBc3NldFppcFMzUGF0aDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFzc2V0WmlwUzNQYXRoID8/ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBCcmFuY2haaXBTM1BhdGg6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmFuY2haaXBTM1BhdGggPz8gJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEZvbGRlclppcFMzUGF0aDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZvbGRlclppcFMzUGF0aCA/PyAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyBhbGwgbWFpblN0ZXBzIHNjcmlwdHMgYXJlIGluIGluIC92YXIvbGliL2FtYXpvbi9zc20vPGluc3RhbmNlaWQ+L2RvY3VtZW50L29yY2hlc3RyYXRpb24vPHV1aWQ+LzxTdGVwTmFtZT4vX3NjcmlwdC5zaFxuICAgICAgICAgICAgbWFpblN0ZXBzOiBbXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5zdGFsbENsb3VkV2F0Y2hBZ2VudFN0ZXAoKSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDb25maWd1cmVDbG91ZFdhdGNoQWdlbnRTdGVwKCksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsQXB0UGFja2FnZXNBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGFwdC11dGlscycsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIG5lZWRyZXN0YXJ0IHVuYXR0ZW5kZWQtdXBncmFkZXMnLFxuICAgICAgICAgICAgICAgICAgICBcInNlZCAtaSAncy8jJG5yY29uZntrZXJuZWxoaW50c30gPSAtMTsvJG5yY29uZntrZXJuZWxoaW50c30gPSAwOy8nIC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZlwiLFxuICAgICAgICAgICAgICAgICAgICBcInNlZCAtaSAncy8jJG5yY29uZnt2ZXJib3NpdHl9ID0gMjsvJG5yY29uZnt2ZXJib3NpdHl9ID0gMDsvJyAvZXRjL25lZWRyZXN0YXJ0L25lZWRyZXN0YXJ0LmNvbmZcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzZWQgLWkgXFxcInMvI1xcJG5yY29uZntyZXN0YXJ0fSA9ICdpJzsvXFwkbnJjb25me3Jlc3RhcnR9ID0gJ2EnOy9cXFwiIC9ldGMvbmVlZHJlc3RhcnQvbmVlZHJlc3RhcnQuY29uZlwiLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFwdCBoZWxwZXIgcGFja2FnZXMgYWRkZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdjYXQgL2V0Yy9uZWVkcmVzdGFydC9uZWVkcmVzdGFydC5jb25mJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxCYXNlUGFja2FnZXNBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGN1cmwgZ251cGcgd2hvaXMgYXJnb24yIHVuemlwIG5naW54IG9wZW5zc2wgbG9jYWxlcyBsb2NhbGVzLWFsbCBhcHQtdHJhbnNwb3J0LWh0dHBzIGNhLWNlcnRpZmljYXRlcyBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBZGRVc2VyQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Rwa2cgLS1jb25maWd1cmUgLWEnLFxuICAgICAgICAgICAgICAgICAgICBgaWYgW1sgXCIke3ZzQ29kZVVzZXJ9XCIgPT0gXCJ1YnVudHVcIiBdXVxudGhlblxuICBlY2hvICdVc2luZyBleGlzdGluZyB1c2VyOiAke3ZzQ29kZVVzZXJ9J1xuZWxzZVxuICBlY2hvICdBZGRpbmcgdXNlcjogJHt2c0NvZGVVc2VyfSdcbiAgYWRkdXNlciAtLWRpc2FibGVkLXBhc3N3b3JkIC0tZ2Vjb3MgJycgJHt2c0NvZGVVc2VyfVxuICBlY2hvIFwiJHt2c0NvZGVVc2VyfTp7eyBWU0NvZGVQYXNzd29yZCB9fVwiIHwgY2hwYXNzd2RcbiAgdXNlcm1vZCAtYUcgc3VkbyAke3ZzQ29kZVVzZXJ9XG5maWAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2V0Yy9zdWRvZXJzLmQvOTEtdnNjb2RlLXVzZXIgPDxFT0ZcbiR7dnNDb2RlVXNlcn0gQUxMPShBTEwpIE5PUEFTU1dEOkFMTFxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wIC9ob21lLyR7dnNDb2RlVXNlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvYmluICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJVc2VyIGFkZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBgZ2V0ZW50IHBhc3N3ZCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVVcGRhdGVQcm9maWxlU3RlcCh2c0NvZGVVc2VyLCBTdGFjay5vZihzY29wZSkucmVnaW9uLCBTdGFjay5vZihzY29wZSkuYWNjb3VudCksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5zdGFsbEFXU0NMSVN0ZXAodnNDb2RlVXNlciksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR2l0QXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Rwa2cgLS1jb25maWd1cmUgLWEnLFxuICAgICAgICAgICAgICAgICAgICAnYWRkLWFwdC1yZXBvc2l0b3J5IHBwYTpnaXQtY29yZS9wcGEnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBnaXQnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5lbWFpbCBcInBhcnRpY2lwYW50QGV4YW1wbGUuY29tXCJgLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IGdpdCBjb25maWcgLS1nbG9iYWwgdXNlci5uYW1lIFwiV29ya3Nob3AgUGFydGljaXBhbnRcImAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCBpbml0LmRlZmF1bHRCcmFuY2ggXCJtYWluXCJgLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkdpdCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdnaXQgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVDbG9uZVJlcG9TdGVwKHZzQ29kZVVzZXIsIGhvbWVGb2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURvd25sb2FkQXNzZXRzU3RlcCh2c0NvZGVVc2VyLCBob21lRm9sZGVyKSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEb3dubG9hZEZvbGRlcnNTdGVwKHZzQ29kZVVzZXIsIGhvbWVGb2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURvd25sb2FkQnJhbmNoZXNTdGVwKHZzQ29kZVVzZXIsIGhvbWVGb2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbmZpZ3VyZUNvZGVTZXJ2ZXJTdGVwKHZzQ29kZVVzZXIsIGhvbWVGb2xkZXIsIGRldlNlcnZlckJhc2VQYXRoLCBkZXZTZXJ2ZXJQb3J0LCBzZXJ2ZXJOYW1lRGlyZWN0aXZlKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxOb2RlQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UtcmVwby5ncGcua2V5IHwgZ3BnIC0tZGVhcm1vciAtbyAvdXNyL3NoYXJlL2tleXJpbmdzL25vZGVzb3VyY2UuZ3BnJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJkZWIgW2FyY2g9JChkcGtnIC0tcHJpbnQtYXJjaGl0ZWN0dXJlKSBzaWduZWQtYnk9L3Vzci9zaGFyZS9rZXlyaW5ncy9ub2Rlc291cmNlLmdwZ10gaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV97eyBOb2RlVmVyc2lvbiB9fS54IG5vZGlzdHJvIG1haW5cIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIG5vZGVqcycsXG4gICAgICAgICAgICAgICAgICAgICducG0gaW5zdGFsbCAtZyBucG1AbGF0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOb2RlIGFuZCBucG0gaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnbm9kZSAtdicsXG4gICAgICAgICAgICAgICAgICAgICducG0gLXYnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbGxDREtTdGVwKCksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5zdGFsbFFDTElTdGVwKHZzQ29kZVVzZXIpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUluc3RhbGx1dlN0ZXAodnNDb2RlVXNlciksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsUHl0aG9uQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgLy8gVWJ1bnR1IDIyIGRlZmF1bHQgaXMgUHl0aG9uIDMuMTBcbiAgICAgICAgICAgICAgICAgICAgLy8gVWJ1bnR1IDI0IGRlZmF1bHQgaXMgUHl0aG9uIDMuMTJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgaW5zdGFsbGVkIFB5dGhvbiB2ZXJzaW9uIHdpbGwgbWFwIHRvIFB5dGhvbjNcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Rwa2cgLS1jb25maWd1cmUgLWEnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBweXRob24zLXBpcCBweXRob24zLXZlbnYgcHl0aG9uMy1ib3RvMyBweXRob24zLXB5dGVzdCcsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBweXRlc3Q9cHl0ZXN0LTMnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgbXVsdGlwYXRoZC5zZXJ2aWNlIHBhY2thZ2VraXQuc2VydmljZScsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgcmVzdGFydCB1bmF0dGVuZGVkLXVwZ3JhZGVzLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnc3lzdGVtY3RsIHJlc3RhcnQgbmV0d29ya2QtZGlzcGF0Y2hlci5zZXJ2aWNlJyxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gbXMtcHl0aG9uLnB5dGhvbiAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgYGlmIFsgLWYgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9zZXR0aW5ncy5qc29uIF07IHRoZW5cbiAgc2VkIC1pIFwiMmlcXFxcXFxcXCAgXFxcXFwicHl0aG9uLnRlc3RpbmcucHl0ZXN0RW5hYmxlZFxcXFxcIjogdHJ1ZSxcIiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL3NldHRpbmdzLmpzb25cbmVsc2VcbiAgZWNobyAne1xuICAgIFwicHl0aG9uLnRlc3RpbmcucHl0ZXN0RW5hYmxlZFwiOiB0cnVlXG4gIH0nID4gL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvc2hhcmUvY29kZS1zZXJ2ZXIvVXNlci9zZXR0aW5ncy5qc29uXG5maWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiUHl0aG9uIGFuZCBQaXAgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAncHl0aG9uMyAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAncGlwMyAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEphdmFBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgICdjdXJsIC1mc1NMIGh0dHBzOi8vYXB0LmNvcnJldHRvLmF3cy9jb3JyZXR0by5rZXkgfCBncGcgLS1kZWFybW9yIC1vIC91c3Ivc2hhcmUva2V5cmluZ3MvY29ycmV0dG8ta2V5cmluZy5ncGcnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcImRlYiBbc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3MvY29ycmV0dG8ta2V5cmluZy5ncGddIGh0dHBzOi8vYXB0LmNvcnJldHRvLmF3cyBzdGFibGUgbWFpblwiID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvY29ycmV0dG8ubGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICdERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCB1cGRhdGUnLFxuICAgICAgICAgICAgICAgICAgICAnREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBqYXZhLTIxLWFtYXpvbi1jb3JyZXR0by1qZGsgamF2YS0xNy1hbWF6b24tY29ycmV0dG8tamRrIGphdmEtMS44LjAtYW1hem9uLWNvcnJldHRvLWpkayBtYXZlbicsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV84X0hPTUU9JCh1cGRhdGUtYWx0ZXJuYXRpdmVzIC0tbGlzdCBqYXZhIHwgZ3JlcCBcImphdmEtMS44LjAtYW1hem9uLWNvcnJldHRvXCIgfCBoZWFkIC0xKScgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBKQVZBXzhfUEFUSD0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0xLjguMC1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMTdfUEFUSD0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0xNy1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMTdfSE9NRT0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0xNy1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMjFfUEFUSD0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0yMS1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMjFfSE9NRT0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0yMS1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfSE9NRT0kKHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1saXN0IGphdmEgfCBncmVwIFwiamF2YS0yMS1hbWF6b24tY29ycmV0dG9cIiB8IGhlYWQgLTEpJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IFBBVEg9JFBBVEg6JEpBVkFfSE9NRS9iaW46L3Vzci9zaGFyZS9tYXZlbi9iaW4nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBjb2RlLXNlcnZlciAtLWluc3RhbGwtZXh0ZW5zaW9uIHZzY2phdmEudnNjb2RlLWphdmEtcGFjayAtLWZvcmNlYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJKYXZhIGFuZCBNYXZlbiBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdqYXZhIC12ZXJzaW9uIDI+JjEnLFxuICAgICAgICAgICAgICAgICAgICAnbXZuIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICd1cGRhdGUtYWx0ZXJuYXRpdmVzIC0tbGlzdCBqYXZhJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb3RuZXRBcHQnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZHBrZyAtLWNvbmZpZ3VyZSAtYScsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGRvdG5ldC1zZGstOC4wJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvdG5ldCB0b29sIGluc3RhbGwgLWcgTWljcm9zb2Z0LldlYi5MaWJyYXJ5TWFuYWdlci5DbGknLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnUEFUSD0kUEFUSDovaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5kb3RuZXQvdG9vbHMnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL2hvbWUvJHt2c0NvZGVVc2VyfWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiRG90bmV0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RvdG5ldCAtLWxpc3Qtc2RrcycsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsRG9ja2VyQXB0JyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2N1cmwgLWZzU0wgaHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L3VidW50dS9ncGcgfCBncGcgLS1kZWFybW9yIC1vIC91c3Ivc2hhcmUva2V5cmluZ3MvZG9ja2VyLWFyY2hpdmUta2V5cmluZy5ncGcnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcImRlYiBbc2lnbmVkLWJ5PS91c3Ivc2hhcmUva2V5cmluZ3MvZG9ja2VyLWFyY2hpdmUta2V5cmluZy5ncGddIGh0dHBzOi8vZG93bmxvYWQuZG9ja2VyLmNvbS9saW51eC91YnVudHUgJChsc2JfcmVsZWFzZSAtLWNvZGVuYW1lIC0tc2hvcnQpIHN0YWJsZVwiID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG9ja2VyLmxpc3QnLFxuICAgICAgICAgICAgICAgICAgICAnYXB0LWdldCAtcSB1cGRhdGUgJiYgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgaW5zdGFsbCAteSAtcSBkb2NrZXItY2UgZG9ja2VyLWNlLWNsaSBjb250YWluZXJkLmlvJyxcbiAgICAgICAgICAgICAgICAgICAgYHVzZXJtb2QgLWFHIGRvY2tlciAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkRvY2tlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdkb2NrZXIgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEdvbGFuZ0FwdCcsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdhcHQtZ2V0IC1xIHVwZGF0ZSAmJiBERUJJQU5fRlJPTlRFTkQ9bm9uaW50ZXJhY3RpdmUgYXB0LWdldCBpbnN0YWxsIC15IC1xIGdvbGFuZycsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vZ28vYmluJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkdvbGFuZyBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdnbyB2ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMaW51eEZsYXZvclR5cGUuQU1BWk9OX0xJTlVYXzIwMjM6XG4gICAgICAgIHNzbURvY3VtZW50ID0gbmV3IHNzbS5DZm5Eb2N1bWVudChzY29wZSwgJ3NzbS1kb2N1bWVudC1hbDIwMjMnLCB7XG4gICAgICAgICAgbmFtZTogYHZzY29kZS1zZXJ2ZXItYWwyMDIzLSR7U3RhY2sub2Yoc2NvcGUpLnN0YWNrTmFtZX1gLFxuICAgICAgICAgIGRvY3VtZW50VHlwZTogJ0NvbW1hbmQnLFxuICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgIHNjaGVtYVZlcnNpb246ICcyLjInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdCb290c3RyYXAgVlNDb2RlIGNvZGUtc2VydmVyIGluc3RhbmNlJyxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgVlNDb2RlUGFzc3dvcmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBTdGFjay5vZihzY29wZSkuc3RhY2tJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgTm9kZVZlcnNpb246IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiAnMjInLFxuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFsnMjQnLCAnMjInLCAnMjAnLCAnMTgnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgUmVwb1VybDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJlcG9VcmwgPz8gJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEFzc2V0WmlwUzNQYXRoOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogYXNzZXRaaXBTM1BhdGggPz8gJycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIEJyYW5jaFppcFMzUGF0aDoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyYW5jaFppcFMzUGF0aCA/PyAnJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgRm9sZGVyWmlwUzNQYXRoOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ1N0cmluZycsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogZm9sZGVyWmlwUzNQYXRoID8/ICcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIGFsbCBtYWluU3RlcHMgc2NyaXB0cyBhcmUgaW4gaW4gL3Zhci9saWIvYW1hem9uL3NzbS88aW5zdGFuY2VpZD4vZG9jdW1lbnQvb3JjaGVzdHJhdGlvbi88dXVpZD4vPFN0ZXBOYW1lPi9fc2NyaXB0LnNoXG4gICAgICAgICAgICBtYWluU3RlcHM6IFtcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVJbnN0YWxsQ2xvdWRXYXRjaEFnZW50U3RlcCgpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNvbmZpZ3VyZUNsb3VkV2F0Y2hBZ2VudFN0ZXAoKSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxCYXNlUGFja2FnZXNEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgLS1hbGxvd2VyYXNpbmcgd2hvaXMgYXJnb24yIHVuemlwIG5naW54IGN1cmwgZ251cGcgb3BlbnNzbCcsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdBZGRVc2VyRG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgYGlmIFtbIFwiJHt2c0NvZGVVc2VyfVwiID09IFwiZWMyLXVzZXJcIiBdXVxudGhlblxuICBlY2hvICdVc2luZyBleGlzdGluZyB1c2VyOiAke3ZzQ29kZVVzZXJ9J1xuZWxzZVxuICBlY2hvICdBZGRpbmcgdXNlcjogJHt2c0NvZGVVc2VyfSdcbiAgYWRkdXNlciAtYyAnJyAke3ZzQ29kZVVzZXJ9XG4gIHBhc3N3ZCAtbCAke3ZzQ29kZVVzZXJ9XG4gIGVjaG8gXCIke3ZzQ29kZVVzZXJ9Ont7IFZTQ29kZVBhc3N3b3JkIH19XCIgfCBjaHBhc3N3ZFxuICB1c2VybW9kIC1hRyB3aGVlbCAke3ZzQ29kZVVzZXJ9XG5maWAsXG4gICAgICAgICAgICAgICAgICAgIGB0ZWUgL2V0Yy9zdWRvZXJzLmQvOTEtdnNjb2RlLXVzZXIgPDxFT0ZcbiR7dnNDb2RlVXNlcn0gQUxMPShBTEwpIE5PUEFTU1dEOkFMTFxuRU9GYCxcbiAgICAgICAgICAgICAgICAgICAgYG1rZGlyIC1wIC9ob21lLyR7dnNDb2RlVXNlcn0gJiYgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC9ob21lLyR7dnNDb2RlVXNlcn1gLFxuICAgICAgICAgICAgICAgICAgICBgbWtkaXIgLXAgL2hvbWUvJHt2c0NvZGVVc2VyfS8ubG9jYWwvYmluICYmIGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJVc2VyIGFkZGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBgZ2V0ZW50IHBhc3N3ZCAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVVcGRhdGVQcm9maWxlU3RlcCh2c0NvZGVVc2VyLCBTdGFjay5vZihzY29wZSkucmVnaW9uLCBTdGFjay5vZihzY29wZSkuYWNjb3VudCksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlSW5zdGFsbEFXU0NMSVN0ZXAodnNDb2RlVXNlciksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsR2l0RG5mJyxcbiAgICAgICAgICAgICAgICBpbnB1dHM6IHtcbiAgICAgICAgICAgICAgICAgIHJ1bkNvbW1hbmQ6IFtcbiAgICAgICAgICAgICAgICAgICAgJyMhL2Jpbi9iYXNoJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RuZiBpbnN0YWxsIC15IGdpdCcsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLmVtYWlsIFwicGFydGljaXBhbnRAZXhhbXBsZS5jb21cImAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gZ2l0IGNvbmZpZyAtLWdsb2JhbCB1c2VyLm5hbWUgXCJXb3Jrc2hvcCBQYXJ0aWNpcGFudFwiYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSBnaXQgY29uZmlnIC0tZ2xvYmFsIGluaXQuZGVmYXVsdEJyYW5jaCBcIm1haW5cImAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwiR2l0IGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2dpdCAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUNsb25lUmVwb1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRG93bmxvYWRBc3NldHNTdGVwKHZzQ29kZVVzZXIsIGhvbWVGb2xkZXIpLFxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURvd25sb2FkRm9sZGVyc1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlRG93bmxvYWRCcmFuY2hlc1N0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciksXG4gICAgICAgICAgICAgIHRoaXMuY3JlYXRlQ29uZmlndXJlQ29kZVNlcnZlclN0ZXAodnNDb2RlVXNlciwgaG9tZUZvbGRlciwgZGV2U2VydmVyQmFzZVBhdGgsIGRldlNlcnZlclBvcnQsIHNlcnZlck5hbWVEaXJlY3RpdmUpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbE5vZGVEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgbm9kZWpzIG5wbScsXG4gICAgICAgICAgICAgICAgICAgICducG0gaW5zdGFsbCAtZyBucG1AbGF0ZXN0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJOb2RlIGFuZCBucG0gaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnbm9kZSAtdicsXG4gICAgICAgICAgICAgICAgICAgICducG0gLXYnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbENESycsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICducG0gaW5zdGFsbCAtZyBhd3MtY2RrJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJBV1MgQ0RLIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2NkayAtLXZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbFFDTEknLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnY3VybCAtLXByb3RvIFxcJz1odHRwc1xcJyAtLXRsc3YxLjIgLXNTZiBcImh0dHBzOi8vZGVza3RvcC1yZWxlYXNlLnEudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vbGF0ZXN0L3EtJCh1bmFtZSAtbSktbGludXguemlwXCIgLW8gL3RtcC9xLnppcCcsXG4gICAgICAgICAgICAgICAgICAgIGBjaG93biAtUiAke3ZzQ29kZVVzZXJ9OiR7dnNDb2RlVXNlcn0gL3RtcC9xLnppcGAsXG4gICAgICAgICAgICAgICAgICAgICd1bnppcCAtcSAtZCAvdG1wIC90bXAvcS56aXAnLFxuICAgICAgICAgICAgICAgICAgICBgY2hvd24gLVIgJHt2c0NvZGVVc2VyfToke3ZzQ29kZVVzZXJ9IC90bXAvcWAsXG4gICAgICAgICAgICAgICAgICAgICdjaG1vZCAreCAvdG1wL3EvaW5zdGFsbC5zaCcsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gL3RtcC9xL2luc3RhbGwuc2ggLS1uby1jb25maXJtYCxcbiAgICAgICAgICAgICAgICAgICAgJ3JtIC1yZiAvdG1wL3EnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkFtYXpvbiBRIENMSSBpbnN0YWxsZWRcIicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsdXYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY3VybCAtZnNTTCBodHRwczovL2FzdHJhbC5zaC91di9pbnN0YWxsLnNoIC1vIC90bXAvdXZfaW5zdGFsbC5zaGAsXG4gICAgICAgICAgICAgICAgICAgIGBzdWRvIC11ICR7dnNDb2RlVXNlcn0gLS1sb2dpbiBiYXNoIC90bXAvdXZfaW5zdGFsbC5zaGAsXG4gICAgICAgICAgICAgICAgICAgIGBpZiB1diBnZW5lcmF0ZS1zaGVsbC1jb21wbGV0aW9uIGJhc2ggJj4vZGV2L251bGw7IHRoZW5cbiAgZWNobyAnZXZhbCBcIiQodXYgZ2VuZXJhdGUtc2hlbGwtY29tcGxldGlvbiBiYXNoKVwiJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNcbmZpYCxcbiAgICAgICAgICAgICAgICAgICAgYGlmIHV2eCBnZW5lcmF0ZS1zaGVsbC1jb21wbGV0aW9uIGJhc2ggJj4vZGV2L251bGw7IHRoZW5cbiAgZWNobyAnZXZhbCBcIiQodXZ4IGdlbmVyYXRlLXNoZWxsLWNvbXBsZXRpb24gYmFzaClcIicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjXG5maWAsXG4gICAgICAgICAgICAgICAgICAgICdlY2hvIFwidXYgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gdXYgLS12ZXJzaW9uYCxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxQeXRob25EbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAvLyBBTDIwMjMgY3VycmVudGx5IHNoaXBzIHdpdGggUHl0aG9uIDMuOSBwcmVpbnN0YWxsZWQsIGJ1dCAzLjExIGlzIGF2YWlsYWJsZSBpbiB0aGUgcmVwb3NpdG9yeVxuICAgICAgICAgICAgICAgICAgICAvLyBJbnN0YWxsIDMuMTEgYWxvbmdzaWRlIDMuOSBhbmQgc2V0dXAgc29tZSBhbGlhcyBzbyB0aGF0IDMuMTEgaXMgbG9hZGVkIHdoZW4gcGFydGljaXBhbnQgcnVucyBQeXRob24zXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIFB5dGhvbiAzLjEyIGJlY29tZSBhdmFpbGFibGUsIHVwZGF0ZSBiZWxvd1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgcHl0aG9uMy4xMSBweXRob24zLjExLXBpcCBweXRob24zLXZpcnR1YWxlbnYgcHl0aG9uMy1weXRlc3QgcHl0aG9uMy1ib3RvMycsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBweXRlc3Q9cHl0ZXN0LTMnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBweXRob24zPXB5dGhvbjMuMTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdhbGlhcyBwaXAzPXBpcDMuMTEnID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIFwiZWNobyAnYWxpYXM9cHl0aG9uMz1weXRob24zLjExJyA+PiB+Ly5iYXNocmNcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlY2hvICdhbGlhcyBwaXAzPXBpcDMuMTEnID4+IH4vLmJhc2hyY1wiLFxuICAgICAgICAgICAgICAgICAgICAncHl0aG9uMy4xMSAtbSBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwIDI+JjEnLFxuICAgICAgICAgICAgICAgICAgICBgc3VkbyAtdSAke3ZzQ29kZVVzZXJ9IC0tbG9naW4gY29kZS1zZXJ2ZXIgLS1pbnN0YWxsLWV4dGVuc2lvbiBtcy1weXRob24ucHl0aG9uIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICBgaWYgWyAtZiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL3NldHRpbmdzLmpzb24gXTsgdGhlblxuICBzZWQgLWkgXCIyaVxcXFxcXFxcICBcXFxcXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXFxcXFwiOiB0cnVlLFwiIC9ob21lLyR7dnNDb2RlVXNlcn0vLmxvY2FsL3NoYXJlL2NvZGUtc2VydmVyL1VzZXIvc2V0dGluZ3MuanNvblxuZWxzZVxuICBlY2hvICd7XG4gICAgXCJweXRob24udGVzdGluZy5weXRlc3RFbmFibGVkXCI6IHRydWVcbiAgfScgPiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5sb2NhbC9zaGFyZS9jb2RlLXNlcnZlci9Vc2VyL3NldHRpbmdzLmpzb25cbmZpYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJQeXRob24gYW5kIFBpcCBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC0tdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICAgICdweXRob24zLjExIC1tIHBpcCAtLXZlcnNpb24gMj4mMScsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdhd3M6cnVuU2hlbGxTY3JpcHQnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdJbnN0YWxsSmF2YURuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBqYXZhLTIxLWFtYXpvbi1jb3JyZXR0byBqYXZhLTE3LWFtYXpvbi1jb3JyZXR0byBqYXZhLTEuOC4wLWFtYXpvbi1jb3JyZXR0byBtYXZlbicsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV84X0hPTUU9L3Vzci9saWIvanZtL2phdmEtMS44LjAtYW1hem9uLWNvcnJldHRvJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfOF9QQVRIPS91c3IvbGliL2p2bS9qYXZhLTEuOC4wLWFtYXpvbi1jb3JyZXR0bycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBKQVZBXzE3X1BBVEg9L3Vzci9saWIvanZtL2phdmEtMTctYW1hem9uLWNvcnJldHRvJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfMTdfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xNy1hbWF6b24tY29ycmV0dG8nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgSkFWQV8yMV9QQVRIPS91c3IvbGliL2p2bS9qYXZhLTIxLWFtYXpvbi1jb3JyZXR0bycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGVjaG8gJ2V4cG9ydCBKQVZBXzIxX0hPTUU9L3Vzci9saWIvanZtL2phdmEtMjEtYW1hem9uLWNvcnJldHRvJyA+PiAvaG9tZS8ke3ZzQ29kZVVzZXJ9Ly5iYXNocmNgLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0yMS1hbWF6b24tY29ycmV0dG8nID4+IC9ob21lLyR7dnNDb2RlVXNlcn0vLmJhc2hyY2AsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjovdXNyL3NoYXJlL21hdmVuL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYHN1ZG8gLXUgJHt2c0NvZGVVc2VyfSAtLWxvZ2luIGNvZGUtc2VydmVyIC0taW5zdGFsbC1leHRlbnNpb24gdnNjamF2YS52c2NvZGUtamF2YS1wYWNrIC0tZm9yY2VgLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkphdmEgYW5kIE1hdmVuIGluc3RhbGxlZC4gQ2hlY2tpbmcgY29uZmlndXJhdGlvblwiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2phdmEgLXZlcnNpb24gMj4mMScsXG4gICAgICAgICAgICAgICAgICAgICdtdm4gLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb3RuZXREbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgZG90bmV0LXNkay04LjAnLFxuICAgICAgICAgICAgICAgICAgICAnZG90bmV0IHRvb2wgaW5zdGFsbCAtZyBNaWNyb3NvZnQuV2ViLkxpYnJhcnlNYW5hZ2VyLkNsaScsXG4gICAgICAgICAgICAgICAgICAgIGBlY2hvICdQQVRIPSRQQVRIOi9ob21lLyR7dnNDb2RlVXNlcn0vLmRvdG5ldC90b29scycgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgYGNob3duIC1SICR7dnNDb2RlVXNlcn06JHt2c0NvZGVVc2VyfSAvaG9tZS8ke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJEb3RuZXQgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZG90bmV0IC0tbGlzdC1zZGtzJyxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2F3czpydW5TaGVsbFNjcmlwdCcsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0luc3RhbGxEb2NrZXJEbmYnLFxuICAgICAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICAgICAgcnVuQ29tbWFuZDogW1xuICAgICAgICAgICAgICAgICAgICAnIyEvYmluL2Jhc2gnLFxuICAgICAgICAgICAgICAgICAgICAnZG5mIGluc3RhbGwgLXkgZG9ja2VyJyxcbiAgICAgICAgICAgICAgICAgICAgYHVzZXJtb2QgLWFHIGRvY2tlciAke3ZzQ29kZVVzZXJ9YCxcbiAgICAgICAgICAgICAgICAgICAgYHN5c3RlbWN0bCByZXN0YXJ0IGNvZGUtc2VydmVyQCR7dnNDb2RlVXNlcn0uc2VydmljZWAsXG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW1jdGwgc3RhcnQgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgICAnZWNobyBcIkRvY2tlciBpbnN0YWxsZWQuIENoZWNraW5nIGNvbmZpZ3VyYXRpb25cIicsXG4gICAgICAgICAgICAgICAgICAgICdkb2NrZXIgLS12ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbWN0bCBzdGF0dXMgZG9ja2VyLnNlcnZpY2UnLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAnYXdzOnJ1blNoZWxsU2NyaXB0JyxcbiAgICAgICAgICAgICAgICBuYW1lOiAnSW5zdGFsbEdvbGFuZ0RuZicsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB7XG4gICAgICAgICAgICAgICAgICBydW5Db21tYW5kOiBbXG4gICAgICAgICAgICAgICAgICAgICcjIS9iaW4vYmFzaCcsXG4gICAgICAgICAgICAgICAgICAgICdkbmYgaW5zdGFsbCAteSBnb2xhbmcnLFxuICAgICAgICAgICAgICAgICAgICBgZWNobyAnUEFUSD0kUEFUSDovaG9tZS8ke3ZzQ29kZVVzZXJ9L2dvL2JpbicgPj4gL2hvbWUvJHt2c0NvZGVVc2VyfS8uYmFzaHJjYCxcbiAgICAgICAgICAgICAgICAgICAgJ2VjaG8gXCJHb2xhbmcgaW5zdGFsbGVkLiBDaGVja2luZyBjb25maWd1cmF0aW9uXCInLFxuICAgICAgICAgICAgICAgICAgICAnZ28gdmVyc2lvbicsXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgTGludXggZmxhdm9yOiAke2xpbnV4Rmxhdm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiBzc21Eb2N1bWVudDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ3VzdG9tUmVzb3VyY2VJbnN0YWxsZXJPcHRpb25zIGV4dGVuZHMgSW5zdGFsbGVyT3B0aW9ucyB7fVxuXG5jbGFzcyBDdXN0b21SZXNvdXJjZUluc3RhbGxlciBleHRlbmRzIEluc3RhbGxlciB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIG9wdGlvbnM6IEN1c3RvbVJlc291cmNlSW5zdGFsbGVyT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBvbkV2ZW50OiBGdW5jdGlvbiA9IG5ldyBJbnN0YWxsZXJGdW5jdGlvbihcbiAgICAgIHNjb3BlLFxuICAgICAgJ0luc3RhbGxlck9uRXZlbnRIYW5kbGVyJyxcbiAgICAgIHtcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxNSksIC8vIDE1IG1pbnV0ZXMgdG8gYWxsb3cgZm9yIFZTIENvZGUgU2VydmVyIGluc3RhbGxhdGlvblxuICAgICAgICBtZW1vcnlTaXplOiA1MTIsIC8vIFRPRE8gY29uZmlndXJhYmxlXG4gICAgICB9LFxuICAgICk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW29uRXZlbnRdLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0ZvciB0aGlzIGV2ZW50IGhhbmRsZXIgd2UgZG8gbm90IG5lZWQgdG8gcmVzdHJpY3QgbWFuYWdlZCBwb2xpY2llcycsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1MMScsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgbGFtYmRhIHRoZSBsYXRlc3QgcnVudGltZSBpcyBub3QgbmVlZGVkJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBjb25zdCBkb2N1bWVudEFybiA9IEFybi5mb3JtYXQoXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2U6ICdzc20nLFxuICAgICAgICByZXNvdXJjZTogJ2RvY3VtZW50JyxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBvcHRpb25zLmRvY3VtZW50TmFtZSxcbiAgICAgIH0sXG4gICAgICBTdGFjay5vZihzY29wZSksXG4gICAgKTtcblxuICAgIGNvbnN0IGN3TWFuYWdlQWdlbnRBcm4gPSBBcm4uZm9ybWF0KFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlOiAnc3NtJyxcbiAgICAgICAgcmVzb3VyY2U6ICdkb2N1bWVudCcsXG4gICAgICAgIHJlc291cmNlTmFtZTogJ0FtYXpvbkNsb3VkV2F0Y2gtTWFuYWdlQWdlbnQnLFxuICAgICAgfSxcbiAgICAgIFN0YWNrLm9mKHNjb3BlKSxcbiAgICApO1xuXG4gICAgY29uc3QgdGFyZ2V0RWMySW5zdGFuY2VBcm4gPSBBcm4uZm9ybWF0KFxuICAgICAge1xuICAgICAgICBzZXJ2aWNlOiAnZWMyJyxcbiAgICAgICAgcmVzb3VyY2U6ICdpbnN0YW5jZScsXG4gICAgICAgIHJlc291cmNlTmFtZTogb3B0aW9ucy5pbnN0YW5jZUlkLFxuICAgICAgfSxcbiAgICAgIFN0YWNrLm9mKHNjb3BlKSxcbiAgICApO1xuXG4gICAgLy8gU2VuZENvbW1hbmQgc3VwcG9ydHMgcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnNcbiAgICBvbkV2ZW50LmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbJ3NzbTpTZW5kQ29tbWFuZCddLFxuICAgICAgICByZXNvdXJjZXM6IFtkb2N1bWVudEFybiwgY3dNYW5hZ2VBZ2VudEFybiwgdGFyZ2V0RWMySW5zdGFuY2VBcm5dLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEdldENvbW1hbmRJbnZvY2F0aW9uIGFuZCBMaXN0Q29tbWFuZEludm9jYXRpb25zIHJlcXVpcmUgd2lsZGNhcmQgcmVzb3VyY2VzXG4gICAgLy8gVGhleSBkb24ndCBzdXBwb3J0IHJlc291cmNlLWxldmVsIHBlcm1pc3Npb25zXG4gICAgb25FdmVudC5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydzc206R2V0Q29tbWFuZEludm9jYXRpb24nLCAnc3NtOkxpc3RDb21tYW5kSW52b2NhdGlvbnMnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTdXBwcmVzcyBjZGstbmFnIHdhcm5pbmcgZm9yIHdpbGRjYXJkIHBlcm1pc3Npb25zIG9uIEdldENvbW1hbmRJbnZvY2F0aW9uXG4gICAgLy8gVGhlc2UgU1NNIGFjdGlvbnMgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9ucyBwZXIgQVdTIGRvY3VtZW50YXRpb25cbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICBvbkV2ZW50LFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ3NzbTpHZXRDb21tYW5kSW52b2NhdGlvbiBhbmQgc3NtOkxpc3RDb21tYW5kSW52b2NhdGlvbnMgZG8gbm90IHN1cHBvcnQgcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMgYW5kIHJlcXVpcmUgd2lsZGNhcmQgcmVzb3VyY2VzJyxcbiAgICAgICAgICBhcHBsaWVzVG86IFsnUmVzb3VyY2U6OionXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB0cnVlLFxuICAgICk7XG5cbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcihzY29wZSwgJ0luc3RhbGxlclByb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IG9uRXZlbnQsXG4gICAgfSk7XG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgW3Byb3ZpZGVyXSxcbiAgICAgIFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdGb3IgdGhpcyBwcm92aWRlciB3ZSBkbyBub3QgbmVlZCB0byByZXN0cmljdCBtYW5hZ2VkIHBvbGljaWVzJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICAgIHJlYXNvbjogJ0ZvciB0aGlzIHByb3ZpZGVyIHdpbGRjYXJkcyBhcmUgZmluZScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1MMScsXG4gICAgICAgICAgcmVhc29uOiAnRm9yIHRoaXMgcHJvdmlkZXIgdGhlIGxhdGVzdCBydW50aW1lIGlzIG5vdCBuZWVkZWQnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcblxuICAgIG5ldyBDdXN0b21SZXNvdXJjZShzY29wZSwgJ1NTTUluc3RhbGxlckN1c3RvbVJlc291cmNlJywge1xuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIFNlcnZpY2VUaW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KS50b1NlY29uZHMoKSArIDUsIC8vIExhbWJkYSB0aW1lb3V0ICsgNSBzZWNvbmRzIGJ1ZmZlclxuICAgICAgICBJbnN0YW5jZUlkOiBvcHRpb25zLmluc3RhbmNlSWQsXG4gICAgICAgIERvY3VtZW50TmFtZTogb3B0aW9ucy5kb2N1bWVudE5hbWUsXG4gICAgICAgIENsb3VkV2F0Y2hMb2dHcm91cE5hbWU6IG9wdGlvbnMuY2xvdWRXYXRjaExvZ0dyb3VwTmFtZSxcbiAgICAgICAgVlNDb2RlUGFzc3dvcmQ6IG9wdGlvbnMudnNDb2RlUGFzc3dvcmQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIF9iaW5kKCkge31cbn1cbiJdfQ==