@mnaoumov/obsidian-lib 10.5.1 → 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 (129) hide show
  1. package/codemirror/inline-token-widgets/package.json +6 -0
  2. package/codemirror/settings-facet/package.json +6 -0
  3. package/components/settings-facet-component/package.json +6 -0
  4. package/dist/lib/cjs/__merged.cjs +96 -1
  5. package/dist/lib/cjs/__merged.d.cts +17 -0
  6. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  7. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  8. package/dist/lib/cjs/bug-report.cjs +4 -2
  9. package/dist/lib/cjs/bug-report.d.cts +1 -1
  10. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  11. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  12. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  13. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  14. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  15. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  16. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  17. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  18. package/dist/lib/cjs/components/index.cjs +4 -1
  19. package/dist/lib/cjs/components/index.d.cts +1 -0
  20. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  21. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  22. package/dist/lib/cjs/css-class.cjs +8 -1
  23. package/dist/lib/cjs/css-class.d.cts +28 -0
  24. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  25. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  26. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  27. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  28. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  29. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  30. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  31. package/dist/lib/cjs/hotkey.cjs +185 -0
  32. package/dist/lib/cjs/hotkey.d.cts +59 -0
  33. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  34. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  35. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  36. package/dist/lib/cjs/index.cjs +31 -1
  37. package/dist/lib/cjs/index.d.cts +10 -0
  38. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  39. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  40. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  41. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  42. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  43. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  44. package/dist/lib/cjs/markdown.cjs +6 -1
  45. package/dist/lib/cjs/markdown.d.cts +10 -1
  46. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  47. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  48. package/dist/lib/cjs/request-url.cjs +523 -0
  49. package/dist/lib/cjs/request-url.d.cts +233 -0
  50. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  51. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  52. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  53. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  54. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  55. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  56. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  57. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  58. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  59. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  60. package/dist/lib/cjs/setting-ex.cjs +51 -1
  61. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  62. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  63. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  64. package/dist/lib/esm/__merged.d.mts +17 -0
  65. package/dist/lib/esm/__merged.mjs +99 -1
  66. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  67. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  68. package/dist/lib/esm/bug-report.d.mts +1 -1
  69. package/dist/lib/esm/bug-report.mjs +4 -2
  70. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  71. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  72. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  73. package/dist/lib/esm/codemirror/index.mjs +5 -1
  74. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  75. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  76. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  77. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  78. package/dist/lib/esm/components/index.d.mts +1 -0
  79. package/dist/lib/esm/components/index.mjs +3 -1
  80. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  81. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  82. package/dist/lib/esm/css-class.d.mts +28 -0
  83. package/dist/lib/esm/css-class.mjs +8 -1
  84. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  85. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  86. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  87. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  88. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  89. package/dist/lib/esm/editor-suggest.mjs +109 -0
  90. package/dist/lib/esm/generated-during-build.mjs +2 -2
  91. package/dist/lib/esm/hotkey.d.mts +59 -0
  92. package/dist/lib/esm/hotkey.mjs +95 -0
  93. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  94. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  95. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  96. package/dist/lib/esm/index.d.mts +10 -0
  97. package/dist/lib/esm/index.mjs +21 -1
  98. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  99. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  100. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  101. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  102. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  103. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  104. package/dist/lib/esm/markdown.d.mts +10 -1
  105. package/dist/lib/esm/markdown.mjs +9 -1
  106. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  107. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  108. package/dist/lib/esm/request-url.d.mts +233 -0
  109. package/dist/lib/esm/request-url.mjs +428 -0
  110. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  111. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  112. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  113. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  114. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  115. package/dist/lib/esm/setting-components/index.mjs +9 -1
  116. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  117. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  118. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  119. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  120. package/dist/lib/esm/setting-ex.d.mts +35 -1
  121. package/dist/lib/esm/setting-ex.mjs +51 -1
  122. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  123. package/dist/lib/esm/settings-tabs.mjs +170 -0
  124. package/dist/styles.css +83 -1
  125. package/package.json +1 -1
  126. package/setting-components/folder-list-component/package.json +6 -0
  127. package/setting-components/hotkey-component/package.json +6 -0
  128. package/setting-components/list-component/package.json +6 -0
  129. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,82 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Contains a component that edits a reorderable list of tags, with a tag suggest.
7
+ */
8
+ import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
9
+ import { AbstractInputSuggest } from 'obsidian';
10
+ import type { TagSuggestion } from '../link-and-tag-input-suggest.cjs';
11
+ import { ListComponent } from './list-component.cjs';
12
+ /**
13
+ * Suggests the vault's tags in an `<input>`, whether or not the typed text starts with `#`. A picked tag is put into the
14
+ * input without the `#`.
15
+ */
16
+ export declare class TagInputSuggest extends AbstractInputSuggest<TagSuggestion> {
17
+ /**
18
+ * The input the suggest completes.
19
+ */
20
+ protected readonly inputEl: HTMLInputElement;
21
+ /**
22
+ * Creates a new tag suggest.
23
+ *
24
+ * @param app - The Obsidian app.
25
+ * @param inputEl - The input.
26
+ */
27
+ constructor(app: App, inputEl: HTMLInputElement);
28
+ /**
29
+ * Renders a tag with its note count.
30
+ *
31
+ * @param suggestion - The tag.
32
+ * @param el - The element to render into.
33
+ */
34
+ renderSuggestion(suggestion: TagSuggestion, el: HTMLElement): void;
35
+ /**
36
+ * Puts the tag into the input, dispatches an `input` event, then calls the `onSelect` callback.
37
+ *
38
+ * @param suggestion - The tag.
39
+ * @param $event - The event that picked it.
40
+ */
41
+ selectSuggestion(suggestion: TagSuggestion, $event: KeyboardEvent | MouseEvent): void;
42
+ /**
43
+ * Gets the tags matching the typed text.
44
+ *
45
+ * @param query - The typed text.
46
+ * @returns The tags, best match first, then the most used.
47
+ */
48
+ protected getSuggestions(query: string): TagSuggestion[];
49
+ }
50
+ /**
51
+ * A {@link ListComponent} of tags, stored without the `#` and shown with it. The add row suggests the vault's tags, and
52
+ * a typed tag is refused unless it is a valid Obsidian tag: letters, digits, `_`, `-` and `/`, not digits only.
53
+ *
54
+ * You can add this component using {@link SettingEx.addTagList}.
55
+ */
56
+ export declare class TagListComponent extends ListComponent {
57
+ /**
58
+ * The tag suggest attached to {@link ListComponent.newItemInputEl}.
59
+ */
60
+ readonly suggest: TagInputSuggest;
61
+ /**
62
+ * Creates a new tag list component.
63
+ *
64
+ * @param containerEl - The container element.
65
+ * @param app - The Obsidian app.
66
+ */
67
+ constructor(containerEl: HTMLElement, app: App);
68
+ /**
69
+ * Shows a tag with its `#`.
70
+ *
71
+ * @param item - The tag.
72
+ * @returns The tag with its `#`.
73
+ */
74
+ protected formatItem(item: string): string;
75
+ /**
76
+ * Strips the `#` from a typed tag and validates it.
77
+ *
78
+ * @param text - The typed text.
79
+ * @returns The tag, or `null` when it is not a valid tag.
80
+ */
81
+ protected normalizeItem(text: string): null | string;
82
+ }
@@ -126,6 +126,9 @@ var import_date_component = require('./setting-components/date-component.cjs');
126
126
  var import_date_time_component = require('./setting-components/date-time-component.cjs');
