@mnaoumov/obsidian-lib 4.2.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/dist/lib/cjs/__merged.cjs +54 -1
  2. package/dist/lib/cjs/__merged.d.cts +5 -4
  3. package/dist/lib/cjs/attachment-path.cjs +1 -1
  4. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +1 -1
  5. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +1 -1
  6. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +1 -1
  7. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +1 -1
  8. package/dist/lib/cjs/components/settings-migration-component.cjs +1 -1
  9. package/dist/lib/cjs/components/settings-migration-component.d.cts +1 -1
  10. package/dist/lib/cjs/css-class.cjs +1 -1
  11. package/dist/lib/cjs/css-class.d.cts +4 -2
  12. package/dist/lib/cjs/demo-vault-helper-settings.cjs +1 -1
  13. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +1 -1
  14. package/dist/lib/cjs/frontmatter.cjs +1 -1
  15. package/dist/lib/cjs/frontmatter.d.cts +1 -1
  16. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  17. package/dist/lib/cjs/generated-during-build.d.cts +2 -2
  18. package/dist/lib/cjs/i18n/i18n.cjs +2 -2
  19. package/dist/lib/cjs/i18n/i18n.d.cts +1 -1
  20. package/dist/lib/cjs/i18n/locales/en.cjs +5 -2
  21. package/dist/lib/cjs/i18n/locales/en.d.cts +4 -1
  22. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -1
  23. package/dist/lib/cjs/link.cjs +5 -3
  24. package/dist/lib/cjs/link.d.cts +22 -0
  25. package/dist/lib/cjs/metadata-cache.cjs +1 -1
  26. package/dist/lib/cjs/modals/minimizable-modal.cjs +1 -1
  27. package/dist/lib/cjs/modals/minimizable-modal.d.cts +1 -1
  28. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  29. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +3 -3
  30. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +1 -1
  31. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +5 -2
  32. package/dist/lib/cjs/path-settings.cjs +214 -35
  33. package/dist/lib/cjs/path-settings.d.cts +21 -5
  34. package/dist/lib/cjs/plugin/plugin-api.cjs +17 -2
  35. package/dist/lib/cjs/plugin/plugin-api.d.cts +24 -7
  36. package/dist/lib/cjs/plugin/plugin-context.cjs +1 -1
  37. package/dist/lib/cjs/plugin/plugin.cjs +2 -2
  38. package/dist/lib/cjs/plugin/plugin.d.cts +1 -1
  39. package/dist/lib/cjs/resource-lock.cjs +1 -1
  40. package/dist/lib/cjs/setting-components/checkbox-component.cjs +1 -1
  41. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +1 -1
  42. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +1 -1
  43. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +1 -1
  44. package/dist/lib/cjs/setting-components/date-component.cjs +1 -1
  45. package/dist/lib/cjs/setting-components/date-component.d.cts +1 -1
  46. package/dist/lib/cjs/setting-components/date-time-component.cjs +1 -1
  47. package/dist/lib/cjs/setting-components/date-time-component.d.cts +1 -1
  48. package/dist/lib/cjs/setting-components/email-component.cjs +1 -1
  49. package/dist/lib/cjs/setting-components/email-component.d.cts +1 -1
  50. package/dist/lib/cjs/setting-components/file-component.cjs +1 -1
  51. package/dist/lib/cjs/setting-components/file-component.d.cts +1 -1
  52. package/dist/lib/cjs/setting-components/month-component.cjs +1 -1
  53. package/dist/lib/cjs/setting-components/month-component.d.cts +1 -1
  54. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +1 -1
  55. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +1 -1
  56. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +1 -1
  57. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +1 -1
  58. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +1 -1
  59. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +1 -1
  60. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +1 -1
  61. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +1 -1
  62. package/dist/lib/cjs/setting-components/number-component.cjs +1 -1
  63. package/dist/lib/cjs/setting-components/number-component.d.cts +1 -1
  64. package/dist/lib/cjs/setting-components/password-component.cjs +1 -1
  65. package/dist/lib/cjs/setting-components/password-component.d.cts +1 -1
  66. package/dist/lib/cjs/setting-components/telephone-component.cjs +1 -1
  67. package/dist/lib/cjs/setting-components/telephone-component.d.cts +1 -1
  68. package/dist/lib/cjs/setting-components/time-component.cjs +1 -1
  69. package/dist/lib/cjs/setting-components/time-component.d.cts +1 -1
  70. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +1 -1
  71. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +1 -1
  72. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +1 -1
  73. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +1 -1
  74. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +1 -1
  75. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +1 -1
  76. package/dist/lib/cjs/setting-components/url-component.cjs +1 -1
  77. package/dist/lib/cjs/setting-components/url-component.d.cts +1 -1
  78. package/dist/lib/cjs/setting-components/week-component.cjs +1 -1
  79. package/dist/lib/cjs/setting-components/week-component.d.cts +1 -1
  80. package/dist/lib/cjs/vault.cjs +2 -2
  81. package/dist/lib/cjs/vault.d.cts +2 -2
  82. package/dist/lib/esm/__merged.d.mts +5 -4
  83. package/dist/lib/esm/__merged.mjs +57 -3
  84. package/dist/lib/esm/attachment-path.mjs +1 -1
  85. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +1 -1
  86. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +1 -1
  87. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +1 -1
  88. package/dist/lib/esm/components/plugin-suggestion-component.mjs +1 -1
  89. package/dist/lib/esm/components/settings-migration-component.d.mts +1 -1
  90. package/dist/lib/esm/components/settings-migration-component.mjs +1 -1
  91. package/dist/lib/esm/css-class.d.mts +4 -2
  92. package/dist/lib/esm/css-class.mjs +1 -1
  93. package/dist/lib/esm/demo-vault-helper-settings.d.mts +1 -1
  94. package/dist/lib/esm/frontmatter.d.mts +1 -1
  95. package/dist/lib/esm/frontmatter.mjs +1 -1
  96. package/dist/lib/esm/generated-during-build.d.mts +2 -2
  97. package/dist/lib/esm/generated-during-build.mjs +2 -2
  98. package/dist/lib/esm/i18n/i18n.d.mts +1 -1
  99. package/dist/lib/esm/i18n/i18n.mjs +2 -2
  100. package/dist/lib/esm/i18n/locales/en.d.mts +4 -1
  101. package/dist/lib/esm/i18n/locales/en.mjs +5 -2
  102. package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -1
  103. package/dist/lib/esm/link.d.mts +22 -0
  104. package/dist/lib/esm/link.mjs +5 -3
  105. package/dist/lib/esm/metadata-cache.mjs +1 -1
  106. package/dist/lib/esm/modals/minimizable-modal.d.mts +1 -1
  107. package/dist/lib/esm/modals/minimizable-modal.mjs +1 -1
  108. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +3 -3
  109. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +1 -1
  110. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +5 -2
  111. package/dist/lib/esm/obsidian-dev-utils-state.mjs +1 -1
  112. package/dist/lib/esm/path-settings.d.mts +21 -5
  113. package/dist/lib/esm/path-settings.mjs +215 -41
  114. package/dist/lib/esm/plugin/plugin-api.d.mts +24 -7
  115. package/dist/lib/esm/plugin/plugin-api.mjs +16 -2
  116. package/dist/lib/esm/plugin/plugin-context.mjs +1 -1
  117. package/dist/lib/esm/plugin/plugin.d.mts +1 -1
  118. package/dist/lib/esm/plugin/plugin.mjs +2 -2
  119. package/dist/lib/esm/resource-lock.mjs +1 -1
  120. package/dist/lib/esm/setting-components/checkbox-component.d.mts +1 -1
  121. package/dist/lib/esm/setting-components/checkbox-component.mjs +1 -1
  122. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +1 -1
  123. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +1 -1
  124. package/dist/lib/esm/setting-components/date-component.d.mts +1 -1
  125. package/dist/lib/esm/setting-components/date-component.mjs +1 -1
  126. package/dist/lib/esm/setting-components/date-time-component.d.mts +1 -1
  127. package/dist/lib/esm/setting-components/date-time-component.mjs +1 -1
  128. package/dist/lib/esm/setting-components/email-component.d.mts +1 -1
  129. package/dist/lib/esm/setting-components/email-component.mjs +1 -1
  130. package/dist/lib/esm/setting-components/file-component.d.mts +1 -1
  131. package/dist/lib/esm/setting-components/file-component.mjs +1 -1
  132. package/dist/lib/esm/setting-components/month-component.d.mts +1 -1
  133. package/dist/lib/esm/setting-components/month-component.mjs +1 -1
  134. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +1 -1
  135. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +1 -1
  136. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +1 -1
  137. package/dist/lib/esm/setting-components/multiple-email-component.mjs +1 -1
  138. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +1 -1
  139. package/dist/lib/esm/setting-components/multiple-file-component.mjs +1 -1
  140. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +1 -1
  141. package/dist/lib/esm/setting-components/multiple-text-component.mjs +1 -1
  142. package/dist/lib/esm/setting-components/number-component.d.mts +1 -1
  143. package/dist/lib/esm/setting-components/number-component.mjs +1 -1
  144. package/dist/lib/esm/setting-components/password-component.d.mts +1 -1
  145. package/dist/lib/esm/setting-components/password-component.mjs +1 -1
  146. package/dist/lib/esm/setting-components/telephone-component.d.mts +1 -1
  147. package/dist/lib/esm/setting-components/telephone-component.mjs +1 -1
  148. package/dist/lib/esm/setting-components/time-component.d.mts +1 -1
  149. package/dist/lib/esm/setting-components/time-component.mjs +1 -1
  150. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +1 -1
  151. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +1 -1
  152. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +1 -1
  153. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +1 -1
  154. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +1 -1
  155. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +1 -1
  156. package/dist/lib/esm/setting-components/url-component.d.mts +1 -1
  157. package/dist/lib/esm/setting-components/url-component.mjs +1 -1
  158. package/dist/lib/esm/setting-components/week-component.d.mts +1 -1
  159. package/dist/lib/esm/setting-components/week-component.mjs +1 -1
  160. package/dist/lib/esm/vault.d.mts +2 -2
  161. package/dist/lib/esm/vault.mjs +2 -2
  162. package/package.json +5 -4
@@ -485,4 +485,4 @@ export {
485
485
  unregisterFileCacheForNonExistingFile,
486
486
  unregisterFiles
487
487
  };
