@mnaoumov/obsidian-lib 10.5.0 → 10.6.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 (160) hide show
  1. package/README.md +6 -0
  2. package/codemirror/inline-token-widgets/package.json +6 -0
  3. package/codemirror/settings-facet/package.json +6 -0
  4. package/components/settings-facet-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +104 -1
  6. package/dist/lib/cjs/__merged.d.cts +20 -3
  7. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  8. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  9. package/dist/lib/cjs/backlink-index.cjs +44 -8
  10. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  11. package/dist/lib/cjs/bug-report.cjs +4 -2
  12. package/dist/lib/cjs/bug-report.d.cts +1 -1
  13. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  14. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  15. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/community-plugins.cjs +19 -2
  25. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  26. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  27. package/dist/lib/cjs/components/index.cjs +4 -1
  28. package/dist/lib/cjs/components/index.d.cts +1 -0
  29. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  30. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  31. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  32. package/dist/lib/cjs/css-class.cjs +8 -1
  33. package/dist/lib/cjs/css-class.d.cts +28 -0
  34. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  35. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  36. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  37. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  38. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  39. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  40. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  41. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  42. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  43. package/dist/lib/cjs/hotkey.cjs +185 -0
  44. package/dist/lib/cjs/hotkey.d.cts +59 -0
  45. package/dist/lib/cjs/i18n/locales/en.cjs +14 -1
  46. package/dist/lib/cjs/i18n/locales/en.d.cts +13 -0
  47. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +13 -0
  48. package/dist/lib/cjs/index.cjs +31 -1
  49. package/dist/lib/cjs/index.d.cts +10 -0
  50. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  51. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  52. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  53. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  54. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  55. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  56. package/dist/lib/cjs/markdown.cjs +6 -1
  57. package/dist/lib/cjs/markdown.d.cts +10 -1
  58. package/dist/lib/cjs/modals/modal.cjs +8 -5
  59. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  60. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  61. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  62. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  63. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  64. package/dist/lib/cjs/request-url.cjs +523 -0
  65. package/dist/lib/cjs/request-url.d.cts +233 -0
  66. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  67. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  68. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  69. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  70. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  71. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  72. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  73. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  74. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  75. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  76. package/dist/lib/cjs/setting-ex.cjs +51 -1
  77. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  78. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  79. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  80. package/dist/lib/esm/__merged.d.mts +20 -3
  81. package/dist/lib/esm/__merged.mjs +110 -2
  82. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  83. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  84. package/dist/lib/esm/backlink-index.d.mts +23 -0
  85. package/dist/lib/esm/backlink-index.mjs +42 -7
  86. package/dist/lib/esm/bug-report.d.mts +1 -1
  87. package/dist/lib/esm/bug-report.mjs +4 -2
  88. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  89. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  90. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  91. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  92. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  93. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  94. package/dist/lib/esm/codemirror/index.mjs +5 -1
  95. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  96. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  97. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  98. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  99. package/dist/lib/esm/community-plugins.d.mts +14 -0
  100. package/dist/lib/esm/community-plugins.mjs +18 -2
  101. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  102. package/dist/lib/esm/components/index.d.mts +1 -0
  103. package/dist/lib/esm/components/index.mjs +3 -1
  104. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  105. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  106. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  107. package/dist/lib/esm/css-class.d.mts +28 -0
  108. package/dist/lib/esm/css-class.mjs +8 -1
  109. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  110. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  111. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  112. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  113. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  114. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  115. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  116. package/dist/lib/esm/editor-suggest.mjs +109 -0
  117. package/dist/lib/esm/generated-during-build.mjs +2 -2
  118. package/dist/lib/esm/hotkey.d.mts +59 -0
  119. package/dist/lib/esm/hotkey.mjs +95 -0
  120. package/dist/lib/esm/i18n/locales/en.d.mts +13 -0
  121. package/dist/lib/esm/i18n/locales/en.mjs +14 -1
  122. package/dist/lib/esm/i18n/locales/translations-map.d.mts +13 -0
  123. package/dist/lib/esm/index.d.mts +10 -0
  124. package/dist/lib/esm/index.mjs +21 -1
  125. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  126. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  127. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  128. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  129. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  130. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  131. package/dist/lib/esm/markdown.d.mts +10 -1
  132. package/dist/lib/esm/markdown.mjs +9 -1
  133. package/dist/lib/esm/modals/modal.d.mts +4 -0
  134. package/dist/lib/esm/modals/modal.mjs +8 -5
  135. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  136. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  137. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  138. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  139. package/dist/lib/esm/request-url.d.mts +233 -0
  140. package/dist/lib/esm/request-url.mjs +428 -0
  141. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  142. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  143. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  144. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  145. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  146. package/dist/lib/esm/setting-components/index.mjs +9 -1
  147. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  148. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  149. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  150. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  151. package/dist/lib/esm/setting-ex.d.mts +35 -1
  152. package/dist/lib/esm/setting-ex.mjs +51 -1
  153. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  154. package/dist/lib/esm/settings-tabs.mjs +170 -0
  155. package/dist/styles.css +83 -1
  156. package/package.json +3 -3
  157. package/setting-components/folder-list-component/package.json +6 -0
  158. package/setting-components/hotkey-component/package.json +6 -0
  159. package/setting-components/list-component/package.json +6 -0
  160. package/setting-components/tag-list-component/package.json +6 -0
@@ -1,22 +1,26 @@
1
1
  /// <reference path="./library-references.d.cts" />
2
2
  export { AppActiveFileProvider } from './active-file-provider.cjs';
3
+ export { AnchoredSuggest } from './anchored-suggest.cjs';
3
4
  export { getApp } from './app.cjs';
4
5
  export { retryWithTimeoutNotice, runWithTimeoutNotice } from './async-with-notice.cjs';
5
6
  export { AttachmentPathContext, CUSTOM_ATTACHMENT_LOCATION_PLUGIN_ID, DUMMY_PATH, getAttachmentFilePath, getAttachmentFolderPath, getAttachmentFolderPathForAttachment, getAttachmentFolderPathSyncOrNull, getAvailablePathForAttachments, getCheckIsAttachmentUnitFolderFunction, hasOwnAttachmentFolder, isAtProperAttachmentPath } from './attachment-path.cjs';
6
7
  export { findAttachmentUnitFolderPath, rebasePathOntoFolder } from './attachment-unit-folder.cjs';
7
- export { getIndexedBacklinksForFile } from './backlink-index.cjs';
8
+ export { getIndexedBacklinksForFile, iterateReferencesAffectedByRename } from './backlink-index.cjs';
8
9
  export { renderBacklinksTable, renderDelayedBacklinks, renderDelayedBacklinksForFolder } from './backlink.cjs';
9
10
  export { PluginBasesViewRegistrar } from './bases-view-registrar.cjs';
10
11
  export { BUG_REPORT_ISSUE_FORM_TEMPLATE, BugReportIssueFormFieldId, formatBugReportEnvironment, getBugReportEnvironment, getBugReportIssueFormUrl, getGitHubIssueFormUrl } from './bug-report.cjs';
11
- export { registerBulkOperationProgressListener, reportBulkOperationProgress } from './bulk-operation-progress.cjs';
12
+ export { BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS, holdBulkOperationWhile, registerBulkOperationProgressListener, reportBulkOperationProgress } from './bulk-operation-progress.cjs';
12
13
  export { buildBeforeOperationCommitSubject, buildOperationCommitMessage, BULK_OPERATION_LOCK_FILE_NAME, BULK_OPERATION_LOCK_STALE_AFTER_IN_MILLISECONDS, formatOperationId, getNextOperationId, isBulkOperationLock, isBulkOperationLockStale, OPERATION_TRAILER_KEY, parseBulkOperationCommit, parseOperationNumber, PLUGIN_TRAILER_KEY } from './bulk-operation.cjs';
13
14
  export { CalloutMode, renderCallout, wrapForCallout } from './callout.cjs';
14
15
  export { getCanvasReferences } from './canvas.cjs';
15
16
  export { CaseInsensitiveFileIndex, getCaseInsensitiveFileIndex, setCaseInsensitiveFileIndex, unsetCaseInsensitiveFileIndex } from './case-insensitive-file-index.cjs';
16
17
  export { createCodeBlockRegExp } from './code-block-reg-exp.cjs';
18
+ export { captureCodeBlockFocus, claimCodeBlockRenderHandoff, CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS, recordCodeBlockRenderHandoff, restoreCodeBlockFocus } from './code-block-render-handoff.cjs';
17
19
  export { createIncrementalParseStateField } from './codemirror/incremental-parse-state-field.cjs';
20
+ export { createInlineTokenWidgetsExtension, execAll, toGlobalRegExp } from './codemirror/inline-token-widgets.cjs';
18
21
  export { dispatchToAllMarkdownEditorViews, getAllMarkdownEditorViews } from './codemirror/markdown-editor-views.cjs';
19
22
  export { rangeSetToArray } from './codemirror/range-set.cjs';
23
+ export { createSettingsFacet } from './codemirror/settings-facet.cjs';
20
24
  export { AbstractFileCommandHandler } from './command-handlers/abstract-file-command-handler.cjs';
21
25
  export { CommandHandlerComponent } from './command-handlers/command-handler-component.cjs';
22
26
  export { CommandHandler } from './command-handlers/command-handler.cjs';
@@ -30,7 +34,7 @@ export { OpenSettingsCommandHandler } from './command-handlers/open-settings-com
30
34
  export { UndoBulkOperationCommandHandler } from './command-handlers/undo-bulk-operation-command-handler.cjs';
31
35
  export { UnlockActiveNoteCommandHandler } from './command-handlers/unlock-active-note-command-handler.cjs';
32
36
  export { PluginCommandRegistrar } from './command-registrar.cjs';
33
- export { configureCommunityPlugin, ConfigureCommunityPluginResult, disableCommunityPlugin, enableCommunityPlugin, getCommunityPluginRepo, getLatestReleaseVersion, installCommunityPlugin, installConfigureEnableCommunityPlugin, searchCommunityPlugins, toggleEnableCommunityPlugin, toggleInstallCommunityPlugin, uninstallCommunityPlugin, updateCommunityPlugin, UpdateCommunityPluginResult } from './community-plugins.cjs';
37
+ export { configureCommunityPlugin, ConfigureCommunityPluginResult, disableCommunityPlugin, enableCommunityPlugin, getCommunityPluginRepo, getLatestReleaseVersion, installCommunityPlugin, installConfigureEnableCommunityPlugin, PluginEnableRefusedError, searchCommunityPlugins, toggleEnableCommunityPlugin, toggleInstallCommunityPlugin, uninstallCommunityPlugin, updateCommunityPlugin, UpdateCommunityPluginResult } from './community-plugins.cjs';
34
38
  export { AbortSignalComponent } from './components/abort-signal-component.cjs';
35
39
  export { AllWindowsEventComponent } from './components/all-windows-event-component.cjs';
36
40
  export { AsyncErrorHandlerComponent } from './components/async-error-handler-component.cjs';
@@ -62,6 +66,7 @@ export { RegistryComponent } from './components/registry-component.cjs';
62
66
  export { ReleaseNotesComponent } from './components/release-notes-component.cjs';
63
67
  export { EmptyFolderBehavior, RenameDeleteHandlerComponent } from './components/rename-delete-handler-component.cjs';
64
68
  export { NOT_EMPTY_DIRECTORY_ERROR_CODE, RmdirGuardComponent } from './components/rmdir-guard-component.cjs';
69
+ export { SettingsFacetComponent } from './components/settings-facet-component.cjs';
65
70
  export { SettingsMigrationComponent } from './components/settings-migration-component.cjs';
66
71
  export { SyntaxHighlightingComponent } from './components/syntax-highlighting-component.cjs';
67
72
  export { TemplatesLanguageComponent } from './components/templates-language-component.cjs';
@@ -81,8 +86,10 @@ export { getDemoVaultArchiveFileName, getDemoVaultFolderName } from './demo-vaul
81
86
  export { BulkOperationGitRepo, GitCommandError } from './desktop-bulk-operation-git.cjs';
82
87
  export { openDemoVault } from './desktop-demo-vault-opener.cjs';
83
88
  export { getDesktopOperatingSystem } from './desktop-operating-system.cjs';
89
+ export { openDesktopRequestUrlStream } from './desktop-request-url-stream.cjs';
84
90
  export { PluginEditorExtensionRegistrar } from './editor-extension-registrar.cjs';
85
91
  export { PluginEditorSuggestRegistrar } from './editor-suggest-registrar.cjs';
92
+ export { CommandEditorSuggest, prioritizeEditorSuggest } from './editor-suggest.cjs';
86
93
  export { syncOpenEditorBuffersForPath, toggleEditorReadOnly } from './editor.cjs';
87
94
  export { EventRefDisposable, subscribeDisposableEvent, subscribeEvent } from './events.cjs';
88
95
  export { PluginExtensionsRegistrar } from './extensions-registrar.cjs';