127
127
  var import_email_component = require('./setting-components/email-component.cjs');
128
128
  var import_file_component = require('./setting-components/file-component.cjs');
129
+ var import_folder_list_component = require('./setting-components/folder-list-component.cjs');
130
+ var import_hotkey_component = require('./setting-components/hotkey-component.cjs');
131
+ var import_list_component = require('./setting-components/list-component.cjs');
129
132
  var import_month_component = require('./setting-components/month-component.cjs');
130
133
  var import_multiple_dropdown_component = require('./setting-components/multiple-dropdown-component.cjs');
131
134
  var import_multiple_email_component = require('./setting-components/multiple-email-component.cjs');
@@ -133,6 +136,7 @@ var import_multiple_file_component = require('./setting-components/multiple-file
133
136
  var import_multiple_text_component = require('./setting-components/multiple-text-component.cjs');
134
137
  var import_number_component = require('./setting-components/number-component.cjs');
135
138
  var import_password_component = require('./setting-components/password-component.cjs');
139
+ var import_tag_list_component = require('./setting-components/tag-list-component.cjs');
136
140
  var import_telephone_component = require('./setting-components/telephone-component.cjs');
137
141
  var import_time_component = require('./setting-components/time-component.cjs');
138
142
  var import_tri_state_checkbox_component = require('./setting-components/tri-state-checkbox-component.cjs');
@@ -210,6 +214,38 @@ class SettingEx extends import_obsidian.Setting {
210
214
  addFile(callback) {
211
215
  return this.addComponentClass(import_file_component.FileComponent, callback);
212
216
  }
217
+ /**
218
+ * Adds a {@link FolderListComponent} to the setting.
219
+ *
220
+ * @param app - The Obsidian app, for the folder suggest.
221
+ * @param callback - The callback to call with the component.
222
+ * @returns The setting instance.
223
+ */
224
+ addFolderList(app, callback) {
225
+ return this.addComponent((element) => {
226
+ const component = new import_folder_list_component.FolderListComponent(element, app);
227
+ callback(component);
228
+ return component;
229
+ });
230
+ }
231
+ /**
232
+ * Adds a {@link HotkeyComponent} to the setting.
233
+ *
234
+ * @param callback - The callback to call with the component.
235
+ * @returns The setting instance.
236
+ */
237
+ addHotkey(callback) {
238
+ return this.addComponentClass(import_hotkey_component.HotkeyComponent, callback);
239
+ }
240
+ /**
241
+ * Adds a {@link ListComponent} to the setting.
242
+ *
243
+ * @param callback - The callback to call with the component.
244
+ * @returns The setting instance.
245
+ */
246
+ addList(callback) {
247
+ return this.addComponentClass(import_list_component.ListComponent, callback);
248
+ }
213
249
  /**
214
250
  * Adds a {@link MonthComponent} to the setting.
215
251
  *
@@ -273,6 +309,20 @@ class SettingEx extends import_obsidian.Setting {
273
309
  addPassword(callback) {
274
310
  return this.addComponentClass(import_password_component.PasswordComponent, callback);
275
311
  }
312
+ /**
313
+ * Adds a {@link TagListComponent} to the setting.
314
+ *
315
+ * @param app - The Obsidian app, for the tag suggest.
316
+ * @param callback - The callback to call with the component.
317
+ * @returns The setting instance.
318
+ */
319
+ addTagList(app, callback) {
320
+ return this.addComponent((element) => {
321
+ const component = new import_tag_list_component.TagListComponent(element, app);
322
+ callback(component);
323
+ return component;
324
+ });
325
+ }
276
326
  /**
277
327
  * Adds a {@link TelephoneComponent} to the setting.
278
328
  *
@@ -351,4 +401,4 @@ function adoptSettingEx(setting) {
351
401
  SettingEx,
352
402
  adoptSettingEx
353
403
  });
354
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5nLWV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFeHRlbmRzIHRoZSBTZXR0aW5nIGNsYXNzIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIGZvciBhZGRpbmcgY29tcG9uZW50cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9jaGVja2JveC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvY29kZS1oaWdobGlnaHRlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgRGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL2RhdGUtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IERhdGVUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvZGF0ZS10aW1lLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBFbWFpbENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL2VtYWlsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBGaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvZmlsZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTW9udGhDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9tb250aC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL211bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBNdWx0aXBsZUVtYWlsQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvbXVsdGlwbGUtZW1haWwtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE11bHRpcGxlRmlsZUNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL211bHRpcGxlLWZpbGUtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE11bHRpcGxlVGV4dENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL211bHRpcGxlLXRleHQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL251bWJlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgUGFzc3dvcmRDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9wYXNzd29yZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVGVsZXBob25lQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvdGVsZXBob25lLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvdGltZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVHJpU3RhdGVDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3RyaS1zdGF0ZS1jaGVja2JveC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVHlwZWREcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3R5cGVkLWRyb3Bkb3duLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBUeXBlZE11bHRpcGxlRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy90eXBlZC1tdWx0aXBsZS1kcm9wZG93bi1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVXJsQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvdXJsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBXZWVrQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvd2Vlay1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIFNldHRpbmcgY2xhc3Mgd2l0aCBhZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGFkZGluZyBjb21wb25lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ0V4IGV4dGVuZHMgU2V0dGluZyB7XG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIENoZWNrYm94Q29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRDaGVja2JveChjYWxsYmFjazogKGNoZWNrYm94OiBDaGVja2JveENvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKENoZWNrYm94Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBDb2RlSGlnaGxpZ2h0ZXJDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZENvZGVIaWdobGlnaHRlcihjYWxsYmFjazogKGNvZGVIaWdobGlnaHRlcjogQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbXBvbmVudCB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyAtIFRoZSBjbGFzcyBvZiB0aGUgY29tcG9uZW50IHRvIGFkZC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wb25lbnRDbGFzczxUIGV4dGVuZHMgQmFzZUNvbXBvbmVudD4oY29tcG9uZW50Q2xhc3M6IG5ldyAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiBULCBjYWxsYmFjazogKGNvbXBvbmVudDogVCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IGNvbXBvbmVudENsYXNzKGVsZW1lbnQpO1xuICAgICAgY2FsbGJhY2soY29tcG9uZW50KTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBEYXRlQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGREYXRlKGNhbGxiYWNrOiAoZGF0ZTogRGF0ZUNvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKERhdGVDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIERhdGVUaW1lQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGREYXRlVGltZShjYWxsYmFjazogKGRhdGVUaW1lOiBEYXRlVGltZUNvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKERhdGVUaW1lQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiB7QGxpbmsgRW1haWxDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZEVtYWlsKGNhbGxiYWNrOiAoZW1haWw6IEVtYWlsQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoRW1haWxDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIEZpbGVDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZEZpbGUoY2FsbGJhY2s6IChmaWxlOiBGaWxlQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoRmlsZUNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgTW9udGhDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE1vbnRoKGNhbGxiYWNrOiAobW9udGg6IE1vbnRoQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTW9udGhDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIE11bHRpcGxlRHJvcGRvd25Db21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE11bHRpcGxlRHJvcGRvd24oY2FsbGJhY2s6IChtdWx0aXBsZURyb3Bkb3duOiBNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgTXVsdGlwbGVFbWFpbENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkTXVsdGlwbGVFbWFpbChjYWxsYmFjazogKG11bHRpcGxlRW1haWw6IE11bHRpcGxlRW1haWxDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhNdWx0aXBsZUVtYWlsQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBNdWx0aXBsZUZpbGVDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE11bHRpcGxlRmlsZShjYWxsYmFjazogKG11bHRpcGxlRmlsZTogTXVsdGlwbGVGaWxlQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTXVsdGlwbGVGaWxlQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBNdWx0aXBsZVRleHRDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE11bHRpcGxlVGV4dChjYWxsYmFjazogKG11bHRpcGxlVGV4dDogTXVsdGlwbGVUZXh0Q29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTXVsdGlwbGVUZXh0Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBOdW1iZXJDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE51bWJlcihjYWxsYmFjazogKCRudW1iZXI6IE51bWJlckNvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKE51bWJlckNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgUGFzc3dvcmRDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFBhc3N3b3JkKGNhbGxiYWNrOiAocGFzc3dvcmQ6IFBhc3N3b3JkQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoUGFzc3dvcmRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFRlbGVwaG9uZUNvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVGVsZXBob25lKGNhbGxiYWNrOiAodGVsZXBob25lOiBUZWxlcGhvbmVDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhUZWxlcGhvbmVDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFRpbWVDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFRpbWUoY2FsbGJhY2s6ICh0aW1lOiBUaW1lQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoVGltZUNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgVHJpU3RhdGVDaGVja2JveENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVHJpU3RhdGVDaGVja2JveChjYWxsYmFjazogKHRyaVN0YXRlQ2hlY2tib3g6IFRyaVN0YXRlQ2hlY2tib3hDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhUcmlTdGF0ZUNoZWNrYm94Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBUeXBlZERyb3Bkb3duQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGRyb3Bkb3duIGl0ZW1zLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFR5cGVkRHJvcGRvd248VD4oY2FsbGJhY2s6ICh0eXBlZERyb3Bkb3duOiBUeXBlZERyb3Bkb3duQ29tcG9uZW50PFQ+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoVHlwZWREcm9wZG93bkNvbXBvbmVudDxUPiwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgVHlwZWRNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGl0ZW1zIGluIHRoZSBkcm9wZG93bi5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRUeXBlZE11bHRpcGxlRHJvcGRvd248VD4oY2FsbGJhY2s6ICh0eXBlZE11bHRpcGxlRHJvcGRvd246IFR5cGVkTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudDxUPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKFR5cGVkTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudDxUPiwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4ge0BsaW5rIFVybENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVXJsKGNhbGxiYWNrOiAodXJsOiBVcmxDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhVcmxDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFdlZWtDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFdlZWsoY2FsbGJhY2s6ICh3ZWVrOiBXZWVrQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoV2Vla0NvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogQWRvcHRzIGEgcGxhaW4ge0BsaW5rIFNldHRpbmd9IGludG8gYSB7QGxpbmsgU2V0dGluZ0V4fSwgcmV0dXJuaW5nIHRoZSB2ZXJ5IHNhbWUgaW5zdGFuY2UuXG4gKlxuICogT2JzaWRpYW4ncyBkZWNsYXJhdGl2ZSBzZXR0aW5ncyBBUEkgY3JlYXRlcyB0aGUgcm93IGl0c2VsZiBhbmQgaGFuZHMgYSBwbGFpbiB7QGxpbmsgU2V0dGluZ30gdG8gYVxuICogYFNldHRpbmdEZWZpbml0aW9uUmVuZGVyLnJlbmRlcmAgY2FsbGJhY2ssIHNvIHRoZSBleHRlbmRlZCBhZGRlcnMgYXJlIG91dCBvZiByZWFjaCB0aGVyZS4gUmUtcG9pbnRpbmcgdGhlXG4gKiBpbnN0YW5jZSdzIHByb3RvdHlwZSBhdCB7QGxpbmsgU2V0dGluZ0V4LnByb3RvdHlwZX0gbWFrZXMgdGhlbSBhdmFpbGFibGUgb24gdGhlIG9iamVjdCBPYnNpZGlhbiBhbHJlYWR5XG4gKiBvd25zIGFuZCBrZWVwcyByZW5kZXJpbmc6IHtAbGluayBTZXR0aW5nRXh9IGRlY2xhcmVzIG5vIGluc3RhbmNlIHN0YXRlIGFuZCBpdHMgY29uc3RydWN0b3Igb25seSBkZWxlZ2F0ZXNcbiAqIHRvIGBzdXBlcmAsIGFuZCBgU2V0dGluZ0V4LnByb3RvdHlwZWAgaW5oZXJpdHMgZnJvbSB0aGUgdmVyeSBgU2V0dGluZy5wcm90b3R5cGVgIHRoZSBpbnN0YW5jZSBjYW1lIGZyb20sXG4gKiBzbyBldmVyeSBtZXRob2QgT2JzaWRpYW4gcmVsaWVzIG9uIOKAlCBpbmNsdWRpbmcgdGhlIG9uZXMgYWJzZW50IGZyb20gdGhlIHB1YmxpYyB0eXBpbmdzIOKAlCBzdGF5cyByZWFjaGFibGUuXG4gKlxuICogQHBhcmFtIHNldHRpbmcgLSBUaGUgc2V0dGluZyB0byBhZG9wdC5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIGluc3RhbmNlLCB0eXBlZCBhcyBhIHtAbGluayBTZXR0aW5nRXh9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRvcHRTZXR0aW5nRXgoc2V0dGluZzogU2V0dGluZyk6IFNldHRpbmdFeCB7XG4gIGlmIChzZXR0aW5nIGluc3RhbmNlb2YgU2V0dGluZ0V4KSB7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH1cblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc2V0dGluZywgU2V0dGluZ0V4LnByb3RvdHlwZSk7XG4gIHJldHVybiBjYXN0VG88U2V0dGluZ0V4PihzZXR0aW5nKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7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
404
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5nLWV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFeHRlbmRzIHRoZSBTZXR0aW5nIGNsYXNzIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIGZvciBhZGRpbmcgY29tcG9uZW50cy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQmFzZUNvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgU2V0dGluZyB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9jaGVja2JveC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvY29kZS1oaWdobGlnaHRlci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgRGF0ZUNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL2RhdGUtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IERhdGVUaW1lQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvZGF0ZS10aW1lLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBFbWFpbENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL2VtYWlsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBGaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvZmlsZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgRm9sZGVyTGlzdENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL2ZvbGRlci1saXN0LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBIb3RrZXlDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9ob3RrZXktY29tcG9uZW50LnRzJztcbmltcG9ydCB7IExpc3RDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9saXN0LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBNb250aENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL21vbnRoLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvbXVsdGlwbGUtZHJvcGRvd24tY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE11bHRpcGxlRW1haWxDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy9tdWx0aXBsZS1lbWFpbC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTXVsdGlwbGVGaWxlQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvbXVsdGlwbGUtZmlsZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTXVsdGlwbGVUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvbXVsdGlwbGUtdGV4dC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgTnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvbnVtYmVyLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBQYXNzd29yZENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3Bhc3N3b3JkLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBUYWdMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvdGFnLWxpc3QtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFRlbGVwaG9uZUNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3RlbGVwaG9uZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVGltZUNvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3RpbWUtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFRyaVN0YXRlQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy90cmktc3RhdGUtY2hlY2tib3gtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFR5cGVkRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuL3NldHRpbmctY29tcG9uZW50cy90eXBlZC1kcm9wZG93bi1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgVHlwZWRNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi9zZXR0aW5nLWNvbXBvbmVudHMvdHlwZWQtbXVsdGlwbGUtZHJvcGRvd24tY29tcG9uZW50LnRzJztcbmltcG9ydCB7IFVybENvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3VybC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgV2Vla0NvbXBvbmVudCB9IGZyb20gJy4vc2V0dGluZy1jb21wb25lbnRzL3dlZWstY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBTZXR0aW5nIGNsYXNzIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIGZvciBhZGRpbmcgY29tcG9uZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdFeCBleHRlbmRzIFNldHRpbmcge1xuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBDaGVja2JveENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkQ2hlY2tib3goY2FsbGJhY2s6IChjaGVja2JveDogQ2hlY2tib3hDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhDaGVja2JveENvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgQ29kZUhpZ2hsaWdodGVyQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb2RlSGlnaGxpZ2h0ZXIoY2FsbGJhY2s6IChjb2RlSGlnaGxpZ2h0ZXI6IENvZGVIaWdobGlnaHRlckNvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKENvZGVIaWdobGlnaHRlckNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQgdG8gYWRkLlxuICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgLSBUaGUgY2xhc3Mgb2YgdGhlIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkQ29tcG9uZW50Q2xhc3M8VCBleHRlbmRzIEJhc2VDb21wb25lbnQ+KGNvbXBvbmVudENsYXNzOiBuZXcgKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkgPT4gVCwgY2FsbGJhY2s6IChjb21wb25lbnQ6IFQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnQoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBjb21wb25lbnRDbGFzcyhlbGVtZW50KTtcbiAgICAgIGNhbGxiYWNrKGNvbXBvbmVudCk7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgRGF0ZUNvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkRGF0ZShjYWxsYmFjazogKGRhdGU6IERhdGVDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhEYXRlQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBEYXRlVGltZUNvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkRGF0ZVRpbWUoY2FsbGJhY2s6IChkYXRlVGltZTogRGF0ZVRpbWVDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhEYXRlVGltZUNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4ge0BsaW5rIEVtYWlsQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRFbWFpbChjYWxsYmFjazogKGVtYWlsOiBFbWFpbENvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKEVtYWlsQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBGaWxlQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRGaWxlKGNhbGxiYWNrOiAoZmlsZTogRmlsZUNvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKEZpbGVDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIEZvbGRlckxpc3RDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCwgZm9yIHRoZSBmb2xkZXIgc3VnZ2VzdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRGb2xkZXJMaXN0KGFwcDogQXBwLCBjYWxsYmFjazogKGZvbGRlckxpc3Q6IEZvbGRlckxpc3RDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnQoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBGb2xkZXJMaXN0Q29tcG9uZW50KGVsZW1lbnQsIGFwcCk7XG4gICAgICBjYWxsYmFjayhjb21wb25lbnQpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIEhvdGtleUNvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkSG90a2V5KGNhbGxiYWNrOiAoaG90a2V5OiBIb3RrZXlDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhIb3RrZXlDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIExpc3RDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZExpc3QoY2FsbGJhY2s6IChsaXN0OiBMaXN0Q29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTGlzdENvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgTW9udGhDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE1vbnRoKGNhbGxiYWNrOiAobW9udGg6IE1vbnRoQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTW9udGhDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIE11bHRpcGxlRHJvcGRvd25Db21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE11bHRpcGxlRHJvcGRvd24oY2FsbGJhY2s6IChtdWx0aXBsZURyb3Bkb3duOiBNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgTXVsdGlwbGVFbWFpbENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkTXVsdGlwbGVFbWFpbChjYWxsYmFjazogKG11bHRpcGxlRW1haWw6IE11bHRpcGxlRW1haWxDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhNdWx0aXBsZUVtYWlsQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBNdWx0aXBsZUZpbGVDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE11bHRpcGxlRmlsZShjYWxsYmFjazogKG11bHRpcGxlRmlsZTogTXVsdGlwbGVGaWxlQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTXVsdGlwbGVGaWxlQ29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBNdWx0aXBsZVRleHRDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE11bHRpcGxlVGV4dChjYWxsYmFjazogKG11bHRpcGxlVGV4dDogTXVsdGlwbGVUZXh0Q29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoTXVsdGlwbGVUZXh0Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBOdW1iZXJDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZE51bWJlcihjYWxsYmFjazogKCRudW1iZXI6IE51bWJlckNvbXBvbmVudCkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKE51bWJlckNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgUGFzc3dvcmRDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFBhc3N3b3JkKGNhbGxiYWNrOiAocGFzc3dvcmQ6IFBhc3N3b3JkQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoUGFzc3dvcmRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFRhZ0xpc3RDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCwgZm9yIHRoZSB0YWcgc3VnZ2VzdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRUYWdMaXN0KGFwcDogQXBwLCBjYWxsYmFjazogKHRhZ0xpc3Q6IFRhZ0xpc3RDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnQoKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBUYWdMaXN0Q29tcG9uZW50KGVsZW1lbnQsIGFwcCk7XG4gICAgICBjYWxsYmFjayhjb21wb25lbnQpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFRlbGVwaG9uZUNvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVGVsZXBob25lKGNhbGxiYWNrOiAodGVsZXBob25lOiBUZWxlcGhvbmVDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhUZWxlcGhvbmVDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFRpbWVDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFRpbWUoY2FsbGJhY2s6ICh0aW1lOiBUaW1lQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoVGltZUNvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgVHJpU3RhdGVDaGVja2JveENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVHJpU3RhdGVDaGVja2JveChjYWxsYmFjazogKHRyaVN0YXRlQ2hlY2tib3g6IFRyaVN0YXRlQ2hlY2tib3hDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhUcmlTdGF0ZUNoZWNrYm94Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHtAbGluayBUeXBlZERyb3Bkb3duQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGRyb3Bkb3duIGl0ZW1zLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFR5cGVkRHJvcGRvd248VD4oY2FsbGJhY2s6ICh0eXBlZERyb3Bkb3duOiBUeXBlZERyb3Bkb3duQ29tcG9uZW50PFQ+KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoVHlwZWREcm9wZG93bkNvbXBvbmVudDxUPiwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB7QGxpbmsgVHlwZWRNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50fSB0byB0aGUgc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGl0ZW1zIGluIHRoZSBkcm9wZG93bi5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2l0aCB0aGUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyBhZGRUeXBlZE11bHRpcGxlRHJvcGRvd248VD4oY2FsbGJhY2s6ICh0eXBlZE11bHRpcGxlRHJvcGRvd246IFR5cGVkTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudDxUPikgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZENvbXBvbmVudENsYXNzKFR5cGVkTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudDxUPiwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4ge0BsaW5rIFVybENvbXBvbmVudH0gdG8gdGhlIHNldHRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdpdGggdGhlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgYWRkVXJsKGNhbGxiYWNrOiAodXJsOiBVcmxDb21wb25lbnQpID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb21wb25lbnRDbGFzcyhVcmxDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEge0BsaW5rIFdlZWtDb21wb25lbnR9IHRvIHRoZSBzZXR0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aXRoIHRoZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGFkZFdlZWsoY2FsbGJhY2s6ICh3ZWVrOiBXZWVrQ29tcG9uZW50KSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkQ29tcG9uZW50Q2xhc3MoV2Vla0NvbXBvbmVudCwgY2FsbGJhY2spO1xuICB9XG59XG5cbi8qKlxuICogQWRvcHRzIGEgcGxhaW4ge0BsaW5rIFNldHRpbmd9IGludG8gYSB7QGxpbmsgU2V0dGluZ0V4fSwgcmV0dXJuaW5nIHRoZSB2ZXJ5IHNhbWUgaW5zdGFuY2UuXG4gKlxuICogT2JzaWRpYW4ncyBkZWNsYXJhdGl2ZSBzZXR0aW5ncyBBUEkgY3JlYXRlcyB0aGUgcm93IGl0c2VsZiBhbmQgaGFuZHMgYSBwbGFpbiB7QGxpbmsgU2V0dGluZ30gdG8gYVxuICogYFNldHRpbmdEZWZpbml0aW9uUmVuZGVyLnJlbmRlcmAgY2FsbGJhY2ssIHNvIHRoZSBleHRlbmRlZCBhZGRlcnMgYXJlIG91dCBvZiByZWFjaCB0aGVyZS4gUmUtcG9pbnRpbmcgdGhlXG4gKiBpbnN0YW5jZSdzIHByb3RvdHlwZSBhdCB7QGxpbmsgU2V0dGluZ0V4LnByb3RvdHlwZX0gbWFrZXMgdGhlbSBhdmFpbGFibGUgb24gdGhlIG9iamVjdCBPYnNpZGlhbiBhbHJlYWR5XG4gKiBvd25zIGFuZCBrZWVwcyByZW5kZXJpbmc6IHtAbGluayBTZXR0aW5nRXh9IGRlY2xhcmVzIG5vIGluc3RhbmNlIHN0YXRlIGFuZCBpdHMgY29uc3RydWN0b3Igb25seSBkZWxlZ2F0ZXNcbiAqIHRvIGBzdXBlcmAsIGFuZCBgU2V0dGluZ0V4LnByb3RvdHlwZWAgaW5oZXJpdHMgZnJvbSB0aGUgdmVyeSBgU2V0dGluZy5wcm90b3R5cGVgIHRoZSBpbnN0YW5jZSBjYW1lIGZyb20sXG4gKiBzbyBldmVyeSBtZXRob2QgT2JzaWRpYW4gcmVsaWVzIG9uIOKAlCBpbmNsdWRpbmcgdGhlIG9uZXMgYWJzZW50IGZyb20gdGhlIHB1YmxpYyB0eXBpbmdzIOKAlCBzdGF5cyByZWFjaGFibGUuXG4gKlxuICogQHBhcmFtIHNldHRpbmcgLSBUaGUgc2V0dGluZyB0byBhZG9wdC5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIGluc3RhbmNlLCB0eXBlZCBhcyBhIHtAbGluayBTZXR0aW5nRXh9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRvcHRTZXR0aW5nRXgoc2V0dGluZzogU2V0dGluZyk6IFNldHRpbmdFeCB7XG4gIGlmIChzZXR0aW5nIGluc3RhbmNlb2YgU2V0dGluZ0V4KSB7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH1cblxuICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc2V0dGluZywgU2V0dGluZ0V4LnByb3RvdHlwZSk7XG4gIHJldHVybiBjYXN0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
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Extends the Setting class with additional methods for adding components.
7
7
  */
8
- import type { BaseComponent } from 'obsidian' with { 'resolution-mode': 'import' };
8
+ import type { App, BaseComponent } from 'obsidian' with { 'resolution-mode': 'import' };
9
9
  import { Setting } from 'obsidian';
10
10
  import { CheckboxComponent } from './setting-components/checkbox-component.cjs';
11
11
  import { CodeHighlighterComponent } from './setting-components/code-highlighter-component.cjs';
@@ -13,6 +13,9 @@ import { DateComponent } from './setting-components/date-component.cjs';
13
13
  import { DateTimeComponent } from './setting-components/date-time-component.cjs';
14
14
  import { EmailComponent } from './setting-components/email-component.cjs';
15
15
  import { FileComponent } from './setting-components/file-component.cjs';
16
+ import { FolderListComponent } from './setting-components/folder-list-component.cjs';
17
+ import { HotkeyComponent } from './setting-components/hotkey-component.cjs';
18
+ import { ListComponent } from './setting-components/list-component.cjs';
16
19
  import { MonthComponent } from './setting-components/month-component.cjs';
17
20
  import { MultipleDropdownComponent } from './setting-components/multiple-dropdown-component.cjs';
18
21
  import { MultipleEmailComponent } from './setting-components/multiple-email-component.cjs';
@@ -20,6 +23,7 @@ import { MultipleFileComponent } from './setting-components/multiple-file-compon
20
23
  import { MultipleTextComponent } from './setting-components/multiple-text-component.cjs';
21
24
  import { NumberComponent } from './setting-components/number-component.cjs';
22
25
  import { PasswordComponent } from './setting-components/password-component.cjs';
26
+ import { TagListComponent } from './setting-components/tag-list-component.cjs';
23
27
  import { TelephoneComponent } from './setting-components/telephone-component.cjs';
24
28
  import { TimeComponent } from './setting-components/time-component.cjs';
25
29
  import { TriStateCheckboxComponent } from './setting-components/tri-state-checkbox-component.cjs';
@@ -82,6 +86,28 @@ export declare class SettingEx extends Setting {
82
86
  * @returns The setting instance.
83
87
  */
84
88
  addFile(callback: (file: FileComponent) => void): this;
89
+ /**
90
+ * Adds a {@link FolderListComponent} to the setting.
91
+ *
92
+ * @param app - The Obsidian app, for the folder suggest.
93
+ * @param callback - The callback to call with the component.
94
+ * @returns The setting instance.
95
+ */
96
+ addFolderList(app: App, callback: (folderList: FolderListComponent) => void): this;
97
+ /**
98
+ * Adds a {@link HotkeyComponent} to the setting.
99
+ *
100
+ * @param callback - The callback to call with the component.
101
+ * @returns The setting instance.
102
+ */
103
+ addHotkey(callback: (hotkey: HotkeyComponent) => void): this;
104
+ /**
105
+ * Adds a {@link ListComponent} to the setting.
106
+ *
107
+ * @param callback - The callback to call with the component.
108
+ * @returns The setting instance.
109
+ */
110
+ addList(callback: (list: ListComponent) => void): this;
85
111
  /**
86
112
  * Adds a {@link MonthComponent} to the setting.
87
113
  *
@@ -131,6 +157,14 @@ export declare class SettingEx extends Setting {
131
157
  * @returns The setting instance.
132
158
  */
133
159
  addPassword(callback: (password: PasswordComponent) => void): this;
160
+ /**
161
+ * Adds a {@link TagListComponent} to the setting.
162
+ *
163
+ * @param app - The Obsidian app, for the tag suggest.
164
+ * @param callback - The callback to call with the component.
165
+ * @returns The setting instance.
166
+ */
167
+ addTagList(app: App, callback: (tagList: TagListComponent) => void): this;
134
168
  /**
135
169
  * Adds a {@link TelephoneComponent} to the setting.
136
170
  *
@@ -0,0 +1,258 @@
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 settings_tabs_exports = {};
116
+ __export(settings_tabs_exports, {
117
+ SettingsTabs: () => SettingsTabs
118
+ });
119
+ module.exports = __toCommonJS(settings_tabs_exports);
120
+ var import_obsidian = require('obsidian');
121
+ var import_css_class = require('./css-class.cjs');
122
+ var import_plugin_context = require('./plugin/plugin-context.cjs');
123
+ class SettingsTabs {
124
+ /**
125
+ * The panel the selected tab renders into.
126
+ */
127
+ panelEl;
128
+ /**
129
+ * The row of tab buttons.
130
+ */
131
+ tabBarEl;
132
+ changeCallback;
133
+ entries = [];
134
+ selectedTabId = null;
135
+ /**
136
+ * Creates new settings tabs.
137
+ *
138
+ * @param containerEl - The container element.
139
+ */
140
+ constructor(containerEl) {
141
+ (0, import_plugin_context.addPluginCssClasses)(containerEl, import_css_class.CssClass.SettingsTabs);
142
+ this.tabBarEl = containerEl.createDiv({ attr: { role: "tablist" }, cls: "settings-tabs-bar" });
143
+ this.tabBarEl.addEventListener("keydown", this.onKeyDown.bind(this));
144
+ this.panelEl = containerEl.createDiv({ attr: { role: "tabpanel" }, cls: "settings-tabs-panel" });
145
+ }
146
+ /**
147
+ * Adds a tab. The first tab added is selected.
148
+ *
149
+ * @param tab - The tab.
150
+ * @returns The tabs.
151
+ * @throws If a tab with the same id was already added.
152
+ */
153
+ addTab(tab) {
154
+ if (this.findEntry(tab.id)) {
155
+ throw new Error(`A settings tab with the id ${tab.id} was already added.`);
156
+ }
157
+ const buttonEl = this.tabBarEl.createEl("button", { attr: { "aria-selected": "false", "role": "tab", "tabindex": "-1" }, cls: "settings-tabs-button" });
158
+ if (tab.icon) {
159
+ (0, import_obsidian.setIcon)(buttonEl.createSpan({ cls: "settings-tabs-icon" }), tab.icon);
160
+ }
161
+ buttonEl.createSpan({ text: tab.name });
162
+ buttonEl.addEventListener("click", () => {
163
+ this.selectTab(tab.id);
164
+ });
165
+ this.entries.push({ buttonEl, tab });
166
+ if (this.selectedTabId === null) {
167
+ this.selectTab(tab.id);
168
+ }
169
+ return this;
170
+ }
171
+ /**
172
+ * Gets the id of the selected tab.
173
+ *
174
+ * @returns The id, or `null` before any tab is added.
175
+ */
176
+ getSelectedTabId() {
177
+ return this.selectedTabId;
178
+ }
179
+ /**
180
+ * Sets the callback to be called when the user selects another tab.
181
+ *
182
+ * @param callback - The callback, given the id of the selected tab.
183
+ * @returns The tabs.
184
+ */
185
+ onTabChange(callback) {
186
+ this.changeCallback = callback;
187
+ return this;
188
+ }
189
+ /**
190
+ * Selects a tab and renders it into the panel. An unknown id, such as a stored id whose tab was since removed, leaves
191
+ * the selection as it is.
192
+ *
193
+ * @param tabId - The id of the tab.
194
+ * @returns The tabs.
195
+ */
196
+ selectTab(tabId) {
197
+ const entry = this.findEntry(tabId);
198
+ if (!entry) {
199
+ return this;
200
+ }
201
+ const { tab } = entry;
202
+ const isChange = this.selectedTabId !== null && this.selectedTabId !== tab.id;
203
+ this.selectedTabId = tab.id;
204
+ for (const { buttonEl, tab: candidate } of this.entries) {
205
+ const isSelected = candidate === tab;
206
+ buttonEl.toggleClass(import_css_class.CssClass.IsActive, isSelected);
207
+ buttonEl.setAttribute("aria-selected", String(isSelected));
208
+ buttonEl.setAttribute("tabindex", isSelected ? "0" : "-1");
209
+ }
210
+ this.panelEl.empty();
211
+ tab.render(this.panelEl);
212
+ if (isChange) {
213
+ this.changeCallback?.(tab.id);
214
+ }
215
+ return this;
216
+ }
217
+ findEntry(tabId) {
218
+ return this.entries.find((entry) => entry.tab.id === tabId);
219
+ }
220
+ onKeyDown(event_) {
221
+ const count = this.entries.length;
222
+ const index = this.entries.findIndex((entry) => entry.tab.id === this.selectedTabId);
223
+ let nextIndex;
224
+ switch (event_.key) {
225
+ case "ArrowLeft": {
226
+ nextIndex = (index - 1 + count) % count;
227
+ break;
228
+ }
229
+ case "ArrowRight": {
230
+ nextIndex = (index + 1) % count;
231
+ break;
232
+ }
233
+ case "End": {
234
+ nextIndex = count - 1;
235
+ break;
236
+ }
237
+ case "Home": {
238
+ nextIndex = 0;
239
+ break;
240
+ }
241
+ default: {
242
+ return;
243
+ }
244
+ }
245
+ const nextEntry = this.entries[nextIndex];
246
+ if (!nextEntry) {
247
+ return;
248
+ }
249
+ event_.preventDefault();
250
+ this.selectTab(nextEntry.tab.id);
251
+ nextEntry.buttonEl.focus();
252
+ }
253
+ }
254
+ // Annotate the CommonJS export names for ESM import in node:
255
+ 0 && (module.exports = {
256
+ SettingsTabs
257
+ });
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXR0aW5ncy10YWJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUYWJiZWQgc2VjdGlvbnMgaW5zaWRlIGEgcGx1Z2luJ3Mgc2V0dGluZ3MuXG4gKi9cblxuaW1wb3J0IHsgc2V0SWNvbiB9IGZyb20gJ29ic2lkaWFuJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAtLSBXZSBuZWVkIHRvIGltcG9ydCBgaW5pdFBsdWdpbkNvbnRleHRgIHRvIHVzZSBpdCBpbiB0aGUgdHNkb2NzLlxuaW1wb3J0IHR5cGUgeyBpbml0UGx1Z2luQ29udGV4dCB9IGZyb20gJy4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIEEgdGFiIG9mIHtAbGluayBTZXR0aW5nc1RhYnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzVGFiIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIGFuIE9ic2lkaWFuIGljb24gc2hvd24gYmVmb3JlIHRoZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgaWNvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSB0YWIsIHVuaXF1ZSBhbW9uZyB0aGUgdGFicy5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHNob3duIG9uIHRoZSB0YWIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSB0YWIncyBzZXR0aW5ncyBpbnRvIHRoZSBwYW5lbCwgd2hpY2ggaXMgZW1wdHkgZWFjaCB0aW1lIHRoZSB0YWIgaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBwYW5lbC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlcjogKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIFNldHRpbmdzVGFiRW50cnkge1xuICByZWFkb25seSBidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIHJlYWRvbmx5IHRhYjogU2V0dGluZ3NUYWI7XG59XG5cbi8qKlxuICogVGFiYmVkIHNlY3Rpb25zIGluc2lkZSBhIHBsdWdpbidzIHNldHRpbmdzOiBhIHJvdyBvZiB0YWIgYnV0dG9ucyBhbmQgb25lIHBhbmVsLCB3aGljaCByZW5kZXJzIG9ubHkgdGhlIHNlbGVjdGVkIHRhYi5cbiAqIFRoZSBhcnJvdyBrZXlzLCBIb21lIGFuZCBFbmQgbW92ZSBiZXR3ZWVuIHRhYnMsIGFzIGluIHRoZSBXQUktQVJJQSB0YWJzIHBhdHRlcm4uXG4gKlxuICogYGBgdHNcbiAqIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICogICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG4gKiAgIG5ldyBTZXR0aW5nc1RhYnModGhpcy5jb250YWluZXJFbClcbiAqICAgICAuYWRkVGFiKHsgaWQ6ICdnZW5lcmFsJywgbmFtZTogJ0dlbmVyYWwnLCByZW5kZXI6IChlbCkgPT4gdGhpcy5yZW5kZXJHZW5lcmFsKGVsKSB9KVxuICogICAgIC5hZGRUYWIoeyBpZDogJ2FkdmFuY2VkJywgbmFtZTogJ0FkdmFuY2VkJywgcmVuZGVyOiAoZWwpID0+IHRoaXMucmVuZGVyQWR2YW5jZWQoZWwpIH0pXG4gKiAgICAgLnNlbGVjdFRhYih0aGlzLmxhc3RUYWJJZClcbiAqICAgICAub25UYWJDaGFuZ2UoKHRhYklkKSA9PiB7XG4gKiAgICAgICB0aGlzLmxhc3RUYWJJZCA9IHRhYklkO1xuICogICAgIH0pO1xuICogfVxuICogYGBgXG4gKlxuICogSW4gb3JkZXIgdG8gYWRkIHRoZSBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQsIHVzZSB7QGxpbmsgaW5pdFBsdWdpbkNvbnRleHR9IGluIHlvdXIgcGx1Z2luJ3MgYG9ubG9hZCgpYCBmdW5jdGlvbi5cbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNvcHkgc3R5bGVzIGZyb20ge0BsaW5rIGh0dHBzOi8vdW5wa2cuY29tL0BtbmFvdW1vdi9vYnNpZGlhbi1saWIvZGlzdC9zdHlsZXMuY3NzfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzVGFicyB7XG4gIC8qKlxuICAgKiBUaGUgcGFuZWwgdGhlIHNlbGVjdGVkIHRhYiByZW5kZXJzIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFuZWxFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSByb3cgb2YgdGFiIGJ1dHRvbnMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFiQmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgY2hhbmdlQ2FsbGJhY2s/OiAodGFiSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzOiBTZXR0aW5nc1RhYkVudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFRhYklkOiBudWxsIHwgc3RyaW5nID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgc2V0dGluZ3MgdGFicy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCkge1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGFpbmVyRWwsIENzc0NsYXNzLlNldHRpbmdzVGFicyk7XG4gICAgdGhpcy50YWJCYXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7IGF0dHI6IHsgcm9sZTogJ3RhYmxpc3QnIH0sIGNsczogJ3NldHRpbmdzLXRhYnMtYmFyJyB9KTtcbiAgICB0aGlzLnRhYkJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnBhbmVsRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoeyBhdHRyOiB7IHJvbGU6ICd0YWJwYW5lbCcgfSwgY2xzOiAnc2V0dGluZ3MtdGFicy1wYW5lbCcgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhYi4gVGhlIGZpcnN0IHRhYiBhZGRlZCBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHRhYiAtIFRoZSB0YWIuXG4gICAqIEByZXR1cm5zIFRoZSB0YWJzLlxuICAgKiBAdGhyb3dzIElmIGEgdGFiIHdpdGggdGhlIHNhbWUgaWQgd2FzIGFscmVhZHkgYWRkZWQuXG4gICAqL1xuICBwdWJsaWMgYWRkVGFiKHRhYjogU2V0dGluZ3NUYWIpOiB0aGlzIHtcbiAgICBpZiAodGhpcy5maW5kRW50cnkodGFiLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIHNldHRpbmdzIHRhYiB3aXRoIHRoZSBpZCAke3RhYi5pZH0gd2FzIGFscmVhZHkgYWRkZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGJ1dHRvbkVsID0gdGhpcy50YWJCYXJFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBhdHRyOiB7ICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJywgJ3JvbGUnOiAndGFiJywgJ3RhYmluZGV4JzogJy0xJyB9LCBjbHM6ICdzZXR0aW5ncy10YWJzLWJ1dHRvbicgfSk7XG4gICAgaWYgKHRhYi5pY29uKSB7XG4gICAgICBzZXRJY29uKGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyBjbHM6ICdzZXR0aW5ncy10YWJzLWljb24nIH0pLCB0YWIuaWNvbik7XG4gICAgfVxuICAgIGJ1dHRvbkVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiB0YWIubmFtZSB9KTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYi5pZCk7XG4gICAgfSk7XG4gICAgdGhpcy5lbnRyaWVzLnB1c2goeyBidXR0b25FbCwgdGFiIH0pO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiSWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYi5pZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGlkIG9mIHRoZSBzZWxlY3RlZCB0YWIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCwgb3IgYG51bGxgIGJlZm9yZSBhbnkgdGFiIGlzIGFkZGVkLlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGVkVGFiSWQoKTogbnVsbCB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUYWJJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFub3RoZXIgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2ssIGdpdmVuIHRoZSBpZCBvZiB0aGUgc2VsZWN0ZWQgdGFiLlxuICAgKiBAcmV0dXJucyBUaGUgdGFicy5cbiAgICovXG4gIHB1YmxpYyBvblRhYkNoYW5nZShjYWxsYmFjazogKHRhYklkOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzIHtcbiAgICB0aGlzLmNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHRhYiBhbmQgcmVuZGVycyBpdCBpbnRvIHRoZSBwYW5lbC4gQW4gdW5rbm93biBpZCwgc3VjaCBhcyBhIHN0b3JlZCBpZCB3aG9zZSB0YWIgd2FzIHNpbmNlIHJlbW92ZWQsIGxlYXZlc1xuICAgKiB0aGUgc2VsZWN0aW9uIGFzIGl0IGlzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFiSWQgLSBUaGUgaWQgb2YgdGhlIHRhYi5cbiAgICogQHJldHVybnMgVGhlIHRhYnMuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0VGFiKHRhYklkOiBudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmZpbmRFbnRyeSh0YWJJZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGNvbnN0IHsgdGFiIH0gPSBlbnRyeTtcbiAgICBjb25zdCBpc0NoYW5nZSA9IHRoaXMuc2VsZWN0ZWRUYWJJZCAhPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkVGFiSWQgIT09IHRhYi5pZDtcbiAgICB0aGlzLnNlbGVjdGVkVGFiSWQgPSB0YWIuaWQ7XG4gICAgZm9yIChjb25zdCB7IGJ1dHRvbkVsLCB0YWI6IGNhbmRpZGF0ZSB9IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGNhbmRpZGF0ZSA9PT0gdGFiO1xuICAgICAgYnV0dG9uRWwudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuSXNBY3RpdmUsIGlzU2VsZWN0ZWQpO1xuICAgICAgYnV0dG9uRWwuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIGJ1dHRvbkVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCBpc1NlbGVjdGVkID8gJzAnIDogJy0xJyk7XG4gICAgfVxuICAgIHRoaXMucGFuZWxFbC5lbXB0eSgpO1xuICAgIHRhYi5yZW5kZXIodGhpcy5wYW5lbEVsKTtcbiAgICBpZiAoaXNDaGFuZ2UpIHtcbiAgICAgIHRoaXMuY2hhbmdlQ2FsbGJhY2s/Lih0YWIuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVudHJ5KHRhYklkOiBudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogU2V0dGluZ3NUYWJFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5maW5kKChlbnRyeSkgPT4gZW50cnkudGFiLmlkID09PSB0YWJJZCk7XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudF86IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZW50cmllcy5sZW5ndGg7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmVudHJpZXMuZmluZEluZGV4KChlbnRyeSkgPT4gZW50cnkudGFiLmlkID09PSB0aGlzLnNlbGVjdGVkVGFiSWQpO1xuICAgIGxldCBuZXh0SW5kZXg6IG51bWJlcjtcbiAgICBzd2l0Y2ggKGV2ZW50Xy5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6IHtcbiAgICAgICAgbmV4dEluZGV4ID0gKGluZGV4IC0gMSArIGNvdW50KSAlIGNvdW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiB7XG4gICAgICAgIG5leHRJbmRleCA9IChpbmRleCArIDEpICUgY291bnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnRW5kJzoge1xuICAgICAgICBuZXh0SW5kZXggPSBjb3VudCAtIDE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnSG9tZSc6IHtcbiAgICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dEVudHJ5ID0gdGhpcy5lbnRyaWVzW25leHRJbmRleF07XG4gICAgaWYgKCFuZXh0RW50cnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnRfLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RUYWIobmV4dEVudHJ5LnRhYi5p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