488
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyTGlua3MsXG4gIHBhcnNlTGlua3MsXG4gIHRvUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQgeyBmaW5kUGx1Z2luQXBpIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgeyBzb3J0UmVmZXJlbmNlcyB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua1JlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2luZyBmZWF0dXJlcyB0aGF0IHdlcmUgYXBwbGllZCB3aGVuIGNvbXB1dGluZyB0aGlzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHlcbiAgICogd2hlbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHkgd2hlblxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2V0Q2FjaGVTYWZlfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0Q2FjaGVTYWZlT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRMaW5rc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FjaGVkIG1ldGFkYXRhIHRvIHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVtYmVkcyAoYGNhY2hlLmVtYmVkc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWVzLiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGZyb250bWF0dGVyIGxpbmtzIChgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsXG4gICAqIGkuZS4gdGhlIG9mZnNldC1jYXJyeWluZyBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcyAobmFycm93ZWQgdmlhXG4gICAqIHtAbGluayBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHN9KS4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlIGxpbmtzIChgY2FjaGUubGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlUmVmZXJlbmNlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5IHtAbGluayBnZXRDYWNoZVNhZmV9IGFuZCB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gYmV5b25kIE9ic2lkaWFuJ3NcbiAqIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nLiBFYWNoIG9wdGlvbiBpcyBvcHQtaW47IGVuYWJsaW5nIGl0IGFkZHMgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZX0gYW5kIHBvcHVsYXRlcyB0aGUgbWF0Y2hpbmcgbGlua3MgYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGludGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTWV0YWRhdGFPcHRpb25zID0gUGFyc2VDYWNoZU9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBwdWJsaXNoZWQgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkLFxuICogYmVjYXVzZSB0aGF0IHBsdWdpbiBpcyBub3QgYSBkZXBlbmRlbmN5IChydWxlIEw5IGluIGBBR0VOVFMubWRgKS4gSXRzIGBhcGkuZC50c2AgZGVjbGFyZXMgdGhlIHdob2xlIG9mIGl0LlxuICovXG5pbnRlcmZhY2UgQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHtcbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MsIG9yIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUgb25jZSB0aGUgcGVuZGluZyBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYmFja2xpbmtzLCBvciB0byBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgXG4gICAqICAgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBGZWF0dXJlTGlua1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmsgY2F0ZWdvcnksIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2F0ZWdvcnkgdG8gYmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmU7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmtzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gdGhlIGNhY2hlLlxuICAgKi9cbiAgc2VsZWN0OiAoY2FjaGU6IENhY2hlZE1ldGFkYXRhRXgpID0+IFJlZmVyZW5jZVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjYXRlZ29yeS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4fS5cbiAqL1xuaW50ZXJmYWNlIFRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGxhaW4gY2FjaGVkIG1ldGFkYXRhIHRvIHdyYXAuXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIGNvbnRlbnQgdGhlIG9mZnNldHMgaW5kZXggaW50bywgdXNlZCBmb3IgYm9keSBleHRlcm5hbC1saW5rIHBhcnNpbmcuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGxpbmtzIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUGFyc2VDYWNoZU9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpZCBvZiB0aGUgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwbHVnaW4sIHRoZSBzdWNjZXNzb3IgdG8gYEJhY2tsaW5rIENhY2hlYC5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBoYXNCYWNrbGlua0NhY2hlUGx1Z2lufSwgYW5kIGFzIHRoZSBwcm92aWRlciBpZCB1bmRlciB3aGljaCB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aH0gYW5kIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0gbG9vayB1cCB0aGUgcGx1Z2luJ3MgcHVibGlzaGVkIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRCA9ICdhZHZhbmNlZC1tZXRhZGF0YS1jYWNoZSc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHZlcnNpb25zIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY29tcGlsZWQgYWdhaW5zdC4gYDEuMy4wYCBpcyB0aGUgZmlyc3QgdG8gY2FycnkgdGhlIHR3byBiYWNrbGluayBtZXRob2RzLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UgPSAnXjEuMy4wJztcblxuLyoqXG4gKiBUaGUgc2NoZW1hcyBvZiBhIGJhY2tsaW5rIG1ldGhvZCdzIHBheWxvYWRzOiB0aGUgb25lIHBhdGgtb3ItZmlsZSBhcmd1bWVudCwgYW5kIHRoZSBiYWNrbGlua3Mgb3IgYG51bGxgLlxuICpcbiAqIEEgY29weSBvZiB0aGUgYGdldEJhY2tsaW5rc0ZvckZpbGVgIGFuZCBgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmVgIGVudHJpZXMgb2YgYEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0FQSV9DT05UUkFDVGAsIHdoaWNoIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgc2hpcHMgYXNcbiAqIGl0cyByb290IGBhcGktY29udHJhY3QudHNgIGFuZCBwdWJsaXNoZXMuIEtlZXAgdGhlIGd1YXJkcyBpbiBhZ3JlZW1lbnQgd2l0aCB0aGF0IGZpbGUsIHNvIHRoZSBwcm92aWRlciBhbmQgdGhpcyBjb25zdW1lciBjaGVjayBvbmUgZGVmaW5pdGlvbi5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVCA9IHtcbiAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGF0aE9yRmlsZTogUGF0aE9yRmlsZV0+KFt7IGV4cGVjdGVkOiAnYSBwYXRoIG9yIGEgZmlsZScsIHR5cGVHdWFyZDogaXNQYXRoT3JGaWxlIH1dKSxcbiAgb3V0cHV0OiBjcmVhdGVUeXBlR3VhcmRTY2hlbWEoeyBleHBlY3RlZDogJ2EgYmFja2xpbmtzIGRpY3Rpb25hcnkgb3IgbnVsbCcsIHR5cGVHdWFyZDogaXNOdWxsYWJsZUJhY2tsaW5rc0RpY3QgfSlcbn07XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IG9mIHRoZSBtZW1iZXJzIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIHNvIGEgcmVjb3JkIHRoYXQgbGFja3MgZWl0aGVyIGlzIHBhc3NlZCBvdmVyLCBhbmQgYSBwYXlsb2FkIHRoYXQgYnJlYWtzIGl0cyBzaWduYXR1cmUgaXMgcmVwb3J0ZWQgd2hpbGUgdGhlIGBQbHVnaW5BcGlgIGRlYnVnZ2VyIGlzIG9uLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX0NPTlRSQUNUOiBBcGlDb250cmFjdDxBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGk+ID0ge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNULFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVFxufTtcblxuLyoqXG4gKiBUaGUgcGx1Z2luIGlkIG9mIHRoZSByZXRpcmVkIGBCYWNrbGluayBDYWNoZWAgcGx1Z2luLCBzdXBlcnNlZGVkIGJ5IHtAbGluayBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUR9LlxuICpcbiAqIFN0aWxsIHJlY29nbml6ZWQgYnkge0BsaW5rIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW59LCBkZWxpYmVyYXRlbHkuIFJlbW92aW5nIGEgcGx1Z2luIGZyb20gdGhlIGNvbW11bml0eSByZWdpc3RyeSBibG9ja3MgbmV3IGluc3RhbGxzOyBpdCB1bmluc3RhbGxzIG5vdGhpbmcsIHNvIGV2ZXJ5IGV4aXN0aW5nIHVzZXIga2VlcHMgaXQgdW50aWwgdGhleSBtaWdyYXRlIGJ5IGhhbmQuXG4gKlxuICogSXQgbWF5IGJlIGRyb3BwZWQgd2hlbiBhbGwgdGhyZWUgb2YgdGhlIGZvbGxvd2luZyBob2xkLCBhbmQgbm90IGJlZm9yZTogYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBpcyBsaXN0ZWQgaW4gdGhlIGNvbW11bml0eSByZWdpc3RyeSwgc28gbWlncmF0aW5nIGlzIHBvc3NpYmxlIGF0IGFsbDsgdGhlIGZpbmFsIGBCYWNrbGluayBDYWNoZWAgaGFuZG92ZXIgcmVsZWFzZSBoYXMgYmVlbiBvdXQgZm9yIGF0IGxlYXN0IHR3ZWx2ZSBtb250aHM7IGFuZCB0aGlzIGxpYnJhcnkgaXMgY3V0dGluZyBhIG1ham9yIHJlbGVhc2UgYW55d2F5LCBiZWNhdXNlIGRyb3BwaW5nIHRoZSBpZCBzaWxlbnRseSB1bi1nYXRlcyBjYW52YXMgbGluayBoYW5kbGluZyBmb3IgYW55b25lIHdobyBoYXMgbm90IG1pZ3JhdGVkLiBUaGVyZSBpcyBubyBjb3N0IHByZXNzdXJlIHRvIGRyb3AgaXQgZWFybGllciAtIHJlY29nbml6aW5nIGEgZGVhZCBpZCBpcyBvbmUgc3RyaW5nIGNvbXBhcmlzb24gb24gYSBwYXRoIHRoYXQgYWxyZWFkeSByZWFkcyBhIHBsdWdpbiByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRCA9ICdiYWNrbGluay1jYWNoZSc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeSBmb3IgYWxsIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uQ2xlYW5DYWNoZShyZXNvbHZlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICogTk9URTogVGhlIGZpbGUgbWF5IGJlIG5vbi1leGlzdGVudC5cbiAqXG4gKiBXaGVuIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcHVibGlzaGVzIGl0cyBiYWNrbGlua3MgQVBJIGFuZCBpdHMgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9uLCBpdHMgY2FjaGUgYW5zd2Vycy5cbiAqIE90aGVyd2lzZSB0aGUgYW5zd2VyIGNvbWVzIGZyb20gYSBiYWNrbGluayBpbmRleCB3aG9zZSBjb3N0IGlzIHByb3BvcnRpb25hbCB0byB0aGUgY2FuZGlkYXRlIG5vdGVzIHJhdGhlciB0aGFuXG4gKiB0byBldmVyeSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0LCBhbmQgd2hpY2ggZ2l2ZXMgdGhlIHNhbWUgcmVmZXJlbmNlcyBPYnNpZGlhbidzIG93biBgZ2V0QmFja2xpbmtzRm9yRmlsZWAgZ2l2ZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW2ZpbGVdKTtcbiAgcmV0dXJuIGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKT8uZ2V0QmFja2xpbmtzRm9yRmlsZShmaWxlKSA/PyBnZXRJbmRleGVkQmFja2xpbmtzRm9yRmlsZShhcHAsIGZpbGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICpcbiAqIFdoZW4gYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwdWJsaXNoZXMgaXRzIGJhY2tsaW5rcyBBUEkgYW5kIGl0cyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb24sIHRoYXQgQVBJIGFuc3dlcnMuXG4gKlxuICogT3RoZXJ3aXNlIHRoaXMgaXMgTk9UIGEgcHVyZSByZWFkLiBJdCB2ZXJpZmllc1xuICogZWFjaCBiYWNrbGluayBhZ2FpbnN0IHRoZSBub3RlJ3MgY3VycmVudCB0ZXh0LCBhbmQgdG8gZG8gdGhhdCBpdCBjYWxscyB7QGxpbmsgc2F2ZU5vdGV9IG9uIGV2ZXJ5XG4gKiBub3RlIHRoYXQgbGlua3MgdG8gdGhlIGZpbGUsIHdoaWNoIHNhdmVzIGFueSBvcGVuIGVkaXRvciB2aWV3IG9mIHRob3NlIG5vdGVzIHRoYXQgaGFzIHVuc2F2ZWRcbiAqIGNoYW5nZXMuIENhbGwgaXQgZnJvbSBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbi4gRG8gbm90IGNhbGwgaXQgZnJvbSBhbiBhdXRvbWF0aWMgdHJpZ2dlciAoYSB2YXVsdCBvclxuICogbWV0YWRhdGEgZXZlbnQsIGEgc2F2ZSBvciByZW5kZXIgcGF0Y2gpIHRoYXQgb25seSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0LiBUaGVyZSwgYSBmb3JjZWQgc2F2ZSBjYW5cbiAqIHJhY2UgYW5vdGhlciBwbHVnaW4ncyBpbi1mbGlnaHQgZWRpdG9yIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgZGljdGlvbmFyeSBvZiBiYWNrbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShwYXJhbXM6IEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zKTogUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPj4ge1xuICBjb25zdCB7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBjYWNoZWRCYWNrbGlua3MgPSBhd2FpdCBmaW5kQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpKCk/LmdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhdGhPckZpbGUpO1xuICBpZiAoY2FjaGVkQmFja2xpbmtzKSB7XG4gICAgcmV0dXJuIGNhY2hlZEJhY2tsaW5rcztcbiAgfVxuXG4gIGxldCBiYWNrbGlua3M6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+ID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICBhc3luYyBvcGVyYXRpb25GdW5jdGlvbihhYm9ydFNpZ25hbCkge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgYmFja2xpbmtzID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIGZpbGUpO1xuICAgICAgZm9yIChjb25zdCBub3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG5vdGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBub3RlUGF0aCB9KTtcbiAgICAgICAgaWYgKCFub3RlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBjYW52YXMgaG9sZGVyIGNhbm5vdCBiZSBjaGVja2VkIGFnYWluc3QgaXRzIHRleHQuIEl0cyBmaWxlLW5vZGUgcmVmZXJlbmNlcyBjYXJyeSBubyBwb3NpdGlvbiwgYW5kXG4gICAgICAgIC8vIE9ic2lkaWFuIHJlcG9ydHMgYSB0ZXh0LW5vZGUgZW1iZWQgd2l0aCBhIHBvc2l0aW9uIGludG8gdGhhdCBub2RlJ3Mgb3duIHRleHQsIG5vdCBpbnRvIHRoZSBjYW52YXMgSlNPTixcbiAgICAgICAgLy8gc28gc2xpY2luZyB0aGUgZmlsZSBhdCBpdCBuZXZlciBnaXZlcyB0aGUgbGluayBiYWNrIGFuZCB0aGUgcmV0cnkgd291bGQgbmV2ZXIgZW5kLlxuICAgICAgICBpZiAoaXNDYW52YXNGaWxlKG5vdGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlua3MgPSBiYWNrbGlua3MuZ2V0KG5vdGVQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlZCBvbmx5IHdoZW4gYSBmcm9udG1hdHRlciBsaW5rIG5lZWRzIGl0OiBhIG5vdGUgd2hvc2UgWUFNTCBkb2VzIG5vdCBwYXJzZSBzdGlsbCBob2xkcyBib2R5IGxpbmtzLFxuICAgICAgICAvLyBhbmQgYG51bGxgIG1hcmtzIGEgcGFyc2UgdGhhdCBmYWlsZWQsIHNvIGl0cyBmcm9udG1hdHRlciBsaW5rcyBhcmUgc2tpcHBlZCByYXRoZXIgdGhhbiByZXRyaWVkIGZvcmV2ZXIuXG4gICAgICAgIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGxldCBhY3R1YWxMaW5rOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykpIHtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBjb250ZW50LnNsaWNlKGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSkge1xuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQsIG5vdGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9udG1hdHRlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBsaW5rLmtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua1dpdGhPZmZzZXRzID0gdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspO1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IHByb3BlcnR5VmFsdWUuc2xpY2UobGlua1dpdGhPZmZzZXRzLnN0YXJ0T2Zmc2V0LCBsaW5rV2l0aE9mZnNldHMuZW5kT2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3R1YWxMaW5rICE9PSBsaW5rLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGgsIHsgZmlsZVBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmV0cnlPcHRpb25zOiBvcHRpb25zLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBvcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlID8/IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIGJhY2tsaW5rcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgYSBnaXZlbiBmaWxlIG9yIHBhdGguXG4gKlxuICogVGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQ6IGJlZm9yZSBpdCByZWFkcyB0aGUgY2FjaGUsIGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0sIHdoaWNoIHNhdmVzIGFueVxuICogb3BlbiBlZGl0b3IgdmlldyBvZiB0aGUgbm90ZSB0aGF0IGhhcyB1bnNhdmVkIGNoYW5nZXMuIFRoYXQgc2F2ZSBpcyB3aHkgdGhlIGNhY2hlIG1hdGNoZXMgd2hhdCB0aGVcbiAqIHVzZXIgc2VlcywgYW5kIHdoeSBhIGNvbW1hbmQgdGhhdCByZXdyaXRlcyB0aGUgbm90ZSBjYW4gdXNlIHRoaXMgc2FmZWx5IHdpdGhvdXQgaXRzIHJld3JpdGUgYmVpbmdcbiAqIGNsb2JiZXJlZC4gSXQgaXMgYWxzbyBhIHdyaXRlIG9uIHRoZSBub3RlLiBTbyBkbyBub3QgY2FsbCB0aGlzIGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHRcbiAqIG9yIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoLCBhIGxheW91dCBob29rKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdDogYVxuICogZm9yY2VkIHNhdmUgb25lIHRpY2sgYWZ0ZXIgYW5vdGhlciBwbHVnaW4gaGFzIGRpc3BhdGNoZWQgYSBjaGFuZ2UgaW50byB0aGUgZWRpdG9yIGNhbiBsZWF2ZVxuICogT2JzaWRpYW4ncyBlZGl0b3IgcmVuZGVyaW5nIHN0YWxlIHN0YXRlLiBBIHJlYWQtb25seSBwcm9iZSBvbiB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCBzaG91bGQgdXNlXG4gKiB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gb24gdGhhdCB0ZXh0IGluc3RlYWQuIEl0IG5lZWRzIG5vIHZpZXcsIG5vIGNhY2hlIGFuZCBubyBzYXZlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUsIG9wdGlvbnM6IEdldENhY2hlU2FmZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGFFeCB8IG51bGw+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGZpbGVPclBhdGggfSk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICAgIGlmIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuXG4gICAgICBjb25zdCBmaWxlQ2FjaGVFbnRyeSA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAgICAgY29uc3QgaXNVcFRvRGF0ZSA9IGZpbGVDYWNoZUVudHJ5Py5tdGltZSA9PT0gZmlsZS5zdGF0Lm10aW1lXG4gICAgICAgICYmIGZpbGVDYWNoZUVudHJ5LnNpemUgPT09IGZpbGUuc3RhdC5zaXplXG4gICAgICAgICYmIE9iamVjdC5oYXNPd24oYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZSwgZmlsZUNhY2hlRW50cnkuaGFzaCk7XG4gICAgICBpZiAoIWlzVXBUb0RhdGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZUZpbGVNZXRhZGF0YUFzeW5jKGZpbGUpO1xuICAgICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIH1cbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH1cblxuICAgIGlmIChjYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT25seSB0aGUgYm9keS1leHRlcm5hbCBwYXJzZSBuZWVkcyB0aGUgZmlsZSBjb250ZW50OyBmcm9udG1hdHRlciBwYXJzaW5nIHVzZXMgdGhlIGNhY2hlZFxuICAgIC8vIGZyb250bWF0dGVyLCBzbyBhdm9pZCByZWFkaW5nIHRoZSBjb250ZW50IHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuXG4gICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJztcbiAgICByZXR1cm4gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogSXQgcmVhZHMgdGhyb3VnaCB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSwgc28gaXQgc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXNcbiAqIHVuc2F2ZWQgY2hhbmdlcy4gU2VlIHtAbGluayBnZXRDYWNoZVNhZmV9IGZvciB3aGVuIHRoYXQgc2F2ZSBtYXR0ZXJzIGFuZCB3aGF0IHRvIHVzZSBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZyb250IG1hdHRlciBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZyb250bWF0dGVyU2FmZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPj4ge1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICByZXR1cm4gKGNhY2hlPy5mcm9udG1hdHRlciA/PyB7fSkgYXMgQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua3MocGFyYW1zOiBHZXRMaW5rc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID8gY2FjaGUubGlua3MgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVFbWJlZHMgPyBjYWNoZS5lbWJlZHMgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID8gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/PyBbXSA6IFtdKVxuICBdO1xuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnbXVsdGktdmFsdWUgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH1cbiAgXTtcblxuICBmb3IgKGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3Igb2YgZmVhdHVyZUxpbmtTZWxlY3RvcnMpIHtcbiAgICBpZiAoIWZlYXR1cmVMaW5rU2VsZWN0b3Iuc2hvdWxkSW5jbHVkZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGUpIHx8ICFjYWNoZS5mZWF0dXJlcy5pbmNsdWRlcyhmZWF0dXJlTGlua1NlbGVjdG9yLmZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmNsdWRlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5kZXNjcmlwdGlvbn06IHRoZSBjYWNoZSB3YXMgbm90IGNvbXB1dGVkIHdpdGggdGhlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlfSBmZWF0dXJlLmApO1xuICAgIH1cblxuICAgIGxpbmtzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhsaW5rcyk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gZW5zdXJlTm9uTnVsbGFibGUobGlua3NbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSAmJiBpc1JlZmVyZW5jZUNhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNMaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSA/IGxpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKSA/IHByZXZpb3VzTGluay5zdGFydE9mZnNldCA6IDA7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspICE9PSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGN1cnJlbnRseSBsb2FkZWQgLSBlaXRoZXIgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCAoe0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0pIG9yIGl0cyByZXRpcmVkIHByZWRlY2Vzc29yIGBCYWNrbGluayBDYWNoZWAgKHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9KS5cbiAqXG4gKiBTdWNoIGEgcGx1Z2luIGtlZXBzIGEgZHJhaW4tb24tcmVhZCBiYWNrbGluayBpbmRleCBhbmQgaW5kZXhlcyBjYW52YXMgbWV0YWRhdGEsIHNvIGEgY2FsbGVyIHRoYXQgY29tcGVuc2F0ZXMgZm9yIE9ic2lkaWFuJ3Mgb3duIGdhcHMgY2FuIHN0YW5kIGRvd24gd2hpbGUgb25lIGlzIHByZXNlbnQuIEJvdGggaWRzIGFyZSByZWNvZ25pemVkOyB7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSByZWNvcmRzIHdoZW4gdGhlIHJldGlyZWQgb25lIG1heSBiZSBkcm9wcGVkLlxuICpcbiAqIFRoaXMgcmVhZHMgdGhlIExPQURFRCBwbHVnaW4gaW5zdGFuY2UgcmF0aGVyIHRoYW4gYGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zYCwgZGVsaWJlcmF0ZWx5OiB0aGUgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgcGx1Z2luJ3MgcGF0Y2hlcyBhcmUgaW4gcGxhY2UgcmlnaHQgbm93LCBhbmQgdGhleSBhcmUgbm90IHVudGlsIGl0IGhhcyBsb2FkZWQuIFBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gY2FsbCB0aGlzIGZyb20gYSB1c2VyLWRyaXZlbiBwYXRoIHJhdGhlciB0aGFuIGZyb20gcGx1Z2luIGxvYWQgLSBzZWUgcnVsZSBMMjUgaW4gYEFHRU5UUy5tZGAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4oYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuIGFwcC5wbHVnaW5zLmdldFBsdWdpbihBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsIHx8IGFwcC5wbHVnaW5zLmdldFBsdWdpbihCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9IChpLmUuIGl0IHdhcyBjb21wdXRlZCB3aXRoIGV4dGVybmFsLWxpbmtcbiAqIHBhcnNpbmcgZW5hYmxlZCkuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIGNhY2hlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogY2FjaGUgaXMgQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIHJldHVybiAnZmVhdHVyZXMnIGluIGNhY2hlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgJHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoJHN0cmluZykuYnVmZmVyO1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVNZXRhZGF0YUFzeW5jKGJ1ZmZlcikgPz8ge307XG4gIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudDogJHN0cmluZywgb3B0aW9ucyB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgZmlsZSBjYWNoZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShwYXJhbXM6IFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZXMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMDtcbiAgICAgIGNvdW50Kys7XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuXG4gICAgICBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdID0gZmlsZTtcblxuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVzKGFwcCwgZmlsZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gdW5yZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBmaWxlcyBmcm9tIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdW5yZWdpc3Rlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IHZvaWQge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDE7XG4gICAgICBjb3VudC0tO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuZGVsZXRlKGZpbGUucGF0aCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF07XG5cbiAgICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpOiBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZWdpc3RlcmVkRmlsZXNDb3VudHMnLCBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsbHkgcmVjb2duaXplcyB0aGUgYmFja2xpbmtzIGRpY3Rpb25hcnkgYW5vdGhlciBwbHVnaW4ncyBjb3B5IGJ1aWx0LCBvciBgbnVsbGAuIFRoZSBjbGFzcyBpdCB3YXMgYnVpbHQgZnJvbSBsaXZlcyBpbiB0aGF0IGNvcHksIHNvIGBpbnN0YW5jZW9mYCBjYW5ub3QgYmUgdXNlZCAocnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIHJlYWRzIGFzIGEgYmFja2xpbmtzIGRpY3Rpb25hcnkuXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbGFibGVCYWNrbGlua3NEaWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gfCBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICYmIFJlZmxlY3QuZ2V0KHZhbHVlLCAnZGF0YScpIGluc3RhbmNlb2YgTWFwXG4gICAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdnZXQnKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAna2V5cycpID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50OiBzdHJpbmcsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IFBhcnNlTGlua1JlZmVyZW5jZVtdIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXJFbmRPZmZzZXQgPSBjYWNoZS5mcm9udG1hdHRlclBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDA7XG4gIHJldHVybiBwYXJzZUxpbmtzKGNvbnRlbnQpXG4gICAgLmZpbHRlcigocGFyc2VMaW5rUmVzdWx0KSA9PiBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBwYXJzZUxpbmtSZXN1bHQuc3RhcnRPZmZzZXQgPj0gZnJvbnRtYXR0ZXJFbmRPZmZzZXQpXG4gICAgLm1hcCgocGFyc2VMaW5rUmVzdWx0KSA9PiB0b1BhcnNlTGlua1JlZmVyZW5jZSh7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXJPck51bGwoY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkIGluICR7cGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHBhcmFtczogVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zKTogQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIGNvbnN0IHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW10gPSBbQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTmF0aXZlXTtcbiAgY29uc3QgcmVzdWx0OiBDYWNoZWRNZXRhZGF0YUV4ID0geyAuLi5jYWNoZSwgZmVhdHVyZXMgfTtcblxuICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUV4dGVybmFsTGlua3MpIHtcbiAgICByZXN1bHQuZXh0ZXJuYWxMaW5rcyA9IHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudCwgY2FjaGUpO1xuICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRXh0ZXJuYWxMaW5rcyk7XG4gIH1cblxuICBpZiAoXG4gICAgb3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIHx8IG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICkge1xuICAgIGNvbnN0IGZyb250bWF0dGVyTGlua3MgPSBwYXJzZUZyb250bWF0dGVyTGlua3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKSB7XG4gICAgICByZXN1bHQubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QUFBQSxJQUNWLFVBQVU7QUFBQSxFQUNaLENBQUM7QUFDSDtBQUVBLFNBQVMsMkJBQWdEO0FBQ3ZELFNBQU8seUJBQXlCLHlCQUF5QixvQkFBSSxJQUFvQixDQUFDLEVBQUU7QUFDdEY7QUFRQSxTQUFTLHdCQUF3QixPQUE0RDtBQUMzRixTQUFPLFVBQVUsUUFDWCxPQUFPLFVBQVUsWUFDaEIsUUFBUSxJQUFJLE9BQU8sTUFBTSxhQUFhLE9BQ3RDLE9BQU8sUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLGNBQ3JDLE9BQU8sUUFBUSxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQy9DO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsT0FBNkM7QUFDNUYsUUFBTSx1QkFBdUIsTUFBTSxxQkFBcUIsSUFBSSxVQUFVO0FBQ3RFLFNBQU8sV0FBVyxPQUFPLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsb0JBQW9CLEVBQzdHLElBQUksQ0FBQyxvQkFBb0IscUJBQXFCLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hGO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsTUFBbUQ7QUFDbEcsTUFBSTtBQUNGLFdBQU8saUJBQWlCLE9BQU87QUFBQSxFQUNqQyxTQUFTLE9BQU87QUFDZCxlQUFXLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMvRSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyx5QkFBeUIsUUFBMEQ7QUFDMUYsUUFBTSxFQUFFLE9BQU8sU0FBUyxRQUFRLElBQUk7QUFDcEMsUUFBTSxXQUFzQyxDQUFDLHFCQUE4QjtBQUMzRSxRQUFNLFNBQTJCLEVBQUUsR0FBRyxPQUFPLFNBQVM7QUFFdEQsTUFBSSxRQUFRLDBCQUEwQjtBQUNwQyxXQUFPLGdCQUFnQix1QkFBdUIsU0FBUyxLQUFLO0FBQzVELGFBQVMsS0FBSyxtQ0FBcUM7QUFBQSxFQUNyRDtBQUVBLE1BQ0UsUUFBUSx1Q0FDTCxRQUFRLGlEQUNSLFFBQVEsdUNBQ1g7QUFDQSxVQUFNLG1CQUFtQixzQkFBc0IsTUFBTSxXQUFXO0FBRWhFLFFBQUksUUFBUSxxQ0FBcUM7QUFDL0MsYUFBTywyQkFBMkIsaUJBQWlCO0FBQ25ELGVBQVMsS0FBSyx5REFBZ0Q7QUFBQSxJQUNoRTtBQUVBLFFBQUksUUFBUSwrQ0FBK0M7QUFDekQsYUFBTyxxQ0FBcUMsaUJBQWlCO0FBQzdELGVBQVMsS0FBSyw2RUFBMEQ7QUFBQSxJQUMxRTtBQUVBLFFBQUksUUFBUSx1Q0FBdUM7QUFDakQsYUFBTyw2QkFBNkIsaUJBQWlCO0FBQ3JELGVBQVMsS0FBSyw2REFBa0Q7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwibmFtZXMiOlsiQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUiXX0=
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZXRhZGF0YS1jYWNoZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgbWV0YWRhdGEgY2FjaGUgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcGlDb250cmFjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcGktY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBSZXRyeU9wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMnO1xuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgeyBDYWxsYmFja0Rpc3Bvc2FibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZGlzcG9zYWJsZSc7XG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGdldE5lc3RlZFByb3BlcnR5VmFsdWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIEN1c3RvbUFycmF5RGljdEltcGwsXG4gIGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGUsXG4gIGlzUmVmZXJlbmNlQ2FjaGUsXG4gIHBhcmVudEZvbGRlclBhdGhcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VXaXRoT2Zmc2V0cyxcbiAgUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5cbmltcG9ydCB7IHJldHJ5V2l0aFRpbWVvdXROb3RpY2UgfSBmcm9tICcuL2FzeW5jLXdpdGgtbm90aWNlLnRzJztcbmltcG9ydCB7IGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlIH0gZnJvbSAnLi9iYWNrbGluay1pbmRleC50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldFBhdGgsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNGaWxlLFxuICBpc1BhdGhPckZpbGVcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMsXG4gIHRvRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0c1xufSBmcm9tICcuL2Zyb250bWF0dGVyLWxpbmstY2FjaGUtd2l0aC1vZmZzZXRzLnRzJztcbmltcG9ydCB7IHBhcnNlRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQge1xuICBwYXJzZUZyb250bWF0dGVyTGlua3MsXG4gIHBhcnNlTGlua3MsXG4gIHRvUGFyc2VMaW5rUmVmZXJlbmNlXG59IGZyb20gJy4vcGFyc2UtbGluay50cyc7XG5pbXBvcnQgeyBmaW5kUGx1Z2luQXBpIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQgeyBzb3J0UmVmZXJlbmNlcyB9IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcbmltcG9ydCB7XG4gIHJlYWRTYWZlLFxuICBzYXZlTm90ZVxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuLyoqXG4gKiBBIHBhcnNpbmcgZmVhdHVyZSB0aGF0IHdhcyBhcHBsaWVkIHdoZW4gY29tcHV0aW5nIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICovXG5leHBvcnQgZW51bSBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LlxuICAgKi9cbiAgRXh0ZXJuYWxMaW5rcyA9ICdFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gJ0Zyb250bWF0dGVyRXh0ZXJuYWxMaW5rcycsXG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9ICdNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzJyxcblxuICAvKipcbiAgICogVGhlIGludGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsIHdoaWNoIE9ic2lkaWFuIGRvZXMgbm90IG5hdGl2ZWx5IGNhY2hlLlxuICAgKi9cbiAgTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSAnTXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MnLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nIChpbnRlcm5hbCBsaW5rcywgZW1iZWRzLCBmcm9udG1hdHRlciBsaW5rcykuXG4gICAqL1xuICBOYXRpdmUgPSAnTmF0aXZlJ1xufVxuXG4vKipcbiAqIEFuIGV4dGVuZGVkIHtAbGluayBDYWNoZWRNZXRhZGF0YX0gdGhhdCByZWNvcmRzIHdoaWNoIHBhcnNpbmcge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlfXMgd2VyZVxuICogYXBwbGllZCAodmlhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4LmZlYXR1cmVzfSkgYW5kIGNhcnJpZXMgdGhlIHJlc3VsdGluZyBleHRlcm5hbCBsaW5rcy4gRWFjaCBsaW5rc1xuICogYXJyYXkgaXMgcG9wdWxhdGVkIG9ubHkgd2hlbiBpdHMgY29ycmVzcG9uZGluZyBmZWF0dXJlIGlzIHByZXNlbnQgaW4ge0BsaW5rIENhY2hlZE1ldGFkYXRhRXguZmVhdHVyZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlZE1ldGFkYXRhRXggZXh0ZW5kcyBDYWNoZWRNZXRhZGF0YSB7XG4gIC8qKlxuICAgKiBUaGUgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgY29udGVudCBib2R5LiBQb3B1bGF0ZWQgb25seSB3aGVuXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5FeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZXh0ZXJuYWxMaW5rcz86IFBhcnNlTGlua1JlZmVyZW5jZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyc2luZyBmZWF0dXJlcyB0aGF0IHdlcmUgYXBwbGllZCB3aGVuIGNvbXB1dGluZyB0aGlzIGNhY2hlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW107XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBzaW5nbGUtbGluayAoc2luZ2xlLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHlcbiAgICogd2hlbiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgZnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2VbXTtcblxuICAvKipcbiAgICogVGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBub3RlIGZyb250bWF0dGVyIHZhbHVlcy4gUG9wdWxhdGVkIG9ubHkgd2hlblxuICAgKiB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc30gaXMgYXBwbGllZC5cbiAgICovXG4gIG11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG5cbiAgLyoqXG4gICAqIFRoZSBpbnRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuIFBvcHVsYXRlZCBvbmx5IHdoZW5cbiAgICoge0BsaW5rIENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzfSBpcyBhcHBsaWVkLlxuICAgKi9cbiAgbXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3M/OiBQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZVdpdGhPZmZzZXRzW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IGEgdGltZW91dCBub3RpY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1RpbWVvdXROb3RpY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QmFja2xpbmtzRm9yRmlsZVNhZmVQYXJhbXMgZXh0ZW5kcyBHZXRCYWNrbGlua3NGb3JGaWxlU2FmZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2JqZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZ2V0Q2FjaGVTYWZlfS5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0Q2FjaGVTYWZlT3B0aW9ucyA9IFBhcnNlQ2FjaGVPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRMaW5rc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FjaGVkIG1ldGFkYXRhIHRvIHJldHJpZXZlIHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVtYmVkcyAoYGNhY2hlLmVtYmVkc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFbWJlZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFJlcXVpcmVzIHRoZSBjYWNoZSB0byBiZSBhXG4gICAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHNpbmdsZS1saW5rIChzaW5nbGUtdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWVzLiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGZyb250bWF0dGVyIGxpbmtzIChgY2FjaGUuZnJvbnRtYXR0ZXJMaW5rc2ApLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMsXG4gICAqIGkuZS4gdGhlIG9mZnNldC1jYXJyeWluZyBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcyAobmFycm93ZWQgdmlhXG4gICAqIHtAbGluayBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHN9KS4gUmVxdWlyZXMgdGhlIGNhY2hlIHRvIGJlIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKiBSZXF1aXJlcyB0aGUgY2FjaGUgdG8gYmUgYSB7QGxpbmsgQ2FjaGVkTWV0YWRhdGFFeH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlIGxpbmtzIChgY2FjaGUubGlua3NgKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlUmVmZXJlbmNlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIHBhcnNpbmcgcGVyZm9ybWVkIGJ5IHtAbGluayBnZXRDYWNoZVNhZmV9IGFuZCB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gYmV5b25kIE9ic2lkaWFuJ3NcbiAqIG5hdGl2ZSBtZXRhZGF0YSBwYXJzaW5nLiBFYWNoIG9wdGlvbiBpcyBvcHQtaW47IGVuYWJsaW5nIGl0IGFkZHMgdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZX0gYW5kIHBvcHVsYXRlcyB0aGUgbWF0Y2hpbmcgbGlua3MgYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VDYWNoZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSB0aGUgbm90ZSBjb250ZW50IGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGV4dGVybmFsIGxpbmtzIGZyb20gc2luZ2xlLWxpbmsgKHNpbmdsZS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwYXJzZSB0aGUgZXh0ZXJuYWwgbGlua3MgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgbm90ZSBmcm9udG1hdHRlciB2YWx1ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcGFyc2UgdGhlIGludGVybmFsIGxpbmtzIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIG5vdGUgZnJvbnRtYXR0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcGFyc2VNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB0eXBlIFBhcnNlTWV0YWRhdGFPcHRpb25zID0gUGFyc2VDYWNoZU9wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxlIGNhY2hlIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIHJlZ2lzdGVyIHRoZSBmaWxlIGNhY2hlIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBwdWJsaXNoZWQgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBkZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGltcG9ydGVkLFxuICogYmVjYXVzZSB0aGF0IHBsdWdpbiBpcyBub3QgYSBkZXBlbmRlbmN5IChydWxlIEw5IGluIGBBR0VOVFMubWRgKS4gSXRzIGBhcGkuZC50c2AgZGVjbGFyZXMgdGhlIHdob2xlIG9mIGl0LlxuICovXG5pbnRlcmZhY2UgQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpIHtcbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gICAqIEByZXR1cm5zIFRoZSBiYWNrbGlua3MsIG9yIGBudWxsYCB3aGlsZSB0aGUgcGx1Z2luJ3MgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGU6IChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKSA9PiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEFuc3dlcnMgZnJvbSB0aGUgcGx1Z2luJ3MgYmFja2xpbmsgY2FjaGUgb25jZSB0aGUgcGVuZGluZyBmaWxlIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9iamVjdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYmFja2xpbmtzLCBvciB0byBgbnVsbGAgd2hpbGUgdGhlIHBsdWdpbidzIGBCYWNrbGlua3NgXG4gICAqICAgbW9kdWxlIGlzIG9mZi5cbiAgICovXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlOiAocGF0aE9yRmlsZTogUGF0aE9yRmlsZSkgPT4gUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB8IG51bGw+O1xufVxuXG4vKipcbiAqIEEgc2VsZWN0b3IgZm9yIGEgZmVhdHVyZS1nYXRlZCBsaW5rIGNhdGVnb3J5IGluIHtAbGluayBnZXRMaW5rc30uXG4gKi9cbmludGVyZmFjZSBGZWF0dXJlTGlua1NlbGVjdG9yIHtcbiAgLyoqXG4gICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmsgY2F0ZWdvcnksIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZSB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2FjaGUgZm9yIHRoaXMgY2F0ZWdvcnkgdG8gYmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmU7XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmtzIGZvciB0aGlzIGNhdGVnb3J5IGZyb20gdGhlIGNhY2hlLlxuICAgKi9cbiAgc2VsZWN0OiAoY2FjaGU6IENhY2hlZE1ldGFkYXRhRXgpID0+IFJlZmVyZW5jZVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhpcyBjYXRlZ29yeS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4fS5cbiAqL1xuaW50ZXJmYWNlIFRvUGFyc2VkQ2FjaGVkTWV0YWRhdGFFeFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGxhaW4gY2FjaGVkIG1ldGFkYXRhIHRvIHdyYXAuXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIGNvbnRlbnQgdGhlIG9mZnNldHMgaW5kZXggaW50bywgdXNlZCBmb3IgYm9keSBleHRlcm5hbC1saW5rIHBhcnNpbmcuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGxpbmtzIHRvIHBhcnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUGFyc2VDYWNoZU9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpZCBvZiB0aGUgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwbHVnaW4sIHRoZSBzdWNjZXNzb3IgdG8gYEJhY2tsaW5rIENhY2hlYC5cbiAqXG4gKiBVc2VkIGJ5IHtAbGluayBoYXNCYWNrbGlua0NhY2hlUGx1Z2lufSwgYW5kIGFzIHRoZSBwcm92aWRlciBpZCB1bmRlciB3aGljaCB7QGxpbmsgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aH0gYW5kIHtAbGluayBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZX0gbG9vayB1cCB0aGUgcGx1Z2luJ3MgcHVibGlzaGVkIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRCA9ICdhZHZhbmNlZC1tZXRhZGF0YS1jYWNoZSc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHZlcnNpb25zIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY29tcGlsZWQgYWdhaW5zdC4gYDEuMy4wYCBpcyB0aGUgZmlyc3QgdG8gY2FycnkgdGhlIHR3byBiYWNrbGluayBtZXRob2RzLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UgPSAnXjEuMy4wJztcblxuLyoqXG4gKiBUaGUgc2NoZW1hcyBvZiBhIGJhY2tsaW5rIG1ldGhvZCdzIHBheWxvYWRzOiB0aGUgb25lIHBhdGgtb3ItZmlsZSBhcmd1bWVudCwgYW5kIHRoZSBiYWNrbGlua3Mgb3IgYG51bGxgLlxuICpcbiAqIEEgY29weSBvZiB0aGUgYGdldEJhY2tsaW5rc0ZvckZpbGVgIGFuZCBgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmVgIGVudHJpZXMgb2YgYEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0FQSV9DT05UUkFDVGAsIHdoaWNoIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgc2hpcHMgYXNcbiAqIGl0cyByb290IGBhcGktY29udHJhY3QudHNgIGFuZCBwdWJsaXNoZXMuIEtlZXAgdGhlIGd1YXJkcyBpbiBhZ3JlZW1lbnQgd2l0aCB0aGF0IGZpbGUsIHNvIHRoZSBwcm92aWRlciBhbmQgdGhpcyBjb25zdW1lciBjaGVjayBvbmUgZGVmaW5pdGlvbi5cbiAqL1xuY29uc3QgQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVCA9IHtcbiAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGF0aE9yRmlsZTogUGF0aE9yRmlsZV0+KFt7IGV4cGVjdGVkOiAnYSBwYXRoIG9yIGEgZmlsZScsIHR5cGVHdWFyZDogaXNQYXRoT3JGaWxlIH1dKSxcbiAgb3V0cHV0OiBjcmVhdGVUeXBlR3VhcmRTY2hlbWEoeyBleHBlY3RlZDogJ2EgYmFja2xpbmtzIGRpY3Rpb25hcnkgb3IgbnVsbCcsIHR5cGVHdWFyZDogaXNOdWxsYWJsZUJhY2tsaW5rc0RpY3QgfSlcbn07XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IG9mIHRoZSBtZW1iZXJzIG9mIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAncyBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIHNvIGEgcmVjb3JkIHRoYXQgbGFja3MgZWl0aGVyIGlzIHBhc3NlZCBvdmVyLCBhbmQgYSBwYXlsb2FkIHRoYXQgYnJlYWtzIGl0cyBzaWduYXR1cmUgaXMgcmVwb3J0ZWQgd2hpbGUgdGhlIGBvYnNpZGlhbi1saWI6dmFsaWRhdGUtcGx1Z2luLWFwaS1wYXlsb2Fkc2AgZGVidWcgc3dpdGNoIGlzIG9uLlxuICovXG5jb25zdCBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX0NPTlRSQUNUOiBBcGlDb250cmFjdDxBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGk+ID0ge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfTUVUSE9EX0NPTlRSQUNULFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZTogQURWQU5DRURfTUVUQURBVEFfQ0FDSEVfQkFDS0xJTktTX01FVEhPRF9DT05UUkFDVFxufTtcblxuLyoqXG4gKiBUaGUgcGx1Z2luIGlkIG9mIHRoZSByZXRpcmVkIGBCYWNrbGluayBDYWNoZWAgcGx1Z2luLCBzdXBlcnNlZGVkIGJ5IHtAbGluayBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUR9LlxuICpcbiAqIFN0aWxsIHJlY29nbml6ZWQgYnkge0BsaW5rIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW59LCBkZWxpYmVyYXRlbHkuIFJlbW92aW5nIGEgcGx1Z2luIGZyb20gdGhlIGNvbW11bml0eSByZWdpc3RyeSBibG9ja3MgbmV3IGluc3RhbGxzOyBpdCB1bmluc3RhbGxzIG5vdGhpbmcsIHNvIGV2ZXJ5IGV4aXN0aW5nIHVzZXIga2VlcHMgaXQgdW50aWwgdGhleSBtaWdyYXRlIGJ5IGhhbmQuXG4gKlxuICogSXQgbWF5IGJlIGRyb3BwZWQgd2hlbiBhbGwgdGhyZWUgb2YgdGhlIGZvbGxvd2luZyBob2xkLCBhbmQgbm90IGJlZm9yZTogYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBpcyBsaXN0ZWQgaW4gdGhlIGNvbW11bml0eSByZWdpc3RyeSwgc28gbWlncmF0aW5nIGlzIHBvc3NpYmxlIGF0IGFsbDsgdGhlIGZpbmFsIGBCYWNrbGluayBDYWNoZWAgaGFuZG92ZXIgcmVsZWFzZSBoYXMgYmVlbiBvdXQgZm9yIGF0IGxlYXN0IHR3ZWx2ZSBtb250aHM7IGFuZCB0aGlzIGxpYnJhcnkgaXMgY3V0dGluZyBhIG1ham9yIHJlbGVhc2UgYW55d2F5LCBiZWNhdXNlIGRyb3BwaW5nIHRoZSBpZCBzaWxlbnRseSB1bi1nYXRlcyBjYW52YXMgbGluayBoYW5kbGluZyBmb3IgYW55b25lIHdobyBoYXMgbm90IG1pZ3JhdGVkLiBUaGVyZSBpcyBubyBjb3N0IHByZXNzdXJlIHRvIGRyb3AgaXQgZWFybGllciAtIHJlY29nbml6aW5nIGEgZGVhZCBpZCBpcyBvbmUgc3RyaW5nIGNvbXBhcmlzb24gb24gYSBwYXRoIHRoYXQgYWxyZWFkeSByZWFkcyBhIHBsdWdpbiByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJBQ0tMSU5LX0NBQ0hFX1BMVUdJTl9JRCA9ICdiYWNrbGluay1jYWNoZSc7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeSBmb3IgYWxsIGZpbGVzLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtZXRhZGF0YSBjYWNoZSBpcyByZWFkeS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1ldGFkYXRhQ2FjaGVSZWFkeShhcHA6IEFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uQ2xlYW5DYWNoZShyZXNvbHZlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICogTk9URTogVGhlIGZpbGUgbWF5IGJlIG5vbi1leGlzdGVudC5cbiAqXG4gKiBXaGVuIGBBZHZhbmNlZCBNZXRhZGF0YSBDYWNoZWAgcHVibGlzaGVzIGl0cyBiYWNrbGlua3MgQVBJIGFuZCBpdHMgYEJhY2tsaW5rc2AgbW9kdWxlIGlzIG9uLCBpdHMgY2FjaGUgYW5zd2Vycy5cbiAqIE90aGVyd2lzZSB0aGUgYW5zd2VyIGNvbWVzIGZyb20gYSBiYWNrbGluayBpbmRleCB3aG9zZSBjb3N0IGlzIHByb3BvcnRpb25hbCB0byB0aGUgY2FuZGlkYXRlIG5vdGVzIHJhdGhlciB0aGFuXG4gKiB0byBldmVyeSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0LCBhbmQgd2hpY2ggZ2l2ZXMgdGhlIHNhbWUgcmVmZXJlbmNlcyBPYnNpZGlhbidzIG93biBgZ2V0QmFja2xpbmtzRm9yRmlsZWAgZ2l2ZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgYmFja2xpbmtzIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPiB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW2ZpbGVdKTtcbiAgcmV0dXJuIGZpbmRBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkoKT8uZ2V0QmFja2xpbmtzRm9yRmlsZShmaWxlKSA/PyBnZXRJbmRleGVkQmFja2xpbmtzRm9yRmlsZShhcHAsIGZpbGUpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgc2FmZWx5LlxuICpcbiAqIFdoZW4gYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCBwdWJsaXNoZXMgaXRzIGJhY2tsaW5rcyBBUEkgYW5kIGl0cyBgQmFja2xpbmtzYCBtb2R1bGUgaXMgb24sIHRoYXQgQVBJIGFuc3dlcnMuXG4gKlxuICogT3RoZXJ3aXNlIHRoaXMgaXMgTk9UIGEgcHVyZSByZWFkLiBJdCB2ZXJpZmllc1xuICogZWFjaCBiYWNrbGluayBhZ2FpbnN0IHRoZSBub3RlJ3MgY3VycmVudCB0ZXh0LCBhbmQgdG8gZG8gdGhhdCBpdCBjYWxscyB7QGxpbmsgc2F2ZU5vdGV9IG9uIGV2ZXJ5XG4gKiBub3RlIHRoYXQgbGlua3MgdG8gdGhlIGZpbGUsIHdoaWNoIHNhdmVzIGFueSBvcGVuIGVkaXRvciB2aWV3IG9mIHRob3NlIG5vdGVzIHRoYXQgaGFzIHVuc2F2ZWRcbiAqIGNoYW5nZXMuIENhbGwgaXQgZnJvbSBhbiBleHBsaWNpdCB1c2VyIGFjdGlvbi4gRG8gbm90IGNhbGwgaXQgZnJvbSBhbiBhdXRvbWF0aWMgdHJpZ2dlciAoYSB2YXVsdCBvclxuICogbWV0YWRhdGEgZXZlbnQsIGEgc2F2ZSBvciByZW5kZXIgcGF0Y2gpIHRoYXQgb25seSBkZWNpZGVzIHdoZXRoZXIgdG8gYWN0LiBUaGVyZSwgYSBmb3JjZWQgc2F2ZSBjYW5cbiAqIHJhY2UgYW5vdGhlciBwbHVnaW4ncyBpbi1mbGlnaHQgZWRpdG9yIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgZGljdGlvbmFyeSBvZiBiYWNrbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShwYXJhbXM6IEdldEJhY2tsaW5rc0ZvckZpbGVTYWZlUGFyYW1zKTogUHJvbWlzZTxDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPj4ge1xuICBjb25zdCB7IGFwcCwgcGF0aE9yRmlsZSwgLi4ub3B0aW9ucyB9ID0gcGFyYW1zO1xuICBjb25zdCBjYWNoZWRCYWNrbGlua3MgPSBhd2FpdCBmaW5kQWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpKCk/LmdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHBhdGhPckZpbGUpO1xuICBpZiAoY2FjaGVkQmFja2xpbmtzKSB7XG4gICAgcmV0dXJuIGNhY2hlZEJhY2tsaW5rcztcbiAgfVxuXG4gIGxldCBiYWNrbGlua3M6IEN1c3RvbUFycmF5RGljdDxSZWZlcmVuY2U+ID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuICBhd2FpdCByZXRyeVdpdGhUaW1lb3V0Tm90aWNlKHtcbiAgICBhc3luYyBvcGVyYXRpb25GdW5jdGlvbihhYm9ydFNpZ25hbCkge1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgYXdhaXQgZW5zdXJlTWV0YWRhdGFDYWNoZVJlYWR5KGFwcCk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgYmFja2xpbmtzID0gZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aChhcHAsIGZpbGUpO1xuICAgICAgZm9yIChjb25zdCBub3RlUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG5vdGUgPSBnZXRGaWxlT3JOdWxsKHsgYXBwLCBwYXRoT3JGaWxlOiBub3RlUGF0aCB9KTtcbiAgICAgICAgaWYgKCFub3RlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBjYW52YXMgaG9sZGVyIGNhbm5vdCBiZSBjaGVja2VkIGFnYWluc3QgaXRzIHRleHQuIEl0cyBmaWxlLW5vZGUgcmVmZXJlbmNlcyBjYXJyeSBubyBwb3NpdGlvbiwgYW5kXG4gICAgICAgIC8vIE9ic2lkaWFuIHJlcG9ydHMgYSB0ZXh0LW5vZGUgZW1iZWQgd2l0aCBhIHBvc2l0aW9uIGludG8gdGhhdCBub2RlJ3Mgb3duIHRleHQsIG5vdCBpbnRvIHRoZSBjYW52YXMgSlNPTixcbiAgICAgICAgLy8gc28gc2xpY2luZyB0aGUgZmlsZSBhdCBpdCBuZXZlciBnaXZlcyB0aGUgbGluayBiYWNrIGFuZCB0aGUgcmV0cnkgd291bGQgbmV2ZXIgZW5kLlxuICAgICAgICBpZiAoaXNDYW52YXNGaWxlKG5vdGUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIG5vdGUpO1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGlua3MgPSBiYWNrbGlua3MuZ2V0KG5vdGVQYXRoKTtcbiAgICAgICAgaWYgKCFsaW5rcykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlZCBvbmx5IHdoZW4gYSBmcm9udG1hdHRlciBsaW5rIG5lZWRzIGl0OiBhIG5vdGUgd2hvc2UgWUFNTCBkb2VzIG5vdCBwYXJzZSBzdGlsbCBob2xkcyBib2R5IGxpbmtzLFxuICAgICAgICAvLyBhbmQgYG51bGxgIG1hcmtzIGEgcGFyc2UgdGhhdCBmYWlsZWQsIHNvIGl0cyBmcm9udG1hdHRlciBsaW5rcyBhcmUgc2tpcHBlZCByYXRoZXIgdGhhbiByZXRyaWVkIGZvcmV2ZXIuXG4gICAgICAgIGxldCBmcm9udG1hdHRlcjogQ29tYmluZWRGcm9udG1hdHRlcjx1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGxldCBhY3R1YWxMaW5rOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlQ2FjaGUobGluaykpIHtcbiAgICAgICAgICAgIGFjdHVhbExpbmsgPSBjb250ZW50LnNsaWNlKGxpbmsucG9zaXRpb24uc3RhcnQub2Zmc2V0LCBsaW5rLnBvc2l0aW9uLmVuZC5vZmZzZXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSkge1xuICAgICAgICAgICAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnJvbnRtYXR0ZXIgPSBwYXJzZUZyb250bWF0dGVyT3JOdWxsKGNvbnRlbnQsIG5vdGVQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmcm9udG1hdHRlciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5VmFsdWUgPSBnZXROZXN0ZWRQcm9wZXJ0eVZhbHVlKGZyb250bWF0dGVyLCBsaW5rLmtleSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbGlua1dpdGhPZmZzZXRzID0gdG9Gcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspO1xuICAgICAgICAgICAgYWN0dWFsTGluayA9IHByb3BlcnR5VmFsdWUuc2xpY2UobGlua1dpdGhPZmZzZXRzLnN0YXJ0T2Zmc2V0LCBsaW5rV2l0aE9mZnNldHMuZW5kT2Zmc2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChhY3R1YWxMaW5rICE9PSBsaW5rLm9yaWdpbmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLm1ldGFkYXRhQ2FjaGUuZ2V0QmFja2xpbmtzRm9yRmlsZVBhdGgsIHsgZmlsZVBhdGg6IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSB9KSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IG51bGwsXG4gICAgcmV0cnlPcHRpb25zOiBvcHRpb25zLFxuICAgIHNob3VsZFNob3dUaW1lb3V0Tm90aWNlOiBvcHRpb25zLnNob3VsZFNob3dUaW1lb3V0Tm90aWNlID8/IHRydWVcbiAgfSk7XG5cbiAgcmV0dXJuIGJhY2tsaW5rcztcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGNhY2hlZCBtZXRhZGF0YSBmb3IgYSBnaXZlbiBmaWxlIG9yIHBhdGguXG4gKlxuICogVGhpcyBpcyBOT1QgYSBwdXJlIHJlYWQ6IGJlZm9yZSBpdCByZWFkcyB0aGUgY2FjaGUsIGl0IGNhbGxzIHtAbGluayBzYXZlTm90ZX0sIHdoaWNoIHNhdmVzIGFueVxuICogb3BlbiBlZGl0b3IgdmlldyBvZiB0aGUgbm90ZSB0aGF0IGhhcyB1bnNhdmVkIGNoYW5nZXMuIFRoYXQgc2F2ZSBpcyB3aHkgdGhlIGNhY2hlIG1hdGNoZXMgd2hhdCB0aGVcbiAqIHVzZXIgc2VlcywgYW5kIHdoeSBhIGNvbW1hbmQgdGhhdCByZXdyaXRlcyB0aGUgbm90ZSBjYW4gdXNlIHRoaXMgc2FmZWx5IHdpdGhvdXQgaXRzIHJld3JpdGUgYmVpbmdcbiAqIGNsb2JiZXJlZC4gSXQgaXMgYWxzbyBhIHdyaXRlIG9uIHRoZSBub3RlLiBTbyBkbyBub3QgY2FsbCB0aGlzIGZyb20gYW4gYXV0b21hdGljIHRyaWdnZXIgKGEgdmF1bHRcbiAqIG9yIG1ldGFkYXRhIGV2ZW50LCBhIHNhdmUgb3IgcmVuZGVyIHBhdGNoLCBhIGxheW91dCBob29rKSB0aGF0IG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvIGFjdDogYVxuICogZm9yY2VkIHNhdmUgb25lIHRpY2sgYWZ0ZXIgYW5vdGhlciBwbHVnaW4gaGFzIGRpc3BhdGNoZWQgYSBjaGFuZ2UgaW50byB0aGUgZWRpdG9yIGNhbiBsZWF2ZVxuICogT2JzaWRpYW4ncyBlZGl0b3IgcmVuZGVyaW5nIHN0YWxlIHN0YXRlLiBBIHJlYWQtb25seSBwcm9iZSBvbiB0aGUgbm90ZSdzIGN1cnJlbnQgdGV4dCBzaG91bGQgdXNlXG4gKiB7QGxpbmsgcGFyc2VNZXRhZGF0YX0gb24gdGhhdCB0ZXh0IGluc3RlYWQuIEl0IG5lZWRzIG5vIHZpZXcsIG5vIGNhY2hlIGFuZCBubyBzYXZlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVPclBhdGggLSBUaGUgZmlsZSBvciBwYXRoIHRvIHJldHJpZXZlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG1ldGFkYXRhIGZvciB0aGUgZmlsZSwgb3IgYG51bGxgIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWNoZVNhZmUoYXBwOiBBcHAsIGZpbGVPclBhdGg6IFBhdGhPckZpbGUsIG9wdGlvbnM6IEdldENhY2hlU2FmZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q2FjaGVkTWV0YWRhdGFFeCB8IG51bGw+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHAsIHBhdGhPckZpbGU6IGZpbGVPclBhdGggfSk7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWZpbGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICAgIGlmIChmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBzYXZlTm90ZShhcHAsIGZpbGUpO1xuXG4gICAgICBjb25zdCBmaWxlQ2FjaGVFbnRyeSA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtmaWxlLnBhdGhdO1xuICAgICAgY29uc3QgaXNVcFRvRGF0ZSA9IGZpbGVDYWNoZUVudHJ5Py5tdGltZSA9PT0gZmlsZS5zdGF0Lm10aW1lXG4gICAgICAgICYmIGZpbGVDYWNoZUVudHJ5LnNpemUgPT09IGZpbGUuc3RhdC5zaXplXG4gICAgICAgICYmIE9iamVjdC5oYXNPd24oYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZSwgZmlsZUNhY2hlRW50cnkuaGFzaCk7XG4gICAgICBpZiAoIWlzVXBUb0RhdGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLm1ldGFkYXRhQ2FjaGUuY29tcHV0ZUZpbGVNZXRhZGF0YUFzeW5jKGZpbGUpO1xuICAgICAgICBhd2FpdCBlbnN1cmVNZXRhZGF0YUNhY2hlUmVhZHkoYXBwKTtcbiAgICAgIH1cbiAgICAgIGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0RmlsZUNhY2hlKGZpbGUpO1xuICAgIH1cblxuICAgIGlmIChjYWNoZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gT25seSB0aGUgYm9keS1leHRlcm5hbCBwYXJzZSBuZWVkcyB0aGUgZmlsZSBjb250ZW50OyBmcm9udG1hdHRlciBwYXJzaW5nIHVzZXMgdGhlIGNhY2hlZFxuICAgIC8vIGZyb250bWF0dGVyLCBzbyBhdm9pZCByZWFkaW5nIHRoZSBjb250ZW50IHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuXG4gICAgY29uc3QgY29udGVudCA9IG9wdGlvbnMuc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzID8gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSkgOiAnJztcbiAgICByZXR1cm4gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZyb250IG1hdHRlciBmcm9tIHRoZSBtZXRhZGF0YSBjYWNoZSBzYWZlbHkuXG4gKlxuICogSXQgcmVhZHMgdGhyb3VnaCB7QGxpbmsgZ2V0Q2FjaGVTYWZlfSwgc28gaXQgc2F2ZXMgYW55IG9wZW4gZWRpdG9yIHZpZXcgb2YgdGhlIG5vdGUgdGhhdCBoYXNcbiAqIHVuc2F2ZWQgY2hhbmdlcy4gU2VlIHtAbGluayBnZXRDYWNoZVNhZmV9IGZvciB3aGVuIHRoYXQgc2F2ZSBtYXR0ZXJzIGFuZCB3aGF0IHRvIHVzZSBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiBjdXN0b20gZnJvbnQgbWF0dGVyLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmV0cmlldmUgdGhlIGZyb250IG1hdHRlciBmcm9tLlxuICogQHJldHVybnMgVGhlIGNvbWJpbmVkIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEZyb250bWF0dGVyU2FmZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogUHJvbWlzZTxDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPj4ge1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuICByZXR1cm4gKGNhY2hlPy5mcm9udG1hdHRlciA/PyB7fSkgYXMgQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj47XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzZWxlY3RlZCBsaW5rcyBmcm9tIHRoZSBwcm92aWRlZCBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJldHJpZXZpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVmZXJlbmNlcyByZXByZXNlbnRpbmcgdGhlIHNlbGVjdGVkIGxpbmtzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua3MocGFyYW1zOiBHZXRMaW5rc1BhcmFtcyk6IFJlZmVyZW5jZVtdIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIHNob3VsZEluY2x1ZGVFbWJlZHMgPSB0cnVlLFxuICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID0gdHJ1ZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuXG4gIGxldCBsaW5rczogUmVmZXJlbmNlW10gPSBbXG4gICAgLi4uKHNob3VsZEluY2x1ZGVSZWZlcmVuY2VzID8gY2FjaGUubGlua3MgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVFbWJlZHMgPyBjYWNoZS5lbWJlZHMgPz8gW10gOiBbXSksXG4gICAgLi4uKHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckxpbmtzID8gY2FjaGUuZnJvbnRtYXR0ZXJMaW5rcyA/PyBbXSA6IFtdKVxuICBdO1xuXG4gIGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3JzOiBGZWF0dXJlTGlua1NlbGVjdG9yW10gPSBbXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdib2R5IGV4dGVybmFsIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLkV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmV4dGVybmFsTGlua3MsXG4gICAgICBzaG91bGRJbmNsdWRlOiBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rc1xuICAgIH0sXG4gICAge1xuICAgICAgZGVzY3JpcHRpb246ICdmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcycsXG4gICAgICBmZWF0dXJlOiBDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5Gcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICBzZWxlY3Q6IChjYWNoZUV4KSA9PiBjYWNoZUV4LmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnbXVsdGktdmFsdWUgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MnLFxuICAgICAgZmVhdHVyZTogQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNlbGVjdDogKGNhY2hlRXgpID0+IGNhY2hlRXgubXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfSxcbiAgICB7XG4gICAgICBkZXNjcmlwdGlvbjogJ211bHRpLXZhbHVlIGZyb250bWF0dGVyIGxpbmtzJyxcbiAgICAgIGZlYXR1cmU6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlLk11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzLFxuICAgICAgc2VsZWN0OiAoY2FjaGVFeCkgPT4gY2FjaGVFeC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyxcbiAgICAgIHNob3VsZEluY2x1ZGU6IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rc1xuICAgIH1cbiAgXTtcblxuICBmb3IgKGNvbnN0IGZlYXR1cmVMaW5rU2VsZWN0b3Igb2YgZmVhdHVyZUxpbmtTZWxlY3RvcnMpIHtcbiAgICBpZiAoIWZlYXR1cmVMaW5rU2VsZWN0b3Iuc2hvdWxkSW5jbHVkZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGUpIHx8ICFjYWNoZS5mZWF0dXJlcy5pbmNsdWRlcyhmZWF0dXJlTGlua1NlbGVjdG9yLmZlYXR1cmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbmNsdWRlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5kZXNjcmlwdGlvbn06IHRoZSBjYWNoZSB3YXMgbm90IGNvbXB1dGVkIHdpdGggdGhlICR7ZmVhdHVyZUxpbmtTZWxlY3Rvci5mZWF0dXJlfSBmZWF0dXJlLmApO1xuICAgIH1cblxuICAgIGxpbmtzLnB1c2goLi4uZW5zdXJlTm9uTnVsbGFibGUoZmVhdHVyZUxpbmtTZWxlY3Rvci5zZWxlY3QoY2FjaGUpKSk7XG4gIH1cblxuICBzb3J0UmVmZXJlbmNlcyhsaW5rcyk7XG5cbiAgLy8gQlVHOiBodHRwczovL2ZvcnVtLm9ic2lkaWFuLm1kL3QvYnVnLWR1cGxpY2F0ZWQtbGlua3MtaW4tbWV0YWRhdGFjYWNoZS1pbnNpZGUtZm9vdG5vdGVzLzg1NTUxXG4gIGxpbmtzID0gbGlua3MuZmlsdGVyKChsaW5rLCBpbmRleCkgPT4ge1xuICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXNMaW5rID0gZW5zdXJlTm9uTnVsbGFibGUobGlua3NbaW5kZXggLSAxXSk7XG5cbiAgICBpZiAoaXNSZWZlcmVuY2VDYWNoZShsaW5rKSAmJiBpc1JlZmVyZW5jZUNhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIHJldHVybiBsaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAhPT0gcHJldmlvdXNMaW5rLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDtcbiAgICB9XG5cbiAgICBpZiAoaXNGcm9udG1hdHRlckxpbmtDYWNoZShsaW5rKSAmJiBpc0Zyb250bWF0dGVyTGlua0NhY2hlKHByZXZpb3VzTGluaykpIHtcbiAgICAgIGNvbnN0IGxpbmtTdGFydE9mZnNldCA9IGlzRnJvbnRtYXR0ZXJMaW5rQ2FjaGVXaXRoT2Zmc2V0cyhsaW5rKSA/IGxpbmsuc3RhcnRPZmZzZXQgOiAwO1xuICAgICAgY29uc3QgcHJldmlvdXNMaW5rU3RhcnRPZmZzZXQgPSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKSA/IHByZXZpb3VzTGluay5zdGFydE9mZnNldCA6IDA7XG4gICAgICByZXR1cm4gbGluay5rZXkgIT09IHByZXZpb3VzTGluay5rZXkgfHwgaXNGcm9udG1hdHRlckxpbmtDYWNoZVdpdGhPZmZzZXRzKGxpbmspICE9PSBpc0Zyb250bWF0dGVyTGlua0NhY2hlV2l0aE9mZnNldHMocHJldmlvdXNMaW5rKVxuICAgICAgICB8fCBsaW5rU3RhcnRPZmZzZXQgIT09IHByZXZpb3VzTGlua1N0YXJ0T2Zmc2V0O1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gbGlua3M7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYmFja2xpbmsgY2FjaGUgcGx1Z2luIGlzIGN1cnJlbnRseSBsb2FkZWQgLSBlaXRoZXIgYEFkdmFuY2VkIE1ldGFkYXRhIENhY2hlYCAoe0BsaW5rIEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRH0pIG9yIGl0cyByZXRpcmVkIHByZWRlY2Vzc29yIGBCYWNrbGluayBDYWNoZWAgKHtAbGluayBCQUNLTElOS19DQUNIRV9QTFVHSU5fSUR9KS5cbiAqXG4gKiBTdWNoIGEgcGx1Z2luIGtlZXBzIGEgZHJhaW4tb24tcmVhZCBiYWNrbGluayBpbmRleCBhbmQgaW5kZXhlcyBjYW52YXMgbWV0YWRhdGEsIHNvIGEgY2FsbGVyIHRoYXQgY29tcGVuc2F0ZXMgZm9yIE9ic2lkaWFuJ3Mgb3duIGdhcHMgY2FuIHN0YW5kIGRvd24gd2hpbGUgb25lIGlzIHByZXNlbnQuIEJvdGggaWRzIGFyZSByZWNvZ25pemVkOyB7QGxpbmsgQkFDS0xJTktfQ0FDSEVfUExVR0lOX0lEfSByZWNvcmRzIHdoZW4gdGhlIHJldGlyZWQgb25lIG1heSBiZSBkcm9wcGVkLlxuICpcbiAqIFRoaXMgcmVhZHMgdGhlIExPQURFRCBwbHVnaW4gaW5zdGFuY2UgcmF0aGVyIHRoYW4gYGFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zYCwgZGVsaWJlcmF0ZWx5OiB0aGUgcXVlc3Rpb24gaXMgd2hldGhlciB0aGUgcGx1Z2luJ3MgcGF0Y2hlcyBhcmUgaW4gcGxhY2UgcmlnaHQgbm93LCBhbmQgdGhleSBhcmUgbm90IHVudGlsIGl0IGhhcyBsb2FkZWQuIFBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gY2FsbCB0aGlzIGZyb20gYSB1c2VyLWRyaXZlbiBwYXRoIHJhdGhlciB0aGFuIGZyb20gcGx1Z2luIGxvYWQgLSBzZWUgcnVsZSBMMjUgaW4gYEFHRU5UUy5tZGAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBiYWNrbGluayBjYWNoZSBwbHVnaW4gaXMgbG9hZGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0JhY2tsaW5rQ2FjaGVQbHVnaW4oYXBwOiBBcHApOiBib29sZWFuIHtcbiAgcmV0dXJuIGFwcC5wbHVnaW5zLmdldFBsdWdpbihBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsIHx8IGFwcC5wbHVnaW5zLmdldFBsdWdpbihCQUNLTElOS19DQUNIRV9QTFVHSU5fSUQpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIGNhY2hlIGlzIGEge0BsaW5rIENhY2hlZE1ldGFkYXRhRXh9IChpLmUuIGl0IHdhcyBjb21wdXRlZCB3aXRoIGV4dGVybmFsLWxpbmtcbiAqIHBhcnNpbmcgZW5hYmxlZCkuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIGNhY2hlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjYWNoZSBpcyBhIHtAbGluayBDYWNoZWRNZXRhZGF0YUV4fSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhY2hlZE1ldGFkYXRhRXgoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogY2FjaGUgaXMgQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIHJldHVybiAnZmVhdHVyZXMnIGluIGNhY2hlO1xufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSBmb3IuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJzZSBvcHRpb25zIGNvbnRyb2xsaW5nIHdoaWNoIGFkZGl0aW9uYWwgbGlua3MgdG8gcGFyc2UuXG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIG1ldGFkYXRhLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YShhcHA6IEFwcCwgJHN0cmluZzogc3RyaW5nLCBvcHRpb25zOiBQYXJzZU1ldGFkYXRhT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRNZXRhZGF0YUV4PiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgYnVmZmVyID0gZW5jb2Rlci5lbmNvZGUoJHN0cmluZykuYnVmZmVyO1xuICBjb25zdCBjYWNoZSA9IGF3YWl0IGFwcC5tZXRhZGF0YUNhY2hlLmNvbXB1dGVNZXRhZGF0YUFzeW5jKGJ1ZmZlcikgPz8ge307XG4gIHJldHVybiB0b1BhcnNlZENhY2hlZE1ldGFkYXRhRXgoeyBjYWNoZSwgY29udGVudDogJHN0cmluZywgb3B0aW9ucyB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlcmluZyB0aGUgZmlsZSBjYWNoZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZShwYXJhbXM6IFJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHsgYXBwLCBjYWNoZSwgcGF0aE9yRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBpZiAoIWZpbGUuZGVsZXRlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBleGlzdGluZycpO1xuICB9XG5cbiAgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF0gPSB7XG4gICAgaGFzaDogZmlsZS5wYXRoLFxuICAgIG10aW1lOiAwLFxuICAgIHNpemU6IDBcbiAgfTtcblxuICBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2ZpbGUucGF0aF0gPSBjYWNoZTtcblxuICByZXR1cm4gbmV3IENhbGxiYWNrRGlzcG9zYWJsZSh7XG4gICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgIHVucmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoYXBwLCBmaWxlKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgT2JzaWRpYW4gYXBwLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGZpbGVzIC0gVGhlIGZpbGVzIHRvIHJlZ2lzdGVyLlxuICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgZmlsZXMgd2hlbiBkaXNwb3NlZCwgZm9yIHVzZSB3aXRoIGB1c2luZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckZpbGVzKGFwcDogQXBwLCBmaWxlczogVEFic3RyYWN0RmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gIGNvbnN0IHJlZ2lzdGVyZWRGaWxlc0NvdW50cyA9IGdldFJlZ2lzdGVyZWRGaWxlc0NvdW50cygpO1xuXG4gIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB3aGlsZSAoZmlsZS5kZWxldGVkKSB7XG4gICAgICBsZXQgY291bnQgPSByZWdpc3RlcmVkRmlsZXNDb3VudHMuZ2V0KGZpbGUucGF0aCkgPz8gMDtcbiAgICAgIGNvdW50Kys7XG4gICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuc2V0KGZpbGUucGF0aCwgY291bnQpO1xuXG4gICAgICBhcHAudmF1bHQuZmlsZU1hcFtmaWxlLnBhdGhdID0gZmlsZTtcblxuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICBhcHAubWV0YWRhdGFDYWNoZS51bmlxdWVGaWxlTG9va3VwLmFkZChmaWxlLm5hbWUudG9Mb3dlckNhc2UoKSwgZmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGZpbGUgPSBnZXRGb2xkZXIoe1xuICAgICAgICBhcHAsXG4gICAgICAgIHBhdGhPckZvbGRlcjogcGFyZW50Rm9sZGVyUGF0aChmaWxlLnBhdGgpLFxuICAgICAgICBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICBjYWxsYmFjazogKCk6IHZvaWQgPT4ge1xuICAgICAgdW5yZWdpc3RlckZpbGVzKGFwcCwgZmlsZXMpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVW5yZWdpc3RlcnMgdGhlIGZpbGUgY2FjaGUgZm9yIGEgbm9uLWV4aXN0aW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gdW5yZWdpc3RlciB0aGUgZmlsZSBjYWNoZSBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIGV4aXN0aW5nJyk7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZSAtLSBXZSBoYXZlIG5vIG90aGVyIHdheSB0byBkZWxldGUgdGhlIHByb3BlcnR5LlxuICBkZWxldGUgYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW2ZpbGUucGF0aF07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgZGVsZXRlIGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbZmlsZS5wYXRoXTtcbn1cblxuLyoqXG4gKiBVbnJlZ2lzdGVycyBmaWxlcyBmcm9tIHRoZSBPYnNpZGlhbiBhcHAuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZXMgLSBUaGUgZmlsZXMgdG8gdW5yZWdpc3Rlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJGaWxlcyhhcHA6IEFwcCwgZmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IHZvaWQge1xuICBjb25zdCByZWdpc3RlcmVkRmlsZXNDb3VudHMgPSBnZXRSZWdpc3RlcmVkRmlsZXNDb3VudHMoKTtcblxuICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgd2hpbGUgKGZpbGUuZGVsZXRlZCkge1xuICAgICAgbGV0IGNvdW50ID0gcmVnaXN0ZXJlZEZpbGVzQ291bnRzLmdldChmaWxlLnBhdGgpID8/IDE7XG4gICAgICBjb3VudC0tO1xuICAgICAgcmVnaXN0ZXJlZEZpbGVzQ291bnRzLnNldChmaWxlLnBhdGgsIGNvdW50KTtcbiAgICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlcmVkRmlsZXNDb3VudHMuZGVsZXRlKGZpbGUucGF0aCk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIGFwcC52YXVsdC5maWxlTWFwW2ZpbGUucGF0aF07XG5cbiAgICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICAgIGFwcC5tZXRhZGF0YUNhY2hlLnVuaXF1ZUZpbGVMb29rdXAucmVtb3ZlKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLCBmaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWxlID0gZ2V0Rm9sZGVyKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBwYXRoT3JGb2xkZXI6IHBhcmVudEZvbGRlclBhdGgoZmlsZS5wYXRoKSxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEFkdmFuY2VkTWV0YWRhdGFDYWNoZUJhY2tsaW5rc0FwaSgpOiBBZHZhbmNlZE1ldGFkYXRhQ2FjaGVCYWNrbGlua3NBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8QWR2YW5jZWRNZXRhZGF0YUNhY2hlQmFja2xpbmtzQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBBRFZBTkNFRF9NRVRBREFUQV9DQUNIRV9CQUNLTElOS1NfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX0JBQ0tMSU5LU19BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IEFEVkFOQ0VEX01FVEFEQVRBX0NBQ0hFX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZEZpbGVzQ291bnRzKCk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZWdpc3RlcmVkRmlsZXNDb3VudHMnLCBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsbHkgcmVjb2duaXplcyB0aGUgYmFja2xpbmtzIGRpY3Rpb25hcnkgYW5vdGhlciBwbHVnaW4ncyBjb3B5IGJ1aWx0LCBvciBgbnVsbGAuIFRoZSBjbGFzcyBpdCB3YXMgYnVpbHQgZnJvbSBsaXZlcyBpbiB0aGF0IGNvcHksIHNvIGBpbnN0YW5jZW9mYCBjYW5ub3QgYmUgdXNlZCAocnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIHJlYWRzIGFzIGEgYmFja2xpbmtzIGRpY3Rpb25hcnkuXG4gKi9cbmZ1bmN0aW9uIGlzTnVsbGFibGVCYWNrbGlua3NEaWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4gfCBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsXG4gICAgfHwgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgICYmIFJlZmxlY3QuZ2V0KHZhbHVlLCAnZGF0YScpIGluc3RhbmNlb2YgTWFwXG4gICAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdnZXQnKSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAna2V5cycpID09PSAnZnVuY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFeHRlcm5hbEJvZHlMaW5rcyhjb250ZW50OiBzdHJpbmcsIGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IFBhcnNlTGlua1JlZmVyZW5jZVtdIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXJFbmRPZmZzZXQgPSBjYWNoZS5mcm9udG1hdHRlclBvc2l0aW9uPy5lbmQub2Zmc2V0ID8/IDA7XG4gIHJldHVybiBwYXJzZUxpbmtzKGNvbnRlbnQpXG4gICAgLmZpbHRlcigocGFyc2VMaW5rUmVzdWx0KSA9PiBwYXJzZUxpbmtSZXN1bHQuaXNFeHRlcm5hbCAmJiBwYXJzZUxpbmtSZXN1bHQuc3RhcnRPZmZzZXQgPj0gZnJvbnRtYXR0ZXJFbmRPZmZzZXQpXG4gICAgLm1hcCgocGFyc2VMaW5rUmVzdWx0KSA9PiB0b1BhcnNlTGlua1JlZmVyZW5jZSh7IGNvbnRlbnQsIHBhcnNlTGlua1Jlc3VsdCB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnJvbnRtYXR0ZXJPck51bGwoY29udGVudDogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBDb21iaW5lZEZyb250bWF0dGVyPHVua25vd24+IHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEZyb250bWF0dGVyIHBhcnNpbmcgZmFpbGVkIGluICR7cGF0aH1gLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4KHBhcmFtczogVG9QYXJzZWRDYWNoZWRNZXRhZGF0YUV4UGFyYW1zKTogQ2FjaGVkTWV0YWRhdGFFeCB7XG4gIGNvbnN0IHsgY2FjaGUsIGNvbnRlbnQsIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgZmVhdHVyZXM6IENhY2hlZE1ldGFkYXRhRXhGZWF0dXJlW10gPSBbQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuTmF0aXZlXTtcbiAgY29uc3QgcmVzdWx0OiBDYWNoZWRNZXRhZGF0YUV4ID0geyAuLi5jYWNoZSwgZmVhdHVyZXMgfTtcblxuICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZUV4dGVybmFsTGlua3MpIHtcbiAgICByZXN1bHQuZXh0ZXJuYWxMaW5rcyA9IHBhcnNlRXh0ZXJuYWxCb2R5TGlua3MoY29udGVudCwgY2FjaGUpO1xuICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRXh0ZXJuYWxMaW5rcyk7XG4gIH1cblxuICBpZiAoXG4gICAgb3B0aW9ucy5zaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgIHx8IG9wdGlvbnMuc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgfHwgb3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzXG4gICkge1xuICAgIGNvbnN0IGZyb250bWF0dGVyTGlua3MgPSBwYXJzZUZyb250bWF0dGVyTGlua3MoY2FjaGUuZnJvbnRtYXR0ZXIpO1xuXG4gICAgaWYgKG9wdGlvbnMuc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5mcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLmZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcztcbiAgICAgIGZlYXR1cmVzLnB1c2goQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUuRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MpIHtcbiAgICAgIHJlc3VsdC5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZnJvbnRtYXR0ZXJMaW5rcy5tdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5zaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzKSB7XG4gICAgICByZXN1bHQubXVsdGlWYWx1ZUZyb250bWF0dGVyTGlua3MgPSBmcm9udG1hdHRlckxpbmtzLm11bHRpVmFsdWVGcm9udG1hdHRlckxpbmtzO1xuICAgICAgZmVhdHVyZXMucHVzaChDYWNoZWRNZXRhZGF0YUV4RmVhdHVyZS5NdWx0aVZhbHVlRnJvbnRtYXR0ZXJMaW5rcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7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RDtBQUFBLElBQ3RELGlCQUFpQjtBQUFBLElBQ2pCLFVBQVU7QUFBQSxJQUNWLFVBQVU7QUFBQSxFQUNaLENBQUM7QUFDSDtBQUVBLFNBQVMsMkJBQWdEO0FBQ3ZELFNBQU8seUJBQXlCLHlCQUF5QixvQkFBSSxJQUFvQixDQUFDLEVBQUU7QUFDdEY7QUFRQSxTQUFTLHdCQUF3QixPQUE0RDtBQUMzRixTQUFPLFVBQVUsUUFDWCxPQUFPLFVBQVUsWUFDaEIsUUFBUSxJQUFJLE9BQU8sTUFBTSxhQUFhLE9BQ3RDLE9BQU8sUUFBUSxJQUFJLE9BQU8sS0FBSyxNQUFNLGNBQ3JDLE9BQU8sUUFBUSxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQy9DO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsT0FBNkM7QUFDNUYsUUFBTSx1QkFBdUIsTUFBTSxxQkFBcUIsSUFBSSxVQUFVO0FBQ3RFLFNBQU8sV0FBVyxPQUFPLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsZ0JBQWdCLGNBQWMsZ0JBQWdCLGVBQWUsb0JBQW9CLEVBQzdHLElBQUksQ0FBQyxvQkFBb0IscUJBQXFCLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ2hGO0FBRUEsU0FBUyx1QkFBdUIsU0FBaUIsTUFBbUQ7QUFDbEcsTUFBSTtBQUNGLFdBQU8saUJBQWlCLE9BQU87QUFBQSxFQUNqQyxTQUFTLE9BQU87QUFDZCxlQUFXLElBQUksTUFBTSxpQ0FBaUMsSUFBSSxJQUFJLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMvRSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRUEsU0FBUyx5QkFBeUIsUUFBMEQ7QUFDMUYsUUFBTSxFQUFFLE9BQU8sU0FBUyxRQUFRLElBQUk7QUFDcEMsUUFBTSxXQUFzQyxDQUFDLHFCQUE4QjtBQUMzRSxRQUFNLFNBQTJCLEVBQUUsR0FBRyxPQUFPLFNBQVM7QUFFdEQsTUFBSSxRQUFRLDBCQUEwQjtBQUNwQyxXQUFPLGdCQUFnQix1QkFBdUIsU0FBUyxLQUFLO0FBQzVELGFBQVMsS0FBSyxtQ0FBcUM7QUFBQSxFQUNyRDtBQUVBLE1BQ0UsUUFBUSx1Q0FDTCxRQUFRLGlEQUNSLFFBQVEsdUNBQ1g7QUFDQSxVQUFNLG1CQUFtQixzQkFBc0IsTUFBTSxXQUFXO0FBRWhFLFFBQUksUUFBUSxxQ0FBcUM7QUFDL0MsYUFBTywyQkFBMkIsaUJBQWlCO0FBQ25ELGVBQVMsS0FBSyx5REFBZ0Q7QUFBQSxJQUNoRTtBQUVBLFFBQUksUUFBUSwrQ0FBK0M7QUFDekQsYUFBTyxxQ0FBcUMsaUJBQWlCO0FBQzdELGVBQVMsS0FBSyw2RUFBMEQ7QUFBQSxJQUMxRTtBQUVBLFFBQUksUUFBUSx1Q0FBdUM7QUFDakQsYUFBTyw2QkFBNkIsaUJBQWlCO0FBQ3JELGVBQVMsS0FBSyw2REFBa0Q7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7IiwibmFtZXMiOlsiQ2FjaGVkTWV0YWRhdGFFeEZlYXR1cmUiXX0=
@@ -27,7 +27,7 @@
27
27
  * The wrapper reuses the modal's own title (`titleEl`) as the minimized bar label, so set the title
