obsidian-dev-utils 84.6.1 → 85.1.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 (216) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/dev/main.js +32702 -0
  3. package/dist/dev/manifest.json +9 -0
  4. package/dist/lib/cjs/async-events.cjs +4 -1
  5. package/dist/lib/cjs/async-events.d.cts +4 -1
  6. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  7. package/dist/lib/cjs/obsidian/active-file-provider.cjs +1 -1
  8. package/dist/lib/cjs/obsidian/active-file-provider.d.cts +1 -1
  9. package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +1 -1
  10. package/dist/lib/cjs/obsidian/bases-view-registrar.d.cts +1 -1
  11. package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +1 -1
  12. package/dist/lib/cjs/obsidian/case-insensitive-file-index.d.cts +1 -1
  13. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +16 -1
  14. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +20 -5
  15. package/dist/lib/cjs/obsidian/command-handlers/index.cjs +6 -3
  16. package/dist/lib/cjs/obsidian/command-handlers/index.d.cts +1 -0
  17. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +7 -1
  18. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.d.cts +8 -2
  19. package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +183 -0
  20. package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.d.cts +54 -0
  21. package/dist/lib/cjs/obsidian/command-registrar.cjs +1 -1
  22. package/dist/lib/cjs/obsidian/command-registrar.d.cts +1 -1
  23. package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +1 -1
  24. package/dist/lib/cjs/obsidian/components/abort-signal-component.d.cts +1 -1
  25. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +1 -1
  26. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +1 -1
  27. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +1 -1
  28. package/dist/lib/cjs/obsidian/components/async-error-handler-component.d.cts +1 -1
  29. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +7 -1
  30. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.d.cts +9 -2
  31. package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +1 -1
  32. package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +1 -1
  33. package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +1 -1
  34. package/dist/lib/cjs/obsidian/components/embed-extensions-component.d.cts +1 -1
  35. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +4 -1
  36. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.d.cts +4 -1
  37. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +1 -1
  38. package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +1 -1
  39. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +1 -1
  40. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +1 -1
  41. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +7 -1
  42. package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +8 -2
  43. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +1 -1
  44. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +1 -1
  45. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +13 -4
  46. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +12 -3
  47. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +7 -1
  48. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +8 -2
  49. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +29 -8
  50. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +34 -7
  51. package/dist/lib/cjs/obsidian/data-handler.cjs +1 -1
  52. package/dist/lib/cjs/obsidian/data-handler.d.cts +1 -1
  53. package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +1 -1
  54. package/dist/lib/cjs/obsidian/editor-extension-registrar.d.cts +1 -1
  55. package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +1 -1
  56. package/dist/lib/cjs/obsidian/editor-suggest-registrar.d.cts +1 -1
  57. package/dist/lib/cjs/obsidian/extensions-registrar.cjs +1 -1
  58. package/dist/lib/cjs/obsidian/extensions-registrar.d.cts +1 -1
  59. package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +1 -1
  60. package/dist/lib/cjs/obsidian/hover-link-source-registrar.d.cts +1 -1
  61. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  62. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  63. package/dist/lib/cjs/obsidian/link.cjs +93 -244
  64. package/dist/lib/cjs/obsidian/link.d.cts +98 -148
  65. package/dist/lib/cjs/obsidian/loop.cjs +2 -2
  66. package/dist/lib/cjs/obsidian/loop.d.cts +17 -3
  67. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +4 -1
  68. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +4 -1
  69. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +1 -1
  70. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +1 -1
  71. package/dist/lib/cjs/obsidian/metadata-cache.cjs +141 -43
  72. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +171 -9
  73. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +7 -4
  74. package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +8 -1
  75. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +4 -1
  76. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.d.cts +4 -1
  77. package/dist/lib/cjs/obsidian/parse-link.cjs +476 -0
  78. package/dist/lib/cjs/obsidian/parse-link.d.cts +268 -0
  79. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +1 -1
  80. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +1 -1
  81. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +1 -1
  82. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.d.cts +1 -1
  83. package/dist/lib/cjs/obsidian/resource-lock.cjs +155 -20
  84. package/dist/lib/cjs/obsidian/resource-lock.d.cts +93 -22
  85. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +1 -1
  86. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +1 -1
  87. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -16
  88. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +17 -5
  89. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +4 -1
  90. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +5 -2
  91. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +11 -2
  92. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +12 -3
  93. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +8 -2
  94. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +9 -3
  95. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +8 -2
  96. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +9 -2
  97. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +1 -1
  98. package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +1 -1
  99. package/dist/lib/cjs/obsidian/vault-transaction.cjs +4 -1
  100. package/dist/lib/cjs/obsidian/vault-transaction.d.cts +4 -1
  101. package/dist/lib/cjs/obsidian/vault.cjs +2 -2
  102. package/dist/lib/cjs/obsidian/view-registrar.cjs +1 -1
  103. package/dist/lib/cjs/obsidian/view-registrar.d.cts +1 -1
  104. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +4 -2
  105. package/dist/lib/cjs/transformers/group-transformer.cjs +1 -1
  106. package/dist/lib/cjs/transformers/group-transformer.d.cts +1 -1
  107. package/dist/lib/cjs/url.cjs +14 -3
  108. package/dist/lib/cjs/url.d.cts +15 -0
  109. package/dist/lib/esm/async-events.d.mts +4 -1
  110. package/dist/lib/esm/async-events.mjs +4 -1
  111. package/dist/lib/esm/generated-during-build.mjs +1 -1
  112. package/dist/lib/esm/obsidian/active-file-provider.d.mts +1 -1
  113. package/dist/lib/esm/obsidian/active-file-provider.mjs +1 -1
  114. package/dist/lib/esm/obsidian/bases-view-registrar.d.mts +1 -1
  115. package/dist/lib/esm/obsidian/bases-view-registrar.mjs +1 -1
  116. package/dist/lib/esm/obsidian/case-insensitive-file-index.d.mts +1 -1
  117. package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +1 -1
  118. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +20 -5
  119. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +16 -1
  120. package/dist/lib/esm/obsidian/command-handlers/index.d.mts +1 -0
  121. package/dist/lib/esm/obsidian/command-handlers/index.mjs +4 -2
  122. package/dist/lib/esm/obsidian/command-handlers/open-settings-command-handler.d.mts +8 -2
  123. package/dist/lib/esm/obsidian/command-handlers/open-settings-command-handler.mjs +7 -1
  124. package/dist/lib/esm/obsidian/command-handlers/unlock-active-note-command-handler.d.mts +54 -0
  125. package/dist/lib/esm/obsidian/command-handlers/unlock-active-note-command-handler.mjs +75 -0
  126. package/dist/lib/esm/obsidian/command-registrar.d.mts +1 -1
  127. package/dist/lib/esm/obsidian/command-registrar.mjs +1 -1
  128. package/dist/lib/esm/obsidian/components/abort-signal-component.d.mts +1 -1
  129. package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +1 -1
  130. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +1 -1
  131. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
  132. package/dist/lib/esm/obsidian/components/async-error-handler-component.d.mts +1 -1
  133. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +1 -1
  134. package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.d.mts +9 -2
  135. package/dist/lib/esm/obsidian/components/case-insensitive-file-index-component.mjs +7 -1
  136. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +1 -1
  137. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +1 -1
  138. package/dist/lib/esm/obsidian/components/embed-extensions-component.d.mts +1 -1
  139. package/dist/lib/esm/obsidian/components/embed-extensions-component.mjs +1 -1
  140. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.d.mts +4 -1
  141. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.mjs +4 -1
  142. package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +1 -1
  143. package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +1 -1
  144. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +1 -1
  145. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +1 -1
  146. package/dist/lib/esm/obsidian/components/plugin-context-component.d.mts +8 -2
  147. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +7 -1
  148. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +1 -1
  149. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +1 -1
  150. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +12 -3
  151. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +13 -4
  152. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.d.mts +8 -2
  153. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +7 -1
  154. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +34 -7
  155. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +30 -9
  156. package/dist/lib/esm/obsidian/data-handler.d.mts +1 -1
  157. package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
  158. package/dist/lib/esm/obsidian/editor-extension-registrar.d.mts +1 -1
  159. package/dist/lib/esm/obsidian/editor-extension-registrar.mjs +1 -1
  160. package/dist/lib/esm/obsidian/editor-suggest-registrar.d.mts +1 -1
  161. package/dist/lib/esm/obsidian/editor-suggest-registrar.mjs +1 -1
  162. package/dist/lib/esm/obsidian/extensions-registrar.d.mts +1 -1
  163. package/dist/lib/esm/obsidian/extensions-registrar.mjs +1 -1
  164. package/dist/lib/esm/obsidian/hover-link-source-registrar.d.mts +1 -1
  165. package/dist/lib/esm/obsidian/hover-link-source-registrar.mjs +1 -1
  166. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  167. package/dist/lib/esm/obsidian/index.mjs +3 -1
  168. package/dist/lib/esm/obsidian/link.d.mts +98 -148
  169. package/dist/lib/esm/obsidian/link.mjs +90 -222
  170. package/dist/lib/esm/obsidian/loop.d.mts +17 -3
  171. package/dist/lib/esm/obsidian/loop.mjs +2 -2
  172. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +4 -1
  173. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +4 -1
  174. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +1 -1
  175. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +1 -1
  176. package/dist/lib/esm/obsidian/metadata-cache.d.mts +171 -9
  177. package/dist/lib/esm/obsidian/metadata-cache.mjs +142 -42
  178. package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +8 -1
  179. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +7 -4
  180. package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.d.mts +4 -1
  181. package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.mjs +4 -1
  182. package/dist/lib/esm/obsidian/parse-link.d.mts +268 -0
  183. package/dist/lib/esm/obsidian/parse-link.mjs +353 -0
  184. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +1 -1
  185. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +1 -1
  186. package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.d.mts +1 -1
  187. package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.mjs +1 -1
  188. package/dist/lib/esm/obsidian/resource-lock.d.mts +93 -22
  189. package/dist/lib/esm/obsidian/resource-lock.mjs +155 -20
  190. package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +1 -1
  191. package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
  192. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +17 -5
  193. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +28 -16
  194. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +5 -2
  195. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +4 -1
  196. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +12 -3
  197. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +11 -2
  198. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +9 -3
  199. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +8 -2
  200. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +9 -2
  201. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -2
  202. package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +1 -1
  203. package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +1 -1
  204. package/dist/lib/esm/obsidian/vault-transaction.d.mts +4 -1
  205. package/dist/lib/esm/obsidian/vault-transaction.mjs +4 -1
  206. package/dist/lib/esm/obsidian/vault.mjs +2 -2
  207. package/dist/lib/esm/obsidian/view-registrar.d.mts +1 -1
  208. package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
  209. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +4 -2
  210. package/dist/lib/esm/transformers/group-transformer.d.mts +1 -1
  211. package/dist/lib/esm/transformers/group-transformer.mjs +1 -1
  212. package/dist/lib/esm/url.d.mts +15 -0
  213. package/dist/lib/esm/url.mjs +11 -2
  214. package/obsidian/command-handlers/unlock-active-note-command-handler/package.json +6 -0
  215. package/obsidian/parse-link/package.json +6 -0
  216. package/package.json +7 -7
@@ -71,10 +71,6 @@ import {
71
71
  normalizePath,
72
72
  parseLinktext
73
73
  } from "obsidian";
74
- import { remark } from "remark";
75
- import remarkParse from "remark-parse";
76
- import { wikiLinkPlugin } from "remark-wiki-link";
77
- import { visit } from "unist-util-visit";
78
74
  import { abortSignalNever } from "../abort-controller.mjs";
79
75
  import { normalizeOptionalProperties } from "../object-utils.mjs";
80
76
  import { getObsidianDevUtilsState } from "../obsidian-dev-utils-state.mjs";
@@ -95,7 +91,7 @@ import {
95
91
  assertNonNullable,
96
92
  ensureNonNullable
97
93
  } from "../type-guards.mjs";
