obsidian-dev-utils 80.0.2 → 81.0.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 (217) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/dev/main.js +30208 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/async-events.cjs +9 -1
  5. package/dist/lib/cjs/async-events.d.cts +8 -0
  6. package/dist/lib/cjs/async.cjs +89 -34
  7. package/dist/lib/cjs/async.d.cts +67 -15
  8. package/dist/lib/cjs/debug.cjs +26 -9
  9. package/dist/lib/cjs/debug.d.cts +23 -5
  10. package/dist/lib/cjs/error.cjs +4 -5
  11. package/dist/lib/cjs/error.d.cts +19 -4
  12. package/dist/lib/cjs/html-element.cjs +1 -1
  13. package/dist/lib/cjs/html-element.d.cts +2 -0
  14. package/dist/lib/cjs/library.cjs +2 -2
  15. package/dist/lib/cjs/object-utils.cjs +233 -128
  16. package/dist/lib/cjs/object-utils.d.cts +19 -4
  17. package/dist/lib/cjs/obsidian/async-with-notice.cjs +9 -6
  18. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +9 -0
  19. package/dist/lib/cjs/obsidian/attachment-path.cjs +45 -13
  20. package/dist/lib/cjs/obsidian/attachment-path.d.cts +38 -8
  21. package/dist/lib/cjs/obsidian/backlink.cjs +6 -6
  22. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +53 -16
  23. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +81 -9
  24. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +25 -5
  25. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +35 -1
  26. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +33 -19
  27. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.d.cts +43 -17
  28. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +33 -19
  29. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.d.cts +43 -17
  30. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +17 -9
  31. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +48 -8
  32. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +3 -1
  33. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -1
  34. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +24 -8
  35. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +25 -4
  36. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +144 -65
  37. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +3 -0
  38. package/dist/lib/cjs/obsidian/dataview-link.cjs +7 -2
  39. package/dist/lib/cjs/obsidian/dataview-link.d.cts +20 -5
  40. package/dist/lib/cjs/obsidian/dataview.cjs +27 -10
  41. package/dist/lib/cjs/obsidian/dataview.d.cts +19 -4
  42. package/dist/lib/cjs/obsidian/file-change.cjs +103 -27
  43. package/dist/lib/cjs/obsidian/file-change.d.cts +50 -13
  44. package/dist/lib/cjs/obsidian/file-manager.cjs +61 -32
  45. package/dist/lib/cjs/obsidian/file-manager.d.cts +63 -13
  46. package/dist/lib/cjs/obsidian/file-system.cjs +122 -23
  47. package/dist/lib/cjs/obsidian/file-system.d.cts +168 -39
  48. package/dist/lib/cjs/obsidian/frontmatter.cjs +7 -2
  49. package/dist/lib/cjs/obsidian/link.cjs +266 -122
  50. package/dist/lib/cjs/obsidian/link.d.cts +84 -20
  51. package/dist/lib/cjs/obsidian/logger.cjs +48 -22
  52. package/dist/lib/cjs/obsidian/logger.d.cts +26 -5
  53. package/dist/lib/cjs/obsidian/loop.cjs +14 -4
  54. package/dist/lib/cjs/obsidian/loop.d.cts +5 -0
  55. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +155 -107
  56. package/dist/lib/cjs/obsidian/markdown.cjs +40 -11
  57. package/dist/lib/cjs/obsidian/markdown.d.cts +76 -16
  58. package/dist/lib/cjs/obsidian/metadata-cache.cjs +28 -14
  59. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +76 -16
  60. package/dist/lib/cjs/obsidian/path-settings.cjs +5 -2
  61. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +5 -1
  62. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +4 -0
  63. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +15 -7
  64. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +39 -8
  65. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +3 -2
  66. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +4 -4
  67. package/dist/lib/cjs/obsidian/queue.cjs +9 -7
  68. package/dist/lib/cjs/obsidian/resource-url.cjs +7 -2
  69. package/dist/lib/cjs/obsidian/resource-url.d.cts +19 -4
  70. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +4 -2
  71. package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +6 -2
  72. package/dist/lib/cjs/obsidian/vault-delete.cjs +19 -15
  73. package/dist/lib/cjs/obsidian/vault-delete.d.cts +11 -6
  74. package/dist/lib/cjs/obsidian/vault.cjs +116 -59
  75. package/dist/lib/cjs/obsidian/vault.d.cts +178 -41
  76. package/dist/lib/cjs/path.cjs +12 -5
  77. package/dist/lib/cjs/path.d.cts +15 -3
  78. package/dist/lib/cjs/reg-exp.cjs +101 -78
  79. package/dist/lib/cjs/script-utils/build.cjs +9 -5
  80. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +34 -14
  81. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +20 -5
  82. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +23 -5
  83. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +11 -4
  84. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +6 -2
  85. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +31 -12
  86. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +19 -4
  87. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -7
  88. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +12 -3
  89. package/dist/lib/cjs/script-utils/cli-utils.cjs +6 -2
  90. package/dist/lib/cjs/script-utils/exec.cjs +47 -12
  91. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -3
  92. package/dist/lib/cjs/script-utils/json.cjs +9 -5
  93. package/dist/lib/cjs/script-utils/json.d.cts +38 -8
  94. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +8 -3
  95. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +27 -7
  96. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +7 -3
  97. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +8 -3
  98. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -3
  99. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +3 -3
  100. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +72 -30
  101. package/dist/lib/cjs/script-utils/npm-publish.cjs +2 -2
  102. package/dist/lib/cjs/script-utils/npm.cjs +18 -9
  103. package/dist/lib/cjs/script-utils/root.cjs +20 -5
  104. package/dist/lib/cjs/script-utils/root.d.cts +45 -9
  105. package/dist/lib/cjs/script-utils/validate-declarations.cjs +4 -3
  106. package/dist/lib/cjs/script-utils/version.cjs +36 -19
  107. package/dist/lib/cjs/strict-proxy.cjs +10 -1
  108. package/dist/lib/cjs/string.cjs +63 -22
  109. package/dist/lib/cjs/string.d.cts +188 -40
  110. package/dist/lib/esm/async-events.d.mts +8 -0
  111. package/dist/lib/esm/async-events.mjs +9 -1
  112. package/dist/lib/esm/async.d.mts +67 -15
  113. package/dist/lib/esm/async.mjs +89 -34
  114. package/dist/lib/esm/debug.d.mts +23 -5
  115. package/dist/lib/esm/debug.mjs +26 -9
  116. package/dist/lib/esm/error.d.mts +19 -4
  117. package/dist/lib/esm/error.mjs +4 -5
  118. package/dist/lib/esm/html-element.d.mts +2 -0
  119. package/dist/lib/esm/html-element.mjs +1 -1
  120. package/dist/lib/esm/library.mjs +2 -2
  121. package/dist/lib/esm/object-utils.d.mts +19 -4
  122. package/dist/lib/esm/object-utils.mjs +233 -128
  123. package/dist/lib/esm/obsidian/async-with-notice.d.mts +9 -0
  124. package/dist/lib/esm/obsidian/async-with-notice.mjs +9 -6
  125. package/dist/lib/esm/obsidian/attachment-path.d.mts +38 -8
  126. package/dist/lib/esm/obsidian/attachment-path.mjs +45 -13
  127. package/dist/lib/esm/obsidian/backlink.mjs +6 -6
  128. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +81 -9
  129. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +53 -16
  130. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +35 -1
  131. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +25 -5
  132. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.d.mts +43 -17
  133. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +33 -19
  134. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.d.mts +43 -17
  135. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +33 -19
  136. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +48 -8
  137. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +17 -9
  138. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -1
  139. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +3 -1
  140. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +25 -4
  141. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +24 -8
  142. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -0
  143. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +145 -69
  144. package/dist/lib/esm/obsidian/dataview-link.d.mts +20 -5
  145. package/dist/lib/esm/obsidian/dataview-link.mjs +7 -2
  146. package/dist/lib/esm/obsidian/dataview.d.mts +19 -4
  147. package/dist/lib/esm/obsidian/dataview.mjs +27 -10
  148. package/dist/lib/esm/obsidian/file-change.d.mts +50 -13
  149. package/dist/lib/esm/obsidian/file-change.mjs +104 -27
  150. package/dist/lib/esm/obsidian/file-manager.d.mts +63 -13
  151. package/dist/lib/esm/obsidian/file-manager.mjs +65 -33
  152. package/dist/lib/esm/obsidian/file-system.d.mts +168 -39
  153. package/dist/lib/esm/obsidian/file-system.mjs +122 -23
  154. package/dist/lib/esm/obsidian/frontmatter.mjs +7 -2
  155. package/dist/lib/esm/obsidian/link.d.mts +84 -20
  156. package/dist/lib/esm/obsidian/link.mjs +266 -122
  157. package/dist/lib/esm/obsidian/logger.d.mts +26 -5
  158. package/dist/lib/esm/obsidian/logger.mjs +48 -22
  159. package/dist/lib/esm/obsidian/loop.d.mts +5 -0
  160. package/dist/lib/esm/obsidian/loop.mjs +14 -4
  161. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +155 -107
  162. package/dist/lib/esm/obsidian/markdown.d.mts +76 -16
  163. package/dist/lib/esm/obsidian/markdown.mjs +40 -11
  164. package/dist/lib/esm/obsidian/metadata-cache.d.mts +76 -16
  165. package/dist/lib/esm/obsidian/metadata-cache.mjs +28 -14
  166. package/dist/lib/esm/obsidian/path-settings.mjs +5 -2
  167. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +4 -0
  168. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +5 -1
  169. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +39 -8
  170. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +15 -7
  171. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +4 -4
  172. package/dist/lib/esm/obsidian/plugin/plugin.mjs +5 -7
  173. package/dist/lib/esm/obsidian/queue.mjs +9 -7
  174. package/dist/lib/esm/obsidian/resource-url.d.mts +19 -4
  175. package/dist/lib/esm/obsidian/resource-url.mjs +7 -2
  176. package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +6 -2
  177. package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +4 -2
  178. package/dist/lib/esm/obsidian/vault-delete.d.mts +11 -6
  179. package/dist/lib/esm/obsidian/vault-delete.mjs +19 -15
  180. package/dist/lib/esm/obsidian/vault.d.mts +178 -41
  181. package/dist/lib/esm/obsidian/vault.mjs +116 -59
  182. package/dist/lib/esm/path.d.mts +15 -3
  183. package/dist/lib/esm/path.mjs +12 -5
  184. package/dist/lib/esm/reg-exp.mjs +101 -78
  185. package/dist/lib/esm/script-utils/build.mjs +9 -5
  186. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +34 -14
  187. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +23 -5
  188. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +20 -5
  189. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +11 -4
  190. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +6 -2
  191. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +19 -4
  192. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +31 -12
  193. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +7 -7
  194. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +12 -3
  195. package/dist/lib/esm/script-utils/cli-utils.mjs +6 -2
  196. package/dist/lib/esm/script-utils/exec.mjs +47 -12
  197. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -3
  198. package/dist/lib/esm/script-utils/json.d.mts +38 -8
  199. package/dist/lib/esm/script-utils/json.mjs +9 -5
  200. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +8 -3
  201. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +27 -7
  202. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +7 -3
  203. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +8 -3
  204. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -3
  205. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +3 -3
  206. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +72 -30
  207. package/dist/lib/esm/script-utils/npm-publish.mjs +2 -2
  208. package/dist/lib/esm/script-utils/npm.mjs +18 -9
  209. package/dist/lib/esm/script-utils/root.d.mts +45 -9
  210. package/dist/lib/esm/script-utils/root.mjs +20 -5
  211. package/dist/lib/esm/script-utils/validate-declarations.mjs +4 -3
  212. package/dist/lib/esm/script-utils/version.mjs +36 -19
  213. package/dist/lib/esm/strict-proxy.mjs +10 -1
  214. package/dist/lib/esm/string.d.mts +188 -40
  215. package/dist/lib/esm/string.mjs +63 -22
  216. package/dist/styles.css +5 -1
  217. package/package.json +9 -9
@@ -100,7 +100,11 @@ var LinkStyle = /* @__PURE__ */ ((LinkStyle2) => {
100
100
  return LinkStyle2;
101
101
  })(LinkStyle || {});
102
102
  function convertLink(params) {
103
- const targetFile = extractLinkFile(params.app, params.link, params.oldSourcePathOrFile ?? params.newSourcePathOrFile);
103
+ const targetFile = extractLinkFile({
104
+ app: params.app,
105
+ link: params.link,
106
+ sourcePathOrFile: params.oldSourcePathOrFile ?? params.newSourcePathOrFile
107
+ });
104
108
  if (!targetFile) {
105
109
  return params.link.original;
106
110
  }
@@ -114,54 +118,107 @@ function convertLink(params) {
114
118
  shouldUpdateFileNameAlias: params.shouldUpdateFileNameAlias
115
119
  }));
116
120
  }