28
28
  * the usual way (`modal.setTitle(...)`). Render arbitrary content into {@link Modal.contentEl},
29
29
  * including clickable note links produced by `renderInternalLink` from
30
- * `obsidian-dev-utils/obsidian/markdown`:
30
+ * `@mnaoumov/obsidian-lib/markdown`:
31
31
  *
32
32
  * ```ts
33
33
  * const modal = new MyModal(app);
@@ -336,4 +336,4 @@ function suppressWhilePeekLocked($event) {
336
336
  export {
337
337
  MinimizableModal
338
338
  };
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvbWluaW1pemFibGUtbW9kYWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIOKAlCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCDigKYg4oCUIGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiAoYW5kLCBieSBkZWZhdWx0LCBhIENhbmNlbCBidXR0b24gdGhhdCBjbG9zZXMgdGhlIHdyYXBwZWRcbiAqIG1vZGFsIOKAlCBwYXNzIGB7IHNob3VsZFNob3dDYW5jZWxCdXR0b246IGZhbHNlIH1gIHRvIGhpZGUgaXQpLCBzbyB0aGUgdXNlciBjYW4gcGVlayBhdCB0aGVcbiAqIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvbiBpbnZvbHZlcyDigJQgYnV0IHRoZSBtb2RhbCBpcyBOT1QgZGlzbWlzc2VkLCBzbyBpdHMgYmxvY2tpbmcgY29udHJhY3QgbXVzdCBiZSBwcmVzZXJ2ZWQuXG4gKlxuICogVG8ga2VlcCB0aGF0IGNvbnRyYWN0IHdoaWxlIG1pbmltaXplZCwgdGhlIHdyYXBwZXIgcHV0cyB0aGUgYXBwIGludG8gYSAqKnBlZWstb25seSBsb2NrKio6IHRoZSB1c2VyXG4gKiBtYXkgbW91c2UtY2xpY2sgYW5kIHNjcm9sbCB0byBpbnNwZWN0IGNvbnRlbnQsIGJ1dCBjYW5ub3Qgc3RhcnQgYW55dGhpbmcgbmV3LiBXaGlsZSBhbnkgbW9kYWwgaXNcbiAqIG1pbmltaXplZCB0aGUgd3JhcHBlcjpcbiAqIC0gYmxvY2tzIHRoZSBrZXlib2FyZCAodHlwaW5nLCBob3RrZXlzLCB0aGUgY29tbWFuZC1wYWxldHRlIHNob3J0Y3V0KSxcbiAqIC0gYmxvY2tzIHRoZSByaWdodC1jbGljayBjb250ZXh0IG1lbnUsIGFuZFxuICogLSBibG9ja3Mgb3BlbmluZyBhbnkgb3RoZXIgbW9kYWwgKGEgcmUtZmlyZWQgY29tbWFuZCwgdGhlIGNvbW1hbmQgcGFsZXR0ZSwgc2V0dGluZ3MsIOKApikuXG4gKlxuICogQSBibG9ja2VkIGF0dGVtcHQgZmxhc2hlcyB0aGUgZmxvYXRpbmcgYmFyIGFuZCBiZWVwcyBzbyB0aGUgdXNlciBzZWVzIChhbmQgaGVhcnMpIHdoeSBub3RoaW5nXG4gKiBoYXBwZW5lZC4gUmVzdG9yaW5nIChvciB0aGUgbW9kYWwgY2xvc2luZykgbGlmdHMgdGhlIGxvY2suIFRoaXMgcHJldmVudHMsIGZvciBleGFtcGxlLCBtaW5pbWl6aW5nIGFcbiAqIFwibWVyZ2UgZm9sZGVyXCIgcGlja2VyIGFuZCB0aGVuIGZpcmluZyB0aGUgc2FtZSBjb21tYW5kIGFnYWluIHRvIHN0YWNrIHNldmVyYWwgY29uY3VycmVudCBtZXJnZXMuXG4gKlxuICogVGhlIHdyYXBwZXIgcmV1c2VzIHRoZSBtb2RhbCdzIG93biB0aXRsZSAoYHRpdGxlRWxgKSBhcyB0aGUgbWluaW1pemVkIGJhciBsYWJlbCwgc28gc2V0IHRoZSB0aXRsZVxuICogdGhlIHVzdWFsIHdheSAoYG1vZGFsLnNldFRpdGxlKC4uLilgKS4gUmVuZGVyIGFyYml0cmFyeSBjb250ZW50IGludG8ge0BsaW5rIE1vZGFsLmNvbnRlbnRFbH0sXG4gKiBpbmNsdWRpbmcgY2xpY2thYmxlIG5vdGUgbGlua3MgcHJvZHVjZWQgYnkgYHJlbmRlckludGVybmFsTGlua2AgZnJvbVxuICogYG9ic2lkaWFuLWRldi11dGlscy9vYnNpZGlhbi9tYXJrZG93bmA6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG1vZGFsID0gbmV3IE15TW9kYWwoYXBwKTtcbiAqIG1vZGFsLnNldFRpdGxlKCdNZXJnaW5nIG5vdGVzJyk7XG4gKiBtb2RhbC5jb250ZW50RWwuYXBwZW5kQ2hpbGQoYXdhaXQgcmVuZGVySW50ZXJuYWxMaW5rKHsgYXBwLCBwYXRoT3JBYnN0cmFjdEZpbGU6IGZpbGUgfSkpO1xuICpcbiAqIGNvbnN0IG1pbmltaXphYmxlID0gbmV3IE1pbmltaXphYmxlTW9kYWwobW9kYWwpO1xuICogbWluaW1pemFibGUubW9kYWwub3BlbigpO1xuICogbWluaW1pemFibGUubWluaW1pemUoKTsgLy8gYSBmbG9hdGluZyBiYXIgb2ZmZXJzIFwicmVzdG9yZVwiOyB0aGUgYXBwIGlzIHBlZWstb25seSB1bnRpbCByZXN0b3JlZFxuICogYGBgXG4gKlxuICogVGhlIHdyYXBwZWQgbW9kYWwgY2FuIHN0aWxsIGJlIGNsb3NlZCBub3JtYWxseTsgdGhlIGZsb2F0aW5nIGJhciBpcyBjbGVhbmVkIHVwIGF1dG9tYXRpY2FsbHkgd2hlblxuICogdGhlIG1vZGFsIGNsb3NlcyAoZXZlbiBpZiBpdCBpcyBjbG9zZWQgd2hpbGUgbWluaW1pemVkKS5cbiAqXG4gKiBDbGlja2luZyB0aGUgZGltbWVkIGJhY2tncm91bmQgYmVoaW5kIHRoZSBtb2RhbCAqKm1pbmltaXplcyoqIGl0IHJhdGhlciB0aGFuIGNsb3NpbmcgaXQsIHNvIGEgc3RyYXlcbiAqIGNsaWNrIHBhc3QgdGhlIGRpYWxvZyBubyBsb25nZXIgY2FuY2VscyB0aGUgb3BlcmF0aW9uIHRoZSBtb2RhbCBpcyBydW5uaW5nIOKAlCBwYXNzXG4gKiBgeyBzaG91bGRNaW5pbWl6ZU9uQ2xpY2tPdXRzaWRlOiBmYWxzZSB9YCB0byBrZWVwIE9ic2lkaWFuJ3MgbmF0aXZlIGNsb3NlLW9uLWJhY2tncm91bmQtY2xpY2suXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9iZWVwZXInO1xuaW1wb3J0IHtcbiAgTW9kYWwsXG4gIHNldEljb24sXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG5jb25zdCBNSU5JTUlaRV9JQ09OX0lEID0gJ21pbnVzJztcbmNvbnN0IFJFU1RPUkVfSUNPTl9JRCA9ICdtYXhpbWl6ZS0yJztcbmNvbnN0IENBTkNFTF9JQ09OX0lEID0gJ3gnO1xuXG4vLyBOYXZpZ2F0aW9uIGtleXMgcGFzcyB0aHJvdWdoIHdoaWxlIG1pbmltaXplZCBzbyB0aGUgdXNlciBjYW4gbW92ZSB0aGUgY3Vyc29yIGFuZCBzY3JvbGwgdG8gcmVhZC5cbi8vIE5vbmUgb2YgdGhlbSBtdXRhdGUgdGhlIGRvY3VtZW50IOKAlCB0ZXh0IGNoYW5nZXMgYXJlIGNhdWdodCBzZXBhcmF0ZWx5IGJ5IHRoZSBgYmVmb3JlaW5wdXRgIGd1YXJkLlxuLy8gU2hpZnQrbmF2aWdhdGlvbiBpcyBibG9ja2VkLCB0aG91Z2gsIHNpbmNlIGl0IGV4dGVuZHMgdGhlIHNlbGVjdGlvbiB0aGF0IGluc3BlY3Rpb24gZG9lcyBub3QgbmVlZC5cbmNvbnN0IE5BVklHQVRJT05fS0VZUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdBcnJvd0Rvd24nLFxuICAnQXJyb3dMZWZ0JyxcbiAgJ0Fycm93UmlnaHQnLFxuICAnQXJyb3dVcCcsXG4gICdFbmQnLFxuICAnSG9tZScsXG4gICdQYWdlRG93bicsXG4gICdQYWdlVXAnXG5dKTtcblxuLy8gQSBiYXJlIG1vZGlmaWVyIHByZXNzIGRvZXMgbm90aGluZyBvbiBpdHMgb3duLCBzbyBpdCBwYXNzZXMgdGhyb3VnaCB0aGUgbG9jay5cbi8vIFRoaXMgYXZvaWRzIGEgc3B1cmlvdXMgZmxhc2gvYmVlcCB3aGlsZSBjb21wb3NpbmcgYSBzaG9ydGN1dDsgdGhlIHNob3J0Y3V0J3MgY29tbWFuZCBrZXkgaXMgYmxvY2tlZC5cbmNvbnN0IE1PRElGSUVSX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQWx0JyxcbiAgJ0NvbnRyb2wnLFxuICAnTWV0YScsXG4gICdTaGlmdCdcbl0pO1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBlbnRyeSBmb3IgYSBjdXJyZW50bHktbWluaW1pemVkIG1vZGFsLiBUaGUgc2hhcmVkIHBlZWstb25seSBsb2NrIHVzZXMgaXQgdG8ga25vdyBhXG4gKiBtb2RhbCBpcyBtaW5pbWl6ZWQsIHRvIGxlYXZlIHRoYXQgbW9kYWwncyBvd24gcmUtb3BlbnMgYWxvbmUsIGFuZCB0byBmbGFzaCBpdHMgYmFyIG9uIGEgYmxvY2tlZFxuICogYXR0ZW1wdC5cbiAqL1xuaW50ZXJmYWNlIFBlZWtMb2NrRW50cnkge1xuICAvKipcbiAgICogVGhlIGZsb2F0aW5nIGJhciBlbGVtZW50LiBVc2VkIHRvIGRldGVjdCBhIHN0YWxlIGVudHJ5IChpdHMgYmFyIGhhcyBsZWZ0IHRoZSBET00pIHNvIGl0IGNhbiBiZVxuICAgKiBwcnVuZWQgYW5kIG5ldmVyIGtlZXAgdGhlIGFwcCBsb2NrZWQuXG4gICAqL1xuICByZWFkb25seSBiYXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciB0byBzaWduYWwgYSBibG9ja2VkIGF0dGVtcHQuXG4gICAqL1xuICBmbGFzaDogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwgaW5zdGFuY2UsIHNvIGl0cyBvd24gYG9wZW4oKWAgaXMgbmV2ZXIgYmxvY2tlZCBieSB0aGUgbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGlubmVyTW9kYWw6IE1vZGFsO1xufVxuXG5jb25zdCBwZWVrTG9ja0VudHJpZXMgPSBuZXcgU2V0PFBlZWtMb2NrRW50cnk+KCk7XG5jb25zdCBiZWVwZXIgPSBuZXcgQmVlcGVyKCk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uc3RydWN0aW5nIGEge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1pbmltaXphYmxlTW9kYWxDb25zdHJ1Y3Rvck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBjbGlja2luZyB0aGUgZGltbWVkIGJhY2tncm91bmQgYmVoaW5kIHRoZSBtb2RhbCBtaW5pbWl6ZXMgaXQgaW5zdGVhZCBvZiBjbG9zaW5nIGl0LlxuICAgKiBPYnNpZGlhbidzIG5hdGl2ZSBiZWhhdmlvciBpcyB0byBjbG9zZSwgd2hpY2ggY2FuY2VscyB3aGF0ZXZlciBvcGVyYXRpb24gdGhlIG1vZGFsIGlzIHJ1bm5pbmc7XG4gICAqIG1pbmltaXppbmcga2VlcHMgdGhhdCBvcGVyYXRpb24gYWxpdmUgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIGludm9sdmVkIG5vdGVzIGFuZCBjb21lIGJhY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1pbmltaXplZCBiYXIgc2hvd3MgYSBDYW5jZWwgYnV0dG9uIHRoYXQgY2xvc2VzIHRoZSB3cmFwcGVkIG1vZGFsLiBDbG9zaW5nIGxldHMgdGhlXG4gICAqIHdyYXBwZWQgbW9kYWwncyBvd24gYG9uQ2xvc2VgIGRlZmluZSB3aGF0IFwiY2FuY2VsXCIgbWVhbnMgKGUuZy4gcmVsZWFzaW5nIGEgaGVsZCBsb2NrKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTaG93Q2FuY2VsQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgcGVlay1vbmx5IGxvY2sncyBgb3BlbmAgcGF0Y2hlcyB3aGlsZSBhdCBsZWFzdCBvbmUgbW9kYWwgaXMgbWluaW1pemVkLiBCZWluZyBhXG4gKiB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgYm90aCBwYXRjaGVzIGFyZSB0b3JuIGRvd24gYXV0b21hdGljYWxseSBvbiBgdW5sb2FkYCwgc28gdGhleSBleGlzdFxuICogb25seSB3aGlsZSB0aGUgbG9jayBpcyBhY3RpdmUuIEEgbWluaW1pemVkIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgYWx3YXlzIGFsbG93ZWQgKHNlZVxuICoge0BsaW5rIHNob3VsZEJsb2NrT3Blbn0pOyBldmVyeSBvdGhlciBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgYW5kIHNpZ25hbHMgYSBmbGFzaCArIGJlZXAuXG4gKi9cbmNsYXNzIFBlZWtMb2NrQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwIHdob3NlIHNldHRpbmdzIG1vZGFsIGlzIGd1YXJkZWQgYW5kIHdob3NlIHdpbmRvd3Mgc3VwcHJlc3MgaW5wdXQgd2hpbGUgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIHRoZSBpbnB1dCBzdXBwcmVzc29ycy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICAvLyBCbG9jayBvcGVuaW5nIGFueSBPVEhFUiBtb2RhbCB3aGlsZSBhIG1vZGFsIGlzIG1pbmltaXplZCAodGhlIGNvbW1hbmQgcGFsZXR0ZSwgYSByZS1maXJlZFxuICAgIC8vIGNvbW1hbmQsIGFub3RoZXIgcGx1Z2luIG1vZGFsLCDigKYpLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29wZW4nPih7XG4gICAgICAkb2JqZWN0OiBNb2RhbC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnb3BlbicsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbFRoaXMgfSk6IHZvaWQgPT4ge1xuICAgICAgICBibG9ja09yRmFsbGJhY2sob3JpZ2luYWxUaGlzLCBmYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBPYnNpZGlhbidzIFNldHRpbmdzIGlzIGEgKnBvcG91dCogbW9kYWw6IG9uIGRlc2t0b3AgaXRzIG93biBgb3BlbigpYCBmaXJzdCBjcmVhdGVzIGEgc2VwYXJhdGUgT1NcbiAgICAvLyB3aW5kb3cgKHZpYSBgc2hvdWxkVXNlUG9wb3V0KClgL2BnZXRQb3BvdXRPcHRpb25zKClgKSBhbmQgb25seSBUSEVOIGRlbGVnYXRlcyB0b1xuICAgIC8vIGBNb2RhbC5wcm90b3R5cGUub3BlbmAgdG8gcmVuZGVyIHRoZSBhY3RpdmUgdGFiIGludG8gaXQuIEd1YXJkaW5nIG9ubHkgYE1vZGFsLnByb3RvdHlwZS5vcGVuYFxuICAgIC8vIHRoZXJlZm9yZSBibG9ja3MgdGhlIHJlbmRlciBidXQgbGVhdmVzIGFuIGVtcHR5IHNldHRpbmdzIHdpbmRvdyBiZWhpbmQg4oCUIHRoZSByZXBvcnRlZCBiYWQgVVguXG4gICAgLy8gR3VhcmRpbmcgdGhlIHNldHRpbmdzIG1vZGFsJ3Mgb3duIGBvcGVuKClgIGJsb2NrcyBpdCAqYmVmb3JlKiB0aGUgd2luZG93IGlzIGNyZWF0ZWQuXG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEFwcFsnc2V0dGluZyddLCAnb3Blbic+KHtcbiAgICAgICRvYmplY3Q6IHRoaXMuYXBwLnNldHRpbmcsXG4gICAgICBtZXRob2ROYW1lOiAnb3BlbicsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbFRoaXMgfSk6IHZvaWQgPT4ge1xuICAgICAgICBibG9ja09yRmFsbGJhY2sob3JpZ2luYWxUaGlzLCBmYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdXBwcmVzcyB0aGUga2V5Ym9hcmQsIGVkaXRvciBtdXRhdGlvbiwgYW5kIHRoZSBjb250ZXh0IG1lbnUgYWNyb3NzIEFMTCB3aW5kb3dzIOKAlCB0aGUgbWFpbiB3aW5kb3dcbiAgICAvLyBhbmQgZXZlcnkgZXhpc3RpbmcvZnV0dXJlIHBvcG91dCDigJQgc28gdGhlIGxvY2sgaG9sZHMgd2hlcmV2ZXIgdGhlIHVzZXIncyBmb2N1cyBpcywgbm90IG9ubHkgaW5cbiAgICAvLyB0aGUgd2luZG93IHRoYXQgb3ducyB0aGUgbWluaW1pemVkIG1vZGFsLiBDYXB0dXJlLXBoYXNlIGxpc3RlbmVycyBydW4gYmVmb3JlIE9ic2lkaWFuJ3Mgb3duXG4gICAgLy8gZG9jdW1lbnQvZWxlbWVudCBoYW5kbGVycyAoaW5jbHVkaW5nIENvZGVNaXJyb3IncyksIHNvIGBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKWAgaW4gdGhlXG4gICAgLy8gc3VwcHJlc3NvcnMga2VlcHMgYSBibG9ja2VkIGV2ZW50IGZyb20gZXZlciByZWFjaGluZyB0aGVtLiBga2V5ZG93bmAgbGV0cyBuYXZpZ2F0aW9uIGtleXMgdGhyb3VnaFxuICAgIC8vIChzZWUgYGlzUGVla0FsbG93ZWRLZXlgKSBidXQgYmxvY2tzIGNvbW1hbmQgaG90a2V5czsgYGJlZm9yZWlucHV0YCBibG9ja3MgYWxsIGVkaXRvciBtdXRhdGlvbjtcbiAgICAvLyBgY29udGV4dG1lbnVgIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgbWVudS5cbiAgICBjb25zdCBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQodGhpcy5hcHApKTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzS2V5ZG93bldoaWxlUGVla0xvY2tlZCxcbiAgICAgIG9wdGlvbnM6IHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgdHlwZTogJ2tleWRvd24nXG4gICAgfSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc1doaWxlUGVla0xvY2tlZCxcbiAgICAgIG9wdGlvbnM6IHsgY2FwdHVyZTogdHJ1ZSB9LFxuICAgICAgdHlwZTogJ2JlZm9yZWlucHV0J1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdjb250ZXh0bWVudSdcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBzIGEge0BsaW5rIE1vZGFsfSBpbnN0YW5jZSB0byBtYWtlIGl0IG1pbmltaXphYmxlIHRvIGEgc21hbGwgZmxvYXRpbmcgYmFyIGFuZCByZXN0b3JhYmxlLiBXaGlsZVxuICogbWluaW1pemVkIHRoZSBhcHAgaXMgcHV0IGludG8gYSBwZWVrLW9ubHkgbG9jayAoa2V5Ym9hcmQsIGNvbnRleHQgbWVudSwgYW5kIG9wZW5pbmcgb3RoZXIgbW9kYWxzIGFyZVxuICogYmxvY2tlZCkgc28gdGhlIG1vZGFsJ3MgYmxvY2tpbmcgY29udHJhY3QgaXMgcHJlc2VydmVkLlxuICpcbiAqIEB0eXBlUGFyYW0gVE1vZGFsIC0gVGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgbW9kYWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pbWl6YWJsZU1vZGFsPFRNb2RhbCBleHRlbmRzIE1vZGFsPiB7XG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbC4gT3BlbiwgY2xvc2UsIGFuZCBwb3B1bGF0ZSBpdCBhcyB1c3VhbCAoZS5nLiBgbWluaW1pemFibGUubW9kYWwub3BlbigpYCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kYWw6IFRNb2RhbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtb2RhbCBpcyBjdXJyZW50bHkgbWluaW1pemVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNNaW5pbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIHRoZSB3cmFwcGVkIG1vZGFsJ3MgYG9uQ2xvc2VgIHRvIHJ1biBjbGVhbnVwLiBQZXJzaXN0cyBmb3IgdGhlIHdyYXBwZXIncyB3aG9sZSBsaWZlIChhXG4gICAqIG1vZGFsIGNhbiBiZSByZW9wZW5lZCwgc28gdGhlIHBhdGNoIG11c3Qgc3Vydml2ZSBlYWNoIGNsb3NlKSwgaGVuY2UgYSBkZWRpY2F0ZWQgY29tcG9uZW50IHRoYXQgaXNcbiAgICogbmV2ZXIgdW5sb2FkZWQg4oCUIGRpc3RpbmN0IGZyb20gYHBlZWtMb2NrQ29tcG9uZW50YCwgd2hvc2UgcGF0Y2hlcyBsaXZlIG9ubHkgd2hpbGUgbWluaW1pemVkLlxuICAgKiBFeHBvc2VkIHRvIHN1YmNsYXNzZXMgc28gdGhleSBjYW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBsaWZldGltZS1zY29wZWQgcGF0Y2hlcyBvbiB0aGUgd3JhcHBlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBjbG9zZVBhdGNoQ29tcG9uZW50ID0gbmV3IE1vbmtleUFyb3VuZENvbXBvbmVudCgpO1xuXG4gIHByaXZhdGUgaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltaXplQnV0dG9uRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIG1pbmltaXplZEJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrQ29tcG9uZW50OiBudWxsIHwgUGVla0xvY2tDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrRW50cnk6IG51bGwgfCBQZWVrTG9ja0VudHJ5ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRNaW5pbWl6ZU9uQ2xpY2tPdXRzaWRlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZFNob3dDYW5jZWxCdXR0b246IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdyYXBzIHRoZSBnaXZlbiBtb2RhbCwgYWRkaW5nIGEgbWluaW1pemUgYnV0dG9uIGFuZCB3aXJpbmcgdXAgY2xlYW51cCBvbiBjbG9zZS5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIG1vZGFsIGluc3RhbmNlIHRvIG1ha2UgbWluaW1pemFibGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBjb250cm9sbGluZyB0aGUgbWluaW1pemVkIGJhci4gU2VlIHtAbGluayBNaW5pbWl6YWJsZU1vZGFsQ29uc3RydWN0b3JPcHRpb25zfS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RhbDogVE1vZGFsLCBvcHRpb25zOiBNaW5pbWl6YWJsZU1vZGFsQ29uc3RydWN0b3JPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm1vZGFsID0gbW9kYWw7XG4gICAgdGhpcy5zaG91bGRNaW5pbWl6ZU9uQ2xpY2tPdXRzaWRlID0gb3B0aW9ucy5zaG91bGRNaW5pbWl6ZU9uQ2xpY2tPdXRzaWRlID8/IHRydWU7XG4gICAgdGhpcy5zaG91bGRTaG93Q2FuY2VsQnV0dG9uID0gb3B0aW9ucy5zaG91bGRTaG93Q2FuY2VsQnV0dG9uID8/IHRydWU7XG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyhtb2RhbC5jb250YWluZXJFbCwgW0Nzc0NsYXNzLk1pbmltaXphYmxlTW9kYWxdKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplQnV0dG9uKCk7XG4gICAgaWYgKHRoaXMuc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZSkge1xuICAgICAgLy8gT2JzaWRpYW4gZGlzbWlzc2VzIGEgbW9kYWwgZnJvbSBhIGxpc3RlbmVyIGl0IHJlZ2lzdGVycyBvbiBgYmdFbGAgSU4gVEhFIGBNb2RhbGAgQ09OU1RSVUNUT1Ig4oCUXG4gICAgICAvLyBvbiBtYWNPUyBkZXNrdG9wIHRoYXQgbGlzdGVuZXIgY2FsbHMgYGNsb3NlKClgIGRpcmVjdGx5IChubyBvdmVycmlkYWJsZSBtZXRob2QsIG5vXG4gICAgICAvLyBgZGVmYXVsdFByZXZlbnRlZGAgZ3VhcmQpLCBzbyBuZWl0aGVyIG92ZXJyaWRpbmcgYG9uQ2xpY2tPdXRzaWRlYCBub3IgYHByZXZlbnREZWZhdWx0KClgIGFsb25lIGNhblxuICAgICAgLy8gc3RvcCBpdC4gQXQgdGhlIHRhcmdldCBwaGFzZSB0aGUgRE9NIGludm9rZXMgbGlzdGVuZXJzIGluIHJlZ2lzdHJhdGlvbiBvcmRlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgICAgLy8gY2FwdHVyZSBmbGFnLCBhbmQgT2JzaWRpYW4gcmVnaXN0ZXJlZCBmaXJzdCwgc28gdGhlIG9ubHkgd2F5IHRvIHJ1biBlYXJsaWVyIGlzIHRvIGNhcHR1cmUgb24gdGhlXG4gICAgICAvLyBQQVJFTlQgZWxlbWVudC4gSGVuY2U6IGNhcHR1cmUtcGhhc2UgYGNsaWNrYCBvbiBgY29udGFpbmVyRWxgLlxuICAgICAgbW9kYWwuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29udGFpbmVyQ2xpY2soJGV2ZW50KTtcbiAgICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgdGhpcy5jbG9zZVBhdGNoQ29tcG9uZW50LmxvYWQoKTtcbiAgICB0aGlzLnBhdGNoT25DbG9zZShtb2RhbCk7XG4gIH1cblxuICAvKipcbiAgICogTWluaW1pemVzIHRoZSBtb2RhbDogaGlkZXMgdGhlIG1vZGFsIGFuZCBpdHMgYmFja2Ryb3AsIHNob3dzIGEgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbixcbiAgICogYW5kIHB1dHMgdGhlIGFwcCBpbnRvIHRoZSBwZWVrLW9ubHkgbG9jay4gQSBuby1vcCBpZiB0aGUgbW9kYWwgaXMgYWxyZWFkeSBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgbWluaW1pemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLmhpZGUoKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLmhpZGUoKTtcbiAgICAvLyBUaGUgbW9kYWwgc3RheXMgb3BlbiB3aGlsZSBtaW5pbWl6ZWQsIHNvIGl0cyBrZXltYXAgc2NvcGUgaXMgcG9wcGVkIHRvIHJlbGVhc2UgdGhlIGZvY3VzIHRyYXAuXG4gICAgLy8gUmVzdG9yaW5nIHJlLXB1c2hlcyBpdC4gQW4gYWN0aXZlIHRyYXAgd291bGQgc3RlYWwgZm9jdXMgYmFjayB0byB0aGUgaGlkZGVuIG1vZGFsLCBibG9ja2luZyB0aGVcbiAgICAvLyBtb3VzZS1kcml2ZW4gaW5zcGVjdGlvbiAoY2xpY2tpbmcgbm90ZXMsIHNjcm9sbGluZykgdGhhdCBtaW5pbWl6ZSBleGlzdHMgdG8gYWxsb3cuXG4gICAgLy8gS2V5Ym9hcmQgaW5wdXQgcmVtYWlucyBibG9ja2VkIGJ5IHRoZSBwZWVrLW9ubHkgbG9jaywgc28gcmVsZWFzaW5nIHRoZSB0cmFwIGtlZXBzIHRoZSBhcHAgaW5lcnQuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnBvcFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplZEJhcigpO1xuICAgIHRoaXMuZW5hYmxlUGVla0xvY2sodGhpcy5taW5pbWl6ZWRCYXJFbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgdGhlIG1vZGFsIGZyb20gdGhlIG1pbmltaXplZCBzdGF0ZSwgcmVtb3ZpbmcgdGhlIGZsb2F0aW5nIGJhciBhbmQgbGlmdGluZyB0aGUgcGVlay1vbmx5XG4gICAqIGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIG5vdCBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICAvLyBSZS1wdXNoIHRoZSBzY29wZSBwb3BwZWQgaW4gbWluaW1pemUoKSBzbyB0aGUgcmVzdG9yZWQgbW9kYWwgYmxvY2tzIHRoZSBhcHAgYWdhaW4gKGZvY3VzIHRyYXBcbiAgICAvLyArIEVzY2FwZSBjYXB0dXJlKS5cbiAgICB0aGlzLm1vZGFsLmFwcC5rZXltYXAucHVzaFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubW9kYWwuY29udGFpbmVyRWwuc2hvdygpO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5zaG93KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplQnV0dG9uKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBidXR0b25FbCA9IHRoaXMubW9kYWwubW9kYWxFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLk1pbmltaXplQnV0dG9uIH0pO1xuICAgIHNldEljb24oYnV0dG9uRWwsIE1JTklNSVpFX0lDT05fSUQpO1xuICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5taW5pbWl6ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBidXR0b25FbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVkQmFyKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBiYXJFbCA9IHRoaXMubW9kYWwuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoYmFyRWwsIFtDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhcl0pO1xuICAgIGJhckVsLmNyZWF0ZVNwYW4oe1xuICAgICAgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhclRpdGxlLFxuICAgICAgdGV4dDogdGhpcy5tb2RhbC50aXRsZUVsLnRleHRDb250ZW50XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZUJ1dHRvbkVsID0gYmFyRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5SZXN0b3JlQnV0dG9uIH0pO1xuICAgIHNldEljb24ocmVzdG9yZUJ1dHRvbkVsLCBSRVNUT1JFX0lDT05fSUQpO1xuICAgIGlmICh0aGlzLnNob3VsZFNob3dDYW5jZWxCdXR0b24pIHtcbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbkVsID0gYmFyRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5DYW5jZWxCdXR0b24gfSk7XG4gICAgICBzZXRJY29uKGNhbmNlbEJ1dHRvbkVsLCBDQU5DRUxfSUNPTl9JRCk7XG4gICAgICBzZXRUb29sdGlwKGNhbmNlbEJ1dHRvbkVsLCAnQ2FuY2VsJyk7XG4gICAgICBjYW5jZWxCdXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgkZXZlbnQpID0+IHtcbiAgICAgICAgLy8gVGhlIHdob2xlIGJhciByZXN0b3JlcyBvbiBjbGljazsgc3RvcCBwcm9wYWdhdGlvbiBzbyBDYW5jZWwgY2xvc2VzIHRoZSBtb2RhbCBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHJlc3RvcmluZyBpdC4gQ2xvc2luZyBydW5zIHRoZSB3cmFwcGVkIG1vZGFsJ3Mgb25DbG9zZSAocGVlayBsb2NrIGxpZnRlZCwgYmFyIHJlbW92ZWQpLCBzb1xuICAgICAgICAvLyB0aGUgY29uc3VtZXIncyBvbkNsb3NlIGRlY2lkZXMgd2hhdCBcImNhbmNlbFwiIG1lYW5zIChlLmcuIHJlbGVhc2luZyBhIGhlbGQgbG9jaykuXG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5tb2RhbC5jbG9zZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRoZSB3aG9sZSBiYXIgcmVzdG9yZXMgb24gY2xpY2ssIG5vdCBqdXN0IHRoZSByZXN0b3JlIGJ1dHRvbiDigJQgYSBsYXJnZXIsIGVhc2llciBjbGljayB0YXJnZXQuXG4gICAgLy8gYHJlc3RvcmUoKWAgZ3VhcmRzIGFnYWluc3QgYSBkb3VibGUgaW52b2NhdGlvbiwgc28gdGhlIHJlc3RvcmUgYnV0dG9uJ3Mgb3duIGNsaWNrIGJ1YmJsaW5nIHVwXG4gICAgLy8gaGVyZSBpcyBhIG5vLW9wLiBUaGUgcmVzdG9yZSBidXR0b24gc3RheXMgcHVyZWx5IGFzIGEgdmlzdWFsIGFmZm9yZGFuY2UgZm9yIHRoZSBjbGljayB0YXJnZXQuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgICAvLyBEcm9wIHRoZSBvbmUtc2hvdCBhdHRlbnRpb24gZmxhc2ggb25jZSBpdCBmaW5pc2hlcyBzbyB0aGUgYmFyIHJldHVybnMgdG8gaXRzIGdlbnRsZSBpZGxlIHB1bHNlLlxuICAgIC8vIFRoZSBpZGxlIHB1bHNlIGlzIGFuIGluZmluaXRlIGFuaW1hdGlvbiwgd2hpY2ggbmV2ZXIgZmlyZXMgYGFuaW1hdGlvbmVuZGAuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZVBlZWtMb2NrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZWVrTG9ja0VudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZSh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IG51bGw7XG4gICAgLy8gVGVhciB0aGUgYG9wZW5gIHBhdGNoZXMgZG93biB3aXRoIHRoZSBjb21wb25lbnQsIHNvIHRoZXkgZXhpc3Qgb25seSB3aGlsZSB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC5cbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlUGVla0xvY2soYmFyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5wZWVrTG9ja0VudHJ5ID0ge1xuICAgICAgYmFyRWwsXG4gICAgICBmbGFzaDogKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmZsYXNoQmFyKGJhckVsKTtcbiAgICAgIH0sXG4gICAgICBpbm5lck1vZGFsOiB0aGlzLm1vZGFsXG4gICAgfTtcbiAgICBwZWVrTG9ja0VudHJpZXMuYWRkKHRoaXMucGVla0xvY2tFbnRyeSk7XG4gICAgLy8gSW5zdGFsbCB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIGlucHV0IHN1cHByZXNzb3JzIGZvciBhcyBsb25nIGFzIHRoaXMgbW9kYWwgaXMgbWluaW1pemVkLiBUaGVcbiAgICAvLyBibG9jayBMT0dJQyBpdHNlbGYga2V5cyBvZmYgdGhlIHNoYXJlZCBgcGVla0xvY2tFbnRyaWVzYCAoc2VlIGBzaG91bGRCbG9ja09wZW5gKSwgc28gd2l0aCBzZXZlcmFsXG4gICAgLy8gbW9kYWxzIG1pbmltaXplZCBldmVyeSBvbmUncyBwYXRjaCByZWFjaGVzIHRoZSBzYW1lIHZlcmRpY3Q7IHRoZSBsb2NrIGxpZnRzIG9ubHkgb25jZSB0aGUgbGFzdFxuICAgIC8vIG1vZGFsIHJlc3RvcmVzL2Nsb3Nlcy5cbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50ID0gbmV3IFBlZWtMb2NrQ29tcG9uZW50KHRoaXMubW9kYWwuYXBwKTtcbiAgICB0aGlzLnBlZWtMb2NrQ29tcG9uZW50LmxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hCYXIoYmFyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIC8vIEZvcmNlIGEgcmVmbG93IHNvIHJlLWFkZGluZyB0aGUgY2xhc3MgcmVzdGFydHMgdGhlIG9uZS1zaG90IGZsYXNoIG9uIHJhcGlkIHJlcGVhdGVkIGJsb2Nrcy5cbiAgICBiYXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBiYXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgLy8gV2hpbGUgbWluaW1pemVkIHRoZSBjb250YWluZXIgaXMgaGlkZGVuLCBzbyBubyBjbGljayBjYW4gcmVhY2ggaXQg4oCUIGJ1dCBhIHN5bnRoZXRpYyBvbmUgc3RpbGwgY2FuLFxuICAgICAgLy8gYW5kIG1pbmltaXppbmcgYW4gYWxyZWFkeS1taW5pbWl6ZWQgbW9kYWwgaXMgbWVhbmluZ2xlc3MuXG4gICAgICB0aGlzLmlzTWluaW1pemVkVmFsdWVcbiAgICAgIC8vIEEgY2xpY2sgdGhhdCBwYXNzZWQgdGhyb3VnaCB0aGUgbW9kYWwgaXRzZWxmIGlzIG9yZGluYXJ5IGludGVyYWN0aW9uIHdpdGggaXRzIGNvbnRlbnQuXG4gICAgICAvLyBgY29tcG9zZWRQYXRoKClgIChyYXRoZXIgdGhhbiBgbW9kYWxFbC5jb250YWlucygkZXZlbnQudGFyZ2V0KWApIG5lZWRzIG5vIGNhc3QgYW5kIHN0YXlzIGNvcnJlY3RcbiAgICAgIC8vIGFjcm9zcyB3aW5kb3dzLCB3aGVyZSBhbiBgaW5zdGFuY2VvZiBIVE1MRWxlbWVudGAgY2hlY2sgYWdhaW5zdCBhbm90aGVyIHJlYWxtJ3MgZWxlbWVudCB3b3VsZCBub3QuXG4gICAgICB8fCAkZXZlbnQuY29tcG9zZWRQYXRoKCkuaW5jbHVkZXModGhpcy5tb2RhbC5tb2RhbEVsKVxuICAgICAgLy8gQSB0ZXh0IHNlbGVjdGlvbiBkcmFnZ2VkIGZyb20gaW5zaWRlIHRoZSBtb2RhbCBvdXQgb250byB0aGUgYmFja2dyb3VuZCBtYWtlcyB0aGUgcmVzdWx0aW5nXG4gICAgICAvLyBgY2xpY2tgIGZpcmUgb24gdGhlaXIgY29tbW9uIGFuY2VzdG9yIOKAlCBgY29udGFpbmVyRWxgLiBPYnNpZGlhbiBkb2VzIG5vdCBkaXNtaXNzIG9uIHRoYXQgZ2VzdHVyZSAoaXRzXG4gICAgICAvLyBvd24gbGlzdGVuZXIgc2l0cyBvbiBgYmdFbGAsIHdoaWNoIGlzIG5ldmVyIHRoZSB0YXJnZXQgaGVyZSksIHNvIG5laXRoZXIgZG9lcyB0aGlzLlxuICAgICAgfHwgJGV2ZW50LnRhcmdldCA9PT0gdGhpcy5tb2RhbC5jb250YWluZXJFbFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdoYXQgaXMgbGVmdCBpcyBhIGNsaWNrIG9uIHRoZSBkaW1tZWQgYmFja2dyb3VuZCBpdHNlbGYuIGBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKWAgaXMgd2hhdFxuICAgIC8vIGFjdHVhbGx5IGtlZXBzIGl0IGZyb20gcmVhY2hpbmcgT2JzaWRpYW4ncyBgYmdFbGAgbGlzdGVuZXIgb24gQk9USCBwbGF0Zm9ybSBicmFuY2hlcztcbiAgICAvLyBgcHJldmVudERlZmF1bHQoKWAgYWRkaXRpb25hbGx5IHNhdGlzZmllcyB0aGUgYGRlZmF1bHRQcmV2ZW50ZWRgIGd1YXJkIGluIGBvbkNsaWNrT3V0c2lkZWAuXG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubWluaW1pemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hPbkNsb3NlKG1vZGFsOiBNb2RhbCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5yZWdpc3Rlck1ldGhvZFBhdGNoPE1vZGFsLCAnb25DbG9zZSc+KHtcbiAgICAgICRvYmplY3Q6IG1vZGFsLFxuICAgICAgbWV0aG9kTmFtZTogJ29uQ2xvc2UnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KTogdm9pZCA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBibG9ja09yRmFsbGJhY2sobW9kYWw6IE1vZGFsLCBmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoc2hvdWxkQmxvY2tPcGVuKG1vZGFsKSkge1xuICAgIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmFsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gZmxhc2hNaW5pbWl6ZWRCYXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGVudHJ5LmZsYXNoKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmIChlbnRyeS5pbm5lck1vZGFsID09PSBtb2RhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtBbGxvd2VkS2V5KCRldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAvLyBOYXZpZ2F0aW9uIG1vdmVzIHRoZSBjdXJzb3Ivc2Nyb2xscyAoYWxsb3dlZCksIGJ1dCBTaGlmdCtuYXZpZ2F0aW9uIGV4dGVuZHMgdGhlIHNlbGVjdGlvbiAobm90XG4gIC8vIG5lZWRlZCBmb3IgaW5zcGVjdGlvbiksIHNvIGl0IGlzIGJsb2NrZWQuIEJhcmUgbW9kaWZpZXIgcHJlc3NlcyBwYXNzIHRocm91Z2ggb24gdGhlaXIgb3duLlxuICByZXR1cm4gTkFWSUdBVElPTl9LRVlTLmhhcygkZXZlbnQua2V5KSA/ICEkZXZlbnQuc2hpZnRLZXkgOiBNT0RJRklFUl9LRVlTLmhhcygkZXZlbnQua2V5KTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAvLyBEcm9wIGVudHJpZXMgd2hvc2UgYmFyIGhhcyBsZWZ0IHRoZSBET00gd2l0aG91dCBhIHJlc3RvcmUoKSBvciBjbG9zZSgpLlxuICAvLyBBIHRlc3QgdGVhcmRvd24gdGhhdCBlbXB0aWVzIHRoZSBib2R5IGlzIHRoZSB0eXBpY2FsIGNhdXNlOyB0aGlzIGtlZXBzIGEgc3RhbGUgZW50cnkgZnJvbSBsb2NraW5nLlxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmICghZW50cnkuYmFyRWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUoZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwZWVrTG9ja0VudHJpZXMuc2l6ZSA+IDA7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEJsb2NrT3Blbihtb2RhbDogTW9kYWwpOiBib29sZWFuIHtcbiAgLy8gQSBtb2RhbCdzIG93biByZS1vcGVuIGlzIG5ldmVyIGJsb2NrZWQg4oCUIG90aGVyd2lzZSBhIG1pbmltaXplZCBtb2RhbCBjb3VsZCBub3QgcmVzdG9yZS9yZS1vcGVuXG4gIC8vIGl0c2VsZi4gRXZlcnkgT1RIRVIgbW9kYWwgb3BlbiBpcyBibG9ja2VkIHdoaWxlIGFueSBtb2RhbCBpcyBtaW5pbWl6ZWQgKHRoZSBwZWVrLW9ubHkgbG9jaykuXG4gIHJldHVybiBpc1BlZWtMb2NrZWQoKSAmJiAhaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsKTtcbn1cblxuZnVuY3Rpb24gc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTogdm9pZCB7XG4gIGZsYXNoTWluaW1pemVkQmFycygpO1xuICBiZWVwZXIuYmVlcCgpO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQoJGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIGlmICghaXNQZWVrTG9ja2VkKCkgfHwgaXNQZWVrQWxsb3dlZEtleSgkZXZlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYmxvY2tFdmVudCgkZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBzdXBwcmVzc1doaWxlUGVla0xvY2tlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIGlmICghaXNQZWVrTG9ja2VkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBibG9ja0V2ZW50KCRldmVudCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0RBLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGdDQUFnQztBQUN6QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDJCQUEyQjtBQUVwQyxNQUFNLG1CQUFtQjtBQUN6QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLGlCQUFpQjtBQUt2QixNQUFNLGtCQUFrQixv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
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvbWluaW1pemFibGUtbW9kYWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIOKAlCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCDigKYg4oCUIGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiAoYW5kLCBieSBkZWZhdWx0LCBhIENhbmNlbCBidXR0b24gdGhhdCBjbG9zZXMgdGhlIHdyYXBwZWRcbiAqIG1vZGFsIOKAlCBwYXNzIGB7IHNob3VsZFNob3dDYW5jZWxCdXR0b246IGZhbHNlIH1gIHRvIGhpZGUgaXQpLCBzbyB0aGUgdXNlciBjYW4gcGVlayBhdCB0aGVcbiAqIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvbiBpbnZvbHZlcyDigJQgYnV0IHRoZSBtb2RhbCBpcyBOT1QgZGlzbWlzc2VkLCBzbyBpdHMgYmxvY2tpbmcgY29udHJhY3QgbXVzdCBiZSBwcmVzZXJ2ZWQuXG4gKlxuICogVG8ga2VlcCB0aGF0IGNvbnRyYWN0IHdoaWxlIG1pbmltaXplZCwgdGhlIHdyYXBwZXIgcHV0cyB0aGUgYXBwIGludG8gYSAqKnBlZWstb25seSBsb2NrKio6IHRoZSB1c2VyXG4gKiBtYXkgbW91c2UtY2xpY2sgYW5kIHNjcm9sbCB0byBpbnNwZWN0IGNvbnRlbnQsIGJ1dCBjYW5ub3Qgc3RhcnQgYW55dGhpbmcgbmV3LiBXaGlsZSBhbnkgbW9kYWwgaXNcbiAqIG1pbmltaXplZCB0aGUgd3JhcHBlcjpcbiAqIC0gYmxvY2tzIHRoZSBrZXlib2FyZCAodHlwaW5nLCBob3RrZXlzLCB0aGUgY29tbWFuZC1wYWxldHRlIHNob3J0Y3V0KSxcbiAqIC0gYmxvY2tzIHRoZSByaWdodC1jbGljayBjb250ZXh0IG1lbnUsIGFuZFxuICogLSBibG9ja3Mgb3BlbmluZyBhbnkgb3RoZXIgbW9kYWwgKGEgcmUtZmlyZWQgY29tbWFuZCwgdGhlIGNvbW1hbmQgcGFsZXR0ZSwgc2V0dGluZ3MsIOKApikuXG4gKlxuICogQSBibG9ja2VkIGF0dGVtcHQgZmxhc2hlcyB0aGUgZmxvYXRpbmcgYmFyIGFuZCBiZWVwcyBzbyB0aGUgdXNlciBzZWVzIChhbmQgaGVhcnMpIHdoeSBub3RoaW5nXG4gKiBoYXBwZW5lZC4gUmVzdG9yaW5nIChvciB0aGUgbW9kYWwgY2xvc2luZykgbGlmdHMgdGhlIGxvY2suIFRoaXMgcHJldmVudHMsIGZvciBleGFtcGxlLCBtaW5pbWl6aW5nIGFcbiAqIFwibWVyZ2UgZm9sZGVyXCIgcGlja2VyIGFuZCB0aGVuIGZpcmluZyB0aGUgc2FtZSBjb21tYW5kIGFnYWluIHRvIHN0YWNrIHNldmVyYWwgY29uY3VycmVudCBtZXJnZXMuXG4gKlxuICogVGhlIHdyYXBwZXIgcmV1c2VzIHRoZSBtb2RhbCdzIG93biB0aXRsZSAoYHRpdGxlRWxgKSBhcyB0aGUgbWluaW1pemVkIGJhciBsYWJlbCwgc28gc2V0IHRoZSB0aXRsZVxuICogdGhlIHVzdWFsIHdheSAoYG1vZGFsLnNldFRpdGxlKC4uLilgKS4gUmVuZGVyIGFyYml0cmFyeSBjb250ZW50IGludG8ge0BsaW5rIE1vZGFsLmNvbnRlbnRFbH0sXG4gKiBpbmNsdWRpbmcgY2xpY2thYmxlIG5vdGUgbGlua3MgcHJvZHVjZWQgYnkgYHJlbmRlckludGVybmFsTGlua2AgZnJvbVxuICogYEBtbmFvdW1vdi9vYnNpZGlhbi1saWIvbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKlxuICogQ2xpY2tpbmcgdGhlIGRpbW1lZCBiYWNrZ3JvdW5kIGJlaGluZCB0aGUgbW9kYWwgKiptaW5pbWl6ZXMqKiBpdCByYXRoZXIgdGhhbiBjbG9zaW5nIGl0LCBzbyBhIHN0cmF5XG4gKiBjbGljayBwYXN0IHRoZSBkaWFsb2cgbm8gbG9uZ2VyIGNhbmNlbHMgdGhlIG9wZXJhdGlvbiB0aGUgbW9kYWwgaXMgcnVubmluZyDigJQgcGFzc1xuICogYHsgc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZTogZmFsc2UgfWAgdG8ga2VlcCBPYnNpZGlhbidzIG5hdGl2ZSBjbG9zZS1vbi1iYWNrZ3JvdW5kLWNsaWNrLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBCZWVwZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYmVlcGVyJztcbmltcG9ydCB7XG4gIE1vZGFsLFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9tb25rZXktYXJvdW5kLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuY29uc3QgTUlOSU1JWkVfSUNPTl9JRCA9ICdtaW51cyc7XG5jb25zdCBSRVNUT1JFX0lDT05fSUQgPSAnbWF4aW1pemUtMic7XG5jb25zdCBDQU5DRUxfSUNPTl9JRCA9ICd4JztcblxuLy8gTmF2aWdhdGlvbiBrZXlzIHBhc3MgdGhyb3VnaCB3aGlsZSBtaW5pbWl6ZWQgc28gdGhlIHVzZXIgY2FuIG1vdmUgdGhlIGN1cnNvciBhbmQgc2Nyb2xsIHRvIHJlYWQuXG4vLyBOb25lIG9mIHRoZW0gbXV0YXRlIHRoZSBkb2N1bWVudCDigJQgdGV4dCBjaGFuZ2VzIGFyZSBjYXVnaHQgc2VwYXJhdGVseSBieSB0aGUgYGJlZm9yZWlucHV0YCBndWFyZC5cbi8vIFNoaWZ0K25hdmlnYXRpb24gaXMgYmxvY2tlZCwgdGhvdWdoLCBzaW5jZSBpdCBleHRlbmRzIHRoZSBzZWxlY3Rpb24gdGhhdCBpbnNwZWN0aW9uIGRvZXMgbm90IG5lZWQuXG5jb25zdCBOQVZJR0FUSU9OX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQXJyb3dEb3duJyxcbiAgJ0Fycm93TGVmdCcsXG4gICdBcnJvd1JpZ2h0JyxcbiAgJ0Fycm93VXAnLFxuICAnRW5kJyxcbiAgJ0hvbWUnLFxuICAnUGFnZURvd24nLFxuICAnUGFnZVVwJ1xuXSk7XG5cbi8vIEEgYmFyZSBtb2RpZmllciBwcmVzcyBkb2VzIG5vdGhpbmcgb24gaXRzIG93biwgc28gaXQgcGFzc2VzIHRocm91Z2ggdGhlIGxvY2suXG4vLyBUaGlzIGF2b2lkcyBhIHNwdXJpb3VzIGZsYXNoL2JlZXAgd2hpbGUgY29tcG9zaW5nIGEgc2hvcnRjdXQ7IHRoZSBzaG9ydGN1dCdzIGNvbW1hbmQga2V5IGlzIGJsb2NrZWQuXG5jb25zdCBNT0RJRklFUl9LRVlTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ0FsdCcsXG4gICdDb250cm9sJyxcbiAgJ01ldGEnLFxuICAnU2hpZnQnXG5dKTtcblxuLyoqXG4gKiBBIHJlZ2lzdGVyZWQgZW50cnkgZm9yIGEgY3VycmVudGx5LW1pbmltaXplZCBtb2RhbC4gVGhlIHNoYXJlZCBwZWVrLW9ubHkgbG9jayB1c2VzIGl0IHRvIGtub3cgYVxuICogbW9kYWwgaXMgbWluaW1pemVkLCB0byBsZWF2ZSB0aGF0IG1vZGFsJ3Mgb3duIHJlLW9wZW5zIGFsb25lLCBhbmQgdG8gZmxhc2ggaXRzIGJhciBvbiBhIGJsb2NrZWRcbiAqIGF0dGVtcHQuXG4gKi9cbmludGVyZmFjZSBQZWVrTG9ja0VudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBmbG9hdGluZyBiYXIgZWxlbWVudC4gVXNlZCB0byBkZXRlY3QgYSBzdGFsZSBlbnRyeSAoaXRzIGJhciBoYXMgbGVmdCB0aGUgRE9NKSBzbyBpdCBjYW4gYmVcbiAgICogcHJ1bmVkIGFuZCBuZXZlciBrZWVwIHRoZSBhcHAgbG9ja2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBGbGFzaGVzIHRoZSBmbG9hdGluZyBiYXIgdG8gc2lnbmFsIGEgYmxvY2tlZCBhdHRlbXB0LlxuICAgKi9cbiAgZmxhc2g6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSB3cmFwcGVkIG1vZGFsIGluc3RhbmNlLCBzbyBpdHMgb3duIGBvcGVuKClgIGlzIG5ldmVyIGJsb2NrZWQgYnkgdGhlIGxvY2suXG4gICAqL1xuICByZWFkb25seSBpbm5lck1vZGFsOiBNb2RhbDtcbn1cblxuY29uc3QgcGVla0xvY2tFbnRyaWVzID0gbmV3IFNldDxQZWVrTG9ja0VudHJ5PigpO1xuY29uc3QgYmVlcGVyID0gbmV3IEJlZXBlcigpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBNaW5pbWl6YWJsZU1vZGFsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNaW5pbWl6YWJsZU1vZGFsQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIGRpbW1lZCBiYWNrZ3JvdW5kIGJlaGluZCB0aGUgbW9kYWwgbWluaW1pemVzIGl0IGluc3RlYWQgb2YgY2xvc2luZyBpdC5cbiAgICogT2JzaWRpYW4ncyBuYXRpdmUgYmVoYXZpb3IgaXMgdG8gY2xvc2UsIHdoaWNoIGNhbmNlbHMgd2hhdGV2ZXIgb3BlcmF0aW9uIHRoZSBtb2RhbCBpcyBydW5uaW5nO1xuICAgKiBtaW5pbWl6aW5nIGtlZXBzIHRoYXQgb3BlcmF0aW9uIGFsaXZlIHNvIHRoZSB1c2VyIGNhbiBwZWVrIGF0IHRoZSBpbnZvbHZlZCBub3RlcyBhbmQgY29tZSBiYWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZE1pbmltaXplT25DbGlja091dHNpZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtaW5pbWl6ZWQgYmFyIHNob3dzIGEgQ2FuY2VsIGJ1dHRvbiB0aGF0IGNsb3NlcyB0aGUgd3JhcHBlZCBtb2RhbC4gQ2xvc2luZyBsZXRzIHRoZVxuICAgKiB3cmFwcGVkIG1vZGFsJ3Mgb3duIGBvbkNsb3NlYCBkZWZpbmUgd2hhdCBcImNhbmNlbFwiIG1lYW5zIChlLmcuIHJlbGVhc2luZyBhIGhlbGQgbG9jaykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0NhbmNlbEJ1dHRvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIHBlZWstb25seSBsb2NrJ3MgYG9wZW5gIHBhdGNoZXMgd2hpbGUgYXQgbGVhc3Qgb25lIG1vZGFsIGlzIG1pbmltaXplZC4gQmVpbmcgYVxuICoge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudH0sIGJvdGggcGF0Y2hlcyBhcmUgdG9ybiBkb3duIGF1dG9tYXRpY2FsbHkgb24gYHVubG9hZGAsIHNvIHRoZXkgZXhpc3RcbiAqIG9ubHkgd2hpbGUgdGhlIGxvY2sgaXMgYWN0aXZlLiBBIG1pbmltaXplZCBtb2RhbCdzIG93biByZS1vcGVuIGlzIGFsd2F5cyBhbGxvd2VkIChzZWVcbiAqIHtAbGluayBzaG91bGRCbG9ja09wZW59KTsgZXZlcnkgb3RoZXIgbW9kYWwgb3BlbiBpcyBibG9ja2VkIGFuZCBzaWduYWxzIGEgZmxhc2ggKyBiZWVwLlxuICovXG5jbGFzcyBQZWVrTG9ja0NvbXBvbmVudCBleHRlbmRzIE1vbmtleUFyb3VuZENvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIGFwcCB3aG9zZSBzZXR0aW5ncyBtb2RhbCBpcyBndWFyZGVkIGFuZCB3aG9zZSB3aW5kb3dzIHN1cHByZXNzIGlucHV0IHdoaWxlIGxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCB0aGUgaW5wdXQgc3VwcHJlc3NvcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgLy8gQmxvY2sgb3BlbmluZyBhbnkgT1RIRVIgbW9kYWwgd2hpbGUgYSBtb2RhbCBpcyBtaW5pbWl6ZWQgKHRoZSBjb21tYW5kIHBhbGV0dGUsIGEgcmUtZmlyZWRcbiAgICAvLyBjb21tYW5kLCBhbm90aGVyIHBsdWdpbiBtb2RhbCwg4oCmKS5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8TW9kYWwsICdvcGVuJz4oe1xuICAgICAgJG9iamVjdDogTW9kYWwucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gT2JzaWRpYW4ncyBTZXR0aW5ncyBpcyBhICpwb3BvdXQqIG1vZGFsOiBvbiBkZXNrdG9wIGl0cyBvd24gYG9wZW4oKWAgZmlyc3QgY3JlYXRlcyBhIHNlcGFyYXRlIE9TXG4gICAgLy8gd2luZG93ICh2aWEgYHNob3VsZFVzZVBvcG91dCgpYC9gZ2V0UG9wb3V0T3B0aW9ucygpYCkgYW5kIG9ubHkgVEhFTiBkZWxlZ2F0ZXMgdG9cbiAgICAvLyBgTW9kYWwucHJvdG90eXBlLm9wZW5gIHRvIHJlbmRlciB0aGUgYWN0aXZlIHRhYiBpbnRvIGl0LiBHdWFyZGluZyBvbmx5IGBNb2RhbC5wcm90b3R5cGUub3BlbmBcbiAgICAvLyB0aGVyZWZvcmUgYmxvY2tzIHRoZSByZW5kZXIgYnV0IGxlYXZlcyBhbiBlbXB0eSBzZXR0aW5ncyB3aW5kb3cgYmVoaW5kIOKAlCB0aGUgcmVwb3J0ZWQgYmFkIFVYLlxuICAgIC8vIEd1YXJkaW5nIHRoZSBzZXR0aW5ncyBtb2RhbCdzIG93biBgb3BlbigpYCBibG9ja3MgaXQgKmJlZm9yZSogdGhlIHdpbmRvdyBpcyBjcmVhdGVkLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxBcHBbJ3NldHRpbmcnXSwgJ29wZW4nPih7XG4gICAgICAkb2JqZWN0OiB0aGlzLmFwcC5zZXR0aW5nLFxuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VwcHJlc3MgdGhlIGtleWJvYXJkLCBlZGl0b3IgbXV0YXRpb24sIGFuZCB0aGUgY29udGV4dCBtZW51IGFjcm9zcyBBTEwgd2luZG93cyDigJQgdGhlIG1haW4gd2luZG93XG4gICAgLy8gYW5kIGV2ZXJ5IGV4aXN0aW5nL2Z1dHVyZSBwb3BvdXQg4oCUIHNvIHRoZSBsb2NrIGhvbGRzIHdoZXJldmVyIHRoZSB1c2VyJ3MgZm9jdXMgaXMsIG5vdCBvbmx5IGluXG4gICAgLy8gdGhlIHdpbmRvdyB0aGF0IG93bnMgdGhlIG1pbmltaXplZCBtb2RhbC4gQ2FwdHVyZS1waGFzZSBsaXN0ZW5lcnMgcnVuIGJlZm9yZSBPYnNpZGlhbidzIG93blxuICAgIC8vIGRvY3VtZW50L2VsZW1lbnQgaGFuZGxlcnMgKGluY2x1ZGluZyBDb2RlTWlycm9yJ3MpLCBzbyBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGluIHRoZVxuICAgIC8vIHN1cHByZXNzb3JzIGtlZXBzIGEgYmxvY2tlZCBldmVudCBmcm9tIGV2ZXIgcmVhY2hpbmcgdGhlbS4gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2hcbiAgICAvLyAoc2VlIGBpc1BlZWtBbGxvd2VkS2V5YCkgYnV0IGJsb2NrcyBjb21tYW5kIGhvdGtleXM7IGBiZWZvcmVpbnB1dGAgYmxvY2tzIGFsbCBlZGl0b3IgbXV0YXRpb247XG4gICAgLy8gYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdrZXlkb3duJ1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdiZWZvcmVpbnB1dCdcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnY29udGV4dG1lbnUnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyB0aGUgd3JhcHBlZCBtb2RhbCdzIGBvbkNsb3NlYCB0byBydW4gY2xlYW51cC4gUGVyc2lzdHMgZm9yIHRoZSB3cmFwcGVyJ3Mgd2hvbGUgbGlmZSAoYVxuICAgKiBtb2RhbCBjYW4gYmUgcmVvcGVuZWQsIHNvIHRoZSBwYXRjaCBtdXN0IHN1cnZpdmUgZWFjaCBjbG9zZSksIGhlbmNlIGEgZGVkaWNhdGVkIGNvbXBvbmVudCB0aGF0IGlzXG4gICAqIG5ldmVyIHVubG9hZGVkIOKAlCBkaXN0aW5jdCBmcm9tIGBwZWVrTG9ja0NvbXBvbmVudGAsIHdob3NlIHBhdGNoZXMgbGl2ZSBvbmx5IHdoaWxlIG1pbmltaXplZC5cbiAgICogRXhwb3NlZCB0byBzdWJjbGFzc2VzIHNvIHRoZXkgY2FuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgbGlmZXRpbWUtc2NvcGVkIHBhdGNoZXMgb24gdGhlIHdyYXBwZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xvc2VQYXRjaENvbXBvbmVudCA9IG5ldyBNb25rZXlBcm91bmRDb21wb25lbnQoKTtcblxuICBwcml2YXRlIGlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtaW5pbWl6ZUJ1dHRvbkVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBtaW5pbWl6ZWRCYXJFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0NvbXBvbmVudDogbnVsbCB8IFBlZWtMb2NrQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0VudHJ5OiBudWxsIHwgUGVla0xvY2tFbnRyeSA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTaG93Q2FuY2VsQnV0dG9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXcmFwcyB0aGUgZ2l2ZW4gbW9kYWwsIGFkZGluZyBhIG1pbmltaXplIGJ1dHRvbiBhbmQgd2lyaW5nIHVwIGNsZWFudXAgb24gY2xvc2UuXG4gICAqXG4gICAqIEBwYXJhbSBtb2RhbCAtIFRoZSBtb2RhbCBpbnN0YW5jZSB0byBtYWtlIG1pbmltaXphYmxlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgY29udHJvbGxpbmcgdGhlIG1pbmltaXplZCBiYXIuIFNlZSB7QGxpbmsgTWluaW1pemFibGVNb2RhbENvbnN0cnVjdG9yT3B0aW9uc30uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IobW9kYWw6IFRNb2RhbCwgb3B0aW9uczogTWluaW1pemFibGVNb2RhbENvbnN0cnVjdG9yT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5tb2RhbCA9IG1vZGFsO1xuICAgIHRoaXMuc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZSA9IG9wdGlvbnMuc2hvdWxkTWluaW1pemVPbkNsaWNrT3V0c2lkZSA/PyB0cnVlO1xuICAgIHRoaXMuc2hvdWxkU2hvd0NhbmNlbEJ1dHRvbiA9IG9wdGlvbnMuc2hvdWxkU2hvd0NhbmNlbEJ1dHRvbiA/PyB0cnVlO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobW9kYWwuY29udGFpbmVyRWwsIFtDc3NDbGFzcy5NaW5pbWl6YWJsZU1vZGFsXSk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZUJ1dHRvbigpO1xuICAgIGlmICh0aGlzLnNob3VsZE1pbmltaXplT25DbGlja091dHNpZGUpIHtcbiAgICAgIC8vIE9ic2lkaWFuIGRpc21pc3NlcyBhIG1vZGFsIGZyb20gYSBsaXN0ZW5lciBpdCByZWdpc3RlcnMgb24gYGJnRWxgIElOIFRIRSBgTW9kYWxgIENPTlNUUlVDVE9SIOKAlFxuICAgICAgLy8gb24gbWFjT1MgZGVza3RvcCB0aGF0IGxpc3RlbmVyIGNhbGxzIGBjbG9zZSgpYCBkaXJlY3RseSAobm8gb3ZlcnJpZGFibGUgbWV0aG9kLCBub1xuICAgICAgLy8gYGRlZmF1bHRQcmV2ZW50ZWRgIGd1YXJkKSwgc28gbmVpdGhlciBvdmVycmlkaW5nIGBvbkNsaWNrT3V0c2lkZWAgbm9yIGBwcmV2ZW50RGVmYXVsdCgpYCBhbG9uZSBjYW5cbiAgICAgIC8vIHN0b3AgaXQuIEF0IHRoZSB0YXJnZXQgcGhhc2UgdGhlIERPTSBpbnZva2VzIGxpc3RlbmVycyBpbiByZWdpc3RyYXRpb24gb3JkZXIgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAgIC8vIGNhcHR1cmUgZmxhZywgYW5kIE9ic2lkaWFuIHJlZ2lzdGVyZWQgZmlyc3QsIHNvIHRoZSBvbmx5IHdheSB0byBydW4gZWFybGllciBpcyB0byBjYXB0dXJlIG9uIHRoZVxuICAgICAgLy8gUEFSRU5UIGVsZW1lbnQuIEhlbmNlOiBjYXB0dXJlLXBoYXNlIGBjbGlja2Agb24gYGNvbnRhaW5lckVsYC5cbiAgICAgIG1vZGFsLmNvbnRhaW5lckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUNvbnRhaW5lckNsaWNrKCRldmVudCk7XG4gICAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wLCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZSBidXR0b24sXG4gICAqIGFuZCBwdXRzIHRoZSBhcHAgaW50byB0aGUgcGVlay1vbmx5IGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIGlzIHBvcHBlZCB0byByZWxlYXNlIHRoZSBmb2N1cyB0cmFwLlxuICAgIC8vIFJlc3RvcmluZyByZS1wdXNoZXMgaXQuIEFuIGFjdGl2ZSB0cmFwIHdvdWxkIHN0ZWFsIGZvY3VzIGJhY2sgdG8gdGhlIGhpZGRlbiBtb2RhbCwgYmxvY2tpbmcgdGhlXG4gICAgLy8gbW91c2UtZHJpdmVuIGluc3BlY3Rpb24gKGNsaWNraW5nIG5vdGVzLCBzY3JvbGxpbmcpIHRoYXQgbWluaW1pemUgZXhpc3RzIHRvIGFsbG93LlxuICAgIC8vIEtleWJvYXJkIGlucHV0IHJlbWFpbnMgYmxvY2tlZCBieSB0aGUgcGVlay1vbmx5IGxvY2ssIHNvIHJlbGVhc2luZyB0aGUgdHJhcCBrZWVwcyB0aGUgYXBwIGluZXJ0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmVuYWJsZVBlZWtMb2NrKHRoaXMubWluaW1pemVkQmFyRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBtb2RhbCBmcm9tIHRoZSBtaW5pbWl6ZWQgc3RhdGUsIHJlbW92aW5nIHRoZSBmbG9hdGluZyBiYXIgYW5kIGxpZnRpbmcgdGhlIHBlZWstb25seVxuICAgKiBsb2NrLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpcyBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgLy8gUmUtcHVzaCB0aGUgc2NvcGUgcG9wcGVkIGluIG1pbmltaXplKCkgc28gdGhlIHJlc3RvcmVkIG1vZGFsIGJsb2NrcyB0aGUgYXBwIGFnYWluIChmb2N1cyB0cmFwXG4gICAgLy8gKyBFc2NhcGUgY2FwdHVyZSkuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLnNob3coKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZUJ1dHRvbigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYnV0dG9uRWwgPSB0aGlzLm1vZGFsLm1vZGFsRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKGJ1dHRvbkVsLCBNSU5JTUlaRV9JQ09OX0lEKTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubWluaW1pemUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYnV0dG9uRWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplZEJhcigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYmFyRWwgPSB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJhckVsLCBbQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJdKTtcbiAgICBiYXJFbC5jcmVhdGVTcGFuKHtcbiAgICAgIGNsczogQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJUaXRsZSxcbiAgICAgIHRleHQ6IHRoaXMubW9kYWwudGl0bGVFbC50ZXh0Q29udGVudFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3RvcmVCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuUmVzdG9yZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKHJlc3RvcmVCdXR0b25FbCwgUkVTVE9SRV9JQ09OX0lEKTtcbiAgICBpZiAodGhpcy5zaG91bGRTaG93Q2FuY2VsQnV0dG9uKSB7XG4gICAgICBjb25zdCBjYW5jZWxCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uIH0pO1xuICAgICAgc2V0SWNvbihjYW5jZWxCdXR0b25FbCwgQ0FOQ0VMX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcChjYW5jZWxCdXR0b25FbCwgJ0NhbmNlbCcpO1xuICAgICAgY2FuY2VsQnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIFRoZSB3aG9sZSBiYXIgcmVzdG9yZXMgb24gY2xpY2s7IHN0b3AgcHJvcGFnYXRpb24gc28gQ2FuY2VsIGNsb3NlcyB0aGUgbW9kYWwgaW5zdGVhZCBvZlxuICAgICAgICAvLyByZXN0b3JpbmcgaXQuIENsb3NpbmcgcnVucyB0aGUgd3JhcHBlZCBtb2RhbCdzIG9uQ2xvc2UgKHBlZWsgbG9jayBsaWZ0ZWQsIGJhciByZW1vdmVkKSwgc29cbiAgICAgICAgLy8gdGhlIGNvbnN1bWVyJ3Mgb25DbG9zZSBkZWNpZGVzIHdoYXQgXCJjYW5jZWxcIiBtZWFucyAoZS5nLiByZWxlYXNpbmcgYSBoZWxkIGxvY2spLlxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUaGUgd2hvbGUgYmFyIHJlc3RvcmVzIG9uIGNsaWNrLCBub3QganVzdCB0aGUgcmVzdG9yZSBidXR0b24g4oCUIGEgbGFyZ2VyLCBlYXNpZXIgY2xpY2sgdGFyZ2V0LlxuICAgIC8vIGByZXN0b3JlKClgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlIGludm9jYXRpb24sIHNvIHRoZSByZXN0b3JlIGJ1dHRvbidzIG93biBjbGljayBidWJibGluZyB1cFxuICAgIC8vIGhlcmUgaXMgYSBuby1vcC4gVGhlIHJlc3RvcmUgYnV0dG9uIHN0YXlzIHB1cmVseSBhcyBhIHZpc3VhbCBhZmZvcmRhbmNlIGZvciB0aGUgY2xpY2sgdGFyZ2V0LlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgLy8gRHJvcCB0aGUgb25lLXNob3QgYXR0ZW50aW9uIGZsYXNoIG9uY2UgaXQgZmluaXNoZXMgc28gdGhlIGJhciByZXR1cm5zIHRvIGl0cyBnZW50bGUgaWRsZSBwdWxzZS5cbiAgICAvLyBUaGUgaWRsZSBwdWxzZSBpcyBhbiBpbmZpbml0ZSBhbmltYXRpb24sIHdoaWNoIG5ldmVyIGZpcmVzIGBhbmltYXRpb25lbmRgLlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmFyRWw7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVQZWVrTG9jaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVla0xvY2tFbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUodGhpcy5wZWVrTG9ja0VudHJ5KTtcbiAgICB0aGlzLnBlZWtMb2NrRW50cnkgPSBudWxsO1xuICAgIC8vIFRlYXIgdGhlIGBvcGVuYCBwYXRjaGVzIGRvd24gd2l0aCB0aGUgY29tcG9uZW50LCBzbyB0aGV5IGV4aXN0IG9ubHkgd2hpbGUgdGhpcyBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIC8vIEluc3RhbGwgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCBpbnB1dCBzdXBwcmVzc29ycyBmb3IgYXMgbG9uZyBhcyB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC4gVGhlXG4gICAgLy8gYmxvY2sgTE9HSUMgaXRzZWxmIGtleXMgb2ZmIHRoZSBzaGFyZWQgYHBlZWtMb2NrRW50cmllc2AgKHNlZSBgc2hvdWxkQmxvY2tPcGVuYCksIHNvIHdpdGggc2V2ZXJhbFxuICAgIC8vIG1vZGFscyBtaW5pbWl6ZWQgZXZlcnkgb25lJ3MgcGF0Y2ggcmVhY2hlcyB0aGUgc2FtZSB2ZXJkaWN0OyB0aGUgbG9jayBsaWZ0cyBvbmx5IG9uY2UgdGhlIGxhc3RcbiAgICAvLyBtb2RhbCByZXN0b3Jlcy9jbG9zZXMuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG5ldyBQZWVrTG9ja0NvbXBvbmVudCh0aGlzLm1vZGFsLmFwcCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoQmFyKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyByZS1hZGRpbmcgdGhlIGNsYXNzIHJlc3RhcnRzIHRoZSBvbmUtc2hvdCBmbGFzaCBvbiByYXBpZCByZXBlYXRlZCBibG9ja3MuXG4gICAgYmFyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYmFyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lckNsaWNrKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIC8vIFdoaWxlIG1pbmltaXplZCB0aGUgY29udGFpbmVyIGlzIGhpZGRlbiwgc28gbm8gY2xpY2sgY2FuIHJlYWNoIGl0IOKAlCBidXQgYSBzeW50aGV0aWMgb25lIHN0aWxsIGNhbixcbiAgICAgIC8vIGFuZCBtaW5pbWl6aW5nIGFuIGFscmVhZHktbWluaW1pemVkIG1vZGFsIGlzIG1lYW5pbmdsZXNzLlxuICAgICAgdGhpcy5pc01pbmltaXplZFZhbHVlXG4gICAgICAvLyBBIGNsaWNrIHRoYXQgcGFzc2VkIHRocm91Z2ggdGhlIG1vZGFsIGl0c2VsZiBpcyBvcmRpbmFyeSBpbnRlcmFjdGlvbiB3aXRoIGl0cyBjb250ZW50LlxuICAgICAgLy8gYGNvbXBvc2VkUGF0aCgpYCAocmF0aGVyIHRoYW4gYG1vZGFsRWwuY29udGFpbnMoJGV2ZW50LnRhcmdldClgKSBuZWVkcyBubyBjYXN0IGFuZCBzdGF5cyBjb3JyZWN0XG4gICAgICAvLyBhY3Jvc3Mgd2luZG93cywgd2hlcmUgYW4gYGluc3RhbmNlb2YgSFRNTEVsZW1lbnRgIGNoZWNrIGFnYWluc3QgYW5vdGhlciByZWFsbSdzIGVsZW1lbnQgd291bGQgbm90LlxuICAgICAgfHwgJGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKHRoaXMubW9kYWwubW9kYWxFbClcbiAgICAgIC8vIEEgdGV4dCBzZWxlY3Rpb24gZHJhZ2dlZCBmcm9tIGluc2lkZSB0aGUgbW9kYWwgb3V0IG9udG8gdGhlIGJhY2tncm91bmQgbWFrZXMgdGhlIHJlc3VsdGluZ1xuICAgICAgLy8gYGNsaWNrYCBmaXJlIG9uIHRoZWlyIGNvbW1vbiBhbmNlc3RvciDigJQgYGNvbnRhaW5lckVsYC4gT2JzaWRpYW4gZG9lcyBub3QgZGlzbWlzcyBvbiB0aGF0IGdlc3R1cmUgKGl0c1xuICAgICAgLy8gb3duIGxpc3RlbmVyIHNpdHMgb24gYGJnRWxgLCB3aGljaCBpcyBuZXZlciB0aGUgdGFyZ2V0IGhlcmUpLCBzbyBuZWl0aGVyIGRvZXMgdGhpcy5cbiAgICAgIHx8ICRldmVudC50YXJnZXQgPT09IHRoaXMubW9kYWwuY29udGFpbmVyRWxcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXaGF0IGlzIGxlZnQgaXMgYSBjbGljayBvbiB0aGUgZGltbWVkIGJhY2tncm91bmQgaXRzZWxmLiBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGlzIHdoYXRcbiAgICAvLyBhY3R1YWxseSBrZWVwcyBpdCBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3MgYGJnRWxgIGxpc3RlbmVyIG9uIEJPVEggcGxhdGZvcm0gYnJhbmNoZXM7XG4gICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGFkZGl0aW9uYWxseSBzYXRpc2ZpZXMgdGhlIGBkZWZhdWx0UHJldmVudGVkYCBndWFyZCBpbiBgb25DbGlja091dHNpZGVgLlxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLm1pbmltaXplKCk7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoT25DbG9zZShtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlUGF0Y2hDb21wb25lbnQucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29uQ2xvc2UnPih7XG4gICAgICAkb2JqZWN0OiBtb2RhbCxcbiAgICAgIG1ldGhvZE5hbWU6ICdvbkNsb3NlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2sgfSk6IHZvaWQgPT4ge1xuICAgICAgICBmYWxsYmFjaygpO1xuICAgICAgICB0aGlzLmhhbmRsZUNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU1pbmltaXplZEJhcigpOiB2b2lkIHtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsPy5yZW1vdmUoKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBibG9ja0V2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTtcbn1cblxuZnVuY3Rpb24gYmxvY2tPckZhbGxiYWNrKG1vZGFsOiBNb2RhbCwgZmFsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgaWYgKHNob3VsZEJsb2NrT3Blbihtb2RhbCkpIHtcbiAgICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZhbGxiYWNrKCk7XG59XG5cbmZ1bmN0aW9uIGZsYXNoTWluaW1pemVkQmFycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBlbnRyeS5mbGFzaCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTWluaW1pemVkSW5uZXJNb2RhbChtb2RhbDogTW9kYWwpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuaW5uZXJNb2RhbCA9PT0gbW9kYWwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrQWxsb3dlZEtleSgkZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gTmF2aWdhdGlvbiBtb3ZlcyB0aGUgY3Vyc29yL3Njcm9sbHMgKGFsbG93ZWQpLCBidXQgU2hpZnQrbmF2aWdhdGlvbiBleHRlbmRzIHRoZSBzZWxlY3Rpb24gKG5vdFxuICAvLyBuZWVkZWQgZm9yIGluc3BlY3Rpb24pLCBzbyBpdCBpcyBibG9ja2VkLiBCYXJlIG1vZGlmaWVyIHByZXNzZXMgcGFzcyB0aHJvdWdoIG9uIHRoZWlyIG93bi5cbiAgcmV0dXJuIE5BVklHQVRJT05fS0VZUy5oYXMoJGV2ZW50LmtleSkgPyAhJGV2ZW50LnNoaWZ0S2V5IDogTU9ESUZJRVJfS0VZUy5oYXMoJGV2ZW50LmtleSk7XG59XG5cbmZ1bmN0aW9uIGlzUGVla0xvY2tlZCgpOiBib29sZWFuIHtcbiAgLy8gRHJvcCBlbnRyaWVzIHdob3NlIGJhciBoYXMgbGVmdCB0aGUgRE9NIHdpdGhvdXQgYSByZXN0b3JlKCkgb3IgY2xvc2UoKS5cbiAgLy8gQSB0ZXN0IHRlYXJkb3duIHRoYXQgZW1wdGllcyB0aGUgYm9keSBpcyB0aGUgdHlwaWNhbCBjYXVzZTsgdGhpcyBrZWVwcyBhIHN0YWxlIGVudHJ5IGZyb20gbG9ja2luZy5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBpZiAoIWVudHJ5LmJhckVsLmlzQ29ubmVjdGVkKSB7XG4gICAgICBwZWVrTG9ja0VudHJpZXMuZGVsZXRlKGVudHJ5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGVla0xvY2tFbnRyaWVzLnNpemUgPiAwO1xufVxuXG5mdW5jdGlvbiBzaG91bGRCbG9ja09wZW4obW9kYWw6IE1vZGFsKTogYm9vbGVhbiB7XG4gIC8vIEEgbW9kYWwncyBvd24gcmUtb3BlbiBpcyBuZXZlciBibG9ja2VkIOKAlCBvdGhlcndpc2UgYSBtaW5pbWl6ZWQgbW9kYWwgY291bGQgbm90IHJlc3RvcmUvcmUtb3BlblxuICAvLyBpdHNlbGYuIEV2ZXJ5IE9USEVSIG1vZGFsIG9wZW4gaXMgYmxvY2tlZCB3aGlsZSBhbnkgbW9kYWwgaXMgbWluaW1pemVkICh0aGUgcGVlay1vbmx5IGxvY2spLlxuICByZXR1cm4gaXNQZWVrTG9ja2VkKCkgJiYgIWlzTWluaW1pemVkSW5uZXJNb2RhbChtb2RhbCk7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk6IHZvaWQge1xuICBmbGFzaE1pbmltaXplZEJhcnMoKTtcbiAgYmVlcGVyLmJlZXAoKTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkKCRldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpIHx8IGlzUGVla0FsbG93ZWRLZXkoJGV2ZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoJGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYmxvY2tFdmVudCgkZXZlbnQpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtEQSxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUywyQkFBMkI7QUFFcEMsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxpQkFBaUI7QUFLdkIsTUFBTSxrQkFBa0Isb0JBQUksSUFBWTtBQUFBLEVBQ3RDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUFJRCxNQUFNLGdCQUFnQixvQkFBSSxJQUFZO0FBQUEsRUFDcEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBeUJELE1BQU0sa0JBQWtCLG9CQUFJLElBQW1CO0FBQy9DLE1BQU0sU0FBUyxJQUFJLE9BQU87QUE4QjFCLE1BQU0sMEJBQTBCLHNCQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU03QyxZQUE2QixLQUFVO0FBQzVDLFVBQU07QUFENEI7QUFBQSxFQUVwQztBQUFBLEVBRm9DO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPcEIsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFJYixTQUFLLG9CQUFtQztBQUFBLE1BQ3RDLFNBQVMsTUFBTTtBQUFBLE1BQ2YsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsVUFBVSxhQUFhLE1BQVk7QUFDbEQsd0JBQWdCLGNBQWMsUUFBUTtBQUFBLE1BQ3hDO0FBQUEsSUFDRixDQUFDO0FBT0QsU0FBSyxvQkFBNEM7QUFBQSxNQUMvQyxTQUFTLEtBQUssSUFBSTtBQUFBLE1BQ2xCLFlBQVk7QUFBQSxNQUNaLGNBQWMsQ0FBQyxFQUFFLFVBQVUsYUFBYSxNQUFZO0FBQ2xELHdCQUFnQixjQUFjLFFBQVE7QUFBQSxNQUN4QztBQUFBLElBQ0YsQ0FBQztBQVNELFVBQU0sMkJBQTJCLEtBQUssU0FBUyxJQUFJLHlCQUF5QixLQUFLLEdBQUcsQ0FBQztBQUNyRiw2QkFBeUIsMkJBQTJCO0FBQUEsTUFDbEQsVUFBVTtBQUFBLE1BQ1YsU0FBUyxFQUFFLFNBQVMsS0FBSztBQUFBLE1BQ3pCLE1BQU07QUFBQSxJQUNSLENBQUM7QUFDRCw2QkFBeUIsMkJBQTJCO0FBQUEsTUFDbEQsVUFBVTtBQUFBLE1BQ1YsU0FBUyxFQUFFLFNBQVMsS0FBSztBQUFBLE1BQ3pCLE1BQU07QUFBQSxJQUNSLENBQUM7QUFDRCw2QkFBeUIsMkJBQTJCO0FBQUEsTUFDbEQsVUFBVTtBQUFBLE1BQ1YsU0FBUyxFQUFFLFNBQVMsS0FBSztBQUFBLE1BQ3pCLE1BQU07QUFBQSxJQUNSLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFTTyxNQUFNLGlCQUF1QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWxDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT2hCLElBQVcsY0FBdUI7QUFDaEMsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUW1CLHNCQUFzQixJQUFJLHNCQUFzQjtBQUFBLEVBRTNELG1CQUFtQjtBQUFBLEVBQ1Y7QUFBQSxFQUNULGlCQUFxQztBQUFBLEVBQ3JDLG9CQUE4QztBQUFBLEVBQzlDLGdCQUFzQztBQUFBLEVBQzdCO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVYsWUFBWSxPQUFlLFVBQThDLENBQUMsR0FBRztBQUNsRixTQUFLLFFBQVE7QUFDYixTQUFLLCtCQUErQixRQUFRLGdDQUFnQztBQUM1RSxTQUFLLHlCQUF5QixRQUFRLDBCQUEwQjtBQUNoRSx3QkFBb0IsTUFBTSxhQUFhLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztBQUNsRSxTQUFLLG1CQUFtQixLQUFLLHFCQUFxQjtBQUNsRCxRQUFJLEtBQUssOEJBQThCO0FBT3JDLFlBQU0sWUFBWSxpQkFBaUIsU0FBUyxDQUFDLFdBQVc7QUFDdEQsYUFBSyxxQkFBcUIsTUFBTTtBQUFBLE1BQ2xDLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLElBQ3RCO0FBQ0EsU0FBSyxvQkFBb0IsS0FBSztBQUM5QixTQUFLLGFBQWEsS0FBSztBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1PLFdBQWlCO0FBQ3RCLFFBQUksS0FBSyxrQkFBa0I7QUFDekI7QUFBQSxJQUNGO0FBRUEsU0FBSyxtQkFBbUI7QUFDeEIsU0FBSyxpQkFBaUIsS0FBSztBQUMzQixTQUFLLE1BQU0sWUFBWSxLQUFLO0FBSzVCLFNBQUssTUFBTSxJQUFJLE9BQU8sU0FBUyxLQUFLLE1BQU0sS0FBSztBQUMvQyxTQUFLLGlCQUFpQixLQUFLLG1CQUFtQjtBQUM5QyxTQUFLLGVBQWUsS0FBSyxjQUFjO0FBQUEsRUFDekM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTU8sVUFBZ0I7QUFDckIsUUFBSSxDQUFDLEtBQUssa0JBQWtCO0FBQzFCO0FBQUEsSUFDRjtBQUVBLFNBQUssbUJBQW1CO0FBQ3hCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssbUJBQW1CO0FBR3hCLFNBQUssTUFBTSxJQUFJLE9BQU8sVUFBVSxLQUFLLE1BQU0sS0FBSztBQUNoRCxTQUFLLE1BQU0sWUFBWSxLQUFLO0FBQzVCLFNBQUssaUJBQWlCLEtBQUs7QUFBQSxFQUM3QjtBQUFBLEVBRVEsdUJBQW9DO0FBQzFDLFVBQU0sV0FBVyxLQUFLLE1BQU0sUUFBUSxTQUFTLFVBQVUsRUFBRSxLQUFLLFNBQVMsZUFBZSxDQUFDO0FBQ3ZGLFlBQVEsVUFBVSxnQkFBZ0I7QUFDbEMsYUFBUyxpQkFBaUIsU0FBUyxNQUFNO0FBQ3ZDLFdBQUssU0FBUztBQUFBLElBQ2hCLENBQUM7QUFDRCxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEscUJBQWtDO0FBQ3hDLFVBQU0sUUFBUSxLQUFLLE1BQU0sWUFBWSxjQUFjLEtBQUssVUFBVTtBQUNsRSx3QkFBb0IsT0FBTyxDQUFDLFNBQVMsaUJBQWlCLENBQUM7QUFDdkQsVUFBTSxXQUFXO0FBQUEsTUFDZixLQUFLLFNBQVM7QUFBQSxNQUNkLE1BQU0sS0FBSyxNQUFNLFFBQVE7QUFBQSxJQUMzQixDQUFDO0FBQ0QsVUFBTSxrQkFBa0IsTUFBTSxTQUFTLFVBQVUsRUFBRSxLQUFLLFNBQVMsY0FBYyxDQUFDO0FBQ2hGLFlBQVEsaUJBQWlCLGVBQWU7QUFDeEMsUUFBSSxLQUFLLHdCQUF3QjtBQUMvQixZQUFNLGlCQUFpQixNQUFNLFNBQVMsVUFBVSxFQUFFLEtBQUssU0FBUyxhQUFhLENBQUM7QUFDOUUsY0FBUSxnQkFBZ0IsY0FBYztBQUN0QyxpQkFBVyxnQkFBZ0IsUUFBUTtBQUNuQyxxQkFBZSxpQkFBaUIsU0FBUyxDQUFDLFdBQVc7QUFJbkQsZUFBTyxnQkFBZ0I7QUFDdkIsYUFBSyxNQUFNLE1BQU07QUFBQSxNQUNuQixDQUFDO0FBQUEsSUFDSDtBQUlBLFVBQU0saUJBQWlCLFNBQVMsTUFBTTtBQUNwQyxXQUFLLFFBQVE7QUFBQSxJQUNmLENBQUM7QUFHRCxVQUFNLGlCQUFpQixnQkFBZ0IsTUFBTTtBQUMzQyxZQUFNLFlBQVksU0FBUywwQkFBMEI7QUFBQSxJQUN2RCxDQUFDO0FBQ0QsV0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVRLGtCQUF3QjtBQUM5QixRQUFJLENBQUMsS0FBSyxlQUFlO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLG9CQUFnQixPQUFPLEtBQUssYUFBYTtBQUN6QyxTQUFLLGdCQUFnQjtBQUVyQixTQUFLLG1CQUFtQixPQUFPO0FBQy9CLFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFBQSxFQUVRLGVBQWUsT0FBMEI7QUFDL0MsU0FBSyxnQkFBZ0I7QUFBQSxNQUNuQjtBQUFBLE1BQ0EsT0FBTyxNQUFZO0FBQ2pCLGFBQUssU0FBUyxLQUFLO0FBQUEsTUFDckI7QUFBQSxNQUNBLFlBQVksS0FBSztBQUFBLElBQ25CO0FBQ0Esb0JBQWdCLElBQUksS0FBSyxhQUFhO0FBS3RDLFNBQUssb0JBQW9CLElBQUksa0JBQWtCLEtBQUssTUFBTSxHQUFHO0FBQzdELFNBQUssa0JBQWtCLEtBQUs7QUFBQSxFQUM5QjtBQUFBLEVBRVEsU0FBUyxPQUEwQjtBQUN6QyxVQUFNLFlBQVksU0FBUywwQkFBMEI7QUFFckQsVUFBTSxzQkFBc0I7QUFDNUIsVUFBTSxTQUFTLFNBQVMsMEJBQTBCO0FBQUEsRUFDcEQ7QUFBQSxFQUVRLGNBQW9CO0FBQzFCLFNBQUssZ0JBQWdCO0FBQ3JCLFNBQUssbUJBQW1CO0FBQ3hCLFNBQUssbUJBQW1CO0FBQUEsRUFDMUI7QUFBQSxFQUVRLHFCQUFxQixRQUEwQjtBQUNyRDtBQUFBO0FBQUE7QUFBQSxNQUdFLEtBQUssb0JBSUYsT0FBTyxhQUFhLEVBQUUsU0FBUyxLQUFLLE1BQU0sT0FBTyxLQUlqRCxPQUFPLFdBQVcsS0FBSyxNQUFNO0FBQUEsTUFDaEM7QUFDQTtBQUFBLElBQ0Y7QUFLQSxXQUFPLGVBQWU7QUFDdEIsV0FBTyx5QkFBeUI7QUFDaEMsU0FBSyxTQUFTO0FBQUEsRUFDaEI7QUFBQSxFQUVRLGFBQWEsT0FBb0I7QUFDdkMsU0FBSyxvQkFBb0Isb0JBQXNDO0FBQUEsTUFDN0QsU0FBUztBQUFBLE1BQ1QsWUFBWTtBQUFBLE1BQ1osY0FBYyxDQUFDLEVBQUUsU0FBUyxNQUFZO0FBQ3BDLGlCQUFTO0FBQ1QsYUFBSyxZQUFZO0FBQUEsTUFDbkI7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSxxQkFBMkI7QUFDakMsU0FBSyxnQkFBZ0IsT0FBTztBQUM1QixTQUFLLGlCQUFpQjtBQUFBLEVBQ3hCO0FBQ0Y7QUFFQSxTQUFTLFdBQVcsUUFBcUI7QUFDdkMsU0FBTyxlQUFlO0FBQ3RCLFNBQU8seUJBQXlCO0FBQ2hDLHVCQUFxQjtBQUN2QjtBQUVBLFNBQVMsZ0JBQWdCLE9BQWMsVUFBNEI7QUFDakUsTUFBSSxnQkFBZ0IsS0FBSyxHQUFHO0FBQzFCLHlCQUFxQjtBQUNyQjtBQUFBLEVBQ0Y7QUFFQSxXQUFTO0FBQ1g7QUFFQSxTQUFTLHFCQUEyQjtBQUNsQyxhQUFXLFNBQVMsaUJBQWlCO0FBQ25DLFVBQU0sTUFBTTtBQUFBLEVBQ2Q7QUFDRjtBQUVBLFNBQVMsc0JBQXNCLE9BQXVCO0FBQ3BELGFBQVcsU0FBUyxpQkFBaUI7QUFDbkMsUUFBSSxNQUFNLGVBQWUsT0FBTztBQUM5QixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGlCQUFpQixRQUFnQztBQUd4RCxTQUFPLGdCQUFnQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxXQUFXLGNBQWMsSUFBSSxPQUFPLEdBQUc7QUFDMUY7QUFFQSxTQUFTLGVBQXdCO0FBRy9CLGFBQVcsU0FBUyxpQkFBaUI7QUFDbkMsUUFBSSxDQUFDLE1BQU0sTUFBTSxhQUFhO0FBQzVCLHNCQUFnQixPQUFPLEtBQUs7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLGdCQUFnQixPQUFPO0FBQ2hDO0FBRUEsU0FBUyxnQkFBZ0IsT0FBdUI7QUFHOUMsU0FBTyxhQUFhLEtBQUssQ0FBQyxzQkFBc0IsS0FBSztBQUN2RDtBQUVBLFNBQVMsdUJBQTZCO0FBQ3BDLHFCQUFtQjtBQUNuQixTQUFPLEtBQUs7QUFDZDtBQUVBLFNBQVMsK0JBQStCLFFBQTZCO0FBQ25FLE1BQUksQ0FBQyxhQUFhLEtBQUssaUJBQWlCLE1BQU0sR0FBRztBQUMvQztBQUFBLEVBQ0Y7QUFFQSxhQUFXLE1BQU07QUFDbkI7QUFFQSxTQUFTLHdCQUF3QixRQUFxQjtBQUNwRCxNQUFJLENBQUMsYUFBYSxHQUFHO0FBQ25CO0FBQUEsRUFDRjtBQUVBLGFBQVcsTUFBTTtBQUNuQjsiLCJuYW1lcyI6W119
@@ -16,20 +16,20 @@ export type { CheckboxCommand, DropDownCommand, KeyboardCommand } from './modal-
16
16
  * Options for {@link SuggestModalCommandBuilder.build}.
17
17
  *
18
18
  * @deprecated Use {@link ModalCommandBuilderBuildOptions} from
19
- * `obsidian-dev-utils/obsidian/modals/modal-command-builder` instead.
19
+ * `@mnaoumov/obsidian-lib/modals/modal-command-builder` instead.
20
20
  */
21
21
  export type SuggestModalCommandBuilderBuildOptions = ModalCommandBuilderBuildOptions;
22
22
  /**
23
23
  * Builds a `SuggestModal`'s instruction bar.
24
24
  *
25
25
  * @deprecated Use {@link ModalCommandBuilder} from
26
- * `obsidian-dev-utils/obsidian/modals/modal-command-builder` instead.
26
+ * `@mnaoumov/obsidian-lib/modals/modal-command-builder` instead.
27
27
  */
28
28
  export declare const SuggestModalCommandBuilder: typeof ModalCommandBuilder;
29
29
  /**
30
30
  * Builds a `SuggestModal`'s instruction bar.
31
31
  *
32
32
  * @deprecated Use {@link ModalCommandBuilder} from
33
- * `obsidian-dev-utils/obsidian/modals/modal-command-builder` instead.
33
+ * `@mnaoumov/obsidian-lib/modals/modal-command-builder` instead.
34
34
  */
35
35
  export type SuggestModalCommandBuilder = ModalCommandBuilder;
@@ -8,4 +8,4 @@ const SuggestModalCommandBuilder = ModalCommandBuilder;
8
8
  export {
9
9
  SuggestModalCommandBuilder
10
10
  };
11
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL21vZGFscy9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBmb3JtZXIgaG9tZSBvZiB0aGUgYFN1Z2dlc3RNb2RhbGAgaW5zdHJ1Y3Rpb24tYmFyIGJ1aWxkZXIuXG4gKlxuICogVGhlIGJ1aWxkZXIgaXMgbm8gbG9uZ2VyIHRpZWQgdG8gYFN1Z2dlc3RNb2RhbGAgXHUyMDE0IGl0IHJlbmRlcnMgaW50byBhIHBsYWluIGBNb2RhbGAgYW5kIGludG8gYSBiYXJlXG4gKiBlbGVtZW50ICsgYFNjb3BlYCB0b28gXHUyMDE0IHNvIGl0IG1vdmVkIHRvIGBtb2RhbC1jb21tYW5kLWJ1aWxkZXIudHNgIHVuZGVyIHRoZSBob25lc3QgbmFtZVxuICoge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9LiBUaGlzIG1vZHVsZSBzdGF5cyBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMgc28gZXhpc3RpbmcgaW1wb3J0ZXJzIGtlZXAgd29ya2luZ1xuICogdW5jaGFuZ2VkOyBpdCByZS1leHBvcnRzIHRoZSB2ZXJ5IHNhbWUgY2xhc3MsIG5vdCBhIGNvcHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG5pbXBvcnQgeyBNb2RhbENvbW1hbmRCdWlsZGVyIH0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG5leHBvcnQgdHlwZSB7XG4gIENoZWNrYm94Q29tbWFuZCxcbiAgRHJvcERvd25Db21tYW5kLFxuICBLZXlib2FyZENvbW1hbmRcbn0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zfSBmcm9tXG4gKiBgb2JzaWRpYW4tZGV2LXV0aWxzL29ic2lkaWFuL21vZGFscy9tb2RhbC1jb21tYW5kLWJ1aWxkZXJgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zID0gTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucztcblxuLyoqXG4gKiBCdWlsZHMgYSBgU3VnZ2VzdE1vZGFsYCdzIGluc3RydWN0aW9uIGJhci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9IGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbW9kYWxzL21vZGFsLWNvbW1hbmQtYnVpbGRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyID0gTW9kYWxDb21tYW5kQnVpbGRlcjtcblxuLyoqXG4gKiBCdWlsZHMgYSBgU3VnZ2VzdE1vZGFsYCdzIGluc3RydWN0aW9uIGJhci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9IGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbW9kYWxzL21vZGFsLWNvbW1hbmQtYnVpbGRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIgPSBNb2RhbENvbW1hbmRCdWlsZGVyO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFhQSxTQUFTLDJCQUEyQjtBQXNCN0IsTUFBTSw2QkFBNkI7IiwKICAibmFtZXMiOiBbXQp9Cg==
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL21vZGFscy9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBmb3JtZXIgaG9tZSBvZiB0aGUgYFN1Z2dlc3RNb2RhbGAgaW5zdHJ1Y3Rpb24tYmFyIGJ1aWxkZXIuXG4gKlxuICogVGhlIGJ1aWxkZXIgaXMgbm8gbG9uZ2VyIHRpZWQgdG8gYFN1Z2dlc3RNb2RhbGAgXHUyMDE0IGl0IHJlbmRlcnMgaW50byBhIHBsYWluIGBNb2RhbGAgYW5kIGludG8gYSBiYXJlXG4gKiBlbGVtZW50ICsgYFNjb3BlYCB0b28gXHUyMDE0IHNvIGl0IG1vdmVkIHRvIGBtb2RhbC1jb21tYW5kLWJ1aWxkZXIudHNgIHVuZGVyIHRoZSBob25lc3QgbmFtZVxuICoge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9LiBUaGlzIG1vZHVsZSBzdGF5cyBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMgc28gZXhpc3RpbmcgaW1wb3J0ZXJzIGtlZXAgd29ya2luZ1xuICogdW5jaGFuZ2VkOyBpdCByZS1leHBvcnRzIHRoZSB2ZXJ5IHNhbWUgY2xhc3MsIG5vdCBhIGNvcHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG5pbXBvcnQgeyBNb2RhbENvbW1hbmRCdWlsZGVyIH0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG5leHBvcnQgdHlwZSB7XG4gIENoZWNrYm94Q29tbWFuZCxcbiAgRHJvcERvd25Db21tYW5kLFxuICBLZXlib2FyZENvbW1hbmRcbn0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zfSBmcm9tXG4gKiBgQG1uYW91bW92L29ic2lkaWFuLWxpYi9tb2RhbHMvbW9kYWwtY29tbWFuZC1idWlsZGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucyA9IE1vZGFsQ29tbWFuZEJ1aWxkZXJCdWlsZE9wdGlvbnM7XG5cbi8qKlxuICogQnVpbGRzIGEgYFN1Z2dlc3RNb2RhbGAncyBpbnN0cnVjdGlvbiBiYXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyfSBmcm9tXG4gKiBgQG1uYW91bW92L29ic2lkaWFuLWxpYi9tb2RhbHMvbW9kYWwtY29tbWFuZC1idWlsZGVyYCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIgPSBNb2RhbENvbW1hbmRCdWlsZGVyO1xuXG4vKipcbiAqIEJ1aWxkcyBhIGBTdWdnZXN0TW9kYWxgJ3MgaW5zdHJ1Y3Rpb24gYmFyLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlcn0gZnJvbVxuICogYEBtbmFvdW1vdi9vYnNpZGlhbi1saWIvbW9kYWxzL21vZGFsLWNvbW1hbmQtYnVpbGRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIgPSBNb2RhbENvbW1hbmRCdWlsZGVyO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFhQSxTQUFTLDJCQUEyQjtBQXNCN0IsTUFBTSw2QkFBNkI7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -2,10 +2,13 @@
2
2
  /**
3
3
  * @file
4
4
  *
5
- * Provides access to a process-wide shared-state bag used internally by `obsidian-dev-utils`.
5
+ * LEGACY: provides access to the process-wide shared-state bag on the `__obsidianDevUtils` global. The name is
6
+ * the retired `obsidian-dev-utils` package's; it stays because plugins bundling an older copy read and write the same
7
+ * bag, so it is a wire format rather than a name to copy. New generic state belongs in
8
+ * `@mnaoumov/typescript-lib/typescript-lib-state` (the `Symbol.for('@mnaoumov/typescript-lib/state')` slot).
6
9
  *
7
10
  * The bag is stored on `globalThis.__obsidianDevUtils`, i.e. on the global object of the realm in
8
- * which `obsidian-dev-utils` is loaded. Because a function's `globalThis` resolves to its defining
11
+ * which this library is loaded. Because a function's `globalThis` resolves to its defining
9
12
  * realm (not the caller's), every consumer that bundles the library in the main Obsidian renderer
10
13
  * shares the same bag, regardless of which window is currently active. This intentionally replaces
11
14
  * the previous `App`-scoped storage, so callers no longer need to pass an `App` instance.
@@ -64,4 +64,4 @@ export {
64
64
  resetObsidianDevUtilsState,
65
65
  shareTypescriptLibStateWithObsidianDevUtilsState
66
66
  };
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byBhIHByb2Nlc3Mtd2lkZSBzaGFyZWQtc3RhdGUgYmFnIHVzZWQgaW50ZXJuYWxseSBieSBgb2JzaWRpYW4tZGV2LXV0aWxzYC5cbiAqXG4gKiBUaGUgYmFnIGlzIHN0b3JlZCBvbiBgZ2xvYmFsVGhpcy5fX29ic2lkaWFuRGV2VXRpbHNgLCBpLmUuIG9uIHRoZSBnbG9iYWwgb2JqZWN0IG9mIHRoZSByZWFsbSBpblxuICogd2hpY2ggYG9ic2lkaWFuLWRldi11dGlsc2AgaXMgbG9hZGVkLiBCZWNhdXNlIGEgZnVuY3Rpb24ncyBgZ2xvYmFsVGhpc2AgcmVzb2x2ZXMgdG8gaXRzIGRlZmluaW5nXG4gKiByZWFsbSAobm90IHRoZSBjYWxsZXIncyksIGV2ZXJ5IGNvbnN1bWVyIHRoYXQgYnVuZGxlcyB0aGUgbGlicmFyeSBpbiB0aGUgbWFpbiBPYnNpZGlhbiByZW5kZXJlclxuICogc2hhcmVzIHRoZSBzYW1lIGJhZywgcmVnYXJkbGVzcyBvZiB3aGljaCB3aW5kb3cgaXMgY3VycmVudGx5IGFjdGl2ZS4gVGhpcyBpbnRlbnRpb25hbGx5IHJlcGxhY2VzXG4gKiB0aGUgcHJldmlvdXMgYEFwcGAtc2NvcGVkIHN0b3JhZ2UsIHNvIGNhbGxlcnMgbm8gbG9uZ2VyIG5lZWQgdG8gcGFzcyBhbiBgQXBwYCBpbnN0YW5jZS5cbiAqXG4gKiBUaGUgZ2VuZXJpYywgbm9uLU9ic2lkaWFuIHN0YXRlICh0aGUgZGVidWdnZXJzLCB0aGUgYGRlYnVnYCBpbnN0YW5jZSBhbmQgdGhlIHNoYXJlZCBhYm9ydCBjb250cm9sbGVyKSBsaXZlcyBpblxuICogYHR5cGVzY3JpcHQtbGliLXN0YXRlLnRzYCBpbnN0ZWFkLiB7QGxpbmsgc2hhcmVUeXBlc2NyaXB0TGliU3RhdGVXaXRoT2JzaWRpYW5EZXZVdGlsc1N0YXRlfSBsaW5rcyB0aGUgdHdvLCBzb1xuICogcGx1Z2lucyBidW5kbGluZyBhbiBvbGRlciBjb3B5IG9mIHRoaXMgbGlicmFyeSwgd2hpY2ggc3RpbGwga2VlcCB0aGF0IHN0YXRlIGhlcmUsIHNoYXJlIGl0IHdpdGggbmV3ZXIgb25lcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNPYmplY3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgeyBnZXRUeXBlc2NyaXB0TGliU3RhdGVTbG90IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGVzY3JpcHQtbGliLXN0YXRlJztcbmltcG9ydCB7IFZhbHVlV3JhcHBlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS13cmFwcGVyJztcblxuaW50ZXJmYWNlIE9ic2lkaWFuRGV2VXRpbHNXcmFwcGVyIHtcbiAgX19vYnNpZGlhbkRldlV0aWxzOiBHZW5lcmljT2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSBrZXlzIHdob3NlIHN0YXRlIG1vdmVkIGZyb20gYF9fb2JzaWRpYW5EZXZVdGlsc2AgdG8gdGhlIGdlbmVyaWMgc2hhcmVkIHN0YXRlLCBhbmQgd2hpY2ggb2xkZXIgY29waWVzIG9mXG4gKiB0aGlzIGxpYnJhcnkgc3RpbGwga2VlcCB1bmRlciBgX19vYnNpZGlhbkRldlV0aWxzYC5cbiAqL1xuY29uc3QgU0hBUkVEX1dJVEhfVFlQRVNDUklQVF9MSUJfU1RBVEVfS0VZUyA9IFsnZGVidWcnLCAnZGVidWdnZXJzJywgJ3NoYXJlZEFib3J0Q29udHJvbGxlciddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFJldHJpZXZlcyBvciBjcmVhdGVzIGEgc2hhcmVkLXN0YXRlIHtAbGluayBWYWx1ZVdyYXBwZXJ9IGZvciBhIGdpdmVuIGtleSBvbiBgZ2xvYmFsVGhpcy5fX29ic2lkaWFuRGV2VXRpbHNgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBzaGFyZWQgc3RhdGUgdmFsdWUuXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBzdG9yZSBvciByZXRyaWV2ZSB0aGUgc2hhcmVkIHN0YXRlIHVuZGVyLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHVzZSBpZiB0aGUgc2hhcmVkIHN0YXRlIGRvZXMgbm90IGV4aXN0IHlldC5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgVmFsdWVXcmFwcGVyfSB0aGF0IHN0b3JlcyB0aGUgc2hhcmVkIHN0YXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPFQ+KGtleTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiBWYWx1ZVdyYXBwZXI8VD4ge1xuICByZXR1cm4gKGdldE9ic2lkaWFuRGV2VXRpbHNCYWcoKVtrZXldID8/PSBWYWx1ZVdyYXBwZXIub2YoZGVmYXVsdFZhbHVlKSkgYXMgVmFsdWVXcmFwcGVyPFQ+O1xufVxuXG4vKipcbiAqIENsZWFycyB0aGUgc2hhcmVkLXN0YXRlIGJhZyBvbiBgZ2xvYmFsVGhpcy5fX29ic2lkaWFuRGV2VXRpbHNgLlxuICpcbiAqIEludGVuZGVkIGZvciB0ZXN0IGlzb2xhdGlvbjogY2FsbCBpdCBiZWZvcmUgZWFjaCB0ZXN0IHNvIGFjY3VtdWxhdGVkIHN0YXRlIChkZWJ1Z2dlcnMsIHF1ZXVlcyxcbiAqIHJlZ2lzdGVyZWQgaGFuZGxlcnMsIGV0Yy4pIGRvZXMgbm90IGxlYWsgYmV0d2VlbiB0ZXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCk6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9uby1nbG9iYWwtdGhpcyAtLSBUaGUgc2hhcmVkIHN0YXRlIGludGVudGlvbmFsbHkgbGl2ZXMgb24gdGhlIHJlYWxtIGdsb2JhbC5cbiAgKGdsb2JhbFRoaXMgYXMgUGFydGlhbDxPYnNpZGlhbkRldlV0aWxzV3JhcHBlcj4pLl9fb2JzaWRpYW5EZXZVdGlscyA9IHt9O1xufVxuXG4vKipcbiAqIE1ha2VzIHRoZSBnZW5lcmljIHNoYXJlZCBzdGF0ZSBhbmQgYF9fb2JzaWRpYW5EZXZVdGlsc2AgaG9sZCB0aGUgc2FtZSB7QGxpbmsgVmFsdWVXcmFwcGVyfSBmb3IgZWFjaCBrZXkgdGhhdFxuICogbW92ZWQgYmV0d2VlbiB0aGVtLlxuICpcbiAqIEEgd3JhcHBlciBhbHJlYWR5IHVuZGVyIGBfX29ic2lkaWFuRGV2VXRpbHNgIHdpbnMsIGJlY2F1c2UgYW4gb2xkZXIgY29weSBvZiB0aGlzIGxpYnJhcnkgbG9hZGVkIGZpcnN0IGFuZCBpdHNcbiAqIGNhbGxlcnMgYWxyZWFkeSBob2xkIHRoYXQgaW5zdGFuY2UuIE90aGVyd2lzZSB0aGUgZ2VuZXJpYyB3cmFwcGVyIGlzIHB1Ymxpc2hlZCB1bmRlciBgX19vYnNpZGlhbkRldlV0aWxzYCwgZm9yXG4gKiBvbGRlciBjb3BpZXMgbG9hZGVkIGxhdGVyIGFuZCBmb3IgdGhlIGRldnRvb2xzIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZVR5cGVzY3JpcHRMaWJTdGF0ZVdpdGhPYnNpZGlhbkRldlV0aWxzU3RhdGUoKTogdm9pZCB7XG4gIGNvbnN0IGJhZyA9IGdldE9ic2lkaWFuRGV2VXRpbHNCYWcoKTtcbiAgY29uc3QgdmFsdWVzID0gZ2V0VHlwZXNjcmlwdExpYlN0YXRlU2xvdCgpLnZhbHVlcztcbiAgZm9yIChjb25zdCBrZXkgb2YgU0hBUkVEX1dJVEhfVFlQRVNDUklQVF9MSUJfU1RBVEVfS0VZUykge1xuICAgIGNvbnN0IGxlZ2FjeVdyYXBwZXIgPSBiYWdba2V5XSBhcyB1bmRlZmluZWQgfCBWYWx1ZVdyYXBwZXI7XG4gICAgaWYgKGxlZ2FjeVdyYXBwZXIpIHtcbiAgICAgIHZhbHVlc1trZXldID0gbGVnYWN5V3JhcHBlcjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZXIgPSB2YWx1ZXNba2V5XTtcbiAgICBpZiAod3JhcHBlcikge1xuICAgICAgYmFnW2tleV0gPSB3cmFwcGVyO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPYnNpZGlhbkRldlV0aWxzQmFnKCk6IEdlbmVyaWNPYmplY3Qge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9uby1nbG9iYWwtdGhpcyAtLSBUaGUgc2hhcmVkIHN0YXRlIGludGVudGlvbmFsbHkgbGl2ZXMgb24gdGhlIHJlYWxtIGdsb2JhbC5cbiAgY29uc3Qgd3JhcHBlciA9IGdsb2JhbFRoaXMgYXMgUGFydGlhbDxPYnNpZGlhbkRldlV0aWxzV3JhcHBlcj47XG4gIHdyYXBwZXIuX19vYnNpZGlhbkRldlV0aWxzID8/PSB7fTtcbiAgcmV0dXJuIHdyYXBwZXIuX19vYnNpZGlhbkRldlV0aWxzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxTQUFTLGlDQUFpQztBQUMxQyxTQUFTLG9CQUFvQjtBQVU3QixNQUFNLHdDQUF3QyxDQUFDLFNBQVMsYUFBYSx1QkFBdUI7QUFVckYsU0FBUyx5QkFBNEIsS0FBYSxjQUFrQztBQUN6RixTQUFRLHVCQUF1QixFQUFFLEdBQUcsTUFBTSxhQUFhLEdBQUcsWUFBWTtBQUN4RTtBQVFPLFNBQVMsNkJBQW1DO0FBRWpELEVBQUMsV0FBZ0QscUJBQXFCLENBQUM7QUFDekU7QUFVTyxTQUFTLG1EQUF5RDtBQUN2RSxRQUFNLE1BQU0sdUJBQXVCO0FBQ25DLFFBQU0sU0FBUywwQkFBMEIsRUFBRTtBQUMzQyxhQUFXLE9BQU8sdUNBQXVDO0FBQ3ZELFVBQU0sZ0JBQWdCLElBQUksR0FBRztBQUM3QixRQUFJLGVBQWU7QUFDakIsYUFBTyxHQUFHLElBQUk7QUFDZDtBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQVUsT0FBTyxHQUFHO0FBQzFCLFFBQUksU0FBUztBQUNYLFVBQUksR0FBRyxJQUFJO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMseUJBQXdDO0FBRS9DLFFBQU0sVUFBVTtBQUNoQixVQUFRLHVCQUF1QixDQUFDO0FBQ2hDLFNBQU8sUUFBUTtBQUNqQjsiLCJuYW1lcyI6W119
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIExFR0FDWTogcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBwcm9jZXNzLXdpZGUgc2hhcmVkLXN0YXRlIGJhZyBvbiB0aGUgYF9fb2JzaWRpYW5EZXZVdGlsc2AgZ2xvYmFsLiBUaGUgbmFtZSBpc1xuICogdGhlIHJldGlyZWQgYG9ic2lkaWFuLWRldi11dGlsc2AgcGFja2FnZSdzOyBpdCBzdGF5cyBiZWNhdXNlIHBsdWdpbnMgYnVuZGxpbmcgYW4gb2xkZXIgY29weSByZWFkIGFuZCB3cml0ZSB0aGUgc2FtZVxuICogYmFnLCBzbyBpdCBpcyBhIHdpcmUgZm9ybWF0IHJhdGhlciB0aGFuIGEgbmFtZSB0byBjb3B5LiBOZXcgZ2VuZXJpYyBzdGF0ZSBiZWxvbmdzIGluXG4gKiBgQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGVzY3JpcHQtbGliLXN0YXRlYCAodGhlIGBTeW1ib2wuZm9yKCdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvc3RhdGUnKWAgc2xvdCkuXG4gKlxuICogVGhlIGJhZyBpcyBzdG9yZWQgb24gYGdsb2JhbFRoaXMuX19vYnNpZGlhbkRldlV0aWxzYCwgaS5lLiBvbiB0aGUgZ2xvYmFsIG9iamVjdCBvZiB0aGUgcmVhbG0gaW5cbiAqIHdoaWNoIHRoaXMgbGlicmFyeSBpcyBsb2FkZWQuIEJlY2F1c2UgYSBmdW5jdGlvbidzIGBnbG9iYWxUaGlzYCByZXNvbHZlcyB0byBpdHMgZGVmaW5pbmdcbiAqIHJlYWxtIChub3QgdGhlIGNhbGxlcidzKSwgZXZlcnkgY29uc3VtZXIgdGhhdCBidW5kbGVzIHRoZSBsaWJyYXJ5IGluIHRoZSBtYWluIE9ic2lkaWFuIHJlbmRlcmVyXG4gKiBzaGFyZXMgdGhlIHNhbWUgYmFnLCByZWdhcmRsZXNzIG9mIHdoaWNoIHdpbmRvdyBpcyBjdXJyZW50bHkgYWN0aXZlLiBUaGlzIGludGVudGlvbmFsbHkgcmVwbGFjZXNcbiAqIHRoZSBwcmV2aW91cyBgQXBwYC1zY29wZWQgc3RvcmFnZSwgc28gY2FsbGVycyBubyBsb25nZXIgbmVlZCB0byBwYXNzIGFuIGBBcHBgIGluc3RhbmNlLlxuICpcbiAqIFRoZSBnZW5lcmljLCBub24tT2JzaWRpYW4gc3RhdGUgKHRoZSBkZWJ1Z2dlcnMsIHRoZSBgZGVidWdgIGluc3RhbmNlIGFuZCB0aGUgc2hhcmVkIGFib3J0IGNvbnRyb2xsZXIpIGxpdmVzIGluXG4gKiBgdHlwZXNjcmlwdC1saWItc3RhdGUudHNgIGluc3RlYWQuIHtAbGluayBzaGFyZVR5cGVzY3JpcHRMaWJTdGF0ZVdpdGhPYnNpZGlhbkRldlV0aWxzU3RhdGV9IGxpbmtzIHRoZSB0d28sIHNvXG4gKiBwbHVnaW5zIGJ1bmRsaW5nIGFuIG9sZGVyIGNvcHkgb2YgdGhpcyBsaWJyYXJ5LCB3aGljaCBzdGlsbCBrZWVwIHRoYXQgc3RhdGUgaGVyZSwgc2hhcmUgaXQgd2l0aCBuZXdlciBvbmVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5cbmltcG9ydCB7IGdldFR5cGVzY3JpcHRMaWJTdGF0ZVNsb3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZXNjcmlwdC1saWItc3RhdGUnO1xuaW1wb3J0IHsgVmFsdWVXcmFwcGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3ZhbHVlLXdyYXBwZXInO1xuXG5pbnRlcmZhY2UgT2JzaWRpYW5EZXZVdGlsc1dyYXBwZXIge1xuICBfX29ic2lkaWFuRGV2VXRpbHM6IEdlbmVyaWNPYmplY3Q7XG59XG5cbi8qKlxuICogVGhlIGtleXMgd2hvc2Ugc3RhdGUgbW92ZWQgZnJvbSBgX19vYnNpZGlhbkRldlV0aWxzYCB0byB0aGUgZ2VuZXJpYyBzaGFyZWQgc3RhdGUsIGFuZCB3aGljaCBvbGRlciBjb3BpZXMgb2ZcbiAqIHRoaXMgbGlicmFyeSBzdGlsbCBrZWVwIHVuZGVyIGBfX29ic2lkaWFuRGV2VXRpbHNgLlxuICovXG5jb25zdCBTSEFSRURfV0lUSF9UWVBFU0NSSVBUX0xJQl9TVEFURV9LRVlTID0gWydkZWJ1ZycsICdkZWJ1Z2dlcnMnLCAnc2hhcmVkQWJvcnRDb250cm9sbGVyJ10gYXMgY29uc3Q7XG5cbi8qKlxuICogUmV0cmlldmVzIG9yIGNyZWF0ZXMgYSBzaGFyZWQtc3RhdGUge0BsaW5rIFZhbHVlV3JhcHBlcn0gZm9yIGEgZ2l2ZW4ga2V5IG9uIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5EZXZVdGlsc2AuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHNoYXJlZCBzdGF0ZSB2YWx1ZS5cbiAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IHRvIHN0b3JlIG9yIHJldHJpZXZlIHRoZSBzaGFyZWQgc3RhdGUgdW5kZXIuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gVGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIHRoZSBzaGFyZWQgc3RhdGUgZG9lcyBub3QgZXhpc3QgeWV0LlxuICogQHJldHVybnMgVGhlIHtAbGluayBWYWx1ZVdyYXBwZXJ9IHRoYXQgc3RvcmVzIHRoZSBzaGFyZWQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8VD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCk6IFZhbHVlV3JhcHBlcjxUPiB7XG4gIHJldHVybiAoZ2V0T2JzaWRpYW5EZXZVdGlsc0JhZygpW2tleV0gPz89IFZhbHVlV3JhcHBlci5vZihkZWZhdWx0VmFsdWUpKSBhcyBWYWx1ZVdyYXBwZXI8VD47XG59XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBzaGFyZWQtc3RhdGUgYmFnIG9uIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5EZXZVdGlsc2AuXG4gKlxuICogSW50ZW5kZWQgZm9yIHRlc3QgaXNvbGF0aW9uOiBjYWxsIGl0IGJlZm9yZSBlYWNoIHRlc3Qgc28gYWNjdW11bGF0ZWQgc3RhdGUgKGRlYnVnZ2VycywgcXVldWVzLFxuICogcmVnaXN0ZXJlZCBoYW5kbGVycywgZXRjLikgZG9lcyBub3QgbGVhayBiZXR3ZWVuIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoKTogdm9pZCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzIC0tIFRoZSBzaGFyZWQgc3RhdGUgaW50ZW50aW9uYWxseSBsaXZlcyBvbiB0aGUgcmVhbG0gZ2xvYmFsLlxuICAoZ2xvYmFsVGhpcyBhcyBQYXJ0aWFsPE9ic2lkaWFuRGV2VXRpbHNXcmFwcGVyPikuX19vYnNpZGlhbkRldlV0aWxzID0ge307XG59XG5cbi8qKlxuICogTWFrZXMgdGhlIGdlbmVyaWMgc2hhcmVkIHN0YXRlIGFuZCBgX19vYnNpZGlhbkRldlV0aWxzYCBob2xkIHRoZSBzYW1lIHtAbGluayBWYWx1ZVdyYXBwZXJ9IGZvciBlYWNoIGtleSB0aGF0XG4gKiBtb3ZlZCBiZXR3ZWVuIHRoZW0uXG4gKlxuICogQSB3cmFwcGVyIGFscmVhZHkgdW5kZXIgYF9fb2JzaWRpYW5EZXZVdGlsc2Agd2lucywgYmVjYXVzZSBhbiBvbGRlciBjb3B5IG9mIHRoaXMgbGlicmFyeSBsb2FkZWQgZmlyc3QgYW5kIGl0c1xuICogY2FsbGVycyBhbHJlYWR5IGhvbGQgdGhhdCBpbnN0YW5jZS4gT3RoZXJ3aXNlIHRoZSBnZW5lcmljIHdyYXBwZXIgaXMgcHVibGlzaGVkIHVuZGVyIGBfX29ic2lkaWFuRGV2VXRpbHNgLCBmb3JcbiAqIG9sZGVyIGNvcGllcyBsb2FkZWQgbGF0ZXIgYW5kIGZvciB0aGUgZGV2dG9vbHMgY29uc29sZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlVHlwZXNjcmlwdExpYlN0YXRlV2l0aE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgpOiB2b2lkIHtcbiAgY29uc3QgYmFnID0gZ2V0T2JzaWRpYW5EZXZVdGlsc0JhZygpO1xuICBjb25zdCB2YWx1ZXMgPSBnZXRUeXBlc2NyaXB0TGliU3RhdGVTbG90KCkudmFsdWVzO1xuICBmb3IgKGNvbnN0IGtleSBvZiBTSEFSRURfV0lUSF9UWVBFU0NSSVBUX0xJQl9TVEFURV9LRVlTKSB7XG4gICAgY29uc3QgbGVnYWN5V3JhcHBlciA9IGJhZ1trZXldIGFzIHVuZGVmaW5lZCB8IFZhbHVlV3JhcHBlcjtcbiAgICBpZiAobGVnYWN5V3JhcHBlcikge1xuICAgICAgdmFsdWVzW2tleV0gPSBsZWdhY3lXcmFwcGVyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgd3JhcHBlciA9IHZhbHVlc1trZXldO1xuICAgIGlmICh3cmFwcGVyKSB7XG4gICAgICBiYWdba2V5XSA9IHdyYXBwZXI7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9ic2lkaWFuRGV2VXRpbHNCYWcoKTogR2VuZXJpY09iamVjdCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzIC0tIFRoZSBzaGFyZWQgc3RhdGUgaW50ZW50aW9uYWxseSBsaXZlcyBvbiB0aGUgcmVhbG0gZ2xvYmFsLlxuICBjb25zdCB3cmFwcGVyID0gZ2xvYmFsVGhpcyBhcyBQYXJ0aWFsPE9ic2lkaWFuRGV2VXRpbHNXcmFwcGVyPjtcbiAgd3JhcHBlci5fX29ic2lkaWFuRGV2VXRpbHMgPz89IHt9O1xuICByZXR1cm4gd3JhcHBlci5fX29ic2lkaWFuRGV2VXRpbHM7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLFNBQVMsaUNBQWlDO0FBQzFDLFNBQVMsb0JBQW9CO0FBVTdCLE1BQU0sd0NBQXdDLENBQUMsU0FBUyxhQUFhLHVCQUF1QjtBQVVyRixTQUFTLHlCQUE0QixLQUFhLGNBQWtDO0FBQ3pGLFNBQVEsdUJBQXVCLEVBQUUsR0FBRyxNQUFNLGFBQWEsR0FBRyxZQUFZO0FBQ3hFO0FBUU8sU0FBUyw2QkFBbUM7QUFFakQsRUFBQyxXQUFnRCxxQkFBcUIsQ0FBQztBQUN6RTtBQVVPLFNBQVMsbURBQXlEO0FBQ3ZFLFFBQU0sTUFBTSx1QkFBdUI7QUFDbkMsUUFBTSxTQUFTLDBCQUEwQixFQUFFO0FBQzNDLGFBQVcsT0FBTyx1Q0FBdUM7QUFDdkQsVUFBTSxnQkFBZ0IsSUFBSSxHQUFHO0FBQzdCLFFBQUksZUFBZTtBQUNqQixhQUFPLEdBQUcsSUFBSTtBQUNkO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBVSxPQUFPLEdBQUc7QUFDMUIsUUFBSSxTQUFTO0FBQ1gsVUFBSSxHQUFHLElBQUk7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyx5QkFBd0M7QUFFL0MsUUFBTSxVQUFVO0FBQ2hCLFVBQVEsdUJBQXVCLENBQUM7QUFDaEMsU0FBTyxRQUFRO0FBQ2pCOyIsIm5hbWVzIjpbXX0=
@@ -3,10 +3,24 @@
3
3
  * @file
4
4
  *
5
5
  * This module provides classes and validators for managing include/exclude path settings.
6
+ *
7
+ * An entry takes one of three forms, and every form matches case-insensitively:
8
+ *
9
+ * - A regular expression literal, `/pattern/flags`. Its own flags are honoured and `i` is always added. `g` and `y` are
10
+ * accepted and dropped, since they make `RegExp.test` stateful and say nothing about which paths match.
11
+ * - A glob, an entry holding an unescaped `*`, `?` or `[`. `*` matches within one path segment, `**` across segments,
12
+ * `?` one character and `[abc]` / `[!abc]` a character class. A glob with no `/` matches a file or folder NAME at any
13
+ * depth, as in `.gitignore` (`*.pdf` matches `a/b/c.pdf`); one with a `/` is anchored to the vault root
14
+ * (`Attachments/*.pdf`). A trailing `/` makes it match folders only.
15
+ * - A plain path, every other entry, which matches that path and everything inside it. A literal `*`, `?`, `[` or `\` in
16
+ * a plain path or a glob is written escaped (`\*`).
6
17
  */
7
18
  import type { MaybeReturn } from '@mnaoumov/typescript-lib/type';
8
19
  /**
9
20
  * A class for managing include/exclude path settings.
21
+ *
22
+ * See the module documentation for the entry syntax: plain paths, globs and regular expression literals, all matched
23
+ * case-insensitively.
10
24
  */
11
25
  export declare class PathSettings {
12
26
  /**
@@ -39,16 +53,18 @@ export declare class PathSettings {
39
53
  * Checks if a path is ignored by the include/exclude path settings.
40
54
  *
41
55
  * @param path - The path to check.
56
+ * @param isFolder - Whether the path is a folder. Only a folder-only glob (one ending in `/`) reads it: such a glob
57
+ * always matches the contents of a matching folder, and matches the folder itself only when this is `true`.
42
58
  * @returns `true` if the path is ignored, `false` otherwise.
43
59
  */
44
- isPathIgnored(path: string): boolean;
60
+ isPathIgnored(path: string, isFolder?: boolean): boolean;
45
61
  }
46
62
  /**
47
- * Validates include/exclude path entries, reporting the first entry that is not a parseable regular expression.
63
+ * Validates include/exclude path entries, reporting the first entry that is not a valid regular expression or glob.
48
64
  *
49
- * An entry that starts and ends with `/` is a regular expression literal; every other entry is a plain path and is
50
- * always valid. An invalid entry does not throw when assigned to {@link PathSettings} — the whole list falls back to
51
- * its default pattern instead — so this validator is what surfaces the problem to the user.
65
+ * An invalid entry does not throw when assigned to {@link PathSettings} — the whole list falls back to its default
66
+ * pattern instead — so this validator is what surfaces the problem to the user. The message names the entry and the
67
+ * reason it is invalid.
52
68
  *
53
69
  * @param paths - The path entries to validate.
54
70
  * @returns A message naming the first invalid entry, or nothing when every entry is valid.