projen 0.100.7 → 0.101.0

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 (157) hide show
  1. package/.jsii +602 -95
  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/circleci/circleci.js +1 -1
  33. package/lib/cli/task-runtime.js +115 -104
  34. package/lib/common.d.ts +1 -1
  35. package/lib/common.js +2 -2
  36. package/lib/component.js +1 -1
  37. package/lib/dependencies.js +1 -1
  38. package/lib/dev-env.js +1 -1
  39. package/lib/docker-compose/docker-compose-service.js +1 -1
  40. package/lib/docker-compose/docker-compose.js +1 -1
  41. package/lib/file.js +1 -1
  42. package/lib/gitattributes.js +1 -1
  43. package/lib/github/actions-provider.js +1 -1
  44. package/lib/github/auto-approve.js +1 -1
  45. package/lib/github/auto-merge.js +1 -1
  46. package/lib/github/auto-queue.js +1 -1
  47. package/lib/github/dependabot.js +1 -1
  48. package/lib/github/dependency-review.js +1 -1
  49. package/lib/github/github-credentials.js +1 -1
  50. package/lib/github/github-project.js +1 -1
  51. package/lib/github/github.js +1 -1
  52. package/lib/github/merge-queue.js +1 -1
  53. package/lib/github/mergify.js +1 -1
  54. package/lib/github/pr-template.js +1 -1
  55. package/lib/github/pull-request-backport.js +1 -1
  56. package/lib/github/pull-request-lint.js +1 -1
  57. package/lib/github/stale.js +1 -1
  58. package/lib/github/task-workflow-job.js +1 -1
  59. package/lib/github/task-workflow.js +1 -1
  60. package/lib/github/workflow-actions.js +1 -1
  61. package/lib/github/workflow-jobs.js +1 -1
  62. package/lib/github/workflow-steps.js +1 -1
  63. package/lib/github/workflows.js +1 -1
  64. package/lib/gitlab/configuration.js +1 -1
  65. package/lib/gitlab/gitlab-configuration.js +1 -1
  66. package/lib/gitlab/nested-configuration.js +1 -1
  67. package/lib/gitpod.js +1 -1
  68. package/lib/ignore-file.js +1 -1
  69. package/lib/index.d.ts +1 -0
  70. package/lib/index.js +2 -1
  71. package/lib/ini.js +1 -1
  72. package/lib/java/java-project.js +1 -1
  73. package/lib/java/junit.js +1 -1
  74. package/lib/java/maven-compile.js +1 -1
  75. package/lib/java/maven-packaging.js +1 -1
  76. package/lib/java/maven-sample.js +1 -1
  77. package/lib/java/pom.js +2 -2
  78. package/lib/java/projenrc.js +1 -1
  79. package/lib/javascript/biome/biome.js +1 -1
  80. package/lib/javascript/bundler.js +1 -1
  81. package/lib/javascript/eslint.js +1 -1
  82. package/lib/javascript/jest.js +4 -4
  83. package/lib/javascript/license-checker.js +1 -1
  84. package/lib/javascript/node-package.js +1 -1
  85. package/lib/javascript/node-project.js +1 -1
  86. package/lib/javascript/npm-config.js +1 -1
  87. package/lib/javascript/prettier.js +1 -1
  88. package/lib/javascript/projenrc.js +1 -1
  89. package/lib/javascript/typescript-config.js +2 -2
  90. package/lib/javascript/upgrade-dependencies.js +2 -2
  91. package/lib/javascript/yarnrc.js +1 -1
  92. package/lib/json-patch.js +1 -1
  93. package/lib/json.js +1 -1
  94. package/lib/license.js +1 -1
  95. package/lib/logger.js +1 -1
  96. package/lib/makefile.js +1 -1
  97. package/lib/object-file.js +1 -1
  98. package/lib/project-build.js +1 -1
  99. package/lib/project-tree.js +1 -1
  100. package/lib/project.js +1 -1
  101. package/lib/projects.js +1 -1
  102. package/lib/projenrc-json.js +1 -1
  103. package/lib/projenrc.js +1 -1
  104. package/lib/python/pip.js +1 -1
  105. package/lib/python/poetry.js +2 -2
  106. package/lib/python/projenrc.js +1 -1
  107. package/lib/python/pyproject-toml-file.js +1 -1
  108. package/lib/python/pytest-sample.js +1 -1
  109. package/lib/python/pytest.js +1 -1
  110. package/lib/python/python-project.js +1 -1
  111. package/lib/python/python-sample.js +1 -1
  112. package/lib/python/requirements-file.js +1 -1
  113. package/lib/python/setuppy.js +1 -1
  114. package/lib/python/setuptools.js +1 -1
  115. package/lib/python/uv.js +1 -1
  116. package/lib/python/venv.js +1 -1
  117. package/lib/readme.js +1 -1
  118. package/lib/release/bump-version.d.ts +1 -1
  119. package/lib/release/bump-version.js +6 -2
  120. package/lib/release/publisher.js +1 -1
  121. package/lib/release/release-trigger.js +1 -1
  122. package/lib/release/release.js +1 -1
  123. package/lib/renovatebot.js +1 -1
  124. package/lib/run-task.cjs +107 -131
  125. package/lib/sample-file.js +2 -2
  126. package/lib/source-code.js +1 -1
  127. package/lib/task-model.d.ts +119 -3
  128. package/lib/task-model.js +1 -1
  129. package/lib/task-shell.d.ts +63 -0
  130. package/lib/task-shell.js +87 -0
  131. package/lib/task.d.ts +19 -2
  132. package/lib/task.js +46 -11
  133. package/lib/tasks.d.ts +13 -0
  134. package/lib/tasks.js +19 -2
  135. package/lib/testing.js +1 -1
  136. package/lib/textfile.js +1 -1
  137. package/lib/toml.js +1 -1
  138. package/lib/typescript/projenrc-ts.js +1 -1
  139. package/lib/typescript/projenrc.js +1 -1
  140. package/lib/typescript/typescript-typedoc.js +1 -1
  141. package/lib/typescript/typescript.js +5 -5
  142. package/lib/util/exec.d.ts +33 -69
  143. package/lib/util/exec.js +57 -51
  144. package/lib/version.d.ts +1 -1
  145. package/lib/version.js +5 -5
  146. package/lib/vscode/devcontainer.js +1 -1
  147. package/lib/vscode/extensions.js +1 -1
  148. package/lib/vscode/launch-config.js +1 -1
  149. package/lib/vscode/settings.js +1 -1
  150. package/lib/vscode/vscode.js +1 -1
  151. package/lib/web/next.js +3 -3
  152. package/lib/web/postcss.js +1 -1
  153. package/lib/web/react.js +3 -3
  154. package/lib/web/tailwind.js +1 -1
  155. package/lib/xmlfile.js +1 -1
  156. package/lib/yaml.js +1 -1
  157. package/package.json +1 -1
package/lib/toml.js CHANGED
@@ -41,7 +41,7 @@ const object_file_1 = require("./object-file");
41
41
  * Represents a TOML file.
42
42
  */
43
43
  class TomlFile extends object_file_1.ObjectFile {
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.TomlFile", version: "0.100.7" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.TomlFile", version: "0.101.0" };
45
45
  constructor(scope, filePath, options) {
46
46
  super(scope, filePath, options);
47
47
  }
@@ -17,7 +17,7 @@ const DEFAULT_FILENAME = ".projenrc.ts";
17
17
  * Requires that `npx` is available.
18
18
  */