@@ -95,14 +102,17 @@ export { enableFrontmatterFormattingPreservation, preserveFrontmatterFormatting
95
102
  export { isFrontmatterLinkCacheWithOffsets, toFrontmatterLinkCacheWithOffsets } from './frontmatter-link-cache-with-offsets.cjs';
96
103
  export { checkIsPlainObject, parseFrontmatter, registerFrontmatterFormattingPreserver, removeEmptyFrontmatterValues, setFrontmatter } from './frontmatter.cjs';
97
104
  export { LIBRARY_STYLES, LIBRARY_VERSION } from './generated-during-build.cjs';
105
+ export { formatHotkey, getHotkeyFromKeyboardEvent, isSameHotkey } from './hotkey.cjs';
98
106
  export { PluginHoverLinkSourceRegistrar } from './hover-link-source-registrar.cjs';
99
107
  export { appendCodeBlock, appendTextOrFragmentClone, applySpellcheckMode, asCodeBlock, createFragmentWithCodeBlocks } from './html-element.cjs';
100
108
  export { DEFAULT_NS, initI18N, t } from './i18n/i18n.cjs';
101
109
  export { en } from './i18n/locales/en.cjs';
102
110
  export { DEFAULT_LANGUAGE, defaultTranslationsMap } from './i18n/locales/translations-map.cjs';
111
+ export { createInlineTokenPostProcessor, DEFAULT_INLINE_TOKEN_SKIP_SELECTOR, registerInlineTokenRenderer } from './inline-token-renderer.cjs';
103
112
  export { isInObsidian } from './is-in-obsidian.cjs';
104
113
  export { injectLibraryStyles, LAST_LIBRARY_VERSION_KEY, LIBRARY_STYLES_ELEMENT_ID } from './library-styles.cjs';
105
114
  export { OBSIDIAN_LIBRARY_NAME, ObsidianLibrary } from './library.cjs';
115
+ export { getLinkAndTagCompletionTrigger, getVaultTagSuggestions, LinkAndTagCompletionKind, LinkAndTagInputSuggest } from './link-and-tag-input-suggest.cjs';
106
116
  export { normalizeLinkName } from './link-name.cjs';
107
117
  export { buildBacklinksSnapshot, convertLink, editBacklinks, editBacklinksSnapshot, editReferences, editReferencesInContent, extractReferenceFile, generateMarkdownLink, generateRawMarkdownLink, getGenerateMarkdownLinkDefaultParamsFns, hasAngleBrackets, hasEmbedSyntax, hasLeadingDot, hasLeadingSlash, hasWikilinkSyntax, LinkPathStyle, LinkStyle, shouldResetAlias, splitSubpath, updateFileUrlLinksInContent, updateFileUrlLinksInFile, updateLink, updateReferencesInContent, updateReferencesInFile } from './link.cjs';
108
118
  export { invokeAsyncAndLog } from './logger.cjs';
@@ -150,6 +160,8 @@ export { checkPropertyEntryMatches, isPropertyEntry, PROPERTY_ENTRY_PREFIX } fro
150
160
  export { addToQueue, addToQueueAndWait, flushQueue } from './queue.cjs';
151
161
  export { AppContext, useApp } from './react/app-context.cjs';
152
162
  export { getReferenceLinkText, isCanvasFileNodeReference, isCanvasReference, isCanvasTextNodeReference, isReferenceInHeading, isReferenceInOffsetRange, referenceToFileChange, sortReferences } from './reference.cjs';
163
+ export { isOwnedByRenderedMarkdown, registerFoldHandlers, registerFootnoteLinkHandler } from './rendered-markdown.cjs';
164
+ export { createRequestUrlFetch, encodeRequestUrlRequest, RequestUrlError, requestUrlEx, requestUrlStream } from './request-url.cjs';
153
165
  export { isResourceLockedForPath, isResourceLockedForPathByAncestor, lockResourceForPath, requestResourceUnlockForPath, ResourceLockComponent, ResourceLockedError, unlockResourceForPath } from './resource-lock.cjs';
154
166
  export { relativePathToResourceUrl } from './resource-url.cjs';
155
167
  export { PluginRibbonIconRegistrar } from './ribbon-icon-registrar.cjs';
@@ -159,6 +171,9 @@ export { DateComponent } from './setting-components/date-component.cjs';
159
171
  export { DateTimeComponent } from './setting-components/date-time-component.cjs';
160
172
  export { EmailComponent } from './setting-components/email-component.cjs';
161
173
  export { FileComponent } from './setting-components/file-component.cjs';
174
+ export { FolderInputSuggest, FolderListComponent } from './setting-components/folder-list-component.cjs';
175
+ export { HotkeyComponent } from './setting-components/hotkey-component.cjs';
176
+ export { ListComponent } from './setting-components/list-component.cjs';
162
177
  export { MonthComponent } from './setting-components/month-component.cjs';
163
178
  export { MultipleDropdownComponent } from './setting-components/multiple-dropdown-component.cjs';
164
179
  export { MultipleEmailComponent } from './setting-components/multiple-email-component.cjs';
@@ -167,6 +182,7 @@ export { MultipleTextComponent } from './setting-components/multiple-text-compon
167
182
  export { NumberComponent } from './setting-components/number-component.cjs';
168
183
  export { PasswordComponent } from './setting-components/password-component.cjs';
169
184
  export { ensureWrapped } from './setting-components/setting-component-wrapper.cjs';
185
+ export { TagInputSuggest, TagListComponent } from './setting-components/tag-list-component.cjs';
170
186
  export { TelephoneComponent } from './setting-components/telephone-component.cjs';
171
187
  export { getTextBasedComponentValue } from './setting-components/text-based-component.cjs';
172
188
  export { TimeComponent } from './setting-components/time-component.cjs';
@@ -181,6 +197,7 @@ export { WeekComponent } from './setting-components/week-component.cjs';
181
197
  export { adoptSettingEx, SettingEx } from './setting-ex.cjs';
182
198
  export { SettingGroupEx } from './setting-group-ex.cjs';
183
199
  export { openSettingTab } from './settings-modal.cjs';
200
+ export { SettingsTabs } from './settings-tabs.cjs';
184
201
  export { PluginStatusBarItemRegistrar } from './status-bar-item-registrar.cjs';
185
202
  export { getTemplaterFunctions, getTemplaterRenderTargetFile, parseTemplate, requireTemplaterApi, resolveTemplaterApi, TEMPLATER_PLUGIN_ID, TemplaterActiveFileProvider, TemplaterRunMode, TemplaterUnavailabilityReason, TemplaterUnavailableError } from './templater.cjs';
186
203
  export { DurationTransformer } from './transformers/duration-transformer.cjs';
@@ -0,0 +1,232 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __defProp = Object.defineProperty;
99
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
100
+ var __getOwnPropNames = Object.getOwnPropertyNames;
101
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
102
+ var __export = (target, all) => {
103
+ for (var name in all)
104
+ __defProp(target, name, { get: all[name], enumerable: true });
105
+ };
106
+ var __copyProps = (to, from, except, desc) => {
107
+ if (from && typeof from === "object" || typeof from === "function") {
108
+ for (let key of __getOwnPropNames(from))
109
+ if (!__hasOwnProp.call(to, key) && key !== except)
110
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
111
+ }
112
+ return to;
113
+ };
114
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
+ var anchored_suggest_exports = {};
116
+ __export(anchored_suggest_exports, {
117
+ AnchoredSuggest: () => AnchoredSuggest
118
+ });
119
+ module.exports = __toCommonJS(anchored_suggest_exports);
120
+ var import_obsidian = require('obsidian');
121
+ const DEFAULT_LIMIT = 100;
122
+ class AnchoredSuggest extends import_obsidian.PopoverSuggest {
123
+ /**
124
+ * The maximum number of suggestions shown. `0` disables the limit. Defaults to `100`.
125
+ */
126
+ limit = DEFAULT_LIMIT;
127
+ anchorEl = null;
128
+ anchorRect = null;
129
+ outsidePointerDownDocument = null;
130
+ outsidePointerDownHandler = this.onOutsidePointerDown.bind(this);
131
+ requestCount = 0;
132
+ /**
133
+ * Creates a new anchored suggest.
134
+ *
135
+ * @param app - The Obsidian app.
136
+ * @param scope - The parent keymap scope.
137
+ */
138
+ constructor(app, scope) {
139
+ super(app, scope);
140
+ }
141
+ /**
142
+ * Closes the popover.
143
+ */
144
+ close() {
145
+ this.requestCount++;
146
+ this.removeOutsidePointerDownHandler();
147
+ super.close();
148
+ }
149
+ /**
150
+ * Opens the popover at an anchor, or moves it there when it is already open.
151
+ *
152
+ * @param params - The parameters.
153
+ * @returns Whether the popover is open: `false` when there is nothing to suggest, or when it was closed or reopened
154
+ * while the suggestions were computed.
155
+ */
156
+ async openAt(params) {
157
+ const { anchor } = params;
158
+ if (isElement(anchor)) {
159
+ this.anchorEl = anchor;
160
+ this.anchorRect = anchor.getBoundingClientRect();
161
+ } else {
162
+ this.anchorEl = null;
163
+ this.anchorRect = anchor;
164
+ }
165
+ return await this.refresh(params.query ?? "", this.anchorRect);
166
+ }
167
+ /**
168
+ * Picks a suggestion: closes the popover, then hands the suggestion to {@link AnchoredSuggest.onChooseSuggestion}.
169
+ *
170
+ * @param value - The suggestion.
171
+ * @param $event - The event that picked it.
172
+ */
173
+ selectSuggestion(value, $event) {
174
+ this.close();
175
+ this.onChooseSuggestion(value, $event);
176
+ }
177
+ /**
178
+ * Recomputes the suggestions for a new query at the current anchor.
179
+ *
180
+ * @param query - The query.
181
+ * @returns Whether the popover is open afterwards.
182
+ */
183
+ async setQuery(query) {
184
+ return this.anchorRect ? await this.refresh(query, this.anchorRect) : false;
185
+ }
186
+ addOutsidePointerDownHandler() {
187
+ this.removeOutsidePointerDownHandler();
188
+ this.outsidePointerDownDocument = this.suggestEl.ownerDocument;
189
+ this.outsidePointerDownDocument.addEventListener("pointerdown", this.outsidePointerDownHandler, { capture: true });
190
+ }
191
+ onOutsidePointerDown(event_) {
192
+ const path = event_.composedPath();
193
+ if (path.includes(this.suggestEl) || this.anchorEl && path.includes(this.anchorEl)) {
194
+ return;
195
+ }
196
+ this.close();
197
+ }
198
+ async refresh(query, anchorRect) {
199
+ const requestId = ++this.requestCount;
200
+ let suggestions = await this.getSuggestions(query);
201
+ if (requestId !== this.requestCount) {
202
+ return false;
203
+ }
204
+ if (suggestions.length === 0) {
205
+ this.close();
206
+ return false;
207
+ }
208
+ if (this.limit > 0) {
209
+ suggestions = suggestions.slice(0, this.limit);
210
+ }
211
+ this.suggestions.setSuggestions(suggestions);
212
+ this.open();
213
+ this.reposition(DOMRect.fromRect(anchorRect));
214
+ if (this.anchorEl) {
215
+ this.setAutoDestroy(this.anchorEl);
216
+ }
217
+ this.addOutsidePointerDownHandler();
218
+ return true;
219
+ }
220
+ removeOutsidePointerDownHandler() {
221
+ this.outsidePointerDownDocument?.removeEventListener("pointerdown", this.outsidePointerDownHandler, { capture: true });
222
+ this.outsidePointerDownDocument = null;
223
+ }
224
+ }
225
+ function isElement(anchor) {
226
+ return "getBoundingClientRect" in anchor;
227
+ }
228
+ // Annotate the CommonJS export names for ESM import in node:
229
+ 0 && (module.exports = {
230
+ AnchoredSuggest
231
+ });
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmNob3JlZC1zdWdnZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIHN1Z2dlc3QgcG9wb3ZlciBvcGVuZWQgYXQgYW4gZWxlbWVudCBvciBhIHJlY3RhbmdsZSwgd2l0aCBubyBpbnB1dCBiZWhpbmQgaXQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFNjb3BlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgUG9wb3ZlclN1Z2dlc3QgfSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IERFRkFVTFRfTElNSVQgPSAxMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5vcGVuQXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuY2hvcmVkU3VnZ2VzdE9wZW5BdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBvciB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlIHRoZSBwb3BvdmVyIGlzIHBsYWNlZCBhZ2FpbnN0LiBXaGVuIGFuIGVsZW1lbnQgaXMgZ2l2ZW4sIHRoZSBwb3BvdmVyIGNsb3Nlc1xuICAgKiBvbmNlIHRoZSBlbGVtZW50IGxlYXZlcyB0aGUgRE9NLCBhbmQgYSBwb2ludGVyLWRvd24gb24gaXQgZG9lcyBub3QgY291bnQgYXMgYW4gb3V0c2lkZSBjbGljay5cbiAgICovXG4gIHJlYWRvbmx5IGFuY2hvcjogRE9NUmVjdFJlYWRPbmx5IHwgSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBoYW5kZWQgdG8ge0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5nZXRTdWdnZXN0aW9uc30uIERlZmF1bHRzIHRvIGAnJ2AuXG4gICAqL1xuICByZWFkb25seSBxdWVyeT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHN1Z2dlc3QgcG9wb3ZlciBvcGVuZWQgYXQgYW4gYW5jaG9yLCBmb3IgYSBwaWNrZXIgdGhhdCBoYXMgbm8gdGV4dCBpbnB1dDogYSB0b29sYmFyIGJ1dHRvbiwgYSBjb250ZXh0LW1lbnUgYWN0aW9uLFxuICogYSBkZWNvcmF0aW9uIGluIHRoZSBlZGl0b3IuXG4gKlxuICogT2JzaWRpYW4ncyBgQWJzdHJhY3RJbnB1dFN1Z2dlc3RgIG9wZW5zIG9ubHkgZnJvbSBhbiBpbnB1dCBhbmQgYEVkaXRvclN1Z2dlc3RgIG9ubHkgZnJvbSB0aGUgZWRpdG9yLiBUaGlzIG9uZSBpc1xuICogb3BlbmVkIGJ5IHtAbGluayBBbmNob3JlZFN1Z2dlc3Qub3BlbkF0fSBhbmQgY2xvc2VzIG9uIEVzY2FwZSwgb24gYSBwb2ludGVyLWRvd24gb3V0c2lkZSBpdCwgYW5kIHdoZW4gaXRzIGFuY2hvclxuICogZWxlbWVudCBsZWF2ZXMgdGhlIERPTS4gVGhlIGtleWJvYXJkIHdvcmtzIGFzIGluIE9ic2lkaWFuJ3Mgb3duIHBvcG92ZXJzOiBhcnJvd3MgbW92ZSwgRW50ZXIgcGlja3MuXG4gKlxuICogYGBgdHNcbiAqIGNsYXNzIENvbG9yU3VnZ2VzdCBleHRlbmRzIEFuY2hvcmVkU3VnZ2VzdDxzdHJpbmc+IHtcbiAqICAgcHJvdGVjdGVkIGdldFN1Z2dlc3Rpb25zKCk6IHN0cmluZ1tdIHtcbiAqICAgICByZXR1cm4gWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddO1xuICogICB9XG4gKlxuICogICBwdWJsaWMgcmVuZGVyU3VnZ2VzdGlvbihjb2xvcjogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAqICAgICBlbC5zZXRUZXh0KGNvbG9yKTtcbiAqICAgfVxuICpcbiAqICAgcHJvdGVjdGVkIG9uQ2hvb3NlU3VnZ2VzdGlvbihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gKiAgICAgY29uc29sZS5sb2coY29sb3IpO1xuICogICB9XG4gKiB9XG4gKlxuICogYXdhaXQgbmV3IENvbG9yU3VnZ2VzdCh0aGlzLmFwcCkub3BlbkF0KHsgYW5jaG9yOiBidXR0b25FbCB9KTtcbiAqIGBgYFxuICpcbiAqIEl0IHJlbGllcyBvbiBgUG9wb3ZlclN1Z2dlc3RgIG1lbWJlcnMgdGhhdCBgb2JzaWRpYW4uZC50c2AgZG9lcyBub3QgZGVjbGFyZSAoYHN1Z2dlc3Rpb25zYCwgYHJlcG9zaXRpb25gLFxuICogYHNldEF1dG9EZXN0cm95YCwgYHN1Z2dlc3RFbGApLCByZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYSBzdWdnZXN0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQW5jaG9yZWRTdWdnZXN0PFQ+IGV4dGVuZHMgUG9wb3ZlclN1Z2dlc3Q8VD4ge1xuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHNob3duLiBgMGAgZGlzYWJsZXMgdGhlIGxpbWl0LiBEZWZhdWx0cyB0byBgMTAwYC5cbiAgICovXG4gIHB1YmxpYyBsaW1pdCA9IERFRkFVTFRfTElNSVQ7XG5cbiAgcHJpdmF0ZSBhbmNob3JFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhbmNob3JSZWN0OiBET01SZWN0UmVhZE9ubHkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudDogRG9jdW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyID0gdGhpcy5vbk91dHNpZGVQb2ludGVyRG93bi5iaW5kKHRoaXMpO1xuICBwcml2YXRlIHJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYW5jaG9yZWQgc3VnZ2VzdC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAuXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBwYXJlbnQga2V5bWFwIHNjb3BlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBzY29wZT86IFNjb3BlKSB7XG4gICAgc3VwZXIoYXBwLCBzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdENvdW50Kys7XG4gICAgdGhpcy5yZW1vdmVPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgc3VwZXIuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgcG9wb3ZlciBhdCBhbiBhbmNob3IsIG9yIG1vdmVzIGl0IHRoZXJlIHdoZW4gaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHBvcG92ZXIgaXMgb3BlbjogYGZhbHNlYCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3VnZ2VzdCwgb3Igd2hlbiBpdCB3YXMgY2xvc2VkIG9yIHJlb3BlbmVkXG4gICAqICAgd2hpbGUgdGhlIHN1Z2dlc3Rpb25zIHdlcmUgY29tcHV0ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgb3BlbkF0KHBhcmFtczogQW5jaG9yZWRTdWdnZXN0T3BlbkF0UGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhbmNob3IgfSA9IHBhcmFtcztcbiAgICBpZiAoaXNFbGVtZW50KGFuY2hvcikpIHtcbiAgICAgIHRoaXMuYW5jaG9yRWwgPSBhbmNob3I7XG4gICAgICB0aGlzLmFuY2hvclJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYW5jaG9yRWwgPSBudWxsO1xuICAgICAgdGhpcy5hbmNob3JSZWN0ID0gYW5jaG9yO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWZyZXNoKHBhcmFtcy5xdWVyeSA/PyAnJywgdGhpcy5hbmNob3JSZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyBhIHN1Z2dlc3Rpb246IGNsb3NlcyB0aGUgcG9wb3ZlciwgdGhlbiBoYW5kcyB0aGUgc3VnZ2VzdGlvbiB0byB7QGxpbmsgQW5jaG9yZWRTdWdnZXN0Lm9uQ2hvb3NlU3VnZ2VzdGlvbn0uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzdWdnZXN0aW9uLlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgcGlja2VkIGl0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHNlbGVjdFN1Z2dlc3Rpb24odmFsdWU6IFQsICRldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlKCk7XG4gICAgdGhpcy5vbkNob29zZVN1Z2dlc3Rpb24odmFsdWUsICRldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb21wdXRlcyB0aGUgc3VnZ2VzdGlvbnMgZm9yIGEgbmV3IHF1ZXJ5IGF0IHRoZSBjdXJyZW50IGFuY2hvci5cbiAgICpcbiAgICogQHBhcmFtIHF1ZXJ5IC0gVGhlIHF1ZXJ5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIG9wZW4gYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRRdWVyeShxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuYW5jaG9yUmVjdCA/IChhd2FpdCB0aGlzLnJlZnJlc2gocXVlcnksIHRoaXMuYW5jaG9yUmVjdCkpIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgc3VnZ2VzdGlvbnMgZm9yIGEgcXVlcnkuXG4gICAqXG4gICAqIEBwYXJhbSBxdWVyeSAtIFRoZSBxdWVyeSBwYXNzZWQgdG8ge0BsaW5rIEFuY2hvcmVkU3VnZ2VzdC5vcGVuQXR9IG9yIHtAbGluayBBbmNob3JlZFN1Z2dlc3Quc2V0UXVlcnl9LlxuICAgKiBAcmV0dXJucyBUaGUgc3VnZ2VzdGlvbnMsIGRpcmVjdGx5IG9yIGFzIGEgcHJvbWlzZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTdWdnZXN0aW9ucyhxdWVyeTogc3RyaW5nKTogUHJvbWlzZTxUW10+IHwgVFtdO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2l0aCB0aGUgc3VnZ2VzdGlvbiB0aGUgdXNlciBwaWNrZWQsIGFmdGVyIHRoZSBwb3BvdmVyIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN1Z2dlc3Rpb24uXG4gICAqIEBwYXJhbSAkZXZlbnQgLSBUaGUgZXZlbnQgdGhhdCBwaWNrZWQgaXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25DaG9vc2VTdWdnZXN0aW9uKHZhbHVlOiBULCAkZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZDtcblxuICBwcml2YXRlIGFkZE91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudCA9IHRoaXMuc3VnZ2VzdEVsLm93bmVyRG9jdW1lbnQ7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMub3V0c2lkZVBvaW50ZXJEb3duSGFuZGxlciwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk91dHNpZGVQb2ludGVyRG93bihldmVudF86IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHBhdGggPSBldmVudF8uY29tcG9zZWRQYXRoKCk7XG4gICAgaWYgKHBhdGguaW5jbHVkZXModGhpcy5zdWdnZXN0RWwpIHx8ICh0aGlzLmFuY2hvckVsICYmIHBhdGguaW5jbHVkZXModGhpcy5hbmNob3JFbCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaChxdWVyeTogc3RyaW5nLCBhbmNob3JSZWN0OiBET01SZWN0UmVhZE9ubHkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSArK3RoaXMucmVxdWVzdENvdW50O1xuICAgIGxldCBzdWdnZXN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0U3VnZ2VzdGlvbnMocXVlcnkpO1xuICAgIGlmIChyZXF1ZXN0SWQgIT09IHRoaXMucmVxdWVzdENvdW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdWdnZXN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubGltaXQgPiAwKSB7XG4gICAgICBzdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNsaWNlKDAsIHRoaXMubGltaXQpO1xuICAgIH1cblxuICAgIHRoaXMuc3VnZ2VzdGlvbnMuc2V0U3VnZ2VzdGlvbnMoc3VnZ2VzdGlvbnMpO1xuICAgIHRoaXMub3BlbigpO1xuICAgIHRoaXMucmVwb3NpdGlvbihET01SZWN0LmZyb21SZWN0KGFuY2hvclJlY3QpKTtcbiAgICBpZiAodGhpcy5hbmNob3JFbCkge1xuICAgICAgdGhpcy5zZXRBdXRvRGVzdHJveSh0aGlzLmFuY2hvckVsKTtcbiAgICB9XG4gICAgdGhpcy5hZGRPdXRzaWRlUG9pbnRlckRvd25IYW5kbGVyKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRzaWRlUG9pbnRlckRvd25Eb2N1bWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLm91dHNpZGVQb2ludGVyRG93bkhhbmRsZXIsIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB0aGlzLm91dHNpZGVQb2ludGVyRG93bkRvY3VtZW50ID0gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0VsZW1lbnQoYW5jaG9yOiBET01SZWN0UmVhZE9ubHkgfCBIVE1MRWxlbWVudCk6IGFuY2hvciBpcyBIVE1MRWxlbWVudCB7XG4gIHJldHVybiAnZ2V0Qm91bmRpbmdDbGllbnRSZWN0JyBpbiBhbmNob3I7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxzQkFBK0I7QUFFL0IsTUFBTSxnQkFBZ0I7QUFpRGYsTUFBZSx3QkFBMkIsK0JBQWtCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJMUQsUUFBUTtBQUFBLEVBRVAsV0FBK0I7QUFBQSxFQUMvQixhQUFxQztBQUFBLEVBQ3JDLDZCQUE4QztBQUFBLEVBQ3JDLDRCQUE0QixLQUFLLHFCQUFxQixLQUFLLElBQUk7QUFBQSxFQUN4RSxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRaEIsWUFBWSxLQUFVLE9BQWU7QUFDMUMsVUFBTSxLQUFLLEtBQUs7QUFBQSxFQUNsQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFFBQWM7QUFDNUIsU0FBSztBQUNMLFNBQUssZ0NBQWdDO0FBQ3JDLFVBQU0sTUFBTTtBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYSxPQUFPLFFBQXVEO0FBQ3pFLFVBQU0sRUFBRSxPQUFPLElBQUk7QUFDbkIsUUFBSSxVQUFVLE1BQU0sR0FBRztBQUNyQixXQUFLLFdBQVc7QUFDaEIsV0FBSyxhQUFhLE9BQU8sc0JBQXNCO0FBQUEsSUFDakQsT0FBTztBQUNMLFdBQUssV0FBVztBQUNoQixXQUFLLGFBQWE7QUFBQSxJQUNwQjtBQUNBLFdBQU8sTUFBTSxLQUFLLFFBQVEsT0FBTyxTQUFTLElBQUksS0FBSyxVQUFVO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFnQixpQkFBaUIsT0FBVSxRQUEwQztBQUNuRixTQUFLLE1BQU07QUFDWCxTQUFLLG1CQUFtQixPQUFPLE1BQU07QUFBQSxFQUN2QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxTQUFTLE9BQWlDO0FBQ3JELFdBQU8sS0FBSyxhQUFjLE1BQU0sS0FBSyxRQUFRLE9BQU8sS0FBSyxVQUFVLElBQUs7QUFBQSxFQUMxRTtBQUFBLEVBa0JRLCtCQUFxQztBQUMzQyxTQUFLLGdDQUFnQztBQUNyQyxTQUFLLDZCQUE2QixLQUFLLFVBQVU7QUFDakQsU0FBSywyQkFBMkIsaUJBQWlCLGVBQWUsS0FBSywyQkFBMkIsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ25IO0FBQUEsRUFFUSxxQkFBcUIsUUFBNEI7QUFDdkQsVUFBTSxPQUFPLE9BQU8sYUFBYTtBQUNqQyxRQUFJLEtBQUssU0FBUyxLQUFLLFNBQVMsS0FBTSxLQUFLLFlBQVksS0FBSyxTQUFTLEtBQUssUUFBUSxHQUFJO0FBQ3BGO0FBQUEsSUFDRjtBQUNBLFNBQUssTUFBTTtBQUFBLEVBQ2I7QUFBQSxFQUVBLE1BQWMsUUFBUSxPQUFlLFlBQStDO0FBQ2xGLFVBQU0sWUFBWSxFQUFFLEtBQUs7QUFDekIsUUFBSSxjQUFjLE1BQU0sS0FBSyxlQUFlLEtBQUs7QUFDakQsUUFBSSxjQUFjLEtBQUssY0FBYztBQUNuQyxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksWUFBWSxXQUFXLEdBQUc7QUFDNUIsV0FBSyxNQUFNO0FBQ1gsYUFBTztBQUFBLElBQ1Q7QUFDQSxRQUFJLEtBQUssUUFBUSxHQUFHO0FBQ2xCLG9CQUFjLFlBQVksTUFBTSxHQUFHLEtBQUssS0FBSztBQUFBLElBQy9DO0FBRUEsU0FBSyxZQUFZLGVBQWUsV0FBVztBQUMzQyxTQUFLLEtBQUs7QUFDVixTQUFLLFdBQVcsUUFBUSxTQUFTLFVBQVUsQ0FBQztBQUM1QyxRQUFJLEtBQUssVUFBVTtBQUNqQixXQUFLLGVBQWUsS0FBSyxRQUFRO0FBQUEsSUFDbkM7QUFDQSxTQUFLLDZCQUE2QjtBQUNsQyxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEsa0NBQXdDO0FBQzlDLFNBQUssNEJBQTRCLG9CQUFvQixlQUFlLEtBQUssMkJBQTJCLEVBQUUsU0FBUyxLQUFLLENBQUM7QUFDckgsU0FBSyw2QkFBNkI7QUFBQSxFQUNwQztBQUNGO0FBRUEsU0FBUyxVQUFVLFFBQThEO0FBQy9FLFNBQU8sMkJBQTJCO0FBQ3BDOyIsIm5hbWVzIjpbXX0=
@@ -0,0 +1,116 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * A suggest popover opened at an element or a rectangle, with no input behind it.
7
+ */
8
+ import type { App, Scope } from 'obsidian' with { 'resolution-mode': 'import' };
9
+ import { PopoverSuggest } from 'obsidian';
10
+ /**
11
+ * Parameters for {@link AnchoredSuggest.openAt}.
12
+ */
13
+ export interface AnchoredSuggestOpenAtParams {
14
+ /**
15
+ * The element or the viewport rectangle the popover is placed against. When an element is given, the popover closes
16
+ * once the element leaves the DOM, and a pointer-down on it does not count as an outside click.
17
+ */
18
+ readonly anchor: DOMRectReadOnly | HTMLElement;
19
+ /**
20
+ * The query handed to {@link AnchoredSuggest.getSuggestions}. Defaults to `''`.
21
+ */
22
+ readonly query?: string;
23
+ }
24
+ /**
25
+ * A suggest popover opened at an anchor, for a picker that has no text input: a toolbar button, a context-menu action,
26
+ * a decoration in the editor.
27
+ *
28
+ * Obsidian's `AbstractInputSuggest` opens only from an input and `EditorSuggest` only from the editor. This one is
29
+ * opened by {@link AnchoredSuggest.openAt} and closes on Escape, on a pointer-down outside it, and when its anchor
30
+ * element leaves the DOM. The keyboard works as in Obsidian's own popovers: arrows move, Enter picks.
31
+ *
32
+ * ```ts
33
+ * class ColorSuggest extends AnchoredSuggest<string> {
34
+ * protected getSuggestions(): string[] {
35
+ * return ['red', 'green', 'blue'];
36
+ * }
37
+ *
38
+ * public renderSuggestion(color: string, el: HTMLElement): void {
39
+ * el.setText(color);
40
+ * }
41
+ *
42
+ * protected onChooseSuggestion(color: string): void {
43
+ * console.log(color);
44
+ * }
45
+ * }
46
+ *
47
+ * await new ColorSuggest(this.app).openAt({ anchor: buttonEl });
48
+ * ```
49
+ *
50
+ * It relies on `PopoverSuggest` members that `obsidian.d.ts` does not declare (`suggestions`, `reposition`,
51
+ * `setAutoDestroy`, `suggestEl`), read from Obsidian `1.15.0`.
52
+ *
53
+ * @typeParam T - The type of a suggestion.
54
+ */
55
+ export declare abstract class AnchoredSuggest<T> extends PopoverSuggest<T> {
56
+ /**
57
+ * The maximum number of suggestions shown. `0` disables the limit. Defaults to `100`.
58
+ */
59
+ limit: number;
60
+ private anchorEl;
61
+ private anchorRect;
62
+ private outsidePointerDownDocument;
63
+ private readonly outsidePointerDownHandler;
64
+ private requestCount;
65
+ /**
66
+ * Creates a new anchored suggest.
67
+ *
68
+ * @param app - The Obsidian app.
69
+ * @param scope - The parent keymap scope.
70
+ */
71
+ constructor(app: App, scope?: Scope);
72
+ /**
73
+ * Closes the popover.
74
+ */
75
+ close(): void;
76
+ /**
77
+ * Opens the popover at an anchor, or moves it there when it is already open.
78
+ *
79
+ * @param params - The parameters.
80
+ * @returns Whether the popover is open: `false` when there is nothing to suggest, or when it was closed or reopened
81
+ * while the suggestions were computed.
82
+ */
83
+ openAt(params: AnchoredSuggestOpenAtParams): Promise<boolean>;
84
+ /**
85
+ * Picks a suggestion: closes the popover, then hands the suggestion to {@link AnchoredSuggest.onChooseSuggestion}.
86
+ *
87
+ * @param value - The suggestion.
88
+ * @param $event - The event that picked it.
89
+ */
90
+ selectSuggestion(value: T, $event: KeyboardEvent | MouseEvent): void;
91
+ /**
92
+ * Recomputes the suggestions for a new query at the current anchor.
93
+ *
94
+ * @param query - The query.
95
+ * @returns Whether the popover is open afterwards.
96
+ */
97
+ setQuery(query: string): Promise<boolean>;
98
+ /**
99
+ * Gets the suggestions for a query.
100
+ *
101
+ * @param query - The query passed to {@link AnchoredSuggest.openAt} or {@link AnchoredSuggest.setQuery}.
102
+ * @returns The suggestions, directly or as a promise.
103
+ */
104
+ protected abstract getSuggestions(query: string): Promise<T[]> | T[];
105
+ /**
106
+ * Called with the suggestion the user picked, after the popover closed.
107
+ *
108
+ * @param value - The suggestion.
109
+ * @param $event - The event that picked it.
110
+ */
111
+ protected abstract onChooseSuggestion(value: T, $event: KeyboardEvent | MouseEvent): void;
112
+ private addOutsidePointerDownHandler;
113
+ private onOutsidePointerDown;
114
+ private refresh;
115
+ private removeOutsidePointerDownHandler;
116
+ }
@@ -114,7 +114,8 @@ var __copyProps = (to, from, except, desc) => {
114
114
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
115
  var backlink_index_exports = {};
116
116
  __export(backlink_index_exports, {
117
- getIndexedBacklinksForFile: () => getIndexedBacklinksForFile
117
+ getIndexedBacklinksForFile: () => getIndexedBacklinksForFile,
118
+ iterateReferencesAffectedByRename: () => iterateReferencesAffectedByRename
118
119
  });
119
120
  module.exports = __toCommonJS(backlink_index_exports);
120
121
  var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
@@ -147,6 +148,27 @@ function getIndexedBacklinksForFile(app, file) {
147
148
  }
148
149
  }
149
150
  }