98
- import { isUrl } from "../url.mjs";
94
+ import { normalizeFileUrl } from "../url.mjs";
99
95
  import {
100
96
  applyContentChanges,
101
97
  applyFileChanges,
@@ -110,9 +106,9 @@ import {
110
106
  MARKDOWN_FILE_EXTENSION
111
107
  } from "./file-system.mjs";
112
108
  import {
113
- getAllLinks,
114
109
  getBacklinksForFileSafe,
115
110
  getCacheSafe,
111
+ getLinks,
116
112
  parseMetadata,
117
113
  registerFiles
118
114
  } from "./metadata-cache.mjs";
@@ -120,15 +116,19 @@ import {
120
116
  getNewLinkFormat,
121
117
  shouldUseWikilinks
122
118
  } from "./obsidian-settings.mjs";
119
+ import {
120
+ encodeUrl,
121
+ escapeAlias,
122
+ isParseLinkFrontmatterReference,
123
+ isParseLinkReference,
124
+ parseLink
125
+ } from "./parse-link.mjs";
123
126
  import {
124
127
  isCanvasFileNodeReference,
125
128
  referenceToFileChange
126
129
  } from "./reference.mjs";
127
130
  const ESCAPED_WIKILINK_DIVIDER = "\\|";
128
- const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
129
- const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
130
131
  const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g;
131
- const WIKILINK_DIVIDER = "|";
132
132
  var LinkPathStyle = /* @__PURE__ */ ((LinkPathStyle2) => {
133
133
  LinkPathStyle2["AbsolutePathInVault"] = "AbsolutePathInVault";
134
134
  LinkPathStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
@@ -192,12 +192,19 @@ async function editLinks(params) {
192
192
  app,
193
193
  linkConverter,
194
194
  pathOrFile,
195
+ shouldEditExternalLinks = false,
196
+ shouldEditFrontmatterExternalLinks = false,
197
+ shouldEditMultiValueFrontmatterExternalLinks = false,
195
198
  ...options
196
199
  } = params;
197
200
  await applyFileChanges({
198
201
  app,
199
202
  changesProvider: async ({ abortSignal, content }) => {
200
- const cache = await getCacheSafe(app, pathOrFile);
203
+ const cache = await getCacheSafe(app, pathOrFile, {
204
+ shouldParseExternalLinks: shouldEditExternalLinks,
205
+ shouldParseFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
206
+ shouldParseMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
207
+ });
201
208
  abortSignal.throwIfAborted();
202
209
  const file = getFile({ app, pathOrFile });
203
210
  const cachedContent = await app.vault.cachedRead(file);
@@ -209,7 +216,10 @@ async function editLinks(params) {
209
216
  abortSignal,
210
217
  cache,
211
218
  isCanvasFileCache: isCanvasFile(pathOrFile),
212
- linkConverter
219
+ linkConverter,
220
+ shouldIncludeExternalLinks: shouldEditExternalLinks,
221
+ shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
222
+ shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
213
223
  });
214
224
  },
215
225
  pathOrFile,
@@ -217,20 +227,27 @@ async function editLinks(params) {
217
227
  });
218
228
  }
219
229
  async function editLinksInContent(params) {
220
- const { app, content, linkConverter } = params;
230
+ const { app, content, linkConverter, shouldEditExternalLinks = false, shouldEditFrontmatterExternalLinks = false, shouldEditMultiValueFrontmatterExternalLinks = false } = params;
221
231
  let { abortSignal } = params;
222
232
  abortSignal ??= abortSignalNever();
223
233
  abortSignal.throwIfAborted();
224
234
  const newContent = await applyContentChanges({
225
235
  abortSignal,
226
236
  changesProvider: async () => {
227
- const cache = await parseMetadata(app, content);
237
+ const cache = await parseMetadata(app, content, {
238
+ shouldParseExternalLinks: shouldEditExternalLinks,
239
+ shouldParseFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
240
+ shouldParseMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
241
+ });
228
242
  abortSignal.throwIfAborted();
229
243
  const changes = await getFileChanges({
230
244
  abortSignal,
231
245
  cache,
232
246
  isCanvasFileCache: false,
233
- linkConverter
247
+ linkConverter,
248
+ shouldIncludeExternalLinks: shouldEditExternalLinks,
249
+ shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
250
+ shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
234
251
  });
235
252
  abortSignal.throwIfAborted();
236
253
  return changes;
@@ -242,20 +259,6 @@ async function editLinksInContent(params) {
242
259
  assertNonNullable(newContent, "Failed to update links in content");
243
260
  return newContent;
244
261
  }
245
- function encodeUrl(url) {
246
- return replaceAll({
247
- replacer: ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol),
248
- searchValue: SPECIAL_LINK_SYMBOLS_REGEXP,
249
- str: url
250
- });
251
- }
252
- function escapeAlias(alias) {
253
- return replaceAll({
254
- replacer: "\\$&",
255
- searchValue: SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX,
256
- str: alias
257
- });
258
- }
259
262
  function extractLinkFile(params) {
260
263
  const {
261
264
  app,
@@ -318,79 +321,6 @@ function generateRawMarkdownLink(params) {
318
321
  function getGenerateMarkdownLinkDefaultParamsFns() {
319
322
  return getObsidianDevUtilsState("generateMarkdownLinkDefaultParamsFns", []).value;
320
323
  }
321
- function parseLink(str) {
322
- const links = parseLinks(str);
323
- return links[0]?.raw === str ? links[0] : null;
324
- }
325
- function parseLinks(str) {
326
- const embedSymbolOffsets = /* @__PURE__ */ new Set();
327
- const EMBED_LINK_PREFIX = "![";
328
- const NO_EMBED_LINK_PREFIX = "@[";
329
- const DUMMY_CHARACTER = "@";
330
- const EMBED_INSIDE_LINK_REG_EXP = /\[(?<LinkAlias>!\[.*?\]\(.+?\))\]\((?<Link>.+?)\)/g;
331
- const noInsideEmbedsLinksStr = replaceAll({
332
- replacer: ({ capturedGroupArgs: [linkAlias = "", link = ""] }) => {
333
- const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length);
334
- return `[${dummyAlias}](${link})`;
335
- },
336
- searchValue: EMBED_INSIDE_LINK_REG_EXP,
337
- str
338
- });
339
- const noEmbedStr = replaceAll({
340
- replacer: (args) => {
341
- embedSymbolOffsets.add(args.offset);
342
- return NO_EMBED_LINK_PREFIX;
343
- },
344
- searchValue: EMBED_LINK_PREFIX,
345
- str: noInsideEmbedsLinksStr
346
- });
347
- const processor = remark().use(remarkParse).use(wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
348
- const root = processor.parse(noEmbedStr);
349
- const links = [];
350
- const textLinks = [];
351
- visit(root, (node) => {
352
- let link;
353
- switch (node.type) {
354
- case "link":
355
- link = parseLinkNode(node, str);
356
- break;
357
- case "wikiLink":
358
- link = parseWikilinkNode(node, str);
359
- break;
360
- default:
361
- return;
362
- }
363
- if (embedSymbolOffsets.has(link.startOffset - 1)) {
364
- link = {
365
- ...link,
366
- isEmbed: true,
367
- raw: `!${link.raw}`,
368
- startOffset: link.startOffset - 1
369
- };
370
- }
371
- links.push(link);
372
- });
373
- links.sort((a, b) => a.startOffset - b.startOffset);
374
- let textStartOffset = 0;
375
- for (const link of links) {
376
- extractTextLinks({
377
- endOffset: link.startOffset - 1,
378
- startOffset: textStartOffset,
379
- str,
380
- textLinks
381
- });
382
- textStartOffset = link.endOffset + 1;
383
- }
384
- extractTextLinks({
385
- endOffset: str.length - 1,
386
- startOffset: textStartOffset,
387
- str,
388
- textLinks
389
- });
390
- links.push(...textLinks);
391
- links.sort((a, b) => a.startOffset - b.startOffset);
392
- return links;
393
- }
394
324
  function shouldResetAlias(params) {
395
325
  const {
396
326
  app,
@@ -470,16 +400,33 @@ function testWikilink(link) {
470
400
  const parseLinkResult = parseLink(link);
471
401
  return parseLinkResult?.isWikilink ?? false;
472
402
  }
473
- function unescapeAlias(escapedAlias) {
474
- return replaceAll({
475
- replacer: ({ capturedGroupArgs: [backslashes = "", specialChar = ""] }) => {
476
- const ESCAPED_BACKSLASH_LENGTH = 2;
477
- const backslashCount = backslashes.length;
478
- const keepCount = Math.floor(backslashCount / ESCAPED_BACKSLASH_LENGTH);
479
- return "\\".repeat(keepCount) + specialChar;
480
- },
481
- searchValue: /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g,
482
- str: escapedAlias
403
+ async function updateFileUrlLinksInContent(params) {
404
+ const { app, content, shouldUseAngleBrackets = false } = params;
405
+ return await editLinksInContent(normalizeOptionalProperties({
406
+ abortSignal: params.abortSignal,
407
+ app,
408
+ content,
409
+ linkConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
410
+ shouldEditExternalLinks: true,
411
+ shouldEditFrontmatterExternalLinks: true,
412
+ shouldEditMultiValueFrontmatterExternalLinks: true
413
+ }));
414
+ }
415
+ async function updateFileUrlLinksInFile(params) {
416
+ const {
417
+ app,
418
+ pathOrFile,
419
+ shouldUseAngleBrackets = false,
420
+ ...options
421
+ } = params;
422
+ await editLinks({
423
+ app,
424
+ linkConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
425
+ pathOrFile,
426
+ shouldEditExternalLinks: true,
427
+ shouldEditFrontmatterExternalLinks: true,
428
+ shouldEditMultiValueFrontmatterExternalLinks: true,
429
+ ...options
483
430
  });
484
431
  }
485
432
  function updateLink(params) {
@@ -605,49 +552,6 @@ async function updateLinksInFile(params) {
605
552
  pathOrFile: newSourcePathOrFile
606
553
  });
607
554
  }
608
- function decodeUrlSafely(params) {
609
- const { hasAngleBrackets, isExternal, url } = params;
610
- if (isExternal || hasAngleBrackets) {
611
- return url;
612
- }
613
- try {
614
- return decodeURIComponent(url);
615
- } catch (error) {
616
- console.error(`Failed to decode URL ${url}`, error);
617
- return url;
618
- }
619
- }
620
- function extractAlias(params) {
621
- const { aliasEndOffset, aliasStartOffset, str } = params;
622
- return aliasStartOffset < aliasEndOffset ? str.slice(aliasStartOffset, aliasEndOffset) : void 0;
623
- }
624
- function extractTextLinks(params) {
625
- const { endOffset, startOffset, str, textLinks } = params;
626
- if (startOffset > endOffset) {
627
- return;
628
- }
629
- const textPart = str.slice(startOffset, endOffset + 1);
630
- replaceAll({
631
- replacer: ({ capturedGroupArgs: [url = ""], offset }) => {
632
- if (!isUrl(url)) {
633
- return;
634
- }
635
- textLinks.push({
636
- encodedUrl: encodeUrl(url),
637
- endOffset: startOffset + offset + url.length,
638
- hasAngleBrackets: false,
639
- isEmbed: false,
640
- isExternal: true,
641
- isWikilink: false,
642
- raw: url,
643
- startOffset: startOffset + offset,
644
- url
645
- });
646
- },
647
- searchValue: /(?<Url>\S+)/g,
648
- str: textPart
649
- });
650
- }
651
555
  function fixFrontmatterMarkdownLinksImpl(params) {
652
556
  const {
653
557
  cache,
@@ -786,7 +690,14 @@ function generateWikiLink(params) {
786
690
  });
787
691
  }
788
692
  async function getFileChanges(params) {
789
- const { cache, isCanvasFileCache, linkConverter } = params;
693
+ const {
694
+ cache,
695
+ isCanvasFileCache,
696
+ linkConverter,
697
+ shouldIncludeExternalLinks = false,
698
+ shouldIncludeFrontmatterExternalLinks = false,
699
+ shouldIncludeMultiValueFrontmatterExternalLinks = false
700
+ } = params;
790
701
  let { abortSignal } = params;
791
702
  abortSignal ??= abortSignalNever();
792
703
  abortSignal.throwIfAborted();
@@ -798,7 +709,7 @@ async function getFileChanges(params) {
798
709
  end: section.position.end.offset,
799
710
  start: section.position.start.offset
800
711
  }));
801
- for (const link of getAllLinks(cache)) {
712
+ for (const link of getLinks({ cache, shouldIncludeExternalLinks, shouldIncludeFrontmatterExternalLinks, shouldIncludeMultiValueFrontmatterExternalLinks })) {
802
713
  abortSignal.throwIfAborted();
803
714
  const newContent = await linkConverter(link, abortSignal);
804
715
  abortSignal.throwIfAborted();
@@ -853,67 +764,27 @@ function getLinkConfig(params) {
853
764
  shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths ?? (params.originalLink ? testLeadingSlash(params.originalLink) : void 0) ?? false
854
765
  };
855
766
  }
856
- function getRawLink(node, str) {
857
- const pos = ensureNonNullable(node.position);
858
- return str.slice(pos.start.offset, pos.end.offset);
859
- }
860
- function hasAngleBracketsInLink(params) {
861
- const { raw, rawUrl } = params;
862
- const OPEN_ANGLE_BRACKET = "<";
863
- return raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
864
- }
865
- function parseLinkNode(node, str) {
866
- const LINK_ALIAS_SUFFIX = "](";
867
- const LINK_SUFFIX = ")";
868
- const raw = getRawLink(node, str);
869
- const aliasNodeStartOffset = node.children[0]?.position?.start.offset ?? 1;
870
- const aliasNodeEndOffset = node.children.at(-1)?.position?.end.offset ?? 1;
871
- const position = ensureNonNullable(node.position);
872
- const nodeEndOffset = ensureNonNullable(position.end.offset);
873
- const nodeStartOffset = ensureNonNullable(position.start.offset);
874
- const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, nodeEndOffset - LINK_SUFFIX.length);
875
- const hasAngleBrackets = hasAngleBracketsInLink({
876
- raw,
877
- rawUrl
878
- });
879
- const isExternal = isUrl(node.url);
880
- const url = decodeUrlSafely({
881
- hasAngleBrackets,
882
- isExternal,
883
- url: node.url
884
- });
885
- const alias = extractAlias({
886
- aliasEndOffset: aliasNodeEndOffset,
887
- aliasStartOffset: aliasNodeStartOffset,
888
- str
889
- });
890
- return normalizeOptionalProperties({
891
- alias,
892
- encodedUrl: isExternal ? encodeUrl(url) : void 0,
893
- endOffset: nodeEndOffset,
894
- hasAngleBrackets,
895
- isEmbed: false,
896
- isExternal,
767
+ function normalizeFileUrlLink(link, shouldUseAngleBrackets) {
768
+ if (isParseLinkFrontmatterReference(link)) {
769
+ if (!link.parseLinkResult.isFileUrl) {
770
+ return;
771
+ }
772
+ return normalizeFileUrl(link.parseLinkResult.url);
773
+ }
774
+ if (!isParseLinkReference(link)) {
775
+ return;
776
+ }
777
+ const { parseLinkResult } = link;
778
+ if (!parseLinkResult.isFileUrl) {
779
+ return;
780
+ }
781
+ return generateRawMarkdownLink(normalizeOptionalProperties({
782
+ alias: parseLinkResult.alias,
783
+ isEmbed: parseLinkResult.isEmbed,
897
784
  isWikilink: false,
898
- raw,
899
- startOffset: nodeStartOffset,
900
- title: node.title ?? void 0,
901
- unescapedAlias: alias === void 0 ? void 0 : unescapeAlias(alias),
902
- url
903
- });
904
- }
905
- function parseWikilinkNode(node, str) {
906
- const position = ensureNonNullable(node.position);
907
- return normalizeOptionalProperties({
908
- alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0,
909
- endOffset: ensureNonNullable(position.end.offset),
910
- isEmbed: false,
911
- isExternal: false,
912
- isWikilink: true,
913
- raw: getRawLink(node, str),
914
- startOffset: ensureNonNullable(position.start.offset),
915
- url: node.value
916
- });
785
+ shouldUseAngleBrackets,
786
+ url: normalizeFileUrl(parseLinkResult.url)
787
+ }));
917
788
  }
918
789
  function resolveFinalLinkPathStyleFromObsidianSettings(app) {
919
790
  const newLinkFormat = getNewLinkFormat(app);
@@ -960,15 +831,11 @@ export {
960
831
  editBacklinks,
961
832
  editLinks,
962
833
  editLinksInContent,
963
- encodeUrl,
964
- escapeAlias,
965
834
  extractLinkFile,
966
835
  fixFrontmatterMarkdownLinks,
967
836
  generateMarkdownLink,
968
837
  generateRawMarkdownLink,
969
838
  getGenerateMarkdownLinkDefaultParamsFns,
970
- parseLink,
971
- parseLinks,
972
839
  shouldResetAlias,
973
840
  splitSubpath,
974
841
  testAngleBrackets,
@@ -976,9 +843,10 @@ export {
976
843
  testLeadingDot,
977
844
  testLeadingSlash,
978
845
  testWikilink,
979
- unescapeAlias,
846
+ updateFileUrlLinksInContent,
847
+ updateFileUrlLinksInFile,
980
848
  updateLink,
981
849
  updateLinksInContent,
982
850
  updateLinksInFile
983
851
  };
984
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExpbmsgfSBmcm9tICdtZGFzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgeyByZW1hcmsgfSBmcm9tICdyZW1hcmsnO1xuaW1wb3J0IHJlbWFya1BhcnNlIGZyb20gJ3JlbWFyay1wYXJzZSc7XG5pbXBvcnQgeyB3aWtpTGlua1BsdWdpbiB9IGZyb20gJ3JlbWFyay13aWtpLWxpbmsnO1xuaW1wb3J0IHsgdmlzaXQgfSBmcm9tICd1bmlzdC11dGlsLXZpc2l0JztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJldHVybiB9IGZyb20gJy4uL3R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBGaWxlQ2hhbmdlIH0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIEdldEZpbGVQYXJhbXMsXG4gIFBhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICcuLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJy4uL3N0cmluZy50cyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgYXNzZXJ0Tm9uTnVsbGFibGUsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IGlzVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gJ1xcXFx8JztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbGluayBzeW1ib2xzLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCAtLSBUaGUgcmVndWxhciBleHByZXNzaW9uIGlzIHdyaXR0ZW4gdG8gY2FwdHVyZSBjb250cm9sIGNoYXJhY3RlcnMuXG5jb25zdCBTUEVDSUFMX0xJTktfU1lNQk9MU19SRUdFWFAgPSAvW1xcXFxcXHgwMFxceDA4XFx4MEJcXHgwQ1xceDBFLVxceDFGIF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNwZWNpYWwgbWFya2Rvd24gbGluayBzeW1ib2xzLlxuICovXG5jb25zdCBTUEVDSUFMX01BUktET1dOX0xJTktfU1lNQk9MU19SRUdFWCA9IC9bXFxcXFtcXF08Pl8qfj1gJF0vZztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG5jb25zdCBXSUtJTElOS19ESVZJREVSID0gJ3wnO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gZWRpdCB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+Pjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRMaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleHRyYWN0TGlua0ZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RMaW5rRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBjYWNoZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgZm9yIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1thbGlhc3xsaW5rXV1gXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKGxpbmsubWQpYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtbdGFyZ2V0XV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1t0YXJnZXRdXWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mXG4gICAqXG4gICAqIC0ge0BsaW5rIGlzRW1iZWR9XG4gICAqIC0ge0BsaW5rIGxpbmtTdHlsZX1cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlQW5nbGVCcmFja2V0c31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHN9XG4gICAqXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzV2lraWxpbmt9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNXaWtpbGlua30gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICByZWFkb25seSBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBbYWxpYXNdKGxpbmsubWQpXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCBcInRpdGxlXCIpIC0+IHRpdGxlXG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIHVuZXNjYXBlZCBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gKmFsaWFzKlxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHVuZXNjYXBlZEFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmslMjB3aXRoJTIwc3BhY2UubWQpIC0+IGxpbmsgd2l0aCBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFJlc2V0QWxpYXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZGVjb2RlVXJsU2FmZWx5fS5cbiAqL1xuaW50ZXJmYWNlIERlY29kZVVybFNhZmVseVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMuXG4gICAqL1xuICByZWFkb25seSBoYXNBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIGlzIGV4dGVybmFsLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBVUkwgdG8gZGVjb2RlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZXh0cmFjdEFsaWFzfS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBhbGlhcyBpbiB0aGUgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNFbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIGFsaWFzIGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc1N0YXJ0T2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIGFsaWFzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzdHI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBleHRyYWN0VGV4dExpbmtzfS5cbiAqL1xuaW50ZXJmYWNlIEV4dHJhY3RUZXh0TGlua3NQYXJhbXMge1xuICAvKipcbiAgICogQW4gZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBwYXJ0IGluIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBlbmRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdGFydCBvZmZzZXQgb2YgdGhlIHRleHQgcGFydCBpbiB0aGUgc3RyaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgdGV4dCBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBwYXJzZWQgbGlua3MgdG8gYXBwZW5kIHRoZSBleHRyYWN0ZWQgdGV4dCBsaW5rcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGx9LlxuICovXG5pbnRlcmZhY2UgRml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBjdXJyZW50IHZhbHVlIHdpdGhpbiB0aGUgZnJvbnRtYXR0ZXIuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZnJvbnRtYXR0ZXIgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlua1RleHR9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVMaW5rVGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IGZpbGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRGaWxlOiBURmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd25MaW5rUGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlV2lraUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVXaWtpTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldEZpbGVDaGFuZ2VzfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVDaGFuZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBtZXRhZGF0YSBjYWNoZSB0byBleHRyYWN0IHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FjaGUgYmVsb25ncyB0byBhIGNhbnZhcyBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+Pjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEhhc0FuZ2xlQnJhY2tldHNJbkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmF3IFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHJhd1VybDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU6IEZpbmFsTGlua1BhdGhTdHlsZTtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkVXNlV2lraWxpbmtTdHlsZX0uXG4gKi9cbmludGVyZmFjZSBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkNvbnRlbnR9LlxuICovXG5pbnRlcmZhY2UgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgV2lraUxpbmtOb2RlIGV4dGVuZHMgTm9kZSB7XG4gIGRhdGE6IFdpa2lMaW5rTm9kZURhdGE7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBXaWtpTGlua05vZGVEYXRhIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBhbGlhczogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKHBhcmFtczogQ29udmVydExpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgc291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG4gIGlmICghdGFyZ2V0RmlsZSkge1xuICAgIHJldHVybiBwYXJhbXMubGluay5vcmlnaW5hbDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIGxpbms6IHBhcmFtcy5saW5rLFxuICAgIGxpbmtTdHlsZTogcGFyYW1zLmxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHBhcmFtcy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0QmFja2xpbmtzKHBhcmFtczogRWRpdEJhY2tsaW5rc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwLCBwYXRoT3JGaWxlLCAuLi5vcHRpb25zIH0pO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGNvbnN0IGN1cnJlbnRMaW5rcyA9IGVuc3VyZU5vbk51bGxhYmxlKGJhY2tsaW5rcy5nZXQoYmFja2xpbmtOb3RlUGF0aCkpO1xuICAgIGNvbnN0IGxpbmtKc29ucyA9IG5ldyBTZXQ8c3RyaW5nPihjdXJyZW50TGlua3MubWFwKChsaW5rKSA9PiBKU09OLnN0cmluZ2lmeShsaW5rKSkpO1xuICAgIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgICBhcHAsXG4gICAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgICBjb25zdCBsaW5rSnNvbiA9IEpTT04uc3RyaW5naWZ5KGxpbmspO1xuICAgICAgICBpZiAoIWxpbmtKc29ucy5oYXMobGlua0pzb24pKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpbmtDb252ZXJ0ZXIobGluayk7XG4gICAgICB9LFxuICAgICAgcGF0aE9yRmlsZTogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rcyhwYXJhbXM6IEVkaXRMaW5rc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoe1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICh7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyh7XG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgaXNDYW52YXNGaWxlQ2FjaGU6IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSxcbiAgICAgICAgbGlua0NvbnZlcnRlclxuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcyBpbiB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIFRoZSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rc0luQ29udGVudChwYXJhbXM6IEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBsaW5rQ29udmVydGVyIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGdldEZpbGVDaGFuZ2VzKHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogZmFsc2UsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXJcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0sXG4gICAgY29udGVudCxcbiAgICBwYXRoOiAnJ1xuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhc3NlcnROb25OdWxsYWJsZShuZXdDb250ZW50LCAnRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRW5jb2RlcyBhIFVSTC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIFVSTCB0byBlbmNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICh7IHN1YnN0cmluZzogc3BlY2lhbExpbmtTeW1ib2wgfSkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNwZWNpYWxMaW5rU3ltYm9sKSxcbiAgICBzZWFyY2hWYWx1ZTogU1BFQ0lBTF9MSU5LX1NZTUJPTFNfUkVHRVhQLFxuICAgIHN0cjogdXJsXG4gIH0pO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgdGhlIGFsaWFzIG9mIGEgbWFya2Rvd24gbGluay5cbiAqXG4gKiBAcGFyYW0gYWxpYXMgLSBBbiBhbGlhcyBvZiBhIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBBbiBlc2NhcGVkIGFsaWFzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZXNjYXBlQWxpYXMoJyoqYWxpYXMqKicpIC8vICdcXFxcKlxcXFwqYWxpYXNcXFxcKlxcXFwqJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVBbGlhcyhhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgIHJlcGxhY2VyOiAnXFxcXCQmJyxcbiAgICBzZWFyY2hWYWx1ZTogU1BFQ0lBTF9NQVJLRE9XTl9MSU5LX1NZTUJPTFNfUkVHRVgsXG4gICAgc3RyOiBhbGlhc1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZXh0cmFjdGluZyB0aGUgbGluayBmaWxlLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKHBhcmFtczogRXh0cmFjdExpbmtGaWxlUGFyYW1zKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UsXG4gICAgc291cmNlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogZnVsbExpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHsgY2FjaGUsIGtleTogJycsIHZhbHVlOiBjYWNoZS5mcm9udG1hdHRlciB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRm4pID0+IGRlZmF1bHRQYXJhbXNGbigpKTtcbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG5cbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbdGFyZ2V0RmlsZV0pO1xuICByZXR1cm4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsfT5gXG4gICAgOiBlbmNvZGVVcmwocGFyYW1zLnVybCk7XG5cbiAgY29uc3QgdGl0bGVQYXJ0ID0gcGFyYW1zLnRpdGxlID8gYCAke0pTT04uc3RyaW5naWZ5KHBhcmFtcy50aXRsZSl9YCA6ICcnO1xuXG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHtlc2NhcGVkQWxpYXN9XSgke3VybH0ke3RpdGxlUGFydH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaGFyZWQsIG11dGFibGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgcGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBldmVyeSB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9IGNhbGwgYW5kIGl0cyByZXN1bHQgaXMgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyAobGF0ZXJcbiAqIHJlZ2lzdHJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLCBidXQgbmV2ZXIgb3ZlciBleHBsaWNpdGx5IHBhc3NlZCBwYXJhbXMpLiBSZWdpc3RlciBlbnRyaWVzXG4gKiBieSBhZGRpbmcgYSBgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zQ29tcG9uZW50YCB0byBhIGNvbXBvbmVudCB0cmVlIHJhdGhlciB0aGFuIG11dGF0aW5nIHRoaXMgbGlzdCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbXV0YWJsZSBsaXN0IG9mIGRlZmF1bHQtcGFyYW1zIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpOiAoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBsaW5rIGludG8gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBsaW5rIHRvIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMaW5rKHN0cjogc3RyaW5nKTogbnVsbCB8IFBhcnNlTGlua1Jlc3VsdCB7XG4gIGNvbnN0IGxpbmtzID0gcGFyc2VMaW5rcyhzdHIpO1xuICByZXR1cm4gbGlua3NbMF0/LnJhdyA9PT0gc3RyID8gbGlua3NbMF0gOiBudWxsO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhbGwgbGlua3MgaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHN0ciAtIFRoZSBzdHJpbmcgdG8gcGFyc2UgdGhlIGxpbmtzIGluLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBsaW5rcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua3Moc3RyOiBzdHJpbmcpOiBQYXJzZUxpbmtSZXN1bHRbXSB7XG4gIGNvbnN0IGVtYmVkU3ltYm9sT2Zmc2V0cyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuXG4gIGNvbnN0IEVNQkVEX0xJTktfUFJFRklYID0gJyFbJztcbiAgY29uc3QgTk9fRU1CRURfTElOS19QUkVGSVggPSAnQFsnO1xuICBjb25zdCBEVU1NWV9DSEFSQUNURVIgPSAnQCc7XG5cbiAgY29uc3QgRU1CRURfSU5TSURFX0xJTktfUkVHX0VYUCA9IC9cXFsoPzxMaW5rQWxpYXM+IVxcWy4qP1xcXVxcKC4rP1xcKSlcXF1cXCgoPzxMaW5rPi4rPylcXCkvZztcbiAgY29uc3Qgbm9JbnNpZGVFbWJlZHNMaW5rc1N0ciA9IHJlcGxhY2VBbGwoe1xuICAgIHJlcGxhY2VyOiAoeyBjYXB0dXJlZEdyb3VwQXJnczogW2xpbmtBbGlhcyA9ICcnLCBsaW5rID0gJyddIH0pID0+IHtcbiAgICAgIGNvbnN0IGR1bW15QWxpYXMgPSBEVU1NWV9DSEFSQUNURVIucmVwZWF0KGxpbmtBbGlhcy5sZW5ndGgpO1xuICAgICAgcmV0dXJuIGBbJHtkdW1teUFsaWFzfV0oJHtsaW5rfSlgO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IEVNQkVEX0lOU0lERV9MSU5LX1JFR19FWFAsXG4gICAgc3RyXG4gIH0pO1xuXG4gIGNvbnN0IG5vRW1iZWRTdHIgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogKGFyZ3MpID0+IHtcbiAgICAgIGVtYmVkU3ltYm9sT2Zmc2V0cy5hZGQoYXJncy5vZmZzZXQpO1xuICAgICAgcmV0dXJuIE5PX0VNQkVEX0xJTktfUFJFRklYO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IEVNQkVEX0xJTktfUFJFRklYLFxuICAgIHN0cjogbm9JbnNpZGVFbWJlZHNMaW5rc1N0clxuICB9KTtcblxuICBjb25zdCBwcm9jZXNzb3IgPSByZW1hcmsoKS51c2UocmVtYXJrUGFyc2UpLnVzZSh3aWtpTGlua1BsdWdpbiwgeyBhbGlhc0RpdmlkZXI6IFdJS0lMSU5LX0RJVklERVIgfSk7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzb3IucGFyc2Uobm9FbWJlZFN0cik7XG5cbiAgY29uc3QgbGlua3M6IFBhcnNlTGlua1Jlc3VsdFtdID0gW107XG4gIGNvbnN0IHRleHRMaW5rczogUGFyc2VMaW5rUmVzdWx0W10gPSBbXTtcblxuICB2aXNpdChyb290LCAobm9kZTogTm9kZSkgPT4ge1xuICAgIGxldCBsaW5rOiBQYXJzZUxpbmtSZXN1bHQ7XG4gICAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2xpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VMaW5rTm9kZShub2RlIGFzIExpbmssIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2lraUxpbmsnOlxuICAgICAgICBsaW5rID0gcGFyc2VXaWtpbGlua05vZGUobm9kZSBhcyBXaWtpTGlua05vZGUsIHN0cik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbWJlZFN5bWJvbE9mZnNldHMuaGFzKGxpbmsuc3RhcnRPZmZzZXQgLSAxKSkge1xuICAgICAgbGluayA9IHtcbiAgICAgICAgLi4ubGluayxcbiAgICAgICAgaXNFbWJlZDogdHJ1ZSxcbiAgICAgICAgcmF3OiBgISR7bGluay5yYXd9YCxcbiAgICAgICAgc3RhcnRPZmZzZXQ6IGxpbmsuc3RhcnRPZmZzZXQgLSAxXG4gICAgICB9O1xuICAgIH1cbiAgICBsaW5rcy5wdXNoKGxpbmspO1xuICB9KTtcblxuICBsaW5rcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0T2Zmc2V0IC0gYi5zdGFydE9mZnNldCk7XG5cbiAgbGV0IHRleHRTdGFydE9mZnNldCA9IDA7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgZXh0cmFjdFRleHRMaW5rcyh7XG4gICAgICBlbmRPZmZzZXQ6IGxpbmsuc3RhcnRPZmZzZXQgLSAxLFxuICAgICAgc3RhcnRPZmZzZXQ6IHRleHRTdGFydE9mZnNldCxcbiAgICAgIHN0cixcbiAgICAgIHRleHRMaW5rc1xuICAgIH0pO1xuICAgIHRleHRTdGFydE9mZnNldCA9IGxpbmsuZW5kT2Zmc2V0ICsgMTtcbiAgfVxuXG4gIGV4dHJhY3RUZXh0TGlua3Moe1xuICAgIGVuZE9mZnNldDogc3RyLmxlbmd0aCAtIDEsXG4gICAgc3RhcnRPZmZzZXQ6IHRleHRTdGFydE9mZnNldCxcbiAgICBzdHIsXG4gICAgdGV4dExpbmtzXG4gIH0pO1xuXG4gIGxpbmtzLnB1c2goLi4udGV4dExpbmtzKTtcbiAgbGlua3Muc29ydCgoYSwgYikgPT4gYS5zdGFydE9mZnNldCAtIGIuc3RhcnRPZmZzZXQpO1xuXG4gIHJldHVybiBsaW5rcztcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMocGFyYW1zOiBTaG91bGRSZXNldEFsaWFzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQsXG4gICAgaXNXaWtpbGluayxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiB0YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRm9sZGVyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRm9sZGVyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZUZvbGRlciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwuXFwvL2csXG4gICAgc3RyOiBub3JtYWxpemVQYXRoKGVuc3VyZU5vbk51bGxhYmxlKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnKVswXSkpXG4gIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZShsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFbWJlZChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy9saW5rXV1gLCBgW3RpdGxlXSgvbGluaylgLCBgW3RpdGxlXSg8L2xpbms+KWAsXG4gKiBgIVtbL2xpbmtdXWAsIGAhW3RpdGxlXSgvbGluaylgLCBgIVt0aXRsZV0oPC9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RXaWtpbGluayhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFVuZXNjYXBlcyB0aGUgYWxpYXMgb2YgYSBtYXJrZG93biBsaW5rLlxuICpcbiAqIEBwYXJhbSBlc2NhcGVkQWxpYXMgLSBBbiBlc2NhcGVkIGFsaWFzLlxuICogQHJldHVybnMgQW4gdW5lc2NhcGVkIGFsaWFzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogdW5lc2NhcGVBbGlhcygnXFxcXCpcXFxcKmFsaWFzXFxcXCpcXFxcKicpIC8vICcqKmFsaWFzKionXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZXNjYXBlQWxpYXMoZXNjYXBlZEFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICh7IGNhcHR1cmVkR3JvdXBBcmdzOiBbYmFja3NsYXNoZXMgPSAnJywgc3BlY2lhbENoYXIgPSAnJ10gfSkgPT4ge1xuICAgICAgY29uc3QgRVNDQVBFRF9CQUNLU0xBU0hfTEVOR1RIID0gMjtcbiAgICAgIGNvbnN0IGJhY2tzbGFzaENvdW50ID0gYmFja3NsYXNoZXMubGVuZ3RoO1xuICAgICAgY29uc3Qga2VlcENvdW50ID0gTWF0aC5mbG9vcihiYWNrc2xhc2hDb3VudCAvIEVTQ0FQRURfQkFDS1NMQVNIX0xFTkdUSCk7XG4gICAgICByZXR1cm4gJ1xcXFwnLnJlcGVhdChrZWVwQ291bnQpICsgc3BlY2lhbENoYXI7XG4gICAgfSxcbiAgICBzZWFyY2hWYWx1ZTogLyg/PEJhY2tzbGFzaGVzPlxcXFwrKSg/PFNwZWNpYWxDaGFyYWN0ZXI+WyFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXFxcXF1eX2B7fH1+XSkvZyxcbiAgICBzdHI6IGVzY2FwZWRBbGlhc1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsocGFyYW1zOiBVcGRhdGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMgPSB0cnVlXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBsaW5rLm9yaWdpbmFsO1xuICB9XG4gIGNvbnN0IG5ld1RhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBuZXdUYXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsXG4gIH0pKTtcblxuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICBsZXQgc2hvdWxkS2VlcEFsaWFzID0gIXNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM7XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBDYW52YXMgZmlsZSBub2RlIHJlZmVyZW5jZSBicmFuY2ggaXMgaGFyZCB0byByZXByb2R1Y2UgaW4gdW5pdCB0ZXN0cy4gKi9cbiAgICBpZiAoaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShsaW5rKSkge1xuICAgICAgcmV0dXJuIG5ld1RhcmdldEZpbGUucGF0aCArIHN1YnBhdGg7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluay5vcmlnaW5hbCk7XG4gIGxldCBhbGlhczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpc1dpa2lsaW5rICYmIHBhcnNlTGlua1Jlc3VsdD8uYWxpYXMpIHtcbiAgICBhbGlhcyA9IHBhcnNlTGlua1Jlc3VsdC5hbGlhcztcbiAgICBzaG91bGRLZWVwQWxpYXMgPSB0cnVlO1xuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGRpc3BsYXlUZXh0OiBsaW5rLmRpc3BsYXlUZXh0LFxuICAgICAgaXNXaWtpbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkVGFyZ2V0UGF0aCxcbiAgICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgICB9KSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogcGFyc2VMaW5rUmVzdWx0Py5hbGlhcztcblxuICBpZiAoIXNob3VsZEtlZXBBbGlhcykge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGlhcyBtYXRjaGluZyBicmFuY2hlcyBhcmUgaGFyZCB0byByZXByb2R1Y2UgaW4gdW5pdCB0ZXN0cy4gKi9cbiAgICBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgsIGV4dG5hbWUob2xkVGFyZ2V0UGF0aCkpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUuYmFzZW5hbWU7XG4gICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5uYW1lO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgbmV3TGluayA9IGdlbmVyYXRlTWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBvbGRTb3VyY2VQYXRoID09PSBvbGRUYXJnZXRQYXRoICYmICEhcGFyc2VMaW5rUmVzdWx0Py5hbGlhcyxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gIH0pKTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICBhcHAsXG4gICAgICAgIGxpbmssXG4gICAgICAgIGxpbmtTdHlsZSxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgICAgfSkpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBmaWxlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUxpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSA9IHBhcmFtcztcblxuICBpZiAoaXNDYW52YXNGaWxlKG5ld1NvdXJjZVBhdGhPckZpbGUpICYmICFhcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAuLi5wYXJhbXMsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gdGVzdEVtYmVkKGxpbmsub3JpZ2luYWwpO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSB1bmRlZmluZWQgJiYgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IGlzRW1iZWRMaW5rKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgYXBwLFxuICAgICAgICBsaW5rLFxuICAgICAgICBsaW5rU3R5bGUsXG4gICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgICAgIH0pKTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZVVybFNhZmVseShwYXJhbXM6IERlY29kZVVybFNhZmVseVBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgaGFzQW5nbGVCcmFja2V0cywgaXNFeHRlcm5hbCwgdXJsIH0gPSBwYXJhbXM7XG4gIGlmIChpc0V4dGVybmFsIHx8IGhhc0FuZ2xlQnJhY2tldHMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGRlY29kZSBVUkwgJHt1cmx9YCwgZXJyb3IpO1xuICAgIHJldHVybiB1cmw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFsaWFzKHBhcmFtczogRXh0cmFjdEFsaWFzUGFyYW1zKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBhbGlhc0VuZE9mZnNldCwgYWxpYXNTdGFydE9mZnNldCwgc3RyIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhbGlhc1N0YXJ0T2Zmc2V0IDwgYWxpYXNFbmRPZmZzZXRcbiAgICA/IHN0ci5zbGljZShhbGlhc1N0YXJ0T2Zmc2V0LCBhbGlhc0VuZE9mZnNldClcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFRleHRMaW5rcyhwYXJhbXM6IEV4dHJhY3RUZXh0TGlua3NQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBlbmRPZmZzZXQsIHN0YXJ0T2Zmc2V0LCBzdHIsIHRleHRMaW5rcyB9ID0gcGFyYW1zO1xuICBpZiAoc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB0ZXh0UGFydCA9IHN0ci5zbGljZShzdGFydE9mZnNldCwgZW5kT2Zmc2V0ICsgMSk7XG4gIHJlcGxhY2VBbGwoe1xuICAgIHJlcGxhY2VyOiAoeyBjYXB0dXJlZEdyb3VwQXJnczogW3VybCA9ICcnXSwgb2Zmc2V0IH0pID0+IHtcbiAgICAgIGlmICghaXNVcmwodXJsKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRleHRMaW5rcy5wdXNoKHtcbiAgICAgICAgZW5jb2RlZFVybDogZW5jb2RlVXJsKHVybCksXG4gICAgICAgIGVuZE9mZnNldDogc3RhcnRPZmZzZXQgKyBvZmZzZXQgKyB1cmwubGVuZ3RoLFxuICAgICAgICBoYXNBbmdsZUJyYWNrZXRzOiBmYWxzZSxcbiAgICAgICAgaXNFbWJlZDogZmFsc2UsXG4gICAgICAgIGlzRXh0ZXJuYWw6IHRydWUsXG4gICAgICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgICAgICByYXc6IHVybCxcbiAgICAgICAgc3RhcnRPZmZzZXQ6IHN0YXJ0T2Zmc2V0ICsgb2Zmc2V0LFxuICAgICAgICB1cmxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2VhcmNoVmFsdWU6IC8oPzxVcmw+XFxTKykvZyxcbiAgICBzdHI6IHRleHRQYXJ0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHBhcmFtczogRml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgY2FjaGUsXG4gICAga2V5LFxuICAgIHZhbHVlXG4gIH0gPSBwYXJhbXM7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKHZhbHVlKTtcbiAgICBpZiAoIXBhcnNlTGlua1Jlc3VsdCB8fCBwYXJzZUxpbmtSZXN1bHQuaXNXaWtpbGluayB8fCBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNhY2hlLmZyb250bWF0dGVyTGlua3MgPz89IFtdO1xuICAgIGxldCBsaW5rID0gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcy5maW5kKChmcm9udG1hdHRlckxpbmspID0+IGZyb250bWF0dGVyTGluay5rZXkgPT09IGtleSk7XG5cbiAgICBpZiAoIWxpbmspIHtcbiAgICAgIGxpbmsgPSB7XG4gICAgICAgIGtleSxcbiAgICAgICAgbGluazogJycsXG4gICAgICAgIG9yaWdpbmFsOiAnJ1xuICAgICAgfTtcbiAgICAgIGNhY2hlLmZyb250bWF0dGVyTGlua3MucHVzaChsaW5rKTtcbiAgICB9XG5cbiAgICBsaW5rLmxpbmsgPSBwYXJzZUxpbmtSZXN1bHQudXJsO1xuICAgIGxpbmsub3JpZ2luYWwgPSB2YWx1ZTtcbiAgICBpZiAocGFyc2VMaW5rUmVzdWx0LmFsaWFzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpbmsuZGlzcGxheVRleHQgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBoYXNGcm9udG1hdHRlckxpbmtzID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBbY2hpbGRLZXksIGNoaWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIEdlbmVyaWNPYmplY3QpKSB7XG4gICAgY29uc3QgaGFzQ2hpbGRGcm9udG1hdHRlckxpbmtzID0gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbCh7IGNhY2hlLCBrZXk6IGtleSA/IGAke2tleX0uJHtjaGlsZEtleX1gIDogY2hpbGRLZXksIHZhbHVlOiBjaGlsZFZhbHVlIH0pO1xuICAgIGhhc0Zyb250bWF0dGVyTGlua3MgfHw9IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcztcbiAgfVxuXG4gIHJldHVybiBoYXNGcm9udG1hdHRlckxpbmtzO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUxpbmtUZXh0KHBhcmFtczogR2VuZXJhdGVMaW5rVGV4dFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwLCBjb25maWcsIHN1YnBhdGgsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IHsgc291cmNlUGF0aCB9ID0gcGFyYW1zO1xuICBpZiAoc291cmNlUGF0aCA9PT0gJy8nKSB7XG4gICAgc291cmNlUGF0aCA9ICcnO1xuICB9XG5cbiAgbGV0IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgaWYgKHRhcmdldEZpbGUucGF0aCA9PT0gc291cmNlUGF0aCAmJiBzdWJwYXRoICYmIGNvbmZpZy5pc1NpbmdsZVN1YnBhdGhBbGxvd2VkKSB7XG4gICAgbGlua1RleHQgPSAnJztcbiAgfSBlbHNlIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIGJyYW5jaGVzIGNvdmVyZWQgYnV0IHY4IHJlcG9ydHMgc3dpdGNoIGFzIHBhcnRpYWwuICovXG4gICAgc3dpdGNoIChjb25maWcubGlua1BhdGhTdHlsZSkge1xuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ6XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTpcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFzc2VydE5ldmVyKGNvbmZpZy5saW5rUGF0aFN0eWxlKTtcbiAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICB9XG4gIH1cblxuICBsaW5rVGV4dCA9IGNvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyB0cmltRW5kKHtcbiAgICAgIHN0cjogbGlua1RleHQsXG4gICAgICBzdWZmaXg6IGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gXG4gICAgfSlcbiAgICA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dCh7XG4gICAgYXBwLFxuICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0RmlsZVxuICB9KTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKHtcbiAgICAgIGFsaWFzOiBwYXJhbXMuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBsaW5rQ29uZmlnLmlzRW1iZWQsXG4gICAgICBsaW5rVGV4dFxuICAgIH0pXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHtcbiAgICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICAgIGxpbmtUZXh0LFxuICAgICAgbWFya2Rvd25MaW5rUGFyYW1zOiBwYXJhbXMsXG4gICAgICB0YXJnZXRGaWxlXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb25maWcsIGxpbmtUZXh0LCBtYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IGFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLmFsaWFzID8/ICcnO1xuICBsZXQgc2hvdWxkRXNjYXBlQWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGlmICghYWxpYXMgJiYgKGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpIHx8ICFtYXJrZG93bkxpbmtQYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIW1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKVxuICAgICAgPyB0YXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgICA6IHRhcmdldEZpbGUubmFtZTtcbiAgICBzaG91bGRFc2NhcGVBbGlhcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQ6IGNvbmZpZy5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGNvbmZpZy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsocGFyYW1zOiBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhbGlhcywgaXNFbWJlZCwgbGlua1RleHQgfSA9IHBhcmFtcztcbiAgaWYgKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICAgIGlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgICAgdXJsOiBhbGlhc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZUNoYW5nZXMocGFyYW1zOiBHZXRGaWxlQ2hhbmdlc1BhcmFtcyk6IFByb21pc2U8RmlsZUNoYW5nZVtdPiB7XG4gIGNvbnN0IHsgY2FjaGUsIGlzQ2FudmFzRmlsZUNhY2hlLCBsaW5rQ29udmVydGVyIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0QWxsTGlua3MoY2FjaGUpKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdEFuZ2xlQnJhY2tldHMocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdEb3QocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJhd0xpbmsobm9kZTogTm9kZSwgc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwb3MgPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIHN0ci5zbGljZShwb3Muc3RhcnQub2Zmc2V0LCBwb3MuZW5kLm9mZnNldCk7XG59XG5cbmZ1bmN0aW9uIGhhc0FuZ2xlQnJhY2tldHNJbkxpbmsocGFyYW1zOiBIYXNBbmdsZUJyYWNrZXRzSW5MaW5rUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgcmF3LCByYXdVcmwgfSA9IHBhcmFtcztcbiAgY29uc3QgT1BFTl9BTkdMRV9CUkFDS0VUID0gJzwnO1xuICByZXR1cm4gcmF3LnN0YXJ0c1dpdGgoT1BFTl9BTkdMRV9CUkFDS0VUKSB8fCByYXdVcmwuc3RhcnRzV2l0aChPUEVOX0FOR0xFX0JSQUNLRVQpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUxpbmtOb2RlKG5vZGU6IExpbmssIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgTElOS19BTElBU19TVUZGSVggPSAnXSgnO1xuICBjb25zdCBMSU5LX1NVRkZJWCA9ICcpJztcbiAgY29uc3QgcmF3ID0gZ2V0UmF3TGluayhub2RlLCBzdHIpO1xuICBjb25zdCBhbGlhc05vZGVTdGFydE9mZnNldCA9IG5vZGUuY2hpbGRyZW5bMF0/LnBvc2l0aW9uPy5zdGFydC5vZmZzZXQgPz8gMTtcbiAgY29uc3QgYWxpYXNOb2RlRW5kT2Zmc2V0ID0gbm9kZS5jaGlsZHJlbi5hdCgtMSk/LnBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDE7XG4gIGNvbnN0IHBvc2l0aW9uID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS5wb3NpdGlvbik7XG4gIGNvbnN0IG5vZGVFbmRPZmZzZXQgPSBlbnN1cmVOb25OdWxsYWJsZShwb3NpdGlvbi5lbmQub2Zmc2V0KTtcbiAgY29uc3Qgbm9kZVN0YXJ0T2Zmc2V0ID0gZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KTtcbiAgY29uc3QgcmF3VXJsID0gc3RyLnNsaWNlKGFsaWFzTm9kZUVuZE9mZnNldCArIExJTktfQUxJQVNfU1VGRklYLmxlbmd0aCwgbm9kZUVuZE9mZnNldCAtIExJTktfU1VGRklYLmxlbmd0aCk7XG4gIGNvbnN0IGhhc0FuZ2xlQnJhY2tldHMgPSBoYXNBbmdsZUJyYWNrZXRzSW5MaW5rKHtcbiAgICByYXcsXG4gICAgcmF3VXJsXG4gIH0pO1xuICBjb25zdCBpc0V4dGVybmFsID0gaXNVcmwobm9kZS51cmwpO1xuICBjb25zdCB1cmwgPSBkZWNvZGVVcmxTYWZlbHkoe1xuICAgIGhhc0FuZ2xlQnJhY2tldHMsXG4gICAgaXNFeHRlcm5hbCxcbiAgICB1cmw6IG5vZGUudXJsXG4gIH0pO1xuICBjb25zdCBhbGlhcyA9IGV4dHJhY3RBbGlhcyh7XG4gICAgYWxpYXNFbmRPZmZzZXQ6IGFsaWFzTm9kZUVuZE9mZnNldCxcbiAgICBhbGlhc1N0YXJ0T2Zmc2V0OiBhbGlhc05vZGVTdGFydE9mZnNldCxcbiAgICBzdHJcbiAgfSk7XG4gIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGFyc2VMaW5rUmVzdWx0Pih7XG4gICAgYWxpYXMsXG4gICAgZW5jb2RlZFVybDogaXNFeHRlcm5hbCA/IGVuY29kZVVybCh1cmwpIDogdW5kZWZpbmVkLFxuICAgIGVuZE9mZnNldDogbm9kZUVuZE9mZnNldCxcbiAgICBoYXNBbmdsZUJyYWNrZXRzLFxuICAgIGlzRW1iZWQ6IGZhbHNlLFxuICAgIGlzRXh0ZXJuYWwsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgcmF3LFxuICAgIHN0YXJ0T2Zmc2V0OiBub2RlU3RhcnRPZmZzZXQsXG4gICAgdGl0bGU6IG5vZGUudGl0bGUgPz8gdW5kZWZpbmVkLFxuICAgIHVuZXNjYXBlZEFsaWFzOiBhbGlhcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdW5lc2NhcGVBbGlhcyhhbGlhcyksXG4gICAgdXJsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVdpa2lsaW5rTm9kZShub2RlOiBXaWtpTGlua05vZGUsIHN0cjogc3RyaW5nKTogUGFyc2VMaW5rUmVzdWx0IHtcbiAgY29uc3QgcG9zaXRpb24gPSBlbnN1cmVOb25OdWxsYWJsZShub2RlLnBvc2l0aW9uKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQYXJzZUxpbmtSZXN1bHQ+KHtcbiAgICBhbGlhczogc3RyLmluY2x1ZGVzKFdJS0lMSU5LX0RJVklERVIpID8gbm9kZS5kYXRhLmFsaWFzIDogdW5kZWZpbmVkLFxuICAgIGVuZE9mZnNldDogZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uZW5kLm9mZnNldCksXG4gICAgaXNFbWJlZDogZmFsc2UsXG4gICAgaXNFeHRlcm5hbDogZmFsc2UsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICByYXc6IGdldFJhd0xpbmsobm9kZSwgc3RyKSxcbiAgICBzdGFydE9mZnNldDogZW5zdXJlTm9uTnVsbGFibGUocG9zaXRpb24uc3RhcnQub2Zmc2V0KSxcbiAgICB1cmw6IG5vZGUudmFsdWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHA6IEFwcCk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IG5ld0xpbmtGb3JtYXQgPSBnZXROZXdMaW5rRm9ybWF0KGFwcCk7XG4gIHN3aXRjaCAobmV3TGlua0Zvcm1hdCkge1xuICAgIGNhc2UgJ2Fic29sdXRlJzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICBjYXNlICdyZWxhdGl2ZSc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgJ3Nob3J0ZXN0JzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihuZXdMaW5rRm9ybWF0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSk6IGJvb2xlYW4ge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZ2V0RmlsZUNoYW5nZXMgb25seSBjYWxscyB0aGlzIGZvciBub24tY2FudmFzIGZpbGVzIHdoaWNoIGFsd2F5cyBoYXZlIGNvbnRlbnQgY2hhbmdlcy4gKi9cbiAgaWYgKCFpc0NvbnRlbnRDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cblxuICBpZiAoIVVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOlxuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiB0ZXN0V2lraWxpbmsob3JpZ2luYWxMaW5rKTtcbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkEsU0FBUywwQkFBMEI7QUFDbkM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsT0FBTyxpQkFBaUI7QUFDeEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxhQUFhO0FBV3RCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxhQUFhO0FBQ3RCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sMkJBQTJCO0FBTWpDLE1BQU0sOEJBQThCO0FBS3BDLE1BQU0sc0NBQXNDO0FBSzVDLE1BQU0sb0NBQW9DO0FBRTFDLE1BQU0sbUJBQW1CO0FBS2xCLElBQUssZ0JBQUwsa0JBQUtBLG1CQUFMO0FBTUwsRUFBQUEsZUFBQSx5QkFBc0I7QUFLdEIsRUFBQUEsZUFBQSw2QkFBMEI7QUFPMUIsRUFBQUEsZUFBQSw2QkFBMEI7QUFPMUIsRUFBQUEsZUFBQSw4QkFBMkI7QUF6QmpCLFNBQUFBO0FBQUEsR0FBQTtBQStCTCxJQUFLLFlBQUwsa0JBQUtDLGVBQUw7QUFNTCxFQUFBQSxXQUFBLGNBQVc7QUFLWCxFQUFBQSxXQUFBLDZCQUEwQjtBQUsxQixFQUFBQSxXQUFBLHNCQUFtQjtBQVFuQixFQUFBQSxXQUFBLGNBQVc7QUF4QkQsU0FBQUE7QUFBQSxHQUFBO0FBODZCTCxTQUFTLFlBQVksUUFBbUM7QUFDN0QsUUFBTSxhQUFhLGdCQUFnQjtBQUFBLElBQ2pDLEtBQUssT0FBTztBQUFBLElBQ1osTUFBTSxPQUFPO0FBQUEsSUFDYixrQkFBa0IsT0FBTyx1QkFBdUIsT0FBTztBQUFBLEVBQ3pELENBQUM7QUFDRCxNQUFJLENBQUMsWUFBWTtBQUNmLFdBQU8sT0FBTyxLQUFLO0FBQUEsRUFDckI7QUFFQSxTQUFPLFdBQVcsNEJBQThDO0FBQUEsSUFDOUQsS0FBSyxPQUFPO0FBQUEsSUFDWixNQUFNLE9BQU87QUFBQSxJQUNiLFdBQVcsT0FBTztBQUFBLElBQ2xCLHFCQUFxQixPQUFPO0FBQUEsSUFDNUIscUJBQXFCO0FBQUEsSUFDckIscUJBQXFCLE9BQU87QUFBQSxJQUM1QiwyQkFBMkIsT0FBTztBQUFBLEVBQ3BDLENBQUMsQ0FBQztBQUNKO0FBUUEsZUFBc0IsY0FBYyxRQUE0QztBQUM5RSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFHO0FBQUEsRUFDTCxJQUFJO0FBQ0osUUFBTSxZQUFZLE1BQU0sd0JBQXdCLEVBQUUsS0FBSyxZQUFZLEdBQUcsUUFBUSxDQUFDO0FBQy9FLGFBQVcsb0JBQW9CLFVBQVUsS0FBSyxHQUFHO0FBQy9DLFVBQU0sZUFBZSxrQkFBa0IsVUFBVSxJQUFJLGdCQUFnQixDQUFDO0FBQ3RFLFVBQU0sWUFBWSxJQUFJLElBQVksYUFBYSxJQUFJLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUM7QUFDbEYsVUFBTSxVQUFVO0FBQUEsTUFDZDtBQUFBLE1BQ0EsZUFBZSxDQUFDLFNBQVM7QUFDdkIsY0FBTSxXQUFXLEtBQUssVUFBVSxJQUFJO0FBQ3BDLFlBQUksQ0FBQyxVQUFVLElBQUksUUFBUSxHQUFHO0FBQzVCO0FBQUEsUUFDRjtBQUVBLGVBQU8sY0FBYyxJQUFJO0FBQUEsTUFDM0I7QUFBQSxNQUNBLFlBQVk7QUFBQSxNQUNaLEdBQUc7QUFBQSxJQUNMLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFRQSxlQUFzQixVQUFVLFFBQXdDO0FBQ3RFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUc7QUFBQSxFQUNMLElBQUk7QUFDSixRQUFNLGlCQUFpQjtBQUFBLElBQ3JCO0FBQUEsSUFDQSxpQkFBaUIsT0FBTyxFQUFFLGFBQWEsUUFBUSxNQUFNO0FBQ25ELFlBQU0sUUFBUSxNQUFNLGFBQWEsS0FBSyxVQUFVO0FBQ2hELGtCQUFZLGVBQWU7QUFDM0IsWUFBTSxPQUFPLFFBQVEsRUFBRSxLQUFLLFdBQVcsQ0FBQztBQUN4QyxZQUFNLGdCQUFnQixNQUFNLElBQUksTUFBTSxXQUFXLElBQUk7QUFDckQsa0JBQVksZUFBZTtBQUMzQixVQUFJLFlBQVksZUFBZTtBQUM3QixlQUFPO0FBQUEsTUFDVDtBQUVBLGFBQU8sTUFBTSxlQUFlO0FBQUEsUUFDMUI7QUFBQSxRQUNBO0FBQUEsUUFDQSxtQkFBbUIsYUFBYSxVQUFVO0FBQUEsUUFDMUM7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBRztBQUFBLEVBQ0wsQ0FBQztBQUNIO0FBUUEsZUFBc0IsbUJBQW1CLFFBQW1EO0FBQzFGLFFBQU0sRUFBRSxLQUFLLFNBQVMsY0FBYyxJQUFJO0FBQ3hDLE1BQUksRUFBRSxZQUFZLElBQUk7QUFDdEIsa0JBQWdCLGlCQUFpQjtBQUNqQyxjQUFZLGVBQWU7QUFFM0IsUUFBTSxhQUFhLE1BQU0sb0JBQW9CO0FBQUEsSUFDM0M7QUFBQSxJQUNBLGlCQUFpQixZQUFZO0FBQzNCLFlBQU0sUUFBUSxNQUFNLGNBQWMsS0FBSyxPQUFPO0FBQzlDLGtCQUFZLGVBQWU7QUFDM0IsWUFBTSxVQUFVLE1BQU0sZUFBZTtBQUFBLFFBQ25DO0FBQUEsUUFDQTtBQUFBLFFBQ0EsbUJBQW1CO0FBQUEsUUFDbkI7QUFBQSxNQUNGLENBQUM7QUFDRCxrQkFBWSxlQUFlO0FBQzNCLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLElBQ0EsTUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNELGNBQVksZUFBZTtBQUUzQixvQkFBa0IsWUFBWSxtQ0FBbUM7QUFFakUsU0FBTztBQUNUO0FBUU8sU0FBUyxVQUFVLEtBQXFCO0FBQzdDLFNBQU8sV0FBVztBQUFBLElBQ2hCLFVBQVUsQ0FBQyxFQUFFLFdBQVcsa0JBQWtCLE1BQU0sbUJBQW1CLGlCQUFpQjtBQUFBLElBQ3BGLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDSDtBQWFPLFNBQVMsWUFBWSxPQUF1QjtBQUNqRCxTQUFPLFdBQVc7QUFBQSxJQUNoQixVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsSUFDYixLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0g7QUFRTyxTQUFTLGdCQUFnQixRQUE2QztBQUMzRSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBLDZCQUE2QjtBQUFBLElBQzdCO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxFQUFFLFNBQVMsSUFBSSxhQUFhLEtBQUssSUFBSTtBQUMzQyxRQUFNLGFBQWEsUUFBUSxLQUFLLGdCQUFnQjtBQUNoRCxRQUFNLE9BQU8sSUFBSSxjQUFjLHFCQUFxQixVQUFVLFVBQVU7QUFDeEUsTUFBSSxNQUFNO0FBQ1IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsNEJBQTRCO0FBQy9CLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQzVCLFdBQU8sUUFBUSxFQUFFLEtBQUssWUFBWSxVQUFVLDBCQUEwQixLQUFLLENBQUM7QUFBQSxFQUM5RTtBQUVBLFFBQU0sZUFBZSxLQUFLLFFBQVEsVUFBVSxHQUFHLEtBQUssUUFBUSxFQUFFO0FBRTlELE1BQUksYUFBYSxXQUFXLEtBQUssR0FBRztBQUNsQyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sUUFBUSxFQUFFLEtBQUssWUFBWSxjQUFjLDBCQUEwQixLQUFLLENBQUM7QUFDbEY7QUFRTyxTQUFTLDRCQUE0QixPQUFnQztBQUMxRSxTQUFPLGdDQUFnQyxFQUFFLE9BQU8sS0FBSyxJQUFJLE9BQU8sTUFBTSxZQUFZLENBQUM7QUFDckY7QUFRTyxTQUFTLHFCQUFxQixRQUE0QztBQVcvRTtBQUFBO0FBVkEsVUFBTSxFQUFFLElBQUksSUFBSTtBQUVoQixVQUFNLGlCQUFzRDtBQUFBLE1BQzFELDBCQUEwQjtBQUFBLElBQzVCO0FBRUEsVUFBTSxzQkFBc0Isd0NBQXdDLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixnQkFBZ0IsQ0FBQztBQUNoSCxhQUFTLE9BQU8sT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcscUJBQXFCLE1BQU07QUFDekUsVUFBTSxhQUFhLFFBQVEsNEJBQTJDLEVBQUUsS0FBSyxZQUFZLE9BQU8sa0JBQWtCLDBCQUEwQixPQUFPLHlCQUF5QixDQUFDLENBQUM7QUFFOUssVUFBTSxnQkFBZ0IsOEJBQWMsS0FBSyxDQUFDLFVBQVUsQ0FBQztBQUNyRCxXQUFPLHlCQUF5QixNQUFNO0FBQUEsV0FEdEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVGO0FBUU8sU0FBUyx3QkFBd0IsUUFBK0M7QUFDckYsUUFBTSxjQUFjLE9BQU8sVUFBVSxNQUFNO0FBRTNDLE1BQUksT0FBTyxZQUFZO0FBQ3JCLFVBQU0sWUFBWSxPQUFPLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSztBQUN0RCxXQUFPLEdBQUcsV0FBVyxLQUFLLE9BQU8sR0FBRyxHQUFHLFNBQVM7QUFBQSxFQUNsRDtBQUVBLFFBQU0sUUFBUSxPQUFPLFNBQVM7QUFDOUIsUUFBTSxvQkFBb0IsT0FBTyxxQkFBcUI7QUFDdEQsUUFBTSxlQUFlLG9CQUFvQixZQUFZLEtBQUssSUFBSTtBQUU5RCxRQUFNLE1BQU0sT0FBTyx5QkFDZixJQUFJLE9BQU8sR0FBRyxNQUNkLFVBQVUsT0FBTyxHQUFHO0FBRXhCLFFBQU0sWUFBWSxPQUFPLFFBQVEsSUFBSSxLQUFLLFVBQVUsT0FBTyxLQUFLLENBQUMsS0FBSztBQUV0RSxTQUFPLEdBQUcsV0FBVyxJQUFJLFlBQVksS0FBSyxHQUFHLEdBQUcsU0FBUztBQUMzRDtBQVdPLFNBQVMsMENBQXlGO0FBQ3ZHLFNBQU8seUJBQXdFLHdDQUF3QyxDQUFDLENBQUMsRUFBRTtBQUM3SDtBQVFPLFNBQVMsVUFBVSxLQUFxQztBQUM3RCxRQUFNLFFBQVEsV0FBVyxHQUFHO0FBQzVCLFNBQU8sTUFBTSxDQUFDLEdBQUcsUUFBUSxNQUFNLE1BQU0sQ0FBQyxJQUFJO0FBQzVDO0FBUU8sU0FBUyxXQUFXLEtBQWdDO0FBQ3pELFFBQU0scUJBQXFCLG9CQUFJLElBQVk7QUFFM0MsUUFBTSxvQkFBb0I7QUFDMUIsUUFBTSx1QkFBdUI7QUFDN0IsUUFBTSxrQkFBa0I7QUFFeEIsUUFBTSw0QkFBNEI7QUFDbEMsUUFBTSx5QkFBeUIsV0FBVztBQUFBLElBQ3hDLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLFlBQVksSUFBSSxPQUFPLEVBQUUsRUFBRSxNQUFNO0FBQ2hFLFlBQU0sYUFBYSxnQkFBZ0IsT0FBTyxVQUFVLE1BQU07QUFDMUQsYUFBTyxJQUFJLFVBQVUsS0FBSyxJQUFJO0FBQUEsSUFDaEM7QUFBQSxJQUNBLGFBQWE7QUFBQSxJQUNiO0FBQUEsRUFDRixDQUFDO0FBRUQsUUFBTSxhQUFhLFdBQVc7QUFBQSxJQUM1QixVQUFVLENBQUMsU0FBUztBQUNsQix5QkFBbUIsSUFBSSxLQUFLLE1BQU07QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLGFBQWE7QUFBQSxJQUNiLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFFRCxRQUFNLFlBQVksT0FBTyxFQUFFLElBQUksV0FBVyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsY0FBYyxpQkFBaUIsQ0FBQztBQUNsRyxRQUFNLE9BQU8sVUFBVSxNQUFNLFVBQVU7QUFFdkMsUUFBTSxRQUEyQixDQUFDO0FBQ2xDLFFBQU0sWUFBK0IsQ0FBQztBQUV0QyxRQUFNLE1BQU0sQ0FBQyxTQUFlO0FBQzFCLFFBQUk7QUFDSixZQUFRLEtBQUssTUFBTTtBQUFBLE1BQ2pCLEtBQUs7QUFDSCxlQUFPLGNBQWMsTUFBYyxHQUFHO0FBQ3RDO0FBQUEsTUFDRixLQUFLO0FBQ0gsZUFBTyxrQkFBa0IsTUFBc0IsR0FBRztBQUNsRDtBQUFBLE1BQ0Y7QUFDRTtBQUFBLElBQ0o7QUFFQSxRQUFJLG1CQUFtQixJQUFJLEtBQUssY0FBYyxDQUFDLEdBQUc7QUFDaEQsYUFBTztBQUFBLFFBQ0wsR0FBRztBQUFBLFFBQ0gsU0FBUztBQUFBLFFBQ1QsS0FBSyxJQUFJLEtBQUssR0FBRztBQUFBLFFBQ2pCLGFBQWEsS0FBSyxjQUFjO0FBQUEsTUFDbEM7QUFBQSxJQUNGO0FBQ0EsVUFBTSxLQUFLLElBQUk7QUFBQSxFQUNqQixDQUFDO0FBRUQsUUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxFQUFFLFdBQVc7QUFFbEQsTUFBSSxrQkFBa0I7QUFFdEIsYUFBVyxRQUFRLE9BQU87QUFDeEIscUJBQWlCO0FBQUEsTUFDZixXQUFXLEtBQUssY0FBYztBQUFBLE1BQzlCLGFBQWE7QUFBQSxNQUNiO0FBQUEsTUFDQTtBQUFBLElBQ0YsQ0FBQztBQUNELHNCQUFrQixLQUFLLFlBQVk7QUFBQSxFQUNyQztBQUVBLG1CQUFpQjtBQUFBLElBQ2YsV0FBVyxJQUFJLFNBQVM7QUFBQSxJQUN4QixhQUFhO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFFRCxRQUFNLEtBQUssR0FBRyxTQUFTO0FBQ3ZCLFFBQU0sS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLGNBQWMsRUFBRSxXQUFXO0FBRWxELFNBQU87QUFDVDtBQVFPLFNBQVMsaUJBQWlCLFFBQXlDO0FBQ3hFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osTUFBSSxlQUFlLE9BQU87QUFDeEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLENBQUMsYUFBYTtBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sYUFBYSxRQUFRLEVBQUUsS0FBSyxZQUFZLGtCQUFrQiwwQkFBMEIsS0FBSyxDQUFDO0FBQ2hHLFFBQU0sZ0JBQWdCLFFBQVEsS0FBSyxtQkFBbUI7QUFDdEQsUUFBTSxnQkFBZ0IsUUFBUSxLQUFLLHVCQUF1QixtQkFBbUI7QUFDN0UsUUFBTSxrQkFBa0IsUUFBUSxhQUFhO0FBQzdDLFFBQU0sa0JBQWtCLFFBQVEsYUFBYTtBQUM3QyxRQUFNLGlCQUFpQixvQkFBSSxJQUFZO0FBRXZDLGFBQVcsY0FBYyxDQUFDLFdBQVcsTUFBTSxhQUFhLEdBQUc7QUFDekQsUUFBSSxDQUFDLFlBQVk7QUFDZjtBQUFBLElBQ0Y7QUFFQSxVQUFNLE9BQU8sUUFBUSxLQUFLLFVBQVU7QUFDcEMsbUJBQWUsSUFBSSxJQUFJO0FBQ3ZCLG1CQUFlLElBQUksU0FBUyxJQUFJLENBQUM7QUFDakMsbUJBQWUsSUFBSSxTQUFTLGlCQUFpQixJQUFJLENBQUM7QUFDbEQsbUJBQWUsSUFBSSxTQUFTLGlCQUFpQixJQUFJLENBQUM7QUFBQSxFQUNwRDtBQUVBLGFBQVcsY0FBYyxDQUFDLGVBQWUsYUFBYSxHQUFHO0FBQ3ZELG1CQUFlLElBQUksSUFBSSxjQUFjLGVBQWUsWUFBWSxZQUFZLEtBQUssQ0FBQztBQUFBLEVBQ3BGO0FBRUEsUUFBTSxtQkFBbUIsV0FBVztBQUFBLElBQ2xDLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxJQUNiLEtBQUssY0FBYyxrQkFBa0IsWUFBWSxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUFBLEVBQ25FLENBQUMsRUFBRSxZQUFZO0FBRWYsYUFBVyxTQUFTLGdCQUFnQjtBQUNsQyxRQUFJLE1BQU0sWUFBWSxNQUFNLGtCQUFrQjtBQUM1QyxhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0sU0FBUyxRQUFRLEtBQUs7QUFDNUIsVUFBTSxPQUFPLFNBQVMsT0FBTyxRQUFRLEtBQUssQ0FBQztBQUMzQyxRQUFJLEtBQUssUUFBUSxJQUFJLEVBQUUsWUFBWSxNQUFNLGtCQUFrQjtBQUN6RCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLGFBQWEsTUFBa0M7QUFDN0QsUUFBTSxTQUFTLGNBQWMsVUFBVSxJQUFJLENBQUM7QUFDNUMsU0FBTztBQUFBLElBQ0wsVUFBVSxPQUFPO0FBQUEsSUFDakIsU0FBUyxPQUFPO0FBQUEsRUFDbEI7QUFDRjtBQVNPLFNBQVMsa0JBQWtCLE1BQXVCO0FBQ3ZELFFBQU0sa0JBQWtCLFVBQVUsSUFBSTtBQUN0QyxTQUFPLGlCQUFpQixvQkFBb0I7QUFDOUM7QUFTTyxTQUFTLFVBQVUsTUFBdUI7QUFDL0MsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLFdBQVc7QUFDckM7QUFVTyxTQUFTLGVBQWUsTUFBdUI7QUFDcEQsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLElBQUksV0FBVyxJQUFJLEtBQUs7QUFDbEQ7QUFVTyxTQUFTLGlCQUFpQixNQUF1QjtBQUN0RCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsSUFBSSxXQUFXLEdBQUcsS0FBSztBQUNqRDtBQVNPLFNBQVMsYUFBYSxNQUF1QjtBQUNsRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsY0FBYztBQUN4QztBQWFPLFNBQVMsY0FBYyxjQUE4QjtBQUMxRCxTQUFPLFdBQVc7QUFBQSxJQUNoQixVQUFVLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxjQUFjLElBQUksY0FBYyxFQUFFLEVBQUUsTUFBTTtBQUN6RSxZQUFNLDJCQUEyQjtBQUNqQyxZQUFNLGlCQUFpQixZQUFZO0FBQ25DLFlBQU0sWUFBWSxLQUFLLE1BQU0saUJBQWlCLHdCQUF3QjtBQUN0RSxhQUFPLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNsQztBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1AsQ0FBQztBQUNIO0FBUU8sU0FBUyxXQUFXLFFBQWtDO0FBQzNELFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSw0QkFBNEI7QUFBQSxFQUM5QixJQUFJO0FBQ0osTUFBSSxDQUFDLHFCQUFxQjtBQUN4QixXQUFPLEtBQUs7QUFBQSxFQUNkO0FBQ0EsUUFBTSxnQkFBZ0IsUUFBUSxFQUFFLEtBQUssWUFBWSxxQkFBcUIsMEJBQTBCLEtBQUssQ0FBQztBQUN0RyxRQUFNLGdCQUFnQixRQUFRLEtBQUssdUJBQXVCLG1CQUFtQjtBQUM3RSxRQUFNLGdCQUFnQixRQUFRLEtBQUssdUJBQXVCLG1CQUFtQjtBQUM3RSxRQUFNLGFBQWEsdUJBQXVCLDRCQUEwRDtBQUFBLElBQ2xHO0FBQUEsSUFDQTtBQUFBLElBQ0EsY0FBYyxLQUFLO0FBQUEsRUFDckIsQ0FBQyxDQUFDO0FBRUYsUUFBTSxFQUFFLFFBQVEsSUFBSSxhQUFhLEtBQUssSUFBSTtBQUMxQyxNQUFJLGtCQUFrQixDQUFDO0FBRXZCLE1BQUksYUFBYSxtQkFBbUIsR0FBRztBQUVyQyxRQUFJLDBCQUEwQixJQUFJLEdBQUc7QUFDbkMsYUFBTyxjQUFjLE9BQU87QUFBQSxJQUM5QjtBQUFBLEVBRUY7QUFFQSxRQUFNLGtCQUFrQixVQUFVLEtBQUssUUFBUTtBQUMvQyxNQUFJO0FBRUosTUFBSSxjQUFjLGlCQUFpQixPQUFPO0FBQ3hDLFlBQVEsZ0JBQWdCO0FBQ3hCLHNCQUFrQjtBQUFBLEVBQ3BCO0FBRUEsWUFBVSxpQkFBaUIsNEJBQW9EO0FBQUEsSUFDM0U7QUFBQSxJQUNBLGFBQWEsS0FBSztBQUFBLElBQ2xCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxFQUNwQixDQUFDLENBQUMsSUFDQSxTQUNBLGlCQUFpQjtBQUVyQixNQUFJLENBQUMsaUJBQWlCO0FBRXBCLFFBQUksVUFBVSxTQUFTLGVBQWUsUUFBUSxhQUFhLENBQUMsR0FBRztBQUM3RCxjQUFRLGNBQWM7QUFBQSxJQUN4QixXQUFXLFVBQVUsU0FBUyxhQUFhLEdBQUc7QUFDNUMsY0FBUSxjQUFjO0FBQUEsSUFDeEI7QUFBQSxFQUVGO0FBRUEsUUFBTSxVQUFVLHFCQUFxQiw0QkFBd0Q7QUFBQSxJQUMzRjtBQUFBLElBQ0E7QUFBQSxJQUNBLHdCQUF3QixrQkFBa0IsaUJBQWlCLENBQUMsQ0FBQyxpQkFBaUI7QUFBQSxJQUM5RTtBQUFBLElBQ0EsY0FBYyxLQUFLO0FBQUEsSUFDbkIsa0JBQWtCO0FBQUEsSUFDbEI7QUFBQSxJQUNBLGtCQUFrQjtBQUFBLEVBQ3BCLENBQUMsQ0FBQztBQUNGLFNBQU87QUFDVDtBQVFBLGVBQXNCLHFCQUFxQixRQUFxRDtBQUM5RixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFNBQU8sTUFBTSxtQkFBbUI7QUFBQSxJQUM5QjtBQUFBLElBQ0E7QUFBQSxJQUNBLGVBQWUsQ0FBQyxTQUFTO0FBQ3ZCLFlBQU0sY0FBYyxVQUFVLEtBQUssUUFBUTtBQUMzQyxVQUFJLCtCQUErQixVQUFhLCtCQUErQixhQUFhO0FBQzFGO0FBQUEsTUFDRjtBQUNBLGFBQU8sWUFBWSw0QkFBK0M7QUFBQSxRQUNoRTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDLENBQUM7QUFBQSxJQUNKO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRQSxlQUFzQixrQkFBa0IsUUFBZ0Q7QUFDdEYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLE1BQUksYUFBYSxtQkFBbUIsS0FBSyxDQUFDLElBQUksZ0JBQWdCLHFCQUFxQixtQkFBbUIsTUFBTSxHQUFHO0FBQzdHO0FBQUEsRUFDRjtBQUVBLFFBQU0sVUFBVTtBQUFBLElBQ2QsR0FBRztBQUFBLElBQ0gsZUFBZSxDQUFDLFNBQVM7QUFDdkIsWUFBTSxjQUFjLFVBQVUsS0FBSyxRQUFRO0FBQzNDLFVBQUksK0JBQStCLFVBQWEsK0JBQStCLGFBQWE7QUFDMUY7QUFBQSxNQUNGO0FBQ0EsYUFBTyxZQUFZLDRCQUErQztBQUFBLFFBQ2hFO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGLENBQUMsQ0FBQztBQUFBLElBQ0o7QUFBQSxJQUNBLFlBQVk7QUFBQSxFQUNkLENBQUM7QUFDSDtBQUVBLFNBQVMsZ0JBQWdCLFFBQXVDO0FBQzlELFFBQU0sRUFBRSxrQkFBa0IsWUFBWSxJQUFJLElBQUk7QUFDOUMsTUFBSSxjQUFjLGtCQUFrQjtBQUNsQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDRixXQUFPLG1CQUFtQixHQUFHO0FBQUEsRUFDL0IsU0FBUyxPQUFPO0FBQ2QsWUFBUSxNQUFNLHdCQUF3QixHQUFHLElBQUksS0FBSztBQUNsRCxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyxhQUFhLFFBQWdEO0FBQ3BFLFFBQU0sRUFBRSxnQkFBZ0Isa0JBQWtCLElBQUksSUFBSTtBQUNsRCxTQUFPLG1CQUFtQixpQkFDdEIsSUFBSSxNQUFNLGtCQUFrQixjQUFjLElBQzFDO0FBQ047QUFFQSxTQUFTLGlCQUFpQixRQUFzQztBQUM5RCxRQUFNLEVBQUUsV0FBVyxhQUFhLEtBQUssVUFBVSxJQUFJO0FBQ25ELE1BQUksY0FBYyxXQUFXO0FBQzNCO0FBQUEsRUFDRjtBQUVBLFFBQU0sV0FBVyxJQUFJLE1BQU0sYUFBYSxZQUFZLENBQUM7QUFDckQsYUFBVztBQUFBLElBQ1QsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxNQUFNO0FBQ3ZELFVBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRztBQUNmO0FBQUEsTUFDRjtBQUVBLGdCQUFVLEtBQUs7QUFBQSxRQUNiLFlBQVksVUFBVSxHQUFHO0FBQUEsUUFDekIsV0FBVyxjQUFjLFNBQVMsSUFBSTtBQUFBLFFBQ3RDLGtCQUFrQjtBQUFBLFFBQ2xCLFNBQVM7QUFBQSxRQUNULFlBQVk7QUFBQSxRQUNaLFlBQVk7QUFBQSxRQUNaLEtBQUs7QUFBQSxRQUNMLGFBQWEsY0FBYztBQUFBLFFBQzNCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0EsYUFBYTtBQUFBLElBQ2IsS0FBSztBQUFBLEVBQ1AsQ0FBQztBQUNIO0FBRUEsU0FBUyxnQ0FBZ0MsUUFBd0Q7QUFDL0YsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLE1BQUksT0FBTyxVQUFVLFVBQVU7QUFDN0IsVUFBTSxrQkFBa0IsVUFBVSxLQUFLO0FBQ3ZDLFFBQUksQ0FBQyxtQkFBbUIsZ0JBQWdCLGNBQWMsZ0JBQWdCLFlBQVk7QUFDaEYsYUFBTztBQUFBLElBQ1Q7QUFFQSxVQUFNLHFCQUFxQixDQUFDO0FBQzVCLFFBQUksT0FBTyxNQUFNLGlCQUFpQixLQUFLLENBQUMsb0JBQW9CLGdCQUFnQixRQUFRLEdBQUc7QUFFdkYsUUFBSSxDQUFDLE1BQU07QUFDVCxhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsTUFBTTtBQUFBLFFBQ04sVUFBVTtBQUFBLE1BQ1o7QUFDQSxZQUFNLGlCQUFpQixLQUFLLElBQUk7QUFBQSxJQUNsQztBQUVBLFNBQUssT0FBTyxnQkFBZ0I7QUFDNUIsU0FBSyxXQUFXO0FBQ2hCLFFBQUksZ0JBQWdCLFVBQVUsUUFBVztBQUN2QyxXQUFLLGNBQWMsZ0JBQWdCO0FBQUEsSUFDckM7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksT0FBTyxVQUFVLFlBQVksVUFBVSxNQUFNO0FBQy9DLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxzQkFBc0I7QUFFMUIsYUFBVyxDQUFDLFVBQVUsVUFBVSxLQUFLLE9BQU8sUUFBUSxLQUFzQixHQUFHO0FBQzNFLFVBQU0sMkJBQTJCLGdDQUFnQyxFQUFFLE9BQU8sS0FBSyxNQUFNLEdBQUcsR0FBRyxJQUFJLFFBQVEsS0FBSyxVQUFVLE9BQU8sV0FBVyxDQUFDO0FBQ3pJLDRCQUF3QjtBQUFBLEVBQzFCO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyxpQkFBaUIsUUFBd0M7QUFDaEUsUUFBTSxFQUFFLEtBQUssUUFBUSxTQUFTLFdBQVcsSUFBSTtBQUM3QyxNQUFJLEVBQUUsV0FBVyxJQUFJO0FBQ3JCLE1BQUksZUFBZSxLQUFLO0FBQ3RCLGlCQUFhO0FBQUEsRUFDZjtBQUVBLE1BQUk7QUFFSixNQUFJLFdBQVcsU0FBUyxjQUFjLFdBQVcsT0FBTyx3QkFBd0I7QUFDOUUsZUFBVztBQUFBLEVBQ2IsT0FBTztBQUVMLFlBQVEsT0FBTyxlQUFlO0FBQUE7QUFBQSxNQUU1QixLQUFLO0FBQ0gsbUJBQVcsV0FBVztBQUN0QixZQUFJLE9BQU8seUNBQXlDLENBQUMsU0FBUyxXQUFXLEdBQUcsR0FBRztBQUM3RSxxQkFBVyxJQUFJLFFBQVE7QUFBQSxRQUN6QjtBQUNBO0FBQUEsTUFDRixLQUFLO0FBQ0gsbUJBQVcsU0FBUyxRQUFRLFVBQVUsR0FBRyxXQUFXLElBQUk7QUFDeEQsWUFBSSxPQUFPLHVDQUF1QyxDQUFDLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFDM0UscUJBQVcsS0FBSyxRQUFRO0FBQUEsUUFDMUI7QUFDQTtBQUFBLE1BQ0YsS0FBSywyREFBNkM7QUFDaEQsY0FBTSxlQUFlLGVBQWUsVUFBVSxJQUFJLFdBQVcsV0FBVyxXQUFXO0FBQ25GLGNBQU0sZUFBZSxJQUFJLGNBQWMsZ0JBQWdCLGNBQWMsVUFBVTtBQUMvRSxtQkFBVyxhQUFhLFdBQVcsS0FBSyxhQUFhLENBQUMsTUFBTSxhQUFhLFdBQVcsT0FBTyxXQUFXO0FBQ3RHO0FBQUEsTUFDRjtBQUFBO0FBQUEsTUFFQTtBQUNFLG9CQUFZLE9BQU8sYUFBYTtBQUFBLElBRXBDO0FBQUEsRUFDRjtBQUVBLGFBQVcsT0FBTyxhQUNkLFFBQVE7QUFBQSxJQUNSLEtBQUs7QUFBQSxJQUNMLFFBQVEsSUFBSSx1QkFBdUI7QUFBQSxFQUNyQyxDQUFDLElBQ0M7QUFDSixjQUFZO0FBRVosU0FBTztBQUNUO0FBRUEsU0FBUyx5QkFBeUIsUUFBNEM7QUFDNUUsUUFBTSxFQUFFLElBQUksSUFBSTtBQUNoQixRQUFNLGFBQWEsUUFBUSw0QkFBMkMsRUFBRSxLQUFLLFlBQVksT0FBTyxrQkFBa0IsMEJBQTBCLE9BQU8seUJBQXlCLENBQUMsQ0FBQztBQUM5SyxRQUFNLGFBQWEsUUFBUSxLQUFLLE9BQU8sZ0JBQWdCO0FBQ3ZELFFBQU0sVUFBVSxPQUFPLFdBQVc7QUFFbEMsUUFBTSxhQUFhLGNBQWMsTUFBTTtBQUN2QyxRQUFNLFdBQVcsaUJBQWlCO0FBQUEsSUFDaEM7QUFBQSxJQUNBLFFBQVE7QUFBQSxJQUNSO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPLFdBQVcsYUFDZCxpQkFBaUI7QUFBQSxJQUNqQixPQUFPLE9BQU87QUFBQSxJQUNkLFNBQVMsV0FBVztBQUFBLElBQ3BCO0FBQUEsRUFDRixDQUFDLElBQ0MsMEJBQTBCO0FBQUEsSUFDMUIsUUFBUTtBQUFBLElBQ1I7QUFBQSxJQUNBLG9CQUFvQjtBQUFBLElBQ3BCO0FBQUEsRUFDRixDQUFDO0FBQ0w7QUFFQSxTQUFTLDBCQUEwQixRQUFpRDtBQUNsRixRQUFNLEVBQUUsUUFBUSxVQUFVLG9CQUFvQixXQUFXLElBQUk7QUFDN0QsTUFBSSxRQUFRLG1CQUFtQixTQUFTO0FBQ3hDLE1BQUksb0JBQW9CLG1CQUFtQixxQkFBcUI7QUFDaEUsTUFBSSxDQUFDLFVBQVUsZUFBZSxVQUFVLEtBQUssQ0FBQyxtQkFBbUIsMkJBQTJCO0FBQzFGLFlBQVEsQ0FBQyxtQkFBbUIsZ0RBQWdELGVBQWUsVUFBVSxJQUNqRyxXQUFXLFdBQ1gsV0FBVztBQUNmLHdCQUFvQjtBQUFBLEVBQ3RCO0FBRUEsU0FBTyx3QkFBd0I7QUFBQSxJQUM3QjtBQUFBLElBQ0EsU0FBUyxPQUFPO0FBQUEsSUFDaEIsWUFBWTtBQUFBLElBQ1o7QUFBQSxJQUNBLHdCQUF3QixPQUFPO0FBQUEsSUFDL0IsS0FBSztBQUFBLEVBQ1AsQ0FBQztBQUNIO0FBRUEsU0FBUyxpQkFBaUIsUUFBd0M7QUFDaEUsUUFBTSxFQUFFLE9BQU8sU0FBUyxTQUFTLElBQUk7QUFDckMsTUFBSSxPQUFPLFlBQVksTUFBTSxTQUFTLFlBQVksR0FBRztBQUNuRCxXQUFPLHdCQUF3QjtBQUFBLE1BQzdCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixLQUFLO0FBQUEsSUFDUCxDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU8sd0JBQXdCO0FBQUEsSUFDN0I7QUFBQSxJQUNBO0FBQUEsSUFDQSxZQUFZO0FBQUEsSUFDWixLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0g7QUFFQSxlQUFlLGVBQWUsUUFBcUQ7QUFDakYsUUFBTSxFQUFFLE9BQU8sbUJBQW1CLGNBQWMsSUFBSTtBQUNwRCxNQUFJLEVBQUUsWUFBWSxJQUFJO0FBQ3RCLGtCQUFnQixpQkFBaUI7QUFDakMsY0FBWSxlQUFlO0FBRTNCLE1BQUksQ0FBQyxPQUFPO0FBQ1YsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUVBLFFBQU0sVUFBd0IsQ0FBQztBQUUvQixRQUFNLGtCQUFtQyxNQUFNLFlBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxZQUFZLFFBQVEsU0FBUyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWE7QUFBQSxJQUM3SCxLQUFLLFFBQVEsU0FBUyxJQUFJO0FBQUEsSUFDMUIsT0FBTyxRQUFRLFNBQVMsTUFBTTtBQUFBLEVBQ2hDLEVBQUU7QUFFRixhQUFXLFFBQVEsWUFBWSxLQUFLLEdBQUc7QUFDckMsZ0JBQVksZUFBZTtBQUMzQixVQUFNLGFBQWEsTUFBTSxjQUFjLE1BQU0sV0FBVztBQUN4RCxnQkFBWSxlQUFlO0FBQzNCLFFBQUksZUFBZSxRQUFXO0FBQzVCO0FBQUEsSUFDRjtBQUVBLFVBQU0sYUFBYSxzQkFBc0IsTUFBTSxVQUFVO0FBRXpELFFBQUksbUJBQW1CO0FBQ3JCLFVBQUksZUFBZSxVQUFVLEdBQUc7QUFDOUIsZ0JBQVEsS0FBSyxVQUFVO0FBQUEsTUFDekIsT0FBTztBQUNMLGdCQUFRLE1BQU0sMkJBQTJCLFVBQVU7QUFDbkQ7QUFBQSxNQUNGO0FBQUEsSUFDRixPQUFPO0FBQ0wsVUFBSSw0QkFBNEIsWUFBWSxjQUFjLEdBQUc7QUFDM0QsbUJBQVcsYUFBYSxXQUFXLFdBQVcsV0FBVyxtQ0FBbUMsd0JBQXdCO0FBQUEsTUFDdEg7QUFFQSxjQUFRLEtBQUssVUFBVTtBQUFBLElBQ3pCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsc0JBQXNCLEtBQVUsZUFBbUQ7QUFDMUYsUUFBTSxnQkFBZ0IsaUJBQWlCO0FBQ3ZDLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTyw4Q0FBOEMsR0FBRztBQUFBLElBQzFELEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1Q7QUFDRSxrQkFBWSxhQUFhO0FBQUEsRUFDN0I7QUFDRjtBQUVBLFNBQVMsY0FBYyxRQUFnRDtBQUNyRSxRQUFNLEVBQUUsSUFBSSxJQUFJO0FBQ2hCLFNBQU87QUFBQSxJQUNMLFNBQVMsT0FBTyxZQUFZLE9BQU8sZUFBZSxVQUFVLE9BQU8sWUFBWSxJQUFJO0FBQUEsSUFDbkYsd0JBQXdCLE9BQU8sMEJBQTBCO0FBQUEsSUFDekQsWUFBWSx1QkFBdUIsNEJBQTBEO0FBQUEsTUFDM0Y7QUFBQSxNQUNBLFdBQVcsT0FBTztBQUFBLE1BQ2xCLGNBQWMsT0FBTztBQUFBLElBQ3ZCLENBQUMsQ0FBQztBQUFBLElBQ0YsZUFBZSxzQkFBc0IsS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUM5RCx3QkFBd0IsT0FBTywyQkFBMkIsT0FBTyxlQUFlLGtCQUFrQixPQUFPLFlBQVksSUFBSSxXQUFjO0FBQUEsSUFDdkkscUNBQXFDLE9BQU8sd0NBQ3RDLE9BQU8sZUFBZSxlQUFlLE9BQU8sWUFBWSxJQUFJLFdBQWM7QUFBQSxJQUNoRix1Q0FBdUMsT0FBTywwQ0FDeEMsT0FBTyxlQUFlLGlCQUFpQixPQUFPLFlBQVksSUFBSSxXQUFjO0FBQUEsRUFDcEY7QUFDRjtBQUVBLFNBQVMsV0FBVyxNQUFZLEtBQXFCO0FBQ25ELFFBQU0sTUFBTSxrQkFBa0IsS0FBSyxRQUFRO0FBQzNDLFNBQU8sSUFBSSxNQUFNLElBQUksTUFBTSxRQUFRLElBQUksSUFBSSxNQUFNO0FBQ25EO0FBRUEsU0FBUyx1QkFBdUIsUUFBK0M7QUFDN0UsUUFBTSxFQUFFLEtBQUssT0FBTyxJQUFJO0FBQ3hCLFFBQU0scUJBQXFCO0FBQzNCLFNBQU8sSUFBSSxXQUFXLGtCQUFrQixLQUFLLE9BQU8sV0FBVyxrQkFBa0I7QUFDbkY7QUFFQSxTQUFTLGNBQWMsTUFBWSxLQUE4QjtBQUMvRCxRQUFNLG9CQUFvQjtBQUMxQixRQUFNLGNBQWM7QUFDcEIsUUFBTSxNQUFNLFdBQVcsTUFBTSxHQUFHO0FBQ2hDLFFBQU0sdUJBQXVCLEtBQUssU0FBUyxDQUFDLEdBQUcsVUFBVSxNQUFNLFVBQVU7QUFDekUsUUFBTSxxQkFBcUIsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsSUFBSSxVQUFVO0FBQ3pFLFFBQU0sV0FBVyxrQkFBa0IsS0FBSyxRQUFRO0FBQ2hELFFBQU0sZ0JBQWdCLGtCQUFrQixTQUFTLElBQUksTUFBTTtBQUMzRCxRQUFNLGtCQUFrQixrQkFBa0IsU0FBUyxNQUFNLE1BQU07QUFDL0QsUUFBTSxTQUFTLElBQUksTUFBTSxxQkFBcUIsa0JBQWtCLFFBQVEsZ0JBQWdCLFlBQVksTUFBTTtBQUMxRyxRQUFNLG1CQUFtQix1QkFBdUI7QUFBQSxJQUM5QztBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDRCxRQUFNLGFBQWEsTUFBTSxLQUFLLEdBQUc7QUFDakMsUUFBTSxNQUFNLGdCQUFnQjtBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLElBQ0EsS0FBSyxLQUFLO0FBQUEsRUFDWixDQUFDO0FBQ0QsUUFBTSxRQUFRLGFBQWE7QUFBQSxJQUN6QixnQkFBZ0I7QUFBQSxJQUNoQixrQkFBa0I7QUFBQSxJQUNsQjtBQUFBLEVBQ0YsQ0FBQztBQUNELFNBQU8sNEJBQTZDO0FBQUEsSUFDbEQ7QUFBQSxJQUNBLFlBQVksYUFBYSxVQUFVLEdBQUcsSUFBSTtBQUFBLElBQzFDLFdBQVc7QUFBQSxJQUNYO0FBQUEsSUFDQSxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1o7QUFBQSxJQUNBLGFBQWE7QUFBQSxJQUNiLE9BQU8sS0FBSyxTQUFTO0FBQUEsSUFDckIsZ0JBQWdCLFVBQVUsU0FBWSxTQUFZLGNBQWMsS0FBSztBQUFBLElBQ3JFO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFFQSxTQUFTLGtCQUFrQixNQUFvQixLQUE4QjtBQUMzRSxRQUFNLFdBQVcsa0JBQWtCLEtBQUssUUFBUTtBQUNoRCxTQUFPLDRCQUE2QztBQUFBLElBQ2xELE9BQU8sSUFBSSxTQUFTLGdCQUFnQixJQUFJLEtBQUssS0FBSyxRQUFRO0FBQUEsSUFDMUQsV0FBVyxrQkFBa0IsU0FBUyxJQUFJLE1BQU07QUFBQSxJQUNoRCxTQUFTO0FBQUEsSUFDVCxZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsSUFDWixLQUFLLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDekIsYUFBYSxrQkFBa0IsU0FBUyxNQUFNLE1BQU07QUFBQSxJQUNwRCxLQUFLLEtBQUs7QUFBQSxFQUNaLENBQUM7QUFDSDtBQUVBLFNBQVMsOENBQThDLEtBQThCO0FBQ25GLFFBQU0sZ0JBQWdCLGlCQUFpQixHQUFHO0FBQzFDLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1QsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0Usa0JBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7QUFFQSxTQUFTLDRCQUE0QixZQUF3QixnQkFBMEM7QUFFckcsTUFBSSxDQUFDLGdCQUFnQixVQUFVLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFHQSxNQUFJLENBQUMsa0NBQWtDLEtBQUssV0FBVyxVQUFVLEdBQUc7QUFDbEUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFNBQVMsV0FBVyxVQUFVLFNBQVMsTUFBTSxVQUFVLFdBQVcsVUFBVSxTQUFTLElBQUksVUFBVSxjQUFjLEdBQUc7QUFDbEw7QUFFQSxTQUFTLHVCQUF1QixRQUErQztBQUM3RSxRQUFNLEVBQUUsS0FBSyxXQUFXLGFBQWEsSUFBSTtBQUN6QyxRQUFNLGdCQUFnQixhQUFhO0FBQ25DLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTyxtQkFBbUIsR0FBRztBQUFBLElBQy9CLEtBQUs7QUFDSCxhQUFPLGlCQUFpQixTQUFZLG1CQUFtQixHQUFHLElBQUksYUFBYSxZQUFZO0FBQUEsSUFDekYsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0Usa0JBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkxpbmtQYXRoU3R5bGUiLCAiTGlua1N0eWxlIl0KfQo=
852
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBHZXRGaWxlUGFyYW1zLFxuICBQYXRoT3JGaWxlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVGaWxlVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBlc2NhcGVBbGlhcyxcbiAgaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgaXNQYXJzZUxpbmtSZWZlcmVuY2UsXG4gIHBhcnNlTGlua1xufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gJ1xcXFx8JztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gZWRpdCB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRMaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleHRyYWN0TGlua0ZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RMaW5rRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBjYWNoZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgZm9yIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1thbGlhc3xsaW5rXV1gXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKGxpbmsubWQpYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtbdGFyZ2V0XV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1t0YXJnZXRdXWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mXG4gICAqXG4gICAqIC0ge0BsaW5rIGlzRW1iZWR9XG4gICAqIC0ge0BsaW5rIGxpbmtTdHlsZX1cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlQW5nbGVCcmFja2V0c31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHN9XG4gICAqXG4gICAqIFRoZXNlIGluZmVycmVkIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpZiBzcGVjaWZpZWQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgZG90LlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvU291cmNlfS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1suL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIHNsYXNoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtQYXRoU3R5bGV9IGlzIHtAbGluayBMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHR9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy9hYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1thYnNvbHV0ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZVJhd01hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhIHdpa2lsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzV2lraWxpbmt9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNXaWtpbGlua30gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkUmVzZXRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICAvKipcbiAgICogQSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGguXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbH0uXG4gKi9cbmludGVyZmFjZSBGaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBtZXRhZGF0YSBjYWNoZSB0byBmaXggdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHBhdGggb2YgdGhlIGN1cnJlbnQgdmFsdWUgd2l0aGluIHRoZSBmcm9udG1hdHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmcm9udG1hdHRlciB2YWx1ZSB0byBpbnNwZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzKSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gbXVsdGktbGluayBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZTogRmluYWxMaW5rUGF0aFN0eWxlO1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRVc2VXaWtpbGlua1N0eWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICBlbmQ6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsocGFyYW1zOiBDb252ZXJ0TGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIHBhcmFtcy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogcGFyYW1zLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gZW5zdXJlTm9uTnVsbGFibGUoYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSk7XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IEpTT04uc3RyaW5naWZ5KGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtKc29uID0gSlNPTi5zdHJpbmdpZnkobGluayk7XG4gICAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICAgIH0sXG4gICAgICBwYXRoT3JGaWxlOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKHBhcmFtczogRWRpdExpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKHtcbiAgICBhcHAsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmIChjb250ZW50ICE9PSBjYWNoZWRDb250ZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBpc0NhbnZhc0ZpbGUocGF0aE9yRmlsZSksXG4gICAgICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhdGhPckZpbGUsXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50LlxuICogQHJldHVybnMgVGhlIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBjb250ZW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzSW5Db250ZW50KHBhcmFtczogRWRpdExpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQsIGxpbmtDb252ZXJ0ZXIsIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSwgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIGNvbnRlbnQsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBnZXRGaWxlQ2hhbmdlcyh7XG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgaXNDYW52YXNGaWxlQ2FjaGU6IGZhbHNlLFxuICAgICAgICBsaW5rQ29udmVydGVyLFxuICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfSxcbiAgICBjb250ZW50LFxuICAgIHBhdGg6ICcnXG4gIH0pO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld0NvbnRlbnQsICdGYWlsZWQgdG8gdXBkYXRlIGxpbmtzIGluIGNvbnRlbnQnKTtcblxuICByZXR1cm4gbmV3Q29udGVudDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggYSBsaW5rLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZXh0cmFjdGluZyB0aGUgbGluayBmaWxlLlxuICogQHJldHVybnMgVGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtGaWxlKHBhcmFtczogRXh0cmFjdExpbmtGaWxlUGFyYW1zKTogbnVsbCB8IFRGaWxlIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIHNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlID0gZmFsc2UsXG4gICAgc291cmNlUGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBjb25zdCB7IGxpbmtQYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBzb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgZmlsZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtQYXRoLCBzb3VyY2VQYXRoKTtcbiAgaWYgKGZpbGUpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGlmICghc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChsaW5rUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IGZ1bGxMaW5rUGF0aCA9IGpvaW4oZGlybmFtZShzb3VyY2VQYXRoKSwgYC4vJHtsaW5rUGF0aH1gKTtcblxuICBpZiAoZnVsbExpbmtQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogZnVsbExpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG59XG5cbi8qKlxuICogRml4ZXMgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIHdlcmUgZml4ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHsgY2FjaGUsIGtleTogJycsIHZhbHVlOiBjYWNoZS5mcm9udG1hdHRlciB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRm4pID0+IGRlZmF1bHRQYXJhbXNGbigpKTtcbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG5cbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbdGFyZ2V0RmlsZV0pO1xuICByZXR1cm4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsfT5gXG4gICAgOiBlbmNvZGVVcmwocGFyYW1zLnVybCk7XG5cbiAgY29uc3QgdGl0bGVQYXJ0ID0gcGFyYW1zLnRpdGxlID8gYCAke0pTT04uc3RyaW5naWZ5KHBhcmFtcy50aXRsZSl9YCA6ICcnO1xuXG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHtlc2NhcGVkQWxpYXN9XSgke3VybH0ke3RpdGxlUGFydH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaGFyZWQsIG11dGFibGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgcGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBldmVyeSB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9IGNhbGwgYW5kIGl0cyByZXN1bHQgaXMgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyAobGF0ZXJcbiAqIHJlZ2lzdHJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLCBidXQgbmV2ZXIgb3ZlciBleHBsaWNpdGx5IHBhc3NlZCBwYXJhbXMpLiBSZWdpc3RlciBlbnRyaWVzXG4gKiBieSBhZGRpbmcgYSBgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zQ29tcG9uZW50YCB0byBhIGNvbXBvbmVudCB0cmVlIHJhdGhlciB0aGFuIG11dGF0aW5nIHRoaXMgbGlzdCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbXV0YWJsZSBsaXN0IG9mIGRlZmF1bHQtcGFyYW1zIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpOiAoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBhbGlhcyBvZiBhIGxpbmsgc2hvdWxkIGJlIHJlc2V0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFsaWFzIHNob3VsZCBiZSByZXNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFJlc2V0QWxpYXMocGFyYW1zOiBTaG91bGRSZXNldEFsaWFzUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZGlzcGxheVRleHQsXG4gICAgaXNXaWtpbGluayxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChpc1dpa2lsaW5rID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghZGlzcGxheVRleHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiB0YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG5ld1NvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3QgbmV3U291cmNlRm9sZGVyID0gZGlybmFtZShuZXdTb3VyY2VQYXRoKTtcbiAgY29uc3Qgb2xkU291cmNlRm9sZGVyID0gZGlybmFtZShvbGRTb3VyY2VQYXRoKTtcbiAgY29uc3QgYWxpYXNlc1RvUmVzZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhdGhPckZpbGUgb2YgW3RhcmdldEZpbGUucGF0aCwgb2xkVGFyZ2V0UGF0aF0pIHtcbiAgICBpZiAoIXBhdGhPckZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHBhdGgpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChiYXNlbmFtZShwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG5ld1NvdXJjZUZvbGRlciwgcGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShvbGRTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBbb2xkU291cmNlUGF0aCwgbmV3U291cmNlUGF0aF0pIHtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZVRvTGlua3RleHQodGFyZ2V0RmlsZSwgc291cmNlUGF0aCwgZmFsc2UpKTtcbiAgfVxuXG4gIGNvbnN0IGNsZWFuRGlzcGxheVRleHQgPSByZXBsYWNlQWxsKHtcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwuXFwvL2csXG4gICAgc3RyOiBub3JtYWxpemVQYXRoKGVuc3VyZU5vbk51bGxhYmxlKGRpc3BsYXlUZXh0LnNwbGl0KCcgPiAnKVswXSkpXG4gIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZShsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0cywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW3RpdGxlXSg8bGluaz4pYCwgYCFbdGl0bGVdKDxsaW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RFbWJlZChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ0RvdChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py51cmwuc3RhcnRzV2l0aCgnLi8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy9saW5rXV1gLCBgW3RpdGxlXSgvbGluaylgLCBgW3RpdGxlXSg8L2xpbms+KWAsXG4gKiBgIVtbL2xpbmtdXWAsIGAhW3RpdGxlXSgvbGluaylgLCBgIVt0aXRsZV0oPC9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2hcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlc3RXaWtpbGluayhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIHRvIGEgcHJldHR5IGZvcm0sIGNvbnZlcnRpbmcgYmFja3NsYXNoZXMgdG8gZm9yd2FyZFxuICogc2xhc2hlcy4gT3RoZXIgbGlua3MgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igbm9ybWFsaXppbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIG5vcm1hbGl6ZWQgYGZpbGU6Ly9gIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50KHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBhcHAsIGNvbnRlbnQsIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPSBmYWxzZSB9ID0gcGFyYW1zO1xuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXM+KHtcbiAgICBhYm9ydFNpZ25hbDogcGFyYW1zLmFib3J0U2lnbmFsLFxuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiBub3JtYWxpemVGaWxlVXJsTGluayhsaW5rLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzKSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBmaWxlIHRvIGEgcHJldHR5IGZvcm0sIGNvbnZlcnRpbmcgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzLlxuICogT3RoZXIgbGlua3MgYXJlIGxlZnQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igbm9ybWFsaXppbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBhcmUgbm9ybWFsaXplZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZShwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyA9IHRydWVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKCFuZXdUYXJnZXRQYXRoT3JGaWxlKSB7XG4gICAgcmV0dXJuIGxpbmsub3JpZ2luYWw7XG4gIH1cbiAgY29uc3QgbmV3VGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IG5ld1RhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRUYXJnZXRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFRhcmdldFBhdGhPckZpbGUgPz8gbmV3VGFyZ2V0UGF0aE9yRmlsZSk7XG4gIGNvbnN0IGlzV2lraWxpbmsgPSBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWxcbiAgfSkpO1xuXG4gIGNvbnN0IHsgc3VicGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGxldCBzaG91bGRLZWVwQWxpYXMgPSAhc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcztcblxuICBpZiAoaXNDYW52YXNGaWxlKG5ld1NvdXJjZVBhdGhPckZpbGUpKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIENhbnZhcyBmaWxlIG5vZGUgcmVmZXJlbmNlIGJyYW5jaCBpcyBoYXJkIHRvIHJlcHJvZHVjZSBpbiB1bml0IHRlc3RzLiAqL1xuICAgIGlmIChpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgICByZXR1cm4gbmV3VGFyZ2V0RmlsZS5wYXRoICsgc3VicGF0aDtcbiAgICB9XG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgbGV0IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzV2lraWxpbmsgJiYgcGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgIGFsaWFzID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIHNob3VsZEtlZXBBbGlhcyA9IHRydWU7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzO1xuXG4gIGlmICghc2hvdWxkS2VlcEFsaWFzKSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsaWFzIG1hdGNoaW5nIGJyYW5jaGVzIGFyZSBoYXJkIHRvIHJlcHJvZHVjZSBpbiB1bml0IHRlc3RzLiAqL1xuICAgIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCwgZXh0bmFtZShvbGRUYXJnZXRQYXRoKSkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gICAgfVxuICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IG9sZFNvdXJjZVBhdGggPT09IG9sZFRhcmdldFBhdGggJiYgISFwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIHVwZGF0ZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQoe1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIC4uLnBhcmFtcyxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICBhcHAsXG4gICAgICAgIGxpbmssXG4gICAgICAgIGxpbmtTdHlsZSxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgICAgfSkpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChwYXJhbXM6IEZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGxQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCB2YWx1ZTogY2hpbGRWYWx1ZSB9KTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgdGFyZ2V0RmlsZS5wYXRoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgICAgY29uc3Qgc2hvcnRlc3ROYW1lID0gaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgPyB0YXJnZXRGaWxlLmJhc2VuYW1lIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgICAgICBjb25zdCBtYXRjaGVkRmlsZXMgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRMaW5rcGF0aERlc3Qoc2hvcnRlc3ROYW1lLCBzb3VyY2VQYXRoKTtcbiAgICAgICAgbGlua1RleHQgPSBtYXRjaGVkRmlsZXMubGVuZ3RoID09PSAxICYmIG1hdGNoZWRGaWxlc1swXSA9PT0gdGFyZ2V0RmlsZSA/IHRhcmdldEZpbGUubmFtZSA6IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIHZhbGlkIEZpbmFsTGlua1BhdGhTdHlsZSB2YWx1ZXMgYXJlIGhhbmRsZWQgYWJvdmUuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICBzdHI6IGxpbmtUZXh0LFxuICAgICAgc3VmZml4OiBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YFxuICAgIH0pXG4gICAgOiBsaW5rVGV4dDtcbiAgbGlua1RleHQgKz0gc3VicGF0aDtcblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMuc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBwYXJhbXMuc3VicGF0aCA/PyAnJztcblxuICBjb25zdCBsaW5rQ29uZmlnID0gZ2V0TGlua0NvbmZpZyhwYXJhbXMpO1xuICBjb25zdCBsaW5rVGV4dCA9IGdlbmVyYXRlTGlua1RleHQoe1xuICAgIGFwcCxcbiAgICBjb25maWc6IGxpbmtDb25maWcsXG4gICAgc291cmNlUGF0aCxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldEZpbGVcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmtDb25maWcuaXNXaWtpbGlua1xuICAgID8gZ2VuZXJhdGVXaWtpTGluayh7XG4gICAgICBhbGlhczogcGFyYW1zLmFsaWFzLFxuICAgICAgaXNFbWJlZDogbGlua0NvbmZpZy5pc0VtYmVkLFxuICAgICAgbGlua1RleHRcbiAgICB9KVxuICAgIDogZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayh7XG4gICAgICBjb25maWc6IGxpbmtDb25maWcsXG4gICAgICBsaW5rVGV4dCxcbiAgICAgIG1hcmtkb3duTGlua1BhcmFtczogcGFyYW1zLFxuICAgICAgdGFyZ2V0RmlsZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29uZmlnLCBsaW5rVGV4dCwgbWFya2Rvd25MaW5rUGFyYW1zLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCBhbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSB8fCAhbWFya2Rvd25MaW5rUGFyYW1zLmlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCkpIHtcbiAgICBhbGlhcyA9ICFtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMgfHwgaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSlcbiAgICAgID8gdGFyZ2V0RmlsZS5iYXNlbmFtZVxuICAgICAgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgc2hvdWxkRXNjYXBlQWxpYXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkOiBjb25maWcuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVdpa2lMaW5rKHBhcmFtczogR2VuZXJhdGVXaWtpTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYWxpYXMsIGlzRW1iZWQsIGxpbmtUZXh0IH0gPSBwYXJhbXM7XG4gIGlmIChhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gbGlua1RleHQudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgICBpc0VtYmVkLFxuICAgICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICAgIHVybDogYWxpYXNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVDaGFuZ2VzKHBhcmFtczogR2V0RmlsZUNoYW5nZXNQYXJhbXMpOiBQcm9taXNlPEZpbGVDaGFuZ2VbXT4ge1xuICBjb25zdCB7XG4gICAgY2FjaGUsXG4gICAgaXNDYW52YXNGaWxlQ2FjaGUsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0TGlua3MoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdEFuZ2xlQnJhY2tldHMocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdEb3QocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbms6IFJlZmVyZW5jZSwgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbik6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBpZiAoaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZShsaW5rKSkge1xuICAgIGlmICghbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICBpZiAoIXBhcnNlTGlua1Jlc3VsdC5pc0ZpbGVVcmwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXM6IHBhcnNlTGlua1Jlc3VsdC5hbGlhcyxcbiAgICBpc0VtYmVkOiBwYXJzZUxpbmtSZXN1bHQuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbm9ybWFsaXplRmlsZVVybChwYXJzZUxpbmtSZXN1bHQudXJsKVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHA6IEFwcCk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IG5ld0xpbmtGb3JtYXQgPSBnZXROZXdMaW5rRm9ybWF0KGFwcCk7XG4gIHN3aXRjaCAobmV3TGlua0Zvcm1hdCkge1xuICAgIGNhc2UgJ2Fic29sdXRlJzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICBjYXNlICdyZWxhdGl2ZSc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgJ3Nob3J0ZXN0JzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihuZXdMaW5rRm9ybWF0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSk6IGJvb2xlYW4ge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZ2V0RmlsZUNoYW5nZXMgb25seSBjYWxscyB0aGlzIGZvciBub24tY2FudmFzIGZpbGVzIHdoaWNoIGFsd2F5cyBoYXZlIGNvbnRlbnQgY2hhbmdlcy4gKi9cbiAgaWYgKCFpc0NvbnRlbnRDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cblxuICBpZiAoIVVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOlxuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiB0ZXN0V2lraWxpbmsob3JpZ2luYWxMaW5rKTtcbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQSxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVdQLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx3QkFBd0I7QUFDakM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxNQUFNLDJCQUEyQjtBQUtqQyxNQUFNLG9DQUFvQztBQUtuQyxJQUFLLGdCQUFMLGtCQUFLQSxtQkFBTDtBQU1MLEVBQUFBLGVBQUEseUJBQXNCO0FBS3RCLEVBQUFBLGVBQUEsNkJBQTBCO0FBTzFCLEVBQUFBLGVBQUEsNkJBQTBCO0FBTzFCLEVBQUFBLGVBQUEsOEJBQTJCO0FBekJqQixTQUFBQTtBQUFBLEdBQUE7QUErQkwsSUFBSyxZQUFMLGtCQUFLQyxlQUFMO0FBTUwsRUFBQUEsV0FBQSxjQUFXO0FBS1gsRUFBQUEsV0FBQSw2QkFBMEI7QUFLMUIsRUFBQUEsV0FBQSxzQkFBbUI7QUFRbkIsRUFBQUEsV0FBQSxjQUFXO0FBeEJELFNBQUFBO0FBQUEsR0FBQTtBQXMxQkwsU0FBUyxZQUFZLFFBQW1DO0FBQzdELFFBQU0sYUFBYSxnQkFBZ0I7QUFBQSxJQUNqQyxLQUFLLE9BQU87QUFBQSxJQUNaLE1BQU0sT0FBTztBQUFBLElBQ2Isa0JBQWtCLE9BQU8sdUJBQXVCLE9BQU87QUFBQSxFQUN6RCxDQUFDO0FBQ0QsTUFBSSxDQUFDLFlBQVk7QUFDZixXQUFPLE9BQU8sS0FBSztBQUFBLEVBQ3JCO0FBRUEsU0FBTyxXQUFXLDRCQUE4QztBQUFBLElBQzlELEtBQUssT0FBTztBQUFBLElBQ1osTUFBTSxPQUFPO0FBQUEsSUFDYixXQUFXLE9BQU87QUFBQSxJQUNsQixxQkFBcUIsT0FBTztBQUFBLElBQzVCLHFCQUFxQjtBQUFBLElBQ3JCLHFCQUFxQixPQUFPO0FBQUEsSUFDNUIsMkJBQTJCLE9BQU87QUFBQSxFQUNwQyxDQUFDLENBQUM7QUFDSjtBQVFBLGVBQXNCLGNBQWMsUUFBNEM7QUFDOUUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBRztBQUFBLEVBQ0wsSUFBSTtBQUNKLFFBQU0sWUFBWSxNQUFNLHdCQUF3QixFQUFFLEtBQUssWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUMvRSxhQUFXLG9CQUFvQixVQUFVLEtBQUssR0FBRztBQUMvQyxVQUFNLGVBQWUsa0JBQWtCLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQztBQUN0RSxVQUFNLFlBQVksSUFBSSxJQUFZLGFBQWEsSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLElBQUksQ0FBQyxDQUFDO0FBQ2xGLFVBQU0sVUFBVTtBQUFBLE1BQ2Q7QUFBQSxNQUNBLGVBQWUsQ0FBQyxTQUFTO0FBQ3ZCLGNBQU0sV0FBVyxLQUFLLFVBQVUsSUFBSTtBQUNwQyxZQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsR0FBRztBQUM1QjtBQUFBLFFBQ0Y7QUFFQSxlQUFPLGNBQWMsSUFBSTtBQUFBLE1BQzNCO0FBQUEsTUFDQSxZQUFZO0FBQUEsTUFDWixHQUFHO0FBQUEsSUFDTCxDQUFDO0FBQUEsRUFDSDtBQUNGO0FBUUEsZUFBc0IsVUFBVSxRQUF3QztBQUN0RSxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSwwQkFBMEI7QUFBQSxJQUMxQixxQ0FBcUM7QUFBQSxJQUNyQywrQ0FBK0M7QUFBQSxJQUMvQyxHQUFHO0FBQUEsRUFDTCxJQUFJO0FBQ0osUUFBTSxpQkFBaUI7QUFBQSxJQUNyQjtBQUFBLElBQ0EsaUJBQWlCLE9BQU8sRUFBRSxhQUFhLFFBQVEsTUFBTTtBQUNuRCxZQUFNLFFBQVEsTUFBTSxhQUFhLEtBQUssWUFBWTtBQUFBLFFBQ2hELDBCQUEwQjtBQUFBLFFBQzFCLHFDQUFxQztBQUFBLFFBQ3JDLCtDQUErQztBQUFBLE1BQ2pELENBQUM7QUFDRCxrQkFBWSxlQUFlO0FBQzNCLFlBQU0sT0FBTyxRQUFRLEVBQUUsS0FBSyxXQUFXLENBQUM7QUFDeEMsWUFBTSxnQkFBZ0IsTUFBTSxJQUFJLE1BQU0sV0FBVyxJQUFJO0FBQ3JELGtCQUFZLGVBQWU7QUFDM0IsVUFBSSxZQUFZLGVBQWU7QUFDN0IsZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPLE1BQU0sZUFBZTtBQUFBLFFBQzFCO0FBQUEsUUFDQTtBQUFBLFFBQ0EsbUJBQW1CLGFBQWEsVUFBVTtBQUFBLFFBQzFDO0FBQUEsUUFDQSw0QkFBNEI7QUFBQSxRQUM1Qix1Q0FBdUM7QUFBQSxRQUN2QyxpREFBaUQ7QUFBQSxNQUNuRCxDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUc7QUFBQSxFQUNMLENBQUM7QUFDSDtBQVFBLGVBQXNCLG1CQUFtQixRQUFtRDtBQUMxRixRQUFNLEVBQUUsS0FBSyxTQUFTLGVBQWUsMEJBQTBCLE9BQU8scUNBQXFDLE9BQU8sK0NBQStDLE1BQU0sSUFBSTtBQUMzSyxNQUFJLEVBQUUsWUFBWSxJQUFJO0FBQ3RCLGtCQUFnQixpQkFBaUI7QUFDakMsY0FBWSxlQUFlO0FBRTNCLFFBQU0sYUFBYSxNQUFNLG9CQUFvQjtBQUFBLElBQzNDO0FBQUEsSUFDQSxpQkFBaUIsWUFBWTtBQUMzQixZQUFNLFFBQVEsTUFBTSxjQUFjLEtBQUssU0FBUztBQUFBLFFBQzlDLDBCQUEwQjtBQUFBLFFBQzFCLHFDQUFxQztBQUFBLFFBQ3JDLCtDQUErQztBQUFBLE1BQ2pELENBQUM7QUFDRCxrQkFBWSxlQUFlO0FBQzNCLFlBQU0sVUFBVSxNQUFNLGVBQWU7QUFBQSxRQUNuQztBQUFBLFFBQ0E7QUFBQSxRQUNBLG1CQUFtQjtBQUFBLFFBQ25CO0FBQUEsUUFDQSw0QkFBNEI7QUFBQSxRQUM1Qix1Q0FBdUM7QUFBQSxRQUN2QyxpREFBaUQ7QUFBQSxNQUNuRCxDQUFDO0FBQ0Qsa0JBQVksZUFBZTtBQUMzQixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSLENBQUM7QUFDRCxjQUFZLGVBQWU7QUFFM0Isb0JBQWtCLFlBQVksbUNBQW1DO0FBRWpFLFNBQU87QUFDVDtBQVFPLFNBQVMsZ0JBQWdCLFFBQTZDO0FBQzNFLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0EsNkJBQTZCO0FBQUEsSUFDN0I7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLEVBQUUsU0FBUyxJQUFJLGFBQWEsS0FBSyxJQUFJO0FBQzNDLFFBQU0sYUFBYSxRQUFRLEtBQUssZ0JBQWdCO0FBQ2hELFFBQU0sT0FBTyxJQUFJLGNBQWMscUJBQXFCLFVBQVUsVUFBVTtBQUN4RSxNQUFJLE1BQU07QUFDUixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyw0QkFBNEI7QUFDL0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFDNUIsV0FBTyxRQUFRLEVBQUUsS0FBSyxZQUFZLFVBQVUsMEJBQTBCLEtBQUssQ0FBQztBQUFBLEVBQzlFO0FBRUEsUUFBTSxlQUFlLEtBQUssUUFBUSxVQUFVLEdBQUcsS0FBSyxRQUFRLEVBQUU7QUFFOUQsTUFBSSxhQUFhLFdBQVcsS0FBSyxHQUFHO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxRQUFRLEVBQUUsS0FBSyxZQUFZLGNBQWMsMEJBQTBCLEtBQUssQ0FBQztBQUNsRjtBQVFPLFNBQVMsNEJBQTRCLE9BQWdDO0FBQzFFLFNBQU8sZ0NBQWdDLEVBQUUsT0FBTyxLQUFLLElBQUksT0FBTyxNQUFNLFlBQVksQ0FBQztBQUNyRjtBQVFPLFNBQVMscUJBQXFCLFFBQTRDO0FBVy9FO0FBQUE7QUFWQSxVQUFNLEVBQUUsSUFBSSxJQUFJO0FBRWhCLFVBQU0saUJBQXNEO0FBQUEsTUFDMUQsMEJBQTBCO0FBQUEsSUFDNUI7QUFFQSxVQUFNLHNCQUFzQix3Q0FBd0MsRUFBRSxJQUFJLENBQUMsb0JBQW9CLGdCQUFnQixDQUFDO0FBQ2hILGFBQVMsT0FBTyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsR0FBRyxxQkFBcUIsTUFBTTtBQUN6RSxVQUFNLGFBQWEsUUFBUSw0QkFBMkMsRUFBRSxLQUFLLFlBQVksT0FBTyxrQkFBa0IsMEJBQTBCLE9BQU8seUJBQXlCLENBQUMsQ0FBQztBQUU5SyxVQUFNLGdCQUFnQiw4QkFBYyxLQUFLLENBQUMsVUFBVSxDQUFDO0FBQ3JELFdBQU8seUJBQXlCLE1BQU07QUFBQSxXQUR0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUY7QUFRTyxTQUFTLHdCQUF3QixRQUErQztBQUNyRixRQUFNLGNBQWMsT0FBTyxVQUFVLE1BQU07QUFFM0MsTUFBSSxPQUFPLFlBQVk7QUFDckIsVUFBTSxZQUFZLE9BQU8sUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLO0FBQ3RELFdBQU8sR0FBRyxXQUFXLEtBQUssT0FBTyxHQUFHLEdBQUcsU0FBUztBQUFBLEVBQ2xEO0FBRUEsUUFBTSxRQUFRLE9BQU8sU0FBUztBQUM5QixRQUFNLG9CQUFvQixPQUFPLHFCQUFxQjtBQUN0RCxRQUFNLGVBQWUsb0JBQW9CLFlBQVksS0FBSyxJQUFJO0FBRTlELFFBQU0sTUFBTSxPQUFPLHlCQUNmLElBQUksT0FBTyxHQUFHLE1BQ2QsVUFBVSxPQUFPLEdBQUc7QUFFeEIsUUFBTSxZQUFZLE9BQU8sUUFBUSxJQUFJLEtBQUssVUFBVSxPQUFPLEtBQUssQ0FBQyxLQUFLO0FBRXRFLFNBQU8sR0FBRyxXQUFXLElBQUksWUFBWSxLQUFLLEdBQUcsR0FBRyxTQUFTO0FBQzNEO0FBV08sU0FBUywwQ0FBeUY7QUFDdkcsU0FBTyx5QkFBd0Usd0NBQXdDLENBQUMsQ0FBQyxFQUFFO0FBQzdIO0FBUU8sU0FBUyxpQkFBaUIsUUFBeUM7QUFDeEUsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixNQUFJLGVBQWUsT0FBTztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksQ0FBQyxhQUFhO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxhQUFhLFFBQVEsRUFBRSxLQUFLLFlBQVksa0JBQWtCLDBCQUEwQixLQUFLLENBQUM7QUFDaEcsUUFBTSxnQkFBZ0IsUUFBUSxLQUFLLG1CQUFtQjtBQUN0RCxRQUFNLGdCQUFnQixRQUFRLEtBQUssdUJBQXVCLG1CQUFtQjtBQUM3RSxRQUFNLGtCQUFrQixRQUFRLGFBQWE7QUFDN0MsUUFBTSxrQkFBa0IsUUFBUSxhQUFhO0FBQzdDLFFBQU0saUJBQWlCLG9CQUFJLElBQVk7QUFFdkMsYUFBVyxjQUFjLENBQUMsV0FBVyxNQUFNLGFBQWEsR0FBRztBQUN6RCxRQUFJLENBQUMsWUFBWTtBQUNmO0FBQUEsSUFDRjtBQUVBLFVBQU0sT0FBTyxRQUFRLEtBQUssVUFBVTtBQUNwQyxtQkFBZSxJQUFJLElBQUk7QUFDdkIsbUJBQWUsSUFBSSxTQUFTLElBQUksQ0FBQztBQUNqQyxtQkFBZSxJQUFJLFNBQVMsaUJBQWlCLElBQUksQ0FBQztBQUNsRCxtQkFBZSxJQUFJLFNBQVMsaUJBQWlCLElBQUksQ0FBQztBQUFBLEVBQ3BEO0FBRUEsYUFBVyxjQUFjLENBQUMsZUFBZSxhQUFhLEdBQUc7QUFDdkQsbUJBQWUsSUFBSSxJQUFJLGNBQWMsZUFBZSxZQUFZLFlBQVksS0FBSyxDQUFDO0FBQUEsRUFDcEY7QUFFQSxRQUFNLG1CQUFtQixXQUFXO0FBQUEsSUFDbEMsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLElBQ2IsS0FBSyxjQUFjLGtCQUFrQixZQUFZLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQUEsRUFDbkUsQ0FBQyxFQUFFLFlBQVk7QUFFZixhQUFXLFNBQVMsZ0JBQWdCO0FBQ2xDLFFBQUksTUFBTSxZQUFZLE1BQU0sa0JBQWtCO0FBQzVDLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxTQUFTLFFBQVEsS0FBSztBQUM1QixVQUFNLE9BQU8sU0FBUyxPQUFPLFFBQVEsS0FBSyxDQUFDO0FBQzNDLFFBQUksS0FBSyxRQUFRLElBQUksRUFBRSxZQUFZLE1BQU0sa0JBQWtCO0FBQ3pELGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsYUFBYSxNQUFrQztBQUM3RCxRQUFNLFNBQVMsY0FBYyxVQUFVLElBQUksQ0FBQztBQUM1QyxTQUFPO0FBQUEsSUFDTCxVQUFVLE9BQU87QUFBQSxJQUNqQixTQUFTLE9BQU87QUFBQSxFQUNsQjtBQUNGO0FBU08sU0FBUyxrQkFBa0IsTUFBdUI7QUFDdkQsUUFBTSxrQkFBa0IsVUFBVSxJQUFJO0FBQ3RDLFNBQU8saUJBQWlCLG9CQUFvQjtBQUM5QztBQVNPLFNBQVMsVUFBVSxNQUF1QjtBQUMvQyxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsV0FBVztBQUNyQztBQVVPLFNBQVMsZUFBZSxNQUF1QjtBQUNwRCxRQUFNLGtCQUFrQixVQUFVLElBQUk7QUFDdEMsU0FBTyxpQkFBaUIsSUFBSSxXQUFXLElBQUksS0FBSztBQUNsRDtBQVVPLFNBQVMsaUJBQWlCLE1BQXVCO0FBQ3RELFFBQU0sa0JBQWtCLFVBQVUsSUFBSTtBQUN0QyxTQUFPLGlCQUFpQixJQUFJLFdBQVcsR0FBRyxLQUFLO0FBQ2pEO0FBU08sU0FBUyxhQUFhLE1BQXVCO0FBQ2xELFFBQU0sa0JBQWtCLFVBQVUsSUFBSTtBQUN0QyxTQUFPLGlCQUFpQixjQUFjO0FBQ3hDO0FBU0EsZUFBc0IsNEJBQTRCLFFBQTREO0FBQzVHLFFBQU0sRUFBRSxLQUFLLFNBQVMseUJBQXlCLE1BQU0sSUFBSTtBQUN6RCxTQUFPLE1BQU0sbUJBQW1CLDRCQUFzRDtBQUFBLElBQ3BGLGFBQWEsT0FBTztBQUFBLElBQ3BCO0FBQUEsSUFDQTtBQUFBLElBQ0EsZUFBZSxDQUFDLFNBQVMscUJBQXFCLE1BQU0sc0JBQXNCO0FBQUEsSUFDMUUseUJBQXlCO0FBQUEsSUFDekIsb0NBQW9DO0FBQUEsSUFDcEMsOENBQThDO0FBQUEsRUFDaEQsQ0FBQyxDQUFDO0FBQ0o7QUFTQSxlQUFzQix5QkFBeUIsUUFBdUQ7QUFDcEcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQSx5QkFBeUI7QUFBQSxJQUN6QixHQUFHO0FBQUEsRUFDTCxJQUFJO0FBQ0osUUFBTSxVQUFVO0FBQUEsSUFDZDtBQUFBLElBQ0EsZUFBZSxDQUFDLFNBQVMscUJBQXFCLE1BQU0sc0JBQXNCO0FBQUEsSUFDMUU7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLG9DQUFvQztBQUFBLElBQ3BDLDhDQUE4QztBQUFBLElBQzlDLEdBQUc7QUFBQSxFQUNMLENBQUM7QUFDSDtBQVFPLFNBQVMsV0FBVyxRQUFrQztBQUMzRCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsNEJBQTRCO0FBQUEsRUFDOUIsSUFBSTtBQUNKLE1BQUksQ0FBQyxxQkFBcUI7QUFDeEIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUNBLFFBQU0sZ0JBQWdCLFFBQVEsRUFBRSxLQUFLLFlBQVkscUJBQXFCLDBCQUEwQixLQUFLLENBQUM7QUFDdEcsUUFBTSxnQkFBZ0IsUUFBUSxLQUFLLHVCQUF1QixtQkFBbUI7QUFDN0UsUUFBTSxnQkFBZ0IsUUFBUSxLQUFLLHVCQUF1QixtQkFBbUI7QUFDN0UsUUFBTSxhQUFhLHVCQUF1Qiw0QkFBMEQ7QUFBQSxJQUNsRztBQUFBLElBQ0E7QUFBQSxJQUNBLGNBQWMsS0FBSztBQUFBLEVBQ3JCLENBQUMsQ0FBQztBQUVGLFFBQU0sRUFBRSxRQUFRLElBQUksYUFBYSxLQUFLLElBQUk7QUFDMUMsTUFBSSxrQkFBa0IsQ0FBQztBQUV2QixNQUFJLGFBQWEsbUJBQW1CLEdBQUc7QUFFckMsUUFBSSwwQkFBMEIsSUFBSSxHQUFHO0FBQ25DLGFBQU8sY0FBYyxPQUFPO0FBQUEsSUFDOUI7QUFBQSxFQUVGO0FBRUEsUUFBTSxrQkFBa0IsVUFBVSxLQUFLLFFBQVE7QUFDL0MsTUFBSTtBQUVKLE1BQUksY0FBYyxpQkFBaUIsT0FBTztBQUN4QyxZQUFRLGdCQUFnQjtBQUN4QixzQkFBa0I7QUFBQSxFQUNwQjtBQUVBLFlBQVUsaUJBQWlCLDRCQUFvRDtBQUFBLElBQzNFO0FBQUEsSUFDQSxhQUFhLEtBQUs7QUFBQSxJQUNsQjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0Esa0JBQWtCO0FBQUEsRUFDcEIsQ0FBQyxDQUFDLElBQ0EsU0FDQSxpQkFBaUI7QUFFckIsTUFBSSxDQUFDLGlCQUFpQjtBQUVwQixRQUFJLFVBQVUsU0FBUyxlQUFlLFFBQVEsYUFBYSxDQUFDLEdBQUc7QUFDN0QsY0FBUSxjQUFjO0FBQUEsSUFDeEIsV0FBVyxVQUFVLFNBQVMsYUFBYSxHQUFHO0FBQzVDLGNBQVEsY0FBYztBQUFBLElBQ3hCO0FBQUEsRUFFRjtBQUVBLFFBQU0sVUFBVSxxQkFBcUIsNEJBQXdEO0FBQUEsSUFDM0Y7QUFBQSxJQUNBO0FBQUEsSUFDQSx3QkFBd0Isa0JBQWtCLGlCQUFpQixDQUFDLENBQUMsaUJBQWlCO0FBQUEsSUFDOUU7QUFBQSxJQUNBLGNBQWMsS0FBSztBQUFBLElBQ25CLGtCQUFrQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxFQUNwQixDQUFDLENBQUM7QUFDRixTQUFPO0FBQ1Q7QUFRQSxlQUFzQixxQkFBcUIsUUFBcUQ7QUFDOUYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixTQUFPLE1BQU0sbUJBQW1CO0FBQUEsSUFDOUI7QUFBQSxJQUNBO0FBQUEsSUFDQSxlQUFlLENBQUMsU0FBUztBQUN2QixZQUFNLGNBQWMsVUFBVSxLQUFLLFFBQVE7QUFDM0MsVUFBSSwrQkFBK0IsVUFBYSwrQkFBK0IsYUFBYTtBQUMxRjtBQUFBLE1BQ0Y7QUFDQSxhQUFPLFlBQVksNEJBQStDO0FBQUEsUUFDaEU7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQyxDQUFDO0FBQUEsSUFDSjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBUUEsZUFBc0Isa0JBQWtCLFFBQWdEO0FBQ3RGLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixNQUFJLGFBQWEsbUJBQW1CLEtBQUssQ0FBQyxJQUFJLGdCQUFnQixxQkFBcUIsbUJBQW1CLE1BQU0sR0FBRztBQUM3RztBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVU7QUFBQSxJQUNkLEdBQUc7QUFBQSxJQUNILGVBQWUsQ0FBQyxTQUFTO0FBQ3ZCLFlBQU0sY0FBYyxVQUFVLEtBQUssUUFBUTtBQUMzQyxVQUFJLCtCQUErQixVQUFhLCtCQUErQixhQUFhO0FBQzFGO0FBQUEsTUFDRjtBQUNBLGFBQU8sWUFBWSw0QkFBK0M7QUFBQSxRQUNoRTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRixDQUFDLENBQUM7QUFBQSxJQUNKO0FBQUEsSUFDQSxZQUFZO0FBQUEsRUFDZCxDQUFDO0FBQ0g7QUFFQSxTQUFTLGdDQUFnQyxRQUF3RDtBQUMvRixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osTUFBSSxPQUFPLFVBQVUsVUFBVTtBQUM3QixVQUFNLGtCQUFrQixVQUFVLEtBQUs7QUFDdkMsUUFBSSxDQUFDLG1CQUFtQixnQkFBZ0IsY0FBYyxnQkFBZ0IsWUFBWTtBQUNoRixhQUFPO0FBQUEsSUFDVDtBQUVBLFVBQU0scUJBQXFCLENBQUM7QUFDNUIsUUFBSSxPQUFPLE1BQU0saUJBQWlCLEtBQUssQ0FBQyxvQkFBb0IsZ0JBQWdCLFFBQVEsR0FBRztBQUV2RixRQUFJLENBQUMsTUFBTTtBQUNULGFBQU87QUFBQSxRQUNMO0FBQUEsUUFDQSxNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsTUFDWjtBQUNBLFlBQU0saUJBQWlCLEtBQUssSUFBSTtBQUFBLElBQ2xDO0FBRUEsU0FBSyxPQUFPLGdCQUFnQjtBQUM1QixTQUFLLFdBQVc7QUFDaEIsUUFBSSxnQkFBZ0IsVUFBVSxRQUFXO0FBQ3ZDLFdBQUssY0FBYyxnQkFBZ0I7QUFBQSxJQUNyQztBQUVBLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLE1BQU07QUFDL0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLHNCQUFzQjtBQUUxQixhQUFXLENBQUMsVUFBVSxVQUFVLEtBQUssT0FBTyxRQUFRLEtBQXNCLEdBQUc7QUFDM0UsVUFBTSwyQkFBMkIsZ0NBQWdDLEVBQUUsT0FBTyxLQUFLLE1BQU0sR0FBRyxHQUFHLElBQUksUUFBUSxLQUFLLFVBQVUsT0FBTyxXQUFXLENBQUM7QUFDekksNEJBQXdCO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixRQUF3QztBQUNoRSxRQUFNLEVBQUUsS0FBSyxRQUFRLFNBQVMsV0FBVyxJQUFJO0FBQzdDLE1BQUksRUFBRSxXQUFXLElBQUk7QUFDckIsTUFBSSxlQUFlLEtBQUs7QUFDdEIsaUJBQWE7QUFBQSxFQUNmO0FBRUEsTUFBSTtBQUVKLE1BQUksV0FBVyxTQUFTLGNBQWMsV0FBVyxPQUFPLHdCQUF3QjtBQUM5RSxlQUFXO0FBQUEsRUFDYixPQUFPO0FBRUwsWUFBUSxPQUFPLGVBQWU7QUFBQTtBQUFBLE1BRTVCLEtBQUs7QUFDSCxtQkFBVyxXQUFXO0FBQ3RCLFlBQUksT0FBTyx5Q0FBeUMsQ0FBQyxTQUFTLFdBQVcsR0FBRyxHQUFHO0FBQzdFLHFCQUFXLElBQUksUUFBUTtBQUFBLFFBQ3pCO0FBQ0E7QUFBQSxNQUNGLEtBQUs7QUFDSCxtQkFBVyxTQUFTLFFBQVEsVUFBVSxHQUFHLFdBQVcsSUFBSTtBQUN4RCxZQUFJLE9BQU8sdUNBQXVDLENBQUMsU0FBUyxXQUFXLEdBQUcsR0FBRztBQUMzRSxxQkFBVyxLQUFLLFFBQVE7QUFBQSxRQUMxQjtBQUNBO0FBQUEsTUFDRixLQUFLLDJEQUE2QztBQUNoRCxjQUFNLGVBQWUsZUFBZSxVQUFVLElBQUksV0FBVyxXQUFXLFdBQVc7QUFDbkYsY0FBTSxlQUFlLElBQUksY0FBYyxnQkFBZ0IsY0FBYyxVQUFVO0FBQy9FLG1CQUFXLGFBQWEsV0FBVyxLQUFLLGFBQWEsQ0FBQyxNQUFNLGFBQWEsV0FBVyxPQUFPLFdBQVc7QUFDdEc7QUFBQSxNQUNGO0FBQUE7QUFBQSxNQUVBO0FBQ0Usb0JBQVksT0FBTyxhQUFhO0FBQUEsSUFFcEM7QUFBQSxFQUNGO0FBRUEsYUFBVyxPQUFPLGFBQ2QsUUFBUTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsUUFBUSxJQUFJLHVCQUF1QjtBQUFBLEVBQ3JDLENBQUMsSUFDQztBQUNKLGNBQVk7QUFFWixTQUFPO0FBQ1Q7QUFFQSxTQUFTLHlCQUF5QixRQUE0QztBQUM1RSxRQUFNLEVBQUUsSUFBSSxJQUFJO0FBQ2hCLFFBQU0sYUFBYSxRQUFRLDRCQUEyQyxFQUFFLEtBQUssWUFBWSxPQUFPLGtCQUFrQiwwQkFBMEIsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDO0FBQzlLLFFBQU0sYUFBYSxRQUFRLEtBQUssT0FBTyxnQkFBZ0I7QUFDdkQsUUFBTSxVQUFVLE9BQU8sV0FBVztBQUVsQyxRQUFNLGFBQWEsY0FBYyxNQUFNO0FBQ3ZDLFFBQU0sV0FBVyxpQkFBaUI7QUFBQSxJQUNoQztBQUFBLElBQ0EsUUFBUTtBQUFBLElBQ1I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQztBQUVELFNBQU8sV0FBVyxhQUNkLGlCQUFpQjtBQUFBLElBQ2pCLE9BQU8sT0FBTztBQUFBLElBQ2QsU0FBUyxXQUFXO0FBQUEsSUFDcEI7QUFBQSxFQUNGLENBQUMsSUFDQywwQkFBMEI7QUFBQSxJQUMxQixRQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0Esb0JBQW9CO0FBQUEsSUFDcEI7QUFBQSxFQUNGLENBQUM7QUFDTDtBQUVBLFNBQVMsMEJBQTBCLFFBQWlEO0FBQ2xGLFFBQU0sRUFBRSxRQUFRLFVBQVUsb0JBQW9CLFdBQVcsSUFBSTtBQUM3RCxNQUFJLFFBQVEsbUJBQW1CLFNBQVM7QUFDeEMsTUFBSSxvQkFBb0IsbUJBQW1CLHFCQUFxQjtBQUNoRSxNQUFJLENBQUMsVUFBVSxlQUFlLFVBQVUsS0FBSyxDQUFDLG1CQUFtQiwyQkFBMkI7QUFDMUYsWUFBUSxDQUFDLG1CQUFtQixnREFBZ0QsZUFBZSxVQUFVLElBQ2pHLFdBQVcsV0FDWCxXQUFXO0FBQ2Ysd0JBQW9CO0FBQUEsRUFDdEI7QUFFQSxTQUFPLHdCQUF3QjtBQUFBLElBQzdCO0FBQUEsSUFDQSxTQUFTLE9BQU87QUFBQSxJQUNoQixZQUFZO0FBQUEsSUFDWjtBQUFBLElBQ0Esd0JBQXdCLE9BQU87QUFBQSxJQUMvQixLQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0g7QUFFQSxTQUFTLGlCQUFpQixRQUF3QztBQUNoRSxRQUFNLEVBQUUsT0FBTyxTQUFTLFNBQVMsSUFBSTtBQUNyQyxNQUFJLE9BQU8sWUFBWSxNQUFNLFNBQVMsWUFBWSxHQUFHO0FBQ25ELFdBQU8sd0JBQXdCO0FBQUEsTUFDN0I7QUFBQSxNQUNBLFlBQVk7QUFBQSxNQUNaLEtBQUs7QUFBQSxJQUNQLENBQUM7QUFBQSxFQUNIO0FBRUEsU0FBTyx3QkFBd0I7QUFBQSxJQUM3QjtBQUFBLElBQ0E7QUFBQSxJQUNBLFlBQVk7QUFBQSxJQUNaLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsZUFBZSxRQUFxRDtBQUNqRixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSw2QkFBNkI7QUFBQSxJQUM3Qix3Q0FBd0M7QUFBQSxJQUN4QyxrREFBa0Q7QUFBQSxFQUNwRCxJQUFJO0FBQ0osTUFBSSxFQUFFLFlBQVksSUFBSTtBQUN0QixrQkFBZ0IsaUJBQWlCO0FBQ2pDLGNBQVksZUFBZTtBQUUzQixNQUFJLENBQUMsT0FBTztBQUNWLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFVBQXdCLENBQUM7QUFFL0IsUUFBTSxrQkFBbUMsTUFBTSxZQUFZLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxRQUFRLFNBQVMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhO0FBQUEsSUFDN0gsS0FBSyxRQUFRLFNBQVMsSUFBSTtBQUFBLElBQzFCLE9BQU8sUUFBUSxTQUFTLE1BQU07QUFBQSxFQUNoQyxFQUFFO0FBRUYsYUFBVyxRQUFRLFNBQVMsRUFBRSxPQUFPLDRCQUE0Qix1Q0FBdUMsZ0RBQWdELENBQUMsR0FBRztBQUMxSixnQkFBWSxlQUFlO0FBQzNCLFVBQU0sYUFBYSxNQUFNLGNBQWMsTUFBTSxXQUFXO0FBQ3hELGdCQUFZLGVBQWU7QUFDM0IsUUFBSSxlQUFlLFFBQVc7QUFDNUI7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhLHNCQUFzQixNQUFNLFVBQVU7QUFFekQsUUFBSSxtQkFBbUI7QUFDckIsVUFBSSxlQUFlLFVBQVUsR0FBRztBQUM5QixnQkFBUSxLQUFLLFVBQVU7QUFBQSxNQUN6QixPQUFPO0FBQ0wsZ0JBQVEsTUFBTSwyQkFBMkIsVUFBVTtBQUNuRDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLE9BQU87QUFDTCxVQUFJLDRCQUE0QixZQUFZLGNBQWMsR0FBRztBQUMzRCxtQkFBVyxhQUFhLFdBQVcsV0FBVyxXQUFXLG1DQUFtQyx3QkFBd0I7QUFBQSxNQUN0SDtBQUVBLGNBQVEsS0FBSyxVQUFVO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxzQkFBc0IsS0FBVSxlQUFtRDtBQUMxRixRQUFNLGdCQUFnQixpQkFBaUI7QUFDdkMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSztBQUNILGFBQU87QUFBQSxJQUNULEtBQUs7QUFDSCxhQUFPLDhDQUE4QyxHQUFHO0FBQUEsSUFDMUQsS0FBSztBQUNILGFBQU87QUFBQSxJQUNULEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVDtBQUNFLGtCQUFZLGFBQWE7QUFBQSxFQUM3QjtBQUNGO0FBRUEsU0FBUyxjQUFjLFFBQWdEO0FBQ3JFLFFBQU0sRUFBRSxJQUFJLElBQUk7QUFDaEIsU0FBTztBQUFBLElBQ0wsU0FBUyxPQUFPLFlBQVksT0FBTyxlQUFlLFVBQVUsT0FBTyxZQUFZLElBQUk7QUFBQSxJQUNuRix3QkFBd0IsT0FBTywwQkFBMEI7QUFBQSxJQUN6RCxZQUFZLHVCQUF1Qiw0QkFBMEQ7QUFBQSxNQUMzRjtBQUFBLE1BQ0EsV0FBVyxPQUFPO0FBQUEsTUFDbEIsY0FBYyxPQUFPO0FBQUEsSUFDdkIsQ0FBQyxDQUFDO0FBQUEsSUFDRixlQUFlLHNCQUFzQixLQUFLLE9BQU8sYUFBYTtBQUFBLElBQzlELHdCQUF3QixPQUFPLDJCQUEyQixPQUFPLGVBQWUsa0JBQWtCLE9BQU8sWUFBWSxJQUFJLFdBQWM7QUFBQSxJQUN2SSxxQ0FBcUMsT0FBTyx3Q0FDdEMsT0FBTyxlQUFlLGVBQWUsT0FBTyxZQUFZLElBQUksV0FBYztBQUFBLElBQ2hGLHVDQUF1QyxPQUFPLDBDQUN4QyxPQUFPLGVBQWUsaUJBQWlCLE9BQU8sWUFBWSxJQUFJLFdBQWM7QUFBQSxFQUNwRjtBQUNGO0FBRUEsU0FBUyxxQkFBcUIsTUFBaUIsd0JBQXNEO0FBQ25HLE1BQUksZ0NBQWdDLElBQUksR0FBRztBQUN6QyxRQUFJLENBQUMsS0FBSyxnQkFBZ0IsV0FBVztBQUNuQztBQUFBLElBQ0Y7QUFHQSxXQUFPLGlCQUFpQixLQUFLLGdCQUFnQixHQUFHO0FBQUEsRUFDbEQ7QUFFQSxNQUFJLENBQUMscUJBQXFCLElBQUksR0FBRztBQUMvQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLEVBQUUsZ0JBQWdCLElBQUk7QUFDNUIsTUFBSSxDQUFDLGdCQUFnQixXQUFXO0FBQzlCO0FBQUEsRUFDRjtBQUVBLFNBQU8sd0JBQXdCLDRCQUEyRDtBQUFBLElBQ3hGLE9BQU8sZ0JBQWdCO0FBQUEsSUFDdkIsU0FBUyxnQkFBZ0I7QUFBQSxJQUN6QixZQUFZO0FBQUEsSUFDWjtBQUFBLElBQ0EsS0FBSyxpQkFBaUIsZ0JBQWdCLEdBQUc7QUFBQSxFQUMzQyxDQUFDLENBQUM7QUFDSjtBQUVBLFNBQVMsOENBQThDLEtBQThCO0FBQ25GLFFBQU0sZ0JBQWdCLGlCQUFpQixHQUFHO0FBQzFDLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTztBQUFBLElBQ1QsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0Usa0JBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7QUFFQSxTQUFTLDRCQUE0QixZQUF3QixnQkFBMEM7QUFFckcsTUFBSSxDQUFDLGdCQUFnQixVQUFVLEdBQUc7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFHQSxNQUFJLENBQUMsa0NBQWtDLEtBQUssV0FBVyxVQUFVLEdBQUc7QUFDbEUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGVBQWUsS0FBSyxDQUFDLGtCQUFrQixjQUFjLFNBQVMsV0FBVyxVQUFVLFNBQVMsTUFBTSxVQUFVLFdBQVcsVUFBVSxTQUFTLElBQUksVUFBVSxjQUFjLEdBQUc7QUFDbEw7QUFFQSxTQUFTLHVCQUF1QixRQUErQztBQUM3RSxRQUFNLEVBQUUsS0FBSyxXQUFXLGFBQWEsSUFBSTtBQUN6QyxRQUFNLGdCQUFnQixhQUFhO0FBQ25DLFVBQVEsZUFBZTtBQUFBLElBQ3JCLEtBQUs7QUFDSCxhQUFPO0FBQUEsSUFDVCxLQUFLO0FBQ0gsYUFBTyxtQkFBbUIsR0FBRztBQUFBLElBQy9CLEtBQUs7QUFDSCxhQUFPLGlCQUFpQixTQUFZLG1CQUFtQixHQUFHLElBQUksYUFBYSxZQUFZO0FBQUEsSUFDekYsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0Usa0JBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkxpbmtQYXRoU3R5bGUiLCAiTGlua1N0eWxlIl0KfQo=