19
19
  class ProjenrcTs extends projenrc_1.ProjenrcFile {
20
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.ProjenrcTs", version: "0.100.7" };
20
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.ProjenrcTs", version: "0.101.0" };
21
21
  /**
22
22
  * TypeScript configuration file used to compile projen source files
23
23
  */
@@ -12,7 +12,7 @@ const DEFAULT_FILENAME = ".projenrc.ts";
12
12
  * Sets up a typescript project to use TypeScript for projenrc.
13
13
  */
14
14
  class Projenrc extends projenrc_1.ProjenrcFile {
15
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.Projenrc", version: "0.100.7" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.Projenrc", version: "0.101.0" };
16
16
  filePath;
17
17
  tsconfig;
18
18
  _projenCodeDir;
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  Adds a simple Typescript documentation generator
7
7
  */
8
8
  class TypedocDocgen {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypedocDocgen", version: "0.100.7" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypedocDocgen", version: "0.101.0" };
10
10
  constructor(project) {
11
11
  project.addDevDeps("typedoc");
12
12
  const docgen = project.addTask("docgen", {
@@ -52,7 +52,7 @@ const util_2 = require("../util");
52
52
  */
53
53
  class TsJestBabelConfig {
54
54
  config;
55
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestBabelConfig", version: "0.100.7" };
55
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestBabelConfig", version: "0.101.0" };
56
56
  /**
57
57
  * Disables the use of Babel
58
58
  */
@@ -99,7 +99,7 @@ exports.TsJestBabelConfig = TsJestBabelConfig;
99
99
  */
100
100
  class TsJestDiagnostics {
101
101
  config;
102
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestDiagnostics", version: "0.100.7" };
102
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestDiagnostics", version: "0.101.0" };
103
103
  /**
104
104
  * Enable all diagnostics.
105
105
  */
@@ -137,7 +137,7 @@ exports.TsJestDiagnostics = TsJestDiagnostics;
137
137
  */
138
138
  class TsJestTsconfig {
139
139
  config;
140
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestTsconfig", version: "0.100.7" };
140
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TsJestTsconfig", version: "0.101.0" };
141
141
  /**
142
142
  * Uses `tsconfig.json` if found, or the built-in default TypeScript compiler options.
143
143
  */
@@ -183,7 +183,7 @@ exports.TsJestTsconfig = TsJestTsconfig;
183
183
  * @pjid typescript
184
184
  */
185
185
  class TypeScriptProject extends javascript_1.NodeProject {
186
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptProject", version: "0.100.7" };
186
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptProject", version: "0.101.0" };
187
187
  static DEFAULT_TS_JEST_TRANFORM_PATTERN = "^.+\\.[t]sx?$";
188
188
  docgen;
189
189
  docsDirectory;
@@ -614,7 +614,7 @@ class SampleCode extends component_1.Component {
614
614
  * @pjid typescript-app
615
615
  */
616
616
  class TypeScriptAppProject extends TypeScriptProject {
617
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptAppProject", version: "0.100.7" };
617
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.TypeScriptAppProject", version: "0.101.0" };
618
618
  constructor(options) {
619
619
  // Releasing and packaging are coupled. If one is disabled, disable the other by default.
620
620
  const shouldRelease = options.release ?? false;
@@ -102,82 +102,46 @@ export declare const npm: AsyncTool;
102
102
  * Cross-platform helper for `npx` (a Windows `.cmd` shim).
103
103
  */
104
104
  export declare const npx: AsyncTool;
105
- /**
106
- * Normalized result of running a command through the system shell. This is a
107
- * subset of node's `SpawnSyncReturns` shape.
108
- */
109
- export interface RawShellResult {
105
+ export declare const rawShell: {
110
106
  /**
111
- * The exit code, or `null` if the process was terminated by a signal or
112
- * never spawned.
107
+ * Runs a user-supplied shell command line and resolves its trimmed
108
+ * STDOUT. Rejects if the command exits non-zero.
113
109
  */
114
- readonly status: number | null;
110
+ capture: (command: string, options: {
111
+ cwd: string;
112
+ env?: Record<string, string>;
113
+ }) => Promise<string>;
115
114
  /**
116
- * Captured stdout, or `null` when stdout was inherited (not captured).
115
+ * Runs a user-supplied shell command line and resolves its trimmed
116
+ * STDOUT, or `undefined` if the command failed or produced no output.
117
117
  */
118
+ tryCapture: (command: string, options: {
119
+ cwd: string;
120
+ env?: Record<string, string>;
121
+ }) => Promise<string | undefined>;
122
+ };
123
+ /**
124
+ * Normalized result of running a command through the system shell (a subset of
125
+ * node's `SpawnSyncReturns`).
126
+ */
127
+ export interface SystemShellResult {
128
+ /** Exit code, or `null` if terminated by a signal or never spawned. */
129
+ readonly status: number | null;
130
+ /** Captured stdout, or `null` when stdout was inherited. */
118
131
  readonly stdout: Buffer | null;
119
- /**
120
- * Captured stderr, or `null` when stderr was inherited (not captured).
121
- */
132
+ /** Captured stderr, or `null` when stderr was inherited. */
122
133
  readonly stderr: Buffer | null;
123
- /**
124
- * An error raised while attempting to spawn the command (not a non-zero
125
- * exit, which is reported via `status`).
126
- */
134
+ /** An error raised while attempting to spawn (not a non-zero exit). */
127
135
  readonly error?: Error;
128
136
  }
129
137
  /**
130
- * Options for {@link rawShell.exec}.
131
- */
132
- export interface RawShellExecOptions {
133
- /**
134
- * Working directory for the command.
135
- */
136
- readonly cwd: string;
137
- /**
138
- * The full environment for the command. Passed through to the shell as-is
139
- * (it is *not* merged with `process.env`), so callers that want to inherit
140
- * the parent environment must include it themselves.
141
- */
142
- readonly env?: NodeJS.ProcessEnv;
143
- /**
144
- * Capture stdout/stderr (so the caller can read them from the result)
145
- * instead of inheriting the parent's streams.
146
- *
147
- * @default false
148
- */
149
- readonly capture?: boolean;
150
- }
151
- /**
152
- * Options for {@link rawShell.capture} / {@link rawShell.tryCapture}.
138
+ * Runs a command line through the operating system's default shell (`/bin/sh`
139
+ * on POSIX, `cmd.exe` on Windows). Never throws for a non-zero exit (that is
140
+ * reported via `status`); a spawn failure is reported via `error`. The caller
141
+ * supplies the full `env`.
153
142
  */
154
- export interface RawShellCaptureOptions {
155
- /**
156
- * Working directory for the command.
157
- */
158
- readonly cwd: string;
159
- /**
160
- * Additional environment variables, merged on top of `process.env`.
161
- */
162
- readonly env?: Record<string, string>;
163
- }
164
- export declare const rawShell: {
165
- /**
166
- * Runs a command line through the system shell and returns a normalized
167
- * result. Never throws for a non-zero exit (that is reported via `status`);
168
- * a spawn failure is reported via `error`.
169
- *
170
- * The caller is responsible for supplying the full `env`.
171
- */
172
- exec(command: string, options: RawShellExecOptions): RawShellResult;
173
- /**
174
- * Runs a user-supplied shell command line and resolves its trimmed STDOUT.
175
- * Rejects if the command exits non-zero.
176
- */
177
- capture: (command: string, options: RawShellCaptureOptions) => Promise<string>;
178
- /**
179
- * Runs a user-supplied shell command line and resolves its trimmed STDOUT,
180
- * or `undefined` if the command failed or produced no output.
181
- */
182
- tryCapture: (command: string, options: RawShellCaptureOptions) => Promise<string | undefined>;
183
- };
143
+ export declare function systemShell(command: string, options: {
144
+ cwd: string;
145
+ env?: NodeJS.ProcessEnv;
146
+ capture?: boolean;
147
+ }): SystemShellResult;
package/lib/util/exec.js CHANGED
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.rawShell = exports.npx = exports.npm = exports.node = exports.poetry = exports.uv = exports.git = void 0;
37
37
  exports.tool = tool;
38
+ exports.systemShell = systemShell;
38
39
  const child_process = __importStar(require("child_process"));
39
40
  const dax_1 = require("dax");
40
41
  const logging = __importStar(require("../logging"));
@@ -172,67 +173,72 @@ exports.npm = shimTool("npm");
172
173
  * Cross-platform helper for `npx` (a Windows `.cmd` shim).
173
174
  */
174
175
  exports.npx = shimTool("npx");
176
+ //
177
+ // ---------------------------------------------------------------------------
178
+ // rawShell: arbitrary shell command strings (via dax, cross-platform).
179
+ //
180
+ // This runs an opaque command *string* through dax's cross-platform shell
181
+ // (incl. Windows). The command is parsed by a shell as-is, so it is meant for
182
+ // arbitrary command lines that cannot be expressed as a fixed binary plus a
183
+ // list of arguments, e.g. a release's `nextVersionCommand` or
184
+ // `ReleasableCommits.exec()` (and projen's own generated `ReleasableCommits`
185
+ // queries). For everything else prefer the structured `tool`/`git` helpers
186
+ // (or `shimTool` for `.cmd` shims), which take an explicit list of arguments.
187
+ //
188
+ // `$.raw` is required here (and only here): the input is an opaque command
189
+ // line, so it must be parsed by a shell. dax provides that shell on every
190
+ // platform, including Windows.
191
+ // ---------------------------------------------------------------------------
192
+ //
175
193
  exports.rawShell = {
176
194
  /**
177
- * Runs a command line through the system shell and returns a normalized
178
- * result. Never throws for a non-zero exit (that is reported via `status`);
179
- * a spawn failure is reported via `error`.
180
- *
181
- * The caller is responsible for supplying the full `env`.
182
- */
183
- exec(command, options) {
184
- logging.debug(`${command} (cwd: ${options.cwd})`);
185
- const result = child_process.spawnSync(command, {
186
- cwd: options.cwd,
187
- shell: true,
188
- maxBuffer: MAX_BUFFER,
189
- env: options.env,
190
- // "pipe" for STDERR (when capturing) means it appears in exceptions.
191
- stdio: options.capture ? ["inherit", "pipe", "pipe"] : "inherit",
192
- });
193
- return {
194
- status: result.status,
195
- stdout: result.stdout ?? null,
196
- stderr: result.stderr ?? null,
197
- error: result.error,
198
- };
199
- },
200
- /**
201
- * Runs a user-supplied shell command line and resolves its trimmed STDOUT.
202
- * Rejects if the command exits non-zero.
195
+ * Runs a user-supplied shell command line and resolves its trimmed
196
+ * STDOUT. Rejects if the command exits non-zero.
203
197
  */
204
198
  capture: async (command, options) => {
205
- const result = exports.rawShell.exec(command, {
206
- cwd: options.cwd,
207
- env: { ...process.env, ...options.env },
208
- capture: true,
209
- });
210
- if (result.error) {
211
- throw result.error;
212
- }
213
- if (result.status !== 0) {
214
- const error = new Error(`Command failed (exit code ${result.status}): ${command}`);
215
- error.status = result.status;
216
- error.stderr = result.stderr;
217
- throw error;
218
- }
219
- return (result.stdout?.toString("utf-8") ?? "").trim();
199
+ logging.debug(`${command} (cwd: ${options.cwd})`);
200
+ const cmd = dax_1.$.raw `${command}`.cwd(options.cwd);
201
+ return (options.env ? cmd.env(options.env) : cmd).text();
220
202
  },
221
203
  /**
222
- * Runs a user-supplied shell command line and resolves its trimmed STDOUT,
223
- * or `undefined` if the command failed or produced no output.
204
+ * Runs a user-supplied shell command line and resolves its trimmed
205
+ * STDOUT, or `undefined` if the command failed or produced no output.
224
206
  */
225
207
  tryCapture: async (command, options) => {
226
- const result = exports.rawShell.exec(command, {
227
- cwd: options.cwd,
228
- env: { ...process.env, ...options.env },
229
- capture: true,
230
- });
231
- if (result.error || result.status !== 0) {
208
+ logging.debug(`${command} (cwd: ${options.cwd})`);
209
+ let cmd = dax_1.$.raw `${command}`.cwd(options.cwd).noThrow().stdout("piped");
210
+ if (options.env) {
211
+ cmd = cmd.env(options.env);
212
+ }
213
+ const result = await cmd;
214
+ if (result.code !== 0) {
232
215
  return undefined;
233
216
  }
234
- const out = (result.stdout?.toString("utf-8") ?? "").trim();
217
+ const out = result.stdout.trim();
235
218
  return out || undefined;
236
219
  },
237
220
  };
238
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2V4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0pBLG9CQU1DO0FBcktELDZEQUErQztBQUMvQyw2QkFBd0I7QUFDeEIsb0RBQXNDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBZ0RwQyxTQUFTLFNBQVMsQ0FBQyxPQUF3QjtJQUN6QyxPQUFPO1FBQ0wsU0FBUyxFQUFFLFVBQVU7UUFDckIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNqRSwwREFBMEQ7UUFDMUQsS0FBSyxFQUFFLEtBQWM7S0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQUUsSUFBYyxFQUFFLE9BQW1CO0lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUVqRSxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7UUFDckMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ3JCLHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsMEVBQTBFO1FBQzFFLEtBQUssRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7S0FDakUsQ0FB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QUNILElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQztJQUMxQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiZGF4XCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5cbmNvbnN0IE1BWF9CVUZGRVIgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGVsbC1mcmVlIGV4ZWN1dGlvbiAoZXhlY0ZpbGVTeW5jLCBzaGVsbDogZmFsc2UpLlxuLy9cbi8vIFRoZSBwcm9ncmFtIGFuZCBlYWNoIGFyZ3VtZW50IGFyZSBwYXNzZWQgdG8gdGhlIE9TIGRpcmVjdGx5IHdpdGhvdXQgZ29pbmdcbi8vIHRocm91Z2ggYSBzaGVsbCwgc28gdGhlcmUgaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgYW5kIG5vIGRpZmZlcmVuY2VzXG4vLyBiZXR3ZWVuIHBsYXRmb3JtIHNoZWxscyB0byBhY2NvdW50IGZvciB3aGVuIGNvbW1hbmRzIGluY2x1ZGUgdmFsdWVzIGRlcml2ZWRcbi8vIGZyb20gZmlsZXMsIGdpdCBvdXRwdXQsIGNvbmZpZ3VyYXRpb24sIGV0Yy5cbi8vXG4vLyBPbmx5IHBlci10b29sIGhlbHBlcnMgYXJlIGV4cG9ydGVkIChlLmcuIGBnaXRgKTsgdGhlIGdlbmVyaWMgcHJpbWl0aXZlcyBhcmVcbi8vIGtlcHQgcHJpdmF0ZSBzbyBjYWxsIHNpdGVzIGFyZSBleHBsaWNpdCBhYm91dCB3aGljaCB0b29sIHRoZXkgaW52b2tlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNoZWxsLWZyZWUgY29tbWFuZCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY0ZpbGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcywgbWVyZ2VkIG9uIHRvcCBvZiBgcHJvY2Vzcy5lbnZgLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgVG9vbC5ydW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMgZXh0ZW5kcyBFeGVjRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogU3RyZWFtIHRoZSBjaGlsZCdzIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmFpZ2h0IHRvIHRoZSBwYXJlbnQncyBzdGRvdXQgYW5kXG4gICAqIHN0ZGVyciAoZnVsbCBpbmhlcml0YW5jZSksIGluc3RlYWQgb2YgcmVkaXJlY3Rpbmcgc3Rkb3V0IHRvIHN0ZGVyciBhbmRcbiAgICogY2FwdHVyaW5nIHN0ZGVyciAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIGxhdW5jaGluZyBhIGNoaWxkIHByb2Nlc3Mgd2hvc2Ugc3Rkb3V0IGlzIG1lYW5pbmdmdWwgYW5kXG4gICAqIHdob3NlIG91dHB1dCBzaG91bGQgc3RyZWFtIGxpdmUgdG8gdGhlIHVzZXIgKGUuZy4gdGhlIHByb2plbiBDTEkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5oZXJpdFN0ZGlvPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gc3Bhd25PcHRzKG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgIGVudjogb3B0aW9ucy5lbnYgPyB7IC4uLnByb2Nlc3MuZW52LCAuLi5vcHRpb25zLmVudiB9IDogdW5kZWZpbmVkLFxuICAgIC8vIHJ1biB0aGUgcHJvZ3JhbSBkaXJlY3RseSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgc2hlbGxcbiAgICBzaGVsbDogZmFsc2UgYXMgY29uc3QsXG4gIH07XG59XG5cbi8qKlxuICogUnVucyBhIHByb2dyYW0gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBpbmhlcml0aW5nIHN0ZG91dC4gVGhyb3dzIGlmIHRoZVxuICogY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLlxuICovXG5mdW5jdGlvbiBydW4oZmlsZTogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQge1xuICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG5cbiAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoZmlsZSwgYXJncywge1xuICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAvLyBCeSBkZWZhdWx0IHRoZSBjaGlsZCdzIHN0ZG91dCBpcyByZWRpcmVjdGVkIHRvIFNUREVSUiAodG8ga2VlcCB0aGVcbiAgICAvLyBwYXJlbnQncyBTVERPVVQgY2xlYW4pIGFuZCBpdHMgU1RERVJSIGlzIHBpcGVkIHNvIGl0IHN1cmZhY2VzIGluXG4gICAgLy8gZXhjZXB0aW9ucy4gYGluaGVyaXRTdGRpb2AgaW5zdGVhZCBzdHJlYW1zIGJvdGggc3RyYWlnaHQgdG8gdGhlIHBhcmVudC5cbiAgICBzdGRpbzogb3B0aW9ucy5pbmhlcml0U3RkaW8gPyBcImluaGVyaXRcIiA6IFtcImluaGVyaXRcIiwgMiwgXCJwaXBlXCJdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgdHJpbW1lZCBTVERPVVQuIFRocm93cyBpZiB0aGUgY29tbWFuZCBleGl0c1xuICogd2l0aCBhIG5vbi16ZXJvIHN0YXR1cy5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZShcbiAgZmlsZTogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuXG4gIHJldHVybiBjaGlsZF9wcm9jZXNzXG4gICAgLmV4ZWNGaWxlU3luYyhmaWxlLCBhcmdzLCB7XG4gICAgICAuLi5zcGF3bk9wdHMob3B0aW9ucyksXG4gICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLCAvLyBcInBpcGVcIiBmb3IgU1RERVJSIG1lYW5zIGl0IGFwcGVhcnMgaW4gZXhjZXB0aW9uc1xuICAgIH0pXG4gICAgLnRvU3RyaW5nKFwidXRmLThcIilcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBwcm9ncmFtIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGNvbW1hbmRcbiAqIGZhaWxlZCBvciBwcm9kdWNlZCBubyBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHRyeUNhcHR1cmUoXG4gIGZpbGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxvZ2dpbmcuZGVidWcoYCR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgLmV4ZWNGaWxlU3luYyhmaWxlLCBhcmdzLCB7XG4gICAgICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSwgLy8gXCJwaXBlXCIgZm9yIFNUREVSUiBtZWFucyBpdCBhcHBlYXJzIGluIGV4Y2VwdGlvbnNcbiAgICAgIH0pXG4gICAgICAudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgICAgLnRyaW0oKTtcblxuICAgIC8vIGFuIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB1bmRlZmluZWRcbiAgICByZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQSBzaGVsbC1mcmVlIGhhbmRsZSBmb3IgaW52b2tpbmcgYSBzaW5nbGUgcHJvZ3JhbSBieSBuYW1lIG9yIHBhdGguXG4gKlxuICogRWFjaCBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIHByb2dyYW0gdmVyYmF0aW0gKG5vIHNoZWxsIHBhcnNpbmcpLCBzbyB0aGVyZVxuICogaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgZm9yIHZhbHVlcyBzdWNoIGFzIHRhZ3MsIHZlcnNpb25zLCBicmFuY2ggbmFtZXNcbiAqIG9yIGZpbGUgcGF0aHMuXG4gKlxuICogTm90ZTogdGhlIHByb2dyYW0gaXMgZXhlY3V0ZWQgZGlyZWN0bHksIHdpdGhvdXQgYSBzaGVsbC4gT24gV2luZG93cyB0aGlzXG4gKiBtZWFucyBpdCBtdXN0IGJlIGEgcmVhbCBleGVjdXRhYmxlIC0gYC5jbWRgL2AuYmF0YCBzaGltcyAoc3VjaCBhc1xuICogbnBtLWluc3RhbGxlZCBDTElzIGxpa2UgbnBtL25weC95YXJuL3BucG0pIGNhbm5vdCBiZSBpbnZva2VkIHRoaXMgd2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2wge1xuICAvKipcbiAgICogUnVucyBgPHRvb2w+IDxhcmdzPmAsIGluaGVyaXRpbmcgc3Rkb3V0LiBUaHJvd3Mgb24gbm9uLXplcm8gZXhpdC5cbiAgICovXG4gIHJ1bihhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVC4gVGhyb3dzIG9uIG5vbi16ZXJvIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlXG4gICAqIGNvbW1hbmQgZmFpbGVkIG9yIHByb2R1Y2VkIG5vIG91dHB1dC5cbiAgICovXG4gIHRyeUNhcHR1cmUoYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hlbGwtZnJlZSB7QGxpbmsgVG9vbH0gZm9yIHRoZSBnaXZlbiBwcm9ncmFtLlxuICpcbiAqIEBleGFtcGxlIGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7IGdpdC5ydW4oW1widGFnXCIsIFwiLS1kZWxldGVcIiwgdGFnXSwgeyBjd2QgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKGZpbGU6IHN0cmluZyk6IFRvb2wge1xuICByZXR1cm4ge1xuICAgIHJ1bjogKGFyZ3MsIG9wdGlvbnMpID0+IHJ1bihmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICBjYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gY2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICB0cnlDYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gdHJ5Q2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYGdpdGAuXG4gKlxuICogQGV4YW1wbGUgZ2l0LnJ1bihbXCJ0YWdcIiwgXCItLWRlbGV0ZVwiLCB0YWddLCB7IGN3ZCB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7XG5cbi8qKlxuICogU2hlbGwtZnJlZSBoZWxwZXIgZm9yIGludm9raW5nIGB1dmAgKHNoaXBzIGFzIGEgbmF0aXZlIGJpbmFyeSBvbiBhbGxcbiAqIHBsYXRmb3JtcykuXG4gKi9cbmV4cG9ydCBjb25zdCB1diA9IHRvb2woXCJ1dlwiKTtcblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYHBvZXRyeWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwb2V0cnkgPSB0b29sKFwicG9ldHJ5XCIpO1xuXG4vKipcbiAqIFNoZWxsLWZyZWUgaGVscGVyIGZvciBpbnZva2luZyB0aGUgY3VycmVudCBOb2RlLmpzIGV4ZWN1dGFibGVcbiAqIChgcHJvY2Vzcy5leGVjUGF0aGApLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZSA9IHRvb2wocHJvY2Vzcy5leGVjUGF0aCk7XG5cbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyb3NzLXBsYXRmb3JtIGV4ZWN1dGlvbiB2aWEgZGF4IChmb3IgYmluYXJpZXMgdGhhdCBtYXkgYmUgYC5jbWRgIHNoaW1zKS5cbi8vXG4vLyBgdG9vbGAgYWJvdmUgdXNlcyBgZXhlY0ZpbGVTeW5jYCB3aXRoIGBzaGVsbDogZmFsc2VgLCB3aGljaCBjYW5ub3QgbGF1bmNoXG4vLyBXaW5kb3dzIGAuY21kYC9gLmJhdGAgc2hpbXMgc3VjaCBhcyBgbnB4YCBvciBgbnBtYC4gYHNoaW1Ub29sYCBydW5zIHRocm91Z2hcbi8vIGRheCwgd2hpY2ggcmVzb2x2ZXMgdGhvc2Ugc2hpbXMgY3Jvc3MtcGxhdGZvcm0uIEFyZ3VtZW50cyBhcmUgaW50ZXJwb2xhdGVkXG4vLyB0aHJvdWdoIGRheCdzIGVzY2FwaW5nIChOT1QgYCQucmF3YCksIHNvIGVhY2ggdmFsdWUgaXMgcGFzc2VkIGFzIGEgc2luZ2xlXG4vLyBsaXRlcmFsIGFyZ3VtZW50IHdpdGggbm8gcXVvdGluZyB0byBnZXQgcmlnaHQuIGRheCBpcyBhc3luY2hyb25vdXMsIHNvXG4vLyB0aGVzZSBoZWxwZXJzIGFyZSBvbmx5IHVzYWJsZSBmcm9tIGFzeW5jIGNhbGwgc2l0ZXMuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG5cbi8qKlxuICogQXN5bmMsIGRheC1iYWNrZWQgZXF1aXZhbGVudCBvZiB7QGxpbmsgVG9vbH0gZm9yIHByb2dyYW1zIHRoYXQgbWF5IGJlIGFcbiAqIFdpbmRvd3MgYC5jbWRgL2AuYmF0YCBzaGltIChlLmcuIGBucHhgLCBgbnBtYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNUb29sIHtcbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gLCBpbmhlcml0aW5nIHN0ZG91dC4gUmVqZWN0cyBvbiBub24temVybyBleGl0LlxuICAgKi9cbiAgcnVuKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSdW5zIGA8dG9vbD4gPGFyZ3M+YCBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULiBSZWplY3RzIG9uIG5vbi16ZXJvXG4gICAqIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiB7QGxpbmsgQXN5bmNUb29sfSB0aGF0IGludm9rZXMgYGZpbGVgIHZpYSBkYXgsIHJlc29sdmluZyBXaW5kb3dzXG4gKiBgLmNtZGAvYC5iYXRgIHNoaW1zIGFuZCBlc2NhcGluZyBldmVyeSBhcmd1bWVudCAoc28gZWFjaCB2YWx1ZSBpcyBwYXNzZWQgYXNcbiAqIGEgc2luZ2xlIGxpdGVyYWwgYXJndW1lbnQpLlxuICpcbiAqIEBleGFtcGxlIGF3YWl0IG5weC5ydW4oW1wiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIl0sIHsgY3dkIH0pO1xuICovXG5mdW5jdGlvbiBzaGltVG9vbChmaWxlOiBzdHJpbmcpOiBBc3luY1Rvb2wge1xuICBjb25zdCBidWlsZCA9IChhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY21kID0gJGAke2ZpbGV9ICR7YXJnc31gLmN3ZChvcHRpb25zLmN3ZCkuc3RkZXJyKFwicGlwZWRcIikubm9UaHJvdygpO1xuICAgIHJldHVybiBvcHRpb25zLmVudiA/IGNtZC5lbnYob3B0aW9ucy5lbnYpIDogY21kO1xuICB9O1xuICBjb25zdCBlbnN1cmVPayA9IChcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICByZXN1bHQ6IHsgY29kZTogbnVtYmVyOyBzdGRlcnI6IHN0cmluZyB9LFxuICApID0+IHtcbiAgICBpZiAocmVzdWx0LmNvZGUgIT09IDApIHtcbiAgICAgIC8vIE1pbWljIHRoZSBgY2hpbGRfcHJvY2Vzc2AgZXJyb3Igc2hhcGUgKGBzdGF0dXNgLCBgc3RkZXJyYCkgc28gY2FsbGVyc1xuICAgICAgLy8gY2FuIGluc3BlY3Qgc3RkZXJyIChlLmcuIHRvIGRldGVjdCBFTk9FTlQvRTQwNCBmcm9tIG5wbSkuXG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgKGV4aXQgY29kZSAke3Jlc3VsdC5jb2RlfSk6ICR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfWAsXG4gICAgICApO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gcmVzdWx0LmNvZGU7XG4gICAgICBlcnJvci5zdGRlcnIgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBydW46IGFzeW5jIChhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICBlbnN1cmVPayhhcmdzLCBhd2FpdCBidWlsZChhcmdzLCBvcHRpb25zKSk7XG4gICAgfSxcbiAgICBjYXB0dXJlOiBhc3luYyAoYXJncywgb3B0aW9ucykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGQoYXJncywgb3B0aW9ucykuc3Rkb3V0KFwicGlwZWRcIik7XG4gICAgICBlbnN1cmVPayhhcmdzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBgbnBtYCAoYSBXaW5kb3dzIGAuY21kYCBzaGltKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5wbSA9IHNoaW1Ub29sKFwibnBtXCIpO1xuXG4vKipcbiAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3IgYG5weGAgKGEgV2luZG93cyBgLmNtZGAgc2hpbSkuXG4gKi9cbmV4cG9ydCBjb25zdCBucHggPSBzaGltVG9vbChcIm5weFwiKTtcblxuLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcmF3U2hlbGw6IGFyYml0cmFyeSBzaGVsbCBjb21tYW5kIHN0cmluZ3MgKHZpYSB0aGUgc3lzdGVtIHNoZWxsKS5cbi8vXG4vLyBUaGlzIHJ1bnMgYW4gb3BhcXVlIGNvbW1hbmQgKnN0cmluZyogdGhyb3VnaCB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGRlZmF1bHRcbi8vIHNoZWxsIChgL2Jpbi9zaGAgb24gUE9TSVgsIGBjbWQuZXhlYCBvbiBXaW5kb3dzKSAtIHRoZSBzYW1lIG1lY2hhbmlzbSB0aGVcbi8vIGNvZGViYXNlIHVzZWQgcHJldmlvdXNseS4gSXQgaXMgbWVhbnQgZm9yIGNvbW1hbmQgbGluZXMgdGhhdCBjYW5ub3QgYmVcbi8vIGV4cHJlc3NlZCBhcyBhIGZpeGVkIGJpbmFyeSBwbHVzIGEgbGlzdCBvZiBhcmd1bWVudHMsIGUuZy4gYSByZWxlYXNlJ3Ncbi8vIGBuZXh0VmVyc2lvbkNvbW1hbmRgIG9yIGBSZWxlYXNhYmxlQ29tbWl0cy5leGVjKClgIChhbmQgcHJvamVuJ3Mgb3duXG4vLyBnZW5lcmF0ZWQgYFJlbGVhc2FibGVDb21taXRzYCBxdWVyaWVzKSwgYXMgd2VsbCBhcyB0YXNrIHN0ZXBzIG9uIG5vbi1XaW5kb3dzXG4vLyBwbGF0Zm9ybXMuIEZvciBldmVyeXRoaW5nIGVsc2UgcHJlZmVyIHRoZSBzdHJ1Y3R1cmVkIGB0b29sYC9gZ2l0YCBoZWxwZXJzXG4vLyAob3IgYHNoaW1Ub29sYCBmb3IgYC5jbWRgIHNoaW1zKSwgd2hpY2ggdGFrZSBhbiBleHBsaWNpdCBsaXN0IG9mIGFyZ3VtZW50cy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cblxuLyoqXG4gKiBOb3JtYWxpemVkIHJlc3VsdCBvZiBydW5uaW5nIGEgY29tbWFuZCB0aHJvdWdoIHRoZSBzeXN0ZW0gc2hlbGwuIFRoaXMgaXMgYVxuICogc3Vic2V0IG9mIG5vZGUncyBgU3Bhd25TeW5jUmV0dXJuc2Agc2hhcGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3U2hlbGxSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGV4aXQgY29kZSwgb3IgYG51bGxgIGlmIHRoZSBwcm9jZXNzIHdhcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsIG9yXG4gICAqIG5ldmVyIHNwYXduZWQuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZG91dCwgb3IgYG51bGxgIHdoZW4gc3Rkb3V0IHdhcyBpbmhlcml0ZWQgKG5vdCBjYXB0dXJlZCkuXG4gICAqL1xuICByZWFkb25seSBzdGRvdXQ6IEJ1ZmZlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIENhcHR1cmVkIHN0ZGVyciwgb3IgYG51bGxgIHdoZW4gc3RkZXJyIHdhcyBpbmhlcml0ZWQgKG5vdCBjYXB0dXJlZCkuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI6IEJ1ZmZlciB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuIGVycm9yIHJhaXNlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIHNwYXduIHRoZSBjb21tYW5kIChub3QgYSBub24temVyb1xuICAgKiBleGl0LCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmF3U2hlbGwuZXhlY30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3U2hlbGxFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yIHRoZSBjb21tYW5kLiBQYXNzZWQgdGhyb3VnaCB0byB0aGUgc2hlbGwgYXMtaXNcbiAgICogKGl0IGlzICpub3QqIG1lcmdlZCB3aXRoIGBwcm9jZXNzLmVudmApLCBzbyBjYWxsZXJzIHRoYXQgd2FudCB0byBpbmhlcml0XG4gICAqIHRoZSBwYXJlbnQgZW52aXJvbm1lbnQgbXVzdCBpbmNsdWRlIGl0IHRoZW1zZWx2ZXMuXG4gICAqL1xuICByZWFkb25seSBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudjtcblxuICAvKipcbiAgICogQ2FwdHVyZSBzdGRvdXQvc3RkZXJyIChzbyB0aGUgY2FsbGVyIGNhbiByZWFkIHRoZW0gZnJvbSB0aGUgcmVzdWx0KVxuICAgKiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgdGhlIHBhcmVudCdzIHN0cmVhbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBjYXB0dXJlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmF3U2hlbGwuY2FwdHVyZX0gLyB7QGxpbmsgcmF3U2hlbGwudHJ5Q2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmF3U2hlbGxDYXB0dXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXb3JraW5nIGRpcmVjdG9yeSBmb3IgdGhlIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIG1lcmdlZCBvbiB0b3Agb2YgYHByb2Nlc3MuZW52YC5cbiAgICovXG4gIHJlYWRvbmx5IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBjb25zdCByYXdTaGVsbCA9IHtcbiAgLyoqXG4gICAqIFJ1bnMgYSBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgc3lzdGVtIHNoZWxsIGFuZCByZXR1cm5zIGEgbm9ybWFsaXplZFxuICAgKiByZXN1bHQuIE5ldmVyIHRocm93cyBmb3IgYSBub24temVybyBleGl0ICh0aGF0IGlzIHJlcG9ydGVkIHZpYSBgc3RhdHVzYCk7XG4gICAqIGEgc3Bhd24gZmFpbHVyZSBpcyByZXBvcnRlZCB2aWEgYGVycm9yYC5cbiAgICpcbiAgICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3VwcGx5aW5nIHRoZSBmdWxsIGBlbnZgLlxuICAgKi9cbiAgZXhlYyhjb21tYW5kOiBzdHJpbmcsIG9wdGlvbnM6IFJhd1NoZWxsRXhlY09wdGlvbnMpOiBSYXdTaGVsbFJlc3VsdCB7XG4gICAgbG9nZ2luZy5kZWJ1ZyhgJHtjb21tYW5kfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd25TeW5jKGNvbW1hbmQsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5jd2QsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICAgIGVudjogb3B0aW9ucy5lbnYsXG4gICAgICAvLyBcInBpcGVcIiBmb3IgU1RERVJSICh3aGVuIGNhcHR1cmluZykgbWVhbnMgaXQgYXBwZWFycyBpbiBleGNlcHRpb25zLlxuICAgICAgc3RkaW86IG9wdGlvbnMuY2FwdHVyZSA/IFtcImluaGVyaXRcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSA6IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyxcbiAgICAgIHN0ZG91dDogcmVzdWx0LnN0ZG91dCA/PyBudWxsLFxuICAgICAgc3RkZXJyOiByZXN1bHQuc3RkZXJyID8/IG51bGwsXG4gICAgICBlcnJvcjogcmVzdWx0LmVycm9yLFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJ1bnMgYSB1c2VyLXN1cHBsaWVkIHNoZWxsIGNvbW1hbmQgbGluZSBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULlxuICAgKiBSZWplY3RzIGlmIHRoZSBjb21tYW5kIGV4aXRzIG5vbi16ZXJvLlxuICAgKi9cbiAgY2FwdHVyZTogYXN5bmMgKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSYXdTaGVsbENhcHR1cmVPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJhd1NoZWxsLmV4ZWMoY29tbWFuZCwge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4ub3B0aW9ucy5lbnYgfSxcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW1hbmQgZmFpbGVkIChleGl0IGNvZGUgJHtyZXN1bHQuc3RhdHVzfSk6ICR7Y29tbWFuZH1gLFxuICAgICAgKTtcbiAgICAgIGVycm9yLnN0YXR1cyA9IHJlc3VsdC5zdGF0dXM7XG4gICAgICBlcnJvci5zdGRlcnIgPSByZXN1bHQuc3RkZXJyO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHJldHVybiAocmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKSA/PyBcIlwiKS50cmltKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJ1bnMgYSB1c2VyLXN1cHBsaWVkIHNoZWxsIGNvbW1hbmQgbGluZSBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULFxuICAgKiBvciBgdW5kZWZpbmVkYCBpZiB0aGUgY29tbWFuZCBmYWlsZWQgb3IgcHJvZHVjZWQgbm8gb3V0cHV0LlxuICAgKi9cbiAgdHJ5Q2FwdHVyZTogYXN5bmMgKFxuICAgIGNvbW1hbmQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSYXdTaGVsbENhcHR1cmVPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJhd1NoZWxsLmV4ZWMoY29tbWFuZCwge1xuICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4ub3B0aW9ucy5lbnYgfSxcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvciB8fCByZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSAocmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKSA/PyBcIlwiKS50cmltKCk7XG4gICAgcmV0dXJuIG91dCB8fCB1bmRlZmluZWQ7XG4gIH0sXG59O1xuIl19
221
+ /**
222
+ * Runs a command line through the operating system's default shell (`/bin/sh`
223
+ * on POSIX, `cmd.exe` on Windows). Never throws for a non-zero exit (that is
224
+ * reported via `status`); a spawn failure is reported via `error`. The caller
225
+ * supplies the full `env`.
226
+ */
227
+ function systemShell(command, options) {
228
+ logging.debug(`${command} (cwd: ${options.cwd})`);
229
+ const result = child_process.spawnSync(command, {
230
+ cwd: options.cwd,
231
+ shell: true,
232
+ maxBuffer: MAX_BUFFER,
233
+ env: options.env,
234
+ // "pipe" for STDERR (when capturing) means it appears in exceptions.
235
+ stdio: options.capture ? ["inherit", "pipe", "pipe"] : "inherit",
236
+ });
237
+ return {
238
+ status: result.status,
239
+ stdout: result.stdout ?? null,
240
+ stderr: result.stderr ?? null,
241
+ error: result.error,
242
+ };
243
+ }
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2V4ZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0pBLG9CQU1DO0FBaU1ELGtDQW1CQztBQXpYRCw2REFBK0M7QUFDL0MsNkJBQXdCO0FBQ3hCLG9EQUFzQztBQUV0QyxNQUFNLFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQWdEcEMsU0FBUyxTQUFTLENBQUMsT0FBd0I7SUFDekMsT0FBTztRQUNMLFNBQVMsRUFBRSxVQUFVO1FBQ3JCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztRQUNoQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsMERBQTBEO1FBQzFELEtBQUssRUFBRSxLQUFjO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxHQUFHLENBQUMsSUFBWSxFQUFFLElBQWMsRUFBRSxPQUFtQjtJQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFFakUsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ3JDLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUNyQixxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLDBFQUEwRTtRQUMxRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsTUFBTSxD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QU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ2pFLENBQUMsQ0FBQztJQUNILE9BQU87UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSTtRQUM3QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJO1FBQzdCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztLQUNwQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiZGF4XCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5cbmNvbnN0IE1BWF9CVUZGRVIgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vL1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGVsbC1mcmVlIGV4ZWN1dGlvbiAoZXhlY0ZpbGVTeW5jLCBzaGVsbDogZmFsc2UpLlxuLy9cbi8vIFRoZSBwcm9ncmFtIGFuZCBlYWNoIGFyZ3VtZW50IGFyZSBwYXNzZWQgdG8gdGhlIE9TIGRpcmVjdGx5IHdpdGhvdXQgZ29pbmdcbi8vIHRocm91Z2ggYSBzaGVsbCwgc28gdGhlcmUgaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgYW5kIG5vIGRpZmZlcmVuY2VzXG4vLyBiZXR3ZWVuIHBsYXRmb3JtIHNoZWxscyB0byBhY2NvdW50IGZvciB3aGVuIGNvbW1hbmRzIGluY2x1ZGUgdmFsdWVzIGRlcml2ZWRcbi8vIGZyb20gZmlsZXMsIGdpdCBvdXRwdXQsIGNvbmZpZ3VyYXRpb24sIGV0Yy5cbi8vXG4vLyBPbmx5IHBlci10b29sIGhlbHBlcnMgYXJlIGV4cG9ydGVkIChlLmcuIGBnaXRgKTsgdGhlIGdlbmVyaWMgcHJpbWl0aXZlcyBhcmVcbi8vIGtlcHQgcHJpdmF0ZSBzbyBjYWxsIHNpdGVzIGFyZSBleHBsaWNpdCBhYm91dCB3aGljaCB0b29sIHRoZXkgaW52b2tlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNoZWxsLWZyZWUgY29tbWFuZCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY0ZpbGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdvcmtpbmcgZGlyZWN0b3J5IGZvciB0aGUgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcywgbWVyZ2VkIG9uIHRvcCBvZiBgcHJvY2Vzcy5lbnZgLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgVG9vbC5ydW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMgZXh0ZW5kcyBFeGVjRmlsZU9wdGlvbnMge1xuICAvKipcbiAgICogU3RyZWFtIHRoZSBjaGlsZCdzIHN0ZG91dCBhbmQgc3RkZXJyIHN0cmFpZ2h0IHRvIHRoZSBwYXJlbnQncyBzdGRvdXQgYW5kXG4gICAqIHN0ZGVyciAoZnVsbCBpbmhlcml0YW5jZSksIGluc3RlYWQgb2YgcmVkaXJlY3Rpbmcgc3Rkb3V0IHRvIHN0ZGVyciBhbmRcbiAgICogY2FwdHVyaW5nIHN0ZGVyciAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIGxhdW5jaGluZyBhIGNoaWxkIHByb2Nlc3Mgd2hvc2Ugc3Rkb3V0IGlzIG1lYW5pbmdmdWwgYW5kXG4gICAqIHdob3NlIG91dHB1dCBzaG91bGQgc3RyZWFtIGxpdmUgdG8gdGhlIHVzZXIgKGUuZy4gdGhlIHByb2plbiBDTEkpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5oZXJpdFN0ZGlvPzogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gc3Bhd25PcHRzKG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucykge1xuICByZXR1cm4ge1xuICAgIG1heEJ1ZmZlcjogTUFYX0JVRkZFUixcbiAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgIGVudjogb3B0aW9ucy5lbnYgPyB7IC4uLnByb2Nlc3MuZW52LCAuLi5vcHRpb25zLmVudiB9IDogdW5kZWZpbmVkLFxuICAgIC8vIHJ1biB0aGUgcHJvZ3JhbSBkaXJlY3RseSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIGEgc2hlbGxcbiAgICBzaGVsbDogZmFsc2UgYXMgY29uc3QsXG4gIH07XG59XG5cbi8qKlxuICogUnVucyBhIHByb2dyYW0gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLCBpbmhlcml0aW5nIHN0ZG91dC4gVGhyb3dzIGlmIHRoZVxuICogY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gc3RhdHVzLlxuICovXG5mdW5jdGlvbiBydW4oZmlsZTogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQge1xuICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG5cbiAgY2hpbGRfcHJvY2Vzcy5leGVjRmlsZVN5bmMoZmlsZSwgYXJncywge1xuICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAvLyBCeSBkZWZhdWx0IHRoZSBjaGlsZCdzIHN0ZG91dCBpcyByZWRpcmVjdGVkIHRvIFNUREVSUiAodG8ga2VlcCB0aGVcbiAgICAvLyBwYXJlbnQncyBTVERPVVQgY2xlYW4pIGFuZCBpdHMgU1RERVJSIGlzIHBpcGVkIHNvIGl0IHN1cmZhY2VzIGluXG4gICAgLy8gZXhjZXB0aW9ucy4gYGluaGVyaXRTdGRpb2AgaW5zdGVhZCBzdHJlYW1zIGJvdGggc3RyYWlnaHQgdG8gdGhlIHBhcmVudC5cbiAgICBzdGRpbzogb3B0aW9ucy5pbmhlcml0U3RkaW8gPyBcImluaGVyaXRcIiA6IFtcImluaGVyaXRcIiwgMiwgXCJwaXBlXCJdLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgcHJvZ3JhbSBhbmQgcmV0dXJucyBpdHMgdHJpbW1lZCBTVERPVVQuIFRocm93cyBpZiB0aGUgY29tbWFuZCBleGl0c1xuICogd2l0aCBhIG5vbi16ZXJvIHN0YXR1cy5cbiAqL1xuZnVuY3Rpb24gY2FwdHVyZShcbiAgZmlsZTogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuXG4gIHJldHVybiBjaGlsZF9wcm9jZXNzXG4gICAgLmV4ZWNGaWxlU3luYyhmaWxlLCBhcmdzLCB7XG4gICAgICAuLi5zcGF3bk9wdHMob3B0aW9ucyksXG4gICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLCAvLyBcInBpcGVcIiBmb3IgU1RERVJSIG1lYW5zIGl0IGFwcGVhcnMgaW4gZXhjZXB0aW9uc1xuICAgIH0pXG4gICAgLnRvU3RyaW5nKFwidXRmLThcIilcbiAgICAudHJpbSgpO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBwcm9ncmFtIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGNvbW1hbmRcbiAqIGZhaWxlZCBvciBwcm9kdWNlZCBubyBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIHRyeUNhcHR1cmUoXG4gIGZpbGU6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxvZ2dpbmcuZGVidWcoYCR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfSAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHZhbHVlID0gY2hpbGRfcHJvY2Vzc1xuICAgICAgLmV4ZWNGaWxlU3luYyhmaWxlLCBhcmdzLCB7XG4gICAgICAgIC4uLnNwYXduT3B0cyhvcHRpb25zKSxcbiAgICAgICAgc3RkaW86IFtcImluaGVyaXRcIiwgXCJwaXBlXCIsIFwicGlwZVwiXSwgLy8gXCJwaXBlXCIgZm9yIFNUREVSUiBtZWFucyBpdCBhcHBlYXJzIGluIGV4Y2VwdGlvbnNcbiAgICAgIH0pXG4gICAgICAudG9TdHJpbmcoXCJ1dGYtOFwiKVxuICAgICAgLnRyaW0oKTtcblxuICAgIC8vIGFuIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB1bmRlZmluZWRcbiAgICByZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQSBzaGVsbC1mcmVlIGhhbmRsZSBmb3IgaW52b2tpbmcgYSBzaW5nbGUgcHJvZ3JhbSBieSBuYW1lIG9yIHBhdGguXG4gKlxuICogRWFjaCBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIHByb2dyYW0gdmVyYmF0aW0gKG5vIHNoZWxsIHBhcnNpbmcpLCBzbyB0aGVyZVxuICogaXMgbm8gcXVvdGluZyB0byBnZXQgcmlnaHQgZm9yIHZhbHVlcyBzdWNoIGFzIHRhZ3MsIHZlcnNpb25zLCBicmFuY2ggbmFtZXNcbiAqIG9yIGZpbGUgcGF0aHMuXG4gKlxuICogTm90ZTogdGhlIHByb2dyYW0gaXMgZXhlY3V0ZWQgZGlyZWN0bHksIHdpdGhvdXQgYSBzaGVsbC4gT24gV2luZG93cyB0aGlzXG4gKiBtZWFucyBpdCBtdXN0IGJlIGEgcmVhbCBleGVjdXRhYmxlIC0gYC5jbWRgL2AuYmF0YCBzaGltcyAoc3VjaCBhc1xuICogbnBtLWluc3RhbGxlZCBDTElzIGxpa2UgbnBtL25weC95YXJuL3BucG0pIGNhbm5vdCBiZSBpbnZva2VkIHRoaXMgd2F5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvb2wge1xuICAvKipcbiAgICogUnVucyBgPHRvb2w+IDxhcmdzPmAsIGluaGVyaXRpbmcgc3Rkb3V0LiBUaHJvd3Mgb24gbm9uLXplcm8gZXhpdC5cbiAgICovXG4gIHJ1bihhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogUnVuT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVC4gVGhyb3dzIG9uIG5vbi16ZXJvIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gIGFuZCByZXR1cm5zIGl0cyB0cmltbWVkIFNURE9VVCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlXG4gICAqIGNvbW1hbmQgZmFpbGVkIG9yIHByb2R1Y2VkIG5vIG91dHB1dC5cbiAgICovXG4gIHRyeUNhcHR1cmUoYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IEV4ZWNGaWxlT3B0aW9ucyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2hlbGwtZnJlZSB7QGxpbmsgVG9vbH0gZm9yIHRoZSBnaXZlbiBwcm9ncmFtLlxuICpcbiAqIEBleGFtcGxlIGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7IGdpdC5ydW4oW1widGFnXCIsIFwiLS1kZWxldGVcIiwgdGFnXSwgeyBjd2QgfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKGZpbGU6IHN0cmluZyk6IFRvb2wge1xuICByZXR1cm4ge1xuICAgIHJ1bjogKGFyZ3MsIG9wdGlvbnMpID0+IHJ1bihmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICBjYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gY2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgICB0cnlDYXB0dXJlOiAoYXJncywgb3B0aW9ucykgPT4gdHJ5Q2FwdHVyZShmaWxlLCBhcmdzLCBvcHRpb25zKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYGdpdGAuXG4gKlxuICogQGV4YW1wbGUgZ2l0LnJ1bihbXCJ0YWdcIiwgXCItLWRlbGV0ZVwiLCB0YWddLCB7IGN3ZCB9KTtcbiAqL1xuZXhwb3J0IGNvbnN0IGdpdCA9IHRvb2woXCJnaXRcIik7XG5cbi8qKlxuICogU2hlbGwtZnJlZSBoZWxwZXIgZm9yIGludm9raW5nIGB1dmAgKHNoaXBzIGFzIGEgbmF0aXZlIGJpbmFyeSBvbiBhbGxcbiAqIHBsYXRmb3JtcykuXG4gKi9cbmV4cG9ydCBjb25zdCB1diA9IHRvb2woXCJ1dlwiKTtcblxuLyoqXG4gKiBTaGVsbC1mcmVlIGhlbHBlciBmb3IgaW52b2tpbmcgYHBvZXRyeWAuXG4gKi9cbmV4cG9ydCBjb25zdCBwb2V0cnkgPSB0b29sKFwicG9ldHJ5XCIpO1xuXG4vKipcbiAqIFNoZWxsLWZyZWUgaGVscGVyIGZvciBpbnZva2luZyB0aGUgY3VycmVudCBOb2RlLmpzIGV4ZWN1dGFibGVcbiAqIChgcHJvY2Vzcy5leGVjUGF0aGApLlxuICovXG5leHBvcnQgY29uc3Qgbm9kZSA9IHRvb2wocHJvY2Vzcy5leGVjUGF0aCk7XG5cbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENyb3NzLXBsYXRmb3JtIGV4ZWN1dGlvbiB2aWEgZGF4IChmb3IgYmluYXJpZXMgdGhhdCBtYXkgYmUgYC5jbWRgIHNoaW1zKS5cbi8vXG4vLyBgdG9vbGAgYWJvdmUgdXNlcyBgZXhlY0ZpbGVTeW5jYCB3aXRoIGBzaGVsbDogZmFsc2VgLCB3aGljaCBjYW5ub3QgbGF1bmNoXG4vLyBXaW5kb3dzIGAuY21kYC9gLmJhdGAgc2hpbXMgc3VjaCBhcyBgbnB4YCBvciBgbnBtYC4gYHNoaW1Ub29sYCBydW5zIHRocm91Z2hcbi8vIGRheCwgd2hpY2ggcmVzb2x2ZXMgdGhvc2Ugc2hpbXMgY3Jvc3MtcGxhdGZvcm0uIEFyZ3VtZW50cyBhcmUgaW50ZXJwb2xhdGVkXG4vLyB0aHJvdWdoIGRheCdzIGVzY2FwaW5nIChOT1QgYCQucmF3YCksIHNvIGVhY2ggdmFsdWUgaXMgcGFzc2VkIGFzIGEgc2luZ2xlXG4vLyBsaXRlcmFsIGFyZ3VtZW50IHdpdGggbm8gcXVvdGluZyB0byBnZXQgcmlnaHQuIGRheCBpcyBhc3luY2hyb25vdXMsIHNvXG4vLyB0aGVzZSBoZWxwZXJzIGFyZSBvbmx5IHVzYWJsZSBmcm9tIGFzeW5jIGNhbGwgc2l0ZXMuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG5cbi8qKlxuICogQXN5bmMsIGRheC1iYWNrZWQgZXF1aXZhbGVudCBvZiB7QGxpbmsgVG9vbH0gZm9yIHByb2dyYW1zIHRoYXQgbWF5IGJlIGFcbiAqIFdpbmRvd3MgYC5jbWRgL2AuYmF0YCBzaGltIChlLmcuIGBucHhgLCBgbnBtYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNUb29sIHtcbiAgLyoqXG4gICAqIFJ1bnMgYDx0b29sPiA8YXJncz5gLCBpbmhlcml0aW5nIHN0ZG91dC4gUmVqZWN0cyBvbiBub24temVybyBleGl0LlxuICAgKi9cbiAgcnVuKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSdW5zIGA8dG9vbD4gPGFyZ3M+YCBhbmQgcmVzb2x2ZXMgaXRzIHRyaW1tZWQgU1RET1VULiBSZWplY3RzIG9uIG5vbi16ZXJvXG4gICAqIGV4aXQuXG4gICAqL1xuICBjYXB0dXJlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBFeGVjRmlsZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiB7QGxpbmsgQXN5bmNUb29sfSB0aGF0IGludm9rZXMgYGZpbGVgIHZpYSBkYXgsIHJlc29sdmluZyBXaW5kb3dzXG4gKiBgLmNtZGAvYC5iYXRgIHNoaW1zIGFuZCBlc2NhcGluZyBldmVyeSBhcmd1bWVudCAoc28gZWFjaCB2YWx1ZSBpcyBwYXNzZWQgYXNcbiAqIGEgc2luZ2xlIGxpdGVyYWwgYXJndW1lbnQpLlxuICpcbiAqIEBleGFtcGxlIGF3YWl0IG5weC5ydW4oW1wiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIl0sIHsgY3dkIH0pO1xuICovXG5mdW5jdGlvbiBzaGltVG9vbChmaWxlOiBzdHJpbmcpOiBBc3luY1Rvb2wge1xuICBjb25zdCBidWlsZCA9IChhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogRXhlY0ZpbGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY21kID0gJGAke2ZpbGV9ICR7YXJnc31gLmN3ZChvcHRpb25zLmN3ZCkuc3RkZXJyKFwicGlwZWRcIikubm9UaHJvdygpO1xuICAgIHJldHVybiBvcHRpb25zLmVudiA/IGNtZC5lbnYob3B0aW9ucy5lbnYpIDogY21kO1xuICB9O1xuICBjb25zdCBlbnN1cmVPayA9IChcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICByZXN1bHQ6IHsgY29kZTogbnVtYmVyOyBzdGRlcnI6IHN0cmluZyB9LFxuICApID0+IHtcbiAgICBpZiAocmVzdWx0LmNvZGUgIT09IDApIHtcbiAgICAgIC8vIE1pbWljIHRoZSBgY2hpbGRfcHJvY2Vzc2AgZXJyb3Igc2hhcGUgKGBzdGF0dXNgLCBgc3RkZXJyYCkgc28gY2FsbGVyc1xuICAgICAgLy8gY2FuIGluc3BlY3Qgc3RkZXJyIChlLmcuIHRvIGRldGVjdCBFTk9FTlQvRTQwNCBmcm9tIG5wbSkuXG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgQ29tbWFuZCBmYWlsZWQgKGV4aXQgY29kZSAke3Jlc3VsdC5jb2RlfSk6ICR7ZmlsZX0gJHthcmdzLmpvaW4oXCIgXCIpfWAsXG4gICAgICApO1xuICAgICAgZXJyb3Iuc3RhdHVzID0gcmVzdWx0LmNvZGU7XG4gICAgICBlcnJvci5zdGRlcnIgPSBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBydW46IGFzeW5jIChhcmdzLCBvcHRpb25zKSA9PiB7XG4gICAgICBsb2dnaW5nLmRlYnVnKGAke2ZpbGV9ICR7YXJncy5qb2luKFwiIFwiKX0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICBlbnN1cmVPayhhcmdzLCBhd2FpdCBidWlsZChhcmdzLCBvcHRpb25zKSk7XG4gICAgfSxcbiAgICBjYXB0dXJlOiBhc3luYyAoYXJncywgb3B0aW9ucykgPT4ge1xuICAgICAgbG9nZ2luZy5kZWJ1ZyhgJHtmaWxlfSAke2FyZ3Muam9pbihcIiBcIil9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYnVpbGQoYXJncywgb3B0aW9ucykuc3Rkb3V0KFwicGlwZWRcIik7XG4gICAgICBlbnN1cmVPayhhcmdzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQudHJpbSgpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBgbnBtYCAoYSBXaW5kb3dzIGAuY21kYCBzaGltKS5cbiAqL1xuZXhwb3J0IGNvbnN0IG5wbSA9IHNoaW1Ub29sKFwibnBtXCIpO1xuXG4vKipcbiAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3IgYG5weGAgKGEgV2luZG93cyBgLmNtZGAgc2hpbSkuXG4gKi9cbmV4cG9ydCBjb25zdCBucHggPSBzaGltVG9vbChcIm5weFwiKTtcblxuLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcmF3U2hlbGw6IGFyYml0cmFyeSBzaGVsbCBjb21tYW5kIHN0cmluZ3MgKHZpYSBkYXgsIGNyb3NzLXBsYXRmb3JtKS5cbi8vXG4vLyBUaGlzIHJ1bnMgYW4gb3BhcXVlIGNvbW1hbmQgKnN0cmluZyogdGhyb3VnaCBkYXgncyBjcm9zcy1wbGF0Zm9ybSBzaGVsbFxuLy8gKGluY2wuIFdpbmRvd3MpLiBUaGUgY29tbWFuZCBpcyBwYXJzZWQgYnkgYSBzaGVsbCBhcy1pcywgc28gaXQgaXMgbWVhbnQgZm9yXG4vLyBhcmJpdHJhcnkgY29tbWFuZCBsaW5lcyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgYXMgYSBmaXhlZCBiaW5hcnkgcGx1cyBhXG4vLyBsaXN0IG9mIGFyZ3VtZW50cywgZS5nLiBhIHJlbGVhc2UncyBgbmV4dFZlcnNpb25Db21tYW5kYCBvclxuLy8gYFJlbGVhc2FibGVDb21taXRzLmV4ZWMoKWAgKGFuZCBwcm9qZW4ncyBvd24gZ2VuZXJhdGVkIGBSZWxlYXNhYmxlQ29tbWl0c2Bcbi8vIHF1ZXJpZXMpLiBGb3IgZXZlcnl0aGluZyBlbHNlIHByZWZlciB0aGUgc3RydWN0dXJlZCBgdG9vbGAvYGdpdGAgaGVscGVyc1xuLy8gKG9yIGBzaGltVG9vbGAgZm9yIGAuY21kYCBzaGltcyksIHdoaWNoIHRha2UgYW4gZXhwbGljaXQgbGlzdCBvZiBhcmd1bWVudHMuXG4vL1xuLy8gYCQucmF3YCBpcyByZXF1aXJlZCBoZXJlIChhbmQgb25seSBoZXJlKTogdGhlIGlucHV0IGlzIGFuIG9wYXF1ZSBjb21tYW5kXG4vLyBsaW5lLCBzbyBpdCBtdXN0IGJlIHBhcnNlZCBieSBhIHNoZWxsLiBkYXggcHJvdmlkZXMgdGhhdCBzaGVsbCBvbiBldmVyeVxuLy8gcGxhdGZvcm0sIGluY2x1ZGluZyBXaW5kb3dzLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuXG5leHBvcnQgY29uc3QgcmF3U2hlbGwgPSB7XG4gIC8qKlxuICAgKiBSdW5zIGEgdXNlci1zdXBwbGllZCBzaGVsbCBjb21tYW5kIGxpbmUgYW5kIHJlc29sdmVzIGl0cyB0cmltbWVkXG4gICAqIFNURE9VVC4gUmVqZWN0cyBpZiB0aGUgY29tbWFuZCBleGl0cyBub24temVyby5cbiAgICovXG4gIGNhcHR1cmU6IGFzeW5jIChcbiAgICBjb21tYW5kOiBzdHJpbmcsXG4gICAgb3B0aW9uczogeyBjd2Q6IHN0cmluZzsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9LFxuICApOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGxvZ2dpbmcuZGVidWcoYCR7Y29tbWFuZH0gKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgY29uc3QgY21kID0gJC5yYXdgJHtjb21tYW5kfWAuY3dkKG9wdGlvbnMuY3dkKTtcbiAgICByZXR1cm4gKG9wdGlvbnMuZW52ID8gY21kLmVudihvcHRpb25zLmVudikgOiBjbWQpLnRleHQoKTtcbiAgfSxcblxuICAvKipcbiAgICogUnVucyBhIHVzZXItc3VwcGxpZWQgc2hlbGwgY29tbWFuZCBsaW5lIGFuZCByZXNvbHZlcyBpdHMgdHJpbW1lZFxuICAgKiBTVERPVVQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBjb21tYW5kIGZhaWxlZCBvciBwcm9kdWNlZCBubyBvdXRwdXQuXG4gICAqL1xuICB0cnlDYXB0dXJlOiBhc3luYyAoXG4gICAgY29tbWFuZDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSxcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBsb2dnaW5nLmRlYnVnKGAke2NvbW1hbmR9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICAgIGxldCBjbWQgPSAkLnJhd2Ake2NvbW1hbmR9YC5jd2Qob3B0aW9ucy5jd2QpLm5vVGhyb3coKS5zdGRvdXQoXCJwaXBlZFwiKTtcbiAgICBpZiAob3B0aW9ucy5lbnYpIHtcbiAgICAgIGNtZCA9IGNtZC5lbnYob3B0aW9ucy5lbnYpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbWQ7XG4gICAgaWYgKHJlc3VsdC5jb2RlICE9PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBvdXQgPSByZXN1bHQuc3Rkb3V0LnRyaW0oKTtcbiAgICByZXR1cm4gb3V0IHx8IHVuZGVmaW5lZDtcbiAgfSxcbn07XG5cbi8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIHN5c3RlbVNoZWxsOiB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIG5hdGl2ZSBzaGVsbC5cbi8vXG4vLyBSdW5zIGFuIG9wYXF1ZSBjb21tYW5kIHN0cmluZyB0aHJvdWdoIHRoZSBPUyBkZWZhdWx0IHNoZWxsIChgL2Jpbi9zaGAgb25cbi8vIFBPU0lYLCBgY21kLmV4ZWAgb24gV2luZG93cykgdmlhIGBjaGlsZF9wcm9jZXNzYCB3aXRoIGBzaGVsbDogdHJ1ZWAuIFRoaXNcbi8vIGJhY2tzIHRoZSBgXCJAc3lzdGVtXCJgIHRhc2sgc2hlbGwsIHdoaWNoIGxldHMgYSB0YXNrIG9wdCBvdXQgb2YgdGhlIGJ1aWx0LWluXG4vLyBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBhbmQgdXNlIHRoZSBob3N0J3MgbmF0aXZlIHNoZWxsIGluc3RlYWQuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vXG5cbi8qKlxuICogTm9ybWFsaXplZCByZXN1bHQgb2YgcnVubmluZyBhIGNvbW1hbmQgdGhyb3VnaCB0aGUgc3lzdGVtIHNoZWxsIChhIHN1YnNldCBvZlxuICogbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3lzdGVtU2hlbGxSZXN1bHQge1xuICAvKiogRXhpdCBjb2RlLCBvciBgbnVsbGAgaWYgdGVybWluYXRlZCBieSBhIHNpZ25hbCBvciBuZXZlciBzcGF3bmVkLiAqL1xuICByZWFkb25seSBzdGF0dXM6IG51bWJlciB8IG51bGw7XG4gIC8qKiBDYXB0dXJlZCBzdGRvdXQsIG9yIGBudWxsYCB3aGVuIHN0ZG91dCB3YXMgaW5oZXJpdGVkLiAqL1xuICByZWFkb25seSBzdGRvdXQ6IEJ1ZmZlciB8IG51bGw7XG4gIC8qKiBDYXB0dXJlZCBzdGRlcnIsIG9yIGBudWxsYCB3aGVuIHN0ZGVyciB3YXMgaW5oZXJpdGVkLiAqL1xuICByZWFkb25seSBzdGRlcnI6IEJ1ZmZlciB8IG51bGw7XG4gIC8qKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biAobm90IGEgbm9uLXplcm8gZXhpdCkuICovXG4gIHJlYWRvbmx5IGVycm9yPzogRXJyb3I7XG59XG5cbi8qKlxuICogUnVucyBhIGNvbW1hbmQgbGluZSB0aHJvdWdoIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgZGVmYXVsdCBzaGVsbCAoYC9iaW4vc2hgXG4gKiBvbiBQT1NJWCwgYGNtZC5leGVgIG9uIFdpbmRvd3MpLiBOZXZlciB0aHJvd3MgZm9yIGEgbm9uLXplcm8gZXhpdCAodGhhdCBpc1xuICogcmVwb3J0ZWQgdmlhIGBzdGF0dXNgKTsgYSBzcGF3biBmYWlsdXJlIGlzIHJlcG9ydGVkIHZpYSBgZXJyb3JgLiBUaGUgY2FsbGVyXG4gKiBzdXBwbGllcyB0aGUgZnVsbCBgZW52YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5c3RlbVNoZWxsKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGVudj86IE5vZGVKUy5Qcm9jZXNzRW52OyBjYXB0dXJlPzogYm9vbGVhbiB9LFxuKTogU3lzdGVtU2hlbGxSZXN1bHQge1xuICBsb2dnaW5nLmRlYnVnKGAke2NvbW1hbmR9IChjd2Q6ICR7b3B0aW9ucy5jd2R9KWApO1xuICBjb25zdCByZXN1bHQgPSBjaGlsZF9wcm9jZXNzLnNwYXduU3luYyhjb21tYW5kLCB7XG4gICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBtYXhCdWZmZXI6IE1BWF9CVUZGRVIsXG4gICAgZW52OiBvcHRpb25zLmVudixcbiAgICAvLyBcInBpcGVcIiBmb3IgU1RERVJSICh3aGVuIGNhcHR1cmluZykgbWVhbnMgaXQgYXBwZWFycyBpbiBleGNlcHRpb25zLlxuICAgIHN0ZGlvOiBvcHRpb25zLmNhcHR1cmUgPyBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcInBpcGVcIl0gOiBcImluaGVyaXRcIixcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgIHN0ZG91dDogcmVzdWx0LnN0ZG91dCA/PyBudWxsLFxuICAgIHN0ZGVycjogcmVzdWx0LnN0ZGVyciA/PyBudWxsLFxuICAgIGVycm9yOiByZXN1bHQuZXJyb3IsXG4gIH07XG59XG4iXX0=
package/lib/version.d.ts CHANGED
@@ -187,7 +187,7 @@ export declare class ReleasableCommits {
187
187
  *
188
188
  * A new release will be initiated, if the number of returned commits is greater than zero.
189
189
  * Must return a newline separate list of commits that should considered releasable.
190
- * `$LATEST_TAG` will be replaced with the actual latest tag for the given prefix.*
190
+ * `$LATEST_TAG` is available as an environment variable (set to the actual latest tag for the given prefix).
191
191
  *
192
192
  * @example "git log --oneline $LATEST_TAG..HEAD -- ."
193
193
  */
package/lib/version.js CHANGED
@@ -24,7 +24,7 @@ exports.CHANGES_SINCE_LAST_RELEASE = 'git log --oneline -1 | grep -qv "chore(rel
24
24
  */
25
25
  const COMMIT_AND_TAG_VERSION_DEFAULT = "commit-and-tag-version@^12";
26
26
  class Version extends component_1.Component {
27
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Version", version: "0.100.7" };
27
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Version", version: "0.101.0" };
28
28
  bumpTask;
29
29
  unbumpTask;
30
30
  /**
@@ -141,7 +141,7 @@ exports.Version = Version;
141
141
  */
142
142
  class ReleasableCommits {
143
143
  cmd;
144
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.ReleasableCommits", version: "0.100.7" };
144
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.ReleasableCommits", version: "0.101.0" };
145
145
  /**
146
146
  * Release every commit
147
147
  *
@@ -169,7 +169,7 @@ class ReleasableCommits {
169
169
  // @see: https://github.com/conventional-commits/parser/blob/eeefb961ebf5b9dfea0fea8b06f8ad34a1e439b9/lib/parser.js
170
170
  // -E requires this to be POSIX Extended Regular Expression, which comes with certain limitations
171
171
  // see https://en.wikibooks.org/wiki/Regular_Expressions/POSIX-Extended_Regular_Expressions for details
172
- const cmd = `git log --no-merges --oneline $LATEST_TAG..HEAD -E --grep "^(${allowedTypes}){1}(\\([^()[:space:]]+\\))?(!)?:[[:blank:]]+.+"`;
172
+ const cmd = `git log --no-merges --oneline $LATEST_TAG..HEAD -E --grep '^(${allowedTypes}){1}(\\([^()[:space:]]+\\))?(!)?:[[:blank:]]+.+'`;
173
173
  return new ReleasableCommits(withPath(cmd, path));
174
174
  }
175
175
  /**
@@ -188,7 +188,7 @@ class ReleasableCommits {
188
188
  *
189
189
  * A new release will be initiated, if the number of returned commits is greater than zero.
190
190
  * Must return a newline separate list of commits that should considered releasable.
191
- * `$LATEST_TAG` will be replaced with the actual latest tag for the given prefix.*
191
+ * `$LATEST_TAG` is available as an environment variable (set to the actual latest tag for the given prefix).
192
192
  *
193
193
  * @example "git log --oneline $LATEST_TAG..HEAD -- ."
194
194
  */
@@ -209,4 +209,4 @@ function withPath(cmd, path) {
209
209
  }
210
210
  return cmd;
211
211
  }
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwrQkFBNkI7QUFFN0IsMkNBQXdDO0FBQ3hDLGlEQUE4RDtBQUM5RCw0REFBd0Q7QUFHeEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLDBCQUEwQixHQUNyQyxtREFBbUQsQ0FBQztBQUV0RDs7R0FFRztBQUNILE1BQU0sOEJBQThCLEdBQUcsNEJBQTRCLENBQUM7QUFzRXBFLE1BQWEsT0FBUSxTQUFRLHFCQUFTOztJQUNwQixRQUFRLENBQU87SUFDZixVQUFVLENBQU87SUFFakM7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLGVBQWUsQ0FBUztJQUV4Qzs7T0FFRztJQUNhLGtCQUFrQixDQUFTO0lBRTNDOzs7T0FHRztJQUNhLFdBQVcsQ0FBUztJQUVuQixrQkFBa0IsQ0FBVTtJQUU3QyxZQUFZLEtBQWlCLEVBQUUsT0FBdUI7UUFDcEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLDhCQUE4QixDQUFDO1FBQ3pFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFFckQsMENBQTBDO1FBQzFDLHdIQUF3SDtRQUN4SCxNQUFNLElBQUksR0FBRywwQkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFX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LElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQyxtSEFBbUg7UUFDbkgsaUdBQWlHO1FBQ2pHLHVHQUF1RztRQUN2RyxNQUFNLEdBQUcsR0FBRyxnRUFBZ0UsWUFBWSxrREFBa0QsQ0FBQztRQUUzSSxPQUFPLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQWE7UUFDbkMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBMkIsR0FBVztRQUFYLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFBRyxDQUFDOztBQTVENUMsOENBNkRDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxHQUFXLEVBQUUsSUFBYTtJQUMxQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUcsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb3NpeCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXMsIERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBOb2RlUGFja2FnZSB9IGZyb20gXCIuL2phdmFzY3JpcHQvbm9kZS1wYWNrYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tIFwiLi90YXNrXCI7XG5cbi8qKlxuICogVGhpcyBjb21tYW5kIGRldGVybWluZXMgaWYgdGhlcmUgd2VyZSBhbnkgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCByZWxlYXNlIGluIGEgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJsZSB3YXkuXG4gKiBJdCBpcyB1c2VkIGFzIGEgY29uZGl0aW9uIGZvciBib3RoIHRoZSBgYnVtcGAgYW5kIHRoZSBgcmVsZWFzZWAgdGFza3MuXG4gKlxuICogRXhwbGFuYXRpb246XG4gKiAgLSBsb2cgY29tbWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnaXQgbG9nXG4gKiAgLSBsaW1pdCBsb2cgb3V0cHV0IHRvIGEgc2luZ2xlIGxpbmUgcGVyIGNvbW1pdCAgICAgICAgICAgICAgfCAtLW9uZWxpbmVcbiAqICAtIGxvb2tzIG9ubHkgYXQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdCAgICAgICAgICAgICAgICAgICAgICB8IC0xXG4gKiAgLSBzaWxlbnQgZ3JlcCBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBncmVwIC1xXG4gKiAgLSBleGl0cyB3aXRoIGNvZGUgMCBpZiBhIG1hdGNoIGlzIGZvdW5kICAgICAgICAgICAgICAgICAgICAgfCBncmVwIC1xIFwiY2hvcmUocmVsZWFzZSk6XCJcbiAqICAtIGV4aXRzIHdpdGggY29kZSAxIGlmIGEgbWF0Y2ggaXMgZm91bmQgKHJldmVyc2UtbWF0Y2gpICAgICB8IGdyZXAgLXF2IFwiY2hvcmUocmVsZWFzZSk6XCJcbiAqL1xuZXhwb3J0IGNvbnN0IENIQU5HRVNfU0lOQ0VfTEFTVF9SRUxFQVNFID1cbiAgJ2dpdCBsb2cgLS1vbmVsaW5lIC0xIHwgZ3JlcCAtcXYgXCJjaG9yZShyZWxlYXNlKTpcIic7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcGFja2FnZSB0byBiZSB1c2VkIGZvciBjb21taXQtYW5kLXRhZy12ZXJzaW9uXG4gKi9cbmNvbnN0IENPTU1JVF9BTkRfVEFHX1ZFUlNJT05fREVGQVVMVCA9IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgVmVyc2lvbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBuYW1lIG9mIGEgLmpzb24gZmlsZSB0byBzZXQgdGhlIGB2ZXJzaW9uYCBmaWVsZCBpbiBhZnRlciBhIGJ1bXAuXG4gICAqXG4gICAqIEBleGFtcGxlIFwicGFja2FnZS5qc29uXCJcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25JbnB1dEZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGBjaGFuZ2Vsb2cubWRgIGFuZCBgdmVyc2lvbi50eHRgIGZpbGVzXG4gICAqIGFyZSBlbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RzRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb25maWd1cmF0aW9uIGZvciB2ZXJzaW9ucmMgZmlsZSB1c2VkIGJ5IHN0YW5kYXJkLXJlbGVhc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25yY09wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgdGFnIHByZWZpeCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhZ1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogRmluZCBjb21taXRzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVsZWFzYWJsZVxuICAgKiBVc2VkIHRvIGRlY2lkZSBpZiBhIHJlbGVhc2UgaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbGVhc2FibGVDb21taXRzLmV2ZXJ5Q29tbWl0KClcbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2FibGVDb21taXRzPzogUmVsZWFzYWJsZUNvbW1pdHM7XG5cbiAgLyoqXG4gICAqIFRoZSBgY29tbWl0LWFuZC10YWctdmVyc2lvbmAgY29tcGF0aWJsZSBwYWNrYWdlIHVzZWQgdG8gYnVtcCB0aGUgcGFja2FnZSB2ZXJzaW9uLCBhcyBhIGRlcGVuZGVuY3kgc3RyaW5nLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSBhbnkgY29tcGF0aWJsZSBwYWNrYWdlIHZlcnNpb24sIGluY2x1ZGluZyB0aGUgZGVwcmVjYXRlZCBgc3RhbmRhcmQtdmVyc2lvbkA5YC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjb21taXQtYW5kLXRhZy12ZXJzaW9uQDEyXCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1bXBQYWNrYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHNoZWxsIGNvbW1hbmQgdG8gY29udHJvbCB0aGUgbmV4dCB2ZXJzaW9uIHRvIHJlbGVhc2UuXG4gICAqXG4gICAqIElmIHByZXNlbnQsIHRoaXMgc2hlbGwgY29tbWFuZCB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIGJ1bXAgaXMgZXhlY3V0ZWQsIGFuZFxuICAgKiBpdCBkZXRlcm1pbmVzIHdoYXQgdmVyc2lvbiB0byByZWxlYXNlLiBJdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBmb2xsb3dpbmdcbiAgICogZW52aXJvbm1lbnQ6XG4gICAqXG4gICAqIC0gV29ya2luZyBkaXJlY3Rvcnk6IHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICogLSBgJFZFUlNJT05gOiB0aGUgY3VycmVudCB2ZXJzaW9uLiBMb29rcyBsaWtlIGAxLjIuM2AuXG4gICAqIC0gYCRMQVRFU1RfVEFHYDogdGhlIG1vc3QgcmVjZW50IHRhZy4gTG9va3MgbGlrZSBgcHJlZml4LXYxLjIuM2AsIG9yIG1heSBiZSB1bnNldC5cbiAgICogLSBgJFNVR0dFU1RFRF9CVU1QYDogdGhlIHN1Z2dlc3RlZCBidW1wIGFjdGlvbiBiYXNlZCBvbiBjb21taXRzLiBPbmUgb2YgYG1ham9yfG1pbm9yfHBhdGNofG5vbmVgLlxuICAgKlxuICAgKiBUaGUgY29tbWFuZCBzaG91bGQgcHJpbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gYHN0ZG91dGA6XG4gICAqXG4gICAqIC0gTm90aGluZzogdGhlIG5leHQgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBkZXRlcm1pbmVkIGJhc2VkIG9uIGNvbW1pdCBoaXN0b3J5LlxuICAgKiAtIGB4LnkuemA6IHRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgYHgueS56YC5cbiAgICogLSBgbWFqb3J8bWlub3J8cGF0Y2hgOiB0aGUgbmV4dCB2ZXJzaW9uIG51bWJlciB3aWxsIGJlIHRoZSBjdXJyZW50IHZlcnNpb24gbnVtYmVyXG4gICAqICAgd2l0aCB0aGUgaW5kaWNhdGVkIGNvbXBvbmVudCBidW1wZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5leHQgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFZlcnNpb25Db21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVmVyc2lvbiBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSBidW1wVGFzazogVGFzaztcbiAgcHVibGljIHJlYWRvbmx5IHVuYnVtcFRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Vsb2cgZmlsZSAodW5kZXIgYGFydGlmYWN0c0RpcmVjdG9yeWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHZlcnNpb24gKHVuZGVyIGBhcnRpZmFjdHNEaXJlY3RvcnlgKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uRmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcmVsZWFzZSB0YWcgKHVuZGVyIGBhcnRpZmFjdHNEaXJlY3RvcnlgKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWxlYXNlVGFnRmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhY2thZ2UgdXNlZCB0byBidW1wIHBhY2thZ2UgdmVyc2lvbnMsIGFzIGEgZGVwZW5kZW5jeSBzdHJpbmcuXG4gICAqIFRoaXMgaXMgYSBgY29tbWl0LWFuZC10YWctdmVyc2lvbmAgY29tcGF0aWJsZSBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1bXBQYWNrYWdlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuZXh0VmVyc2lvbkNvbW1hbmQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM6IFZlcnNpb25PcHRpb25zKSB7XG4gICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgdGhpcy5jaGFuZ2Vsb2dGaWxlTmFtZSA9IFwiY2hhbmdlbG9nLm1kXCI7XG4gICAgdGhpcy52ZXJzaW9uRmlsZU5hbWUgPSBcInZlcnNpb24udHh0XCI7XG4gICAgdGhpcy5yZWxlYXNlVGFnRmlsZU5hbWUgPSBcInJlbGVhc2V0YWcudHh0XCI7XG4gICAgdGhpcy5idW1wUGFja2FnZSA9IG9wdGlvbnMuYnVtcFBhY2thZ2UgPz8gQ09NTUlUX0FORF9UQUdfVkVSU0lPTl9ERUZBVUxUO1xuICAgIHRoaXMubmV4dFZlcnNpb25Db21tYW5kID0gb3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQ7XG5cbiAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBsYW5ndWFnZSBpbmRlcGVuZGVudC5cbiAgICAvLyBIb3dldmVyLCB3aGVuIGluIHRoZSBOb2RlLmpzIGVjb3N5c3RlbSwgd2UgY2FuIGltcHJvdmUgdGhlIGV4cGVyaWVuY2UgYnkgYWRkaW5nIGEgZGV2IGRlcGVuZGVuY3kgb24gdGhlIGJ1bXAgcGFja2FnZS5cbiAgICBjb25zdCBub2RlID0gTm9kZVBhY2thZ2Uub2YodGhpcy5wcm9qZWN0KTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgY29uc3QgeyBuYW1lOiBidW1wTmFtZSwgdmVyc2lvbjogYnVtcFZlcnNpb24gfSA9XG4gICAgICAgIERlcGVuZGVuY2llcy5wYXJzZURlcGVuZGVuY3kodGhpcy5idW1wUGFja2FnZSk7XG4gICAgICBub2RlLnByb2plY3QuZGVwcy5yZXF1ZXN0RGVwZW5kZW5jeSh7XG4gICAgICAgIG5hbWU6IGJ1bXBOYW1lLFxuICAgICAgICB2ZXJzaW9uOiBidW1wVmVyc2lvbixcbiAgICAgICAgdHlwZTogRGVwZW5kZW5jeVR5cGUuQlVJTEQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJzaW9uSW5wdXRGaWxlID0gb3B0aW9ucy52ZXJzaW9uSW5wdXRGaWxlO1xuXG4gICAgY29uc3QgY2hhbmdlbG9nRmlsZSA9IHBvc2l4LmpvaW4oXG4gICAgICBvcHRpb25zLmFydGlmYWN0c0RpcmVjdG9yeSxcbiAgICAgIHRoaXMuY2hhbmdlbG9nRmlsZU5hbWUsXG4gICAgKTtcbiAgICBjb25zdCBidW1wRmlsZSA9IHBvc2l4LmpvaW4oXG4gICAgICBvcHRpb25zLmFydGlmYWN0c0RpcmVjdG9yeSxcbiAgICAgIHRoaXMudmVyc2lvbkZpbGVOYW1lLFxuICAgICk7XG4gICAgY29uc3QgcmVsZWFzZVRhZ0ZpbGUgPSBwb3NpeC5qb2luKFxuICAgICAgb3B0aW9ucy5hcnRpZmFjdHNEaXJlY3RvcnksXG4gICAgICB0aGlzLnJlbGVhc2VUYWdGaWxlTmFtZSxcbiAgICApO1xuXG4gICAgY29uc3QgY29tbW9uRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgT1VURklMRTogdmVyc2lvbklucHV0RmlsZSxcbiAgICAgIENIQU5HRUxPRzogY2hhbmdlbG9nRmlsZSxcbiAgICAgIEJVTVBGSUxFOiBidW1wRmlsZSxcbiAgICAgIFJFTEVBU0VUQUc6IHJlbGVhc2VUYWdGaWxlLFxuICAgICAgUkVMRUFTRV9UQUdfUFJFRklYOiBvcHRpb25zLnRhZ1ByZWZpeCA/PyBcIlwiLFxuICAgICAgLy8gZG9lc24ndCB3b3JrIGlmIGN1c3RvbSBjb25maWd1cmF0aW9uIGlzIGxvbmdcbiAgICAgIFZFUlNJT05SQ09QVElPTlM6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMudmVyc2lvbnJjT3B0aW9ucyksXG4gICAgICBCVU1QX1BBQ0tBR0U6IHRoaXMuYnVtcFBhY2thZ2UsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQpIHtcbiAgICAgIGNvbW1vbkVudi5ORVhUX1ZFUlNJT05fQ09NTUFORCA9IG9wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5yZWxlYXNhYmxlQ29tbWl0cykge1xuICAgICAgY29tbW9uRW52LlJFTEVBU0FCTEVfQ09NTUlUUyA9IG9wdGlvbnMucmVsZWFzYWJsZUNvbW1pdHMuY21kO1xuICAgIH1cblxuICAgIHRoaXMuYnVtcFRhc2sgPSB0aGlzLnByb2plY3QuYWRkVGFzayhcImJ1bXBcIiwge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnVtcHMgdmVyc2lvbiBiYXNlZCBvbiBsYXRlc3QgZ2l0IHRhZyBhbmQgZ2VuZXJhdGVzIGEgY2hhbmdlbG9nIGVudHJ5XCIsXG4gICAgICBjb25kaXRpb246IENIQU5HRVNfU0lOQ0VfTEFTVF9SRUxFQVNFLFxuICAgICAgZW52OiB7IC4uLmNvbW1vbkVudiB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idW1wVGFzay5idWlsdGluKFwicmVsZWFzZS9idW1wLXZlcnNpb25cIik7XG5cbiAgICB0aGlzLnVuYnVtcFRhc2sgPSB0aGlzLnByb2plY3QuYWRkVGFzayhcInVuYnVtcFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0b3JlcyB2ZXJzaW9uIHRvIDAuMC4wXCIsXG4gICAgICBlbnY6IHsgLi4uY29tbW9uRW52IH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnVuYnVtcFRhc2suYnVpbHRpbihcInJlbGVhc2UvcmVzZXQtdmVyc2lvblwiKTtcblxuICAgIHRoaXMucHJvamVjdC5hZGRHaXRJZ25vcmUoYC8ke2NoYW5nZWxvZ0ZpbGV9YCk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZEdpdElnbm9yZShgLyR7YnVtcEZpbGV9YCk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke2NoYW5nZWxvZ0ZpbGV9YCk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke2J1bXBGaWxlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIG1vZGlmeSB0aGUgYnVtcCBjb21tYW5kIGZvciByZWxlYXNlIGJyYW5jaGVzLlxuICAgKlxuICAgKiBUaGVzZSBvcHRpb25zIGFyZSB1c2VkIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIHZlcnNpb24gYnVtcGluZyBzY3JpcHRcbiAgICogZm9yIGFkZGl0aW9uYWwgYnJhbmNoZXMsIGJ5IHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKlxuICAgKiBObyBzZXR0aW5ncyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgYFZlcnNpb25gIG9iamVjdCAoYnV0IGFueSBwYXJhbWV0ZXJzIHRoYXRcbiAgICogY29udHJvbCB2ZXJzaW9ucyBkbyBjb25mbGljdCB3aXRoIHRoZSB1c2Ugb2YgYSBgbmV4dFZlcnNpb25Db21tYW5kYCkuXG4gICAqL1xuICBwdWJsaWMgZW52Rm9yQnJhbmNoKFxuICAgIGJyYW5jaE9wdGlvbnM6IFZlcnNpb25CcmFuY2hPcHRpb25zLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5uZXh0VmVyc2lvbkNvbW1hbmQgJiYgYnJhbmNoT3B0aW9ucy5taW5NYWpvclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJtaW5NYWpvclZlcnNpb24gYW5kIG5leHRWZXJzaW9uQ29tbWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGJyYW5jaE9wdGlvbnMubWFqb3JWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudi5NQUpPUiA9IGJyYW5jaE9wdGlvbnMubWFqb3JWZXJzaW9uLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaE9wdGlvbnMubWluTWFqb3JWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChicmFuY2hPcHRpb25zLm1ham9yVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgbWluTWFqb3JWZXJzaW9uIGFuZCBtYWpvclZlcnNpb24gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZW52Lk1JTl9NQUpPUiA9IGJyYW5jaE9wdGlvbnMubWluTWFqb3JWZXJzaW9uLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaE9wdGlvbnMucHJlcmVsZWFzZSkge1xuICAgICAgZW52LlBSRVJFTEVBU0UgPSBicmFuY2hPcHRpb25zLnByZXJlbGVhc2U7XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaE9wdGlvbnMudGFnUHJlZml4KSB7XG4gICAgICBlbnYuUkVMRUFTRV9UQUdfUFJFRklYID0gYnJhbmNoT3B0aW9ucy50YWdQcmVmaXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gcGFzcyB0byBgbW9kaWZ5QnJhbmNoRW52aXJvbm1lbnRgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbkJyYW5jaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG1ham9yIHZlcnNpb25zIHJlbGVhc2VkIGZyb20gdGhpcyBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBtYWpvclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG1ham9yIHZlcnNpb24gdG8gcmVsZWFzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1pbk1ham9yVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1pbm9yIHZlcnNpb25zIHJlbGVhc2VkIGZyb20gdGhpcyBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBtaW5vclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ1bXAgdGhlIHZlcnNpb24gYXMgYSBwcmUtcmVsZWFzZSB0YWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9ybWFsIHJlbGVhc2VzXG4gICAqL1xuICByZWFkb25seSBwcmVyZWxlYXNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGFkZCB0aGUgZ2l2ZW4gcHJlZml4IHRvIHJlbGVhc2UgdGFncy5cbiAgICogVXNlZnVsIGlmIHlvdSBhcmUgcmVsZWFzaW5nIG9uIG11bHRpcGxlIGJyYW5jaGVzIHdpdGggb3ZlcmxhcHBpbmdcbiAgICogdmVyc2lvbiBudW1iZXJzLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHByZWZpeCBpcyB1c2VkIHRvIGRldGVjdCB0aGUgbGF0ZXN0IHRhZ2dlZCB2ZXJzaW9uXG4gICAqIHdoZW4gYnVtcGluZywgc28gaWYgeW91IGNoYW5nZSB0aGlzIG9uIGEgcHJvamVjdCB3aXRoIGFuIGV4aXN0aW5nIHZlcnNpb25cbiAgICogaGlzdG9yeSwgeW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IHRhZyB5b3VyIGxhdGVzdCByZWxlYXNlXG4gICAqIHdpdGggdGhlIG5ldyBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlZml4XG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZCBjb21taXRzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVsZWFzYWJsZSB0byBkZWNpZGUgaWYgYSByZWxlYXNlIGlzIHJlcXVpcmVkLlxuICpcbiAqIFRoaXMgc2V0dGluZyBvbmx5IGNvbnRyb2xzIHdoZXRoZXIgYSByZWxlYXNlIGlzIHRyaWdnZXJlZCwgeWVzIG9yIG5vLiBUaGVcbiAqIHBhdGhzIHVzZWQgaGVyZSBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvZGUgdGhhdCBjb250cm9scyB3aGF0IGNvbW1pdHMgYXJlIGluc3BlY3RlZFxuICogdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGVhc2FibGVDb21taXRzIHtcbiAgLyoqXG4gICAqIFJlbGVhc2UgZXZlcnkgY29tbWl0XG4gICAqXG4gICAqIFRoaXMgd2lsbCBvbmx5IG5vdCByZWxlYXNlIGlmIHRoZSBtb3N0IHJlY2VudCBjb21taXQgaXMgdGFnZ2VkIHdpdGggdGhlIGxhdGVzdCBtYXRjaGluZyB0YWcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIENvbnNpZGVyIG9ubHkgY29tbWl0cyB0aGF0IGFyZSBlbm91Z2ggdG8gZXhwbGFpbiBob3cgdGhlIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRocyBjYW1lIHRvIGJlLlxuICAgKiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXIgb2YgdGhlIGBidW1wYCB0YXNrLCBpLmUuIHRvIG9ubHkgY29uc2lkZXIgY29tbWl0cyBvZiBhIHN1YnByb2plY3QgdXNlIGBcIi5cImAuXG4gICAqL1xuICBzdGF0aWMgZXZlcnlDb21taXQocGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGNtZCA9IGBnaXQgbG9nIC0tb25lbGluZSAkTEFURVNUX1RBRy4uSEVBRGA7XG4gICAgcmV0dXJuIG5ldyBSZWxlYXNhYmxlQ29tbWl0cyh3aXRoUGF0aChjbWQsIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW1pdCBjb21taXRzIGJ5IHRoZWlyIGNvbnZlbnRpb25hbCBjb21taXQgdHlwZVxuICAgKlxuICAgKiBUaGlzIHdpbGwgb25seSByZWxlYXNlIGNvbW1pdCB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgcHJvdmlkZWQgdHlwZXMuXG4gICAqIENvbW1pdHMgYXJlIHJlcXVpcmVkIHRvIGZvbGxvdyB0aGUgY29udmVudGlvbmFsIGNvbW1pdCBzcGVjIGFuZCB3aWxsIGJlIGlnbm9yZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZXMgTGlzdCBvZiBjb252ZW50aW9uYWwgY29tbWl0IHR5cGVzIHRoYXQgc2hvdWxkIGJlIHJlbGVhc2VkXG4gICAqIEBwYXJhbSBwYXRoIENvbnNpZGVyIG9ubHkgY29tbWl0cyB0aGF0IGFyZSBlbm91Z2ggdG8gZXhwbGFpbiBob3cgdGhlIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRocyBjYW1lIHRvIGJlLlxuICAgKiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXIgb2YgdGhlIGBidW1wYCB0YXNrLCBpLmUuIHRvIG9ubHkgY29uc2lkZXIgY29tbWl0cyBvZiBhIHN1YnByb2plY3QgdXNlIGBcIi5cImAuXG4gICAqL1xuICBzdGF0aWMgb2ZUeXBlKHR5cGVzOiBzdHJpbmdbXSwgcGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHR5cGVzLmpvaW4oXCJ8XCIpO1xuXG4gICAgLy8gQHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2NvbnZlbnRpb25hbC1jb21taXRzL3BhcnNlci9ibG9iL2VlZWZiOTYxZWJmNWI5ZGZlYTBmZWE4YjA2ZjhhZDM0YTFlNDM5YjkvbGliL3BhcnNlci5qc1xuICAgIC8vIC1FIHJlcXVpcmVzIHRoaXMgdG8gYmUgUE9TSVggRXh0ZW5kZWQgUmVndWxhciBFeHByZXNzaW9uLCB3aGljaCBjb21lcyB3aXRoIGNlcnRhaW4gbGltaXRhdGlvbnNcbiAgICAvLyBzZWUgaHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvUmVndWxhcl9FeHByZXNzaW9ucy9QT1NJWC1FeHRlbmRlZF9SZWd1bGFyX0V4cHJlc3Npb25zIGZvciBkZXRhaWxzXG4gICAgY29uc3QgY21kID0gYGdpdCBsb2cgLS1uby1tZXJnZXMgLS1vbmVsaW5lICRMQVRFU1RfVEFHLi5IRUFEIC1FIC0tZ3JlcCBcIl4oJHthbGxvd2VkVHlwZXN9KXsxfShcXFxcKFteKClbOnNwYWNlOl1dK1xcXFwpKT8oISk/OltbOmJsYW5rOl1dKy4rXCJgO1xuXG4gICAgcmV0dXJuIG5ldyBSZWxlYXNhYmxlQ29tbWl0cyh3aXRoUGF0aChjbWQsIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIG9ubHkgZmVhdHVyZXMgYW5kIGZpeGVzXG4gICAqXG4gICAqIFNob3J0aGFuZCBmb3IgYFJlbGVhc2FibGVDb21taXRzLm9ubHlPZlR5cGUoWydmZWF0JywgJ2ZpeCddKWAuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIENvbnNpZGVyIG9ubHkgY29tbWl0cyB0aGF0IGFyZSBlbm91Z2ggdG8gZXhwbGFpbiBob3cgdGhlIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRocyBjYW1lIHRvIGJlLlxuICAgKiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXIgb2YgdGhlIGBidW1wYCB0YXNrLCBpLmUuIHRvIG9ubHkgY29uc2lkZXIgY29tbWl0cyBvZiBhIHN1YnByb2plY3QgdXNlIGBcIi5cImAuXG4gICAqL1xuICBzdGF0aWMgZmVhdHVyZXNBbmRGaXhlcyhwYXRoPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFJlbGVhc2FibGVDb21taXRzLm9mVHlwZShbXCJmZWF0XCIsIFwiZml4XCJdLCBwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgYW4gYXJiaXRyYXJ5IHNoZWxsIGNvbW1hbmQgdG8gZmluZCByZWxlYXNhYmxlIGNvbW1pdHMgc2luY2UgdGhlIGxhdGVzdCB0YWcuXG4gICAqXG4gICAqIEEgbmV3IHJlbGVhc2Ugd2lsbCBiZSBpbml0aWF0ZWQsIGlmIHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgY29tbWl0cyBpcyBncmVhdGVyIHRoYW4gemVyby5cbiAgICogTXVzdCByZXR1cm4gYSBuZXdsaW5lIHNlcGFyYXRlIGxpc3Qgb2YgY29tbWl0cyB0aGF0IHNob3VsZCBjb25zaWRlcmVkIHJlbGVhc2FibGUuXG4gICAqIGAkTEFURVNUX1RBR2Agd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbGF0ZXN0IHRhZyBmb3IgdGhlIGdpdmVuIHByZWZpeC4qXG4gICAqXG4gICAqIEBleGFtcGxlIFwiZ2l0IGxvZyAtLW9uZWxpbmUgJExBVEVTVF9UQUcuLkhFQUQgLS0gLlwiXG4gICAqL1xuICBzdGF0aWMgZXhlYyhjbWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUmVsZWFzYWJsZUNvbW1pdHMoY21kKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIGNtZDogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIEFwcGVuZCBhIHBhdGggYXJndW1lbnQgdG8gYSBnaXQgY29tbWFuZCBpZiBvbmUgaXMgcHJvdmlkZWRcbiAqL1xuZnVuY3Rpb24gd2l0aFBhdGgoY21kOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGAke2NtZH0gLS0gJHtwYXRofWA7XG4gIH1cblxuICByZXR1cm4gY21kO1xufVxuIl19
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwrQkFBNkI7QUFFN0IsMkNBQXdDO0FBQ3hDLGlEQUE4RDtBQUM5RCw0REFBd0Q7QUFHeEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDVSxRQUFBLDBCQUEwQixHQUNyQyxtREFBbUQsQ0FBQztBQUV0RDs7R0FFRztBQUNILE1BQU0sOEJBQThCLEdBQUcsNEJBQTRCLENBQUM7QUFzRXBFLE1BQWEsT0FBUSxTQUFRLHFCQUFTOztJQUNwQixRQUFRLENBQU87SUFDZixVQUFVLENBQU87SUFFakM7O09BRUc7SUFDYSxpQkFBaUIsQ0FBUztJQUUxQzs7T0FFRztJQUNhLGVBQWUsQ0FBUztJQUV4Qzs7T0FFRztJQUNhLGtCQUFrQixDQUFTO0lBRTNDOzs7T0FHRztJQUNhLFdBQVcsQ0FBUztJQUVuQixrQkFBa0IsQ0FBVTtJQUU3QyxZQUFZLEtBQWlCLEVBQUUsT0FBdUI7UUFDcEQsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLDhCQUE4QixDQUFDO1FBQ3pFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFFckQsMENBQTBDO1FBQzFDLHdIQUF3SDtRQUN4SCxNQUFNLElBQUksR0FBRywwQkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFX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LElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyQyxtSEFBbUg7UUFDbkgsaUdBQWlHO1FBQ2pHLHVHQUF1RztRQUN2RyxNQUFNLEdBQUcsR0FBRyxnRUFBZ0UsWUFBWSxrREFBa0QsQ0FBQztRQUUzSSxPQUFPLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQWE7UUFDbkMsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsWUFBMkIsR0FBVztRQUFYLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFBRyxDQUFDOztBQTVENUMsOENBNkRDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxHQUFXLEVBQUUsSUFBYTtJQUMxQyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QixPQUFPLEdBQUcsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwb3NpeCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEZXBlbmRlbmNpZXMsIERlcGVuZGVuY3lUeXBlIH0gZnJvbSBcIi4vZGVwZW5kZW5jaWVzXCI7XG5pbXBvcnQgeyBOb2RlUGFja2FnZSB9IGZyb20gXCIuL2phdmFzY3JpcHQvbm9kZS1wYWNrYWdlXCI7XG5pbXBvcnQgdHlwZSB7IFRhc2sgfSBmcm9tIFwiLi90YXNrXCI7XG5cbi8qKlxuICogVGhpcyBjb21tYW5kIGRldGVybWluZXMgaWYgdGhlcmUgd2VyZSBhbnkgY2hhbmdlcyBzaW5jZSB0aGUgbGFzdCByZWxlYXNlIGluIGEgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJsZSB3YXkuXG4gKiBJdCBpcyB1c2VkIGFzIGEgY29uZGl0aW9uIGZvciBib3RoIHRoZSBgYnVtcGAgYW5kIHRoZSBgcmVsZWFzZWAgdGFza3MuXG4gKlxuICogRXhwbGFuYXRpb246XG4gKiAgLSBsb2cgY29tbWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnaXQgbG9nXG4gKiAgLSBsaW1pdCBsb2cgb3V0cHV0IHRvIGEgc2luZ2xlIGxpbmUgcGVyIGNvbW1pdCAgICAgICAgICAgICAgfCAtLW9uZWxpbmVcbiAqICAtIGxvb2tzIG9ubHkgYXQgdGhlIG1vc3QgcmVjZW50IGNvbW1pdCAgICAgICAgICAgICAgICAgICAgICB8IC0xXG4gKiAgLSBzaWxlbnQgZ3JlcCBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBncmVwIC1xXG4gKiAgLSBleGl0cyB3aXRoIGNvZGUgMCBpZiBhIG1hdGNoIGlzIGZvdW5kICAgICAgICAgICAgICAgICAgICAgfCBncmVwIC1xIFwiY2hvcmUocmVsZWFzZSk6XCJcbiAqICAtIGV4aXRzIHdpdGggY29kZSAxIGlmIGEgbWF0Y2ggaXMgZm91bmQgKHJldmVyc2UtbWF0Y2gpICAgICB8IGdyZXAgLXF2IFwiY2hvcmUocmVsZWFzZSk6XCJcbiAqL1xuZXhwb3J0IGNvbnN0IENIQU5HRVNfU0lOQ0VfTEFTVF9SRUxFQVNFID1cbiAgJ2dpdCBsb2cgLS1vbmVsaW5lIC0xIHwgZ3JlcCAtcXYgXCJjaG9yZShyZWxlYXNlKTpcIic7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcGFja2FnZSB0byBiZSB1c2VkIGZvciBjb21taXQtYW5kLXRhZy12ZXJzaW9uXG4gKi9cbmNvbnN0IENPTU1JVF9BTkRfVEFHX1ZFUlNJT05fREVGQVVMVCA9IFwiY29tbWl0LWFuZC10YWctdmVyc2lvbkBeMTJcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgVmVyc2lvbmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBuYW1lIG9mIGEgLmpzb24gZmlsZSB0byBzZXQgdGhlIGB2ZXJzaW9uYCBmaWVsZCBpbiBhZnRlciBhIGJ1bXAuXG4gICAqXG4gICAqIEBleGFtcGxlIFwicGFja2FnZS5qc29uXCJcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25JbnB1dEZpbGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGBjaGFuZ2Vsb2cubWRgIGFuZCBgdmVyc2lvbi50eHRgIGZpbGVzXG4gICAqIGFyZSBlbWl0dGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJ0aWZhY3RzRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb25maWd1cmF0aW9uIGZvciB2ZXJzaW9ucmMgZmlsZSB1c2VkIGJ5IHN0YW5kYXJkLXJlbGVhc2VcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25yY09wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gIC8qKlxuICAgKiBUaGUgdGFnIHByZWZpeCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhZ1ByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogRmluZCBjb21taXRzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVsZWFzYWJsZVxuICAgKiBVc2VkIHRvIGRlY2lkZSBpZiBhIHJlbGVhc2UgaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlbGVhc2FibGVDb21taXRzLmV2ZXJ5Q29tbWl0KClcbiAgICovXG4gIHJlYWRvbmx5IHJlbGVhc2FibGVDb21taXRzPzogUmVsZWFzYWJsZUNvbW1pdHM7XG5cbiAgLyoqXG4gICAqIFRoZSBgY29tbWl0LWFuZC10YWctdmVyc2lvbmAgY29tcGF0aWJsZSBwYWNrYWdlIHVzZWQgdG8gYnVtcCB0aGUgcGFja2FnZSB2ZXJzaW9uLCBhcyBhIGRlcGVuZGVuY3kgc3RyaW5nLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSBhbnkgY29tcGF0aWJsZSBwYWNrYWdlIHZlcnNpb24sIGluY2x1ZGluZyB0aGUgZGVwcmVjYXRlZCBgc3RhbmRhcmQtdmVyc2lvbkA5YC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJjb21taXQtYW5kLXRhZy12ZXJzaW9uQDEyXCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1bXBQYWNrYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHNoZWxsIGNvbW1hbmQgdG8gY29udHJvbCB0aGUgbmV4dCB2ZXJzaW9uIHRvIHJlbGVhc2UuXG4gICAqXG4gICAqIElmIHByZXNlbnQsIHRoaXMgc2hlbGwgY29tbWFuZCB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIGJ1bXAgaXMgZXhlY3V0ZWQsIGFuZFxuICAgKiBpdCBkZXRlcm1pbmVzIHdoYXQgdmVyc2lvbiB0byByZWxlYXNlLiBJdCB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBmb2xsb3dpbmdcbiAgICogZW52aXJvbm1lbnQ6XG4gICAqXG4gICAqIC0gV29ya2luZyBkaXJlY3Rvcnk6IHRoZSBwcm9qZWN0IGRpcmVjdG9yeS5cbiAgICogLSBgJFZFUlNJT05gOiB0aGUgY3VycmVudCB2ZXJzaW9uLiBMb29rcyBsaWtlIGAxLjIuM2AuXG4gICAqIC0gYCRMQVRFU1RfVEFHYDogdGhlIG1vc3QgcmVjZW50IHRhZy4gTG9va3MgbGlrZSBgcHJlZml4LXYxLjIuM2AsIG9yIG1heSBiZSB1bnNldC5cbiAgICogLSBgJFNVR0dFU1RFRF9CVU1QYDogdGhlIHN1Z2dlc3RlZCBidW1wIGFjdGlvbiBiYXNlZCBvbiBjb21taXRzLiBPbmUgb2YgYG1ham9yfG1pbm9yfHBhdGNofG5vbmVgLlxuICAgKlxuICAgKiBUaGUgY29tbWFuZCBzaG91bGQgcHJpbnQgb25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gYHN0ZG91dGA6XG4gICAqXG4gICAqIC0gTm90aGluZzogdGhlIG5leHQgdmVyc2lvbiBudW1iZXIgd2lsbCBiZSBkZXRlcm1pbmVkIGJhc2VkIG9uIGNvbW1pdCBoaXN0b3J5LlxuICAgKiAtIGB4LnkuemA6IHRoZSBuZXh0IHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgYHgueS56YC5cbiAgICogLSBgbWFqb3J8bWlub3J8cGF0Y2hgOiB0aGUgbmV4dCB2ZXJzaW9uIG51bWJlciB3aWxsIGJlIHRoZSBjdXJyZW50IHZlcnNpb24gbnVtYmVyXG4gICAqICAgd2l0aCB0aGUgaW5kaWNhdGVkIGNvbXBvbmVudCBidW1wZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIG5leHQgdmVyc2lvbiB3aWxsIGJlIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBwcm9qZWN0IHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dFZlcnNpb25Db21tYW5kPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVmVyc2lvbiBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSBidW1wVGFzazogVGFzaztcbiAgcHVibGljIHJlYWRvbmx5IHVuYnVtcFRhc2s6IFRhc2s7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBjaGFuZ2Vsb2cgZmlsZSAodW5kZXIgYGFydGlmYWN0c0RpcmVjdG9yeWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNoYW5nZWxvZ0ZpbGVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIHZlcnNpb24gKHVuZGVyIGBhcnRpZmFjdHNEaXJlY3RvcnlgKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uRmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcmVsZWFzZSB0YWcgKHVuZGVyIGBhcnRpZmFjdHNEaXJlY3RvcnlgKS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWxlYXNlVGFnRmlsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhY2thZ2UgdXNlZCB0byBidW1wIHBhY2thZ2UgdmVyc2lvbnMsIGFzIGEgZGVwZW5kZW5jeSBzdHJpbmcuXG4gICAqIFRoaXMgaXMgYSBgY29tbWl0LWFuZC10YWctdmVyc2lvbmAgY29tcGF0aWJsZSBwYWNrYWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1bXBQYWNrYWdlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBuZXh0VmVyc2lvbkNvbW1hbmQ/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM6IFZlcnNpb25PcHRpb25zKSB7XG4gICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgdGhpcy5jaGFuZ2Vsb2dGaWxlTmFtZSA9IFwiY2hhbmdlbG9nLm1kXCI7XG4gICAgdGhpcy52ZXJzaW9uRmlsZU5hbWUgPSBcInZlcnNpb24udHh0XCI7XG4gICAgdGhpcy5yZWxlYXNlVGFnRmlsZU5hbWUgPSBcInJlbGVhc2V0YWcudHh0XCI7XG4gICAgdGhpcy5idW1wUGFja2FnZSA9IG9wdGlvbnMuYnVtcFBhY2thZ2UgPz8gQ09NTUlUX0FORF9UQUdfVkVSU0lPTl9ERUZBVUxUO1xuICAgIHRoaXMubmV4dFZlcnNpb25Db21tYW5kID0gb3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQ7XG5cbiAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyBsYW5ndWFnZSBpbmRlcGVuZGVudC5cbiAgICAvLyBIb3dldmVyLCB3aGVuIGluIHRoZSBOb2RlLmpzIGVjb3N5c3RlbSwgd2UgY2FuIGltcHJvdmUgdGhlIGV4cGVyaWVuY2UgYnkgYWRkaW5nIGEgZGV2IGRlcGVuZGVuY3kgb24gdGhlIGJ1bXAgcGFja2FnZS5cbiAgICBjb25zdCBub2RlID0gTm9kZVBhY2thZ2Uub2YodGhpcy5wcm9qZWN0KTtcbiAgICBpZiAobm9kZSkge1xuICAgICAgY29uc3QgeyBuYW1lOiBidW1wTmFtZSwgdmVyc2lvbjogYnVtcFZlcnNpb24gfSA9XG4gICAgICAgIERlcGVuZGVuY2llcy5wYXJzZURlcGVuZGVuY3kodGhpcy5idW1wUGFja2FnZSk7XG4gICAgICBub2RlLnByb2plY3QuZGVwcy5yZXF1ZXN0RGVwZW5kZW5jeSh7XG4gICAgICAgIG5hbWU6IGJ1bXBOYW1lLFxuICAgICAgICB2ZXJzaW9uOiBidW1wVmVyc2lvbixcbiAgICAgICAgdHlwZTogRGVwZW5kZW5jeVR5cGUuQlVJTEQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZXJzaW9uSW5wdXRGaWxlID0gb3B0aW9ucy52ZXJzaW9uSW5wdXRGaWxlO1xuXG4gICAgY29uc3QgY2hhbmdlbG9nRmlsZSA9IHBvc2l4LmpvaW4oXG4gICAgICBvcHRpb25zLmFydGlmYWN0c0RpcmVjdG9yeSxcbiAgICAgIHRoaXMuY2hhbmdlbG9nRmlsZU5hbWUsXG4gICAgKTtcbiAgICBjb25zdCBidW1wRmlsZSA9IHBvc2l4LmpvaW4oXG4gICAgICBvcHRpb25zLmFydGlmYWN0c0RpcmVjdG9yeSxcbiAgICAgIHRoaXMudmVyc2lvbkZpbGVOYW1lLFxuICAgICk7XG4gICAgY29uc3QgcmVsZWFzZVRhZ0ZpbGUgPSBwb3NpeC5qb2luKFxuICAgICAgb3B0aW9ucy5hcnRpZmFjdHNEaXJlY3RvcnksXG4gICAgICB0aGlzLnJlbGVhc2VUYWdGaWxlTmFtZSxcbiAgICApO1xuXG4gICAgY29uc3QgY29tbW9uRW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgT1VURklMRTogdmVyc2lvbklucHV0RmlsZSxcbiAgICAgIENIQU5HRUxPRzogY2hhbmdlbG9nRmlsZSxcbiAgICAgIEJVTVBGSUxFOiBidW1wRmlsZSxcbiAgICAgIFJFTEVBU0VUQUc6IHJlbGVhc2VUYWdGaWxlLFxuICAgICAgUkVMRUFTRV9UQUdfUFJFRklYOiBvcHRpb25zLnRhZ1ByZWZpeCA/PyBcIlwiLFxuICAgICAgLy8gZG9lc24ndCB3b3JrIGlmIGN1c3RvbSBjb25maWd1cmF0aW9uIGlzIGxvbmdcbiAgICAgIFZFUlNJT05SQ09QVElPTlM6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMudmVyc2lvbnJjT3B0aW9ucyksXG4gICAgICBCVU1QX1BBQ0tBR0U6IHRoaXMuYnVtcFBhY2thZ2UsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5uZXh0VmVyc2lvbkNvbW1hbmQpIHtcbiAgICAgIGNvbW1vbkVudi5ORVhUX1ZFUlNJT05fQ09NTUFORCA9IG9wdGlvbnMubmV4dFZlcnNpb25Db21tYW5kO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5yZWxlYXNhYmxlQ29tbWl0cykge1xuICAgICAgY29tbW9uRW52LlJFTEVBU0FCTEVfQ09NTUlUUyA9IG9wdGlvbnMucmVsZWFzYWJsZUNvbW1pdHMuY21kO1xuICAgIH1cblxuICAgIHRoaXMuYnVtcFRhc2sgPSB0aGlzLnByb2plY3QuYWRkVGFzayhcImJ1bXBcIiwge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiQnVtcHMgdmVyc2lvbiBiYXNlZCBvbiBsYXRlc3QgZ2l0IHRhZyBhbmQgZ2VuZXJhdGVzIGEgY2hhbmdlbG9nIGVudHJ5XCIsXG4gICAgICBjb25kaXRpb246IENIQU5HRVNfU0lOQ0VfTEFTVF9SRUxFQVNFLFxuICAgICAgZW52OiB7IC4uLmNvbW1vbkVudiB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5idW1wVGFzay5idWlsdGluKFwicmVsZWFzZS9idW1wLXZlcnNpb25cIik7XG5cbiAgICB0aGlzLnVuYnVtcFRhc2sgPSB0aGlzLnByb2plY3QuYWRkVGFzayhcInVuYnVtcFwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0b3JlcyB2ZXJzaW9uIHRvIDAuMC4wXCIsXG4gICAgICBlbnY6IHsgLi4uY29tbW9uRW52IH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnVuYnVtcFRhc2suYnVpbHRpbihcInJlbGVhc2UvcmVzZXQtdmVyc2lvblwiKTtcblxuICAgIHRoaXMucHJvamVjdC5hZGRHaXRJZ25vcmUoYC8ke2NoYW5nZWxvZ0ZpbGV9YCk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZEdpdElnbm9yZShgLyR7YnVtcEZpbGV9YCk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke2NoYW5nZWxvZ0ZpbGV9YCk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke2J1bXBGaWxlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIG1vZGlmeSB0aGUgYnVtcCBjb21tYW5kIGZvciByZWxlYXNlIGJyYW5jaGVzLlxuICAgKlxuICAgKiBUaGVzZSBvcHRpb25zIGFyZSB1c2VkIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgdGhlIHZlcnNpb24gYnVtcGluZyBzY3JpcHRcbiAgICogZm9yIGFkZGl0aW9uYWwgYnJhbmNoZXMsIGJ5IHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICAgKlxuICAgKiBObyBzZXR0aW5ncyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2UgYFZlcnNpb25gIG9iamVjdCAoYnV0IGFueSBwYXJhbWV0ZXJzIHRoYXRcbiAgICogY29udHJvbCB2ZXJzaW9ucyBkbyBjb25mbGljdCB3aXRoIHRoZSB1c2Ugb2YgYSBgbmV4dFZlcnNpb25Db21tYW5kYCkuXG4gICAqL1xuICBwdWJsaWMgZW52Rm9yQnJhbmNoKFxuICAgIGJyYW5jaE9wdGlvbnM6IFZlcnNpb25CcmFuY2hPcHRpb25zLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5uZXh0VmVyc2lvbkNvbW1hbmQgJiYgYnJhbmNoT3B0aW9ucy5taW5NYWpvclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJtaW5NYWpvclZlcnNpb24gYW5kIG5leHRWZXJzaW9uQ29tbWFuZCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgaWYgKGJyYW5jaE9wdGlvbnMubWFqb3JWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudi5NQUpPUiA9IGJyYW5jaE9wdGlvbnMubWFqb3JWZXJzaW9uLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaE9wdGlvbnMubWluTWFqb3JWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChicmFuY2hPcHRpb25zLm1ham9yVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgbWluTWFqb3JWZXJzaW9uIGFuZCBtYWpvclZlcnNpb24gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZW52Lk1JTl9NQUpPUiA9IGJyYW5jaE9wdGlvbnMubWluTWFqb3JWZXJzaW9uLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaE9wdGlvbnMucHJlcmVsZWFzZSkge1xuICAgICAgZW52LlBSRVJFTEVBU0UgPSBicmFuY2hPcHRpb25zLnByZXJlbGVhc2U7XG4gICAgfVxuXG4gICAgaWYgKGJyYW5jaE9wdGlvbnMudGFnUHJlZml4KSB7XG4gICAgICBlbnYuUkVMRUFTRV9UQUdfUFJFRklYID0gYnJhbmNoT3B0aW9ucy50YWdQcmVmaXg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgdG8gcGFzcyB0byBgbW9kaWZ5QnJhbmNoRW52aXJvbm1lbnRgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbkJyYW5jaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG1ham9yIHZlcnNpb25zIHJlbGVhc2VkIGZyb20gdGhpcyBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBtYWpvclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG1ham9yIHZlcnNpb24gdG8gcmVsZWFzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1pbk1ham9yVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1pbm9yIHZlcnNpb25zIHJlbGVhc2VkIGZyb20gdGhpcyBicmFuY2guXG4gICAqL1xuICByZWFkb25seSBtaW5vclZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJ1bXAgdGhlIHZlcnNpb24gYXMgYSBwcmUtcmVsZWFzZSB0YWcuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9ybWFsIHJlbGVhc2VzXG4gICAqL1xuICByZWFkb25seSBwcmVyZWxlYXNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGFkZCB0aGUgZ2l2ZW4gcHJlZml4IHRvIHJlbGVhc2UgdGFncy5cbiAgICogVXNlZnVsIGlmIHlvdSBhcmUgcmVsZWFzaW5nIG9uIG11bHRpcGxlIGJyYW5jaGVzIHdpdGggb3ZlcmxhcHBpbmdcbiAgICogdmVyc2lvbiBudW1iZXJzLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIHByZWZpeCBpcyB1c2VkIHRvIGRldGVjdCB0aGUgbGF0ZXN0IHRhZ2dlZCB2ZXJzaW9uXG4gICAqIHdoZW4gYnVtcGluZywgc28gaWYgeW91IGNoYW5nZSB0aGlzIG9uIGEgcHJvamVjdCB3aXRoIGFuIGV4aXN0aW5nIHZlcnNpb25cbiAgICogaGlzdG9yeSwgeW91IG1heSBuZWVkIHRvIG1hbnVhbGx5IHRhZyB5b3VyIGxhdGVzdCByZWxlYXNlXG4gICAqIHdpdGggdGhlIG5ldyBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcHJlZml4XG4gICAqL1xuICByZWFkb25seSB0YWdQcmVmaXg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmluZCBjb21taXRzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcmVsZWFzYWJsZSB0byBkZWNpZGUgaWYgYSByZWxlYXNlIGlzIHJlcXVpcmVkLlxuICpcbiAqIFRoaXMgc2V0dGluZyBvbmx5IGNvbnRyb2xzIHdoZXRoZXIgYSByZWxlYXNlIGlzIHRyaWdnZXJlZCwgeWVzIG9yIG5vLiBUaGVcbiAqIHBhdGhzIHVzZWQgaGVyZSBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGNvZGUgdGhhdCBjb250cm9scyB3aGF0IGNvbW1pdHMgYXJlIGluc3BlY3RlZFxuICogdG8gZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbGVhc2FibGVDb21taXRzIHtcbiAgLyoqXG4gICAqIFJlbGVhc2UgZXZlcnkgY29tbWl0XG4gICAqXG4gICAqIFRoaXMgd2lsbCBvbmx5IG5vdCByZWxlYXNlIGlmIHRoZSBtb3N0IHJlY2VudCBjb21taXQgaXMgdGFnZ2VkIHdpdGggdGhlIGxhdGVzdCBtYXRjaGluZyB0YWcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIENvbnNpZGVyIG9ubHkgY29tbWl0cyB0aGF0IGFyZSBlbm91Z2ggdG8gZXhwbGFpbiBob3cgdGhlIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRocyBjYW1lIHRvIGJlLlxuICAgKiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXIgb2YgdGhlIGBidW1wYCB0YXNrLCBpLmUuIHRvIG9ubHkgY29uc2lkZXIgY29tbWl0cyBvZiBhIHN1YnByb2plY3QgdXNlIGBcIi5cImAuXG4gICAqL1xuICBzdGF0aWMgZXZlcnlDb21taXQocGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGNtZCA9IGBnaXQgbG9nIC0tb25lbGluZSAkTEFURVNUX1RBRy4uSEVBRGA7XG4gICAgcmV0dXJuIG5ldyBSZWxlYXNhYmxlQ29tbWl0cyh3aXRoUGF0aChjbWQsIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW1pdCBjb21taXRzIGJ5IHRoZWlyIGNvbnZlbnRpb25hbCBjb21taXQgdHlwZVxuICAgKlxuICAgKiBUaGlzIHdpbGwgb25seSByZWxlYXNlIGNvbW1pdCB0aGF0IG1hdGNoIG9uZSBvZiB0aGUgcHJvdmlkZWQgdHlwZXMuXG4gICAqIENvbW1pdHMgYXJlIHJlcXVpcmVkIHRvIGZvbGxvdyB0aGUgY29udmVudGlvbmFsIGNvbW1pdCBzcGVjIGFuZCB3aWxsIGJlIGlnbm9yZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZXMgTGlzdCBvZiBjb252ZW50aW9uYWwgY29tbWl0IHR5cGVzIHRoYXQgc2hvdWxkIGJlIHJlbGVhc2VkXG4gICAqIEBwYXJhbSBwYXRoIENvbnNpZGVyIG9ubHkgY29tbWl0cyB0aGF0IGFyZSBlbm91Z2ggdG8gZXhwbGFpbiBob3cgdGhlIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIHNwZWNpZmllZCBwYXRocyBjYW1lIHRvIGJlLlxuICAgKiBUaGlzIHBhdGggaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXIgb2YgdGhlIGBidW1wYCB0YXNrLCBpLmUuIHRvIG9ubHkgY29uc2lkZXIgY29tbWl0cyBvZiBhIHN1YnByb2plY3QgdXNlIGBcIi5cImAuXG4gICAqL1xuICBzdGF0aWMgb2ZUeXBlKHR5cGVzOiBzdHJpbmdbXSwgcGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IHR5cGVzLmpvaW4oXCJ8XCIpO1xuXG4gICAgLy8gQHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2NvbnZlbnRpb25hbC1jb21taXRzL3BhcnNlci9ibG9iL2VlZWZiOTYxZWJmNWI5ZGZlYTBmZWE4YjA2ZjhhZDM0YTFlNDM5YjkvbGliL3BhcnNlci5qc1xuICAgIC8vIC1FIHJlcXVpcmVzIHRoaXMgdG8gYmUgUE9TSVggRXh0ZW5kZWQgUmVndWxhciBFeHByZXNzaW9uLCB3aGljaCBjb21lcyB3aXRoIGNlcnRhaW4gbGltaXRhdGlvbnNcbiAgICAvLyBzZWUgaHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvUmVndWxhcl9FeHByZXNzaW9ucy9QT1NJWC1FeHRlbmRlZF9SZWd1bGFyX0V4cHJlc3Npb25zIGZvciBkZXRhaWxzXG4gICAgY29uc3QgY21kID0gYGdpdCBsb2cgLS1uby1tZXJnZXMgLS1vbmVsaW5lICRMQVRFU1RfVEFHLi5IRUFEIC1FIC0tZ3JlcCAnXigke2FsbG93ZWRUeXBlc30pezF9KFxcXFwoW14oKVs6c3BhY2U6XV0rXFxcXCkpPyghKT86W1s6Ymxhbms6XV0rLisnYDtcblxuICAgIHJldHVybiBuZXcgUmVsZWFzYWJsZUNvbW1pdHMod2l0aFBhdGgoY21kLCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBvbmx5IGZlYXR1cmVzIGFuZCBmaXhlc1xuICAgKlxuICAgKiBTaG9ydGhhbmQgZm9yIGBSZWxlYXNhYmxlQ29tbWl0cy5vbmx5T2ZUeXBlKFsnZmVhdCcsICdmaXgnXSlgLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBDb25zaWRlciBvbmx5IGNvbW1pdHMgdGhhdCBhcmUgZW5vdWdoIHRvIGV4cGxhaW4gaG93IHRoZSBmaWxlcyB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0aHMgY2FtZSB0byBiZS5cbiAgICogVGhpcyBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyIG9mIHRoZSBgYnVtcGAgdGFzaywgaS5lLiB0byBvbmx5IGNvbnNpZGVyIGNvbW1pdHMgb2YgYSBzdWJwcm9qZWN0IHVzZSBgXCIuXCJgLlxuICAgKi9cbiAgc3RhdGljIGZlYXR1cmVzQW5kRml4ZXMocGF0aD86IHN0cmluZykge1xuICAgIHJldHVybiBSZWxlYXNhYmxlQ29tbWl0cy5vZlR5cGUoW1wiZmVhdFwiLCBcImZpeFwiXSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGFuIGFyYml0cmFyeSBzaGVsbCBjb21tYW5kIHRvIGZpbmQgcmVsZWFzYWJsZSBjb21taXRzIHNpbmNlIHRoZSBsYXRlc3QgdGFnLlxuICAgKlxuICAgKiBBIG5ldyByZWxlYXNlIHdpbGwgYmUgaW5pdGlhdGVkLCBpZiB0aGUgbnVtYmVyIG9mIHJldHVybmVkIGNvbW1pdHMgaXMgZ3JlYXRlciB0aGFuIHplcm8uXG4gICAqIE11c3QgcmV0dXJuIGEgbmV3bGluZSBzZXBhcmF0ZSBsaXN0IG9mIGNvbW1pdHMgdGhhdCBzaG91bGQgY29uc2lkZXJlZCByZWxlYXNhYmxlLlxuICAgKiBgJExBVEVTVF9UQUdgIGlzIGF2YWlsYWJsZSBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSAoc2V0IHRvIHRoZSBhY3R1YWwgbGF0ZXN0IHRhZyBmb3IgdGhlIGdpdmVuIHByZWZpeCkuXG4gICAqXG4gICAqIEBleGFtcGxlIFwiZ2l0IGxvZyAtLW9uZWxpbmUgJExBVEVTVF9UQUcuLkhFQUQgLS0gLlwiXG4gICAqL1xuICBzdGF0aWMgZXhlYyhjbWQ6IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUmVsZWFzYWJsZUNvbW1pdHMoY21kKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIGNtZDogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIEFwcGVuZCBhIHBhdGggYXJndW1lbnQgdG8gYSBnaXQgY29tbWFuZCBpZiBvbmUgaXMgcHJvdmlkZWRcbiAqL1xuZnVuY3Rpb24gd2l0aFBhdGgoY21kOiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGAke2NtZH0gLS0gJHtwYXRofWA7XG4gIH1cblxuICByZXR1cm4gY21kO1xufVxuIl19
@@ -13,7 +13,7 @@ const DEVCONTAINER_FILE = ".devcontainer.json";
13
13
  * codespaces.
14
14
  */
15
15
  class DevContainer extends component_1.Component {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.DevContainer", version: "0.100.7" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.DevContainer", version: "0.101.0" };
17
17
  dockerImage;
18
18
  postCreateTasks;
19
19
  ports;
@@ -9,7 +9,7 @@ const json_1 = require("../json");
9
9
  * Source: https://code.visualstudio.com/docs/editor/extension-marketplace#_workspace-recommended-extensions
10
10
  */
11
11
  class VsCodeRecommendedExtensions extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeRecommendedExtensions", version: "0.100.7" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.vscode.VsCodeRecommendedExtensions", version: "0.101.0" };
13
13
  /**
14
14
  * List of extensions which should be recommended for users of this workspace.
15
15
  * The identifier of an extension is always '${publisher}.${name}'. For example: 'ms-python.python'.