117
- async function editBacklinks(app, pathOrFile, linkConverter, options = {}) {
118
- const backlinks = await getBacklinksForFileSafe(app, pathOrFile, options);
121
+ async function editBacklinks(params) {
122
+ const {
123
+ app,
124
+ linkConverter,
125
+ pathOrFile,
126
+ ...options
127
+ } = params;
128
+ const backlinks = await getBacklinksForFileSafe({ app, pathOrFile, ...options });
119
129
  for (const backlinkNotePath of backlinks.keys()) {
120
130
  const currentLinks = ensureNonNullable(backlinks.get(backlinkNotePath));
121
131
  const linkJsons = new Set(currentLinks.map((link) => JSON.stringify(link)));
122
- await editLinks(app, backlinkNotePath, (link) => {
123
- const linkJson = JSON.stringify(link);
124
- if (!linkJsons.has(linkJson)) {
125
- return;
126
- }
127
- return linkConverter(link);
128
- }, options);
132
+ await editLinks({
133
+ app,
134
+ linkConverter: (link) => {
135
+ const linkJson = JSON.stringify(link);
136
+ if (!linkJsons.has(linkJson)) {
137
+ return;
138
+ }
139
+ return linkConverter(link);
140
+ },
141
+ pathOrFile: backlinkNotePath,
142
+ ...options
143
+ });
129
144
  }
130
145
  }
131
- async function editLinks(app, pathOrFile, linkConverter, options = {}) {
132
- await applyFileChanges(app, pathOrFile, async ({ abortSignal, content }) => {
133
- const cache = await getCacheSafe(app, pathOrFile);
134
- abortSignal.throwIfAborted();
135
- const file = getFile(app, pathOrFile);
136
- const cachedContent = await app.vault.cachedRead(file);
137
- abortSignal.throwIfAborted();
138
- if (content !== cachedContent) {
139
- return null;
140
- }
141
- return await getFileChanges(cache, isCanvasFile(pathOrFile), linkConverter, abortSignal);
142
- }, options);
146
+ async function editLinks(params) {
147
+ const {
148
+ app,
149
+ linkConverter,
150
+ pathOrFile,
151
+ ...options
152
+ } = params;
153
+ await applyFileChanges({
154
+ app,
155
+ changesProvider: async ({ abortSignal, content }) => {
156
+ const cache = await getCacheSafe(app, pathOrFile);
157
+ abortSignal.throwIfAborted();
158
+ const file = getFile({ app, pathOrFile });
159
+ const cachedContent = await app.vault.cachedRead(file);
160
+ abortSignal.throwIfAborted();
161
+ if (content !== cachedContent) {
162
+ return null;
163
+ }
164
+ return await getFileChanges({
165
+ abortSignal,
166
+ cache,
167
+ isCanvasFileCache: isCanvasFile(pathOrFile),
168
+ linkConverter
169
+ });
170
+ },
171
+ pathOrFile,
172
+ ...options
173
+ });
143
174
  }
144
- async function editLinksInContent(app, content, linkConverter, abortSignal) {
175
+ async function editLinksInContent(params) {
176
+ const { app, content, linkConverter } = params;
177
+ let { abortSignal } = params;
145
178
  abortSignal ??= abortSignalNever();
146
179
  abortSignal.throwIfAborted();
147
- const newContent = await applyContentChanges(abortSignal, content, "", async () => {
148
- const cache = await parseMetadata(app, content);
149
- abortSignal.throwIfAborted();
150
- const changes = await getFileChanges(cache, false, linkConverter, abortSignal);
151
- abortSignal.throwIfAborted();
152
- return changes;
180
+ const newContent = await applyContentChanges({
181
+ abortSignal,
182
+ changesProvider: async () => {
183
+ const cache = await parseMetadata(app, content);
184
+ abortSignal.throwIfAborted();
185
+ const changes = await getFileChanges({
186
+ abortSignal,
187
+ cache,
188
+ isCanvasFileCache: false,
189
+ linkConverter
190
+ });
191
+ abortSignal.throwIfAborted();
192
+ return changes;
193
+ },
194
+ content,
195
+ path: ""
153
196
  });
154
197
  abortSignal.throwIfAborted();
155
198
  assertNonNullable(newContent, "Failed to update links in content");
156
199
  return newContent;
157
200
  }
158
201
  function encodeUrl(url) {
159
- return replaceAll(url, SPECIAL_LINK_SYMBOLS_REGEXP, ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol));
202
+ return replaceAll({
203
+ replacer: ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol),
204
+ searchValue: SPECIAL_LINK_SYMBOLS_REGEXP,
205
+ str: url
206
+ });
160
207
  }
161
208
  function escapeAlias(alias) {
162
- return replaceAll(alias, SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX, "\\$&");
209
+ return replaceAll({
210
+ replacer: "\\$&",
211
+ searchValue: SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX,
212
+ str: alias
213
+ });
163
214
  }
164
- function extractLinkFile(app, link, sourcePathOrFile, shouldAllowNonExistingFile = false) {
215
+ function extractLinkFile(params) {
216
+ const {
217
+ app,
218
+ link,
219
+ shouldAllowNonExistingFile = false,
220
+ sourcePathOrFile
221
+ } = params;
165
222
  const { linkPath } = splitSubpath(link.link);
166
223
  const sourcePath = getPath(app, sourcePathOrFile);
167
224
  const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
@@ -172,16 +229,16 @@ function extractLinkFile(app, link, sourcePathOrFile, shouldAllowNonExistingFile
172
229
  return null;
173
230
  }
174
231
  if (linkPath.startsWith("/")) {
175
- return getFile(app, linkPath, true);
232
+ return getFile({ app, pathOrFile: linkPath, shouldIncludeNonExisting: true });
176
233
  }
177
234
  const fullLinkPath = join(dirname(sourcePath), `./${linkPath}`);
178
235
  if (fullLinkPath.startsWith("../")) {
179
236
  return null;
180
237
  }
181
- return getFile(app, fullLinkPath, true);
238
+ return getFile({ app, pathOrFile: fullLinkPath, shouldIncludeNonExisting: true });
182
239
  }
183
240
  function fixFrontmatterMarkdownLinks(cache) {
184
- return fixFrontmatterMarkdownLinksImpl(cache.frontmatter, "", cache);
241
+ return fixFrontmatterMarkdownLinksImpl({ cache, key: "", value: cache.frontmatter });
185
242
  }
186
243
  function generateMarkdownLink(params) {
187
244
  const { app } = params;
@@ -190,8 +247,8 @@ function generateMarkdownLink(params) {
190
247
  };
191
248
  const customDefaultParams = getGenerateMarkdownLinkDefaultParamsFns().map((defaultParamsFn) => defaultParamsFn());
192
249
  params = Object.assign({}, DEFAULT_PARAMS, ...customDefaultParams, params);
193
- const targetFile = getFile(app, params.targetPathOrFile, params.isNonExistingFileAllowed);
194
- return tempRegisterFilesAndRun(app, [targetFile], () => generateMarkdownLinkImpl(params));
250
+ const targetFile = getFile(normalizeOptionalProperties({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
251
+ return tempRegisterFilesAndRun({ app, files: [targetFile], fn: () => generateMarkdownLinkImpl(params) });
195
252
  }
196
253
  function generateRawMarkdownLink(params) {
197
254
  const embedPrefix = params.isEmbed ? "!" : "";
@@ -219,13 +276,21 @@ function parseLinks(str) {
219
276
  const NO_EMBED_LINK_PREFIX = "@[";
220
277
  const DUMMY_CHARACTER = "@";
221
278
  const EMBED_INSIDE_LINK_REG_EXP = /\[(?<LinkAlias>!\[.*?\]\(.+?\))\]\((?<Link>.+?)\)/g;
222
- const noInsideEmbedsLinksStr = replaceAll(str, EMBED_INSIDE_LINK_REG_EXP, ({ capturedGroupArgs: [linkAlias = "", link = ""] }) => {
223
- const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length);
224
- return `[${dummyAlias}](${link})`;
279
+ const noInsideEmbedsLinksStr = replaceAll({
280
+ replacer: ({ capturedGroupArgs: [linkAlias = "", link = ""] }) => {
281
+ const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length);
282
+ return `[${dummyAlias}](${link})`;
283
+ },
284
+ searchValue: EMBED_INSIDE_LINK_REG_EXP,
285
+ str
225
286
  });
226
- const noEmbedStr = replaceAll(noInsideEmbedsLinksStr, EMBED_LINK_PREFIX, (args) => {
227
- embedSymbolOffsets.add(args.offset);
228
- return NO_EMBED_LINK_PREFIX;
287
+ const noEmbedStr = replaceAll({
288
+ replacer: (args) => {
289
+ embedSymbolOffsets.add(args.offset);
290
+ return NO_EMBED_LINK_PREFIX;
291
+ },
292
+ searchValue: EMBED_LINK_PREFIX,
293
+ str: noInsideEmbedsLinksStr
229
294
  });
230
295
  const processor = remark().use(remarkParse).use(wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
231
296
  const root = processor.parse(noEmbedStr);
@@ -256,10 +321,20 @@ function parseLinks(str) {
256
321
  links.sort((a, b) => a.startOffset - b.startOffset);
257
322
  let textStartOffset = 0;
258
323
  for (const link of links) {
259
- extractTextLinks(str, textStartOffset, link.startOffset - 1, textLinks);
324
+ extractTextLinks({
325
+ endOffset: link.startOffset - 1,
326
+ startOffset: textStartOffset,
327
+ str,
328
+ textLinks
329
+ });
260
330
  textStartOffset = link.endOffset + 1;
261
331
  }
262
- extractTextLinks(str, textStartOffset, str.length - 1, textLinks);
332
+ extractTextLinks({
333
+ endOffset: str.length - 1,
334
+ startOffset: textStartOffset,
335
+ str,
336
+ textLinks
337
+ });
263
338
  links.push(...textLinks);
264
339
  links.sort((a, b) => a.startOffset - b.startOffset);
265
340
  return links;
@@ -280,7 +355,7 @@ function shouldResetAlias(params) {
280
355
  if (!displayText) {
281
356
  return true;
282
357
  }
283
- const targetFile = getFile(app, targetPathOrFile, true);
358
+ const targetFile = getFile({ app, pathOrFile: targetPathOrFile, shouldIncludeNonExisting: true });
284
359
  const newSourcePath = getPath(app, newSourcePathOrFile);
285
360
  const oldSourcePath = getPath(app, oldSourcePathOrFile ?? newSourcePathOrFile);
286
361
  const newSourceFolder = dirname(newSourcePath);
@@ -299,7 +374,11 @@ function shouldResetAlias(params) {
299
374
  for (const sourcePath of [oldSourcePath, newSourcePath]) {
300
375
  aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
301
376
  }
302
- const cleanDisplayText = replaceAll(normalizePath(ensureNonNullable(displayText.split(" > ")[0])), /^\.\//g, "").toLowerCase();
377
+ const cleanDisplayText = replaceAll({
378
+ replacer: "",
379
+ searchValue: /^\.\//g,
380
+ str: normalizePath(ensureNonNullable(displayText.split(" > ")[0]))
381
+ }).toLowerCase();
303
382
  for (const alias of aliasesToReset) {
304
383
  if (alias.toLowerCase() === cleanDisplayText) {
305
384
  return true;
@@ -340,16 +419,16 @@ function testWikilink(link) {
340
419
  return parseLinkResult?.isWikilink ?? false;
341
420
  }
342
421
  function unescapeAlias(escapedAlias) {
343
- return replaceAll(
344
- escapedAlias,
345
- /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g,
346
- ({ capturedGroupArgs: [backslashes = "", specialChar = ""] }) => {
422
+ return replaceAll({
423
+ replacer: ({ capturedGroupArgs: [backslashes = "", specialChar = ""] }) => {
347
424
  const ESCAPED_BACKSLASH_LENGTH = 2;
348
425
  const backslashCount = backslashes.length;
349
426
  const keepCount = Math.floor(backslashCount / ESCAPED_BACKSLASH_LENGTH);
350
427
  return "\\".repeat(keepCount) + specialChar;
351
- }
352
- );
428
+ },
429
+ searchValue: /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g,
430
+ str: escapedAlias
431
+ });
353
432
  }
354
433
  function updateLink(params) {
355
434
  const {
@@ -365,10 +444,14 @@ function updateLink(params) {
365
444
  if (!newTargetPathOrFile) {
366
445
  return link.original;
367
446
  }
368
- const newTargetFile = getFile(app, newTargetPathOrFile, true);
447
+ const newTargetFile = getFile({ app, pathOrFile: newTargetPathOrFile, shouldIncludeNonExisting: true });
369
448
  const oldSourcePath = getPath(app, oldSourcePathOrFile ?? newSourcePathOrFile);
370
449
  const oldTargetPath = getPath(app, oldTargetPathOrFile ?? newTargetPathOrFile);
371
- const isWikilink = shouldUseWikilinkStyle(app, link.original, linkStyle);
450
+ const isWikilink = shouldUseWikilinkStyle(normalizeOptionalProperties({
451
+ app,
452
+ linkStyle,
453
+ originalLink: link.original
454
+ }));
372
455
  const { subpath } = splitSubpath(link.link);
373
456
  let shouldKeepAlias = !shouldUpdateFileNameAlias;
374
457
  if (isCanvasFile(newSourcePathOrFile)) {
@@ -420,19 +503,23 @@ async function updateLinksInContent(params) {
420
503
  shouldUpdateEmbedOnlyLinks,
421
504
  shouldUpdateFileNameAlias
422
505
  } = params;
423
- return await editLinksInContent(app, content, (link) => {
424
- const isEmbedLink = testEmbed(link.original);
425
- if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
426
- return;
506
+ return await editLinksInContent({
507
+ app,
508
+ content,
509
+ linkConverter: (link) => {
510
+ const isEmbedLink = testEmbed(link.original);
511
+ if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
512
+ return;
513
+ }
514
+ return convertLink(normalizeOptionalProperties({
515
+ app,
516
+ link,
517
+ linkStyle,
518
+ newSourcePathOrFile,
519
+ oldSourcePathOrFile,
520
+ shouldUpdateFileNameAlias
521
+ }));
427
522
  }
428
- return convertLink(normalizeOptionalProperties({
429
- app,
430
- link,
431
- linkStyle,
432
- newSourcePathOrFile,
433
- oldSourcePathOrFile,
434
- shouldUpdateFileNameAlias
435
- }));
436
523
  });
437
524
  }
438
525
  async function updateLinksInFile(params) {
@@ -447,22 +534,27 @@ async function updateLinksInFile(params) {
447
534
  if (isCanvasFile(newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(InternalPluginName.Canvas)) {
448
535
  return;
449
536
  }
450
- await editLinks(app, newSourcePathOrFile, (link) => {
451
- const isEmbedLink = testEmbed(link.original);
452
- if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
453
- return;
454
- }
455
- return convertLink(normalizeOptionalProperties({
456
- app,
457
- link,
458
- linkStyle,
459
- newSourcePathOrFile,
460
- oldSourcePathOrFile,
461
- shouldUpdateFileNameAlias
462
- }));
463
- }, params);
464
- }
465
- function decodeUrlSafely(url, isExternal, hasAngleBrackets) {
537
+ await editLinks({
538
+ ...params,
539
+ linkConverter: (link) => {
540
+ const isEmbedLink = testEmbed(link.original);
541
+ if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
542
+ return;
543
+ }
544
+ return convertLink(normalizeOptionalProperties({
545
+ app,
546
+ link,
547
+ linkStyle,
548
+ newSourcePathOrFile,
549
+ oldSourcePathOrFile,
550
+ shouldUpdateFileNameAlias
551
+ }));
552
+ },
553
+ pathOrFile: newSourcePathOrFile
554
+ });
555
+ }
556
+ function decodeUrlSafely(params) {
557
+ const { hasAngleBrackets, isExternal, url } = params;
466
558
  if (isExternal || hasAngleBrackets) {
467
559
  return url;
468
560
  }
@@ -473,32 +565,43 @@ function decodeUrlSafely(url, isExternal, hasAngleBrackets) {
473
565
  return url;
474
566
  }
475
567
  }
476
- function extractAlias(str, aliasStartOffset, aliasEndOffset) {
568
+ function extractAlias(params) {
569
+ const { aliasEndOffset, aliasStartOffset, str } = params;
477
570
  return aliasStartOffset < aliasEndOffset ? str.slice(aliasStartOffset, aliasEndOffset) : void 0;
478
571
  }
479
- function extractTextLinks(str, startOffset, endOffset, textLinks) {
572
+ function extractTextLinks(params) {
573
+ const { endOffset, startOffset, str, textLinks } = params;
480
574
  if (startOffset > endOffset) {
481
575
  return;
482
576
  }
483
577
  const textPart = str.slice(startOffset, endOffset + 1);
484
- replaceAll(textPart, /(?<Url>\S+)/g, ({ capturedGroupArgs: [url = ""], offset }) => {
485
- if (!isUrl(url)) {
486
- return;
487
- }
488
- textLinks.push({
489
- encodedUrl: encodeUrl(url),
490
- endOffset: startOffset + offset + url.length,
491
- hasAngleBrackets: false,
492
- isEmbed: false,
493
- isExternal: true,
494
- isWikilink: false,
495
- raw: url,
496
- startOffset: startOffset + offset,
497
- url
498
- });
578
+ replaceAll({
579
+ replacer: ({ capturedGroupArgs: [url = ""], offset }) => {
580
+ if (!isUrl(url)) {
581
+ return;
582
+ }
583
+ textLinks.push({
584
+ encodedUrl: encodeUrl(url),
585
+ endOffset: startOffset + offset + url.length,
586
+ hasAngleBrackets: false,
587
+ isEmbed: false,
588
+ isExternal: true,
589
+ isWikilink: false,
590
+ raw: url,
591
+ startOffset: startOffset + offset,
592
+ url
593
+ });
594
+ },
595
+ searchValue: /(?<Url>\S+)/g,
596
+ str: textPart
499
597
  });
500
598
  }
501
- function fixFrontmatterMarkdownLinksImpl(value, key, cache) {
599
+ function fixFrontmatterMarkdownLinksImpl(params) {
600
+ const {
601
+ cache,
602
+ key,
603
+ value
604
+ } = params;
502
605
  if (typeof value === "string") {
503
606
  const parseLinkResult = parseLink(value);
504
607
  if (!parseLinkResult || parseLinkResult.isWikilink || parseLinkResult.isExternal) {
@@ -526,12 +629,14 @@ function fixFrontmatterMarkdownLinksImpl(value, key, cache) {
526
629
  }
527
630
  let hasFrontmatterLinks = false;
528
631
  for (const [childKey, childValue] of Object.entries(value)) {
529
- const hasChildFrontmatterLinks = fixFrontmatterMarkdownLinksImpl(childValue, key ? `${key}.${childKey}` : childKey, cache);
632
+ const hasChildFrontmatterLinks = fixFrontmatterMarkdownLinksImpl({ cache, key: key ? `${key}.${childKey}` : childKey, value: childValue });
530
633
  hasFrontmatterLinks ||= hasChildFrontmatterLinks;
531
634
  }
532
635
  return hasFrontmatterLinks;
533
636
  }
534
- function generateLinkText(app, targetFile, sourcePath, subpath, config) {
637
+ function generateLinkText(params) {
638
+ const { app, config, subpath, targetFile } = params;
639
+ let { sourcePath } = params;
535
640
  if (sourcePath === "/") {
536
641
  sourcePath = "";
537
642
  }
@@ -564,24 +669,43 @@ function generateLinkText(app, targetFile, sourcePath, subpath, config) {
564
669
  assertNever(config.linkPathStyle);
565
670
  }
566
671
  }
567
- linkText = config.isWikilink ? trimEnd(linkText, `.${MARKDOWN_FILE_EXTENSION}`) : linkText;
672
+ linkText = config.isWikilink ? trimEnd({
673
+ str: linkText,
674
+ suffix: `.${MARKDOWN_FILE_EXTENSION}`
675
+ }) : linkText;
568
676
  linkText += subpath;
569
677
  return linkText;
570
678
  }
571
679
  function generateMarkdownLinkImpl(params) {
572
680
  const { app } = params;
573
- const targetFile = getFile(app, params.targetPathOrFile, params.isNonExistingFileAllowed);
681
+ const targetFile = getFile(normalizeOptionalProperties({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
574
682
  const sourcePath = getPath(app, params.sourcePathOrFile);
575
683
  const subpath = params.subpath ?? "";
576
684
  const linkConfig = getLinkConfig(params, targetFile);
577
- const linkText = generateLinkText(app, targetFile, sourcePath, subpath, linkConfig);
578
- return linkConfig.isWikilink ? generateWikiLink(linkText, params.alias, linkConfig.isEmbed) : generateMarkdownStyleLink(linkText, targetFile, params, linkConfig);
579
- }
580
- function generateMarkdownStyleLink(linkText, targetFile, params, config) {
581
- let alias = params.alias ?? "";
582
- let shouldEscapeAlias = params.shouldEscapeAlias ?? false;
583
- if (!alias && (isMarkdownFile(targetFile) || !params.isEmptyEmbedAliasAllowed)) {
584
- alias = !params.shouldIncludeAttachmentExtensionToEmbedAlias || isMarkdownFile(targetFile) ? targetFile.basename : targetFile.name;
685
+ const linkText = generateLinkText({
686
+ app,
687
+ config: linkConfig,
688
+ sourcePath,
689
+ subpath,
690
+ targetFile
691
+ });
692
+ return linkConfig.isWikilink ? generateWikiLink({
693
+ alias: params.alias,
694
+ isEmbed: linkConfig.isEmbed,
695
+ linkText
696
+ }) : generateMarkdownStyleLink({
697
+ config: linkConfig,
698
+ linkText,
699
+ markdownLinkParams: params,
700
+ targetFile
701
+ });
702
+ }
703
+ function generateMarkdownStyleLink(params) {
704
+ const { config, linkText, markdownLinkParams, targetFile } = params;
705
+ let alias = markdownLinkParams.alias ?? "";
706
+ let shouldEscapeAlias = markdownLinkParams.shouldEscapeAlias ?? false;
707
+ if (!alias && (isMarkdownFile(targetFile) || !markdownLinkParams.isEmptyEmbedAliasAllowed)) {
708
+ alias = !markdownLinkParams.shouldIncludeAttachmentExtensionToEmbedAlias || isMarkdownFile(targetFile) ? targetFile.basename : targetFile.name;
585
709
  shouldEscapeAlias = true;
586
710
  }
587
711
  return generateRawMarkdownLink({
@@ -593,7 +717,8 @@ function generateMarkdownStyleLink(linkText, targetFile, params, config) {
593
717
  url: linkText
594
718
  });
595
719
  }
596
- function generateWikiLink(linkText, alias, isEmbed) {
720
+ function generateWikiLink(params) {
721
+ const { alias, isEmbed, linkText } = params;
597
722
  if (alias?.toLowerCase() === linkText.toLowerCase()) {
598
723
  return generateRawMarkdownLink({
599
724
  isEmbed,
@@ -608,7 +733,9 @@ function generateWikiLink(linkText, alias, isEmbed) {
608
733
  url: linkText
609
734
  });
610
735
  }
611
- async function getFileChanges(cache, isCanvasFileCache, linkConverter, abortSignal) {
736
+ async function getFileChanges(params) {
737
+ const { cache, isCanvasFileCache, linkConverter } = params;
738
+ let { abortSignal } = params;
612
739
  abortSignal ??= abortSignalNever();
613
740
  abortSignal.throwIfAborted();
614
741
  if (!cache) {
@@ -665,7 +792,11 @@ function getLinkConfig(params, targetFile) {
665
792
  isEmbed: params.isEmbed ?? (params.originalLink ? testEmbed(params.originalLink) : void 0) ?? (!requireApiVersion("1.10.0") && !isMarkdownFile(targetFile)),
666
793
  /* v8 ignore stop */
667
794
  isSingleSubpathAllowed: params.isSingleSubpathAllowed ?? true,
668
- isWikilink: shouldUseWikilinkStyle(app, params.originalLink, params.linkStyle),
795
+ isWikilink: shouldUseWikilinkStyle(normalizeOptionalProperties({
796
+ app,
797
+ linkStyle: params.linkStyle,
798
+ originalLink: params.originalLink
799
+ })),
669
800
  linkPathStyle: getFinalLinkPathStyle(app, params.linkPathStyle),
670
801
  shouldUseAngleBrackets: params.shouldUseAngleBrackets ?? (params.originalLink ? testAngleBrackets(params.originalLink) : void 0) ?? false,
671
802
  shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths ?? (params.originalLink ? testLeadingDot(params.originalLink) : void 0) ?? false,
@@ -676,7 +807,8 @@ function getRawLink(node, str) {
676
807
  const pos = ensureNonNullable(node.position);
677
808
  return str.slice(pos.start.offset, pos.end.offset);
678
809
  }
679
- function hasAngleBracketsInLink(raw, rawUrl) {
810
+ function hasAngleBracketsInLink(params) {
811
+ const { raw, rawUrl } = params;
680
812
  const OPEN_ANGLE_BRACKET = "<";
681
813
  return raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
682
814
  }
@@ -690,10 +822,21 @@ function parseLinkNode(node, str) {
690
822
  const nodeEndOffset = ensureNonNullable(position.end.offset);
691
823
  const nodeStartOffset = ensureNonNullable(position.start.offset);
692
824
  const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, nodeEndOffset - LINK_SUFFIX.length);
693
- const hasAngleBrackets = hasAngleBracketsInLink(raw, rawUrl);
825
+ const hasAngleBrackets = hasAngleBracketsInLink({
826
+ raw,
827
+ rawUrl
828
+ });
694
829
  const isExternal = isUrl(node.url);
695
- const url = decodeUrlSafely(node.url, isExternal, hasAngleBrackets);
696
- const alias = extractAlias(str, aliasNodeStartOffset, aliasNodeEndOffset);
830
+ const url = decodeUrlSafely({
831
+ hasAngleBrackets,
832
+ isExternal,
833
+ url: node.url
834
+ });
835
+ const alias = extractAlias({
836
+ aliasEndOffset: aliasNodeEndOffset,
837
+ aliasStartOffset: aliasNodeStartOffset,
838
+ str
839
+ });
697
840
  return normalizeOptionalProperties({
698
841
  alias,
699
842
  encodedUrl: isExternal ? encodeUrl(url) : void 0,
@@ -744,7 +887,8 @@ function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
744
887
  }
745
888
  return tablePositions.some((tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end);
746
889
  }
747
- function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
890
+ function shouldUseWikilinkStyle(params) {
891
+ const { app, linkStyle, originalLink } = params;
748
892
  const resolvedStyle = linkStyle ?? "PreserveExisting" /* PreserveExisting */;
749
893
  switch (resolvedStyle) {
750
894
  case "Markdown" /* Markdown */:
@@ -787,4 +931,4 @@ export {
787
931
  updateLinksInContent,
788
932
  updateLinksInFile
789
933
  };
790
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dCxcbiAgcmVxdWlyZUFwaVZlcnNpb25cbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgYXNzZXJ0Tm9uTnVsbGFibGUsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IGlzVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBwYXJzZU1ldGFkYXRhLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1blxufSBmcm9tICcuL21ldGFkYXRhLWNhY2hlLnRzJztcbmltcG9ydCB7XG4gIGdldE5ld0xpbmtGb3JtYXQsXG4gIHNob3VsZFVzZVdpa2lsaW5rc1xufSBmcm9tICcuL29ic2lkaWFuLXNldHRpbmdzLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIHJlZmVyZW5jZVRvRmlsZUNoYW5nZVxufSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5cbmNvbnN0IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUiA9ICdcXFxcfCc7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIGxpbmsgc3ltYm9scy5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyB3cml0dGVuIHRvIGNhcHR1cmUgY29udHJvbCBjaGFyYWN0ZXJzLlxuY29uc3QgU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQID0gL1tcXFxcXFx4MDBcXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRiBdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciBzcGVjaWFsIG1hcmtkb3duIGxpbmsgc3ltYm9scy5cbiAqL1xuY29uc3QgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVggPSAvW1xcXFxbXFxdPD5fKn49YCRdL2c7XG5cbi8qKlxuICogUmVndWxhciBleHByZXNzaW9uIGZvciB1bmVzY2FwZWQgcGlwZXMuXG4gKi9cbmNvbnN0IFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC8oPzwhXFxcXClcXHwvZztcblxuY29uc3QgV0lLSUxJTktfRElWSURFUiA9ICd8JztcblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtQYXRoU3R5bGUge1xuICAvKipcbiAgICogVXNlIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSB2YXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC9mcm9tL3RoZS92YXVsdC9yb290L3RhcmdldF1dYFxuICAgKi9cbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgcGF0aCBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbLi4vLi4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlU291cmNlJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBzaG9ydGVzdCBwYXRoIHdoZW4gcG9zc2libGUuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3Nob3J0ZXN0LXBhdGgtdG8tdGFyZ2V0XV1gXG4gICAqL1xuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTdHlsZSB7XG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKHBhdGgvdG8vdGFyZ2V0Lm1kKWBcbiAgICovXG4gIE1hcmtkb3duID0gJ01hcmtkb3duJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogUHJlc2VydmUgdGhlIGV4aXN0aW5nIGxpbmsgc3R5bGUuXG4gICAqL1xuICBQcmVzZXJ2ZUV4aXN0aW5nID0gJ1ByZXNlcnZlRXhpc3RpbmcnLFxuXG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiB3aWtpbGluayBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0fGFsaWFzXV1gXG4gICAqL1xuICBXaWtpbGluayA9ICdXaWtpbGluaydcbn1cblxuZW51bSBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZU5vdGUnLFxuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGNvbnZlcnRMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb252ZXJ0TGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2FsaWFzfGxpbmtdXWBcbiAgICogQGV4YW1wbGUgYFthbGlhc10obGluay5tZClgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgYmUgZW1iZWRkZWQuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW1t0YXJnZXRdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3RhcmdldF1dYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICovXG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQW4gb3JpZ2luYWwgbGluayB0ZXh0LlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGluZmVyIHRoZSB2YWx1ZXMgb2ZcbiAgICpcbiAgICogLSB7QGxpbmsgaXNFbWJlZH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9Tb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay4gRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzV2lraWxpbmt9IGlzIGBmYWxzZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGFuZ2xlIGJyYWNrZXRzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzV2lraWxpbmt9IGlzIGBmYWxzZWAuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHJlc3VsdCBvZiBwYXJzaW5nIGEgbGluay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZUxpbmtSZXN1bHQge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+IFxcKmFsaWFzXFwqXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuY29kZWQgVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXSg8bGluayB3aXRoIHNwYWNlLm1kPikgLT4gbGluayUyMHdpdGglMjBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGVuY29kZWRVcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGVuZCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGhhcyBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsubWQ+KSAtPiB0cnVlXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiAhW1thbGlhc11dIC0+IHRydWVcbiAgICogW1thbGlhc11dIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShodHRwczovL2V4YW1wbGUuY29tKSAtPiB0cnVlXG4gICAqIFthbGlhc10oZmlsZS5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0V4dGVybmFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHJhdyBsaW5rIHRleHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IFthbGlhc10obGluay5tZClcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSByYXc6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGxpbmsgaW4gdGhlIG9yaWdpbmFsIHRleHQuXG4gICAqL1xuICByZWFkb25seSBzdGFydE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kIFwidGl0bGVcIikgLT4gdGl0bGVcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gdW5lc2NhcGVkIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiAqYWxpYXMqXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdW5lc2NhcGVkQWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluayUyMHdpdGglMjBzcGFjZS5tZCkgLT4gbGluayB3aXRoIHNwYWNlLm1kXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkUmVzZXRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICAvKipcbiAgICogQSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGguXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU6IEZpbmFsTGlua1BhdGhTdHlsZTtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkNvbnRlbnR9LlxuICovXG5pbnRlcmZhY2UgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgZGF0YTogV2lraUxpbmtOb2RlRGF0YTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZURhdGEgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGFsaWFzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsocGFyYW1zOiBDb252ZXJ0TGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0TGlua0ZpbGUocGFyYW1zLmFwcCwgcGFyYW1zLmxpbmssIHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlID8/IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIHBhcmFtcy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogcGFyYW1zLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgYmFja2xpbmtzIGZvci5cbiAqIEBwYXJhbSBsaW5rQ29udmVydGVyIC0gVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciByZXRyeWluZyB0aGUgb3BlcmF0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MoXG4gIGFwcDogQXBwLFxuICBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLFxuICBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+LFxuICBvcHRpb25zOiBFZGl0QmFja2xpbmtzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCBvcHRpb25zKTtcbiAgZm9yIChjb25zdCBiYWNrbGlua05vdGVQYXRoIG9mIGJhY2tsaW5rcy5rZXlzKCkpIHtcbiAgICBjb25zdCBjdXJyZW50TGlua3MgPSBlbnN1cmVOb25OdWxsYWJsZShiYWNrbGlua3MuZ2V0KGJhY2tsaW5rTm90ZVBhdGgpKTtcbiAgICBjb25zdCBsaW5rSnNvbnMgPSBuZXcgU2V0PHN0cmluZz4oY3VycmVudExpbmtzLm1hcCgobGluaykgPT4gSlNPTi5zdHJpbmdpZnkobGluaykpKTtcbiAgICBhd2FpdCBlZGl0TGlua3MoYXBwLCBiYWNrbGlua05vdGVQYXRoLCAobGluaykgPT4ge1xuICAgICAgY29uc3QgbGlua0pzb24gPSBKU09OLnN0cmluZ2lmeShsaW5rKTtcbiAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICB9LCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gKiBAcGFyYW0gbGlua0NvbnZlcnRlciAtIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgb3B0aW9ucyBmb3IgcmV0cnlpbmcgdGhlIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIG9wdGlvbnM6IEVkaXRMaW5rc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXRoT3JGaWxlLCBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhjYWNoZSwgaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gIH0sIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29udGVudCAtIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICogQHBhcmFtIGxpbmtDb252ZXJ0ZXIgLSBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQoXG4gIGFwcDogQXBwLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj4sXG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoYWJvcnRTaWduYWwsIGNvbnRlbnQsICcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoY2FjaGUsIGZhbHNlLCBsaW5rQ29udmVydGVyLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEVuY29kZXMgYSBVUkwuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gZW5jb2RlLlxuICogQHJldHVybnMgVGhlIGVuY29kZWQgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwodXJsLCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsICh7IHN1YnN0cmluZzogc3BlY2lhbExpbmtTeW1ib2wgfSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbChhbGlhcywgU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsICdcXFxcJCYnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICogQHBhcmFtIHNvdXJjZVBhdGhPckZpbGUgLSBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAqIEBwYXJhbSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSAtIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKGFwcDogQXBwLCBsaW5rOiBSZWZlcmVuY2UsIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZShhcHAsIGxpbmtQYXRoLCB0cnVlKTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZShhcHAsIGZ1bGxMaW5rUGF0aCwgdHJ1ZSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKGNhY2hlLmZyb250bWF0dGVyLCAnJywgY2FjaGUpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9QQVJBTVM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGN1c3RvbURlZmF1bHRQYXJhbXMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKS5tYXAoKGRlZmF1bHRQYXJhbXNGbikgPT4gZGVmYXVsdFBhcmFtc0ZuKCkpO1xuICBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUywgLi4uY3VzdG9tRGVmYXVsdFBhcmFtcywgcGFyYW1zKTtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoYXBwLCBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCk7XG5cbiAgcmV0dXJuIHRlbXBSZWdpc3RlckZpbGVzQW5kUnVuKGFwcCwgW3RhcmdldEZpbGVdLCAoKSA9PiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zKSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsfT5gXG4gICAgOiBlbmNvZGVVcmwocGFyYW1zLnVybCk7XG5cbiAgY29uc3QgdGl0bGVQYXJ0ID0gcGFyYW1zLnRpdGxlID8gYCAke0pTT04uc3RyaW5naWZ5KHBhcmFtcy50aXRsZSl9YCA6ICcnO1xuXG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHtlc2NhcGVkQWxpYXN9XSgke3VybH0ke3RpdGxlUGFydH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaGFyZWQsIG11dGFibGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgcGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBldmVyeSB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9IGNhbGwgYW5kIGl0cyByZXN1bHQgaXMgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyAobGF0ZXJcbiAqIHJlZ2lzdHJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLCBidXQgbmV2ZXIgb3ZlciBleHBsaWNpdGx5IHBhc3NlZCBwYXJhbXMpLiBSZWdpc3RlciBlbnRyaWVzXG4gKiBieSBhZGRpbmcgYSBgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zQ29tcG9uZW50YCB0byBhIGNvbXBvbmVudCB0cmVlIHJhdGhlciB0aGFuIG11dGF0aW5nIHRoaXMgbGlzdCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbXV0YWJsZSBsaXN0IG9mIGRlZmF1bHQtcGFyYW1zIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpOiAoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBsaW5rIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBsaW5rIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rKHN0cjogc3RyaW5nKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IGxpbmtzID0gcGFyc2VMaW5rcyhzdHIpO1xuICByZXR1cm4gbGlua3NbMF0/LnJhdyA9PT0gc3RyID8gbGlua3NbMF0gOiBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhbGwgbGlua3MgaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gcGFyc2UgdGhlIGxpbmtzIGluLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua3Moc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHRbXSB7XG4gIGNvbnN0IGVtYmVkU3ltYm9sT2Zmc2V0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIGNvbnN0IEVNQkVEX0xJTktfUFJFRklYID0gJyFbJztcbiAgY29uc3QgTk9fRU1CRURfTElOS19QUkVGSVggPSAnQFsnO1xuICBjb25zdCBEVU1NWV9DSEFSQUNURVIgPSAnQCc7XG5cbiAgY29uc3QgRU1CRURfSU5TSURFX0xJTktfUkVHX0VYUCA9IC9cXFsoPzxMaW5rQWxpYXM+IVxcWy4qP1xcXVxcKC4rP1xcKSlcXF1cXCgoPzxMaW5rPi4rPylcXCkvZztcbiAgY29uc3Qgbm9JbnNpZGVFbWJlZHNMaW5rc1N0ciA9IHJlcGxhY2VBbGwoc3RyLCBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQLCAoeyBjYXB0dXJlZEdyb3VwQXJnczogW2xpbmtBbGlhcyA9ICcnLCBsaW5rID0gJyddIH0pID0+IHtcbiAgICBjb25zdCBkdW1teUFsaWFzID0gRFVNTVlfQ0hBUkFDVEVSLnJlcGVhdChsaW5rQWxpYXMubGVuZ3RoKTtcbiAgICByZXR1cm4gYFske2R1bW15QWxpYXN9XSgke2xpbmt9KWA7XG4gIH0pO1xuXG4gIGNvbnN0IG5vRW1iZWRTdHIgPSByZXBsYWNlQWxsKG5vSW5zaWRlRW1iZWRzTGlua3NTdHIsIEVNQkVEX0xJTktfUFJFRklYLCAoYXJncykgPT4ge1xuICAgIGVtYmVkU3ltYm9sT2Zmc2V0cy5hZGQoYXJncy5vZmZzZXQpO1xuICAgIHJldHVybiBOT19FTUJFRF9MSU5LX1BSRUZJWDtcbiAgfSk7XG5cbiAgY29uc3QgcHJvY2Vzc29yID0gcmVtYXJrKCkudXNlKHJlbWFya1BhcnNlKS51c2Uod2lraUxpbmtQbHVnaW4sIHsgYWxpYXNEaXZpZGVyOiBXSUtJTElOS19ESVZJREVSIH0pO1xuICBjb25zdCByb290ID0gcHJvY2Vzc29yLnBhcnNlKG5vRW1iZWRTdHIpO1xuXG4gIGNvbnN0IGxpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuICBjb25zdCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG5cbiAgdmlzaXQocm9vdCwgKG5vZGU6IE5vZGUpID0+IHtcbiAgICBsZXQgbGluazogUGFyc2VMaW5rUmVzdWx0O1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlTGlua05vZGUobm9kZSBhcyBMaW5rLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dpa2lMaW5rJzpcbiAgICAgICAgbGluayA9IHBhcnNlV2lraWxpbmtOb2RlKG5vZGUgYXMgV2lraUxpbmtOb2RlLCBzdHIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZW1iZWRTeW1ib2xPZmZzZXRzLmhhcyhsaW5rLnN0YXJ0T2Zmc2V0IC0gMSkpIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIC4uLmxpbmssXG4gICAgICAgIGlzRW1iZWQ6IHRydWUsXG4gICAgICAgIHJhdzogYCEke2xpbmsucmF3fWAsXG4gICAgICAgIHN0YXJ0T2Zmc2V0OiBsaW5rLnN0YXJ0T2Zmc2V0IC0gMVxuICAgICAgfTtcbiAgICB9XG4gICAgbGlua3MucHVzaChsaW5rKTtcbiAgfSk7XG5cbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5zdGFydE9mZnNldCAtIGIuc3RhcnRPZmZzZXQpO1xuXG4gIGxldCB0ZXh0U3RhcnRPZmZzZXQgPSAwO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgIGV4dHJhY3RUZXh0TGlua3Moc3RyLCB0ZXh0U3RhcnRPZmZzZXQsIGxpbmsuc3RhcnRPZmZzZXQgLSAxLCB0ZXh0TGlua3MpO1xuICAgIHRleHRTdGFydE9mZnNldCA9IGxpbmsuZW5kT2Zmc2V0ICsgMTtcbiAgfVxuXG4gIGV4dHJhY3RUZXh0TGlua3Moc3RyLCB0ZXh0U3RhcnRPZmZzZXQsIHN0ci5sZW5ndGggLSAxLCB0ZXh0TGlua3MpO1xuXG4gIGxpbmtzLnB1c2goLi4udGV4dExpbmtzKTtcbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5zdGFydE9mZnNldCAtIGIuc3RhcnRPZmZzZXQpO1xuXG4gIHJldHVybiBsaW5rcztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMocGFyYW1zOiBTaG91bGRSZXNldEFsaWFzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQsXG4gICAgaXNXaWtpbGluayxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgdGFyZ2V0UGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRm9sZGVyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRm9sZGVyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZUZvbGRlciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKG5vcm1hbGl6ZVBhdGgoZW5zdXJlTm9uTnVsbGFibGUoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcpWzBdKSksIC9eXFwuXFwvL2csICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlc1RvUmVzZXQpIHtcbiAgICBpZiAoYWxpYXMudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShhbGlhcyk7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGFsaWFzLCBleHRuYW1lKGFsaWFzKSk7XG4gICAgaWYgKGpvaW4oZm9sZGVyLCBiYXNlKS50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN1YnBhdGgobGluazogc3RyaW5nKTogU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VMaW5rdGV4dChub3JtYWxpemUobGluaykpO1xuICByZXR1cm4ge1xuICAgIGxpbmtQYXRoOiBwYXJzZWQucGF0aCxcbiAgICBzdWJwYXRoOiBwYXJzZWQuc3VicGF0aFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RW1iZWQobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNFbWJlZCA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIGRvdCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1suL2xpbmtdXWAsIGBbdGl0bGVdKC4vbGluaylgLCBgW3RpdGxlXSg8Li9saW5rPilgLFxuICogYCFbWy4vbGlua11dYCwgYCFbdGl0bGVdKC4vbGluaylgLCBgIVt0aXRsZV0oPC4vbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIGRvdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1svbGlua11dYCwgYFt0aXRsZV0oL2xpbmspYCwgYFt0aXRsZV0oPC9saW5rPilgLFxuICogYCFbWy9saW5rXV1gLCBgIVt0aXRsZV0oL2xpbmspYCwgYCFbdGl0bGVdKDwvbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ1NsYXNoKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcvJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0V2lraWxpbmsobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNXaWtpbGluayA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBVbmVzY2FwZXMgdGhlIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqXG4gKiBAcGFyYW0gZXNjYXBlZEFsaWFzIC0gQW4gZXNjYXBlZCBhbGlhcy5cbiAqIEByZXR1cm5zIEFuIHVuZXNjYXBlZCBhbGlhcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHVuZXNjYXBlQWxpYXMoJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConKSAvLyAnKiphbGlhcyoqJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZUFsaWFzKGVzY2FwZWRBbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoXG4gICAgZXNjYXBlZEFsaWFzLFxuICAgIC8oPzxCYWNrc2xhc2hlcz5cXFxcKykoPzxTcGVjaWFsQ2hhcmFjdGVyPlshXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXFxcXFxdXl9ge3x9fl0pL2csXG4gICAgKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtiYWNrc2xhc2hlcyA9ICcnLCBzcGVjaWFsQ2hhciA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEggPSAyO1xuICAgICAgY29uc3QgYmFja3NsYXNoQ291bnQgPSBiYWNrc2xhc2hlcy5sZW5ndGg7XG4gICAgICBjb25zdCBrZWVwQ291bnQgPSBNYXRoLmZsb29yKGJhY2tzbGFzaENvdW50IC8gRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIKTtcbiAgICAgIHJldHVybiAnXFxcXCcucmVwZWF0KGtlZXBDb3VudCkgKyBzcGVjaWFsQ2hhcjtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKHBhcmFtczogVXBkYXRlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBsaW5rLm9yaWdpbmFsO1xuICB9XG4gIGNvbnN0IG5ld1RhcmdldEZpbGUgPSBnZXRGaWxlKGFwcCwgbmV3VGFyZ2V0UGF0aE9yRmlsZSwgdHJ1ZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShhcHAsIGxpbmsub3JpZ2luYWwsIGxpbmtTdHlsZSk7XG5cbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgbGV0IHNob3VsZEtlZXBBbGlhcyA9ICFzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgc2hvdWxkS2VlcEFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxpYXMgbWF0Y2hpbmcgYnJhbmNoZXMgYXJlIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChhcHAsIGNvbnRlbnQsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBsaW5rU3R5bGUsXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRMaW5rcyhhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUsIChsaW5rKSA9PiB7XG4gICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmssXG4gICAgICBsaW5rU3R5bGUsXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICB9KSk7XG4gIH0sIHBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVVybFNhZmVseSh1cmw6IHN0cmluZywgaXNFeHRlcm5hbDogYm9vbGVhbiwgaGFzQW5nbGVCcmFja2V0czogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChpc0V4dGVybmFsIHx8IGhhc0FuZ2xlQnJhY2tldHMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRlY29kZSBVUkwgJHt1cmx9YCwgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFsaWFzKHN0cjogc3RyaW5nLCBhbGlhc1N0YXJ0T2Zmc2V0OiBudW1iZXIsIGFsaWFzRW5kT2Zmc2V0OiBudW1iZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gYWxpYXNTdGFydE9mZnNldCA8IGFsaWFzRW5kT2Zmc2V0XG4gICAgPyBzdHIuc2xpY2UoYWxpYXNTdGFydE9mZnNldCwgYWxpYXNFbmRPZmZzZXQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUZXh0TGlua3Moc3RyOiBzdHJpbmcsIHN0YXJ0T2Zmc2V0OiBudW1iZXIsIGVuZE9mZnNldDogbnVtYmVyLCB0ZXh0TGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdKTogdm9pZCB7XG4gIGlmIChzdGFydE9mZnNldCA+IGVuZE9mZnNldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHRleHRQYXJ0ID0gc3RyLnNsaWNlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgKyAxKTtcbiAgcmVwbGFjZUFsbCh0ZXh0UGFydCwgLyg/PFVybD5cXFMrKS9nLCAoeyBjYXB0dXJlZEdyb3VwQXJnczogW3VybCA9ICcnXSwgb2Zmc2V0IH0pID0+IHtcbiAgICBpZiAoIWlzVXJsKHVybCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0ZXh0TGlua3MucHVzaCh7XG4gICAgICBlbmNvZGVkVXJsOiBlbmNvZGVVcmwodXJsKSxcbiAgICAgIGVuZE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQgKyB1cmwubGVuZ3RoLFxuICAgICAgaGFzQW5nbGVCcmFja2V0czogZmFsc2UsXG4gICAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHJhdzogdXJsLFxuICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LFxuICAgICAgdXJsXG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHZhbHVlOiB1bmtub3duLCBrZXk6IHN0cmluZywgY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKHZhbHVlKTtcbiAgICBpZiAoIXBhcnNlTGlua1Jlc3VsdCB8fCBwYXJzZUxpbmtSZXN1bHQuaXNXaWtpbGluayB8fCBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNhY2hlLmZyb250bWF0dGVyTGlua3MgPz89IFtdO1xuICAgIGxldCBsaW5rID0gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5maW5kKChmcm9udG1hdHRlckxpbmspID0+IGZyb250bWF0dGVyTGluay5rZXkgPT09IGtleSk7XG5cbiAgICBpZiAoIWxpbmspIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgbGluazogJycsXG4gICAgICAgIG9yaWdpbmFsOiAnJ1xuICAgICAgfTtcbiAgICAgIGNhY2hlLmZyb250bWF0dGVyTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBsaW5rLmxpbmsgPSBwYXJzZUxpbmtSZXN1bHQudXJsO1xuICAgIGxpbmsub3JpZ2luYWwgPSB2YWx1ZTtcbiAgICBpZiAocGFyc2VMaW5rUmVzdWx0LmFsaWFzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpbmsuZGlzcGxheVRleHQgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBoYXNGcm9udG1hdHRlckxpbmtzID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBbY2hpbGRLZXksIGNoaWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIEdlbmVyaWNPYmplY3QpKSB7XG4gICAgY29uc3QgaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzID0gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChjaGlsZFZhbHVlLCBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCBjYWNoZSk7XG4gICAgaGFzRnJvbnRtYXR0ZXJMaW5rcyB8fD0gaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzO1xuICB9XG5cbiAgcmV0dXJuIGhhc0Zyb250bWF0dGVyTGlua3M7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQoYXBwOiBBcHAsIHRhcmdldEZpbGU6IFRGaWxlLCBzb3VyY2VQYXRoOiBzdHJpbmcsIHN1YnBhdGg6IHN0cmluZywgY29uZmlnOiBMaW5rQ29uZmlnKTogc3RyaW5nIHtcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgdGFyZ2V0RmlsZS5wYXRoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgICAgY29uc3Qgc2hvcnRlc3ROYW1lID0gaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgPyB0YXJnZXRGaWxlLmJhc2VuYW1lIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgICAgICBjb25zdCBtYXRjaGVkRmlsZXMgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRMaW5rcGF0aERlc3Qoc2hvcnRlc3ROYW1lLCBzb3VyY2VQYXRoKTtcbiAgICAgICAgbGlua1RleHQgPSBtYXRjaGVkRmlsZXMubGVuZ3RoID09PSAxICYmIG1hdGNoZWRGaWxlc1swXSA9PT0gdGFyZ2V0RmlsZSA/IHRhcmdldEZpbGUubmFtZSA6IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIHZhbGlkIEZpbmFsTGlua1BhdGhTdHlsZSB2YWx1ZXMgYXJlIGhhbmRsZWQgYWJvdmUuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGluayA/IHRyaW1FbmQobGlua1RleHQsIGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gKSA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShhcHAsIHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMuc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBwYXJhbXMuc3VicGF0aCA/PyAnJztcblxuICBjb25zdCBsaW5rQ29uZmlnID0gZ2V0TGlua0NvbmZpZyhwYXJhbXMsIHRhcmdldEZpbGUpO1xuICBjb25zdCBsaW5rVGV4dCA9IGdlbmVyYXRlTGlua1RleHQoYXBwLCB0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBzdWJwYXRoLCBsaW5rQ29uZmlnKTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKGxpbmtUZXh0LCBwYXJhbXMuYWxpYXMsIGxpbmtDb25maWcuaXNFbWJlZClcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsobGlua1RleHQsIHRhcmdldEZpbGUsIHBhcmFtcywgbGlua0NvbmZpZyk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsobGlua1RleHQ6IHN0cmluZywgdGFyZ2V0RmlsZTogVEZpbGUsIHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMsIGNvbmZpZzogTGlua0NvbmZpZyk6IHN0cmluZyB7XG4gIGxldCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSB8fCAhcGFyYW1zLmlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCkpIHtcbiAgICBhbGlhcyA9ICFwYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMgfHwgaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSlcbiAgICAgID8gdGFyZ2V0RmlsZS5iYXNlbmFtZVxuICAgICAgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgc2hvdWxkRXNjYXBlQWxpYXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkOiBjb25maWcuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVdpa2lMaW5rKGxpbmtUZXh0OiBzdHJpbmcsIGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQsIGlzRW1iZWQ6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGxpbmtUZXh0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgICAgaXNFbWJlZCxcbiAgICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgICB1cmw6IGFsaWFzXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhcbiAgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCxcbiAgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW4sXG4gIGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PixcbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbFxuKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogRmlsZUNoYW5nZVtdID0gW107XG5cbiAgY29uc3QgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSA9IChjYWNoZS5zZWN0aW9ucyA/PyBbXSkuZmlsdGVyKChzZWN0aW9uKSA9PiBzZWN0aW9uLnR5cGUgPT09ICd0YWJsZScpLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICBlbmQ6IHNlY3Rpb24ucG9zaXRpb24uZW5kLm9mZnNldCxcbiAgICBzdGFydDogc2VjdGlvbi5wb3NpdGlvbi5zdGFydC5vZmZzZXRcbiAgfSkpO1xuXG4gIGZvciAoY29uc3QgbGluayBvZiBnZXRBbGxMaW5rcyhjYWNoZSkpIHtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBmaWxlIGNoYW5nZScsIGZpbGVDaGFuZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9ucykpIHtcbiAgICAgICAgZmlsZUNoYW5nZS5uZXdDb250ZW50ID0gZmlsZUNoYW5nZS5uZXdDb250ZW50LnJlcGxhY2VBbGwoVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIpO1xuICAgICAgfVxuXG4gICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VzO1xufVxuXG5mdW5jdGlvbiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwOiBBcHAsIGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtQYXRoU3R5bGUgPz8gTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDtcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0OlxuICAgICAgcmV0dXJuIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHApO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMaW5rQ29uZmlnKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGU6IFRGaWxlKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHJlcXVpcmVBcGlWZXJzaW9uIGZhbGxiYWNrIGlzIG9ubHkgcmVhY2hlZCBpbiBvbGRlciBPYnNpZGlhbiB2ZXJzaW9ucy4gKi9cbiAgICBpc0VtYmVkOiBwYXJhbXMuaXNFbWJlZCA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RFbWJlZChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZClcbiAgICAgID8/ICghcmVxdWlyZUFwaVZlcnNpb24oJzEuMTAuMCcpICYmICFpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSksXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBwYXJhbXMuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCA/PyB0cnVlLFxuICAgIGlzV2lraWxpbms6IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUoYXBwLCBwYXJhbXMub3JpZ2luYWxMaW5rLCBwYXJhbXMubGlua1N0eWxlKSxcbiAgICBsaW5rUGF0aFN0eWxlOiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwLCBwYXJhbXMubGlua1BhdGhTdHlsZSksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0QW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ0RvdChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdTbGFzaChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmF3TGluayhub2RlOiBOb2RlLCBzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHBvcyA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gc3RyLnNsaWNlKHBvcy5zdGFydC5vZmZzZXQsIHBvcy5lbmQub2Zmc2V0KTtcbn1cblxuZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0c0luTGluayhyYXc6IHN0cmluZywgcmF3VXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmtOb2RlKG5vZGU6IExpbmssIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcbiAgY29uc3QgcmF3ID0gZ2V0UmF3TGluayhub2RlLCBzdHIpO1xuICBjb25zdCBhbGlhc05vZGVTdGFydE9mZnNldCA9IG5vZGUuY2hpbGRyZW5bMF0/LnBvc2l0aW9uPy5zdGFydC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgYWxpYXNOb2RlRW5kT2Zmc2V0ID0gbm9kZS5jaGlsZHJlbi5hdCgtMSk/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDE7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIGNvbnN0IG5vZGVFbmRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgY29uc3Qgbm9kZVN0YXJ0T2Zmc2V0ID0gZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KTtcbiAgY29uc3QgcmF3VXJsID0gc3RyLnNsaWNlKGFsaWFzTm9kZUVuZE9mZnNldCArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgbm9kZUVuZE9mZnNldCAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHJhdywgcmF3VXJsKTtcbiAgY29uc3QgaXNFeHRlcm5hbCA9IGlzVXJsKG5vZGUudXJsKTtcbiAgY29uc3QgdXJsID0gZGVjb2RlVXJsU2FmZWx5KG5vZGUudXJsLCBpc0V4dGVybmFsLCBoYXNBbmdsZUJyYWNrZXRzKTtcbiAgY29uc3QgYWxpYXMgPSBleHRyYWN0QWxpYXMoc3RyLCBhbGlhc05vZGVTdGFydE9mZnNldCwgYWxpYXNOb2RlRW5kT2Zmc2V0KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhcyxcbiAgICBlbmNvZGVkVXJsOiBpc0V4dGVybmFsID8gZW5jb2RlVXJsKHVybCkgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBub2RlRW5kT2Zmc2V0LFxuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICByYXcsXG4gICAgc3RhcnRPZmZzZXQ6IG5vZGVTdGFydE9mZnNldCxcbiAgICB0aXRsZTogbm9kZS50aXRsZSA/PyB1bmRlZmluZWQsXG4gICAgdW5lc2NhcGVkQWxpYXM6IGFsaWFzID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB1bmVzY2FwZUFsaWFzKGFsaWFzKSxcbiAgICB1cmxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlV2lraWxpbmtOb2RlKG5vZGU6IFdpa2lMaW5rTm9kZSwgc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHQge1xuICBjb25zdCBwb3NpdGlvbiA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzOiBzdHIuaW5jbHVkZXMoV0lLSUxJTktfRElWSURFUikgPyBub2RlLmRhdGEuYWxpYXMgOiB1bmRlZmluZWQsXG4gICAgZW5kT2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KSxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsOiBmYWxzZSxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHJhdzogZ2V0UmF3TGluayhub2RlLCBzdHIpLFxuICAgIHN0YXJ0T2Zmc2V0OiBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5zdGFydC5vZmZzZXQpLFxuICAgIHVybDogbm9kZS52YWx1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgJ3JlbGF0aXZlJzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgY2FzZSAnc2hvcnRlc3QnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKG5ld0xpbmtGb3JtYXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdKTogYm9vbGVhbiB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBnZXRGaWxlQ2hhbmdlcyBvbmx5IGNhbGxzIHRoaXMgZm9yIG5vbi1jYW52YXMgZmlsZXMgd2hpY2ggYWx3YXlzIGhhdmUgY29udGVudCBjaGFuZ2VzLiAqL1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGlmICghVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PiB0YWJsZVBvc2l0aW9uLnN0YXJ0IDw9IGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAmJiBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IDw9IHRhYmxlUG9zaXRpb24uZW5kKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShhcHA6IEFwcCwgb3JpZ2luYWxMaW5rPzogc3RyaW5nLCBsaW5rU3R5bGU/OiBMaW5rU3R5bGUpOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6XG4gICAgICByZXR1cm4gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCk7XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzpcbiAgICAgIHJldHVybiBvcmlnaW5hbExpbmsgPT09IHVuZGVmaW5lZCA/IHNob3VsZFVzZVdpa2lsaW5rcyhhcHApIDogdGVzdFdpa2lsaW5rKG9yaWdpbmFsTGluayk7XG4gICAgY2FzZSBMaW5rU3R5bGUuV2lraWxpbms6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZh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
934
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dCxcbiAgcmVxdWlyZUFwaVZlcnNpb25cbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBHZXRGaWxlUGFyYW1zLFxuICBQYXRoT3JGaWxlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBpc1VybCB9IGZyb20gJy4uL3VybC50cyc7XG5pbXBvcnQge1xuICBhcHBseUNvbnRlbnRDaGFuZ2VzLFxuICBhcHBseUZpbGVDaGFuZ2VzLFxuICBpc0NhbnZhc0NoYW5nZSxcbiAgaXNDb250ZW50Q2hhbmdlXG59IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBnZXRBbGxMaW5rcyxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldENhY2hlU2FmZSxcbiAgcGFyc2VNZXRhZGF0YSxcbiAgdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW5cbn0gZnJvbSAnLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQge1xuICBnZXROZXdMaW5rRm9ybWF0LFxuICBzaG91bGRVc2VXaWtpbGlua3Ncbn0gZnJvbSAnLi9vYnNpZGlhbi1zZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9yZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgd3JpdHRlbiB0byBjYXB0dXJlIGNvbnRyb2wgY2hhcmFjdGVycy5cbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBjb252ZXJ0TGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydExpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gZWRpdCB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+Pjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRMaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleHRyYWN0TGlua0ZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RMaW5rRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBjYWNoZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICByZWFkb25seSBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBpc0VtYmVkfVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1NvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhbiBlbWJlZCBsaW5rLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNXaWtpbGlua30gaXMgYGZhbHNlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNXaWtpbGlua30gaXMgYGZhbHNlYC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzdWx0IG9mIHBhcnNpbmcgYSBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlTGlua1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gXFwqYWxpYXNcXCpcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5jb2RlZCBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rIHdpdGggc3BhY2UubWQ+KSAtPiBsaW5rJTIwd2l0aCUyMHNwYWNlLm1kXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2RlZFVybD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGVuZE9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaGFzIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXSg8bGluay5tZD4pIC0+IHRydWVcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGhhc0FuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqICFbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbW2FsaWFzXV0gLT4gZmFsc2VcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgZXh0ZXJuYWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGh0dHBzOi8vZXhhbXBsZS5jb20pIC0+IHRydWVcbiAgICogW2FsaWFzXShmaWxlLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzRXh0ZXJuYWw6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1thbGlhc11dIC0+IHRydWVcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmF3IGxpbmsgdGV4dC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCkgLT4gW2FsaWFzXShsaW5rLm1kKVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHJhdzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGluayBpbiB0aGUgb3JpZ2luYWwgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmsubWQgXCJ0aXRsZVwiKSAtPiB0aXRsZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiB1bmVzY2FwZWQgYWxpYXMgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbXFwqYWxpYXNcXCpdKGxpbmsubWQpIC0+ICphbGlhcypcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1bmVzY2FwZWRBbGlhcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rJTIwd2l0aCUyMHNwYWNlLm1kKSAtPiBsaW5rIHdpdGggc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGRpc3BsYXkgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgdGFyZ2V0IHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIC8qKlxuICAgKiBBIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZm9yY2UgbWFya2Rvd24gbGlua3MuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdUYXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZGVjb2RlVXJsU2FmZWx5fS5cbiAqL1xuaW50ZXJmYWNlIERlY29kZVVybFNhZmVseVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBVUkwgdG8gZGVjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZXh0cmFjdEFsaWFzfS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBhbGlhcyBpbiB0aGUgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGFsaWFzIGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc1N0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIGFsaWFzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzdHI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBleHRyYWN0VGV4dExpbmtzfS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RUZXh0TGlua3NQYXJhbXMge1xuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBwYXJ0IGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIHRleHQgcGFydCBpbiB0aGUgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgdGV4dCBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBwYXJzZWQgbGlua3MgdG8gYXBwZW5kIHRoZSBleHRyYWN0ZWQgdGV4dCBsaW5rcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGx9LlxuICovXG5pbnRlcmZhY2UgRml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBjdXJyZW50IHZhbHVlIHdpdGhpbiB0aGUgZnJvbnRtYXR0ZXIuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZnJvbnRtYXR0ZXIgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlua1RleHR9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVMaW5rVGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IGZpbGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRGaWxlOiBURmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd25MaW5rUGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlV2lraUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVXaWtpTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldEZpbGVDaGFuZ2VzfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVDaGFuZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBtZXRhZGF0YSBjYWNoZSB0byBleHRyYWN0IHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FjaGUgYmVsb25ncyB0byBhIGNhbnZhcyBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+Pjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEhhc0FuZ2xlQnJhY2tldHNJbkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmF3IFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHJhd1VybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU6IEZpbmFsTGlua1BhdGhTdHlsZTtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkVXNlV2lraWxpbmtTdHlsZX0uXG4gKi9cbmludGVyZmFjZSBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkNvbnRlbnR9LlxuICovXG5pbnRlcmZhY2UgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGUgZXh0ZW5kcyBOb2RlIHtcbiAgZGF0YTogV2lraUxpbmtOb2RlRGF0YTtcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFdpa2lMaW5rTm9kZURhdGEgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGFsaWFzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsocGFyYW1zOiBDb252ZXJ0TGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIHBhcmFtcy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogcGFyYW1zLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gZW5zdXJlTm9uTnVsbGFibGUoYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSk7XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IEpTT04uc3RyaW5naWZ5KGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtKc29uID0gSlNPTi5zdHJpbmdpZnkobGluayk7XG4gICAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICAgIH0sXG4gICAgICBwYXRoT3JGaWxlOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKHBhcmFtczogRWRpdExpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgYXBwbHlGaWxlQ2hhbmdlcyh7XG4gICAgYXBwLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAoY29udGVudCAhPT0gY2FjaGVkQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpbGVDaGFuZ2VzKHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpLFxuICAgICAgICBsaW5rQ29udmVydGVyXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50LlxuICogQHJldHVybnMgVGhlIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBjb250ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzSW5Db250ZW50KHBhcmFtczogRWRpdExpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQsIGxpbmtDb252ZXJ0ZXIgfSA9IHBhcmFtcztcbiAgbGV0IHsgYWJvcnRTaWduYWwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyh7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBmYWxzZSxcbiAgICAgICAgbGlua0NvbnZlcnRlclxuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfSxcbiAgICBjb250ZW50LFxuICAgIHBhdGg6ICcnXG4gIH0pO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld0NvbnRlbnQsICdGYWlsZWQgdG8gdXBkYXRlIGxpbmtzIGluIGNvbnRlbnQnKTtcblxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIGEgVVJMLlxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIGVuY29kZS5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIFVSTC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgc3Vic3RyaW5nOiBzcGVjaWFsTGlua1N5bWJvbCB9KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc3BlY2lhbExpbmtTeW1ib2wpLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAsXG4gICAgc3RyOiB1cmxcbiAgfSk7XG59XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBhbGlhcyAtIEFuIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEFuIGVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBlc2NhcGVBbGlhcygnKiphbGlhcyoqJykgLy8gJ1xcXFwqXFxcXCphbGlhc1xcXFwqXFxcXConXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUFsaWFzKGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICdcXFxcJCYnLFxuICAgIHNlYXJjaFZhbHVlOiBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCxcbiAgICBzdHI6IGFsaWFzXG4gIH0pO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBleHRyYWN0aW5nIHRoZSBsaW5rIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlua0ZpbGUocGFyYW1zOiBFeHRyYWN0TGlua0ZpbGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUgPSBmYWxzZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgbGlua1BhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua1BhdGgsIHNvdXJjZVBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgaWYgKCFzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpbmtQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBsaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZnVsbExpbmtQYXRoID0gam9pbihkaXJuYW1lKHNvdXJjZVBhdGgpLCBgLi8ke2xpbmtQYXRofWApO1xuXG4gIGlmIChmdWxsTGlua1BhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBmdWxsTGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBGaXhlcyB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4gdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGNhY2hlLlxuICpcbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBtZXRhZGF0YSBjYWNoZSB0byBmaXggdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3Mgd2VyZSBmaXhlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rcyhjYWNoZTogQ2FjaGVkTWV0YWRhdGEpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiAnJywgdmFsdWU6IGNhY2hlLmZyb250bWF0dGVyIH0pO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgREVGQVVMVF9QQVJBTVM6IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+ID0ge1xuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZDogdHJ1ZVxuICB9O1xuXG4gIGNvbnN0IGN1c3RvbURlZmF1bHRQYXJhbXMgPSBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKS5tYXAoKGRlZmF1bHRQYXJhbXNGbikgPT4gZGVmYXVsdFBhcmFtc0ZuKCkpO1xuICBwYXJhbXMgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1BBUkFNUywgLi4uY3VzdG9tRGVmYXVsdFBhcmFtcywgcGFyYW1zKTtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcblxuICByZXR1cm4gdGVtcFJlZ2lzdGVyRmlsZXNBbmRSdW4oeyBhcHAsIGZpbGVzOiBbdGFyZ2V0RmlsZV0sIGZuOiAoKSA9PiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zKSB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYXcgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNoYXJlZCwgbXV0YWJsZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBwYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKlxuICogRWFjaCBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIGV2ZXJ5IHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30gY2FsbCBhbmQgaXRzIHJlc3VsdCBpcyBtZXJnZWQgaW50byB0aGUgcGFyYW1zIChsYXRlclxuICogcmVnaXN0cmF0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMsIGJ1dCBuZXZlciBvdmVyIGV4cGxpY2l0bHkgcGFzc2VkIHBhcmFtcykuIFJlZ2lzdGVyIGVudHJpZXNcbiAqIGJ5IGFkZGluZyBhIGBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNDb21wb25lbnRgIHRvIGEgY29tcG9uZW50IHRyZWUgcmF0aGVyIHRoYW4gbXV0YXRpbmcgdGhpcyBsaXN0IGRpcmVjdGx5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBtdXRhYmxlIGxpc3Qgb2YgZGVmYXVsdC1wYXJhbXMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPignZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zJywgW10pLnZhbHVlO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIGxpbmsgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIGxpbmsgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxpbmsoc3RyOiBzdHJpbmcpOiBudWxsIHwgUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgbGlua3MgPSBwYXJzZUxpbmtzKHN0cik7XG4gIHJldHVybiBsaW5rc1swXT8ucmF3ID09PSBzdHIgPyBsaW5rc1swXSA6IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2VzIGFsbCBsaW5rcyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIC0gVGhlIHN0cmluZyB0byBwYXJzZSB0aGUgbGlua3MgaW4uXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rcyhzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdFtdIHtcbiAgY29uc3QgZW1iZWRTeW1ib2xPZmZzZXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgY29uc3QgRU1CRURfTElOS19QUkVGSVggPSAnIVsnO1xuICBjb25zdCBOT19FTUJFRF9MSU5LX1BSRUZJWCA9ICdAWyc7XG4gIGNvbnN0IERVTU1ZX0NIQVJBQ1RFUiA9ICdAJztcblxuICBjb25zdCBFTUJFRF9JTlNJREVfTElOS19SRUdfRVhQID0gL1xcWyg/PExpbmtBbGlhcz4hXFxbLio/XFxdXFwoLis/XFwpKVxcXVxcKCg/PExpbms+Lis/KVxcKS9nO1xuICBjb25zdCBub0luc2lkZUVtYmVkc0xpbmtzU3RyID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbbGlua0FsaWFzID0gJycsIGxpbmsgPSAnJ10gfSkgPT4ge1xuICAgICAgY29uc3QgZHVtbXlBbGlhcyA9IERVTU1ZX0NIQVJBQ1RFUi5yZXBlYXQobGlua0FsaWFzLmxlbmd0aCk7XG4gICAgICByZXR1cm4gYFske2R1bW15QWxpYXN9XSgke2xpbmt9KWA7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogRU1CRURfSU5TSURFX0xJTktfUkVHX0VYUCxcbiAgICBzdHJcbiAgfSk7XG5cbiAgY29uc3Qgbm9FbWJlZFN0ciA9IHJlcGxhY2VBbGwoe1xuICAgIHJlcGxhY2VyOiAoYXJncykgPT4ge1xuICAgICAgZW1iZWRTeW1ib2xPZmZzZXRzLmFkZChhcmdzLm9mZnNldCk7XG4gICAgICByZXR1cm4gTk9fRU1CRURfTElOS19QUkVGSVg7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogRU1CRURfTElOS19QUkVGSVgsXG4gICAgc3RyOiBub0luc2lkZUVtYmVkc0xpbmtzU3RyXG4gIH0pO1xuXG4gIGNvbnN0IHByb2Nlc3NvciA9IHJlbWFyaygpLnVzZShyZW1hcmtQYXJzZSkudXNlKHdpa2lMaW5rUGx1Z2luLCB7IGFsaWFzRGl2aWRlcjogV0lLSUxJTktfRElWSURFUiB9KTtcbiAgY29uc3Qgcm9vdCA9IHByb2Nlc3Nvci5wYXJzZShub0VtYmVkU3RyKTtcblxuICBjb25zdCBsaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcbiAgY29uc3QgdGV4dExpbmtzOiBQYXJzZUxpbmtSZXN1bHRbXSA9IFtdO1xuXG4gIHZpc2l0KHJvb3QsIChub2RlOiBOb2RlKSA9PiB7XG4gICAgbGV0IGxpbms6IFBhcnNlTGlua1Jlc3VsdDtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnbGluayc6XG4gICAgICAgIGxpbmsgPSBwYXJzZUxpbmtOb2RlKG5vZGUgYXMgTGluaywgc3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3aWtpTGluayc6XG4gICAgICAgIGxpbmsgPSBwYXJzZVdpa2lsaW5rTm9kZShub2RlIGFzIFdpa2lMaW5rTm9kZSwgc3RyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGVtYmVkU3ltYm9sT2Zmc2V0cy5oYXMobGluay5zdGFydE9mZnNldCAtIDEpKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICAuLi5saW5rLFxuICAgICAgICBpc0VtYmVkOiB0cnVlLFxuICAgICAgICByYXc6IGAhJHtsaW5rLnJhd31gLFxuICAgICAgICBzdGFydE9mZnNldDogbGluay5zdGFydE9mZnNldCAtIDFcbiAgICAgIH07XG4gICAgfVxuICAgIGxpbmtzLnB1c2gobGluayk7XG4gIH0pO1xuXG4gIGxpbmtzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnRPZmZzZXQgLSBiLnN0YXJ0T2Zmc2V0KTtcblxuICBsZXQgdGV4dFN0YXJ0T2Zmc2V0ID0gMDtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICBleHRyYWN0VGV4dExpbmtzKHtcbiAgICAgIGVuZE9mZnNldDogbGluay5zdGFydE9mZnNldCAtIDEsXG4gICAgICBzdGFydE9mZnNldDogdGV4dFN0YXJ0T2Zmc2V0LFxuICAgICAgc3RyLFxuICAgICAgdGV4dExpbmtzXG4gICAgfSk7XG4gICAgdGV4dFN0YXJ0T2Zmc2V0ID0gbGluay5lbmRPZmZzZXQgKyAxO1xuICB9XG5cbiAgZXh0cmFjdFRleHRMaW5rcyh7XG4gICAgZW5kT2Zmc2V0OiBzdHIubGVuZ3RoIC0gMSxcbiAgICBzdGFydE9mZnNldDogdGV4dFN0YXJ0T2Zmc2V0LFxuICAgIHN0cixcbiAgICB0ZXh0TGlua3NcbiAgfSk7XG5cbiAgbGlua3MucHVzaCguLi50ZXh0TGlua3MpO1xuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgcmV0dXJuIGxpbmtzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhwYXJhbXM6IFNob3VsZFJlc2V0QWxpYXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2VzVG9SZXNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBbdGFyZ2V0RmlsZS5wYXRoLCBvbGRUYXJnZXRQYXRoXSkge1xuICAgIGlmICghcGF0aE9yRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUobmV3U291cmNlRm9sZGVyLCBwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG9sZFNvdXJjZUZvbGRlciwgcGF0aCkpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIFtvbGRTb3VyY2VQYXRoLCBuZXdTb3VyY2VQYXRoXSkge1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBmYWxzZSkpO1xuICB9XG5cbiAgY29uc3QgY2xlYW5EaXNwbGF5VGV4dCA9IHJlcGxhY2VBbGwoe1xuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogL15cXC5cXC8vZyxcbiAgICBzdHI6IG5vcm1hbGl6ZVBhdGgoZW5zdXJlTm9uTnVsbGFibGUoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcpWzBdKSlcbiAgfSkudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEFuZ2xlQnJhY2tldHMobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaGFzQW5nbGVCcmFja2V0cyA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhbiBlbWJlZCBsaW5rOlxuICogYCFbW2xpbmtdXWAsIGAhW3RpdGxlXShsaW5rKWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYW4gZW1iZWQgbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdEVtYmVkKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdTbGFzaChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGEgd2lraWxpbmssIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbbGlua11dYCwgYCFbW2xpbmtdXWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaXMgYSB3aWtpbGlua1xuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdFdpa2lsaW5rKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVW5lc2NhcGVzIHRoZSBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKlxuICogQHBhcmFtIGVzY2FwZWRBbGlhcyAtIEFuIGVzY2FwZWQgYWxpYXMuXG4gKiBAcmV0dXJucyBBbiB1bmVzY2FwZWQgYWxpYXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiB1bmVzY2FwZUFsaWFzKCdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJykgLy8gJyoqYWxpYXMqKidcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5lc2NhcGVBbGlhcyhlc2NhcGVkQWxpYXM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFtiYWNrc2xhc2hlcyA9ICcnLCBzcGVjaWFsQ2hhciA9ICcnXSB9KSA9PiB7XG4gICAgICBjb25zdCBFU0NBUEVEX0JBQ0tTTEFTSF9MRU5HVEggPSAyO1xuICAgICAgY29uc3QgYmFja3NsYXNoQ291bnQgPSBiYWNrc2xhc2hlcy5sZW5ndGg7XG4gICAgICBjb25zdCBrZWVwQ291bnQgPSBNYXRoLmZsb29yKGJhY2tzbGFzaENvdW50IC8gRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIKTtcbiAgICAgIHJldHVybiAnXFxcXCcucmVwZWF0KGtlZXBDb3VudCkgKyBzcGVjaWFsQ2hhcjtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiAvKD88QmFja3NsYXNoZXM+XFxcXCspKD88U3BlY2lhbENoYXJhY3Rlcj5bIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dKS9nLFxuICAgIHN0cjogZXNjYXBlZEFsaWFzXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbmV3VGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KSk7XG5cbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgbGV0IHNob3VsZEtlZXBBbGlhcyA9ICFzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgc2hvdWxkS2VlcEFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIGFsaWFzID8/PSBzaG91bGRSZXNldEFsaWFzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRSZXNldEFsaWFzUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBkaXNwbGF5VGV4dDogbGluay5kaXNwbGF5VGV4dCxcbiAgICAgIGlzV2lraWxpbmssXG4gICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFRhcmdldFBhdGgsXG4gICAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gICAgfSkpXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHBhcnNlTGlua1Jlc3VsdD8uYWxpYXM7XG5cbiAgaWYgKCFzaG91bGRLZWVwQWxpYXMpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxpYXMgbWF0Y2hpbmcgYnJhbmNoZXMgYXJlIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IG5ld0xpbmsgPSBnZW5lcmF0ZU1hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhcyxcbiAgICBhcHAsXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogb2xkU291cmNlUGF0aCA9PT0gb2xkVGFyZ2V0UGF0aCAmJiAhIXBhcnNlTGlua1Jlc3VsdD8uYWxpYXMsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbCxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICB9KSk7XG4gIHJldHVybiBuZXdMaW5rO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggdXBkYXRlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudCh7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgYXBwLFxuICAgICAgICBsaW5rLFxuICAgICAgICBsaW5rU3R5bGUsXG4gICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGxpbmtzIGluIGEgZmlsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0gPSBwYXJhbXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiAhYXBwLmludGVybmFsUGx1Z2lucy5nZXRFbmFibGVkUGx1Z2luQnlJZChJbnRlcm5hbFBsdWdpbk5hbWUuQ2FudmFzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVVcmxTYWZlbHkocGFyYW1zOiBEZWNvZGVVcmxTYWZlbHlQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGhhc0FuZ2xlQnJhY2tldHMsIGlzRXh0ZXJuYWwsIHVybCB9ID0gcGFyYW1zO1xuICBpZiAoaXNFeHRlcm5hbCB8fCBoYXNBbmdsZUJyYWNrZXRzKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmwpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBkZWNvZGUgVVJMICR7dXJsfWAsIGVycm9yKTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RBbGlhcyhwYXJhbXM6IEV4dHJhY3RBbGlhc1BhcmFtcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYWxpYXNFbmRPZmZzZXQsIGFsaWFzU3RhcnRPZmZzZXQsIHN0ciB9ID0gcGFyYW1zO1xuICByZXR1cm4gYWxpYXNTdGFydE9mZnNldCA8IGFsaWFzRW5kT2Zmc2V0XG4gICAgPyBzdHIuc2xpY2UoYWxpYXNTdGFydE9mZnNldCwgYWxpYXNFbmRPZmZzZXQpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUZXh0TGlua3MocGFyYW1zOiBFeHRyYWN0VGV4dExpbmtzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgZW5kT2Zmc2V0LCBzdGFydE9mZnNldCwgc3RyLCB0ZXh0TGlua3MgfSA9IHBhcmFtcztcbiAgaWYgKHN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdGV4dFBhcnQgPSBzdHIuc2xpY2Uoc3RhcnRPZmZzZXQsIGVuZE9mZnNldCArIDEpO1xuICByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKHsgY2FwdHVyZWRHcm91cEFyZ3M6IFt1cmwgPSAnJ10sIG9mZnNldCB9KSA9PiB7XG4gICAgICBpZiAoIWlzVXJsKHVybCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0ZXh0TGlua3MucHVzaCh7XG4gICAgICAgIGVuY29kZWRVcmw6IGVuY29kZVVybCh1cmwpLFxuICAgICAgICBlbmRPZmZzZXQ6IHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0ICsgdXJsLmxlbmd0aCxcbiAgICAgICAgaGFzQW5nbGVCcmFja2V0czogZmFsc2UsXG4gICAgICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgICAgICBpc0V4dGVybmFsOiB0cnVlLFxuICAgICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgICAgcmF3OiB1cmwsXG4gICAgICAgIHN0YXJ0T2Zmc2V0OiBzdGFydE9mZnNldCArIG9mZnNldCxcbiAgICAgICAgdXJsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlOiAvKD88VXJsPlxcUyspL2csXG4gICAgc3RyOiB0ZXh0UGFydFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChwYXJhbXM6IEZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGxQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCB2YWx1ZTogY2hpbGRWYWx1ZSB9KTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgdGFyZ2V0RmlsZS5wYXRoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgICAgY29uc3Qgc2hvcnRlc3ROYW1lID0gaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgPyB0YXJnZXRGaWxlLmJhc2VuYW1lIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgICAgICBjb25zdCBtYXRjaGVkRmlsZXMgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRMaW5rcGF0aERlc3Qoc2hvcnRlc3ROYW1lLCBzb3VyY2VQYXRoKTtcbiAgICAgICAgbGlua1RleHQgPSBtYXRjaGVkRmlsZXMubGVuZ3RoID09PSAxICYmIG1hdGNoZWRGaWxlc1swXSA9PT0gdGFyZ2V0RmlsZSA/IHRhcmdldEZpbGUubmFtZSA6IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIHZhbGlkIEZpbmFsTGlua1BhdGhTdHlsZSB2YWx1ZXMgYXJlIGhhbmRsZWQgYWJvdmUuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICBzdHI6IGxpbmtUZXh0LFxuICAgICAgc3VmZml4OiBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YFxuICAgIH0pXG4gICAgOiBsaW5rVGV4dDtcbiAgbGlua1RleHQgKz0gc3VicGF0aDtcblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMuc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBwYXJhbXMuc3VicGF0aCA/PyAnJztcblxuICBjb25zdCBsaW5rQ29uZmlnID0gZ2V0TGlua0NvbmZpZyhwYXJhbXMsIHRhcmdldEZpbGUpO1xuICBjb25zdCBsaW5rVGV4dCA9IGdlbmVyYXRlTGlua1RleHQoe1xuICAgIGFwcCxcbiAgICBjb25maWc6IGxpbmtDb25maWcsXG4gICAgc291cmNlUGF0aCxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldEZpbGVcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmtDb25maWcuaXNXaWtpbGlua1xuICAgID8gZ2VuZXJhdGVXaWtpTGluayh7XG4gICAgICBhbGlhczogcGFyYW1zLmFsaWFzLFxuICAgICAgaXNFbWJlZDogbGlua0NvbmZpZy5pc0VtYmVkLFxuICAgICAgbGlua1RleHRcbiAgICB9KVxuICAgIDogZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayh7XG4gICAgICBjb25maWc6IGxpbmtDb25maWcsXG4gICAgICBsaW5rVGV4dCxcbiAgICAgIG1hcmtkb3duTGlua1BhcmFtczogcGFyYW1zLFxuICAgICAgdGFyZ2V0RmlsZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29uZmlnLCBsaW5rVGV4dCwgbWFya2Rvd25MaW5rUGFyYW1zLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCBhbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSB8fCAhbWFya2Rvd25MaW5rUGFyYW1zLmlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCkpIHtcbiAgICBhbGlhcyA9ICFtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMgfHwgaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSlcbiAgICAgID8gdGFyZ2V0RmlsZS5iYXNlbmFtZVxuICAgICAgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgc2hvdWxkRXNjYXBlQWxpYXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkOiBjb25maWcuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVdpa2lMaW5rKHBhcmFtczogR2VuZXJhdGVXaWtpTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYWxpYXMsIGlzRW1iZWQsIGxpbmtUZXh0IH0gPSBwYXJhbXM7XG4gIGlmIChhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gbGlua1RleHQudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgICBpc0VtYmVkLFxuICAgICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICAgIHVybDogYWxpYXNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVDaGFuZ2VzKHBhcmFtczogR2V0RmlsZUNoYW5nZXNQYXJhbXMpOiBQcm9taXNlPEZpbGVDaGFuZ2VbXT4ge1xuICBjb25zdCB7IGNhY2hlLCBpc0NhbnZhc0ZpbGVDYWNoZSwgbGlua0NvbnZlcnRlciB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGdldEFsbExpbmtzKGNhY2hlKSkge1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGxpbmtDb252ZXJ0ZXIobGluaywgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNoYW5nZSA9IHJlZmVyZW5jZVRvRmlsZUNoYW5nZShsaW5rLCBuZXdDb250ZW50KTtcblxuICAgIGlmIChpc0NhbnZhc0ZpbGVDYWNoZSkge1xuICAgICAgaWYgKGlzQ2FudmFzQ2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIGZpbGUgY2hhbmdlJywgZmlsZUNoYW5nZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zKSkge1xuICAgICAgICBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQgPSBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsIEVTQ0FQRURfV0lLSUxJTktfRElWSURFUik7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHA6IEFwcCwgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGUpOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1BhdGhTdHlsZSA/PyBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0O1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6XG4gICAgICByZXR1cm4gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcCk7XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGFzc2VydE5ldmVyKHJlc29sdmVkU3R5bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpbmtDb25maWcocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcywgdGFyZ2V0RmlsZTogVEZpbGUpOiBMaW5rQ29uZmlnIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gcmVxdWlyZUFwaVZlcnNpb24gZmFsbGJhY2sgaXMgb25seSByZWFjaGVkIGluIG9sZGVyIE9ic2lkaWFuIHZlcnNpb25zLiAqL1xuICAgIGlzRW1iZWQ6IHBhcmFtcy5pc0VtYmVkID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdEVtYmVkKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKVxuICAgICAgPz8gKCFyZXF1aXJlQXBpVmVyc2lvbignMS4xMC4wJykgJiYgIWlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpKSxcbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IHBhcmFtcy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkID8/IHRydWUsXG4gICAgaXNXaWtpbGluazogc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgb3JpZ2luYWxMaW5rOiBwYXJhbXMub3JpZ2luYWxMaW5rXG4gICAgfSkpLFxuICAgIGxpbmtQYXRoU3R5bGU6IGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHAsIHBhcmFtcy5saW5rUGF0aFN0eWxlKSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RBbmdsZUJyYWNrZXRzKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0TGVhZGluZ1NsYXNoKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSYXdMaW5rKG5vZGU6IE5vZGUsIHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcG9zID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBzdHIuc2xpY2UocG9zLnN0YXJ0Lm9mZnNldCwgcG9zLmVuZC5vZmZzZXQpO1xufVxuXG5mdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHBhcmFtczogSGFzQW5nbGVCcmFja2V0c0luTGlua1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IHJhdywgcmF3VXJsIH0gPSBwYXJhbXM7XG4gIGNvbnN0IE9QRU5fQU5HTEVfQlJBQ0tFVCA9ICc8JztcbiAgcmV0dXJuIHJhdy5zdGFydHNXaXRoKE9QRU5fQU5HTEVfQlJBQ0tFVCkgfHwgcmF3VXJsLnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5rTm9kZShub2RlOiBMaW5rLCBzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IExJTktfQUxJQVNfU1VGRklYID0gJ10oJztcbiAgY29uc3QgTElOS19TVUZGSVggPSAnKSc7XG4gIGNvbnN0IHJhdyA9IGdldFJhd0xpbmsobm9kZSwgc3RyKTtcbiAgY29uc3QgYWxpYXNOb2RlU3RhcnRPZmZzZXQgPSBub2RlLmNoaWxkcmVuWzBdPy5wb3NpdGlvbj8uc3RhcnQub2Zmc2V0ID8/IDE7XG4gIGNvbnN0IGFsaWFzTm9kZUVuZE9mZnNldCA9IG5vZGUuY2hpbGRyZW4uYXQoLTEpPy5wb3NpdGlvbj8uZW5kLm9mZnNldCA/PyAxO1xuICBjb25zdCBwb3NpdGlvbiA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUucG9zaXRpb24pO1xuICBjb25zdCBub2RlRW5kT2Zmc2V0ID0gZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uZW5kLm9mZnNldCk7XG4gIGNvbnN0IG5vZGVTdGFydE9mZnNldCA9IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCk7XG4gIGNvbnN0IHJhd1VybCA9IHN0ci5zbGljZShhbGlhc05vZGVFbmRPZmZzZXQgKyBMSU5LX0FMSUFTX1NVRkZJWC5sZW5ndGgsIG5vZGVFbmRPZmZzZXQgLSBMSU5LX1NVRkZJWC5sZW5ndGgpO1xuICBjb25zdCBoYXNBbmdsZUJyYWNrZXRzID0gaGFzQW5nbGVCcmFja2V0c0luTGluayh7XG4gICAgcmF3LFxuICAgIHJhd1VybFxuICB9KTtcbiAgY29uc3QgaXNFeHRlcm5hbCA9IGlzVXJsKG5vZGUudXJsKTtcbiAgY29uc3QgdXJsID0gZGVjb2RlVXJsU2FmZWx5KHtcbiAgICBoYXNBbmdsZUJyYWNrZXRzLFxuICAgIGlzRXh0ZXJuYWwsXG4gICAgdXJsOiBub2RlLnVybFxuICB9KTtcbiAgY29uc3QgYWxpYXMgPSBleHRyYWN0QWxpYXMoe1xuICAgIGFsaWFzRW5kT2Zmc2V0OiBhbGlhc05vZGVFbmRPZmZzZXQsXG4gICAgYWxpYXNTdGFydE9mZnNldDogYWxpYXNOb2RlU3RhcnRPZmZzZXQsXG4gICAgc3RyXG4gIH0pO1xuICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFBhcnNlTGlua1Jlc3VsdD4oe1xuICAgIGFsaWFzLFxuICAgIGVuY29kZWRVcmw6IGlzRXh0ZXJuYWwgPyBlbmNvZGVVcmwodXJsKSA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IG5vZGVFbmRPZmZzZXQsXG4gICAgaGFzQW5nbGVCcmFja2V0cyxcbiAgICBpc0VtYmVkOiBmYWxzZSxcbiAgICBpc0V4dGVybmFsLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHJhdyxcbiAgICBzdGFydE9mZnNldDogbm9kZVN0YXJ0T2Zmc2V0LFxuICAgIHRpdGxlOiBub2RlLnRpdGxlID8/IHVuZGVmaW5lZCxcbiAgICB1bmVzY2FwZWRBbGlhczogYWxpYXMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVuZXNjYXBlQWxpYXMoYWxpYXMpLFxuICAgIHVybFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VXaWtpbGlua05vZGUobm9kZTogV2lraUxpbmtOb2RlLCBzdHI6IHN0cmluZyk6IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXM6IHN0ci5pbmNsdWRlcyhXSUtJTElOS19ESVZJREVSKSA/IG5vZGUuZGF0YS5hbGlhcyA6IHVuZGVmaW5lZCxcbiAgICBlbmRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLmVuZC5vZmZzZXQpLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWw6IGZhbHNlLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgcmF3OiBnZXRSYXdMaW5rKG5vZGUsIHN0ciksXG4gICAgc3RhcnRPZmZzZXQ6IGVuc3VyZU5vbk51bGxhYmxlKHBvc2l0aW9uLnN0YXJ0Lm9mZnNldCksXG4gICAgdXJsOiBub2RlLnZhbHVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwOiBBcHApOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCBuZXdMaW5rRm9ybWF0ID0gZ2V0TmV3TGlua0Zvcm1hdChhcHApO1xuICBzd2l0Y2ggKG5ld0xpbmtGb3JtYXQpIHtcbiAgICBjYXNlICdhYnNvbHV0ZSc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICBjYXNlICdzaG9ydGVzdCc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgaWYgKCFVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAudGVzdChmaWxlQ2hhbmdlLm5ld0NvbnRlbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlUG9zaXRpb25zLnNvbWUoKHRhYmxlUG9zaXRpb24pID0+IHRhYmxlUG9zaXRpb24uc3RhcnQgPD0gZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uc3RhcnQub2Zmc2V0ICYmIGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLmVuZC5vZmZzZXQgPD0gdGFibGVQb3NpdGlvbi5lbmQpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKHBhcmFtczogU2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGFwcCwgbGlua1N0eWxlLCBvcmlnaW5hbExpbmsgfSA9IHBhcmFtcztcbiAgY29uc3QgcmVzb2x2ZWRTdHlsZSA9IGxpbmtTdHlsZSA/PyBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZztcbiAgc3dpdGNoIChyZXNvbHZlZFN0eWxlKSB7XG4gICAgY2FzZSBMaW5rU3R5bGUuTWFya2Rvd246XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSBMaW5rU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6XG4gICAgICByZXR1cm4gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCk7XG4gICAgY2FzZSBMaW5rU3R5bGUuUHJlc2VydmVFeGlzdGluZzpcbiAgICAgIHJldHVybiBvcmlnaW5hbExpbmsgPT09IHVuZGVmaW5lZCA/IHNob3VsZFVzZVdpa2lsaW5rcyhhcHApIDogdGVzdFdpa2lsaW5rKG9yaWdpbmFsTGluayk7XG4gICAgY2FzZSBMaW5rU3R5bGUuV2lraWxpbms6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixPQUFPLGlCQUFpQjtBQUN4QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLGFBQWE7QUFXdEIsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxnQ0FBZ0M7QUFDekM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGFBQWE7QUFDdEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsTUFBTSwyQkFBMkI7QUFNakMsTUFBTSw4QkFBOEI7QUFLcEMsTUFB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