projen 0.103.7 → 0.103.8

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 (172) hide show
  1. package/.jsii +5427 -19
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/cdktn/cdktn-app-ts.js +1 -1
  33. package/lib/cdktn/cdktn-config.js +1 -1
  34. package/lib/cdktn/cdktn-construct.js +1 -1
  35. package/lib/cdktn/cdktn-deps.js +1 -1
  36. package/lib/cdktn/cdktn-tasks.js +1 -1
  37. package/lib/circleci/circleci.js +1 -1
  38. package/lib/component.js +2 -2
  39. package/lib/dependencies.js +1 -1
  40. package/lib/dev-env.js +1 -1
  41. package/lib/docker-compose/docker-compose-service.js +1 -1
  42. package/lib/docker-compose/docker-compose.js +1 -1
  43. package/lib/file.js +1 -1
  44. package/lib/gitattributes.js +1 -1
  45. package/lib/github/actions-provider.js +1 -1
  46. package/lib/github/auto-approve.js +1 -1
  47. package/lib/github/auto-merge.js +1 -1
  48. package/lib/github/auto-queue.js +1 -1
  49. package/lib/github/dependabot.js +1 -1
  50. package/lib/github/dependency-review.js +1 -1
  51. package/lib/github/github-credentials.js +1 -1
  52. package/lib/github/github-project.js +1 -1
  53. package/lib/github/github.js +1 -1
  54. package/lib/github/merge-queue.js +1 -1
  55. package/lib/github/mergify.js +1 -1
  56. package/lib/github/pr-template.js +1 -1
  57. package/lib/github/pull-request-backport.js +1 -1
  58. package/lib/github/pull-request-lint.js +1 -1
  59. package/lib/github/stale.js +1 -1
  60. package/lib/github/task-workflow-job.js +1 -1
  61. package/lib/github/task-workflow.js +1 -1
  62. package/lib/github/workflow-actions.js +1 -1
  63. package/lib/github/workflow-jobs.js +1 -1
  64. package/lib/github/workflow-steps.js +1 -1
  65. package/lib/github/workflows.js +1 -1
  66. package/lib/gitlab/configuration.js +1 -1
  67. package/lib/gitlab/gitlab-configuration.js +1 -1
  68. package/lib/gitlab/nested-configuration.js +1 -1
  69. package/lib/gitpod.js +1 -1
  70. package/lib/ignore-file.js +1 -1
  71. package/lib/index.d.ts +1 -0
  72. package/lib/index.js +3 -2
  73. package/lib/ini.js +1 -1
  74. package/lib/java/java-project.js +1 -1
  75. package/lib/java/junit.js +1 -1
  76. package/lib/java/maven-compile.js +1 -1
  77. package/lib/java/maven-packaging.js +1 -1
  78. package/lib/java/maven-sample.js +1 -1
  79. package/lib/java/pom.js +2 -2
  80. package/lib/java/projenrc.js +1 -1
  81. package/lib/javascript/biome/biome.js +1 -1
  82. package/lib/javascript/bundler.js +1 -1
  83. package/lib/javascript/eslint.js +1 -1
  84. package/lib/javascript/jest.js +4 -4
  85. package/lib/javascript/license-checker.js +1 -1
  86. package/lib/javascript/node-config-file.js +1 -1
  87. package/lib/javascript/node-package.js +1 -1
  88. package/lib/javascript/node-project.js +1 -1
  89. package/lib/javascript/npm-config.js +1 -1
  90. package/lib/javascript/pnpm-workspace-config.js +2 -2
  91. package/lib/javascript/pnpm-workspace.js +1 -1
  92. package/lib/javascript/prettier.js +1 -1
  93. package/lib/javascript/projenrc.js +1 -1
  94. package/lib/javascript/typescript-config.js +2 -2
  95. package/lib/javascript/upgrade-dependencies.js +2 -2
  96. package/lib/javascript/yarnrc.js +1 -1
  97. package/lib/json-patch.js +1 -1
  98. package/lib/json.js +1 -1
  99. package/lib/license.js +1 -1
  100. package/lib/logger.js +1 -1
  101. package/lib/makefile.js +1 -1
  102. package/lib/object-file.js +1 -1
  103. package/lib/polaris/coverity-config.d.ts +1614 -0
  104. package/lib/polaris/coverity-config.js +886 -0
  105. package/lib/polaris/coverity-go.d.ts +32 -0
  106. package/lib/polaris/coverity-go.js +52 -0
  107. package/lib/polaris/coverity-java.d.ts +33 -0
  108. package/lib/polaris/coverity-java.js +54 -0
  109. package/lib/polaris/coverity-javascript.d.ts +32 -0
  110. package/lib/polaris/coverity-javascript.js +46 -0
  111. package/lib/polaris/coverity.d.ts +22 -0
  112. package/lib/polaris/coverity.js +37 -0
  113. package/lib/polaris/index.d.ts +5 -0
  114. package/lib/polaris/index.js +22 -0
  115. package/lib/project-build.js +1 -1
  116. package/lib/project-tree.js +1 -1
  117. package/lib/project.js +1 -1
  118. package/lib/projects.js +1 -1
  119. package/lib/projenrc-json.js +1 -1
  120. package/lib/projenrc.js +1 -1
  121. package/lib/properties-file.js +1 -1
  122. package/lib/python/pip.js +1 -1
  123. package/lib/python/poetry.js +2 -2
  124. package/lib/python/projenrc.js +1 -1
  125. package/lib/python/pyproject-toml-file.js +1 -1
  126. package/lib/python/pytest-sample.js +1 -1
  127. package/lib/python/pytest.js +1 -1
  128. package/lib/python/python-project.js +1 -1
  129. package/lib/python/python-sample.js +1 -1
  130. package/lib/python/requirements-file.js +1 -1
  131. package/lib/python/setuppy.js +1 -1
  132. package/lib/python/setuptools.js +1 -1
  133. package/lib/python/uv-config.js +1 -1
  134. package/lib/python/uv.js +1 -1
  135. package/lib/python/venv.js +1 -1
  136. package/lib/readme.js +1 -1
  137. package/lib/release/publisher.js +1 -1
  138. package/lib/release/release-trigger.js +1 -1
  139. package/lib/release/release.js +1 -1
  140. package/lib/renovatebot.js +1 -1
  141. package/lib/run-task.cjs +3 -1
  142. package/lib/sample-file.js +2 -2
  143. package/lib/script-runner.js +1 -1
  144. package/lib/sonarqube/javascript.js +1 -1
  145. package/lib/sonarqube/rust.js +1 -1
  146. package/lib/sonarqube/sonarqube.js +1 -1
  147. package/lib/sonarqube/typescript.js +1 -1
  148. package/lib/source-code.js +1 -1
  149. package/lib/task-shell.js +1 -1
  150. package/lib/task.js +1 -1
  151. package/lib/tasks.js +1 -1
  152. package/lib/testing.js +1 -1
  153. package/lib/textfile.js +1 -1
  154. package/lib/toml.js +1 -1
  155. package/lib/typescript/projenrc-ts.js +1 -1
  156. package/lib/typescript/projenrc.js +1 -1
  157. package/lib/typescript/typescript-runner.js +1 -1
  158. package/lib/typescript/typescript-typedoc.js +1 -1
  159. package/lib/typescript/typescript.js +5 -5
  160. package/lib/version.js +2 -2
  161. package/lib/vscode/devcontainer.js +1 -1
  162. package/lib/vscode/extensions.js +1 -1
  163. package/lib/vscode/launch-config.js +1 -1
  164. package/lib/vscode/settings.js +1 -1
  165. package/lib/vscode/vscode.js +1 -1
  166. package/lib/web/next.js +3 -3
  167. package/lib/web/postcss.js +1 -1
  168. package/lib/web/react.js +3 -3
  169. package/lib/web/tailwind.js +1 -1
  170. package/lib/xmlfile.js +1 -1
  171. package/lib/yaml.js +1 -1
  172. package/package.json +3 -1