151
+ function iterateReferencesAffectedByRename(app, file, newPath, callback) {
152
+ const data = getBacklinkIndexData();
153
+ refresh(app, data);
154
+ const newName = newPath.slice(newPath.lastIndexOf("/") + 1);
155
+ const candidateSourcePaths = /* @__PURE__ */ new Set([file.path]);
156
+ for (const nameKey of [...getTargetNameKeys(file.name), ...getTargetNameKeys(newName)]) {
157
+ for (const sourcePath of data.nameKeySourcePaths.get(nameKey) ?? []) {
158
+ candidateSourcePaths.add(sourcePath);
159
+ }
160
+ }
161
+ for (const sourcePath of candidateSourcePaths) {
162
+ for (const reference of getCacheReferences(getCachedMetadata(app, sourcePath))) {
163
+ if (callback(sourcePath, reference) === true) {
164
+ break;
165
+ }
166
+ }
167
+ }
168
+ for (const linkUpdater of Object.values(app.metadataCache.linkUpdaters)) {
169
+ linkUpdater?.iterateReferences(callback);
170
+ }
171
+ }
150
172
  function getBacklinkIndexData() {
151
173
  return (0, import_obsidian_lib_state.getObsidianLibState)("backlinkIndexV1", {
152
174
  indexedHashes: /* @__PURE__ */ new Map(),
@@ -196,16 +218,29 @@ function indexSource(app, data, sourcePath, hash) {
196
218
  }
197
219
  function refresh(app, data) {
198
220
  const fileCache = app.metadataCache.fileCache;
221
+ const indexedCountBefore = data.indexedHashes.size;
222
+ let seenIndexedCount = 0;
223
+ for (const sourcePath in fileCache) {
224
+ const entry = Object.hasOwn(fileCache, sourcePath) ? fileCache[sourcePath] : void 0;
225
+ if (!entry) {
226
+ continue;
227
+ }
228
+ const indexedHash = data.indexedHashes.get(sourcePath);
229
+ if (indexedHash !== void 0) {
230
+ seenIndexedCount++;
231
+ }
232
+ if (indexedHash !== entry.hash) {
233
+ indexSource(app, data, sourcePath, entry.hash);
234
+ }
235
+ }
236
+ if (seenIndexedCount === indexedCountBefore) {
237
+ return;
238
+ }
199
239
  for (const sourcePath of data.sourcePathNameKeys.keys()) {
200
240
  if (!Object.hasOwn(fileCache, sourcePath)) {
201
241
  removeSource(data, sourcePath);
202
242
  }
203
243
  }
204
- for (const [sourcePath, { hash }] of Object.entries(fileCache)) {
205
- if (data.indexedHashes.get(sourcePath) !== hash) {
206
- indexSource(app, data, sourcePath, hash);
207
- }
208
- }
209
244
  }
210
245
  function removeSource(data, sourcePath) {
211
246
  for (const nameKey of data.sourcePathNameKeys.get(sourcePath) ?? []) {
@@ -220,6 +255,7 @@ function removeSource(data, sourcePath) {
220
255
  }
221
256
  // Annotate the CommonJS export names for ESM import in node:
222
257
  0 && (module.exports = {
223
- getIndexedBacklinksForFile
258
+ getIndexedBacklinksForFile,
259
+ iterateReferencesAffectedByRename
224
260
  });
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrbGluay1pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQW5zd2VycyBcIndoaWNoIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byB0aGlzIGZpbGU/XCIgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBub3RlcyB0aGF0IENPVUxEIGhvbGQgb25lLCBpbnN0ZWFkIG9mXG4gKiByZXNvbHZpbmcgZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBtZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSlgIGlzIG5vdCBhbiBpbmRleCBsb29rdXAuIFJlYWQgb3V0IG9mIHRoZSAxLjE0LjIgYnVuZGxlLCBpdCBpc1xuICogYGl0ZXJhdGVBbGxSZWZzYCDigJQgZXZlcnkgYGZyb250bWF0dGVyTGlua3NgLCBgbGlua3NgIGFuZCBgZW1iZWRzYCBlbnRyeSBvZiBldmVyeSBjYWNoZWQgbm90ZSwgcGx1cyBldmVyeVxuICogcmVmZXJlbmNlIGVhY2ggYGxpbmtVcGRhdGVyc2AgZW50cnkgKHRoZSBjYW52YXMgb25lKSByZXBvcnRzIOKAlCB3aXRoIG9uZSBgZ2V0Rmlyc3RMaW5rcGF0aERlc3RgIHBlciByZWZlcmVuY2UsXG4gKiBrZWVwaW5nIHRob3NlIHRoYXQgcmVzb2x2ZSB0byBgZmlsZWAuIFRoYXQgaXMgfjExNSBtcyBhdCAxMDBrIHJlZmVyZW5jZXMgYW5kIH4zMjAgbXMgYXQgMjUwaywgcGFpZCBvbmNlIHBlciBmaWxlXG4gKiBieSBldmVyeSBwZXItZmlsZSBiYWNrbGluayBsb29rdXAsIHNvIGEgMTAwMC1ub3RlIGZvbGRlciByZW5hbWUgaW4gYSA1MGstbm90ZSB2YXVsdCB0b29rIDkyNCBzLlxuICpcbiAqIFdoYXQgbWFrZXMgYSBuYXJyb3dlciBhbnN3ZXIgZXhhY3QgaXMgYSBwcm9wZXJ0eSBvZiBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aERlc3RgOiBldmVyeSBicmFuY2ggb2YgaXQgY2FuIG9ubHlcbiAqIHJldHVybiBhIGZpbGUgd2hvc2UgbG93ZXJjYXNlZCBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgdGhlIGxpbmtwYXRoLCBvciB0aGF0IHNlZ21lbnQgcGx1c1xuICogYC5tZGAuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSBsaW5rcGF0aCAoYFtbI0hlYWRpbmddXWApLCB3aGljaCByZXR1cm5zIHRoZSBzb3VyY2Ugbm90ZSBpdHNlbGYuIFNvIGFcbiAqIG5vdGUgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8gYGZpbGVgIG9ubHkgaWYgaXQgaG9sZHMgYSByZWZlcmVuY2Ugd2hvc2UgbGFzdCBzZWdtZW50IG1hdGNoZXMgb25lIG9mIGBmaWxlYCdzXG4gKiBuYW1lIGtleXMsIG9yIGlmIGl0IElTIGBmaWxlYC4gVGhpcyBtb2R1bGUgaW5kZXhlcyBub3RlcyBieSB0aG9zZSBzZWdtZW50cywgdGFrZXMgdGhlIGNhbmRpZGF0ZXMgZm9yIGBmaWxlYCxcbiAqIGFuZCBydW5zIE9ic2lkaWFuJ3Mgb3duIHByZWRpY2F0ZSDigJQgYGdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtwYXRoLCBzb3VyY2UpID09PSBmaWxlYCDigJQgb3ZlciB0aGUgY2FuZGlkYXRlcydcbiAqIHJlZmVyZW5jZXMgb25seS4gVGhlIGNhbmRpZGF0ZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIHJlYWwgYmFja2xpbmtzIGFuZCB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIG9uZSwgc29cbiAqIHRoZSBhbnN3ZXIgaXMgdGhlIG9uZSB0aGUgZnVsbCB3YWxrIGdpdmVzLCBhIGZpbGUgcmVnaXN0ZXJlZCBhdCBhIG5vbi1leGlzdGluZyBwYXRoIGluY2x1ZGVkLiBPbmx5IHRoZSBPUkRFUlxuICogb2YgdGhlIG5vdGVzIGluIHRoZSBhbnN3ZXIgZGlmZmVyczogdGhlIGZpbGUgaXRzZWxmIGZpcnN0LCB0aGVuIHRoZSBjYW5kaWRhdGVzIGluIGluZGV4IG9yZGVyLlxuICpcbiAqIFRoZSBpbmRleCBpcyBrZXB0IGZyZXNoIHdpdGhvdXQgbGlzdGVuaW5nIHRvIGFueXRoaW5nLiBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgIG1hcHMgYSBub3RlIHRvIHRoZSBoYXNoIG9mXG4gKiBpdHMgY29udGVudCwgYW5kIHRoZSByZWZlcmVuY2VzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoYXQgaGFzaCwgc28gZWFjaCBxdWVyeSBjb21wYXJlcyBldmVyeSBub3RlJ3MgaGFzaFxuICogYWdhaW5zdCB0aGUgb25lIGl0IHdhcyBpbmRleGVkIGF0IGFuZCByZS1yZWFkcyBvbmx5IHRoZSBub3RlcyB0aGF0IGNoYW5nZWQuIFRoYXQgaXMgb25lIHByb3BlcnR5IGNvbXBhcmlzb25cbiAqIHBlciBub3RlIGFuZCBubyByZXNvbHV0aW9uIGF0IGFsbCwgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHNjYW4gT2JzaWRpYW4gaXRzZWxmIHJ1bnMgb24gZXZlcnkgcmVuYW1lXG4gKiAoYHVwZGF0ZVJlbGF0ZWRMaW5rc2ApLiBEZXBlbmRpbmcgb24gbm8gZXZlbnQgYWxzbyBtZWFucyBkZXBlbmRpbmcgb24gbm8gZXZlbnQgT1JERVIsIHdoaWNoIG1hdHRlcnMgYmVjYXVzZVxuICogcmVuYW1lIGhhbmRsZXJzIHF1ZXJ5IGZyb20gaW5zaWRlIHRoZSB2YXVsdCBgcmVuYW1lYCBldmVudC5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgaW5kZXggcGVyIHJlbmRlcmVyIHJlYWxtLCBoZWxkIGluIHRoZSByZWFsbS1nbG9iYWwgc2hhcmVkLXN0YXRlIGJhZywgc28gZXZlcnkgcGx1Z2luIGJ1bmRsaW5nIHRoaXMgbGlicmFyeVxuICogc2hhcmVzIGl0IHJhdGhlciB0aGFuIGVhY2ggYnVpbGRpbmcgaXRzIG93bi4gV2hhdCBpcyBzdG9yZWQgdGhlcmUgaXMgcGxhaW4gZGF0YSByZWFkIHN0cnVjdHVyYWxseSAobWFwcyBhbmRcbiAqIHNldHMsIG5ldmVyIGEgY2xhc3MgaW5zdGFuY2UpLCBiZWNhdXNlIHRoZSBiYWcgY3Jvc3NlcyBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5IGF0IGRpZmZlcmVudCB2ZXJzaW9ucy4gVGhlIGtleVxuICogY2FycmllcyBhIHZlcnNpb246IGEgY2hhbmdlIHRvIHdoYXQgYSBrZXkgTUVBTlMgKGhvdyBhIG5hbWUga2V5IGlzIGRlcml2ZWQpIG11c3QgbW92ZSB0byBhIG5ldyBrZXksIHNvIGFuIG9sZGVyXG4gKiBjb3B5IG5ldmVyIHJlYWRzIGFuIGluZGV4IGJ1aWx0IGJ5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBUaGUgYGxpbmtVcGRhdGVyc2Agc2lkZSBpcyBzdGlsbCB3YWxrZWQgaW4gZnVsbCBvbiBldmVyeSBxdWVyeS4gSW4gMS4xNC4yIHRoZSBvbmx5IHVwZGF0ZXIgaXMgdGhlIGNhbnZhc1xuICogb25lLCB3aG9zZSByZWZlcmVuY2VzIGxpdmUgaW4gdGhlIGNhbnZhcyBpbmRleCByYXRoZXIgdGhhbiBpbiBgZmlsZUNhY2hlYCwgc28gdGhlcmUgaXMgbm8gaGFzaCB0byBrZXkgdGhlbVxuICogYnk7IGEgdmF1bHQncyBjYW52YXNlcyBob2xkIGEgc21hbGwgZnJhY3Rpb24gb2YgaXRzIHJlZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IEN1c3RvbUFycmF5RGljdEltcGwgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbmludGVyZmFjZSBCYWNrbGlua0luZGV4RGF0YSB7XG4gIHJlYWRvbmx5IGluZGV4ZWRIYXNoZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWVLZXlTb3VyY2VQYXRoczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICByZWFkb25seSBzb3VyY2VQYXRoTmFtZUtleXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuY29uc3QgTUFSS0RPV05fU1VGRklYID0gJy5tZCc7XG5cbi8qKlxuICogVGhlIHNhbWUgYW5zd2VyIGFzIGBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpYCAoT2JzaWRpYW4ncyBvd24sIHVucGF0Y2hlZCksIGZyb20gdGhlIGNhbmRpZGF0ZVxuICogbm90ZXMgb25seS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3Igd2h5IHRoZSBhbnN3ZXIgaXMgZXhhY3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHdob3NlIGJhY2tsaW5rcyB0byBmaW5kLiBJdCBtYXkgYmUgYSBub24tZXhpc3RpbmcgZmlsZSByZWdpc3RlcmVkIGZvciB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYGZpbGVgLCBrZXllZCBieSB0aGUgcGF0aCBvZiB0aGUgbm90ZSBvciBjYW52YXMgaG9sZGluZyB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG1ldGFkYXRhQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZTtcbiAgY29uc3QgYmFja2xpbmtzID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuXG4gIC8vIFRoZSBmaWxlIGl0c2VsZiBpcyBhIGNhbmRpZGF0ZSBmb3IgaXRzIG93biBgW1sjSGVhZGluZ11dYCByZWZlcmVuY2VzLCB3aG9zZSBlbXB0eSBsaW5rcGF0aCBuYW1lcyBubyBzZWdtZW50LlxuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlLm5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgY29sbGVjdChzb3VyY2VQYXRoLCByZWZlcmVuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlua1VwZGF0ZXIgb2YgT2JqZWN0LnZhbHVlcyhtZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY29sbGVjdCk7XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3Qoc291cmNlUGF0aDogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge1xuICAgIGlmIChtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKHJlZmVyZW5jZS5saW5rKSwgc291cmNlUGF0aCkgPT09IGZpbGUpIHtcbiAgICAgIGJhY2tsaW5rcy5hZGQoc291cmNlUGF0aCwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QmFja2xpbmtJbmRleERhdGEoKTogQmFja2xpbmtJbmRleERhdGEge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxCYWNrbGlua0luZGV4RGF0YT4oJ2JhY2tsaW5rSW5kZXhWMScsIHtcbiAgICBpbmRleGVkSGFzaGVzOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIG5hbWVLZXlTb3VyY2VQYXRoczogbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpLFxuICAgIHNvdXJjZVBhdGhOYW1lS2V5czogbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpXG4gIH0pLnZhbHVlO1xufVxuZnVuY3Rpb24gZ2V0Q2FjaGVkTWV0YWRhdGEoYXBwOiBBcHAsIHNvdXJjZVBhdGg6IHN0cmluZyk6IENhY2hlZE1ldGFkYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGFzaCA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZVtzb3VyY2VQYXRoXT8uaGFzaDtcbiAgcmV0dXJuIGhhc2ggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbaGFzaF07XG59XG5cbi8qKlxuICogTGlzdHMgYSBjYWNoZWQgbm90ZSdzIHJlZmVyZW5jZXMgaW4gdGhlIG9yZGVyIE9ic2lkaWFuJ3Mgb3duIHdhbGsgdmlzaXRzIHRoZW06IGBmcm9udG1hdHRlckxpbmtzYCwgdGhlblxuICogYGxpbmtzYCwgdGhlbiBgZW1iZWRzYC5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgLSBUaGUgbm90ZSdzIGNhY2hlZCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBub3RlJ3MgcmVmZXJlbmNlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVSZWZlcmVuY2VzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZVtdIHtcbiAgcmV0dXJuIGNhY2hlID8gWy4uLmNhY2hlLmZyb250bWF0dGVyTGlua3MgPz8gW10sIC4uLmNhY2hlLmxpbmtzID8/IFtdLCAuLi5jYWNoZS5lbWJlZHMgPz8gW11dIDogW107XG59XG5cbi8qKlxuICogU3RyaXBzIHRoZSBzdWJwYXRoIGZyb20gYSBsaW5rLCB0aGUgd2F5IE9ic2lkaWFuJ3MgYGdldExpbmtwYXRoYCBkb2VzLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdGV4dCwgc3VjaCBhcyBgZm9sZGVyL05vdGUjSGVhZGluZ2AuXG4gKiBAcmV0dXJucyBUaGUgbGlua3BhdGgsIHN1Y2ggYXMgYGZvbGRlci9Ob3RlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlua3BhdGgobGluazogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaEluZGV4ID0gbGluay5pbmRleE9mKCcjJyk7XG4gIHJldHVybiBoYXNoSW5kZXggPT09IC0xID8gbGluayA6IGxpbmsuc2xpY2UoMCwgaGFzaEluZGV4KTtcbn1cblxuLyoqXG4gKiBUaGUga2V5IGEgcmVmZXJlbmNlIGlzIGluZGV4ZWQgdW5kZXI6IHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgaXRzIGxpbmtwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIHJlZmVyZW5jZSdzIGxpbmsgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5hbWVLZXkobGluazogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGlua3BhdGggPSBnZXRMaW5rcGF0aChsaW5rKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbGlua3BhdGguc2xpY2UobGlua3BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xufVxuXG4vKipcbiAqIFRoZSBrZXlzIHVuZGVyIHdoaWNoIGEgcmVmZXJlbmNlIHRvIGEgZmlsZSB3aXRoIHRoaXMgbmFtZSBjYW4gYmUgaW5kZXhlZC4gYGdldExpbmtwYXRoRGVzdGAgbWF0Y2hlcyBhXG4gKiBzZWdtZW50IGFnYWluc3QgdGhlIGZpbGUncyBuYW1lLCBhbmQgYWdhaW5zdCB0aGUgbmFtZSB3aXRoIGAubWRgIGFwcGVuZGVkLCBzbyBhIG5vdGUgbmFtZWQgYE5vdGUubWRgIGlzXG4gKiByZWFjaGFibGUgZnJvbSBib3RoIGBub3RlLm1kYCBhbmQgYG5vdGVgLlxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZSAtIFRoZSBmaWxlJ3MgbmFtZSwgZXh0ZW5zaW9uIGluY2x1ZGVkLlxuICogQHJldHVybnMgVGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIGdldFRhcmdldE5hbWVLZXlzKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5hbWVLZXkgPSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbmFtZUtleS5lbmRzV2l0aChNQVJLRE9XTl9TVUZGSVgpID8gW25hbWVLZXksIG5hbWVLZXkuc2xpY2UoMCwgLU1BUktET1dOX1NVRkZJWC5sZW5ndGgpXSA6IFtuYW1lS2V5XTtcbn1cblxuZnVuY3Rpb24gaW5kZXhTb3VyY2UoYXBwOiBBcHAsIGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhLCBzb3VyY2VQYXRoOiBzdHJpbmcsIGhhc2g6IHN0cmluZyk6IHZvaWQge1xuICByZW1vdmVTb3VyY2UoZGF0YSwgc291cmNlUGF0aCk7XG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZVtoYXNoXTtcbiAgLypcbiAgICogQSBub3RlJ3MgYGZpbGVDYWNoZWAgZW50cnkgY2FuIGNhcnJ5IGl0cyBuZXcgaGFzaCBiZWZvcmUgdGhlIG1ldGFkYXRhIGZvciB0aGF0IGhhc2ggaXMgc3RvcmVkLiBSZWNvcmRpbmdcbiAgICogdGhlIGhhc2ggdGhlbiB3b3VsZCBwaW4gdGhlIG5vdGUgYXQgXCJubyByZWZlcmVuY2VzXCIgdW50aWwgaXRzIGNvbnRlbnQgY2hhbmdlZCBhZ2Fpbiwgc28gbGVhdmUgaXRcbiAgICogdW5yZWNvcmRlZCBhbmQgbGV0IHRoZSBuZXh0IHF1ZXJ5IGxvb2sgYWdhaW4uXG4gICAqL1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmFtZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgZ2V0Q2FjaGVSZWZlcmVuY2VzKGNhY2hlKSkge1xuICAgIG5hbWVLZXlzLmFkZChnZXRSZWZlcmVuY2VOYW1lS2V5KHJlZmVyZW5jZS5saW5rKSk7XG4gIH1cbiAgZm9yIChjb25zdCBuYW1lS2V5IG9mIG5hbWVLZXlzKSB7XG4gICAgbGV0IHNvdXJjZVBhdGhzID0gZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZ2V0KG5hbWVLZXkpO1xuICAgIGlmICghc291cmNlUGF0aHMpIHtcbiAgICAgIHNvdXJjZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBkYXRhLm5hbWVLZXlTb3VyY2VQYXRocy5zZXQobmFtZUtleSwgc291cmNlUGF0aHMpO1xuICAgIH1cbiAgICBzb3VyY2VQYXRocy5hZGQoc291cmNlUGF0aCk7XG4gIH1cbiAgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuc2V0KHNvdXJjZVBhdGgsIG5hbWVLZXlzKTtcbiAgZGF0YS5pbmRleGVkSGFzaGVzLnNldChzb3VyY2VQYXRoLCBoYXNoKTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaChhcHA6IEFwcCwgZGF0YTogQmFja2xpbmtJbmRleERhdGEpOiB2b2lkIHtcbiAgY29uc3QgZmlsZUNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlO1xuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBkYXRhLnNvdXJjZVBhdGhOYW1lS2V5cy5rZXlzKCkpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oZmlsZUNhY2hlLCBzb3VyY2VQYXRoKSkge1xuICAgICAgcmVtb3ZlU291cmNlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW3NvdXJjZVBhdGgsIHsgaGFzaCB9XSBvZiBPYmplY3QuZW50cmllcyhmaWxlQ2FjaGUpKSB7XG4gICAgaWYgKGRhdGEuaW5kZXhlZEhhc2hlcy5nZXQoc291cmNlUGF0aCkgIT09IGhhc2gpIHtcbiAgICAgIGluZGV4U291cmNlKGFwcCwgZGF0YSwgc291cmNlUGF0aCwgaGFzaCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVNvdXJjZShkYXRhOiBCYWNrbGlua0luZGV4RGF0YSwgc291cmNlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBkYXRhLnNvdXJjZVBhdGhOYW1lS2V5cy5nZXQoc291cmNlUGF0aCkgPz8gW10pIHtcbiAgICBjb25zdCBzb3VyY2VQYXRocyA9IGVuc3VyZU5vbk51bGxhYmxlKGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSk7XG4gICAgc291cmNlUGF0aHMuZGVsZXRlKHNvdXJjZVBhdGgpO1xuICAgIGlmIChzb3VyY2VQYXRocy5zaXplID09PSAwKSB7XG4gICAgICBkYXRhLm5hbWVLZXlTb3VyY2VQYXRocy5kZWxldGUobmFtZUtleSk7XG4gICAgfVxuICB9XG4gIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLmRlbGV0ZShzb3VyY2VQYXRoKTtcbiAgZGF0YS5pbmRleGVkSGFzaGVzLmRlbGV0ZShzb3VyY2VQYXRoKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdEQSx5QkFBa0M7QUFDbEMsNkJBQW9DO0FBRXBDLGdDQUFvQztBQVFwQyxNQUFNLGtCQUFrQjtBQVVqQixTQUFTLDJCQUEyQixLQUFVLE1BQXlDO0FBQzVGLFFBQU0sT0FBTyxxQkFBcUI7QUFDbEMsVUFBUSxLQUFLLElBQUk7QUFFakIsUUFBTSxnQkFBZ0IsSUFBSTtBQUMxQixRQUFNLFlBQVksSUFBSSwyQ0FBK0I7QUFHckQsUUFBTSx1QkFBdUIsb0JBQUksSUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ3hELGFBQVcsV0FBVyxrQkFBa0IsS0FBSyxJQUFJLEdBQUc7QUFDbEQsZUFBVyxjQUFjLEtBQUssbUJBQW1CLElBQUksT0FBTyxLQUFLLENBQUMsR0FBRztBQUNuRSwyQkFBcUIsSUFBSSxVQUFVO0FBQUEsSUFDckM7QUFBQSxFQUNGO0FBRUEsYUFBVyxjQUFjLHNCQUFzQjtBQUM3QyxlQUFXLGFBQWEsbUJBQW1CLGtCQUFrQixLQUFLLFVBQVUsQ0FBQyxHQUFHO0FBQzlFLGNBQVEsWUFBWSxTQUFTO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBRUEsYUFBVyxlQUFlLE9BQU8sT0FBTyxjQUFjLFlBQVksR0FBRztBQUNuRSxpQkFBYSxrQkFBa0IsT0FBTztBQUFBLEVBQ3hDO0FBRUEsU0FBTztBQUVQLFdBQVMsUUFBUSxZQUFvQixXQUE0QjtBQUMvRCxRQUFJLGNBQWMscUJBQXFCLFlBQVksVUFBVSxJQUFJLEdBQUcsVUFBVSxNQUFNLE1BQU07QUFDeEYsZ0JBQVUsSUFBSSxZQUFZLFNBQVM7QUFBQSxJQUNyQztBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsdUJBQTBDO0FBQ2pELGFBQU8sK0NBQXVDLG1CQUFtQjtBQUFBLElBQy9ELGVBQWUsb0JBQUksSUFBb0I7QUFBQSxJQUN2QyxvQkFBb0Isb0JBQUksSUFBeUI7QUFBQSxJQUNqRCxvQkFBb0Isb0JBQUksSUFBeUI7QUFBQSxFQUNuRCxDQUFDLEVBQUU7QUFDTDtBQUNBLFNBQVMsa0JBQWtCLEtBQVUsWUFBZ0Q7QUFDbkYsUUFBTSxPQUFPLElBQUksY0FBYyxVQUFVLFVBQVUsR0FBRztBQUN0RCxTQUFPLFNBQVMsU0FBWSxTQUFZLElBQUksY0FBYyxjQUFjLElBQUk7QUFDOUU7QUFTQSxTQUFTLG1CQUFtQixPQUFnRDtBQUMxRSxTQUFPLFFBQVEsQ0FBQyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsR0FBRyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNuRztBQVFBLFNBQVMsWUFBWSxNQUFzQjtBQUN6QyxRQUFNLFlBQVksS0FBSyxRQUFRLEdBQUc7QUFDbEMsU0FBTyxjQUFjLEtBQUssT0FBTyxLQUFLLE1BQU0sR0FBRyxTQUFTO0FBQzFEO0FBUUEsU0FBUyxvQkFBb0IsTUFBc0I7QUFDakQsUUFBTSxXQUFXLFlBQVksSUFBSSxFQUFFLFlBQVk7QUFDL0MsU0FBTyxTQUFTLE1BQU0sU0FBUyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3JEO0FBVUEsU0FBUyxrQkFBa0IsVUFBNEI7QUFDckQsUUFBTSxVQUFVLFNBQVMsWUFBWTtBQUNyQyxTQUFPLFFBQVEsU0FBUyxlQUFlLElBQUksQ0FBQyxTQUFTLFFBQVEsTUFBTSxHQUFHLENBQUMsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTztBQUM1RztBQUVBLFNBQVMsWUFBWSxLQUFVLE1BQXlCLFlBQW9CLE1BQW9CO0FBQzlGLGVBQWEsTUFBTSxVQUFVO0FBQzdCLFFBQU0sUUFBUSxJQUFJLGNBQWMsY0FBYyxJQUFJO0FBTWxELE1BQUksQ0FBQyxPQUFPO0FBQ1Y7QUFBQSxFQUNGO0FBRUEsUUFBTSxXQUFXLG9CQUFJLElBQVk7QUFDakMsYUFBVyxhQUFhLG1CQUFtQixLQUFLLEdBQUc7QUFDakQsYUFBUyxJQUFJLG9CQUFvQixVQUFVLElBQUksQ0FBQztBQUFBLEVBQ2xEO0FBQ0EsYUFBVyxXQUFXLFVBQVU7QUFDOUIsUUFBSSxjQUFjLEtBQUssbUJBQW1CLElBQUksT0FBTztBQUNyRCxRQUFJLENBQUMsYUFBYTtBQUNoQixvQkFBYyxvQkFBSSxJQUFZO0FBQzlCLFdBQUssbUJBQW1CLElBQUksU0FBUyxXQUFXO0FBQUEsSUFDbEQ7QUFDQSxnQkFBWSxJQUFJLFVBQVU7QUFBQSxFQUM1QjtBQUNBLE9BQUssbUJBQW1CLElBQUksWUFBWSxRQUFRO0FBQ2hELE9BQUssY0FBYyxJQUFJLFlBQVksSUFBSTtBQUN6QztBQUVBLFNBQVMsUUFBUSxLQUFVLE1BQStCO0FBQ3hELFFBQU0sWUFBWSxJQUFJLGNBQWM7QUFFcEMsYUFBVyxjQUFjLEtBQUssbUJBQW1CLEtBQUssR0FBRztBQUN2RCxRQUFJLENBQUMsT0FBTyxPQUFPLFdBQVcsVUFBVSxHQUFHO0FBQ3pDLG1CQUFhLE1BQU0sVUFBVTtBQUFBLElBQy9CO0FBQUEsRUFDRjtBQUVBLGFBQVcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUssT0FBTyxRQUFRLFNBQVMsR0FBRztBQUM5RCxRQUFJLEtBQUssY0FBYyxJQUFJLFVBQVUsTUFBTSxNQUFNO0FBQy9DLGtCQUFZLEtBQUssTUFBTSxZQUFZLElBQUk7QUFBQSxJQUN6QztBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsYUFBYSxNQUF5QixZQUEwQjtBQUN2RSxhQUFXLFdBQVcsS0FBSyxtQkFBbUIsSUFBSSxVQUFVLEtBQUssQ0FBQyxHQUFHO0FBQ25FLFVBQU0sa0JBQWMsc0NBQWtCLEtBQUssbUJBQW1CLElBQUksT0FBTyxDQUFDO0FBQzFFLGdCQUFZLE9BQU8sVUFBVTtBQUM3QixRQUFJLFlBQVksU0FBUyxHQUFHO0FBQzFCLFdBQUssbUJBQW1CLE9BQU8sT0FBTztBQUFBLElBQ3hDO0FBQUEsRUFDRjtBQUNBLE9BQUssbUJBQW1CLE9BQU8sVUFBVTtBQUN6QyxPQUFLLGNBQWMsT0FBTyxVQUFVO0FBQ3RDOyIsIm5hbWVzIjpbXX0=
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrbGluay1pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQW5zd2VycyBcIndoaWNoIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byB0aGlzIGZpbGU/XCIgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBub3RlcyB0aGF0IENPVUxEIGhvbGQgb25lLCBpbnN0ZWFkIG9mXG4gKiByZXNvbHZpbmcgZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBtZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSlgIGlzIG5vdCBhbiBpbmRleCBsb29rdXAuIFJlYWQgb3V0IG9mIHRoZSAxLjE0LjIgYnVuZGxlLCBpdCBpc1xuICogYGl0ZXJhdGVBbGxSZWZzYCDigJQgZXZlcnkgYGZyb250bWF0dGVyTGlua3NgLCBgbGlua3NgIGFuZCBgZW1iZWRzYCBlbnRyeSBvZiBldmVyeSBjYWNoZWQgbm90ZSwgcGx1cyBldmVyeVxuICogcmVmZXJlbmNlIGVhY2ggYGxpbmtVcGRhdGVyc2AgZW50cnkgKHRoZSBjYW52YXMgb25lKSByZXBvcnRzIOKAlCB3aXRoIG9uZSBgZ2V0Rmlyc3RMaW5rcGF0aERlc3RgIHBlciByZWZlcmVuY2UsXG4gKiBrZWVwaW5nIHRob3NlIHRoYXQgcmVzb2x2ZSB0byBgZmlsZWAuIFRoYXQgaXMgfjExNSBtcyBhdCAxMDBrIHJlZmVyZW5jZXMgYW5kIH4zMjAgbXMgYXQgMjUwaywgcGFpZCBvbmNlIHBlciBmaWxlXG4gKiBieSBldmVyeSBwZXItZmlsZSBiYWNrbGluayBsb29rdXAsIHNvIGEgMTAwMC1ub3RlIGZvbGRlciByZW5hbWUgaW4gYSA1MGstbm90ZSB2YXVsdCB0b29rIDkyNCBzLlxuICpcbiAqIFdoYXQgbWFrZXMgYSBuYXJyb3dlciBhbnN3ZXIgZXhhY3QgaXMgYSBwcm9wZXJ0eSBvZiBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aERlc3RgOiBldmVyeSBicmFuY2ggb2YgaXQgY2FuIG9ubHlcbiAqIHJldHVybiBhIGZpbGUgd2hvc2UgbG93ZXJjYXNlZCBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgdGhlIGxpbmtwYXRoLCBvciB0aGF0IHNlZ21lbnQgcGx1c1xuICogYC5tZGAuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSBsaW5rcGF0aCAoYFtbI0hlYWRpbmddXWApLCB3aGljaCByZXR1cm5zIHRoZSBzb3VyY2Ugbm90ZSBpdHNlbGYuIFNvIGFcbiAqIG5vdGUgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8gYGZpbGVgIG9ubHkgaWYgaXQgaG9sZHMgYSByZWZlcmVuY2Ugd2hvc2UgbGFzdCBzZWdtZW50IG1hdGNoZXMgb25lIG9mIGBmaWxlYCdzXG4gKiBuYW1lIGtleXMsIG9yIGlmIGl0IElTIGBmaWxlYC4gVGhpcyBtb2R1bGUgaW5kZXhlcyBub3RlcyBieSB0aG9zZSBzZWdtZW50cywgdGFrZXMgdGhlIGNhbmRpZGF0ZXMgZm9yIGBmaWxlYCxcbiAqIGFuZCBydW5zIE9ic2lkaWFuJ3Mgb3duIHByZWRpY2F0ZSDigJQgYGdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtwYXRoLCBzb3VyY2UpID09PSBmaWxlYCDigJQgb3ZlciB0aGUgY2FuZGlkYXRlcydcbiAqIHJlZmVyZW5jZXMgb25seS4gVGhlIGNhbmRpZGF0ZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIHJlYWwgYmFja2xpbmtzIGFuZCB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIG9uZSwgc29cbiAqIHRoZSBhbnN3ZXIgaXMgdGhlIG9uZSB0aGUgZnVsbCB3YWxrIGdpdmVzLCBhIGZpbGUgcmVnaXN0ZXJlZCBhdCBhIG5vbi1leGlzdGluZyBwYXRoIGluY2x1ZGVkLiBPbmx5IHRoZSBPUkRFUlxuICogb2YgdGhlIG5vdGVzIGluIHRoZSBhbnN3ZXIgZGlmZmVyczogdGhlIGZpbGUgaXRzZWxmIGZpcnN0LCB0aGVuIHRoZSBjYW5kaWRhdGVzIGluIGluZGV4IG9yZGVyLlxuICpcbiAqIFRoZSBpbmRleCBpcyBrZXB0IGZyZXNoIHdpdGhvdXQgbGlzdGVuaW5nIHRvIGFueXRoaW5nLiBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgIG1hcHMgYSBub3RlIHRvIHRoZSBoYXNoIG9mXG4gKiBpdHMgY29udGVudCwgYW5kIHRoZSByZWZlcmVuY2VzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoYXQgaGFzaCwgc28gZWFjaCBxdWVyeSBjb21wYXJlcyBldmVyeSBub3RlJ3MgaGFzaFxuICogYWdhaW5zdCB0aGUgb25lIGl0IHdhcyBpbmRleGVkIGF0IGFuZCByZS1yZWFkcyBvbmx5IHRoZSBub3RlcyB0aGF0IGNoYW5nZWQuIFRoYXQgaXMgb25lIHByb3BlcnR5IGNvbXBhcmlzb25cbiAqIHBlciBub3RlIGFuZCBubyByZXNvbHV0aW9uIGF0IGFsbCwgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHNjYW4gT2JzaWRpYW4gaXRzZWxmIHJ1bnMgb24gZXZlcnkgcmVuYW1lXG4gKiAoYHVwZGF0ZVJlbGF0ZWRMaW5rc2ApLiBEZXBlbmRpbmcgb24gbm8gZXZlbnQgYWxzbyBtZWFucyBkZXBlbmRpbmcgb24gbm8gZXZlbnQgT1JERVIsIHdoaWNoIG1hdHRlcnMgYmVjYXVzZVxuICogcmVuYW1lIGhhbmRsZXJzIHF1ZXJ5IGZyb20gaW5zaWRlIHRoZSB2YXVsdCBgcmVuYW1lYCBldmVudC5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgaW5kZXggcGVyIHJlbmRlcmVyIHJlYWxtLCBoZWxkIGluIHRoZSByZWFsbS1nbG9iYWwgc2hhcmVkLXN0YXRlIGJhZywgc28gZXZlcnkgcGx1Z2luIGJ1bmRsaW5nIHRoaXMgbGlicmFyeVxuICogc2hhcmVzIGl0IHJhdGhlciB0aGFuIGVhY2ggYnVpbGRpbmcgaXRzIG93bi4gV2hhdCBpcyBzdG9yZWQgdGhlcmUgaXMgcGxhaW4gZGF0YSByZWFkIHN0cnVjdHVyYWxseSAobWFwcyBhbmRcbiAqIHNldHMsIG5ldmVyIGEgY2xhc3MgaW5zdGFuY2UpLCBiZWNhdXNlIHRoZSBiYWcgY3Jvc3NlcyBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5IGF0IGRpZmZlcmVudCB2ZXJzaW9ucy4gVGhlIGtleVxuICogY2FycmllcyBhIHZlcnNpb246IGEgY2hhbmdlIHRvIHdoYXQgYSBrZXkgTUVBTlMgKGhvdyBhIG5hbWUga2V5IGlzIGRlcml2ZWQpIG11c3QgbW92ZSB0byBhIG5ldyBrZXksIHNvIGFuIG9sZGVyXG4gKiBjb3B5IG5ldmVyIHJlYWRzIGFuIGluZGV4IGJ1aWx0IGJ5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBUaGUgYGxpbmtVcGRhdGVyc2Agc2lkZSBpcyBzdGlsbCB3YWxrZWQgaW4gZnVsbCBvbiBldmVyeSBxdWVyeS4gSW4gMS4xNC4yIHRoZSBvbmx5IHVwZGF0ZXIgaXMgdGhlIGNhbnZhc1xuICogb25lLCB3aG9zZSByZWZlcmVuY2VzIGxpdmUgaW4gdGhlIGNhbnZhcyBpbmRleCByYXRoZXIgdGhhbiBpbiBgZmlsZUNhY2hlYCwgc28gdGhlcmUgaXMgbm8gaGFzaCB0byBrZXkgdGhlbVxuICogYnk7IGEgdmF1bHQncyBjYW52YXNlcyBob2xkIGEgc21hbGwgZnJhY3Rpb24gb2YgaXRzIHJlZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IEN1c3RvbUFycmF5RGljdEltcGwgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIGNhbGxiYWNrIE9ic2lkaWFuJ3MgYG1ldGFkYXRhQ2FjaGUuaXRlcmF0ZUFsbFJlZnNgIHRha2VzLlxuICovXG5leHBvcnQgdHlwZSBJdGVyYXRlUmVmZXJlbmNlc0NhbGxiYWNrID0gUGFyYW1ldGVyczxBcHBbJ21ldGFkYXRhQ2FjaGUnXVsnaXRlcmF0ZUFsbFJlZnMnXT5bMF07XG5cbmludGVyZmFjZSBCYWNrbGlua0luZGV4RGF0YSB7XG4gIHJlYWRvbmx5IGluZGV4ZWRIYXNoZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWVLZXlTb3VyY2VQYXRoczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICByZWFkb25seSBzb3VyY2VQYXRoTmFtZUtleXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuY29uc3QgTUFSS0RPV05fU1VGRklYID0gJy5tZCc7XG5cbi8qKlxuICogVGhlIHNhbWUgYW5zd2VyIGFzIGBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpYCAoT2JzaWRpYW4ncyBvd24sIHVucGF0Y2hlZCksIGZyb20gdGhlIGNhbmRpZGF0ZVxuICogbm90ZXMgb25seS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3Igd2h5IHRoZSBhbnN3ZXIgaXMgZXhhY3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHdob3NlIGJhY2tsaW5rcyB0byBmaW5kLiBJdCBtYXkgYmUgYSBub24tZXhpc3RpbmcgZmlsZSByZWdpc3RlcmVkIGZvciB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYGZpbGVgLCBrZXllZCBieSB0aGUgcGF0aCBvZiB0aGUgbm90ZSBvciBjYW52YXMgaG9sZGluZyB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG1ldGFkYXRhQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZTtcbiAgY29uc3QgYmFja2xpbmtzID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuXG4gIC8vIFRoZSBmaWxlIGl0c2VsZiBpcyBhIGNhbmRpZGF0ZSBmb3IgaXRzIG93biBgW1sjSGVhZGluZ11dYCByZWZlcmVuY2VzLCB3aG9zZSBlbXB0eSBsaW5rcGF0aCBuYW1lcyBubyBzZWdtZW50LlxuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlLm5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgY29sbGVjdChzb3VyY2VQYXRoLCByZWZlcmVuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlua1VwZGF0ZXIgb2YgT2JqZWN0LnZhbHVlcyhtZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY29sbGVjdCk7XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3Qoc291cmNlUGF0aDogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge1xuICAgIGlmIChtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKHJlZmVyZW5jZS5saW5rKSwgc291cmNlUGF0aCkgPT09IGZpbGUpIHtcbiAgICAgIGJhY2tsaW5rcy5hZGQoc291cmNlUGF0aCwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXNpdHMgdGhlIHJlZmVyZW5jZXMgYGFwcC5tZXRhZGF0YUNhY2hlLml0ZXJhdGVBbGxSZWZzYCB3b3VsZCB2aXNpdCwgbWludXMgZXZlcnkgcmVmZXJlbmNlIHdob3NlIHJlc29sdXRpb25cbiAqIGNhbm5vdCBjaGFuZ2Ugd2hlbiBgZmlsZWAgaXMgcmVuYW1lZCB0byBgbmV3UGF0aGAuXG4gKlxuICogT2JzaWRpYW4ncyBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCByZXNvbHZlcyBFVkVSWSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0IGJlZm9yZSBlYWNoIHJlbmFtZSwgdG8gZGlmZlxuICogdGhlIHJlc29sdXRpb25zIGFmdGVyd2FyZHMgaW4gYHVwZGF0ZUFsbExpbmtzYDsgdGhhdCBpcyB0aGUgd2hvbGUgY29zdCBvZiBhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0LiBBIHJlZmVyZW5jZVxuICogY2FuIHJlc29sdmUgdG8gYGZpbGVgIG9ubHkgaWYgaXRzIGxpbmtwYXRoJ3MgbGFzdCBzZWdtZW50IG1hdGNoZXMgYGZpbGVgJ3MgbmFtZSBiZWZvcmUgdGhlIHJlbmFtZSBvciBpdHMgbmFtZVxuICogYWZ0ZXIgaXQgKHNlZSB0aGUgZmlsZSBoZWFkZXIpLCBhbmQgYSByZWZlcmVuY2UgdGhhdCByZXNvbHZlcyB0byBuZWl0aGVyIGtlZXBzIHJlc29sdmluZyB0byB3aGF0ZXZlciBpdCBkaWQuIFNvXG4gKiB0aGUgcmVmZXJlbmNlcyB0aGF0IGNhbiBjaGFuZ2UgYXJlIHRob3NlIG9mIHRoZSBpbmRleCdzIGNhbmRpZGF0ZXMgZm9yIGJvdGggbmFtZXMsIHBsdXMgdGhlIHJlZmVyZW5jZXMgaGVsZCBieVxuICogYGZpbGVgIGl0c2VsZiwgd2hvc2UgcmVsYXRpdmUgbGlua3MgcmVzb2x2ZSBmcm9tIGl0cyBuZXcgZm9sZGVyIGFmdGVyd2FyZHMuIGBsaW5rVXBkYXRlcnNgIHJlZmVyZW5jZXMgYXJlIHdhbGtlZFxuICogaW4gZnVsbCwgYXMgaW4ge0BsaW5rIGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlfS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgYmVpbmcgcmVuYW1lZCwgc3RpbGwgYXQgaXRzIG9sZCBwYXRoLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCBpdCBpcyBiZWluZyByZW5hbWVkIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHdpdGggZWFjaCByZWZlcmVuY2UgYW5kIHRoZSBwYXRoIG9mIHRoZSBub3RlIGhvbGRpbmcgaXQuIFJldHVybmluZyBgdHJ1ZWAgc3RvcHMgdGhlXG4gKiAgIHdhbGsgb3ZlciB0aGF0IG5vdGUncyByZWZlcmVuY2VzLCBhcyBpbiBPYnNpZGlhbidzIG93biB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVJlZmVyZW5jZXNBZmZlY3RlZEJ5UmVuYW1lKFxuICBhcHA6IEFwcCxcbiAgZmlsZTogVEZpbGUsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgY2FsbGJhY2s6IEl0ZXJhdGVSZWZlcmVuY2VzQ2FsbGJhY2tcbik6IHZvaWQge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG5ld05hbWUgPSBuZXdQYXRoLnNsaWNlKG5ld1BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBbLi4uZ2V0VGFyZ2V0TmFtZUtleXMoZmlsZS5uYW1lKSwgLi4uZ2V0VGFyZ2V0TmFtZUtleXMobmV3TmFtZSldKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgaWYgKGNhbGxiYWNrKHNvdXJjZVBhdGgsIHJlZmVyZW5jZSkgPT09IHRydWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBsaW5rVXBkYXRlciBvZiBPYmplY3QudmFsdWVzKGFwcC5tZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY2FsbGJhY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJhY2tsaW5rSW5kZXhEYXRhKCk6IEJhY2tsaW5rSW5kZXhEYXRhIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8QmFja2xpbmtJbmRleERhdGE+KCdiYWNrbGlua0luZGV4VjEnLCB7XG4gICAgaW5kZXhlZEhhc2hlczogbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbiAgICBuYW1lS2V5U291cmNlUGF0aHM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKSxcbiAgICBzb3VyY2VQYXRoTmFtZUtleXM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKVxuICB9KS52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENhY2hlZE1ldGFkYXRhKGFwcDogQXBwLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbc291cmNlUGF0aF0/Lmhhc2g7XG4gIHJldHVybiBoYXNoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2hhc2hdO1xufVxuXG4vKipcbiAqIExpc3RzIGEgY2FjaGVkIG5vdGUncyByZWZlcmVuY2VzIGluIHRoZSBvcmRlciBPYnNpZGlhbidzIG93biB3YWxrIHZpc2l0cyB0aGVtOiBgZnJvbnRtYXR0ZXJMaW5rc2AsIHRoZW5cbiAqIGBsaW5rc2AsIHRoZW4gYGVtYmVkc2AuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG5vdGUncyBjYWNoZWQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbm90ZSdzIHJlZmVyZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIGdldENhY2hlUmVmZXJlbmNlcyhjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VbXSB7XG4gIHJldHVybiBjYWNoZSA/IFsuLi5jYWNoZS5mcm9udG1hdHRlckxpbmtzID8/IFtdLCAuLi5jYWNoZS5saW5rcyA/PyBbXSwgLi4uY2FjaGUuZW1iZWRzID8/IFtdXSA6IFtdO1xufVxuXG4vKipcbiAqIFN0cmlwcyB0aGUgc3VicGF0aCBmcm9tIGEgbGluaywgdGhlIHdheSBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aGAgZG9lcy5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRleHQsIHN1Y2ggYXMgYGZvbGRlci9Ob3RlI0hlYWRpbmdgLlxuICogQHJldHVybnMgVGhlIGxpbmtwYXRoLCBzdWNoIGFzIGBmb2xkZXIvTm90ZWAuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtwYXRoKGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hJbmRleCA9IGxpbmsuaW5kZXhPZignIycpO1xuICByZXR1cm4gaGFzaEluZGV4ID09PSAtMSA/IGxpbmsgOiBsaW5rLnNsaWNlKDAsIGhhc2hJbmRleCk7XG59XG5cbi8qKlxuICogVGhlIGtleSBhIHJlZmVyZW5jZSBpcyBpbmRleGVkIHVuZGVyOiB0aGUgbG93ZXJjYXNlZCBsYXN0IGAvYCBzZWdtZW50IG9mIGl0cyBsaW5rcGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UncyBsaW5rIHRleHQuXG4gKiBAcmV0dXJucyBUaGUga2V5LlxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VOYW1lS2V5KGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmtwYXRoID0gZ2V0TGlua3BhdGgobGluaykudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGxpbmtwYXRoLnNsaWNlKGxpbmtwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbn1cblxuLyoqXG4gKiBUaGUga2V5cyB1bmRlciB3aGljaCBhIHJlZmVyZW5jZSB0byBhIGZpbGUgd2l0aCB0aGlzIG5hbWUgY2FuIGJlIGluZGV4ZWQuIGBnZXRMaW5rcGF0aERlc3RgIG1hdGNoZXMgYVxuICogc2VnbWVudCBhZ2FpbnN0IHRoZSBmaWxlJ3MgbmFtZSwgYW5kIGFnYWluc3QgdGhlIG5hbWUgd2l0aCBgLm1kYCBhcHBlbmRlZCwgc28gYSBub3RlIG5hbWVkIGBOb3RlLm1kYCBpc1xuICogcmVhY2hhYmxlIGZyb20gYm90aCBgbm90ZS5tZGAgYW5kIGBub3RlYC5cbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgZmlsZSdzIG5hbWUsIGV4dGVuc2lvbiBpbmNsdWRlZC5cbiAqIEByZXR1cm5zIFRoZSBrZXlzLlxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lS2V5ID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5hbWVLZXkuZW5kc1dpdGgoTUFSS0RPV05fU1VGRklYKSA/IFtuYW1lS2V5LCBuYW1lS2V5LnNsaWNlKDAsIC1NQVJLRE9XTl9TVUZGSVgubGVuZ3RoKV0gOiBbbmFtZUtleV07XG59XG5cbmZ1bmN0aW9uIGluZGV4U291cmNlKGFwcDogQXBwLCBkYXRhOiBCYWNrbGlua0luZGV4RGF0YSwgc291cmNlUGF0aDogc3RyaW5nLCBoYXNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgcmVtb3ZlU291cmNlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbaGFzaF07XG4gIC8qXG4gICAqIEEgbm90ZSdzIGBmaWxlQ2FjaGVgIGVudHJ5IGNhbiBjYXJyeSBpdHMgbmV3IGhhc2ggYmVmb3JlIHRoZSBtZXRhZGF0YSBmb3IgdGhhdCBoYXNoIGlzIHN0b3JlZC4gUmVjb3JkaW5nXG4gICAqIHRoZSBoYXNoIHRoZW4gd291bGQgcGluIHRoZSBub3RlIGF0IFwibm8gcmVmZXJlbmNlc1wiIHVudGlsIGl0cyBjb250ZW50IGNoYW5nZWQgYWdhaW4sIHNvIGxlYXZlIGl0XG4gICAqIHVucmVjb3JkZWQgYW5kIGxldCB0aGUgbmV4dCBxdWVyeSBsb29rIGFnYWluLlxuICAgKi9cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5hbWVLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhjYWNoZSkpIHtcbiAgICBuYW1lS2V5cy5hZGQoZ2V0UmVmZXJlbmNlTmFtZUtleShyZWZlcmVuY2UubGluaykpO1xuICB9XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBuYW1lS2V5cykge1xuICAgIGxldCBzb3VyY2VQYXRocyA9IGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KTtcbiAgICBpZiAoIXNvdXJjZVBhdGhzKSB7XG4gICAgICBzb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuc2V0KG5hbWVLZXksIHNvdXJjZVBhdGhzKTtcbiAgICB9XG4gICAgc291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICB9XG4gIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLnNldChzb3VyY2VQYXRoLCBuYW1lS2V5cyk7XG4gIGRhdGEuaW5kZXhlZEhhc2hlcy5zZXQoc291cmNlUGF0aCwgaGFzaCk7XG59XG5cbi8qKlxuICogQnJpbmdzIHRoZSBpbmRleCBpbiBsaW5lIHdpdGggYG1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlYC4gSXQgcnVucyBvbiBldmVyeSBxdWVyeSwgc28gaXQgaXMgb25lIHBhc3Mgb3ZlclxuICogYGZpbGVDYWNoZWAgd2l0aCBubyBhbGxvY2F0aW9uIHBlciBub3RlIChhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0IHF1ZXJpZXMgc2V2ZXJhbCB0aW1lcyksIGFuZCB0aGUgcGFzcyBvdmVyIHRoZVxuICogaW5kZXggdGhhdCBmaW5kcyBub3RlcyBnb25lIGZyb20gYGZpbGVDYWNoZWAgcnVucyBvbmx5IHdoZW4gdGhhdCBmaXJzdCBwYXNzIGRpZCBub3Qgc2VlIGV2ZXJ5IGluZGV4ZWQgbm90ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGluZGV4LlxuICovXG5mdW5jdGlvbiByZWZyZXNoKGFwcDogQXBwLCBkYXRhOiBCYWNrbGlua0luZGV4RGF0YSk6IHZvaWQge1xuICBjb25zdCBmaWxlQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGU7XG4gIGNvbnN0IGluZGV4ZWRDb3VudEJlZm9yZSA9IGRhdGEuaW5kZXhlZEhhc2hlcy5zaXplO1xuICBsZXQgc2VlbkluZGV4ZWRDb3VudCA9IDA7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbiAtLSBgT2JqZWN0Lmhhc093bmAgYmVsb3cgaXMgdGhlIGd1YXJkOyBgZm9yLi4uaW5gIGF2b2lkcyBhbiBlbnRyeSBhcnJheSBwZXIgbm90ZS5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIGluIGZpbGVDYWNoZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0Lmhhc093bihmaWxlQ2FjaGUsIHNvdXJjZVBhdGgpID8gZmlsZUNhY2hlW3NvdXJjZVBhdGhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpbmRleGVkSGFzaCA9IGRhdGEuaW5kZXhlZEhhc2hlcy5nZXQoc291cmNlUGF0aCk7XG4gICAgaWYgKGluZGV4ZWRIYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlZW5JbmRleGVkQ291bnQrKztcbiAgICB9XG4gICAgaWYgKGluZGV4ZWRIYXNoICE9PSBlbnRyeS5oYXNoKSB7XG4gICAgICBpbmRleFNvdXJjZShhcHAsIGRhdGEsIHNvdXJjZVBhdGgsIGVudHJ5Lmhhc2gpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzZWVuSW5kZXhlZENvdW50ID09PSBpbmRleGVkQ291bnRCZWZvcmUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMua2V5cygpKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGZpbGVDYWNoZSwgc291cmNlUGF0aCkpIHtcbiAgICAgIHJlbW92ZVNvdXJjZShkYXRhLCBzb3VyY2VQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lS2V5IG9mIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLmdldChzb3VyY2VQYXRoKSA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZVBhdGhzID0gZW5zdXJlTm9uTnVsbGFibGUoZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZ2V0KG5hbWVLZXkpKTtcbiAgICBzb3VyY2VQYXRocy5kZWxldGUoc291cmNlUGF0aCk7XG4gICAgaWYgKHNvdXJjZVBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmRlbGV0ZShuYW1lS2V5KTtcbiAgICB9XG4gIH1cbiAgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuZGVsZXRlKHNvdXJjZVBhdGgpO1xuICBkYXRhLmluZGV4ZWRIYXNoZXMuZGVsZXRlKHNvdXJjZVBhdGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnREEseUJBQWtDO0FBQ2xDLDZCQUFvQztBQUVwQyxnQ0FBb0M7QUFhcEMsTUFBTSxrQkFBa0I7QUFVakIsU0FBUywyQkFBMkIsS0FBVSxNQUF5QztBQUM1RixRQUFNLE9BQU8scUJBQXFCO0FBQ2xDLFVBQVEsS0FBSyxJQUFJO0FBRWpCLFFBQU0sZ0JBQWdCLElBQUk7QUFDMUIsUUFBTSxZQUFZLElBQUksMkNBQStCO0FBR3JELFFBQU0sdUJBQXVCLG9CQUFJLElBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUN4RCxhQUFXLFdBQVcsa0JBQWtCLEtBQUss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