@@ -0,0 +1,886 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DirectivesConfigurationConfigType = exports.CheckerConfigurationWebappSecurityAggressivenessLevel = exports.CommitConfigurationLocalFormat = exports.CommitConfigurationConnectUploadArtifacts = exports.CommitConfigurationConnectScm = exports.CommitConfigurationConnectOnNewCert = exports.LanguagesConfigurationInclude = exports.LanguagesConfigurationExclude = exports.SigmaConfigurationEnableCheckSet = exports.AnalyzeConnectConfigurationUploadArtifacts = exports.AnalysisConfigurationMode = exports.AnalysisConfigurationLocation = exports.AnalysisConfigurationAggressivenessLevel = void 0;
4
+ exports.toJson_PolarisCoveritySchema = toJson_PolarisCoveritySchema;
5
+ exports.toJson_AnalysisConfiguration = toJson_AnalysisConfiguration;
6
+ exports.toJson_CachingConfiguration = toJson_CachingConfiguration;
7
+ exports.toJson_CaptureConfiguration = toJson_CaptureConfiguration;
8
+ exports.toJson_CommitConfiguration = toJson_CommitConfiguration;
9
+ exports.toJson_CheckerConfiguration = toJson_CheckerConfiguration;
10
+ exports.toJson_CodingStandardConfiguration = toJson_CodingStandardConfiguration;
11
+ exports.toJson_AnalyzeConnectConfiguration = toJson_AnalyzeConnectConfiguration;
12
+ exports.toJson_DirectivesConfiguration = toJson_DirectivesConfiguration;
13
+ exports.toJson_AnalyzeFilesConfiguration = toJson_AnalyzeFilesConfiguration;
14
+ exports.toJson_JobsConfiguration = toJson_JobsConfiguration;
15
+ exports.toJson_ParseWarningsConfiguration = toJson_ParseWarningsConfiguration;
16
+ exports.toJson_SigmaConfiguration = toJson_SigmaConfiguration;
17
+ exports.toJson_CompilerConfiguration = toJson_CompilerConfiguration;
18
+ exports.toJson_CovTranslateConfiguration = toJson_CovTranslateConfiguration;
19
+ exports.toJson_FilesConfiguration = toJson_FilesConfiguration;
20
+ exports.toJson_LanguagesConfiguration = toJson_LanguagesConfiguration;
21
+ exports.toJson_ImportScmConfiguration = toJson_ImportScmConfiguration;
22
+ exports.toJson_BuildConfiguration = toJson_BuildConfiguration;
23
+ exports.toJson_CommitConfigurationConnect = toJson_CommitConfigurationConnect;
24
+ exports.toJson_CommitConfigurationSrm = toJson_CommitConfigurationSrm;
25
+ exports.toJson_CommitConfigurationLocal = toJson_CommitConfigurationLocal;
26
+ exports.toJson_CheckerConfigurationWebappSecurity = toJson_CheckerConfigurationWebappSecurity;
27
+ exports.toJson_SpecificCodingStandardConfiguration = toJson_SpecificCodingStandardConfiguration;
28
+ exports.toJson_DirectivesConfigurationConfig = toJson_DirectivesConfigurationConfig;
29
+ exports.toJson_ParallelTranslateConfiguration = toJson_ParallelTranslateConfiguration;
30
+ exports.toJson_WebappArchiveConfiguration = toJson_WebappArchiveConfiguration;
31
+ exports.toJson_SnapshotConfiguration = toJson_SnapshotConfiguration;
32
+ exports.toJson_CommitConfigurationConnectTriage = toJson_CommitConfigurationConnectTriage;
33
+ exports.toJson_ResolvedCodingStandardConfiguration = toJson_ResolvedCodingStandardConfiguration;
34
+ exports.toJson_CodingStandardDeviation = toJson_CodingStandardDeviation;
35
+ /**
36
+ * Converts an object of type 'PolarisCoveritySchema' to JSON representation.
37
+ * @internal
38
+ */
39
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
40
+ function toJson_PolarisCoveritySchema(obj) {
41
+ if (obj === undefined) {
42
+ return undefined;
43
+ }
44
+ const result = {
45
+ 'analyze': toJson_AnalysisConfiguration(obj.analyze),
46
+ 'caching': toJson_CachingConfiguration(obj.caching),
47
+ 'capture': toJson_CaptureConfiguration(obj.capture),
48
+ 'commit': toJson_CommitConfiguration(obj.commit),
49
+ 'version': obj.version,
50
+ };
51
+ // filter undefined values
52
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
53
+ }
54
+ /**
55
+ * Converts an object of type 'AnalysisConfiguration' to JSON representation.
56
+ * @internal
57
+ */
58
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
59
+ function toJson_AnalysisConfiguration(obj) {
60
+ if (obj === undefined) {
61
+ return undefined;
62
+ }
63
+ const result = {
64
+ 'aggressiveness-level': obj.aggressivenessLevel,
65
+ 'c-cpp-fnptr': obj.cCppFnptr,
66
+ 'c-cpp-virtual': obj.cCppVirtual,
67
+ 'callgraph-metrics': obj.callgraphMetrics,
68
+ 'checkers': toJson_CheckerConfiguration(obj.checkers),
69
+ 'coding-standards': toJson_CodingStandardConfiguration(obj.codingStandards),
70
+ 'connect': toJson_AnalyzeConnectConfiguration(obj.connect),
71
+ 'constraint-fpp': obj.constraintFpp,
72
+ 'cov-analyze-args': obj.covAnalyzeArgs?.map(y => y),
73
+ 'cov-collect-models-args': obj.covCollectModelsArgs?.map(y => y),
74
+ 'directives': obj.directives?.map(y => toJson_DirectivesConfiguration(y)),
75
+ 'files': toJson_AnalyzeFilesConfiguration(obj.files),
76
+ 'jobs': obj.jobs?.map(y => toJson_JobsConfiguration(y)),
77
+ 'location': obj.location,
78
+ 'mode': obj.mode,
79
+ 'model-file': obj.modelFile,
80
+ 'one-tu-per-psf': obj.oneTuPerPsf,
81
+ 'output-model-file': obj.outputModelFile,
82
+ 'parse-warnings': toJson_ParseWarningsConfiguration(obj.parseWarnings),
83
+ 'scan-transparency': obj.scanTransparency,
84
+ 'sigma': toJson_SigmaConfiguration(obj.sigma),
85
+ 'trust': obj.trust,
86
+ };
87
+ // filter undefined values
88
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
89
+ }
90
+ /**
91
+ * Converts an object of type 'CachingConfiguration' to JSON representation.
92
+ * @internal
93
+ */
94
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
95
+ function toJson_CachingConfiguration(obj) {
96
+ if (obj === undefined) {
97
+ return undefined;
98
+ }
99
+ const result = {
100
+ 'enabled': obj.enabled,
101
+ };
102
+ // filter undefined values
103
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
104
+ }
105
+ /**
106
+ * Converts an object of type 'CaptureConfiguration' to JSON representation.
107
+ * @internal
108
+ */
109
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
110
+ function toJson_CaptureConfiguration(obj) {
111
+ if (obj === undefined) {
112
+ return undefined;
113
+ }
114
+ const result = {
115
+ 'build-command-inference': obj.buildCommandInference,
116
+ 'compiler-configuration': toJson_CompilerConfiguration(obj.compilerConfiguration),
117
+ 'cov-translate': toJson_CovTranslateConfiguration(obj.covTranslate),
118
+ 'emit-complementary-info': obj.emitComplementaryInfo,
119
+ 'encoding': obj.encoding,
120
+ 'failure-threshold-percent': obj.failureThresholdPercent,
121
+ 'files': toJson_FilesConfiguration(obj.files),
122
+ 'force-dependency-resolution': obj.forceDependencyResolution,
123
+ 'languages': toJson_LanguagesConfiguration(obj.languages),
124
+ 'import-scm': toJson_ImportScmConfiguration(obj.importScm),
125
+ 'minimal-classpath-emit': obj.minimalClasspathEmit,
126
+ 'record-with-source': obj.recordWithSource,
127
+ 'security-da': obj.securityDa,
128
+ 'build-capture': toJson_BuildConfiguration(obj.buildCapture),
129
+ };
130
+ // filter undefined values
131
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
132
+ }
133
+ /**
134
+ * Converts an object of type 'CommitConfiguration' to JSON representation.
135
+ * @internal
136
+ */
137
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
138
+ function toJson_CommitConfiguration(obj) {
139
+ if (obj === undefined) {
140
+ return undefined;
141
+ }
142
+ const result = {
143
+ 'connect': toJson_CommitConfigurationConnect(obj.connect),
144
+ 'srm': toJson_CommitConfigurationSrm(obj.srm),
145
+ 'local': toJson_CommitConfigurationLocal(obj.local),
146
+ };
147
+ // filter undefined values
148
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
149
+ }
150
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
151
+ /**
152
+ * Specifies the aggressiveness level for the analysis. The aggressiveness level causes the analysis to make more or less aggressive assumptions during the analysis where the higher the aggressiveness level the more defects are reported.
153
+ *
154
+ * @schema AnalysisConfigurationAggressivenessLevel
155
+ */
156
+ var AnalysisConfigurationAggressivenessLevel;
157
+ (function (AnalysisConfigurationAggressivenessLevel) {
158
+ /** low */
159
+ AnalysisConfigurationAggressivenessLevel["LOW"] = "low";
160
+ /** medium */
161
+ AnalysisConfigurationAggressivenessLevel["MEDIUM"] = "medium";
162
+ /** high */
163
+ AnalysisConfigurationAggressivenessLevel["HIGH"] = "high";
164
+ })(AnalysisConfigurationAggressivenessLevel || (exports.AnalysisConfigurationAggressivenessLevel = AnalysisConfigurationAggressivenessLevel = {}));
165
+ /**
166
+ * Converts an object of type 'CheckerConfiguration' to JSON representation.
167
+ * @internal
168
+ */
169
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
170
+ function toJson_CheckerConfiguration(obj) {
171
+ if (obj === undefined) {
172
+ return undefined;
173
+ }
174
+ const result = {
175
+ 'all': obj.all,
176
+ 'all-security': obj.allSecurity,
177
+ 'android-security': obj.androidSecurity,
178
+ 'audit': obj.audit,
179
+ 'brakeman': obj.brakeman,
180
+ 'c-family-security': obj.cFamilySecurity,
181
+ 'checker-config': obj.checkerConfig,
182
+ 'codexm': obj.codexm?.map(y => y),
183
+ 'concurrency': obj.concurrency,
184
+ 'default': obj.default,
185
+ 'pmd': obj.pmd,
186
+ 'recommended-security-checkers': obj.recommendedSecurityCheckers,
187
+ 'rule': obj.rule,
188
+ 'webapp-security': toJson_CheckerConfigurationWebappSecurity(obj.webappSecurity),
189
+ };
190
+ // filter undefined values
191
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
192
+ }
193
+ /**
194
+ * Converts an object of type 'CodingStandardConfiguration' to JSON representation.
195
+ * @internal
196
+ */
197
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
198
+ function toJson_CodingStandardConfiguration(obj) {
199
+ if (obj === undefined) {
200
+ return undefined;
201
+ }
202
+ const result = {
203
+ 'autosarcpp14': toJson_SpecificCodingStandardConfiguration(obj.autosarcpp14),
204
+ 'cert-c': toJson_SpecificCodingStandardConfiguration(obj.certC),
205
+ 'cert-c-recommendation': toJson_SpecificCodingStandardConfiguration(obj.certCRecommendation),
206
+ 'cert-cpp': toJson_SpecificCodingStandardConfiguration(obj.certCpp),
207
+ 'cert-java': toJson_SpecificCodingStandardConfiguration(obj.certJava),
208
+ 'hyundai-c': toJson_SpecificCodingStandardConfiguration(obj.hyundaiC),
209
+ 'hyundai-cpp': toJson_SpecificCodingStandardConfiguration(obj.hyundaiCpp),
210
+ 'hyundai-java': toJson_SpecificCodingStandardConfiguration(obj.hyundaiJava),
211
+ 'ignore-deviated-findings': obj.ignoreDeviatedFindings,
212
+ 'iso-ts17961': toJson_SpecificCodingStandardConfiguration(obj.isoTs17961),
213
+ 'misrac2004': toJson_SpecificCodingStandardConfiguration(obj.misrac2004),
214
+ 'misrac2012': toJson_SpecificCodingStandardConfiguration(obj.misrac2012),
215
+ 'misrac2023': toJson_SpecificCodingStandardConfiguration(obj.misrac2023),
216
+ 'misracpp2008': toJson_SpecificCodingStandardConfiguration(obj.misracpp2008),
217
+ 'misracpp2023': toJson_SpecificCodingStandardConfiguration(obj.misracpp2023),
218
+ };
219
+ // filter undefined values
220
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
221
+ }
222
+ /**
223
+ * Converts an object of type 'AnalyzeConnectConfiguration' to JSON representation.
224
+ * @internal
225
+ */
226
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
227
+ function toJson_AnalyzeConnectConfiguration(obj) {
228
+ if (obj === undefined) {
229
+ return undefined;
230
+ }
231
+ const result = {
232
+ 'auth-key-file': obj.authKeyFile,
233
+ 'ca-certs-file': obj.caCertsFile,
234
+ 'proxy-client-cert-file': obj.proxyClientCertFile,
235
+ 'proxy-client-key-file': obj.proxyClientKeyFile,
236
+ 'proxy-url': obj.proxyUrl,
237
+ 'upload-artifacts': obj.uploadArtifacts,
238
+ 'url': obj.url,
239
+ };
240
+ // filter undefined values
241
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
242
+ }
243
+ /**
244
+ * Converts an object of type 'DirectivesConfiguration' to JSON representation.
245
+ * @internal
246
+ */
247
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
248
+ function toJson_DirectivesConfiguration(obj) {
249
+ if (obj === undefined) {
250
+ return undefined;
251
+ }
252
+ const result = {
253
+ 'config': toJson_DirectivesConfigurationConfig(obj.config),
254
+ 'file': obj.file,
255
+ };
256
+ // filter undefined values
257
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
258
+ }
259
+ /**
260
+ * Converts an object of type 'AnalyzeFilesConfiguration' to JSON representation.
261
+ * @internal
262
+ */
263
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
264
+ function toJson_AnalyzeFilesConfiguration(obj) {
265
+ if (obj === undefined) {
266
+ return undefined;
267
+ }
268
+ const result = {
269
+ 'exclude-glob': obj.excludeGlob,
270
+ 'exclude-regex': obj.excludeRegex,
271
+ 'include-files': obj.includeFiles,
272
+ 'include-glob': obj.includeGlob,
273
+ 'include-list-file': obj.includeListFile,
274
+ 'include-regex': obj.includeRegex,
275
+ };
276
+ // filter undefined values
277
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
278
+ }
279
+ /**
280
+ * Converts an object of type 'JobsConfiguration' to JSON representation.
281
+ * @internal
282
+ */
283
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
284
+ function toJson_JobsConfiguration(obj) {
285
+ if (obj === undefined) {
286
+ return undefined;
287
+ }
288
+ const result = {
289
+ 'auto': obj.auto,
290
+ 'count': obj.count,
291
+ 'max': obj.max,
292
+ 'override-worker-limit': obj.overrideWorkerLimit,
293
+ };
294
+ // filter undefined values
295
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
296
+ }
297
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
298
+ /**
299
+ * Specifies whether the analysis should be done locally, in Coverity Connect, or in Software Risk Manager. The possible values are as follows: connect - Run the analysis in the Coverity Connect job farm; srm - Run the analysis in the Software Risk Manager job farm; local - Run the analysis locally
300
+ *
301
+ * @schema AnalysisConfigurationLocation
302
+ */
303
+ var AnalysisConfigurationLocation;
304
+ (function (AnalysisConfigurationLocation) {
305
+ /** local */
306
+ AnalysisConfigurationLocation["LOCAL"] = "local";
307
+ /** connect */
308
+ AnalysisConfigurationLocation["CONNECT"] = "connect";
309
+ /** srm */
310
+ AnalysisConfigurationLocation["SRM"] = "srm";
311
+ })(AnalysisConfigurationLocation || (exports.AnalysisConfigurationLocation = AnalysisConfigurationLocation = {}));
312
+ /**
313
+ * Analysis mode: "pfi" (perfect fidelity incremental) for complete analysis; or "hfi" (high fidelity incremental) for analysis of only specific files specified by analyze.files settings, omitting any other files which may have been incidentally captured by the build. An "hfi" analysis can be faster but may produce results which are incomplete or inconsistent, due to the lack of context, and should be used only when speed is more important than accuracy.
314
+ *
315
+ * @schema AnalysisConfigurationMode
316
+ */
317
+ var AnalysisConfigurationMode;
318
+ (function (AnalysisConfigurationMode) {
319
+ /** hfi */
320
+ AnalysisConfigurationMode["HFI"] = "hfi";
321
+ /** pfi */
322
+ AnalysisConfigurationMode["PFI"] = "pfi";
323
+ })(AnalysisConfigurationMode || (exports.AnalysisConfigurationMode = AnalysisConfigurationMode = {}));
324
+ /**
325
+ * Converts an object of type 'ParseWarningsConfiguration' to JSON representation.
326
+ * @internal
327
+ */
328
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
329
+ function toJson_ParseWarningsConfiguration(obj) {
330
+ if (obj === undefined) {
331
+ return undefined;
332
+ }
333
+ const result = {
334
+ 'enabled': obj.enabled,
335
+ };
336
+ // filter undefined values
337
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
338
+ }
339
+ /**
340
+ * Converts an object of type 'SigmaConfiguration' to JSON representation.
341
+ * @internal
342
+ */
343
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
344
+ function toJson_SigmaConfiguration(obj) {
345
+ if (obj === undefined) {
346
+ return undefined;
347
+ }
348
+ const result = {
349
+ 'enable-check-set': obj.enableCheckSet?.map(y => y),
350
+ 'malicious-url-patterns-file': obj.maliciousUrlPatternsFile?.map(y => y),
351
+ };
352
+ // filter undefined values
353
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
354
+ }
355
+ /**
356
+ * Converts an object of type 'CompilerConfiguration' to JSON representation.
357
+ * @internal
358
+ */
359
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
360
+ function toJson_CompilerConfiguration(obj) {
361
+ if (obj === undefined) {
362
+ return undefined;
363
+ }
364
+ const result = {
365
+ 'cov-configure': obj.covConfigure?.map(y => y?.map(y => y)),
366
+ 'file': obj.file,
367
+ };
368
+ // filter undefined values
369
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
370
+ }
371
+ /**
372
+ * Converts an object of type 'CovTranslateConfiguration' to JSON representation.
373
+ * @internal
374
+ */
375
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
376
+ function toJson_CovTranslateConfiguration(obj) {
377
+ if (obj === undefined) {
378
+ return undefined;
379
+ }
380
+ const result = {
381
+ 'command': obj.command,
382
+ 'cov-build-args': obj.covBuildArgs?.map(y => y),
383
+ 'defer-decomp': obj.deferDecomp,
384
+ 'parallel-translate': toJson_ParallelTranslateConfiguration(obj.parallelTranslate),
385
+ 'scan-transparency': obj.scanTransparency,
386
+ };
387
+ // filter undefined values
388
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
389
+ }
390
+ /**
391
+ * Converts an object of type 'FilesConfiguration' to JSON representation.
392
+ * @internal
393
+ */
394
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
395
+ function toJson_FilesConfiguration(obj) {
396
+ if (obj === undefined) {
397
+ return undefined;
398
+ }
399
+ const result = {
400
+ 'emit-minified-js': obj.emitMinifiedJs,
401
+ 'exclude-glob': obj.excludeGlob,
402
+ 'exclude-regex': obj.excludeRegex,
403
+ 'include-dirs': obj.includeDirs?.map(y => y),
404
+ 'include-glob': obj.includeGlob,
405
+ 'include-list-file': obj.includeListFile,
406
+ 'include-regex': obj.includeRegex,
407
+ 'java-version': obj.javaVersion,
408
+ 'library-dirs': obj.libraryDirs?.map(y => y),
409
+ 'library-files': obj.libraryFiles?.map(y => y),
410
+ 'webapp-archives': obj.webappArchives?.map(y => toJson_WebappArchiveConfiguration(y)),
411
+ };
412
+ // filter undefined values
413
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
414
+ }
415
+ /**
416
+ * Converts an object of type 'LanguagesConfiguration' to JSON representation.
417
+ * @internal
418
+ */
419
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
420
+ function toJson_LanguagesConfiguration(obj) {
421
+ if (obj === undefined) {
422
+ return undefined;
423
+ }
424
+ const result = {
425
+ 'exclude': obj.exclude?.map(y => y),
426
+ 'include': obj.include?.map(y => y),
427
+ };
428
+ // filter undefined values
429
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
430
+ }
431
+ /**
432
+ * Converts an object of type 'ImportScmConfiguration' to JSON representation.
433
+ * @internal
434
+ */
435
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
436
+ function toJson_ImportScmConfiguration(obj) {
437
+ if (obj === undefined) {
438
+ return undefined;
439
+ }
440
+ const result = {
441
+ 'cov-import-scm-args': obj.covImportScmArgs?.map(y => y),
442
+ 'filename-regex': obj.filenameRegex,
443
+ 'ms-delay': obj.msDelay,
444
+ 'scm': obj.scm,
445
+ };
446
+ // filter undefined values
447
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
448
+ }
449
+ /**
450
+ * Converts an object of type 'BuildConfiguration' to JSON representation.
451
+ * @internal
452
+ */
453
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
454
+ function toJson_BuildConfiguration(obj) {
455
+ if (obj === undefined) {
456
+ return undefined;
457
+ }
458
+ const result = {
459
+ 'aspnet-compiler': obj.aspnetCompiler,
460
+ 'bazel': obj.bazel,
461
+ 'build-command': obj.buildCommand,
462
+ 'clean-command': obj.cleanCommand,
463
+ 'cov-build-args': obj.covBuildArgs?.map(y => y),
464
+ 'defer-decomp': obj.deferDecomp,
465
+ 'instrument': obj.instrument,
466
+ 'parallel-translate': toJson_ParallelTranslateConfiguration(obj.parallelTranslate),
467
+ 'scan-transparency': obj.scanTransparency,
468
+ };
469
+ // filter undefined values
470
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
471
+ }
472
+ /**
473
+ * Converts an object of type 'CommitConfigurationConnect' to JSON representation.
474
+ * @internal
475
+ */
476
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
477
+ function toJson_CommitConfigurationConnect(obj) {
478
+ if (obj === undefined) {
479
+ return undefined;
480
+ }
481
+ const result = {
482
+ 'auth-key-file': obj.authKeyFile,
483
+ 'ca-certs-file': obj.caCertsFile,
484
+ 'comparison-only': obj.comparisonOnly,
485
+ 'comparison-report': obj.comparisonReport,
486
+ 'cov-commit-defects-args': obj.covCommitDefectsArgs?.map(y => y),
487
+ 'description': obj.description,
488
+ 'on-new-cert': obj.onNewCert,
489
+ 'project': obj.project,
490
+ 'proxy-client-cert-file': obj.proxyClientCertFile,
491
+ 'proxy-client-key-file': obj.proxyClientKeyFile,
492
+ 'proxy-url': obj.proxyUrl,
493
+ 'scm': obj.scm,
494
+ 'snapshot': toJson_SnapshotConfiguration(obj.snapshot),
495
+ 'stream': obj.stream,
496
+ 'triage': toJson_CommitConfigurationConnectTriage(obj.triage),
497
+ 'upload-artifacts': obj.uploadArtifacts,
498
+ 'url': obj.url,
499
+ 'version': obj.version,
500
+ };
501
+ // filter undefined values
502
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
503
+ }
504
+ /**
505
+ * Converts an object of type 'CommitConfigurationSrm' to JSON representation.
506
+ * @internal
507
+ */
508
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
509
+ function toJson_CommitConfigurationSrm(obj) {
510
+ if (obj === undefined) {
511
+ return undefined;
512
+ }
513
+ const result = {
514
+ 'branch': obj.branch,
515
+ 'parent-branch': obj.parentBranch,
516
+ 'project-name': obj.projectName,
517
+ 'project-id': obj.projectId,
518
+ 'token-file': obj.tokenFile,
519
+ 'url': obj.url,
520
+ };
521
+ // filter undefined values
522
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
523
+ }
524
+ /**
525
+ * Converts an object of type 'CommitConfigurationLocal' to JSON representation.
526
+ * @internal
527
+ */
528
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
529
+ function toJson_CommitConfigurationLocal(obj) {
530
+ if (obj === undefined) {
531
+ return undefined;
532
+ }
533
+ const result = {
534
+ 'path': obj.path,
535
+ 'format': obj.format,
536
+ };
537
+ // filter undefined values
538
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
539
+ }
540
+ /**
541
+ * Converts an object of type 'CheckerConfigurationWebappSecurity' to JSON representation.
542
+ * @internal
543
+ */
544
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
545
+ function toJson_CheckerConfigurationWebappSecurity(obj) {
546
+ if (obj === undefined) {
547
+ return undefined;
548
+ }
549
+ const result = {
550
+ 'aggressiveness-level': obj.aggressivenessLevel,
551
+ 'enabled': obj.enabled,
552
+ };
553
+ // filter undefined values
554
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
555
+ }
556
+ /**
557
+ * Converts an object of type 'SpecificCodingStandardConfiguration' to JSON representation.
558
+ * @internal
559
+ */
560
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
561
+ function toJson_SpecificCodingStandardConfiguration(obj) {
562
+ if (obj === undefined) {
563
+ return undefined;
564
+ }
565
+ const result = {
566
+ 'config': toJson_ResolvedCodingStandardConfiguration(obj.config),
567
+ 'file': obj.file,
568
+ 'pre-canned': obj.preCanned,
569
+ };
570
+ // filter undefined values
571
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
572
+ }
573
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
574
+ /**
575
+ * Artifacts to upload following analysis when the analysis location is Connect.
576
+ *
577
+ * @schema AnalyzeConnectConfigurationUploadArtifacts
578
+ */
579
+ var AnalyzeConnectConfigurationUploadArtifacts;
580
+ (function (AnalyzeConnectConfigurationUploadArtifacts) {
581
+ /** All */
582
+ AnalyzeConnectConfigurationUploadArtifacts["ALL"] = "All";
583
+ /** LogsOnly */
584
+ AnalyzeConnectConfigurationUploadArtifacts["LOGS_ONLY"] = "LogsOnly";
585
+ /** None */
586
+ AnalyzeConnectConfigurationUploadArtifacts["NONE"] = "None";
587
+ /** OnFailure */
588
+ AnalyzeConnectConfigurationUploadArtifacts["ON_FAILURE"] = "OnFailure";
589
+ })(AnalyzeConnectConfigurationUploadArtifacts || (exports.AnalyzeConnectConfigurationUploadArtifacts = AnalyzeConnectConfigurationUploadArtifacts = {}));
590
+ /**
591
+ * Converts an object of type 'DirectivesConfigurationConfig' to JSON representation.
592
+ * @internal
593
+ */
594
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
595
+ function toJson_DirectivesConfigurationConfig(obj) {
596
+ if (obj === undefined) {
597
+ return undefined;
598
+ }
599
+ const result = {
600
+ 'directives': obj.directives?.map(y => y),
601
+ 'format_version': obj.formatVersion,
602
+ 'language': obj.language,
603
+ 'type': obj.type,
604
+ };
605
+ // filter undefined values
606
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
607
+ }
608
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
609
+ /**
610
+ * @schema SigmaConfigurationEnableCheckSet
611
+ */
612
+ var SigmaConfigurationEnableCheckSet;
613
+ (function (SigmaConfigurationEnableCheckSet) {
614
+ /** all */
615
+ SigmaConfigurationEnableCheckSet["ALL"] = "all";
616
+ /** cis */
617
+ SigmaConfigurationEnableCheckSet["CIS"] = "cis";
618
+ /** default */
619
+ SigmaConfigurationEnableCheckSet["DEFAULT"] = "default";
620
+ /** empty */
621
+ SigmaConfigurationEnableCheckSet["EMPTY"] = "empty";
622
+ })(SigmaConfigurationEnableCheckSet || (exports.SigmaConfigurationEnableCheckSet = SigmaConfigurationEnableCheckSet = {}));
623
+ /**
624
+ * Converts an object of type 'ParallelTranslateConfiguration' to JSON representation.
625
+ * @internal
626
+ */
627
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
628
+ function toJson_ParallelTranslateConfiguration(obj) {
629
+ if (obj === undefined) {
630
+ return undefined;
631
+ }
632
+ const result = {
633
+ 'enabled': obj.enabled,
634
+ 'processes': obj.processes,
635
+ };
636
+ // filter undefined values
637
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
638
+ }
639
+ /**
640
+ * Converts an object of type 'WebappArchiveConfiguration' to JSON representation.
641
+ * @internal
642
+ */
643
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
644
+ function toJson_WebappArchiveConfiguration(obj) {
645
+ if (obj === undefined) {
646
+ return undefined;
647
+ }
648
+ const result = {
649
+ 'path': obj.path,
650
+ 'validate-webapp': obj.validateWebapp,
651
+ };
652
+ // filter undefined values
653
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
654
+ }
655
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
656
+ /**
657
+ * @schema LanguagesConfigurationExclude
658
+ */
659
+ var LanguagesConfigurationExclude;
660
+ (function (LanguagesConfigurationExclude) {
661
+ /** apex */
662
+ LanguagesConfigurationExclude["APEX"] = "apex";
663
+ /** c-family */
664
+ LanguagesConfigurationExclude["C_HYPHEN_FAMILY"] = "c-family";
665
+ /** csharp */
666
+ LanguagesConfigurationExclude["CSHARP"] = "csharp";
667
+ /** dart */
668
+ LanguagesConfigurationExclude["DART"] = "dart";
669
+ /** go */
670
+ LanguagesConfigurationExclude["GO"] = "go";
671
+ /** java */
672
+ LanguagesConfigurationExclude["JAVA"] = "java";
673
+ /** javascript */
674
+ LanguagesConfigurationExclude["JAVASCRIPT"] = "javascript";
675
+ /** kotlin */
676
+ LanguagesConfigurationExclude["KOTLIN"] = "kotlin";
677
+ /** php */
678
+ LanguagesConfigurationExclude["PHP"] = "php";
679
+ /** python */
680
+ LanguagesConfigurationExclude["PYTHON"] = "python";
681
+ /** ruby */
682
+ LanguagesConfigurationExclude["RUBY"] = "ruby";
683
+ /** swift */
684
+ LanguagesConfigurationExclude["SWIFT"] = "swift";
685
+ /** vb */
686
+ LanguagesConfigurationExclude["VB"] = "vb";
687
+ /** configuration */
688
+ LanguagesConfigurationExclude["CONFIGURATION"] = "configuration";
689
+ })(LanguagesConfigurationExclude || (exports.LanguagesConfigurationExclude = LanguagesConfigurationExclude = {}));
690
+ /**
691
+ * @schema LanguagesConfigurationInclude
692
+ */
693
+ var LanguagesConfigurationInclude;
694
+ (function (LanguagesConfigurationInclude) {
695
+ /** apex */
696
+ LanguagesConfigurationInclude["APEX"] = "apex";
697
+ /** c-family */
698
+ LanguagesConfigurationInclude["C_HYPHEN_FAMILY"] = "c-family";
699
+ /** csharp */
700
+ LanguagesConfigurationInclude["CSHARP"] = "csharp";
701
+ /** dart */
702
+ LanguagesConfigurationInclude["DART"] = "dart";
703
+ /** go */
704
+ LanguagesConfigurationInclude["GO"] = "go";
705
+ /** java */
706
+ LanguagesConfigurationInclude["JAVA"] = "java";
707
+ /** javascript */
708
+ LanguagesConfigurationInclude["JAVASCRIPT"] = "javascript";
709
+ /** kotlin */
710
+ LanguagesConfigurationInclude["KOTLIN"] = "kotlin";
711
+ /** php */
712
+ LanguagesConfigurationInclude["PHP"] = "php";
713
+ /** python */
714
+ LanguagesConfigurationInclude["PYTHON"] = "python";
715
+ /** ruby */
716
+ LanguagesConfigurationInclude["RUBY"] = "ruby";
717
+ /** swift */
718
+ LanguagesConfigurationInclude["SWIFT"] = "swift";
719
+ /** vb */
720
+ LanguagesConfigurationInclude["VB"] = "vb";
721
+ /** configuration */
722
+ LanguagesConfigurationInclude["CONFIGURATION"] = "configuration";
723
+ })(LanguagesConfigurationInclude || (exports.LanguagesConfigurationInclude = LanguagesConfigurationInclude = {}));
724
+ /**
725
+ * Indicates whether to trust self-signed certificates presented by Coverity Connect that are not currently trusted.
726
+ *
727
+ * @schema CommitConfigurationConnectOnNewCert
728
+ */
729
+ var CommitConfigurationConnectOnNewCert;
730
+ (function (CommitConfigurationConnectOnNewCert) {
731
+ /** trust */
732
+ CommitConfigurationConnectOnNewCert["TRUST"] = "trust";
733
+ /** distrust */
734
+ CommitConfigurationConnectOnNewCert["DISTRUST"] = "distrust";
735
+ })(CommitConfigurationConnectOnNewCert || (exports.CommitConfigurationConnectOnNewCert = CommitConfigurationConnectOnNewCert = {}));
736
+ /**
737
+ * The name of the source control management system.
738
+ *
739
+ * @schema CommitConfigurationConnectScm
740
+ */
741
+ var CommitConfigurationConnectScm;
742
+ (function (CommitConfigurationConnectScm) {
743
+ /** ads */
744
+ CommitConfigurationConnectScm["ADS"] = "ads";
745
+ /** clearcase */
746
+ CommitConfigurationConnectScm["CLEARCASE"] = "clearcase";
747
+ /** cvs */
748
+ CommitConfigurationConnectScm["CVS"] = "cvs";
749
+ /** git */
750
+ CommitConfigurationConnectScm["GIT"] = "git";
751
+ /** hg */
752
+ CommitConfigurationConnectScm["HG"] = "hg";
753
+ /** perforce */
754
+ CommitConfigurationConnectScm["PERFORCE"] = "perforce";
755
+ /** plastic */
756
+ CommitConfigurationConnectScm["PLASTIC"] = "plastic";
757
+ /** plastic-distributed */
758
+ CommitConfigurationConnectScm["PLASTIC_HYPHEN_DISTRIBUTED"] = "plastic-distributed";
759
+ /** svn */
760
+ CommitConfigurationConnectScm["SVN"] = "svn";
761
+ /** tfs */
762
+ CommitConfigurationConnectScm["TFS"] = "tfs";
763
+ })(CommitConfigurationConnectScm || (exports.CommitConfigurationConnectScm = CommitConfigurationConnectScm = {}));
764
+ /**
765
+ * Converts an object of type 'SnapshotConfiguration' to JSON representation.
766
+ * @internal
767
+ */
768
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
769
+ function toJson_SnapshotConfiguration(obj) {
770
+ if (obj === undefined) {
771
+ return undefined;
772
+ }
773
+ const result = {
774
+ 'date': obj.date,
775
+ 'id': obj.id,
776
+ 'reference': obj.reference,
777
+ };
778
+ // filter undefined values
779
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
780
+ }
781
+ /**
782
+ * Converts an object of type 'CommitConfigurationConnectTriage' to JSON representation.
783
+ * @internal
784
+ */
785
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
786
+ function toJson_CommitConfigurationConnectTriage(obj) {
787
+ if (obj === undefined) {
788
+ return undefined;
789
+ }
790
+ const result = {
791
+ 'new-defect-owner': obj.newDefectOwner,
792
+ 'new-defect-owner-limit': obj.newDefectOwnerLimit,
793
+ 'set-new-defect-owner': obj.setNewDefectOwner,
794
+ };
795
+ // filter undefined values
796
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
797
+ }
798
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
799
+ /**
800
+ * Artifacts to upload following analysis when the analysis location is Connect.
801
+ *
802
+ * @schema CommitConfigurationConnectUploadArtifacts
803
+ */
804
+ var CommitConfigurationConnectUploadArtifacts;
805
+ (function (CommitConfigurationConnectUploadArtifacts) {
806
+ /** All */
807
+ CommitConfigurationConnectUploadArtifacts["ALL"] = "All";
808
+ /** LogsOnly */
809
+ CommitConfigurationConnectUploadArtifacts["LOGS_ONLY"] = "LogsOnly";
810
+ /** None */
811
+ CommitConfigurationConnectUploadArtifacts["NONE"] = "None";
812
+ /** OnFailure */
813
+ CommitConfigurationConnectUploadArtifacts["ON_FAILURE"] = "OnFailure";
814
+ })(CommitConfigurationConnectUploadArtifacts || (exports.CommitConfigurationConnectUploadArtifacts = CommitConfigurationConnectUploadArtifacts = {}));
815
+ /**
816
+ * Format in which to save defects. Either "html" or "json".
817
+ *
818
+ * @schema CommitConfigurationLocalFormat
819
+ */
820
+ var CommitConfigurationLocalFormat;
821
+ (function (CommitConfigurationLocalFormat) {
822
+ /** html */
823
+ CommitConfigurationLocalFormat["HTML"] = "html";
824
+ /** json */
825
+ CommitConfigurationLocalFormat["JSON"] = "json";
826
+ })(CommitConfigurationLocalFormat || (exports.CommitConfigurationLocalFormat = CommitConfigurationLocalFormat = {}));
827
+ /**
828
+ * Sets the web application checkers aggressiveness level.
829
+ *
830
+ * @schema CheckerConfigurationWebappSecurityAggressivenessLevel
831
+ */
832
+ var CheckerConfigurationWebappSecurityAggressivenessLevel;
833
+ (function (CheckerConfigurationWebappSecurityAggressivenessLevel) {
834
+ /** low */
835
+ CheckerConfigurationWebappSecurityAggressivenessLevel["LOW"] = "low";
836
+ /** medium */
837
+ CheckerConfigurationWebappSecurityAggressivenessLevel["MEDIUM"] = "medium";
838
+ /** high */
839
+ CheckerConfigurationWebappSecurityAggressivenessLevel["HIGH"] = "high";
840
+ })(CheckerConfigurationWebappSecurityAggressivenessLevel || (exports.CheckerConfigurationWebappSecurityAggressivenessLevel = CheckerConfigurationWebappSecurityAggressivenessLevel = {}));
841
+ /**
842
+ * Converts an object of type 'ResolvedCodingStandardConfiguration' to JSON representation.
843
+ * @internal
844
+ */
845
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
846
+ function toJson_ResolvedCodingStandardConfiguration(obj) {
847
+ if (obj === undefined) {
848
+ return undefined;
849
+ }
850
+ const result = {
851
+ 'deviations': obj.deviations?.map(y => toJson_CodingStandardDeviation(y)),
852
+ 'title': obj.title,
853
+ 'version': obj.version,
854
+ };
855
+ // filter undefined values
856
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
857
+ }
858
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
859
+ /**
860
+ * Must be the string "Coverity analysis configuration".
861
+ *
862
+ * @schema DirectivesConfigurationConfigType
863
+ */
864
+ var DirectivesConfigurationConfigType;
865
+ (function (DirectivesConfigurationConfigType) {
866
+ /** Coverity analysis configuration */
867
+ DirectivesConfigurationConfigType["COVERITY_ANALYSIS_CONFIGURATION"] = "Coverity analysis configuration";
868
+ })(DirectivesConfigurationConfigType || (exports.DirectivesConfigurationConfigType = DirectivesConfigurationConfigType = {}));
869
+ /**
870
+ * Converts an object of type 'CodingStandardDeviation' to JSON representation.
871
+ * @internal
872
+ */
873
+ /* eslint-disable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
874
+ function toJson_CodingStandardDeviation(obj) {
875
+ if (obj === undefined) {
876
+ return undefined;
877
+ }
878
+ const result = {
879
+ 'deviation': obj.deviation,
880
+ 'reason': obj.reason,
881
+ };
882
+ // filter undefined values
883
+ return Object.entries(result).reduce((r, i) => (i[1] === undefined) ? r : ({ ...r, [i[0]]: i[1] }), {});
884
+ }
885
+ /* eslint-enable max-len, @stylistic/max-len, quote-props, @stylistic/quote-props */
886
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY292ZXJpdHktY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvbGFyaXMvY292ZXJpdHktY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNDQSxvRUFXQztBQXlLRCxvRUE0QkM7QUFzQkQsa0VBT0M7QUE2R0Qsa0VBb0JDO0FBb0NELGdFQVNDO0FBOEhELGtFQW9CQztBQXNIRCxnRkFxQkM7QUE4REQsZ0ZBYUM7QUEyQkQsd0VBUUM7QUF1REQsNEVBWUM7QUF5Q0QsNERBVUM7QUE4Q0QsOEVBT0M7QUEyQkQsOERBUUM7QUEyQkQsb0VBUUM7QUFrREQsNEVBV0M7QUEwRkQsOERBaUJDO0FBMkJELHNFQVFDO0FBeUNELHNFQVVDO0FBOEVELDhEQWVDO0FBNklELDhFQXdCQztBQXlERCxzRUFZQztBQTZCRCwwRUFRQztBQTZCRCw4RkFRQztBQWtDRCxnR0FTQztBQTJERCxvRkFVQztBQXlDRCxzRkFRQztBQTJCRCw4RUFRQztBQThJRCxvRUFTQztBQW9DRCwwRkFTQztBQTRFRCxnR0FTQztBQXFDRCx3RUFRQztBQXJyRUQ7OztHQUdHO0FBQ0gscUZBQXFGO0FBQ3JGLFNBQWdCLDRCQUE0QixDQUFDLEdBQXNDO0lBQ2pGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQUMsT0FBTyxTQUFTLENBQUM7SUFBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHO1FBQ2IsU0FBUyxFQUFFLDRCQUE0QixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDcEQsU0FBUyxFQUFFLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbkQsU0FBUyxFQUFFLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbkQsUUFBUSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDaEQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3ZCLENBQUM7SUFDRiwwQkFBMEI7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QUFDRCxvRkFBb0Y7QUFFcEY7Ozs7R0FJRztBQUNILElBQVksaUNBR1g7QUFIRCxXQUFZLGlDQUFpQztJQUMzQyxzQ0FBc0M7SUFDdEMsd0dBQW1FLENBQUE7QUFDckUsQ0FBQyxFQUhXLGlDQUFpQyxpREFBakMsaUNBQWlDLFFBRzVDO0FBcUJEOzs7R0FHRztBQUNILHFGQUFxRjtBQUNyRixTQUFnQiw4QkFBOEIsQ0FBQyxHQUF3QztJQUNyRixJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUFDLE9BQU8sU0FBUyxDQUFDO0lBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBRztRQUNiLFdBQVcsRUFBRSxHQUFHLENBQUMsU0FBUztRQUMxQixRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU07S0FDckIsQ0FBQztJQUNGLDBCQUEwQjtJQUMxQixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxRyxDQUFDO0FBQ0Qsb0ZBQW9GIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibm9kZSAuL3Byb2plbi5qc1wiLlxuLyoqXG4gKiBAc2NoZW1hIFBvbGFyaXNDb3Zlcml0eVNjaGVtYVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvbGFyaXNDb3Zlcml0eVNjaGVtYSB7XG4gIC8qKlxuICAgKiBAc2NoZW1hIFBvbGFyaXNDb3Zlcml0eVNjaGVtYSNhbmFseXplXG4gICAqL1xuICByZWFkb25seSBhbmFseXplPzogQW5hbHlzaXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIFBvbGFyaXNDb3Zlcml0eVNjaGVtYSNjYWNoaW5nXG4gICAqL1xuICByZWFkb25seSBjYWNoaW5nPzogQ2FjaGluZ0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEBzY2hlbWEgUG9sYXJpc0NvdmVyaXR5U2NoZW1hI2NhcHR1cmVcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmU/OiBDYXB0dXJlQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogQHNjaGVtYSBQb2xhcmlzQ292ZXJpdHlTY2hlbWEjY29tbWl0XG4gICAqL1xuICByZWFkb25seSBjb21taXQ6IENvbW1pdENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGluIHVzZS5cbiAgICpcbiAgICogQHNjaGVtYSBQb2xhcmlzQ292ZXJpdHlTY2hlbWEjdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbj86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUG9sYXJpc0NvdmVyaXR5U2NoZW1hJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUG9sYXJpc0NvdmVyaXR5U2NoZW1hKG9iajogUG9sYXJpc0NvdmVyaXR5U2NoZW1hIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYW5hbHl6ZSc6IHRvSnNvbl9BbmFseXNpc0NvbmZpZ3VyYXRpb24ob2JqLmFuYWx5emUpLFxuICAgICdjYWNoaW5nJzogdG9Kc29uX0NhY2hpbmdDb25maWd1cmF0aW9uKG9iai5jYWNoaW5nKSxcbiAgICAnY2FwdHVyZSc6IHRvSnNvbl9DYXB0dXJlQ29uZmlndXJhdGlvbihvYmouY2FwdHVyZSksXG4gICAgJ2NvbW1pdCc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uKG9iai5jb21taXQpLFxuICAgICd2ZXJzaW9uJzogb2JqLnZlcnNpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IHRoZSBwcm9qZWN0IHNob3VsZCBiZSBhbmFseXplZC5cbiAqXG4gKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXNpc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBhZ2dyZXNzaXZlbmVzcyBsZXZlbCBmb3IgdGhlIGFuYWx5c2lzLiBUaGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgY2F1c2VzIHRoZSBhbmFseXNpcyB0byBtYWtlIG1vcmUgb3IgbGVzcyBhZ2dyZXNzaXZlIGFzc3VtcHRpb25zIGR1cmluZyB0aGUgYW5hbHlzaXMgd2hlcmUgdGhlIGhpZ2hlciB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgdGhlIG1vcmUgZGVmZWN0cyBhcmUgcmVwb3J0ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNhZ2dyZXNzaXZlbmVzcy1sZXZlbFxuICAgKi9cbiAgcmVhZG9ubHkgYWdncmVzc2l2ZW5lc3NMZXZlbD86IEFuYWx5c2lzQ29uZmlndXJhdGlvbkFnZ3Jlc3NpdmVuZXNzTGV2ZWw7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgYW5hbHlzaXMgb2YgY2FsbHMgdG8gZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGRlZmVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNjLWNwcC1mbnB0clxuICAgKi9cbiAgcmVhZG9ubHkgY0NwcEZucHRyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBmdWxsIHZpcnR1YWwtY2FsbCByZXNvbHV0aW9uIGZvciBDKysuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNjLWNwcC12aXJ0dWFsXG4gICAqL1xuICByZWFkb25seSBjQ3BwVmlydHVhbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgY2FsbGdyYXBoIG1ldHJpY3Mgb3V0cHV0IGluIHRoZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY2FsbGdyYXBoLW1ldHJpY3NcbiAgICovXG4gIHJlYWRvbmx5IGNhbGxncmFwaE1ldHJpY3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBubyBjaGVja2VyIGNvbmZpZ3VyYXRpb24gaXMgc3BlY2lmaWVkLCB0aGUgQ0xJIHdpbGwgZW5hYmxlIGEgc2V0IG9mIGNoZWNrZXJzIGJhc2VkIG9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNjaGVja2Vyc1xuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tlcnM/OiBDaGVja2VyQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogSWYgc3BlY2lmaWVkLCB0aGUgYW5hbHlzaXMgd2lsbCBzY2FuIHRoZSBjb2RlIGZvciBjb21wbGlhbmNlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29kaW5nIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24uIElmIHRoaXMgY29uZmlndXJhdGlvbiBpcyBwcmVzZW50LCB0aGUgY2FwdHVyZSBcImVtaXQtY29tcGxlbWVudGFyeS1pbmZvXCIgZmxhZyB3aWxsIGJlIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY29kaW5nLXN0YW5kYXJkc1xuICAgKi9cbiAgcmVhZG9ubHkgY29kaW5nU3RhbmRhcmRzPzogQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBDb3Zlcml0eSBDb25uZWN0IGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gcGVyZm9ybWluZyBhbmFseXNpcyBpbiBDb3Zlcml0eSBDb25uZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY29ubmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdD86IEFuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBhZGRpdGlvbmFsIGZpbHRlcmluZyBvZiBkZWZlY3RzIGJ5IHVzaW5nIGFuIGFkZGl0aW9uYWwgZmFsc2UtcGF0aCBwcnVuZXIuIElmIHNldCB0byB0cnVlLCB0aGUgY29uc3RyYWludCBGUFAgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI2NvbnN0cmFpbnQtZnBwXG4gICAqL1xuICByZWFkb25seSBjb25zdHJhaW50RnBwPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBjb3YtYW5hbHl6ZSB3aGVuIGRvaW5nIGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jY292LWFuYWx5emUtYXJnc1xuICAgKi9cbiAgcmVhZG9ubHkgY292QW5hbHl6ZUFyZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBjb3YtY29sbGVjdC1tb2RlbHMgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gXCJvdXRwdXQtbW9kZWwtZmlsZVwiIGlzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI2Nvdi1jb2xsZWN0LW1vZGVscy1hcmdzXG4gICAqL1xuICByZWFkb25seSBjb3ZDb2xsZWN0TW9kZWxzQXJncz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgZGlyZWN0aXZlcyB0byB1c2UgZm9yIHRoZSBhbmFseXNpcywgaW5jbHVkaW5nIGZvciB3ZWIgYXBwbGljYXRpb24gc2VjdXJpdHkgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNkaXJlY3RpdmVzXG4gICAqL1xuICByZWFkb25seSBkaXJlY3RpdmVzPzogRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25bXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoaWNoIGZpbGVzIHRvIGFuYWx5emUgd2hlbiB0aGUgXCJhbmFseXplLm1vZGVcIiBzZXR0aW5nIGlzIFwiaGZpXCIuIEFuYWx5c2lzIHdpbGwgYmUgcGVyZm9ybWVkIGZvciBvbmx5IHRoZXNlIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jZmlsZXNcbiAgICovXG4gIHJlYWRvbmx5IGZpbGVzPzogQW5hbHl6ZUZpbGVzQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuYWx5c2lzIHdvcmtlciBwYXJhbGxlbGlzbS5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI2pvYnNcbiAgICovXG4gIHJlYWRvbmx5IGpvYnM/OiBKb2JzQ29uZmlndXJhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgYW5hbHlzaXMgc2hvdWxkIGJlIGRvbmUgbG9jYWxseSwgaW4gQ292ZXJpdHkgQ29ubmVjdCwgb3IgaW4gU29mdHdhcmUgUmlzayBNYW5hZ2VyLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOiBjb25uZWN0IC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBqb2IgZmFybTsgc3JtIC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIGpvYiBmYXJtOyBsb2NhbCAtIFJ1biB0aGUgYW5hbHlzaXMgbG9jYWxseVxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jbG9jYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogQW5hbHlzaXNDb25maWd1cmF0aW9uTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIEFuYWx5c2lzIG1vZGU6IFwicGZpXCIgKHBlcmZlY3QgZmlkZWxpdHkgaW5jcmVtZW50YWwpIGZvciBjb21wbGV0ZSBhbmFseXNpczsgb3IgXCJoZmlcIiAoaGlnaCBmaWRlbGl0eSBpbmNyZW1lbnRhbCkgZm9yIGFuYWx5c2lzIG9mIG9ubHkgc3BlY2lmaWMgZmlsZXMgc3BlY2lmaWVkIGJ5IGFuYWx5emUuZmlsZXMgc2V0dGluZ3MsIG9taXR0aW5nIGFueSBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSBiZWVuIGluY2lkZW50YWxseSBjYXB0dXJlZCBieSB0aGUgYnVpbGQuIEFuIFwiaGZpXCIgYW5hbHlzaXMgY2FuIGJlIGZhc3RlciBidXQgbWF5IHByb2R1Y2UgcmVzdWx0cyB3aGljaCBhcmUgaW5jb21wbGV0ZSBvciBpbmNvbnNpc3RlbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBjb250ZXh0LCBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHNwZWVkIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYWNjdXJhY3kuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNtb2RlXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQW5hbHlzaXNDb25maWd1cmF0aW9uTW9kZTtcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIGZ1bmN0aW9uIG1vZGVscy4gVGhpcyBvdmVycmlkZXMgbW9kZWxzIHNwZWNpZmllZCBpbiB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiBcImNvbmZpZy91c2VyX21vZGVscy54bWxkYlwiLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jbW9kZWwtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZWxGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdG8gdHJ1ZSwgb25seSBvbmUgVFUgKHRyYW5zbGF0aW9uIHVuaXQpIHdpbGwgYmUgYW5hbHl6ZWQgcGVyIHNvdXJjZSBmaWxlIG5hbWUuIElmIHNldCB0byBmYWxzZSwgYWxsIHRyYW5zbGF0aW9uIHVuaXRzIHdpbGwgYmUgYW5hbHl6ZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNvbmUtdHUtcGVyLXBzZlxuICAgKi9cbiAgcmVhZG9ubHkgb25lVHVQZXJQc2Y/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPdXRwdXQgZmlsZSB0byB3aGljaCBmdW5jdGlvbiBtb2RlbHMgZm9yIHRoZSBwcm9qZWN0IHNob3VsZCBiZSB3cml0dGVuIGZvbGxvd2luZyBhbmFseXNpcy5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI291dHB1dC1tb2RlbC1maWxlXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRNb2RlbEZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgcGFyc2Ugd2FybmluZ3MgYXJlIGhhbmRsZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNwYXJzZS13YXJuaW5nc1xuICAgKi9cbiAgcmVhZG9ubHkgcGFyc2VXYXJuaW5ncz86IFBhcnNlV2FybmluZ3NDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgdGhlIGNvbGxlY3Rpb24gb2Ygc2NhbiB0cmFuc3BhcmVuY3kgZGF0YSBmb3IgYW5hbHlzaXMuIFRoaXMgc2V0dGluZyBtdXN0IGJlIGVuYWJsZWQgaWYgdGhlIENvdmVyaXR5IENvbm5lY3QgaW5zdGFuY2UgaGFzICdzY2FuLnRyYW5zcGFyZW5jeS5lbmFibGVkPXRydWUnIGluIGl0cyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5c2lzLWNvbmZpZ3VyYXRpb24jc2Nhbi10cmFuc3BhcmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5UcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgU2lnbWEgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHlzaXMtY29uZmlndXJhdGlvbiNzaWdtYVxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbWE/OiBTaWdtYUNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBtYXAgZnJvbSB0cnVzdCBvcHRpb24gbmFtZSB0byBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHBhcnRpY3VsYXIgdHJ1c3QgcHJvcGVydHkgc2hvdWxkIGJlIHRydXN0ZWQgb3IgZGlzdHJ1c3RlZC4gVGhlIHRydXN0IG9wdGlvbiBcImFsbFwiIGNvbnRyb2xzIHdoZXRoZXIgYWxsIHRydXN0IG9wdGlvbnMgc2hvdWxkIGJlIHRydXN0ZWQgb3IgZGlzdHJ1c3RlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXNpcy1jb25maWd1cmF0aW9uI3RydXN0XG4gICAqL1xuICByZWFkb25seSB0cnVzdD86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQW5hbHlzaXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQW5hbHlzaXNDb25maWd1cmF0aW9uKG9iajogQW5hbHlzaXNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWdncmVzc2l2ZW5lc3MtbGV2ZWwnOiBvYmouYWdncmVzc2l2ZW5lc3NMZXZlbCxcbiAgICAnYy1jcHAtZm5wdHInOiBvYmouY0NwcEZucHRyLFxuICAgICdjLWNwcC12aXJ0dWFsJzogb2JqLmNDcHBWaXJ0dWFsLFxuICAgICdjYWxsZ3JhcGgtbWV0cmljcyc6IG9iai5jYWxsZ3JhcGhNZXRyaWNzLFxuICAgICdjaGVja2Vycyc6IHRvSnNvbl9DaGVja2VyQ29uZmlndXJhdGlvbihvYmouY2hlY2tlcnMpLFxuICAgICdjb2Rpbmctc3RhbmRhcmRzJzogdG9Kc29uX0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouY29kaW5nU3RhbmRhcmRzKSxcbiAgICAnY29ubmVjdCc6IHRvSnNvbl9BbmFseXplQ29ubmVjdENvbmZpZ3VyYXRpb24ob2JqLmNvbm5lY3QpLFxuICAgICdjb25zdHJhaW50LWZwcCc6IG9iai5jb25zdHJhaW50RnBwLFxuICAgICdjb3YtYW5hbHl6ZS1hcmdzJzogb2JqLmNvdkFuYWx5emVBcmdzPy5tYXAoeSA9PiB5KSxcbiAgICAnY292LWNvbGxlY3QtbW9kZWxzLWFyZ3MnOiBvYmouY292Q29sbGVjdE1vZGVsc0FyZ3M/Lm1hcCh5ID0+IHkpLFxuICAgICdkaXJlY3RpdmVzJzogb2JqLmRpcmVjdGl2ZXM/Lm1hcCh5ID0+IHRvSnNvbl9EaXJlY3RpdmVzQ29uZmlndXJhdGlvbih5KSksXG4gICAgJ2ZpbGVzJzogdG9Kc29uX0FuYWx5emVGaWxlc0NvbmZpZ3VyYXRpb24ob2JqLmZpbGVzKSxcbiAgICAnam9icyc6IG9iai5qb2JzPy5tYXAoeSA9PiB0b0pzb25fSm9ic0NvbmZpZ3VyYXRpb24oeSkpLFxuICAgICdsb2NhdGlvbic6IG9iai5sb2NhdGlvbixcbiAgICAnbW9kZSc6IG9iai5tb2RlLFxuICAgICdtb2RlbC1maWxlJzogb2JqLm1vZGVsRmlsZSxcbiAgICAnb25lLXR1LXBlci1wc2YnOiBvYmoub25lVHVQZXJQc2YsXG4gICAgJ291dHB1dC1tb2RlbC1maWxlJzogb2JqLm91dHB1dE1vZGVsRmlsZSxcbiAgICAncGFyc2Utd2FybmluZ3MnOiB0b0pzb25fUGFyc2VXYXJuaW5nc0NvbmZpZ3VyYXRpb24ob2JqLnBhcnNlV2FybmluZ3MpLFxuICAgICdzY2FuLXRyYW5zcGFyZW5jeSc6IG9iai5zY2FuVHJhbnNwYXJlbmN5LFxuICAgICdzaWdtYSc6IHRvSnNvbl9TaWdtYUNvbmZpZ3VyYXRpb24ob2JqLnNpZ21hKSxcbiAgICAndHJ1c3QnOiBvYmoudHJ1c3QsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgaG93IHRoZSBDTEkgc2hvdWxkIGhhbmRsZSBjYWNoaW5nIHdoZW4gcGVyZm9ybWluZyBjYXB0dXJlL2FuYWx5c2lzLlxuICpcbiAqIEBzY2hlbWEgY2FjaGluZy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGluZ0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQSB0cnVlIHZhbHVlIGluZGljYXRlcyBjYWNoaW5nIHdpbGwgYmUgdXNlZCB3aGVuIHBlcmZvcm1pbmcgcmVtb3RlIGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhY2hpbmctY29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ2FjaGluZ0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9DYWNoaW5nQ29uZmlndXJhdGlvbihvYmo6IENhY2hpbmdDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyB0aGUgcHJvamVjdCBzaG91bGQgYmUgY2FwdHVyZWQuXG4gKlxuICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXB0dXJlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBidWlsZCBjb21tYW5kIGluZmVyZW5jZS4gSWYgYnVpbGQgY29tbWFuZCBpbmZlcmVuY2UgaXMgZGlzYWJsZWQgYW5kIG5vIGJ1aWxkIGNvbW1hbmQgaXMgcHJvdmlkZWQgdGhlbiBubyBhdHRlbXB0IGF0IGJ1aWxkIGNhcHR1cmUgd2lsbCBiZSBtYWRlLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNidWlsZC1jb21tYW5kLWluZmVyZW5jZVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kSW5mZXJlbmNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoaWNoIGNvbXBpbGVycyB0byBjb25maWd1cmUuIEJ5IGRlZmF1bHQsIHRlbXBsYXRlIGNvbXBpbGVycyBhcmUgY29uZmlndXJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb24jY29tcGlsZXItY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJDb25maWd1cmF0aW9uPzogQ29tcGlsZXJDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNjb3YtdHJhbnNsYXRlXG4gICAqL1xuICByZWFkb25seSBjb3ZUcmFuc2xhdGU/OiBDb3ZUcmFuc2xhdGVDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBlbWl0IHByb2Nlc3MgbmVlZGVkIGZvciB0aGUgY29tcGxpYW5jZSBjaGVja2Vycy4gSWYgYSBcImNvZGluZy1zdGFuZGFyZHNcIiBjb25maWd1cmF0aW9uIGlzIHByZXNlbnQgdGhlbiB0aGlzIGZsYWcgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byB0cnVlLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNlbWl0LWNvbXBsZW1lbnRhcnktaW5mb1xuICAgKi9cbiAgcmVhZG9ubHkgZW1pdENvbXBsZW1lbnRhcnlJbmZvPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiBwYXJzaW5nIGFuZCBlbWl0dGluZyB0aGUgc291cmNlIGZpbGVzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNlbmNvZGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2Rpbmc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbWluaW11bSBwZXJjZW50YWdlIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBjYXB0dXJlZCBpbiBvcmRlciB0byBwcm9jZWVkIHdpdGggdGhlIGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNmYWlsdXJlLXRocmVzaG9sZC1wZXJjZW50XG4gICAqL1xuICByZWFkb25seSBmYWlsdXJlVGhyZXNob2xkUGVyY2VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoaWNoIG5vbi1jb21waWxlZCBmaWxlcyB0byBjYXB0dXJlLiBCeSBkZWZhdWx0LCBhbGwgZmlsZXMgYXJlIGNhcHR1cmVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNmaWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZmlsZXM/OiBGaWxlc0NvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlc29sdXRpb24gb2YgTWF2ZW4sIEdyYWRsZSBhbmQgTVNCdWlsZCBkZXBlbmRlbmNpZXMgZXZlbiBpZiB0aGlzIGlzIG5vdCBuZWVkZWQgYmFzZWQgb24gdGhlIGRldGVjdGVkIHNvdXJjZSBsYW5ndWFnZXMgaW4gdGhlIHByb2plY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI2ZvcmNlLWRlcGVuZGVuY3ktcmVzb2x1dGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZm9yY2VEZXBlbmRlbmN5UmVzb2x1dGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGljaCBsYW5ndWFnZXMgdG8gaW5jbHVkZSBvciBleGNsdWRlIGZvciBjYXB0dXJlLiBCeSBkZWZhdWx0LCBhbGwgbGFuZ3VhZ2VzIGFyZSBjYXB0dXJlZC5cbiAgICpcbiAgICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb24jbGFuZ3VhZ2VzXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZXM/OiBMYW5ndWFnZXNDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRvIGltcG9ydCBkYXRhIGFib3V0IHNvdXJjZSBmaWxlIGNoYW5nZXMgZnJvbSB0aGUgc291cmNlIGNvbnRyb2wgbWFuYWdlbWVudCBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI2ltcG9ydC1zY21cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydFNjbT86IEltcG9ydFNjbUNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGxpbWl0IHRoZSBncm91cCBvZiBlbWl0dGVkIEpBUiBmaWxlcyB0byB0aG9zZSBuZWVkZWQgZm9yIGNvbXBpbGF0aW9uIG9mIHRoZSBKYXZhIGZpbGVzLiBUaGUgZGVmYXVsdCBiZWhhdmlvciB3aXRob3V0IHRoaXMgb3B0aW9uIGlzIHRvIGVtaXQgYWxsIHRoZSBKQVIgZmlsZXMgaW4gdGhlIGNsYXNzcGF0aCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgcmVmZXJlbmNlZCBieSBhIEphdmEgZmlsZSBpbiB0aGUgY29tcGlsYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI21pbmltYWwtY2xhc3NwYXRoLWVtaXRcbiAgICovXG4gIHJlYWRvbmx5IG1pbmltYWxDbGFzc3BhdGhFbWl0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZG8gYSBjb21wbGV0ZSBjYXB0dXJlIG9yIGEgcmVjb3JkIHdpdGggc291cmNlIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgY2FwdHVyZS1jb25maWd1cmF0aW9uI3JlY29yZC13aXRoLXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkV2l0aFNvdXJjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgc2VjdXJpdHkgZHluYW1pYyBhbmFseXNpcy4gSWYgc2V0IHRvIHRydWUgKHRoZSBkZWZhdWx0KSwgc2VjdXJpdHkgZHluYW1pYyBhbmFseXNpcyBpcyBydW4gYXMgcGFydCBvZiB0aGUgY2FwdHVyZSBzdGVwLiBJZiBzZXQgdG8gZmFsc2UsIHNlY3VyaXR5IGR5bmFtaWMgYW5hbHlzaXMgaXMgbm90IHJ1bi5cbiAgICpcbiAgICogQHNjaGVtYSBjYXB0dXJlLWNvbmZpZ3VyYXRpb24jc2VjdXJpdHktZGFcbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5RGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAc2NoZW1hIGNhcHR1cmUtY29uZmlndXJhdGlvbiNidWlsZC1jYXB0dXJlXG4gICAqL1xuICByZWFkb25seSBidWlsZENhcHR1cmU/OiBCdWlsZENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NhcHR1cmVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2FwdHVyZUNvbmZpZ3VyYXRpb24ob2JqOiBDYXB0dXJlQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2J1aWxkLWNvbW1hbmQtaW5mZXJlbmNlJzogb2JqLmJ1aWxkQ29tbWFuZEluZmVyZW5jZSxcbiAgICAnY29tcGlsZXItY29uZmlndXJhdGlvbic6IHRvSnNvbl9Db21waWxlckNvbmZpZ3VyYXRpb24ob2JqLmNvbXBpbGVyQ29uZmlndXJhdGlvbiksXG4gICAgJ2Nvdi10cmFuc2xhdGUnOiB0b0pzb25fQ292VHJhbnNsYXRlQ29uZmlndXJhdGlvbihvYmouY292VHJhbnNsYXRlKSxcbiAgICAnZW1pdC1jb21wbGVtZW50YXJ5LWluZm8nOiBvYmouZW1pdENvbXBsZW1lbnRhcnlJbmZvLFxuICAgICdlbmNvZGluZyc6IG9iai5lbmNvZGluZyxcbiAgICAnZmFpbHVyZS10aHJlc2hvbGQtcGVyY2VudCc6IG9iai5mYWlsdXJlVGhyZXNob2xkUGVyY2VudCxcbiAgICAnZmlsZXMnOiB0b0pzb25fRmlsZXNDb25maWd1cmF0aW9uKG9iai5maWxlcyksXG4gICAgJ2ZvcmNlLWRlcGVuZGVuY3ktcmVzb2x1dGlvbic6IG9iai5mb3JjZURlcGVuZGVuY3lSZXNvbHV0aW9uLFxuICAgICdsYW5ndWFnZXMnOiB0b0pzb25fTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbihvYmoubGFuZ3VhZ2VzKSxcbiAgICAnaW1wb3J0LXNjbSc6IHRvSnNvbl9JbXBvcnRTY21Db25maWd1cmF0aW9uKG9iai5pbXBvcnRTY20pLFxuICAgICdtaW5pbWFsLWNsYXNzcGF0aC1lbWl0Jzogb2JqLm1pbmltYWxDbGFzc3BhdGhFbWl0LFxuICAgICdyZWNvcmQtd2l0aC1zb3VyY2UnOiBvYmoucmVjb3JkV2l0aFNvdXJjZSxcbiAgICAnc2VjdXJpdHktZGEnOiBvYmouc2VjdXJpdHlEYSxcbiAgICAnYnVpbGQtY2FwdHVyZSc6IHRvSnNvbl9CdWlsZENvbmZpZ3VyYXRpb24ob2JqLmJ1aWxkQ2FwdHVyZSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hlcmUgdGhlIGFuYWx5c2lzIHJlc3VsdHMgc2hvdWxkIGJlIHNlbnQuXG4gKlxuICogQHNjaGVtYSBjb21taXQtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1pdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ292ZXJpdHkgQ29ubmVjdCBjb25maWd1cmF0aW9uIHRvIHVzZSB3aGVuIGNvbW1pdHRpbmcgZGVmZWN0cyB0byBDb3Zlcml0eSBDb25uZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbW1pdC1jb25maWd1cmF0aW9uI2Nvbm5lY3RcbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Q/OiBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdDtcblxuICAvKipcbiAgICogU29mdHdhcmUgUmlzayBNYW5hZ2VyIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc3RvcmluZyBkZWZlY3RzIGluIFNvZnR3YXJlIFJpc2sgTWFuYWdlci5cbiAgICpcbiAgICogQHNjaGVtYSBjb21taXQtY29uZmlndXJhdGlvbiNzcm1cbiAgICovXG4gIHJlYWRvbmx5IHNybT86IENvbW1pdENvbmZpZ3VyYXRpb25Tcm07XG5cbiAgLyoqXG4gICAqIExvY2FsIGNvbmZpZ3VyYXRpb24gdG8gdXNlIHdoZW4gc2F2aW5nIGRlZmVjdHMgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbW1pdC1jb25maWd1cmF0aW9uI2xvY2FsXG4gICAqL1xuICByZWFkb25seSBsb2NhbD86IENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tbWl0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb24ob2JqOiBDb21taXRDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY29ubmVjdCc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uQ29ubmVjdChvYmouY29ubmVjdCksXG4gICAgJ3NybSc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uU3JtKG9iai5zcm0pLFxuICAgICdsb2NhbCc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uTG9jYWwob2JqLmxvY2FsKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgZm9yIHRoZSBhbmFseXNpcy4gVGhlIGFnZ3Jlc3NpdmVuZXNzIGxldmVsIGNhdXNlcyB0aGUgYW5hbHlzaXMgdG8gbWFrZSBtb3JlIG9yIGxlc3MgYWdncmVzc2l2ZSBhc3N1bXB0aW9ucyBkdXJpbmcgdGhlIGFuYWx5c2lzIHdoZXJlIHRoZSBoaWdoZXIgdGhlIGFnZ3Jlc3NpdmVuZXNzIGxldmVsIHRoZSBtb3JlIGRlZmVjdHMgYXJlIHJlcG9ydGVkLlxuICpcbiAqIEBzY2hlbWEgQW5hbHlzaXNDb25maWd1cmF0aW9uQWdncmVzc2l2ZW5lc3NMZXZlbFxuICovXG5leHBvcnQgZW51bSBBbmFseXNpc0NvbmZpZ3VyYXRpb25BZ2dyZXNzaXZlbmVzc0xldmVsIHtcbiAgLyoqIGxvdyAqL1xuICBMT1cgPSBcImxvd1wiLFxuICAvKiogbWVkaXVtICovXG4gIE1FRElVTSA9IFwibWVkaXVtXCIsXG4gIC8qKiBoaWdoICovXG4gIEhJR0ggPSBcImhpZ2hcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGFsbCBjaGVja2VycyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jYWxsXG4gICAqL1xuICByZWFkb25seSBhbGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbGwgc2VjdXJpdHkgY2hlY2tlcnMgc2hvdWxkIGJlIGVuYWJsZWQuIFRoaXMgaW5jbHVkZXMgdGhlIFNlY3VyaXR5LCBBbmRyb2lkIFNlY3VyaXR5LCBhbmQgV2ViIEFwcCBTZWN1cml0eSBjYXRlZ29yaWVzLCBhbmQgb3RoZXIgc2VjdXJpdHkgY2hlY2tlcnMgdGhhdCByZXF1aXJlIGV4cGxpY2l0IGVuYWJsZW1lbnQuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI2FsbC1zZWN1cml0eVxuICAgKi9cbiAgcmVhZG9ubHkgYWxsU2VjdXJpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyBhbmRyb2lkIHNlY3VyaXR5IGNoZWNrZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNhbmRyb2lkLXNlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSBhbmRyb2lkU2VjdXJpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIGF1ZGl0IGNoZWNrZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNhdWRpdFxuICAgKi9cbiAgcmVhZG9ubHkgYXVkaXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYnJha2VtYW4gY2hlY2tlcnMgc2hvdWxkIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI2JyYWtlbWFuXG4gICAqL1xuICByZWFkb25seSBicmFrZW1hbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQywgQysrLCBPYmplY3RpdmUtQywgT2JqZWN0aXZlLUMrKyBzZWN1cml0eS1yZWxhdGVkIGNoZWNrZXJzIHRoYXQgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI2MtZmFtaWx5LXNlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSBjRmFtaWx5U2VjdXJpdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXAgZnJvbSBjaGVja2VyIG5hbWUgdG8gY29uZmlndXJhdGlvbiBmb3IgdGhlIGNoZWNrZXIuXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjaGVja2VyIHNob3VsZCBiZSBlbmFibGVkIG9yIG5vdCBhbmQgYWxsb3dzIHVzZXJzIHRvIHNldCBvcHRpb25zIHVzZWQgdG8gY29uZmlndXJlIHRoZSBjaGVja2VyLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNjaGVja2VyLWNvbmZpZ1xuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tlckNvbmZpZz86IGFueTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIENvZGVYTSAoLmN4bSkgZmlsZXMgdG8gdXNlIGluIHRoZSBhbmFseXNpcy5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jY29kZXhtXG4gICAqL1xuICByZWFkb25seSBjb2RleG0/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW5hYmxlcyBDLCBDKysgY29uY3VycmVuY3kgY2hlY2tlcnMgdGhhdCBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jY29uY3VycmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSBkZWZhdWx0IHNldCBvZiBjaGVja2Vycy4gSWYgc2V0IHRvIHRydWUsIHRoZSBkZWZhdWx0IHNldCBvZiBjaGVja2VycyBpcyBlbmFibGVkLiBTZXQgdG8gZmFsc2UgdG8gZ2V0IG1vcmUgY29udHJvbCBvdmVyIHdoaWNoIGNoZWNrZXJzIGFyZSBlbmFibGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGNoZWNrZXItY29uZmlndXJhdGlvbiNkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBQTUQgZm9yIEFwZXggYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI3BtZFxuICAgKi9cbiAgcmVhZG9ubHkgcG1kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyByZWNvbW1lbmRlZCBzZWN1cml0eSBjaGVja2Vycy5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jcmVjb21tZW5kZWQtc2VjdXJpdHktY2hlY2tlcnNcbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGVkU2VjdXJpdHlDaGVja2Vycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQywgQysrIHJ1bGUgY2hlY2tlcnMuXG4gICAqXG4gICAqIEBzY2hlbWEgY2hlY2tlci1jb25maWd1cmF0aW9uI3J1bGVcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHdlYiBhcHBsaWNhdGlvbiBzZWN1cml0eSBhbmFseXNpcyBzaG91bGQgYmUgZG9uZS5cbiAgICpcbiAgICogQHNjaGVtYSBjaGVja2VyLWNvbmZpZ3VyYXRpb24jd2ViYXBwLXNlY3VyaXR5XG4gICAqL1xuICByZWFkb25seSB3ZWJhcHBTZWN1cml0eT86IENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NoZWNrZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ2hlY2tlckNvbmZpZ3VyYXRpb24ob2JqOiBDaGVja2VyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FsbCc6IG9iai5hbGwsXG4gICAgJ2FsbC1zZWN1cml0eSc6IG9iai5hbGxTZWN1cml0eSxcbiAgICAnYW5kcm9pZC1zZWN1cml0eSc6IG9iai5hbmRyb2lkU2VjdXJpdHksXG4gICAgJ2F1ZGl0Jzogb2JqLmF1ZGl0LFxuICAgICdicmFrZW1hbic6IG9iai5icmFrZW1hbixcbiAgICAnYy1mYW1pbHktc2VjdXJpdHknOiBvYmouY0ZhbWlseVNlY3VyaXR5LFxuICAgICdjaGVja2VyLWNvbmZpZyc6IG9iai5jaGVja2VyQ29uZmlnLFxuICAgICdjb2RleG0nOiBvYmouY29kZXhtPy5tYXAoeSA9PiB5KSxcbiAgICAnY29uY3VycmVuY3knOiBvYmouY29uY3VycmVuY3ksXG4gICAgJ2RlZmF1bHQnOiBvYmouZGVmYXVsdCxcbiAgICAncG1kJzogb2JqLnBtZCxcbiAgICAncmVjb21tZW5kZWQtc2VjdXJpdHktY2hlY2tlcnMnOiBvYmoucmVjb21tZW5kZWRTZWN1cml0eUNoZWNrZXJzLFxuICAgICdydWxlJzogb2JqLnJ1bGUsXG4gICAgJ3dlYmFwcC1zZWN1cml0eSc6IHRvSnNvbl9DaGVja2VyQ29uZmlndXJhdGlvbldlYmFwcFNlY3VyaXR5KG9iai53ZWJhcHBTZWN1cml0eSksXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEVuYWJsZXMgQVVUT1NBUiBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2F1dG9zYXJjcHAxNFxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b3NhcmNwcDE0PzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgQ0VSVC1DIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jY2VydC1jXG4gICAqL1xuICByZWFkb25seSBjZXJ0Qz86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIENFUlQtQyBSZWNvbW1lbmRhdGlvbiBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2NlcnQtYy1yZWNvbW1lbmRhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgY2VydENSZWNvbW1lbmRhdGlvbj86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIENFUlQtQ1BQIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jY2VydC1jcHBcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRDcHA/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBDRVJULUphdmEgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNjZXJ0LWphdmFcbiAgICovXG4gIHJlYWRvbmx5IGNlcnRKYXZhPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgSFlVTkRBSS1DIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jaHl1bmRhaS1jXG4gICAqL1xuICByZWFkb25seSBoeXVuZGFpQz86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIEhZVU5EQUktQ1BQIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jaHl1bmRhaS1jcHBcbiAgICovXG4gIHJlYWRvbmx5IGh5dW5kYWlDcHA/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBIWVVOREFJLUphdmEgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNoeXVuZGFpLWphdmFcbiAgICovXG4gIHJlYWRvbmx5IGh5dW5kYWlKYXZhPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byB0cnVlLCBhbnkgZGVmZWN0cyBmb3VuZCBpbiBjb2RlIGFubm90YXRlZCB1c2luZyB0aGUgI3ByYWdtYSBDb3Zlcml0eSBjb21wbGlhbmNlIGRpcmVjdGl2ZSB3aWxsIG5vdCBiZSByZXBvcnRlZCBpbiBDb3Zlcml0eSBDb25uZWN0LiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmZWN0cyB0aGF0IHdlcmUgc3VwcHJlc3NlZCBjYW4gdGhlbiBiZSBmb3VuZCBpbiB0d28gZmlsZXM6IGRldmlhdGlvbnMudHh0IGRldmlhdGlvbnMtd2FybmluZ3MudHh0XG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jaWdub3JlLWRldmlhdGVkLWZpbmRpbmdzXG4gICAqL1xuICByZWFkb25seSBpZ25vcmVEZXZpYXRlZEZpbmRpbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBJU08gVFMgMTc5NjEgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNpc28tdHMxNzk2MVxuICAgKi9cbiAgcmVhZG9ubHkgaXNvVHMxNzk2MT86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIE1JU1JBIEMgMjAwNCBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI21pc3JhYzIwMDRcbiAgICovXG4gIHJlYWRvbmx5IG1pc3JhYzIwMDQ/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBNSVNSQSBDIDIwMTIgY29kZSBjb21wbGlhbmNlIGNoZWNraW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNtaXNyYWMyMDEyXG4gICAqL1xuICByZWFkb25seSBtaXNyYWMyMDEyPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgTUlTUkEgQyAyMDIzIGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jbWlzcmFjMjAyM1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzcmFjMjAyMz86IFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIE1JU1JBIEMrKyAyMDA4IGNvZGUgY29tcGxpYW5jZSBjaGVja2luZyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jbWlzcmFjcHAyMDA4XG4gICAqL1xuICByZWFkb25seSBtaXNyYWNwcDIwMDg/OiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogRW5hYmxlcyBNSVNSQSBDKysgMjAyMyBjb2RlIGNvbXBsaWFuY2UgY2hlY2tpbmcgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI21pc3JhY3BwMjAyM1xuICAgKi9cbiAgcmVhZG9ubHkgbWlzcmFjcHAyMDIzPzogU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmo6IENvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F1dG9zYXJjcHAxNCc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouYXV0b3NhcmNwcDE0KSxcbiAgICAnY2VydC1jJzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5jZXJ0QyksXG4gICAgJ2NlcnQtYy1yZWNvbW1lbmRhdGlvbic6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouY2VydENSZWNvbW1lbmRhdGlvbiksXG4gICAgJ2NlcnQtY3BwJzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5jZXJ0Q3BwKSxcbiAgICAnY2VydC1qYXZhJzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5jZXJ0SmF2YSksXG4gICAgJ2h5dW5kYWktYyc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouaHl1bmRhaUMpLFxuICAgICdoeXVuZGFpLWNwcCc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouaHl1bmRhaUNwcCksXG4gICAgJ2h5dW5kYWktamF2YSc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouaHl1bmRhaUphdmEpLFxuICAgICdpZ25vcmUtZGV2aWF0ZWQtZmluZGluZ3MnOiBvYmouaWdub3JlRGV2aWF0ZWRGaW5kaW5ncyxcbiAgICAnaXNvLXRzMTc5NjEnOiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqLmlzb1RzMTc5NjEpLFxuICAgICdtaXNyYWMyMDA0JzogdG9Kc29uX1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iai5taXNyYWMyMDA0KSxcbiAgICAnbWlzcmFjMjAxMic6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmoubWlzcmFjMjAxMiksXG4gICAgJ21pc3JhYzIwMjMnOiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqLm1pc3JhYzIwMjMpLFxuICAgICdtaXNyYWNwcDIwMDgnOiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqLm1pc3JhY3BwMjAwOCksXG4gICAgJ21pc3JhY3BwMjAyMyc6IHRvSnNvbl9TcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmoubWlzcmFjcHAyMDIzKSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgYW5hbHl6ZS1jb25uZWN0LWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplQ29ubmVjdENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGF1dGhlbnRpY2F0aW9uIGtleSBmaWxlIHRvIHVzZSB3aGVuIGF1dGhlbnRpY2F0aW5nIHRvIENvdmVyaXR5IENvbm5lY3QgdG8gcGVyZm9ybSBhbmFseXNpcy4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgbG9jYXRlZCBhdCAkSE9NRS8uY292ZXJpdHkvYWstPGhvc3RuYW1lPi08cG9ydD4gaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWNvbm5lY3QtY29uZmlndXJhdGlvbiNhdXRoLWtleS1maWxlXG4gICAqL1xuICByZWFkb25seSBhdXRoS2V5RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHRvIHRydXN0IGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIGluIHRoZSBzeXN0ZW0gY2VydGlmaWNhdGUgc3RvcmUgYW5kIHRoZSBDb3Zlcml0eSBURlQgc3RvcmUuIEJ5IGRlZmF1bHQgc3lzdGVtIENBIGNlcnRpZmljYXRlcyBhcmUgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWNvbm5lY3QtY29uZmlndXJhdGlvbiNjYS1jZXJ0cy1maWxlXG4gICAqL1xuICByZWFkb25seSBjYUNlcnRzRmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdCwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSBwcm94eSB3aGVuIG1ha2luZyBhIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHl6ZS1jb25uZWN0LWNvbmZpZ3VyYXRpb24jcHJveHktY2xpZW50LWNlcnQtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRDZXJ0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdCwgZm9yIHRoZSBwcm94eS1jbGllbnQtY2VydC1maWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtY29ubmVjdC1jb25maWd1cmF0aW9uI3Byb3h5LWNsaWVudC1rZXktZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRLZXlGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgZm9yIGEgZm9yd2FyZCBwcm94eSB0byB1c2Ugd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggQ292ZXJpdHkgQ29ubmVjdC4gIE11c3QgYmUgYW4gaHR0cHMgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtY29ubmVjdC1jb25maWd1cmF0aW9uI3Byb3h5LXVybFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFydGlmYWN0cyB0byB1cGxvYWQgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gdGhlIGFuYWx5c2lzIGxvY2F0aW9uIGlzIENvbm5lY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHl6ZS1jb25uZWN0LWNvbmZpZ3VyYXRpb24jdXBsb2FkLWFydGlmYWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkQXJ0aWZhY3RzPzogQW5hbHl6ZUNvbm5lY3RDb25maWd1cmF0aW9uVXBsb2FkQXJ0aWZhY3RzO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBVUkwgb2Ygd2hlcmUgdG8gcGVyZm9ybSBDb3Zlcml0eSBDb25uZWN0IGFuYWx5c2lzLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtY29ubmVjdC1jb25maWd1cmF0aW9uI3VybFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0FuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0FuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbihvYmo6IEFuYWx5emVDb25uZWN0Q29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2F1dGgta2V5LWZpbGUnOiBvYmouYXV0aEtleUZpbGUsXG4gICAgJ2NhLWNlcnRzLWZpbGUnOiBvYmouY2FDZXJ0c0ZpbGUsXG4gICAgJ3Byb3h5LWNsaWVudC1jZXJ0LWZpbGUnOiBvYmoucHJveHlDbGllbnRDZXJ0RmlsZSxcbiAgICAncHJveHktY2xpZW50LWtleS1maWxlJzogb2JqLnByb3h5Q2xpZW50S2V5RmlsZSxcbiAgICAncHJveHktdXJsJzogb2JqLnByb3h5VXJsLFxuICAgICd1cGxvYWQtYXJ0aWZhY3RzJzogb2JqLnVwbG9hZEFydGlmYWN0cyxcbiAgICAndXJsJzogb2JqLnVybCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgZGlyZWN0aXZlcy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIHRvIHVzZSBkdXJpbmcgdGhlIGFuYWx5c2lzLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJmaWxlXCIga2V5IGFuZCBpcyBzcGVjaWZpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgd2FudHMgdG8gaW4tbGluZSB0aGUgc2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIGluIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIGRpcmVjdGl2ZXMtY29uZmlndXJhdGlvbiNjb25maWdcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBGaWxlIGNvbnRhaW5pbmcgc2VjdXJpdHkgZGlyZWN0aXZlcyB0byB1c2UgZHVyaW5nIHRoZSBhbmFseXNpcy4gVGhpcyBrZXkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIFwiY29uZmlnXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGRpcmVjdGl2ZXMtY29uZmlndXJhdGlvbiNmaWxlXG4gICAqL1xuICByZWFkb25seSBmaWxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdEaXJlY3RpdmVzQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0RpcmVjdGl2ZXNDb25maWd1cmF0aW9uKG9iajogRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb25maWcnOiB0b0pzb25fRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcob2JqLmNvbmZpZyksXG4gICAgJ2ZpbGUnOiBvYmouZmlsZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgYW5hbHl6ZS1maWxlcy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZUZpbGVzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBHbG9iIHBhdHRlcm4gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGFuYWx5c2lzLiBOb3RlIHRoYXQgYW55IGluY2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgcHJvY2Vzc2VkIHByaW9yIHRvIGhhbmRsaW5nIGV4Y2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWZpbGVzLWNvbmZpZ3VyYXRpb24jZXhjbHVkZS1nbG9iXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlR2xvYj86IHN0cmluZztcblxuICAvKipcbiAgICogUmVndWxhciBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBzZXQgb2Ygc291cmNlIGZpbGVzIHRvIGV4Y2x1ZGUgZnJvbSBhbmFseXNpcy4gTm90ZSB0aGF0IGFueSBpbmNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHByb2Nlc3NlZCBwcmlvciB0byBoYW5kbGluZyBleGNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgYW5hbHl6ZS1maWxlcy1jb25maWd1cmF0aW9uI2V4Y2x1ZGUtcmVnZXhcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVSZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aHMgb2Ygc291cmNlIGZpbGVzIHRvIGFuYWx5emUuIEluY2x1ZGUgYW5kIGV4Y2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgZmlsZXMgYXJlIGFjdHVhbGx5IGFuYWx5emVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWZpbGVzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRmlsZXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdsb2IgcGF0dGVybiB0aGF0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHNvdXJjZSBmaWxlcyB0byBhbmFseXplLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWdsb2JcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVHbG9iPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGaWxlIGNvbnRhaW5pbmcgdGhlIHBhdGhzIG9mIHNvdXJjZSBmaWxlcyB0byBhbmFseXplLCBvbmUgcGVyIGxpbmUuIEluY2x1ZGUgYW5kIGV4Y2x1ZGUgZ2xvYiBwYXR0ZXJucyBhbmQgcmVndWxhciBleHByZXNzaW9ucyBhcmUgYXBwbGllZCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgZmlsZXMgYXJlIGFjdHVhbGx5IGFuYWx5emVkLlxuICAgKlxuICAgKiBAc2NoZW1hIGFuYWx5emUtZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWxpc3QtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUxpc3RGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gYW5hbHl6ZS5cbiAgICpcbiAgICogQHNjaGVtYSBhbmFseXplLWZpbGVzLWNvbmZpZ3VyYXRpb24jaW5jbHVkZS1yZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZVJlZ2V4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdBbmFseXplRmlsZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQW5hbHl6ZUZpbGVzQ29uZmlndXJhdGlvbihvYmo6IEFuYWx5emVGaWxlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleGNsdWRlLWdsb2InOiBvYmouZXhjbHVkZUdsb2IsXG4gICAgJ2V4Y2x1ZGUtcmVnZXgnOiBvYmouZXhjbHVkZVJlZ2V4LFxuICAgICdpbmNsdWRlLWZpbGVzJzogb2JqLmluY2x1ZGVGaWxlcyxcbiAgICAnaW5jbHVkZS1nbG9iJzogb2JqLmluY2x1ZGVHbG9iLFxuICAgICdpbmNsdWRlLWxpc3QtZmlsZSc6IG9iai5pbmNsdWRlTGlzdEZpbGUsXG4gICAgJ2luY2x1ZGUtcmVnZXgnOiBvYmouaW5jbHVkZVJlZ2V4LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBqb2JzLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgbnVtYmVyIG9mIGFuYWx5c2lzIHdvcmtlcnMgdG8gcnVuIGluIHBhcmFsbGVsIGlzIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IGFuZCBudW1iZXIgb2YgbG9naWNhbCBwcm9jZXNzb3JzIGluIHRoZSBtYWNoaW5lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGZvciBhIG5vbi1GbGV4bmV0IGxpY2Vuc2UuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImNvdW50XCIgYW5kIFwibWF4XCIga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBqb2JzLWNvbmZpZ3VyYXRpb24jYXV0b1xuICAgKi9cbiAgcmVhZG9ubHkgYXV0bz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBhbmFseXNpcyB3b3JrZXJzIHRvIHJ1biBpbiBwYXJhbGxlbC4gVGhpcyBrZXkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIFwiYXV0b1wiIGFuZCBcIm1heFwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgam9icy1jb25maWd1cmF0aW9uI2NvdW50XG4gICAqL1xuICByZWFkb25seSBjb3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgYW5hbHlzaXMgd29ya2VyIHRvIHJ1biBpbiBwYXJhbGxlbCwgc3ViamVjdCB0byBsaW1pdHMgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgYW5kIG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgaW4gdGhlIG1hY2hpbmUuIEEgdmFsdWUgb2YgOCBpcyB0aGUgZGVmYXVsdCBmb3IgYSBGbGV4bmV0IGxpY2Vuc2UuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImF1dG9cIiBhbmQgXCJjb3VudFwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgam9icy1jb25maWd1cmF0aW9uI21heFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIG51bWJlciBvZiBhbmFseXNpcyB3b3JrZXJzIHRvIGV4Y2VlZCB0aGUgcmVjb21tZW5kZWQgdmFsdWUuIFRoaXMga2V5IG1heSBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgXCJjb3VudFwiIGtleS5cbiAgICpcbiAgICogQHNjaGVtYSBqb2JzLWNvbmZpZ3VyYXRpb24jb3ZlcnJpZGUtd29ya2VyLWxpbWl0XG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZVdvcmtlckxpbWl0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnSm9ic0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Kb2JzQ29uZmlndXJhdGlvbihvYmo6IEpvYnNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYXV0byc6IG9iai5hdXRvLFxuICAgICdjb3VudCc6IG9iai5jb3VudCxcbiAgICAnbWF4Jzogb2JqLm1heCxcbiAgICAnb3ZlcnJpZGUtd29ya2VyLWxpbWl0Jzogb2JqLm92ZXJyaWRlV29ya2VyTGltaXQsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgYW5hbHlzaXMgc2hvdWxkIGJlIGRvbmUgbG9jYWxseSwgaW4gQ292ZXJpdHkgQ29ubmVjdCwgb3IgaW4gU29mdHdhcmUgUmlzayBNYW5hZ2VyLiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOiBjb25uZWN0IC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBqb2IgZmFybTsgc3JtIC0gUnVuIHRoZSBhbmFseXNpcyBpbiB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIGpvYiBmYXJtOyBsb2NhbCAtIFJ1biB0aGUgYW5hbHlzaXMgbG9jYWxseVxuICpcbiAqIEBzY2hlbWEgQW5hbHlzaXNDb25maWd1cmF0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gQW5hbHlzaXNDb25maWd1cmF0aW9uTG9jYXRpb24ge1xuICAvKiogbG9jYWwgKi9cbiAgTE9DQUwgPSBcImxvY2FsXCIsXG4gIC8qKiBjb25uZWN0ICovXG4gIENPTk5FQ1QgPSBcImNvbm5lY3RcIixcbiAgLyoqIHNybSAqL1xuICBTUk0gPSBcInNybVwiLFxufVxuXG4vKipcbiAqIEFuYWx5c2lzIG1vZGU6IFwicGZpXCIgKHBlcmZlY3QgZmlkZWxpdHkgaW5jcmVtZW50YWwpIGZvciBjb21wbGV0ZSBhbmFseXNpczsgb3IgXCJoZmlcIiAoaGlnaCBmaWRlbGl0eSBpbmNyZW1lbnRhbCkgZm9yIGFuYWx5c2lzIG9mIG9ubHkgc3BlY2lmaWMgZmlsZXMgc3BlY2lmaWVkIGJ5IGFuYWx5emUuZmlsZXMgc2V0dGluZ3MsIG9taXR0aW5nIGFueSBvdGhlciBmaWxlcyB3aGljaCBtYXkgaGF2ZSBiZWVuIGluY2lkZW50YWxseSBjYXB0dXJlZCBieSB0aGUgYnVpbGQuIEFuIFwiaGZpXCIgYW5hbHlzaXMgY2FuIGJlIGZhc3RlciBidXQgbWF5IHByb2R1Y2UgcmVzdWx0cyB3aGljaCBhcmUgaW5jb21wbGV0ZSBvciBpbmNvbnNpc3RlbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBjb250ZXh0LCBhbmQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIHNwZWVkIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gYWNjdXJhY3kuXG4gKlxuICogQHNjaGVtYSBBbmFseXNpc0NvbmZpZ3VyYXRpb25Nb2RlXG4gKi9cbmV4cG9ydCBlbnVtIEFuYWx5c2lzQ29uZmlndXJhdGlvbk1vZGUge1xuICAvKiogaGZpICovXG4gIEhGSSA9IFwiaGZpXCIsXG4gIC8qKiBwZmkgKi9cbiAgUEZJID0gXCJwZmlcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIHBhcnNlLXdhcm5pbmdzLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZVdhcm5pbmdzQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnNlIHdhcm5pbmdzLCByZWNvdmVyeSB3YXJuaW5ncywgYW5kIHNlbWFudGljIHdhcm5pbmdzIHRoYXQgYXJlIHByb2R1Y2VkIGJ5IHRoZSBjb3YtYnVpbGQgY29tbWFuZCBzbyB0aGF0IHRoZXkgYXBwZWFyIGFzIGRlZmVjdHMgaW4gQ292ZXJpdHkgQ29ubmVjdC4gQnkgZGVmYXVsdCwgdGhpcyBpcyBkaXNhYmxlZCBpZiB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgaXMgbG93LCBhbmQgZW5hYmxlZCBpZiB0aGUgYWdncmVzc2l2ZW5lc3MgbGV2ZWwgaXMgbWVkaXVtIG9yIGhpZ2guXG4gICAqXG4gICAqIEBzY2hlbWEgcGFyc2Utd2FybmluZ3MtY29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUGFyc2VXYXJuaW5nc0NvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9QYXJzZVdhcm5pbmdzQ29uZmlndXJhdGlvbihvYmo6IFBhcnNlV2FybmluZ3NDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBzaWdtYS1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbWFDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgY2hlY2sgc2V0cyB0byBlbmFibGUuXG4gICAqXG4gICAqIEBzY2hlbWEgc2lnbWEtY29uZmlndXJhdGlvbiNlbmFibGUtY2hlY2stc2V0XG4gICAqL1xuICByZWFkb25seSBlbmFibGVDaGVja1NldD86IFNpZ21hQ29uZmlndXJhdGlvbkVuYWJsZUNoZWNrU2V0W107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZmlsZXMgY29udGFpbmluZyBtYWxpY2lvdXMgVVJMIHBhdHRlcm5zLlxuICAgKlxuICAgKiBAc2NoZW1hIHNpZ21hLWNvbmZpZ3VyYXRpb24jbWFsaWNpb3VzLXVybC1wYXR0ZXJucy1maWxlXG4gICAqL1xuICByZWFkb25seSBtYWxpY2lvdXNVcmxQYXR0ZXJuc0ZpbGU/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU2lnbWFDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU2lnbWFDb25maWd1cmF0aW9uKG9iajogU2lnbWFDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlLWNoZWNrLXNldCc6IG9iai5lbmFibGVDaGVja1NldD8ubWFwKHkgPT4geSksXG4gICAgJ21hbGljaW91cy11cmwtcGF0dGVybnMtZmlsZSc6IG9iai5tYWxpY2lvdXNVcmxQYXR0ZXJuc0ZpbGU/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBjb21waWxlci1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZXJDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gXCJjb3YtY29uZmlndXJlXCIgdG8gZ2VuZXJhdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGR1cmluZyBjYXB0dXJlLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJmaWxlXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbXBpbGVyLWNvbmZpZ3VyYXRpb24jY292LWNvbmZpZ3VyZVxuICAgKi9cbiAgcmVhZG9ubHkgY292Q29uZmlndXJlPzogc3RyaW5nW11bXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGEgcHJlLWdlbmVyYXRlZCBjb21waWxlciBjb25maWd1cmF0aW9uIGZpbGUgdG8gdXNlLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJjb3YtY29uZmlndXJlXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGNvbXBpbGVyLWNvbmZpZ3VyYXRpb24jZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tcGlsZXJDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ29tcGlsZXJDb25maWd1cmF0aW9uKG9iajogQ29tcGlsZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnY292LWNvbmZpZ3VyZSc6IG9iai5jb3ZDb25maWd1cmU/Lm1hcCh5ID0+IHk/Lm1hcCh5ID0+IHkpKSxcbiAgICAnZmlsZSc6IG9iai5maWxlLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQ29tbWFuZCB0byBpbnZva2UgdGhhdCB3aWxsIGludm9rZSBcImNvdi10cmFuc2xhdGVcIiB0byBjYXB0dXJlIHRoZSBwcm9qZWN0LlxuICpcbiAqIEBzY2hlbWEgY292LXRyYW5zbGF0ZS1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ292VHJhbnNsYXRlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGlzIGtleSBzcGVjaWZpZXMgYSBjb21tYW5kIHRvIGludm9rZSB0aGF0IHdpbGwgaW52b2tlIFwiY292LXRyYW5zbGF0ZVwiIGluIHRoZSBjYXNlIHdoZXJlIHRoZSB1c2VyIGlzIGRvaW5nIGEgXCJjb3YtdHJhbnNsYXRlXCIgY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBjb3YtdHJhbnNsYXRlLWNvbmZpZ3VyYXRpb24jY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGNvdi1idWlsZCB3aGVuIGludm9raW5nIHRoZSBwcm92aWRlZCBjb21tYW5kLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvdi10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNjb3YtYnVpbGQtYXJnc1xuICAgKi9cbiAgcmVhZG9ubHkgY292QnVpbGRBcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBidWlsZCBzaG91bGQgb25seSByZWNvcmQgdGhlIGRlY29tcGlsYXRpb25zIG9mIGJ5dGUgY29kZSBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBub3QgYXR0ZW1wdCB0byBkZWNvbXBpbGUgYW5kIGVtaXQgdGhlIGJ5dGUgY29kZS4gRHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZSwgY292LWJ1aWxkIHdpbGwgYmUgcmVydW4gd2l0aCAtLXJlcGxheS1kZWNvbXAgdG8gZGVjb21waWxlIGFuZCBlbWl0IHRoZSBieXRlIGNvZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgY292LXRyYW5zbGF0ZS1jb25maWd1cmF0aW9uI2RlZmVyLWRlY29tcFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmZXJEZWNvbXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRvIHBhcmFsbGVsaXplIHRyYW5zbGF0aW9uIG9mIEMgYW5kIEMrKyBjb2RlLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvdi10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNwYXJhbGxlbC10cmFuc2xhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFsbGVsVHJhbnNsYXRlPzogUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgdGhlIGNvbGxlY3Rpb24gb2Ygc2NhbiB0cmFuc3BhcmVuY3kgZGF0YSBmb3IgY292LXRyYW5zbGF0ZSBjYXB0dXJlLiBUaGlzIHNldHRpbmcgbXVzdCBiZSBlbmFibGVkIGlmIHRoZSBDb3Zlcml0eSBDb25uZWN0IGluc3RhbmNlIGhhcyAnc2Nhbi50cmFuc3BhcmVuY3kuZW5hYmxlZD10cnVlJyBpbiBpdHMgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBjb3YtdHJhbnNsYXRlLWNvbmZpZ3VyYXRpb24jc2Nhbi10cmFuc3BhcmVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5UcmFuc3BhcmVuY3k/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb3ZUcmFuc2xhdGVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ292VHJhbnNsYXRlQ29uZmlndXJhdGlvbihvYmo6IENvdlRyYW5zbGF0ZUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb21tYW5kJzogb2JqLmNvbW1hbmQsXG4gICAgJ2Nvdi1idWlsZC1hcmdzJzogb2JqLmNvdkJ1aWxkQXJncz8ubWFwKHkgPT4geSksXG4gICAgJ2RlZmVyLWRlY29tcCc6IG9iai5kZWZlckRlY29tcCxcbiAgICAncGFyYWxsZWwtdHJhbnNsYXRlJzogdG9Kc29uX1BhcmFsbGVsVHJhbnNsYXRlQ29uZmlndXJhdGlvbihvYmoucGFyYWxsZWxUcmFuc2xhdGUpLFxuICAgICdzY2FuLXRyYW5zcGFyZW5jeSc6IG9iai5zY2FuVHJhbnNwYXJlbmN5LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZXNDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBjYXB0dXJlIG9mIG1pbmlmaWVkIEphdmFTY3JpcHQgZmlsZXMuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNlbWl0LW1pbmlmaWVkLWpzXG4gICAqL1xuICByZWFkb25seSBlbWl0TWluaWZpZWRKcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEdsb2IgcGF0dGVybiB0aGF0IHNwZWNpZmllcyB0aGUgc2V0IG9mIHNvdXJjZSBmaWxlcyB0byBleGNsdWRlIGZyb20gY2FwdHVyZS4gTm90ZSB0aGF0IGFueSBpbmNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHByb2Nlc3NlZCBwcmlvciB0byBoYW5kbGluZyBleGNsdWRlIGdsb2IgcGF0dGVybnMgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNleGNsdWRlLWdsb2JcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVHbG9iPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGNhcHR1cmUuIE5vdGUgdGhhdCBhbnkgaW5jbHVkZSBnbG9iIHBhdHRlcm5zIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBwcm9jZXNzZWQgcHJpb3IgdG8gaGFuZGxpbmcgZXhjbHVkZSBnbG9iIHBhdHRlcm5zIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zLlxuICAgKlxuICAgKiBAc2NoZW1hIGZpbGVzLWNvbmZpZ3VyYXRpb24jZXhjbHVkZS1yZWdleFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZVJlZ2V4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGRpcmVjdG9yeSBiYXNlbmFtZXMgdG8gaW5jbHVkZSBmb3IgY2FwdHVyZSwgd2hpY2ggd291bGQgbm9ybWFsbHkgaGF2ZSBiZWVuIGV4Y2x1ZGVkLiBCeSBkZWZhdWx0LCBkaXJlY3RvcmllcyBuYW1lZCBcInZlbmRvclwiIG9yIFwibm9kZV9tb2R1bGVzXCIgYXJlIGV4Y2x1ZGVkLCBhcyBhcmUgZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBcIi5cIlxuICAgKlxuICAgKiBAc2NoZW1hIGZpbGVzLWNvbmZpZ3VyYXRpb24jaW5jbHVkZS1kaXJzXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlRGlycz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBHbG9iIHBhdHRlcm4gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2luY2x1ZGUtZ2xvYlxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUdsb2I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGUgY29udGFpbmluZyB0aGUgcGF0aHMgb2Ygc291cmNlIGZpbGVzIHRvIGNhcHR1cmUsIG9uZSBwZXIgbGluZS4gSW5jbHVkZSBhbmQgZXhjbHVkZSBnbG9iIHBhdHRlcm5zIGFuZCByZWd1bGFyIGV4cHJlc3Npb25zIGFyZSBhcHBsaWVkIHRvIGRldGVybWluZSB3aGljaCBvZiB0aGVzZSBmaWxlcyBhcmUgYWN0dWFsbHkgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNpbmNsdWRlLWxpc3QtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUxpc3RGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBzcGVjaWZpZXMgdGhlIHNldCBvZiBzb3VyY2UgZmlsZXMgdG8gY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2luY2x1ZGUtcmVnZXhcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGVSZWdleD86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBKYXZhIHZlcnNpb24gdG8gdXNlIHdoZW4gcGFyc2luZyBhbmQgZW1pdHRpbmcgSmF2YSBzb3VyY2UgZmlsZXMgd2l0aCBidWlsZGxlc3MgY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2phdmEtdmVyc2lvblxuICAgKi9cbiAgcmVhZG9ubHkgamF2YVZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gbG9vayBpbiBmb3IgZGVwZW5kZW5jaWVzIHRvIHVzZSBkdXJpbmcgY2FwdHVyZS5cbiAgICpcbiAgICogQHNjaGVtYSBmaWxlcy1jb25maWd1cmF0aW9uI2xpYnJhcnktZGlyc1xuICAgKi9cbiAgcmVhZG9ubHkgbGlicmFyeURpcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBmaWxlIGRlcGVuZGVuY2llcyB0byB1c2UgZHVyaW5nIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiNsaWJyYXJ5LWZpbGVzXG4gICAqL1xuICByZWFkb25seSBsaWJyYXJ5RmlsZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIHdlYi1hcHBsaWNhdGlvbiBhcmNoaXZlcyBzaG91bGQgYmUgY2FwdHVyZWQuIEJ5IGRlZmF1bHQgYWxsIHdlYmFwcCBhcmNoaXZlcyBhcmUgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgZmlsZXMtY29uZmlndXJhdGlvbiN3ZWJhcHAtYXJjaGl2ZXNcbiAgICovXG4gIHJlYWRvbmx5IHdlYmFwcEFyY2hpdmVzPzogV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb25bXTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnRmlsZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fRmlsZXNDb25maWd1cmF0aW9uKG9iajogRmlsZXNDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW1pdC1taW5pZmllZC1qcyc6IG9iai5lbWl0TWluaWZpZWRKcyxcbiAgICAnZXhjbHVkZS1nbG9iJzogb2JqLmV4Y2x1ZGVHbG9iLFxuICAgICdleGNsdWRlLXJlZ2V4Jzogb2JqLmV4Y2x1ZGVSZWdleCxcbiAgICAnaW5jbHVkZS1kaXJzJzogb2JqLmluY2x1ZGVEaXJzPy5tYXAoeSA9PiB5KSxcbiAgICAnaW5jbHVkZS1nbG9iJzogb2JqLmluY2x1ZGVHbG9iLFxuICAgICdpbmNsdWRlLWxpc3QtZmlsZSc6IG9iai5pbmNsdWRlTGlzdEZpbGUsXG4gICAgJ2luY2x1ZGUtcmVnZXgnOiBvYmouaW5jbHVkZVJlZ2V4LFxuICAgICdqYXZhLXZlcnNpb24nOiBvYmouamF2YVZlcnNpb24sXG4gICAgJ2xpYnJhcnktZGlycyc6IG9iai5saWJyYXJ5RGlycz8ubWFwKHkgPT4geSksXG4gICAgJ2xpYnJhcnktZmlsZXMnOiBvYmoubGlicmFyeUZpbGVzPy5tYXAoeSA9PiB5KSxcbiAgICAnd2ViYXBwLWFyY2hpdmVzJzogb2JqLndlYmFwcEFyY2hpdmVzPy5tYXAoeSA9PiB0b0pzb25fV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb24oeSkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBsYW5ndWFnZXMtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhbmd1YWdlc0NvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBsYW5ndWFnZXMgZm9yIHdoaWNoIHRoZSBzb3VyY2UgY29kZSBzaG91bGQgYmUgZXhjbHVkZWQgaW4gdGhlIGNhcHR1cmUuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImluY2x1ZGVcIiBrZXkuXG4gICAqXG4gICAqIEBzY2hlbWEgbGFuZ3VhZ2VzLWNvbmZpZ3VyYXRpb24jZXhjbHVkZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IExhbmd1YWdlc0NvbmZpZ3VyYXRpb25FeGNsdWRlW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2VzIGZvciB3aGljaCB0aGUgc291cmNlIGNvZGUgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjYXB0dXJlLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJleGNsdWRlXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIGxhbmd1YWdlcy1jb25maWd1cmF0aW9uI2luY2x1ZGVcbiAgICovXG4gIHJlYWRvbmx5IGluY2x1ZGU/OiBMYW5ndWFnZXNDb25maWd1cmF0aW9uSW5jbHVkZVtdO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdMYW5ndWFnZXNDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbihvYmo6IExhbmd1YWdlc0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdleGNsdWRlJzogb2JqLmV4Y2x1ZGU/Lm1hcCh5ID0+IHkpLFxuICAgICdpbmNsdWRlJzogb2JqLmluY2x1ZGU/Lm1hcCh5ID0+IHkpLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBpbXBvcnQtc2NtLWNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRTY21Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gY292LWltcG9ydC1zY20gZm9sbG93aW5nIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI2Nvdi1pbXBvcnQtc2NtLWFyZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNvdkltcG9ydFNjbUFyZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUmVndWxhciBleHByZXNzaW9uIHRoYXQgc3BlY2lmaWVzIHRoZSBzZXQgb2YgZmlsZXMgZm9yIHdoaWNoIHRvIGltcG9ydCBjaGFuZ2UgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI2ZpbGVuYW1lLXJlZ2V4XG4gICAqL1xuICByZWFkb25seSBmaWxlbmFtZVJlZ2V4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBjYWxscyB0byB0aGUgdW5kZXJseWluZyBTQ00uXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI21zLWRlbGF5XG4gICAqL1xuICByZWFkb25seSBtc0RlbGF5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc291cmNlIGNvbnRyb2wgbWFuYWdlbWVudCBzeXN0ZW0uXG4gICAqXG4gICAqIEBzY2hlbWEgaW1wb3J0LXNjbS1jb25maWd1cmF0aW9uI3NjbVxuICAgKi9cbiAgcmVhZG9ubHkgc2NtPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdJbXBvcnRTY21Db25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fSW1wb3J0U2NtQ29uZmlndXJhdGlvbihvYmo6IEltcG9ydFNjbUNvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdjb3YtaW1wb3J0LXNjbS1hcmdzJzogb2JqLmNvdkltcG9ydFNjbUFyZ3M/Lm1hcCh5ID0+IHkpLFxuICAgICdmaWxlbmFtZS1yZWdleCc6IG9iai5maWxlbmFtZVJlZ2V4LFxuICAgICdtcy1kZWxheSc6IG9iai5tc0RlbGF5LFxuICAgICdzY20nOiBvYmouc2NtLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIHRoYXQgYnVpbGQgY2FwdHVyZSBzaG91bGQgYmUgdXNlZCB0byBjYXB0dXJlIHRoZSBwcm9qZWN0IGFuZCBwcm92aWRlcyB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiB0byB1c2UuIElmIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSBjb250YWlucyBjb21waWxlZCBzb3VyY2UgZmlsZXMgdGhlbiBhdXRvbWF0aWMgYnVpbGQgY2FwdHVyZSB3aWxsIGJlIHVzZWQgdG8gY2FwdHVyZSBjb21waWxlZCBzb3VyY2UgZmlsZXMgaW4gdGhlIHByb2plY3QgZGlyZWN0b3J5LlxuICpcbiAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgYXV0b21hdGljIGludm9jYXRpb24gb2YgQXNwbmV0X2NvbXBpbGVyLmV4ZSBmb3IgYW55IEFTUC5ORVQgNCBhbmQgZWFybGllciBXZWIgYXBwbGljYXRpb25zIHRoYXQgYXJlIGRldGVjdGVkIGluIHRoZSBidWlsZC4gVGhlIG91dHB1dCBvZiBBc3BuZXRfY29tcGlsZXIuZXhlIGlzIHJlcXVpcmVkIGJ5IHRoZSBDIyBhbmQgVmlzdWFsIEJhc2ljIHNlY3VyaXR5IGNoZWNrZXJzLlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jYXNwbmV0LWNvbXBpbGVyXG4gICAqL1xuICByZWFkb25seSBhc3BuZXRDb21waWxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBCYXplbCBjYXB0dXJlLlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jYmF6ZWxcbiAgICovXG4gIHJlYWRvbmx5IGJhemVsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGJ1aWxkIGNvbW1hbmQgd2lsbCBiZSBpbnZva2VkIHRvIHVzZSBidWlsZCBjYXB0dXJlIHRvIGNhcHR1cmUgdGhlIHByb2plY3QuIEEgYnVpbGQgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZSB3aWxsIG92ZXJyaWRlIHRoaXMgc2V0dGluZy5cbiAgICpcbiAgICogQHNjaGVtYSBidWlsZC1jb25maWd1cmF0aW9uI2J1aWxkLWNvbW1hbmRcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY2xlYW4gY29tbWFuZCB3aWxsIGJlIGludm9rZWQgcHJpb3IgdG8gZG9pbmcgYnVpbGQgY2FwdHVyZSB0byBjYXB0dXJlIHRoZSBwcm9qZWN0LlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jY2xlYW4tY29tbWFuZFxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW5Db21tYW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGNvdi1idWlsZCB3aGVuIGRvaW5nIGJ1aWxkIGNhcHR1cmUuXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNjb3YtYnVpbGQtYXJnc1xuICAgKi9cbiAgcmVhZG9ubHkgY292QnVpbGRBcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBidWlsZCBzaG91bGQgb25seSByZWNvcmQgdGhlIGRlY29tcGlsYXRpb25zIG9mIGJ5dGUgY29kZSBkdXJpbmcgdGhlIGJ1aWxkIGFuZCBub3QgYXR0ZW1wdCB0byBkZWNvbXBpbGUgYW5kIGVtaXQgdGhlIGJ5dGUgY29kZS4gRHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZSwgY292LWJ1aWxkIHdpbGwgYmUgcmVydW4gd2l0aCAtLXJlcGxheS1kZWNvbXAgdG8gZGVjb21waWxlIGFuZCBlbWl0IHRoZSBieXRlIGNvZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNkZWZlci1kZWNvbXBcbiAgICovXG4gIHJlYWRvbmx5IGRlZmVyRGVjb21wPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHRoZSBpbnN0cnVtZW50YXRpb24gbW9kZSBpbnN0ZWFkIG9mIHRoZSBkZWJ1Z2dlci4gRm9yIGNlcnRhaW4gYnVpbGRzLCB0aGlzIGNvbmZpZ3VyYXRpb24gY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSBidWlsZCB0aW1lcy4gVGhpcyBzZXR0aW5nIGlzIGFwcGxpY2FibGUgb25seSBvbiBXaW5kb3dzLlxuICAgKlxuICAgKiBAc2NoZW1hIGJ1aWxkLWNvbmZpZ3VyYXRpb24jaW5zdHJ1bWVudFxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdHJ1bWVudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgdG8gcGFyYWxsZWxpemUgdHJhbnNsYXRpb24gb2YgQyBhbmQgQysrIGNvZGUuXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNwYXJhbGxlbC10cmFuc2xhdGVcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFsbGVsVHJhbnNsYXRlPzogUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgdGhlIGNvbGxlY3Rpb24gb2Ygc2NhbiB0cmFuc3BhcmVuY3kgZGF0YSBmb3IgYnVpbGQgY2FwdHVyZS4gVGhpcyBzZXR0aW5nIG11c3QgYmUgZW5hYmxlZCBpZiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBpbnN0YW5jZSBoYXMgJ3NjYW4udHJhbnNwYXJlbmN5LmVuYWJsZWQ9dHJ1ZScgaW4gaXRzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgYnVpbGQtY29uZmlndXJhdGlvbiNzY2FuLXRyYW5zcGFyZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgc2NhblRyYW5zcGFyZW5jeT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ0J1aWxkQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0J1aWxkQ29uZmlndXJhdGlvbihvYmo6IEJ1aWxkQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2FzcG5ldC1jb21waWxlcic6IG9iai5hc3BuZXRDb21waWxlcixcbiAgICAnYmF6ZWwnOiBvYmouYmF6ZWwsXG4gICAgJ2J1aWxkLWNvbW1hbmQnOiBvYmouYnVpbGRDb21tYW5kLFxuICAgICdjbGVhbi1jb21tYW5kJzogb2JqLmNsZWFuQ29tbWFuZCxcbiAgICAnY292LWJ1aWxkLWFyZ3MnOiBvYmouY292QnVpbGRBcmdzPy5tYXAoeSA9PiB5KSxcbiAgICAnZGVmZXItZGVjb21wJzogb2JqLmRlZmVyRGVjb21wLFxuICAgICdpbnN0cnVtZW50Jzogb2JqLmluc3RydW1lbnQsXG4gICAgJ3BhcmFsbGVsLXRyYW5zbGF0ZSc6IHRvSnNvbl9QYXJhbGxlbFRyYW5zbGF0ZUNvbmZpZ3VyYXRpb24ob2JqLnBhcmFsbGVsVHJhbnNsYXRlKSxcbiAgICAnc2Nhbi10cmFuc3BhcmVuY3knOiBvYmouc2NhblRyYW5zcGFyZW5jeSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIENvdmVyaXR5IENvbm5lY3QgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBjb21taXR0aW5nIGRlZmVjdHMgdG8gQ292ZXJpdHkgQ29ubmVjdC5cbiAqXG4gKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3Qge1xuICAvKipcbiAgICogVGhlIGF1dGhlbnRpY2F0aW9uIGtleSBmaWxlIHRvIHVzZSB3aGVuIGF1dGhlbnRpY2F0aW5nIHRvIENvdmVyaXR5IENvbm5lY3QgdG8gY29tbWl0IGRlZmVjdHMuIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGxvY2F0ZWQgYXQgJEhPTUUvLmNvdmVyaXR5L2FrLTxob3N0bmFtZT4tPHBvcnQ+IGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjYXV0aC1rZXktZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aEtleUZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZpbGUgY29udGFpbmluZyBhZGRpdGlvbmFsIGNlcnRpZmljYXRlcyB0byB0cnVzdCBpbiBhZGRpdGlvbiB0byB0aGUgb25lcyBpbiB0aGUgc3lzdGVtIGNlcnRpZmljYXRlIHN0b3JlIGFuZCB0aGUgQ292ZXJpdHkgVEZUIHN0b3JlLiBCeSBkZWZhdWx0IHN5c3RlbSBDQSBjZXJ0aWZpY2F0ZXMgYXJlIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjY2EtY2VydHMtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FDZXJ0c0ZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGFuYWx5c2lzIHJlc3VsdHMgd2lsbCBub3QgYmUgY29tbWl0dGVkIHRvIENvdmVyaXR5IENvbm5lY3QuICBJbnN0ZWFkLCByZXN1bHRzIGNvbXBhcmVkIHRvIGEgcmVmZXJlbmNlIHNuYXBzaG90IG1heSBiZSBzYXZlZCBsb2NhbGx5IGFzIHNwZWNpZmllZCBieSB0aGUgXCJjb21taXQubG9jYWxcIiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCNjb21wYXJpc29uLW9ubHlcbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhcmlzb25Pbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3V0cHV0IGZpbGUgdG8gd2hpY2ggYW5hbHlzaXMgcmVzdWx0cyBzaG91bGQgYmUgd3JpdHRlbiBpbnN0ZWFkIG9mIGJlaW5nIGNvbW1pdHRlZCB0byBDb3Zlcml0eSBDb25uZWN0LiBUaGUgb3V0cHV0IGluY2x1ZGVzIGEgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBsYXRlc3Qgc25hcHNob3QgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I2NvbXBhcmlzb24tcmVwb3J0XG4gICAqL1xuICByZWFkb25seSBjb21wYXJpc29uUmVwb3J0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIFwiY292LWNvbW1pdC1kZWZlY3RzXCIgZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjY292LWNvbW1pdC1kZWZlY3RzLWFyZ3NcbiAgICovXG4gIHJlYWRvbmx5IGNvdkNvbW1pdERlZmVjdHNBcmdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSBjb21taXR0ZWQgc25hcHNob3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB0cnVzdCBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgcHJlc2VudGVkIGJ5IENvdmVyaXR5IENvbm5lY3QgdGhhdCBhcmUgbm90IGN1cnJlbnRseSB0cnVzdGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I29uLW5ldy1jZXJ0XG4gICAqL1xuICByZWFkb25seSBvbk5ld0NlcnQ/OiBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdE9uTmV3Q2VydDtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBuZXcgc3RyZWFtLiBJZ25vcmVkIHdoZW4gc3RyZWFtIGNyZWF0aW9uIGlzIG5vdCBuZWVkZWQuIEJ5IGRlZmF1bHQgdGhlIHN0cmVhbSBuYW1lIGlzIHVzZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjcHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdD86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgaW4gUEVNIGZvcm1hdCwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSBwcm94eSB3aGVuIG1ha2luZyBhIHJlcXVlc3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjcHJveHktY2xpZW50LWNlcnQtZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRDZXJ0RmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgaW4gUEVNIGZvcm1hdCwgZm9yIHRoZSBwcm94eS1jbGllbnQtY2VydC1maWxlLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I3Byb3h5LWNsaWVudC1rZXktZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlDbGllbnRLZXlGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVUkwgZm9yIGEgZm9yd2FyZCBwcm94eSB0byB1c2Ugd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggQ292ZXJpdHkgQ29ubmVjdC4gIE11c3QgYmUgYW4gaHR0cHMgVVJMLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I3Byb3h5LXVybFxuICAgKi9cbiAgcmVhZG9ubHkgcHJveHlVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgY29udHJvbCBtYW5hZ2VtZW50IHN5c3RlbS5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCNzY21cbiAgICovXG4gIHJlYWRvbmx5IHNjbT86IENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0U2NtO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IHRvIHNlbGVjdCBhIHJlZmVyZW5jZSBzbmFwc2hvdCB0byB1c2UgZm9yIGEgY29tcGFyaXNvbiByZXBvcnQuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3Qjc25hcHNob3RcbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90PzogU25hcHNob3RDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RyZWFtIHRvIGNvbW1pdCB0aGUgcmVzdWx0cyB0by5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCNzdHJlYW1cbiAgICovXG4gIHJlYWRvbmx5IHN0cmVhbTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgaG93IG5ldyBkZWZlY3RzIHNob3VsZCBiZSBoYW5kbGVkLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0I3RyaWFnZVxuICAgKi9cbiAgcmVhZG9ubHkgdHJpYWdlPzogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RUcmlhZ2U7XG5cbiAgLyoqXG4gICAqIEFydGlmYWN0cyB0byB1cGxvYWQgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gdGhlIGFuYWx5c2lzIGxvY2F0aW9uIGlzIENvbm5lY3QuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QjdXBsb2FkLWFydGlmYWN0c1xuICAgKi9cbiAgcmVhZG9ubHkgdXBsb2FkQXJ0aWZhY3RzPzogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RVcGxvYWRBcnRpZmFjdHM7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIFVSTCBvZiB3aGVyZSB0byBjb21taXQgdGhlIENvdmVyaXR5IENvbm5lY3QgcmVzdWx0cy5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCN1cmxcbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHByb2plY3QgdmVyc2lvbiBmb3IgdGhlIGNvbW1pdHRlZCBzbmFwc2hvdC5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdCcgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0KG9iajogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3QgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdhdXRoLWtleS1maWxlJzogb2JqLmF1dGhLZXlGaWxlLFxuICAgICdjYS1jZXJ0cy1maWxlJzogb2JqLmNhQ2VydHNGaWxlLFxuICAgICdjb21wYXJpc29uLW9ubHknOiBvYmouY29tcGFyaXNvbk9ubHksXG4gICAgJ2NvbXBhcmlzb24tcmVwb3J0Jzogb2JqLmNvbXBhcmlzb25SZXBvcnQsXG4gICAgJ2Nvdi1jb21taXQtZGVmZWN0cy1hcmdzJzogb2JqLmNvdkNvbW1pdERlZmVjdHNBcmdzPy5tYXAoeSA9PiB5KSxcbiAgICAnZGVzY3JpcHRpb24nOiBvYmouZGVzY3JpcHRpb24sXG4gICAgJ29uLW5ldy1jZXJ0Jzogb2JqLm9uTmV3Q2VydCxcbiAgICAncHJvamVjdCc6IG9iai5wcm9qZWN0LFxuICAgICdwcm94eS1jbGllbnQtY2VydC1maWxlJzogb2JqLnByb3h5Q2xpZW50Q2VydEZpbGUsXG4gICAgJ3Byb3h5LWNsaWVudC1rZXktZmlsZSc6IG9iai5wcm94eUNsaWVudEtleUZpbGUsXG4gICAgJ3Byb3h5LXVybCc6IG9iai5wcm94eVVybCxcbiAgICAnc2NtJzogb2JqLnNjbSxcbiAgICAnc25hcHNob3QnOiB0b0pzb25fU25hcHNob3RDb25maWd1cmF0aW9uKG9iai5zbmFwc2hvdCksXG4gICAgJ3N0cmVhbSc6IG9iai5zdHJlYW0sXG4gICAgJ3RyaWFnZSc6IHRvSnNvbl9Db21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZShvYmoudHJpYWdlKSxcbiAgICAndXBsb2FkLWFydGlmYWN0cyc6IG9iai51cGxvYWRBcnRpZmFjdHMsXG4gICAgJ3VybCc6IG9iai51cmwsXG4gICAgJ3ZlcnNpb24nOiBvYmoudmVyc2lvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNvZnR3YXJlIFJpc2sgTWFuYWdlciBjb25maWd1cmF0aW9uIHRvIHVzZSB3aGVuIHN0b3JpbmcgZGVmZWN0cyBpbiBTb2Z0d2FyZSBSaXNrIE1hbmFnZXIuXG4gKlxuICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0Q29uZmlndXJhdGlvblNybSB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJhbmNoIHRvIGFzc29jaWF0ZSB0aGUgYW5hbHlzaXMgcmVzdWx0cyB3aXRoIGluIFNvZnR3YXJlIFJpc2sgTWFuYWdlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI2JyYW5jaFxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IGJyYW5jaCBvZiB0aGUgYWN0dWFsIGJyYW5jaC5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI3BhcmVudC1icmFuY2hcbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudEJyYW5jaD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdG8gYXNzb2NpYXRlIHRoZSBhbmFseXNpcyByZXN1bHRzIHdpdGggaW4gU29mdHdhcmUgUmlzayBNYW5hZ2VyLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Tcm0jcHJvamVjdC1uYW1lXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElEIG9mIHRoZSBwcm9qZWN0IHRvIGFzc29jaWF0ZSB0aGUgYW5hbHlzaXMgcmVzdWx0cyB3aXRoIGluIFNvZnR3YXJlIFJpc2sgTWFuYWdlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI3Byb2plY3QtaWRcbiAgICovXG4gIHJlYWRvbmx5IHByb2plY3RJZD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gcmVhZCB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIEFQSSBrZXkgZnJvbS4gQnkgZGVmYXVsdCwgdGhlIGZpbGUgbG9jYXRlZCBhdCAkSE9NRS8uYnJpZGdlL3NybS10b2tlbi50eHQgaXMgdXNlZC5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uU3JtI3Rva2VuLWZpbGVcbiAgICovXG4gIHJlYWRvbmx5IHRva2VuRmlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgU29mdHdhcmUgUmlzayBNYW5hZ2VyIHRvIHVzZSBmb3IgdGhlIGFuYWx5c2lzIChpZiBkb2luZyBhIHJlbW90ZSBhbmFseXNpcykgYW5kIHRoZSBhbmFseXNpcyByZXN1bHRzLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Tcm0jdXJsXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tbWl0Q29uZmlndXJhdGlvblNybScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb25Tcm0ob2JqOiBDb21taXRDb25maWd1cmF0aW9uU3JtIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYnJhbmNoJzogb2JqLmJyYW5jaCxcbiAgICAncGFyZW50LWJyYW5jaCc6IG9iai5wYXJlbnRCcmFuY2gsXG4gICAgJ3Byb2plY3QtbmFtZSc6IG9iai5wcm9qZWN0TmFtZSxcbiAgICAncHJvamVjdC1pZCc6IG9iai5wcm9qZWN0SWQsXG4gICAgJ3Rva2VuLWZpbGUnOiBvYmoudG9rZW5GaWxlLFxuICAgICd1cmwnOiBvYmoudXJsLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogTG9jYWwgY29uZmlndXJhdGlvbiB0byB1c2Ugd2hlbiBzYXZpbmcgZGVmZWN0cyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uTG9jYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21taXRDb25maWd1cmF0aW9uTG9jYWwge1xuICAvKipcbiAgICogRGlyZWN0b3J5IChmb3IgXCJodG1sXCIgZm9ybWF0KSBvciBmaWxlIChmb3IgXCJqc29uXCIgZm9ybWF0KSBpbiB3aGljaCB0byBzYXZlIGRlZmVjdHMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsI3BhdGhcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRm9ybWF0IGluIHdoaWNoIHRvIHNhdmUgZGVmZWN0cy4gRWl0aGVyIFwiaHRtbFwiIG9yIFwianNvblwiLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbCNmb3JtYXRcbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdD86IENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbEZvcm1hdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsKG9iajogQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICdmb3JtYXQnOiBvYmouZm9ybWF0LFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogU3BlY2lmaWVzIGhvdyB3ZWIgYXBwbGljYXRpb24gc2VjdXJpdHkgYW5hbHlzaXMgc2hvdWxkIGJlIGRvbmUuXG4gKlxuICogQHNjaGVtYSBDaGVja2VyQ29uZmlndXJhdGlvbldlYmFwcFNlY3VyaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eSB7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB3ZWIgYXBwbGljYXRpb24gY2hlY2tlcnMgYWdncmVzc2l2ZW5lc3MgbGV2ZWwuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eSNhZ2dyZXNzaXZlbmVzcy1sZXZlbFxuICAgKi9cbiAgcmVhZG9ubHkgYWdncmVzc2l2ZW5lc3NMZXZlbD86IENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHlBZ2dyZXNzaXZlbmVzc0xldmVsO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRoZSBjaGVja2VycyB0aGF0IGFyZSB1c2VkIGZvciB3ZWIgYXBwbGljYXRpb24gc2VjdXJpdHkgYW5hbHlzaXMuXG4gICAqXG4gICAqIEBzY2hlbWEgQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eSNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ2hlY2tlckNvbmZpZ3VyYXRpb25XZWJhcHBTZWN1cml0eScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHkob2JqOiBDaGVja2VyQ29uZmlndXJhdGlvbldlYmFwcFNlY3VyaXR5IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnYWdncmVzc2l2ZW5lc3MtbGV2ZWwnOiBvYmouYWdncmVzc2l2ZW5lc3NMZXZlbCxcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSBzcGVjaWZpYy1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoaXMga2V5IHNwZWNpZmllcyB0aGUgY29kaW5nIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBjb2Rpbmcgc3RhbmRhcmQuIFRoZSBhY3R1YWwgdHlwZSBvZiB0aGlzIGtleSBpcyBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBjb2Rpbmcgc3RhbmRhcmQuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImZpbGVcIiBrZXkuIEEgdGVtcG9yYXJ5IGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIHRoZSBpbi1saW5lIGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gcGFzc2VkIHRvIFwiY292LWFuYWx5emVcIiB1c2luZyB0aGUgXCItLWNvZGluZy1zdGFuZGFyZC1jb25maWcgPGNvbmZpZ19maWxlPlwiIG9wdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSBzcGVjaWZpYy1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNjb25maWdcbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZz86IFJlc29sdmVkQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGlzIHNwZWNpZmllcyB0aGUgZmlsZW5hbWUgY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNvZGluZyBzdGFuZGFyZC4gVGhpcyBrZXkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIFwiY29uZmlnXCIga2V5LlxuICAgKlxuICAgKiBAc2NoZW1hIHNwZWNpZmljLWNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2ZpbGVcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoaXMga2V5IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIFwicHJlLWNhbm5lZFwiIGNvZGluZyBzdGFuZGFyZCBjb25maWd1cmF0aW9uIHRvIHVzZS4gVGhlIGF2YWlsYWJsZSBwcmUtY2FubmVkIGNvZGluZyBzdGFuZGFyZCBjb25maWd1cmF0aW9ucyBkZXBlbmQgb24gdGhlIGNvZGluZyBzdGFuZGFyZCBpbiBxdWVzdGlvbi4gUmVmZXIgdG8gQ292ZXJpdHkncyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBcInByZS1jYW5uZWRcIiBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogQHNjaGVtYSBzcGVjaWZpYy1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiNwcmUtY2FubmVkXG4gICAqL1xuICByZWFkb25seSBwcmVDYW5uZWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IG9mIHR5cGUgJ1NwZWNpZmljQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU3BlY2lmaWNDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ob2JqOiBTcGVjaWZpY0NvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBpZiAob2JqID09PSB1bmRlZmluZWQpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfVxuICBjb25zdCByZXN1bHQgPSB7XG4gICAgJ2NvbmZpZyc6IHRvSnNvbl9SZXNvbHZlZENvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbihvYmouY29uZmlnKSxcbiAgICAnZmlsZSc6IG9iai5maWxlLFxuICAgICdwcmUtY2FubmVkJzogb2JqLnByZUNhbm5lZCxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEFydGlmYWN0cyB0byB1cGxvYWQgZm9sbG93aW5nIGFuYWx5c2lzIHdoZW4gdGhlIGFuYWx5c2lzIGxvY2F0aW9uIGlzIENvbm5lY3QuXG4gKlxuICogQHNjaGVtYSBBbmFseXplQ29ubmVjdENvbmZpZ3VyYXRpb25VcGxvYWRBcnRpZmFjdHNcbiAqL1xuZXhwb3J0IGVudW0gQW5hbHl6ZUNvbm5lY3RDb25maWd1cmF0aW9uVXBsb2FkQXJ0aWZhY3RzIHtcbiAgLyoqIEFsbCAqL1xuICBBTEwgPSBcIkFsbFwiLFxuICAvKiogTG9nc09ubHkgKi9cbiAgTE9HU19PTkxZID0gXCJMb2dzT25seVwiLFxuICAvKiogTm9uZSAqL1xuICBOT05FID0gXCJOb25lXCIsXG4gIC8qKiBPbkZhaWx1cmUgKi9cbiAgT05fRkFJTFVSRSA9IFwiT25GYWlsdXJlXCIsXG59XG5cbi8qKlxuICogU2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIHRvIHVzZSBkdXJpbmcgdGhlIGFuYWx5c2lzLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJmaWxlXCIga2V5IGFuZCBpcyBzcGVjaWZpZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHVzZXIgd2FudHMgdG8gaW4tbGluZSB0aGUgc2VjdXJpdHkgZGlyZWN0aXZlcyBjb25maWd1cmF0aW9uIGluIHRoZSBmaWxlLlxuICpcbiAqIEBzY2hlbWEgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBTcGVjaWZ5IGEgcGFydGljdWxhciBhbmFseXNpcyBiZWhhdmlvci5cbiAgICpcbiAgICogQHNjaGVtYSBEaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZyNkaXJlY3RpdmVzXG4gICAqL1xuICByZWFkb25seSBkaXJlY3RpdmVzOiBhbnlbXTtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZGlyZWN0aXZlcyBmb3JtYXQuXG4gICAqXG4gICAqIEBzY2hlbWEgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcjZm9ybWF0X3ZlcnNpb25cbiAgICovXG4gIHJlYWRvbmx5IGZvcm1hdFZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIExhbmd1YWdlIG9yIGxhbmd1YWdlIGZhbWlseSB0byB3aGljaCBkaXJlY3RpdmVzIGFwcGx5LlxuICAgKlxuICAgKiBAc2NoZW1hIERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnI2xhbmd1YWdlXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNdXN0IGJlIHRoZSBzdHJpbmcgXCJDb3Zlcml0eSBhbmFseXNpcyBjb25maWd1cmF0aW9uXCIuXG4gICAqXG4gICAqIEBzY2hlbWEgRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcjdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnVHlwZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWcnIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9EaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZyhvYmo6IERpcmVjdGl2ZXNDb25maWd1cmF0aW9uQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGlyZWN0aXZlcyc6IG9iai5kaXJlY3RpdmVzPy5tYXAoeSA9PiB5KSxcbiAgICAnZm9ybWF0X3ZlcnNpb24nOiBvYmouZm9ybWF0VmVyc2lvbixcbiAgICAnbGFuZ3VhZ2UnOiBvYmoubGFuZ3VhZ2UsXG4gICAgJ3R5cGUnOiBvYmoudHlwZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIEBzY2hlbWEgU2lnbWFDb25maWd1cmF0aW9uRW5hYmxlQ2hlY2tTZXRcbiAqL1xuZXhwb3J0IGVudW0gU2lnbWFDb25maWd1cmF0aW9uRW5hYmxlQ2hlY2tTZXQge1xuICAvKiogYWxsICovXG4gIEFMTCA9IFwiYWxsXCIsXG4gIC8qKiBjaXMgKi9cbiAgQ0lTID0gXCJjaXNcIixcbiAgLyoqIGRlZmF1bHQgKi9cbiAgREVGQVVMVCA9IFwiZGVmYXVsdFwiLFxuICAvKiogZW1wdHkgKi9cbiAgRU1QVFkgPSBcImVtcHR5XCIsXG59XG5cbi8qKlxuICogQHNjaGVtYSBwYXJhbGxlbC10cmFuc2xhdGUtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsVHJhbnNsYXRlQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgd2hldGhlciBjb3YtdHJhbnNsYXRlIHBhcmFsbGVsaXphdGlvbiBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICpcbiAgICogQHNjaGVtYSBwYXJhbGxlbC10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNlbmFibGVkXG4gICAqL1xuICByZWFkb25seSBlbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY292LWVtaXQgcHJvY2Vzc2VzIHRvIGJlIHJ1biBpbiBwYXJhbGxlbCBieSBjb3YtdHJhbnNsYXRlIHdoZW4gbXVsdGlwbGUgZmlsZXMgYXJlIHNlZW4gb24gYSBzaW5nbGUgbmF0aXZlIGNvbXBpbGVyIGludm9jYXRpb24uIEEgdmFsdWUgb2YgMCB3aWxsIHVzZSB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgcHJvY2Vzc29ycyBpbiB0aGUgbWFjaGluZS5cbiAgICpcbiAgICogQHNjaGVtYSBwYXJhbGxlbC10cmFuc2xhdGUtY29uZmlndXJhdGlvbiNwcm9jZXNzZXNcbiAgICovXG4gIHJlYWRvbmx5IHByb2Nlc3Nlcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uKG9iajogUGFyYWxsZWxUcmFuc2xhdGVDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZW5hYmxlZCc6IG9iai5lbmFibGVkLFxuICAgICdwcm9jZXNzZXMnOiBvYmoucHJvY2Vzc2VzLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQHNjaGVtYSB3ZWJhcHAtYXJjaGl2ZS1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gYXJjaGl2ZSBmaWxlIG9yIHBhdGggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleHBsb2RlZCB3ZWIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgd2ViYXBwLWFyY2hpdmUtY29uZmlndXJhdGlvbiNwYXRoXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgd2ViLWFwcCBzaG91bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQgaXMgdmFsaWQgZHVyaW5nIGNhcHR1cmUuIFRoZSB2YWxpZGF0aW9uIGNoZWNrIGNoZWNrcyB0aGF0IHRoZXJlIGlzIGEgXCIvV0VCLUlORi93ZWIueG1sXCIgZmlsZSBhbmQgdGhhdCA+IDIwJSBvZiBjbGFzc2VzIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIHdlcmUgY2FwdHVyZWQuXG4gICAqXG4gICAqIEBzY2hlbWEgd2ViYXBwLWFyY2hpdmUtY29uZmlndXJhdGlvbiN2YWxpZGF0ZS13ZWJhcHBcbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkYXRlV2ViYXBwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnV2ViYXBwQXJjaGl2ZUNvbmZpZ3VyYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9XZWJhcHBBcmNoaXZlQ29uZmlndXJhdGlvbihvYmo6IFdlYmFwcEFyY2hpdmVDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAncGF0aCc6IG9iai5wYXRoLFxuICAgICd2YWxpZGF0ZS13ZWJhcHAnOiBvYmoudmFsaWRhdGVXZWJhcHAsXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBAc2NoZW1hIExhbmd1YWdlc0NvbmZpZ3VyYXRpb25FeGNsdWRlXG4gKi9cbmV4cG9ydCBlbnVtIExhbmd1YWdlc0NvbmZpZ3VyYXRpb25FeGNsdWRlIHtcbiAgLyoqIGFwZXggKi9cbiAgQVBFWCA9IFwiYXBleFwiLFxuICAvKiogYy1mYW1pbHkgKi9cbiAgQ19IWVBIRU5fRkFNSUxZID0gXCJjLWZhbWlseVwiLFxuICAvKiogY3NoYXJwICovXG4gIENTSEFSUCA9IFwiY3NoYXJwXCIsXG4gIC8qKiBkYXJ0ICovXG4gIERBUlQgPSBcImRhcnRcIixcbiAgLyoqIGdvICovXG4gIEdPID0gXCJnb1wiLFxuICAvKiogamF2YSAqL1xuICBKQVZBID0gXCJqYXZhXCIsXG4gIC8qKiBqYXZhc2NyaXB0ICovXG4gIEpBVkFTQ1JJUFQgPSBcImphdmFzY3JpcHRcIixcbiAgLyoqIGtvdGxpbiAqL1xuICBLT1RMSU4gPSBcImtvdGxpblwiLFxuICAvKiogcGhwICovXG4gIFBIUCA9IFwicGhwXCIsXG4gIC8qKiBweXRob24gKi9cbiAgUFlUSE9OID0gXCJweXRob25cIixcbiAgLyoqIHJ1YnkgKi9cbiAgUlVCWSA9IFwicnVieVwiLFxuICAvKiogc3dpZnQgKi9cbiAgU1dJRlQgPSBcInN3aWZ0XCIsXG4gIC8qKiB2YiAqL1xuICBWQiA9IFwidmJcIixcbiAgLyoqIGNvbmZpZ3VyYXRpb24gKi9cbiAgQ09ORklHVVJBVElPTiA9IFwiY29uZmlndXJhdGlvblwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbkluY2x1ZGVcbiAqL1xuZXhwb3J0IGVudW0gTGFuZ3VhZ2VzQ29uZmlndXJhdGlvbkluY2x1ZGUge1xuICAvKiogYXBleCAqL1xuICBBUEVYID0gXCJhcGV4XCIsXG4gIC8qKiBjLWZhbWlseSAqL1xuICBDX0hZUEhFTl9GQU1JTFkgPSBcImMtZmFtaWx5XCIsXG4gIC8qKiBjc2hhcnAgKi9cbiAgQ1NIQVJQID0gXCJjc2hhcnBcIixcbiAgLyoqIGRhcnQgKi9cbiAgREFSVCA9IFwiZGFydFwiLFxuICAvKiogZ28gKi9cbiAgR08gPSBcImdvXCIsXG4gIC8qKiBqYXZhICovXG4gIEpBVkEgPSBcImphdmFcIixcbiAgLyoqIGphdmFzY3JpcHQgKi9cbiAgSkFWQVNDUklQVCA9IFwiamF2YXNjcmlwdFwiLFxuICAvKioga290bGluICovXG4gIEtPVExJTiA9IFwia290bGluXCIsXG4gIC8qKiBwaHAgKi9cbiAgUEhQID0gXCJwaHBcIixcbiAgLyoqIHB5dGhvbiAqL1xuICBQWVRIT04gPSBcInB5dGhvblwiLFxuICAvKiogcnVieSAqL1xuICBSVUJZID0gXCJydWJ5XCIsXG4gIC8qKiBzd2lmdCAqL1xuICBTV0lGVCA9IFwic3dpZnRcIixcbiAgLyoqIHZiICovXG4gIFZCID0gXCJ2YlwiLFxuICAvKiogY29uZmlndXJhdGlvbiAqL1xuICBDT05GSUdVUkFUSU9OID0gXCJjb25maWd1cmF0aW9uXCIsXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdHJ1c3Qgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIHByZXNlbnRlZCBieSBDb3Zlcml0eSBDb25uZWN0IHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgdHJ1c3RlZC5cbiAqXG4gKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0T25OZXdDZXJ0XG4gKi9cbmV4cG9ydCBlbnVtIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0T25OZXdDZXJ0IHtcbiAgLyoqIHRydXN0ICovXG4gIFRSVVNUID0gXCJ0cnVzdFwiLFxuICAvKiogZGlzdHJ1c3QgKi9cbiAgRElTVFJVU1QgPSBcImRpc3RydXN0XCIsXG59XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBjb250cm9sIG1hbmFnZW1lbnQgc3lzdGVtLlxuICpcbiAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RTY21cbiAqL1xuZXhwb3J0IGVudW0gQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RTY20ge1xuICAvKiogYWRzICovXG4gIEFEUyA9IFwiYWRzXCIsXG4gIC8qKiBjbGVhcmNhc2UgKi9cbiAgQ0xFQVJDQVNFID0gXCJjbGVhcmNhc2VcIixcbiAgLyoqIGN2cyAqL1xuICBDVlMgPSBcImN2c1wiLFxuICAvKiogZ2l0ICovXG4gIEdJVCA9IFwiZ2l0XCIsXG4gIC8qKiBoZyAqL1xuICBIRyA9IFwiaGdcIixcbiAgLyoqIHBlcmZvcmNlICovXG4gIFBFUkZPUkNFID0gXCJwZXJmb3JjZVwiLFxuICAvKiogcGxhc3RpYyAqL1xuICBQTEFTVElDID0gXCJwbGFzdGljXCIsXG4gIC8qKiBwbGFzdGljLWRpc3RyaWJ1dGVkICovXG4gIFBMQVNUSUNfSFlQSEVOX0RJU1RSSUJVVEVEID0gXCJwbGFzdGljLWRpc3RyaWJ1dGVkXCIsXG4gIC8qKiBzdm4gKi9cbiAgU1ZOID0gXCJzdm5cIixcbiAgLyoqIHRmcyAqL1xuICBURlMgPSBcInRmc1wiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgc25hcHNob3QtY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBzaG90Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBEYXRlIGFuZCB0aW1lIG9mIHNuYXBzaG90IHRvIHVzZSBmb3IgY29tcGFyaXNvbiByZXBvcnQuIFRoZSB2YWx1ZSBzaG91bGQgYmUgb2YgdGhlIGZvcm0gXCJZWVlZLU1NLUREVGhoOm1tOnNzXCIgd2hlcmUgZGF0ZSBhbmQgdGltZSBhcmUgc2VwYXJhdGVkIGJ5IGEgXCJUXCIsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbiBjb25zaXN0aW5nIG9mIGVpdGhlciBcIlpcIiBkZW5vdGluZyBVVEMgb3IgYSBcIitcIiBvciBcIi1cIiBjaGFyYWN0ZXIgZm9sbG93ZWQgYnkgY29sb24tc2VwYXJhdGVkIGhvdXJzIGFuZCBtaW51dGVzIGVhc3Qgb2YgVVRDLiBFeGFtcGxlOiBcIjIwMjMtMTItMjdUMTM6MjE6MDUtMDg6MDBcIi4gSWYgbm8gdGltZSB6b25lIGlzIHNwZWNpZmllZCwgdGhlIGxvY2FsIHRpbWUgem9uZSBpcyBhc3N1bWVkLiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJpZFwiIGFuZCBcInJlZmVyZW5jZVwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgc25hcHNob3QtY29uZmlndXJhdGlvbiNkYXRlXG4gICAqL1xuICByZWFkb25seSBkYXRlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJRCBvZiBzbmFwc2hvdCB0byB1c2UgZm9yIGNvbXBhcmlzb24gcmVwb3J0LiBUaGlzIGtleSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgXCJkYXRlXCIgYW5kIFwicmVmZXJlbmNlXCIga2V5cy5cbiAgICpcbiAgICogQHNjaGVtYSBzbmFwc2hvdC1jb25maWd1cmF0aW9uI2lkXG4gICAqL1xuICByZWFkb25seSBpZD86IG51bWJlcjtcblxuICAvKipcbiAgICogT25lIG9mIFwiaWRpclwiLCBcImxhdGVzdFwiLCBvciBcInNjbVwiLiBcImlkaXJcIiB3aWxsIHVzZSB0aGUgc25hcHNob3QgY3JlYXRlZCBjbG9zZXN0IHRvLCBidXQgbm90IGFmdGVyLCB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgaW50ZXJtZWRpYXRlIGRpcmVjdG9yeS4gXCJsYXRlc3RcIiB3aWxsIHVzZSB0aGUgc25hcHNob3Qgd2l0aCB0aGUgbGF0ZXN0IGNvZGUtdmVyc2lvbiBkYXRlIGluIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBcInNjbVwiIHdpbGwgcXVlcnkgdGhlIFNDTSB0byBkZXRlcm1pbmUgdGhlIHZlcnNpb24gdGhhdCB3YXMgbW9zdCByZWNlbnRseSBjaGVja2VkIG91dCBvciB1cGRhdGVkLCBhbmQgdGhlbiB1c2UgdGhlIGNsb3Nlc3Qgc25hcHNob3QuIFRoaXMga2V5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSBcImRhdGVcIiBhbmQgXCJpZFwiIGtleXMuXG4gICAqXG4gICAqIEBzY2hlbWEgc25hcHNob3QtY29uZmlndXJhdGlvbiNyZWZlcmVuY2VcbiAgICovXG4gIHJlYWRvbmx5IHJlZmVyZW5jZT86IGFueTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnU25hcHNob3RDb25maWd1cmF0aW9uJyB0byBKU09OIHJlcHJlc2VudGF0aW9uLlxuICogQGludGVybmFsXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0pzb25fU25hcHNob3RDb25maWd1cmF0aW9uKG9iajogU25hcHNob3RDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGF0ZSc6IG9iai5kYXRlLFxuICAgICdpZCc6IG9iai5pZCxcbiAgICAncmVmZXJlbmNlJzogb2JqLnJlZmVyZW5jZSxcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuXG4vKipcbiAqIFNwZWNpZmllcyBob3cgbmV3IGRlZmVjdHMgc2hvdWxkIGJlIGhhbmRsZWQuXG4gKlxuICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VHJpYWdlIHtcbiAgLyoqXG4gICAqIFVzZXIgdG8gd2hvbSBhbnkgbmV3IGRlZmVjdHMgd2lsbCBiZSBhc3NpZ25lZC4gVGhlIHNwZWNpZmllZCB1c2VyIG11c3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgQ292ZXJpdHkgQ29ubmVjdCBkYXRhYmFzZS4gVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZSNuZXctZGVmZWN0LW93bmVyXG4gICAqL1xuICByZWFkb25seSBuZXdEZWZlY3RPd25lcj86IHN0cmluZztcblxuICAvKipcbiAgICogTGltaXQgb24gdGhlIG51bWJlciBvZiBkZWZlY3RzIHRvIGFzc2lnbiB0byB0aGUgc3BlY2lmaWVkIHVzZXIuIElmIHRoZSBudW1iZXIgb2YgZGlzY292ZXJlZCBkZWZlY3RzIGlzIG1vcmUgdGhhbiB0aGUgbGltaXQsIHRoZW4gbm8gYXNzaWdubWVudCBpcyBkb25lLlxuICAgKlxuICAgKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VHJpYWdlI25ldy1kZWZlY3Qtb3duZXItbGltaXRcbiAgICovXG4gIHJlYWRvbmx5IG5ld0RlZmVjdE93bmVyTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBvd25lciBmb3IgbmV3bHkgZGV0ZWN0ZWQgZGVmZWN0cyB0aGF0IGV4aXN0IGxvY2FsbHkgaXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdXNlci5cbiAgICpcbiAgICogQHNjaGVtYSBDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZSNzZXQtbmV3LWRlZmVjdC1vd25lclxuICAgKi9cbiAgcmVhZG9ubHkgc2V0TmV3RGVmZWN0T3duZXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdDb21taXRDb25maWd1cmF0aW9uQ29ubmVjdFRyaWFnZScgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX0NvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VHJpYWdlKG9iajogQ29tbWl0Q29uZmlndXJhdGlvbkNvbm5lY3RUcmlhZ2UgfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICduZXctZGVmZWN0LW93bmVyJzogb2JqLm5ld0RlZmVjdE93bmVyLFxuICAgICduZXctZGVmZWN0LW93bmVyLWxpbWl0Jzogb2JqLm5ld0RlZmVjdE93bmVyTGltaXQsXG4gICAgJ3NldC1uZXctZGVmZWN0LW93bmVyJzogb2JqLnNldE5ld0RlZmVjdE93bmVyLFxuICB9O1xuICAvLyBmaWx0ZXIgdW5kZWZpbmVkIHZhbHVlc1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0KS5yZWR1Y2UoKHIsIGkpID0+IChpWzFdID09PSB1bmRlZmluZWQpID8gciA6ICh7IC4uLnIsIFtpWzBdXTogaVsxXSB9KSwge30pO1xufVxuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5cbi8qKlxuICogQXJ0aWZhY3RzIHRvIHVwbG9hZCBmb2xsb3dpbmcgYW5hbHlzaXMgd2hlbiB0aGUgYW5hbHlzaXMgbG9jYXRpb24gaXMgQ29ubmVjdC5cbiAqXG4gKiBAc2NoZW1hIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VXBsb2FkQXJ0aWZhY3RzXG4gKi9cbmV4cG9ydCBlbnVtIENvbW1pdENvbmZpZ3VyYXRpb25Db25uZWN0VXBsb2FkQXJ0aWZhY3RzIHtcbiAgLyoqIEFsbCAqL1xuICBBTEwgPSBcIkFsbFwiLFxuICAvKiogTG9nc09ubHkgKi9cbiAgTE9HU19PTkxZID0gXCJMb2dzT25seVwiLFxuICAvKiogTm9uZSAqL1xuICBOT05FID0gXCJOb25lXCIsXG4gIC8qKiBPbkZhaWx1cmUgKi9cbiAgT05fRkFJTFVSRSA9IFwiT25GYWlsdXJlXCIsXG59XG5cbi8qKlxuICogRm9ybWF0IGluIHdoaWNoIHRvIHNhdmUgZGVmZWN0cy4gRWl0aGVyIFwiaHRtbFwiIG9yIFwianNvblwiLlxuICpcbiAqIEBzY2hlbWEgQ29tbWl0Q29uZmlndXJhdGlvbkxvY2FsRm9ybWF0XG4gKi9cbmV4cG9ydCBlbnVtIENvbW1pdENvbmZpZ3VyYXRpb25Mb2NhbEZvcm1hdCB7XG4gIC8qKiBodG1sICovXG4gIEhUTUwgPSBcImh0bWxcIixcbiAgLyoqIGpzb24gKi9cbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIFNldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBjaGVja2VycyBhZ2dyZXNzaXZlbmVzcyBsZXZlbC5cbiAqXG4gKiBAc2NoZW1hIENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHlBZ2dyZXNzaXZlbmVzc0xldmVsXG4gKi9cbmV4cG9ydCBlbnVtIENoZWNrZXJDb25maWd1cmF0aW9uV2ViYXBwU2VjdXJpdHlBZ2dyZXNzaXZlbmVzc0xldmVsIHtcbiAgLyoqIGxvdyAqL1xuICBMT1cgPSBcImxvd1wiLFxuICAvKiogbWVkaXVtICovXG4gIE1FRElVTSA9IFwibWVkaXVtXCIsXG4gIC8qKiBoaWdoICovXG4gIEhJR0ggPSBcImhpZ2hcIixcbn1cblxuLyoqXG4gKiBAc2NoZW1hIHJlc29sdmVkLWNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTGlzdCBvZiBkZXZpYXRpb25zIGZvciB0aGlzIHN0YW5kYXJkLlxuICAgKlxuICAgKiBAc2NoZW1hIHJlc29sdmVkLWNvZGluZy1zdGFuZGFyZC1jb25maWd1cmF0aW9uI2RldmlhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IGRldmlhdGlvbnM/OiBDb2RpbmdTdGFuZGFyZERldmlhdGlvbltdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoaXMgY29kZSBjb21wbGlhbmNlIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBzY2hlbWEgcmVzb2x2ZWQtY29kaW5nLXN0YW5kYXJkLWNvbmZpZ3VyYXRpb24jdGl0bGVcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZlcnNpb24gb2YgdGhpcyBjb2RlIGNvbXBsaWFuY2UgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHNjaGVtYSByZXNvbHZlZC1jb2Rpbmctc3RhbmRhcmQtY29uZmlndXJhdGlvbiN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCBvZiB0eXBlICdSZXNvbHZlZENvZGluZ1N0YW5kYXJkQ29uZmlndXJhdGlvbicgdG8gSlNPTiByZXByZXNlbnRhdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuLCBAc3R5bGlzdGljL21heC1sZW4sIHF1b3RlLXByb3BzLCBAc3R5bGlzdGljL3F1b3RlLXByb3BzICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1Jlc29sdmVkQ29kaW5nU3RhbmRhcmRDb25maWd1cmF0aW9uKG9iajogUmVzb2x2ZWRDb2RpbmdTdGFuZGFyZENvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgICdkZXZpYXRpb25zJzogb2JqLmRldmlhdGlvbnM/Lm1hcCh5ID0+IHRvSnNvbl9Db2RpbmdTdGFuZGFyZERldmlhdGlvbih5KSksXG4gICAgJ3RpdGxlJzogb2JqLnRpdGxlLFxuICAgICd2ZXJzaW9uJzogb2JqLnZlcnNpb24sXG4gIH07XG4gIC8vIGZpbHRlciB1bmRlZmluZWQgdmFsdWVzXG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHQpLnJlZHVjZSgociwgaSkgPT4gKGlbMV0gPT09IHVuZGVmaW5lZCkgPyByIDogKHsgLi4uciwgW2lbMF1dOiBpWzFdIH0pLCB7fSk7XG59XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4sIEBzdHlsaXN0aWMvbWF4LWxlbiwgcXVvdGUtcHJvcHMsIEBzdHlsaXN0aWMvcXVvdGUtcHJvcHMgKi9cblxuLyoqXG4gKiBNdXN0IGJlIHRoZSBzdHJpbmcgXCJDb3Zlcml0eSBhbmFseXNpcyBjb25maWd1cmF0aW9uXCIuXG4gKlxuICogQHNjaGVtYSBEaXJlY3RpdmVzQ29uZmlndXJhdGlvbkNvbmZpZ1R5cGVcbiAqL1xuZXhwb3J0IGVudW0gRGlyZWN0aXZlc0NvbmZpZ3VyYXRpb25Db25maWdUeXBlIHtcbiAgLyoqIENvdmVyaXR5IGFuYWx5c2lzIGNvbmZpZ3VyYXRpb24gKi9cbiAgQ09WRVJJVFlfQU5BTFlTSVNfQ09ORklHVVJBVElPTiA9IFwiQ292ZXJpdHkgYW5hbHlzaXMgY29uZmlndXJhdGlvblwiLFxufVxuXG4vKipcbiAqIEBzY2hlbWEgY29kaW5nLXN0YW5kYXJkLWRldmlhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZGluZ1N0YW5kYXJkRGV2aWF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBydWxlIHRvIGRldmlhdGUgZnJvbS5cbiAgICpcbiAgICogQHNjaGVtYSBjb2Rpbmctc3RhbmRhcmQtZGV2aWF0aW9uI2RldmlhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWFzb24gdGhhdCB0aGUgcnVsZSBpcyBiZWluZyBkZXZpYXRlZCBmcm9tLlxuICAgKlxuICAgKiBAc2NoZW1hIGNvZGluZy1zdGFuZGFyZC1kZXZpYXRpb24jcmVhc29uXG4gICAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvYmplY3Qgb2YgdHlwZSAnQ29kaW5nU3RhbmRhcmREZXZpYXRpb24nIHRvIEpTT04gcmVwcmVzZW50YXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvSnNvbl9Db2RpbmdTdGFuZGFyZERldmlhdGlvbihvYmo6IENvZGluZ1N0YW5kYXJkRGV2aWF0aW9uIHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGlmIChvYmogPT09IHVuZGVmaW5lZCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAnZGV2aWF0aW9uJzogb2JqLmRldmlhdGlvbixcbiAgICAncmVhc29uJzogb2JqLnJlYXNvbixcbiAgfTtcbiAgLy8gZmlsdGVyIHVuZGVmaW5lZCB2YWx1ZXNcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkucmVkdWNlKChyLCBpKSA9PiAoaVsxXSA9PT0gdW5kZWZpbmVkKSA/IHIgOiAoeyAuLi5yLCBbaVswXV06IGlbMV0gfSksIHt9KTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiwgQHN0eWxpc3RpYy9tYXgtbGVuLCBxdW90ZS1wcm9wcywgQHN0eWxpc3RpYy9xdW90ZS1wcm9wcyAqL1xuIl19