obsidian-dev-utils 88.7.0 → 89.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/demo-vault-helper/main.js +20 -23
- package/dist/integration-test-plugin/main.js +2218 -1734
- package/dist/lib/cjs/__merged.cjs +57 -35
- package/dist/lib/cjs/__merged.d.cts +12 -10
- package/dist/lib/cjs/abort-controller.cjs +15 -22
- package/dist/lib/cjs/array.cjs +27 -26
- package/dist/lib/cjs/array.d.cts +25 -7
- package/dist/lib/cjs/async-events.cjs +87 -91
- package/dist/lib/cjs/async-events.d.cts +50 -50
- package/dist/lib/cjs/async.cjs +80 -80
- package/dist/lib/cjs/async.d.cts +23 -23
- package/dist/lib/cjs/beeper.cjs +11 -15
- package/dist/lib/cjs/blob.cjs +14 -25
- package/dist/lib/cjs/codemirror/index.cjs +11 -15
- package/dist/lib/cjs/codemirror/state-field-spec.cjs +11 -15
- package/dist/lib/cjs/debug-controller.cjs +11 -15
- package/dist/lib/cjs/debug.cjs +24 -32
- package/dist/lib/cjs/debug.d.cts +1 -1
- package/dist/lib/cjs/disposable.cjs +59 -43
- package/dist/lib/cjs/disposable.d.cts +27 -8
- package/dist/lib/cjs/enum.cjs +11 -15
- package/dist/lib/cjs/error.cjs +28 -33
- package/dist/lib/cjs/function.cjs +30 -34
- package/dist/lib/cjs/function.d.cts +26 -26
- package/dist/lib/cjs/generated-during-build.cjs +12 -16
- package/dist/lib/cjs/html-element.cjs +84 -89
- package/dist/lib/cjs/html-element.d.cts +15 -15
- package/dist/lib/cjs/index.cjs +11 -15
- package/dist/lib/cjs/integration-test-setup.cjs +11 -15
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +11 -15
- package/dist/lib/cjs/jest-setup.cjs +11 -15
- package/dist/lib/cjs/library.cjs +11 -15
- package/dist/lib/cjs/object-utils.cjs +120 -117
- package/dist/lib/cjs/object-utils.d.cts +27 -27
- package/dist/lib/cjs/obsidian/@types/dataview/data-model/value.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/expression/field.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/expression/functions.d.cts +4 -4
- package/dist/lib/cjs/obsidian/active-file-provider.cjs +11 -15
- package/dist/lib/cjs/obsidian/app.cjs +11 -15
- package/dist/lib/cjs/obsidian/async-with-notice.cjs +28 -32
- package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
- package/dist/lib/cjs/obsidian/attachment-path.cjs +20 -24
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +5 -5
- package/dist/lib/cjs/obsidian/backlink.cjs +12 -16
- package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/callout.cjs +27 -26
- package/dist/lib/cjs/obsidian/callout.d.cts +9 -3
- package/dist/lib/cjs/obsidian/canvas.cjs +13 -16
- package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +18 -20
- package/dist/lib/cjs/obsidian/code-block-markdown-information.cjs +11 -15
- package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +2 -2
- package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +18 -16
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +5 -0
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +56 -31
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +42 -8
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +10 -0
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +26 -30
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +8 -8
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +12 -16
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +12 -16
- package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.cjs +13 -17
- package/dist/lib/cjs/obsidian/command-handlers/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/community-plugins.cjs +28 -25
- package/dist/lib/cjs/obsidian/community-plugins.d.cts +19 -5
- package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +4 -4
- package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +13 -16
- package/dist/lib/cjs/obsidian/components/async-events-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +26 -28
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +3 -3
- package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/disposable-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/index.cjs +14 -15
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +29 -33
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +55 -55
- package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.cjs +297 -0
- package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.d.cts +139 -0
- package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +28 -31
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +26 -30
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +8 -8
- package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +13 -17
- package/dist/lib/cjs/obsidian/components/registry-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +72 -62
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +12 -1
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +8 -8
- package/dist/lib/cjs/obsidian/constructors/get-dom-events-handlers-constructor.cjs +14 -18
- package/dist/lib/cjs/obsidian/constructors/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/css-class.cjs +11 -15
- package/dist/lib/cjs/obsidian/data-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/dataview-link.cjs +13 -17
- package/dist/lib/cjs/obsidian/dataview.cjs +35 -41
- package/dist/lib/cjs/obsidian/dataview.d.cts +2 -2
- package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +13 -17
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +22 -26
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +23 -21
- package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/editor.cjs +17 -19
- package/dist/lib/cjs/obsidian/events.cjs +12 -16
- package/dist/lib/cjs/obsidian/events.d.cts +2 -2
- package/dist/lib/cjs/obsidian/extensions-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/file-change.cjs +76 -80
- package/dist/lib/cjs/obsidian/file-change.d.cts +3 -3
- package/dist/lib/cjs/obsidian/file-manager.cjs +33 -22
- package/dist/lib/cjs/obsidian/file-manager.d.cts +20 -1
- package/dist/lib/cjs/obsidian/file-system.cjs +15 -19
- package/dist/lib/cjs/obsidian/file-system.d.cts +3 -3
- package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.cjs +11 -15
- package/dist/lib/cjs/obsidian/frontmatter.cjs +15 -19
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/html-element.cjs +13 -17
- package/dist/lib/cjs/obsidian/html-element.d.cts +2 -2
- package/dist/lib/cjs/obsidian/i18n/custom-type-options.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/default-translations.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/i18n.cjs +13 -16
- package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +7 -0
- package/dist/lib/cjs/obsidian/i18n/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.cjs +11 -15
- package/dist/lib/cjs/obsidian/index.cjs +14 -15
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/is-in-obsidian.cjs +11 -15
- package/dist/lib/cjs/obsidian/link-update-progress.cjs +11 -15
- package/dist/lib/cjs/obsidian/link.cjs +91 -81
- package/dist/lib/cjs/obsidian/link.d.cts +22 -22
- package/dist/lib/cjs/obsidian/logger.cjs +21 -25
- package/dist/lib/cjs/obsidian/logger.d.cts +5 -5
- package/dist/lib/cjs/obsidian/loop.cjs +14 -18
- package/dist/lib/cjs/obsidian/loop.d.cts +1 -1
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +12 -16
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +35 -40
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +12 -16
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-view.cjs +11 -15
- package/dist/lib/cjs/obsidian/markdown.cjs +22 -24
- package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/metadata-cache.cjs +16 -20
- package/dist/lib/cjs/obsidian/metadata-cache.d.cts +2 -2
- package/dist/lib/cjs/obsidian/modals/alert.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/confirm.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +28 -32
- package/dist/lib/cjs/obsidian/modals/modal.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +16 -20
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
- package/dist/lib/cjs/obsidian/modals/select-option.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +26 -28
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +5 -5
- package/dist/lib/cjs/obsidian/notebook-navigator.cjs +155 -0
- package/dist/lib/cjs/obsidian/notebook-navigator.d.cts +132 -0
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/obsidian-settings.cjs +11 -15
- package/dist/lib/cjs/obsidian/parse-link.cjs +61 -62
- package/dist/lib/cjs/obsidian/parse-link.d.cts +4 -4
- package/dist/lib/cjs/obsidian/path-settings.cjs +27 -25
- package/dist/lib/cjs/obsidian/pdf.cjs +13 -17
- package/dist/lib/cjs/obsidian/pdf.d.cts +2 -2
- package/dist/lib/cjs/obsidian/plugin/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +11 -15
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +156 -52
- package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +17 -21
- package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +2 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +20 -24
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +11 -9
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +29 -33
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +33 -16
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +11 -1
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +14 -18
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +2 -2
- package/dist/lib/cjs/obsidian/popovers/popover.cjs +19 -23
- package/dist/lib/cjs/obsidian/queue.cjs +16 -20
- package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
- package/dist/lib/cjs/obsidian/react/app-context.cjs +11 -15
- package/dist/lib/cjs/obsidian/react/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/reference.cjs +11 -15
- package/dist/lib/cjs/obsidian/resource-lock.cjs +157 -78
- package/dist/lib/cjs/obsidian/resource-lock.d.cts +5 -0
- package/dist/lib/cjs/obsidian/resource-url.cjs +12 -16
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +18 -22
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.d.cts +5 -5
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -31
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/date-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/email-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/month-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +17 -21
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +12 -16
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +15 -19
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/number-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/password-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/text-based-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/text-based-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/time-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +15 -19
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +18 -22
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-range-text-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +16 -19
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +4 -4
- package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/url-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +45 -49
- package/dist/lib/cjs/obsidian/setting-components/validator-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/week-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-ex.cjs +76 -80
- package/dist/lib/cjs/obsidian/setting-ex.d.cts +42 -42
- package/dist/lib/cjs/obsidian/setting-group-ex.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-group-ex.d.cts +2 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/validation.cjs +11 -15
- package/dist/lib/cjs/obsidian/vault-delete.cjs +23 -20
- package/dist/lib/cjs/obsidian/vault-delete.d.cts +16 -2
- package/dist/lib/cjs/obsidian/vault-transaction.cjs +17 -18
- package/dist/lib/cjs/obsidian/vault.cjs +81 -63
- package/dist/lib/cjs/obsidian/vault.d.cts +32 -11
- package/dist/lib/cjs/obsidian/view-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/workspace.cjs +12 -16
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +11 -15
- package/dist/lib/cjs/path.cjs +18 -22
- package/dist/lib/cjs/path.d.cts +1 -1
- package/dist/lib/cjs/reg-exp.cjs +38 -35
- package/dist/lib/cjs/reg-exp.d.cts +4 -4
- package/dist/lib/cjs/script-utils/build.cjs +21 -25
- package/dist/lib/cjs/script-utils/build.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +24 -28
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +36 -34
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +20 -24
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +13 -17
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +16 -20
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +6 -2
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +32 -36
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/check-project-types.cjs +13 -17
- package/dist/lib/cjs/script-utils/check-project-types.d.cts +12 -4
- package/dist/lib/cjs/script-utils/cli-utils.cjs +39 -47
- package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -6
- package/dist/lib/cjs/script-utils/code-generator.cjs +11 -15
- package/dist/lib/cjs/script-utils/commitlint-config.cjs +11 -15
- package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +22 -23
- package/dist/lib/cjs/script-utils/demo-vault.cjs +11 -15
- package/dist/lib/cjs/script-utils/env-toggle.cjs +13 -17
- package/dist/lib/cjs/script-utils/exec.cjs +40 -44
- package/dist/lib/cjs/script-utils/exec.d.cts +4 -4
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +12 -16
- package/dist/lib/cjs/script-utils/formatters/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/fs.cjs +13 -17
- package/dist/lib/cjs/script-utils/git.cjs +11 -15
- package/dist/lib/cjs/script-utils/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/json.cjs +15 -19
- package/dist/lib/cjs/script-utils/json.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +12 -16
- package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +402 -16
- package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +27 -31
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +27 -31
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +21 -25
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +109 -113
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +13 -17
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +21 -25
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +51 -55
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +9 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +25 -27
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +6 -2
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +33 -37
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +14 -18
- package/dist/lib/cjs/script-utils/linters/index.cjs +14 -15
- package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +18 -17
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.cjs +138 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.d.cts +35 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +20 -23
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +18 -22
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +54 -18
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +11 -15
- package/dist/lib/cjs/script-utils/npm-publish.cjs +11 -15
- package/dist/lib/cjs/script-utils/npm-run.cjs +20 -17
- package/dist/lib/cjs/script-utils/npm-run.d.cts +16 -2
- package/dist/lib/cjs/script-utils/npm.cjs +21 -25
- package/dist/lib/cjs/script-utils/npm.d.cts +11 -11
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +11 -15
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +165 -55
- package/dist/lib/cjs/script-utils/root.cjs +11 -15
- package/dist/lib/cjs/script-utils/test-runners/index.cjs +16 -17
- package/dist/lib/cjs/script-utils/test-runners/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +325 -0
- package/dist/lib/cjs/script-utils/test-runners/vitest-config.d.cts +118 -0
- package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +11 -15
- package/dist/lib/cjs/script-utils/validate-declarations.cjs +11 -15
- package/dist/lib/cjs/script-utils/version.cjs +62 -63
- package/dist/lib/cjs/script-utils/version.d.cts +21 -21
- package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +11 -15
- package/dist/lib/cjs/setup.cjs +11 -15
- package/dist/lib/cjs/setup.d.cts +1 -1
- package/dist/lib/cjs/strict-proxy.cjs +30 -34
- package/dist/lib/cjs/strict-proxy.d.cts +2 -2
- package/dist/lib/cjs/string.cjs +90 -93
- package/dist/lib/cjs/string.d.cts +60 -60
- package/dist/lib/cjs/transformers/date-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/duration-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/group-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/index.cjs +11 -15
- package/dist/lib/cjs/transformers/map-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/set-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/typed-transformer.cjs +11 -15
- package/dist/lib/cjs/two-way-map.cjs +11 -15
- package/dist/lib/cjs/type-guards.cjs +16 -20
- package/dist/lib/cjs/type-guards.d.cts +6 -6
- package/dist/lib/cjs/type.cjs +13 -17
- package/dist/lib/cjs/type.d.cts +2 -2
- package/dist/lib/cjs/url.cjs +18 -22
- package/dist/lib/cjs/url.d.cts +4 -4
- package/dist/lib/cjs/value-provider.cjs +15 -19
- package/dist/lib/cjs/value-provider.d.cts +6 -6
- package/dist/lib/cjs/value-wrapper.cjs +11 -15
- package/dist/lib/cjs/vitest-setup.cjs +11 -15
- package/dist/lib/esm/__merged.d.mts +12 -10
- package/dist/lib/esm/__merged.mjs +51 -23
- package/dist/lib/esm/abort-controller.mjs +5 -8
- package/dist/lib/esm/array.d.mts +25 -7
- package/dist/lib/esm/array.mjs +16 -12
- package/dist/lib/esm/async-events.d.mts +50 -50
- package/dist/lib/esm/async-events.mjs +81 -78
- package/dist/lib/esm/async.d.mts +23 -23
- package/dist/lib/esm/async.mjs +70 -66
- package/dist/lib/esm/blob.mjs +4 -11
- package/dist/lib/esm/debug.d.mts +1 -1
- package/dist/lib/esm/debug.mjs +14 -18
- package/dist/lib/esm/disposable.d.mts +27 -8
- package/dist/lib/esm/disposable.mjs +47 -29
- package/dist/lib/esm/error.mjs +18 -19
- package/dist/lib/esm/function.d.mts +26 -26
- package/dist/lib/esm/function.mjs +20 -20
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/html-element.d.mts +15 -15
- package/dist/lib/esm/html-element.mjs +74 -75
- package/dist/lib/esm/object-utils.d.mts +27 -27
- package/dist/lib/esm/object-utils.mjs +109 -102
- package/dist/lib/esm/obsidian/@types/dataview/data-model/value.d.mts +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/expression/field.d.mts +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/expression/functions.d.mts +4 -4
- package/dist/lib/esm/obsidian/app.mjs +1 -1
- package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
- package/dist/lib/esm/obsidian/async-with-notice.mjs +18 -18
- package/dist/lib/esm/obsidian/attachment-path.d.mts +5 -5
- package/dist/lib/esm/obsidian/attachment-path.mjs +10 -10
- package/dist/lib/esm/obsidian/backlink.mjs +2 -2
- package/dist/lib/esm/obsidian/callout.d.mts +9 -3
- package/dist/lib/esm/obsidian/callout.mjs +17 -12
- package/dist/lib/esm/obsidian/canvas.mjs +3 -2
- package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +8 -6
- package/dist/lib/esm/obsidian/code-block-markdown-information.d.mts +2 -2
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +5 -0
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +8 -2
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +42 -8
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +46 -17
- package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +10 -0
- package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +8 -8
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +16 -16
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +2 -2
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +2 -2
- package/dist/lib/esm/obsidian/command-handlers/global-command-handler.mjs +3 -3
- package/dist/lib/esm/obsidian/community-plugins.d.mts +19 -5
- package/dist/lib/esm/obsidian/community-plugins.mjs +17 -11
- package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +4 -4
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -2
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +3 -3
- package/dist/lib/esm/obsidian/components/component-ex.mjs +16 -14
- package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/console-debug-component.mjs +4 -4
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +5 -5
- package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +55 -55
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +19 -19
- package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.d.mts +139 -0
- package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.mjs +196 -0
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +18 -17
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +8 -8
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +18 -18
- package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +3 -3
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +12 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +62 -48
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +8 -8
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +6 -6
- package/dist/lib/esm/obsidian/constructors/get-dom-events-handlers-constructor.mjs +4 -4
- package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/dataview-link.mjs +3 -3
- package/dist/lib/esm/obsidian/dataview.d.mts +2 -2
- package/dist/lib/esm/obsidian/dataview.mjs +25 -27
- package/dist/lib/esm/obsidian/demo-vault-helper.mjs +4 -3
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +12 -12
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +13 -7
- package/dist/lib/esm/obsidian/editor.mjs +7 -5
- package/dist/lib/esm/obsidian/events.d.mts +2 -2
- package/dist/lib/esm/obsidian/events.mjs +2 -2
- package/dist/lib/esm/obsidian/file-change.d.mts +3 -3
- package/dist/lib/esm/obsidian/file-change.mjs +67 -67
- package/dist/lib/esm/obsidian/file-manager.d.mts +20 -1
- package/dist/lib/esm/obsidian/file-manager.mjs +22 -8
- package/dist/lib/esm/obsidian/file-system.d.mts +3 -3
- package/dist/lib/esm/obsidian/file-system.mjs +4 -4
- package/dist/lib/esm/obsidian/frontmatter.mjs +5 -5
- package/dist/lib/esm/obsidian/html-element.d.mts +2 -2
- package/dist/lib/esm/obsidian/html-element.mjs +3 -3
- package/dist/lib/esm/obsidian/i18n/i18n.d.mts +7 -0
- package/dist/lib/esm/obsidian/i18n/i18n.mjs +3 -2
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/link.d.mts +22 -22
- package/dist/lib/esm/obsidian/link.mjs +76 -62
- package/dist/lib/esm/obsidian/logger.d.mts +5 -5
- package/dist/lib/esm/obsidian/logger.mjs +11 -11
- package/dist/lib/esm/obsidian/loop.d.mts +1 -1
- package/dist/lib/esm/obsidian/loop.mjs +4 -4
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +25 -26
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown.mjs +12 -10
- package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/metadata-cache.d.mts +2 -2
- package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
- package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +18 -18
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
- package/dist/lib/esm/obsidian/modals/select-item.mjs +6 -6
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +5 -5
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +16 -14
- package/dist/lib/esm/obsidian/notebook-navigator.d.mts +132 -0
- package/dist/lib/esm/obsidian/notebook-navigator.mjs +49 -0
- package/dist/lib/esm/obsidian/parse-link.d.mts +4 -4
- package/dist/lib/esm/obsidian/parse-link.mjs +51 -48
- package/dist/lib/esm/obsidian/path-settings.mjs +17 -11
- package/dist/lib/esm/obsidian/pdf.d.mts +2 -2
- package/dist/lib/esm/obsidian/pdf.mjs +3 -3
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +156 -52
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +1 -1
- package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -2
- package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +7 -7
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +11 -9
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +10 -10
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +20 -20
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +11 -1
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +23 -2
- package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +2 -2
- package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +4 -4
- package/dist/lib/esm/obsidian/popovers/popover.mjs +9 -9
- package/dist/lib/esm/obsidian/queue.d.mts +2 -2
- package/dist/lib/esm/obsidian/queue.mjs +6 -6
- package/dist/lib/esm/obsidian/resource-lock.d.mts +5 -0
- package/dist/lib/esm/obsidian/resource-lock.mjs +147 -64
- package/dist/lib/esm/obsidian/resource-url.mjs +2 -2
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +2 -2
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.d.mts +5 -5
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +8 -8
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +18 -17
- package/dist/lib/esm/obsidian/setting-components/date-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/date-time-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/email-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/email-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/month-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/month-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +7 -7
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +5 -5
- package/dist/lib/esm/obsidian/setting-components/number-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/number-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/password-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/text-based-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/time-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/time-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +5 -5
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -8
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +4 -4
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -5
- package/dist/lib/esm/obsidian/setting-components/url-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/url-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/validator-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +35 -35
- package/dist/lib/esm/obsidian/setting-components/week-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/week-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-ex.d.mts +42 -42
- package/dist/lib/esm/obsidian/setting-ex.mjs +66 -66
- package/dist/lib/esm/obsidian/setting-group-ex.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-group-ex.mjs +4 -4
- package/dist/lib/esm/obsidian/vault-delete.d.mts +16 -2
- package/dist/lib/esm/obsidian/vault-delete.mjs +12 -6
- package/dist/lib/esm/obsidian/vault-transaction.mjs +8 -4
- package/dist/lib/esm/obsidian/vault.d.mts +32 -11
- package/dist/lib/esm/obsidian/vault.mjs +67 -47
- package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/workspace.mjs +2 -2
- package/dist/lib/esm/path.d.mts +1 -1
- package/dist/lib/esm/path.mjs +7 -7
- package/dist/lib/esm/reg-exp.d.mts +4 -4
- package/dist/lib/esm/reg-exp.mjs +28 -21
- package/dist/lib/esm/script-utils/build.d.mts +1 -1
- package/dist/lib/esm/script-utils/build.mjs +15 -12
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +14 -14
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +26 -20
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +10 -10
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +3 -3
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -6
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +6 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +20 -20
- package/dist/lib/esm/script-utils/check-project-types.d.mts +12 -4
- package/dist/lib/esm/script-utils/check-project-types.mjs +3 -3
- package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -6
- package/dist/lib/esm/script-utils/cli-utils.mjs +29 -33
- package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +12 -9
- package/dist/lib/esm/script-utils/env-toggle.mjs +3 -3
- package/dist/lib/esm/script-utils/exec.d.mts +4 -4
- package/dist/lib/esm/script-utils/exec.mjs +32 -32
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +2 -2
- package/dist/lib/esm/script-utils/fs.mjs +3 -3
- package/dist/lib/esm/script-utils/json.d.mts +2 -2
- package/dist/lib/esm/script-utils/json.mjs +5 -5
- package/dist/lib/esm/script-utils/linters/cspell.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +392 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +17 -17
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +17 -17
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +11 -11
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +99 -99
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +11 -11
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +9 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +41 -41
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +6 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +15 -13
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +23 -23
- package/dist/lib/esm/script-utils/linters/eslint.mjs +4 -4
- package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.d.mts +2 -2
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/markdownlint-ignores.d.mts +35 -0
- package/dist/lib/esm/script-utils/linters/markdownlint-ignores.mjs +33 -0
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -9
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +54 -18
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +8 -8
- package/dist/lib/esm/script-utils/npm-run.d.mts +16 -2
- package/dist/lib/esm/script-utils/npm-run.mjs +9 -3
- package/dist/lib/esm/script-utils/npm.d.mts +11 -11
- package/dist/lib/esm/script-utils/npm.mjs +11 -11
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +165 -55
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +1 -1
- package/dist/lib/esm/script-utils/test-runners/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/test-runners/index.mjs +4 -2
- package/dist/lib/esm/script-utils/test-runners/vitest-config.d.mts +118 -0
- package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +210 -0
- package/dist/lib/esm/script-utils/validate-declarations.mjs +1 -1
- package/dist/lib/esm/script-utils/version.d.mts +21 -21
- package/dist/lib/esm/script-utils/version.mjs +48 -45
- package/dist/lib/esm/setup.d.mts +1 -1
- package/dist/lib/esm/setup.mjs +1 -1
- package/dist/lib/esm/strict-proxy.d.mts +2 -2
- package/dist/lib/esm/strict-proxy.mjs +20 -20
- package/dist/lib/esm/string.d.mts +60 -60
- package/dist/lib/esm/string.mjs +80 -79
- package/dist/lib/esm/transformers/map-transformer.mjs +2 -2
- package/dist/lib/esm/transformers/set-transformer.mjs +2 -2
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +2 -2
- package/dist/lib/esm/type-guards.d.mts +6 -6
- package/dist/lib/esm/type-guards.mjs +6 -6
- package/dist/lib/esm/type.d.mts +2 -2
- package/dist/lib/esm/type.mjs +3 -3
- package/dist/lib/esm/url.d.mts +4 -4
- package/dist/lib/esm/url.mjs +8 -8
- package/dist/lib/esm/value-provider.d.mts +6 -6
- package/dist/lib/esm/value-provider.mjs +5 -5
- package/dist/templates/scripts/vitest-config.ts +2 -88
- package/obsidian/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
- package/obsidian/notebook-navigator/package.json +6 -0
- package/package.json +17 -33
- package/script-utils/linters/markdownlint-ignores/package.json +6 -0
- package/script-utils/test-runners/vitest-config/package.json +6 -0
|
@@ -40,16 +40,11 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
40
40
|
globalThisRecord[key] ??= newFuncs[key]?.();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function name(obj) {
|
|
44
|
-
return obj;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
43
|
function extractDefault(module) {
|
|
48
44
|
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
49
45
|
}
|
|
50
46
|
|
|
51
|
-
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
52
|
-
'obsidian',
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
53
48
|
'@codemirror/autocomplete',
|
|
54
49
|
'@codemirror/collab',
|
|
55
50
|
'@codemirror/commands',
|
|
@@ -60,11 +55,12 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
60
55
|
'@codemirror/text',
|
|
61
56
|
'@codemirror/view',
|
|
62
57
|
'@lezer/common',
|
|
58
|
+
'@lezer/highlight',
|
|
63
59
|
'@lezer/lr',
|
|
64
|
-
'
|
|
65
|
-
|
|
60
|
+
'obsidian']
|
|
61
|
+
);
|
|
66
62
|
|
|
67
|
-
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
63
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
64
|
'@codemirror/closebrackets',
|
|
69
65
|
'@codemirror/comment',
|
|
70
66
|
'@codemirror/fold',
|
|
@@ -76,11 +72,11 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
76
72
|
'@codemirror/rangeset',
|
|
77
73
|
'@codemirror/rectangular-selection',
|
|
78
74
|
'@codemirror/stream-parser',
|
|
79
|
-
'@codemirror/tooltip']
|
|
80
|
-
|
|
75
|
+
'@codemirror/tooltip']
|
|
76
|
+
);
|
|
81
77
|
|
|
82
78
|
function requirePatched(id) {
|
|
83
|
-
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.
|
|
79
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
84
80
|
return originalRequire?.(id);
|
|
85
81
|
}
|
|
86
82
|
|
|
@@ -89,8 +85,8 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
89
85
|
if (id === 'process' || id === 'node:process') {
|
|
90
86
|
// eslint-disable-next-line no-console -- Valid usage.
|
|
91
87
|
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
92
|
-
|
|
93
|
-
return
|
|
88
|
+
|
|
89
|
+
return process;
|
|
94
90
|
}
|
|
95
91
|
} else {
|
|
96
92
|
const module = originalRequire?.(id);
|
|
@@ -237,13 +233,13 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
237
233
|
shouldShowPlaceholderForDefaultValues: true,
|
|
238
234
|
shouldShowValidationMessage: true
|
|
239
235
|
};
|
|
240
|
-
const
|
|
236
|
+
const optionsExtension = { ...DEFAULT_OPTIONS, ...options };
|
|
241
237
|
const validatorEl = (0, import_validator_component.getValidatorComponent)(valueComponent)?.validatorEl;
|
|
242
238
|
const textBasedComponent = (0, import_text_based_component.getTextBasedComponentValue)(valueComponent);
|
|
243
239
|
const readonlyValue = this.getPluginSettingsProperty(propertyName);
|
|
244
240
|
const defaults = this.pluginSettingsComponent.defaultSettings;
|
|
245
241
|
const defaultValue = defaults[propertyName];
|
|
246
|
-
const defaultComponentValue =
|
|
242
|
+
const defaultComponentValue = optionsExtension.pluginSettingsToComponentValueConverter(defaultValue);
|
|
247
243
|
textBasedComponent?.setPlaceholderValue(defaultComponentValue);
|
|
248
244
|
let validationMessage;
|
|
249
245
|
let tooltipEl = null;
|
|
@@ -256,7 +252,7 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
256
252
|
const tooltipArrowEl = tooltipEl.createDiv();
|
|
257
253
|
(0, import_plugin_context.addPluginCssClasses)(tooltipArrowEl, import_css_class.CssClass.TooltipArrow);
|
|
258
254
|
tooltipEl.hide();
|
|
259
|
-
wrapper.
|
|
255
|
+
wrapper.append(tooltipEl);
|
|
260
256
|
}
|
|
261
257
|
(0, import_async_events_component.registerAsyncEvent)(
|
|
262
258
|
this.getRenderComponent(),
|
|
@@ -265,19 +261,19 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
265
261
|
return;
|
|
266
262
|
}
|
|
267
263
|
validationMessage = anotherValidationMessage;
|
|
268
|
-
|
|
264
|
+
updateValidatorElementDebounced();
|
|
269
265
|
})
|
|
270
266
|
);
|
|
271
267
|
let shouldEmptyOnBlur = false;
|
|
272
268
|
let shouldRevertToDefaultValueOnBlur = false;
|
|
273
|
-
if (textBasedComponent &&
|
|
269
|
+
if (textBasedComponent && optionsExtension.shouldShowPlaceholderForDefaultValues && (0, import_object_utils.isDeepEqual)(readonlyValue, defaultValue)) {
|
|
274
270
|
textBasedComponent.empty();
|
|
275
271
|
} else {
|
|
276
|
-
valueComponent.setValue(
|
|
272
|
+
valueComponent.setValue(optionsExtension.pluginSettingsToComponentValueConverter(readonlyValue));
|
|
277
273
|
}
|
|
278
274
|
let shouldSkipOnChange = false;
|
|
279
275
|
const UPDATE_VALIDATOR_EL_TIMEOUT_IN_MILLISECONDS = 100;
|
|
280
|
-
const
|
|
276
|
+
const updateValidatorElementDebounced = (0, import_obsidian.debounce)(() => {
|
|
281
277
|
window.requestAnimationFrame(() => {
|
|
282
278
|
updateValidatorEl();
|
|
283
279
|
});
|
|
@@ -289,13 +285,13 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
289
285
|
}
|
|
290
286
|
shouldEmptyOnBlur = false;
|
|
291
287
|
const oldValue = this.getPluginSettingsProperty(propertyName);
|
|
292
|
-
let newValue
|
|
288
|
+
let newValue;
|
|
293
289
|
let shouldSetProperty = true;
|
|
294
|
-
shouldRevertToDefaultValueOnBlur = !!textBasedComponent?.isEmpty() &&
|
|
290
|
+
shouldRevertToDefaultValueOnBlur = !!textBasedComponent?.isEmpty() && optionsExtension.shouldResetSettingWhenComponentIsEmpty;
|
|
295
291
|
if (shouldRevertToDefaultValueOnBlur) {
|
|
296
292
|
newValue = defaultValue;
|
|
297
293
|
} else {
|
|
298
|
-
const convertedValue =
|
|
294
|
+
const convertedValue = optionsExtension.componentToPluginSettingsValueConverter(uiValue);
|
|
299
295
|
if ((0, import_validation.isValidationMessageHolder)(convertedValue)) {
|
|
300
296
|
validationMessage = convertedValue.validationMessage;
|
|
301
297
|
shouldSetProperty = false;
|
|
@@ -305,30 +301,30 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
305
301
|
}
|
|
306
302
|
if (shouldSetProperty) {
|
|
307
303
|
validationMessage = await this.pluginSettingsComponent.setProperty(propertyName, newValue);
|
|
308
|
-
if (textBasedComponent &&
|
|
304
|
+
if (textBasedComponent && optionsExtension.shouldShowPlaceholderForDefaultValues && !textBasedComponent.isEmpty() && (0, import_object_utils.isDeepEqual)(newValue, defaultValue)) {
|
|
309
305
|
shouldEmptyOnBlur = true;
|
|
310
306
|
}
|
|
311
307
|
}
|
|
312
|
-
|
|
308
|
+
updateValidatorElementDebounced();
|
|
313
309
|
if (shouldSetProperty) {
|
|
314
|
-
await
|
|
310
|
+
await optionsExtension.onChanged(newValue, oldValue);
|
|
315
311
|
}
|
|
316
312
|
this.saveSettingsDebounced();
|
|
317
313
|
}));
|
|
318
314
|
validatorEl?.addEventListener("focus", () => {
|
|
319
|
-
|
|
315
|
+
updateValidatorElementDebounced();
|
|
320
316
|
});
|
|
321
317
|
validatorEl?.addEventListener("blur", () => {
|
|
322
|
-
|
|
318
|
+
updateValidatorElementDebounced();
|
|
323
319
|
});
|
|
324
320
|
validatorEl?.addEventListener("click", () => {
|
|
325
321
|
window.requestAnimationFrame(() => {
|
|
326
|
-
|
|
322
|
+
updateValidatorElementDebounced();
|
|
327
323
|
});
|
|
328
324
|
});
|
|
329
325
|
const validationMessages = this.pluginSettingsComponent.settingsState.validationMessages;
|
|
330
326
|
validationMessage = validationMessages[propertyName] ?? "";
|
|
331
|
-
|
|
327
|
+
updateValidatorElementDebounced();
|
|
332
328
|
return valueComponent;
|
|
333
329
|
function updateValidatorEl() {
|
|
334
330
|
if (!validatorEl?.isActiveElement()) {
|
|
@@ -356,7 +352,7 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
356
352
|
validationMessage = validatorEl.validationMessage;
|
|
357
353
|
}
|
|
358
354
|
validatorEl.setCustomValidity(validationMessage);
|
|
359
|
-
if (
|
|
355
|
+
if (optionsExtension.shouldShowValidationMessage) {
|
|
360
356
|
tooltipContentEl.textContent = validationMessage;
|
|
361
357
|
tooltipEl?.toggle(!!validationMessage);
|
|
362
358
|
} else if (validationMessage) {
|
|
@@ -601,4 +597,4 @@ class PluginSettingsTabBase extends (0, import_async_events.mixinAsyncEvents)()(
|
|
|
601
597
|
PluginSettingsTabBase,
|
|
602
598
|
SAVE_TO_FILE_CONTEXT
|
|
603
599
|
});
|
|
604
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRGVib3VuY2VyLFxuICBQbHVnaW4sXG4gIFNldHRpbmcsXG4gIFNldHRpbmdEZWZpbml0aW9uR3JvdXAsXG4gIFNldHRpbmdEZWZpbml0aW9uSXRlbSxcbiAgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIsXG4gIFNldHRpbmdHcm91cFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsS2V5cyxcbiAgRXhjZXB0LFxuICBQcm9taXNhYmxlLFxuICBSZWFkb25seURlZXBcbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgZGVib3VuY2UsXG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGVcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdmFsdWUtY29tcG9uZW50LXdpdGgtY2hhbmdlLXRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0V4IH0gZnJvbSAnLi4vc2V0dGluZy1leC50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi50cyc7XG5cbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgY2FzdFRvLFxuICBkZWVwRXF1YWwsXG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllc1xufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBlbnN1cmVXcmFwcGVkIH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL3NldHRpbmctY29tcG9uZW50LXdyYXBwZXIudHMnO1xuaW1wb3J0IHsgZ2V0VGV4dEJhc2VkQ29tcG9uZW50VmFsdWUgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdGV4dC1iYXNlZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vc2V0dGluZy1jb21wb25lbnRzL3ZhbGlkYXRvci1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgYWRvcHRTZXR0aW5nRXggfSBmcm9tICcuLi9zZXR0aW5nLWV4LnRzJztcbmltcG9ydCB7IGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIgfSBmcm9tICcuLi92YWxpZGF0aW9uLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuL3BsdWdpbi1jb250ZXh0LnRzJztcblxuLyoqXG4gKiBBIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLnNhdmVUb0ZpbGV9IG1ldGhvZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNBVkVfVE9fRklMRV9DT05URVhUID0gJ1BsdWdpblNldHRpbmdzVGFiJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciBgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBzZXR0aW5ncyBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgY2hhbmdlcy5cbiAgICovXG4gIG9uQ2hhbmdlZD8obmV3VmFsdWU6IFJlYWRvbmx5RGVlcDxUPiwgb2xkVmFsdWU6IFJlYWRvbmx5RGVlcDxUPik6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVzZXQgdGhlIHNldHRpbmcgd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGVtcHR5LlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgdG8gdGV4dC1iYXNlZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSBwbGFjZWhvbGRlciBmb3IgZGVmYXVsdCB2YWx1ZXMuXG4gICAqIEFwcGxpY2FibGUgb25seSB0byB0ZXh0LWJhc2VkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uc0V4dGVuZGVkPFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCxcbiAgVUlWYWx1ZSxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUgYmFjayB0byB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gdWlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZTogVUlWYWx1ZSk6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0gfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcjtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHBsdWdpblNldHRpbmdzVmFsdWU6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPik6IFVJVmFsdWU7XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgcGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9IHdpdGggdmFsdWUgY29udmVydGVycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kRXh0ZW5kZWRQYXJhbXM8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBUVmFsdWVDb21wb25lbnQsXG4gIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4+IGV4dGVuZHMgQmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRQYXJhbXM8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBUVmFsdWVDb21wb25lbnRcbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxVSVZhbHVlPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBDb25kaXRpb25hbEtleXM8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciBjcmVhdGluZyBhIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaW5zdGFuY2UgKG5lZWRlZCBieSBPYnNpZGlhbidzIFBsdWdpblNldHRpbmdUYWIpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2Uuc2V0dGluZ0V4fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMge1xuICAvKipcbiAgICogQWRkaXRpb25hbCBzZWFyY2ggdGVybXMgZm9yIHRoZSBzZXR0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHNldHRpbmcuIFVzZWQgZm9yIHJlbmRlcmluZzsgdGhlIHRleHQgY29udGVudCBvZiBhIGZyYWdtZW50IGlzIHVzZWQgZm9yIHNlYXJjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2M/OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBzZXR0aW5nIHJvdyBpcyBkaXNhYmxlZC5cbiAgICpcbiAgICogQSBmdW5jdGlvbiBmb3JtIGlzIHJlLWV2YWx1YXRlZCBvbiBldmVyeSByZW5kZXIgQU5EIG9uIGV2ZXJ5IHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UucmVmcmVzaERvbVN0YXRlfVxuICAgKiBjYWxsLCBzbyBpdCBjYW4gcmVmbGVjdCBydW50aW1lIHN0YXRlLiBPYnNpZGlhbiBhcHBsaWVzIGl0IHdpdGggYFNldHRpbmcuc2V0RGlzYWJsZWRgLCB3aGljaCBkaXNhYmxlcyB0aGVcbiAgICogcm93IGFuZCBldmVyeSBjb21wb25lbnQgcmVnaXN0ZXJlZCBvbiBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVkPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgc2V0dGluZy4gVXNlZCBmb3IgcmVuZGVyaW5nIGFuZCBzZWFyY2guXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHNldHRpbmcgcm93IGltcGVyYXRpdmVseSwgdHlwaWNhbGx5IHZpYSB0aGUge0BsaW5rIFNldHRpbmdFeH0gYWRkZXJzIGFuZFxuICAgKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9LlxuICAgKlxuICAgKiBUaGUgc2V0dGluZyBPYnNpZGlhbiBjcmVhdGVzIGZvciB0aGUgcm93IGlzIGFkb3B0ZWQgaW50byBhIHtAbGluayBTZXR0aW5nRXh9IGJlZm9yZSBpdCBpcyBoYW5kZWQgb3Zlciwgc29cbiAgICogYW4gaW1wZXJhdGl2ZSByb3cgYm9keSBjYXJyaWVzIG92ZXIgdW5jaGFuZ2VkLiBNYXkgcmV0dXJuIGEgY2xlYW51cCBmdW5jdGlvbiwgaW52b2tlZCBiZWZvcmUgdGhlIHJvdyBpc1xuICAgKiB0b3JuIGRvd24gb3IgcmUtcmVuZGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5nIC0gVGhlIHNldHRpbmcgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSBncm91cCAtIFRoZSBncm91cCB0aGUgc2V0dGluZyBiZWxvbmdzIHRvLlxuICAgKiBAcmV0dXJucyBBbiBvcHRpb25hbCBjbGVhbnVwIGZ1bmN0aW9uLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZSAtLSBNaXJyb3JzIE9ic2lkaWFuJ3MgYFNldHRpbmdEZWZpbml0aW9uUmVuZGVyLnJlbmRlcmAsIHdob3NlIGNsZWFudXAgZnVuY3Rpb24gaXMgb3B0aW9uYWwuXG4gIHJlbmRlcihzZXR0aW5nOiBTZXR0aW5nRXgsIGdyb3VwOiBTZXR0aW5nR3JvdXApOiAoKCkgPT4gdm9pZCkgfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzZXR0aW5nIGlzIGluY2x1ZGVkIGluIHRoZSBzZXR0aW5ncyBzZWFyY2guIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHNlYXJjaGFibGU/OiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBzZXR0aW5nIHJvdyBpcyByZW5kZXJlZC4gQSBmdW5jdGlvbiBmb3JtIGlzIHJlLWV2YWx1YXRlZCBvbiBldmVyeSByZW5kZXIgYW5kIG9uXG4gICAqIGV2ZXJ5IHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UucmVmcmVzaERvbVN0YXRlfSBjYWxsLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSB2aXNpYmxlPzogKCgpID0+IGJvb2xlYW4pIHwgYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2Uuc2V0dGluZ0dyb3VwRXh9LlxuICpcbiAqIEV2ZXJ5IG1lbWJlciBvZiB7QGxpbmsgU2V0dGluZ0RlZmluaXRpb25Hcm91cH0gZXhjZXB0IGl0cyBkaXNjcmltaW5hdG9yLCB3aGljaFxuICoge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5zZXR0aW5nR3JvdXBFeH0gc2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0dyb3VwRXhQYXJhbXMgPSBFeGNlcHQ8U2V0dGluZ0RlZmluaXRpb25Hcm91cCwgJ3R5cGUnPjtcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBwYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UuYmluZH0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZS5cbiAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUgYmVpbmcgYm91bmQuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kSW1wbFBhcmFtczxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFRWYWx1ZUNvbXBvbmVudCxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZTtcblxuICAvKipcbiAgICogVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlRXZlbnRNYXAge1xuICB2YWxpZGF0aW9uTWVzc2FnZUNoYW5nZWQ6IFtwcm9wZXJ0eU5hbWU6IHN0cmluZywgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZ107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5vblNhdmVTZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHNhdmUgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IHVua25vd247XG5cbiAgLyoqXG4gICAqIFRoZSBuZXcgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG9sZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5yZW5kZXJTZXR0aW5nRXh9LlxuICovXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlUmVuZGVyU2V0dGluZ0V4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBncm91cCB0aGUgcm93IGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBncm91cDogU2V0dGluZ0dyb3VwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZyBPYnNpZGlhbiBjcmVhdGVkIGZvciB0aGUgcm93LlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZzogU2V0dGluZztcblxuICAvKipcbiAgICogVGhlIHBhcmFtcyB0aGUgcm93IHdhcyBkZWNsYXJlZCB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGluZ0V4UGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXM7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBvbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiwgaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgb25TYXZlU2V0dGluZ3MoXG4gICAgbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgY29udGV4dDogdW5rbm93blxuICApOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgY29tcG9uZW50IHRvIHN1YnNjcmliZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIE93bnMgdGhlIHRhYidzIHN1YnNjcmlwdGlvbnMgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9ucyBsaXZlIGluIHtAbGluayBvbmxvYWR9IHJhdGhlciB0aGFuIGF0IGVhY2ggcmVuZGVyLCBzbyB0aGF0IGEgbG9hZC91bmxvYWQgcGFpciByZWdpc3RlcnNcbiAqIHRoZW0gZXhhY3RseSBvbmNlLiBSZWdpc3RlcmluZyB0aGVtIHBlciByZW5kZXIgaW5zdGVhZCB3b3VsZCBhY2N1bXVsYXRlIGEgZnJlc2ggcGFpciBvbiBldmVyeSByZW5kZXIgY3ljbGUsXG4gKiBiZWNhdXNlIHtAbGluayBDb21wb25lbnRFeC5sb2FkfSBlYXJseS1yZXR1cm5zIG9uY2UgdGhlIGNvbXBvbmVudCBpcyBsb2FkZWQgYW5kIG5vdGhpbmcgcmVzZXRzIGluIGJldHdlZW4uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuY2xhc3MgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnQ8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBzZXR0aW5ncyBjb21wb25lbnQncyBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHsgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQgfSA9IHRoaXMucGFyYW1zO1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5vbignbG9hZFNldHRpbmdzJywgKGxvYWRlZFN0YXRlLCBpc0luaXRpYWxMb2FkKSA9PiB0aGlzLnBhcmFtcy5vbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCkpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQub24oJ3NhdmVTZXR0aW5ncycsIChuZXdTdGF0ZSwgb2xkU3RhdGUsIGNvbnRleHQpID0+IHRoaXMucGFyYW1zLm9uU2F2ZVNldHRpbmdzKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCkpKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpblNldHRpbmdzVGFiQmFzZUV2ZW50TWFwPigpKFBsdWdpblNldHRpbmdUYWIpIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgaXMgb3Blbi5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYiBpcyBvcGVuLlxuICAgKi9cbiAgcHVibGljIGdldCBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgbWFuYWdlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogQSBkZWJvdW5jZSB0aW1lb3V0IGZvciBzYXZpbmcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWJvdW5jZSB0aW1lb3V0IGZvciBzYXZpbmcgc2V0dGluZ3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNhdmVTZXR0aW5nc0RlYm91bmNlVGltZW91dEluTWlsbGlzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgY29uc3QgREVGQVVMVCA9IDJfMDAwO1xuICAgIHJldHVybiBERUZBVUxUO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgY3VycmVudFJlbmRlckNvbXBvbmVudDogQ29tcG9uZW50RXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBzYXZlU2V0dGluZ3NEZWJvdW5jZWQ6IERlYm91bmNlcjxbXSwgdm9pZD47XG5cbiAgcHJpdmF0ZSBnZXQgcGx1Z2luU2V0dGluZ3MoKTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nczxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnNldHRpbmdzU3RhdGUuaW5wdXRWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPikge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpblNldHRpbmdzQ29tcG9uZW50O1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXModGhpcy5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzRGVib3VuY2VkID0gZGVib3VuY2UoXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoKCkgPT4gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zYXZlVG9GaWxlKFNBVkVfVE9fRklMRV9DT05URVhUKSksXG4gICAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgKTtcbiAgICB0aGlzLmNvbXBvbmVudCA9IG5ldyBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncz4oe1xuICAgICAgb25Mb2FkU2V0dGluZ3M6IChsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCk6IFByb21pc2FibGU8dm9pZD4gPT4gdGhpcy5vbkxvYWRTZXR0aW5ncyhsb2FkZWRTdGF0ZSwgaXNJbml0aWFsTG9hZCksXG4gICAgICBvblNhdmVTZXR0aW5nczogKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCk6IFByb21pc2FibGU8dm9pZD4gPT4gdGhpcy5vblNhdmVTZXR0aW5ncyh7IGNvbnRleHQsIG5ld1N0YXRlLCBvbGRTdGF0ZSB9KSxcbiAgICAgIHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gVFZhbHVlQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbXMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50XG4gID4oXG4gICAgcGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kUGFyYW1zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQ+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbiAgPihcbiAgICBwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRFeHRlbmRlZFBhcmFtczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50LCBQcm9wZXJ0eU5hbWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtcyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnQsXG4gICAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbiAgPihcbiAgICBwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRJbXBsUGFyYW1zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBUVmFsdWVDb21wb25lbnQsIFByb3BlcnR5TmFtZT4gLy8gZXNsaW50LWRpc2FibGUtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBiaW5kIG92ZXJsb2FkIHNoYXJlcyB0aGUgQmluZCogcGFyYW0gZmFtaWx5LlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIHZhbHVlQ29tcG9uZW50LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0gPSBwYXJhbXM7XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7XG4gICAgICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogVUlWYWx1ZSk6IFByb3BlcnR5VHlwZSA9PiB2YWx1ZSBhcyBQcm9wZXJ0eVR5cGUsXG4gICAgICBvbkNoYW5nZWQ6IG5vb3AsXG4gICAgICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogUmVhZG9ubHlEZWVwPFByb3BlcnR5VHlwZT4pOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRSZXNldFNldHRpbmdXaGVuQ29tcG9uZW50SXNFbXB0eTogdHJ1ZSxcbiAgICAgIHNob3VsZFNob3dQbGFjZWhvbGRlckZvckRlZmF1bHRWYWx1ZXM6IHRydWUsXG4gICAgICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gICAgY29uc3QgdmFsaWRhdG9yRWwgPSBnZXRWYWxpZGF0b3JDb21wb25lbnQodmFsdWVDb21wb25lbnQpPy52YWxpZGF0b3JFbDtcblxuICAgIGNvbnN0IHRleHRCYXNlZENvbXBvbmVudCA9IGdldFRleHRCYXNlZENvbXBvbmVudFZhbHVlKHZhbHVlQ29tcG9uZW50KTtcblxuICAgIGNvbnN0IHJlYWRvbmx5VmFsdWUgPSB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV07XG4gICAgY29uc3QgZGVmYXVsdENvbXBvbmVudFZhbHVlID0gb3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIoZGVmYXVsdFZhbHVlIGFzIFJlYWRvbmx5RGVlcDxQcm9wZXJ0eVR5cGU+KTtcbiAgICB0ZXh0QmFzZWRDb21wb25lbnQ/LnNldFBsYWNlaG9sZGVyVmFsdWUoZGVmYXVsdENvbXBvbmVudFZhbHVlKTtcblxuICAgIGxldCB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIGxldCB0b29sdGlwRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRvb2x0aXBDb250ZW50RWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKHZhbGlkYXRvckVsKSB7XG4gICAgICBjb25zdCB3cmFwcGVyID0gZW5zdXJlV3JhcHBlZCh2YWxpZGF0b3JFbCk7XG4gICAgICB0b29sdGlwRWwgPSB3cmFwcGVyLmNyZWF0ZURpdigpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyh0b29sdGlwRWwsIFtDc3NDbGFzcy5Ub29sdGlwLCBDc3NDbGFzcy5Ub29sdGlwVmFsaWRhdG9yXSk7XG4gICAgICB0b29sdGlwQ29udGVudEVsID0gdG9vbHRpcEVsLmNyZWF0ZVNwYW4oKTtcbiAgICAgIGNvbnN0IHRvb2x0aXBBcnJvd0VsID0gdG9vbHRpcEVsLmNyZWF0ZURpdigpO1xuICAgICAgYWRkUGx1Z2luQ3NzQ2xhc3Nlcyh0b29sdGlwQXJyb3dFbCwgQ3NzQ2xhc3MuVG9vbHRpcEFycm93KTtcbiAgICAgIHRvb2x0aXBFbC5oaWRlKCk7XG4gICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKHRvb2x0aXBFbCk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgdGhpcy5nZXRSZW5kZXJDb21wb25lbnQoKSxcbiAgICAgIHRoaXMub24oJ3ZhbGlkYXRpb25NZXNzYWdlQ2hhbmdlZCcsIChhbm90aGVyUHJvcGVydHlOYW1lLCBhbm90aGVyVmFsaWRhdGlvbk1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKHByb3BlcnR5TmFtZSAhPT0gYW5vdGhlclByb3BlcnR5TmFtZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlID0gYW5vdGhlclZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCgpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGV0IHNob3VsZEVtcHR5T25CbHVyID0gZmFsc2U7XG4gICAgbGV0IHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyID0gZmFsc2U7XG5cbiAgICBpZiAodGV4dEJhc2VkQ29tcG9uZW50ICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcyAmJiBkZWVwRXF1YWwocmVhZG9ubHlWYWx1ZSwgZGVmYXVsdFZhbHVlKSkge1xuICAgICAgdGV4dEJhc2VkQ29tcG9uZW50LmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHJlYWRvbmx5VmFsdWUpKTtcbiAgICB9XG5cbiAgICBsZXQgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgY29uc3QgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgICBjb25zdCB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVWYWxpZGF0b3JFbCgpO1xuICAgICAgfSk7XG4gICAgfSwgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICB2YWx1ZUNvbXBvbmVudC5vbkNoYW5nZShjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgIGlmIChzaG91bGRTa2lwT25DaGFuZ2UpIHtcbiAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkocHJvcGVydHlOYW1lKTtcbiAgICAgIGxldCBuZXdWYWx1ZTogUHJvcGVydHlUeXBlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IHNob3VsZFNldFByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgIHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyID0gISF0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSAmJiBvcHRpb25zRXh0LnNob3VsZFJlc2V0U2V0dGluZ1doZW5Db21wb25lbnRJc0VtcHR5O1xuICAgICAgaWYgKHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSBvcHRpb25zRXh0LmNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcih1aVZhbHVlKTtcbiAgICAgICAgaWYgKGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIoY29udmVydGVkVmFsdWUpKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBjb252ZXJ0ZWRWYWx1ZS52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICBzaG91bGRTZXRQcm9wZXJ0eSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gY29udmVydGVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFNldFByb3BlcnR5KSB7XG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlID0gYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlIGFzIFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0pO1xuICAgICAgICBpZiAodGV4dEJhc2VkQ29tcG9uZW50ICYmIG9wdGlvbnNFeHQuc2hvdWxkU2hvd1BsYWNlaG9sZGVyRm9yRGVmYXVsdFZhbHVlcyAmJiAhdGV4dEJhc2VkQ29tcG9uZW50LmlzRW1wdHkoKSAmJiBkZWVwRXF1YWwobmV3VmFsdWUsIGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICBzaG91bGRFbXB0eU9uQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eSkge1xuICAgICAgICBhd2FpdCBvcHRpb25zRXh0Lm9uQ2hhbmdlZChuZXdWYWx1ZSBhcyBSZWFkb25seURlZXA8UHJvcGVydHlUeXBlPiwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQoKTtcbiAgICB9KSk7XG5cbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB1cGRhdGVWYWxpZGF0b3JFbERlYm91bmNlZCgpO1xuICAgIH0pO1xuICAgIHZhbGlkYXRvckVsPy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4ge1xuICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICB9KTtcbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXR0aW5nc1N0YXRlLnZhbGlkYXRpb25NZXNzYWdlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPz8gJyc7XG4gICAgdXBkYXRlVmFsaWRhdG9yRWxEZWJvdW5jZWQoKTtcblxuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVZhbGlkYXRvckVsKCk6IHZvaWQge1xuICAgICAgaWYgKCF2YWxpZGF0b3JFbD8uaXNBY3RpdmVFbGVtZW50KCkpIHtcbiAgICAgICAgaWYgKHNob3VsZEVtcHR5T25CbHVyKSB7XG4gICAgICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICghdGV4dEJhc2VkQ29tcG9uZW50Py5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHNob3VsZFNraXBPbkNoYW5nZSA9IHRydWU7XG4gICAgICAgICAgICB0ZXh0QmFzZWRDb21wb25lbnQ/LmVtcHR5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJldmVydFRvRGVmYXVsdFZhbHVlT25CbHVyKSB7XG4gICAgICAgICAgc2hvdWxkUmV2ZXJ0VG9EZWZhdWx0VmFsdWVPbkJsdXIgPSBmYWxzZTtcblxuICAgICAgICAgIGlmICh0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKGRlZmF1bHRDb21wb25lbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdmFsaWRhdG9yRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhc3NlcnROb25OdWxsYWJsZSh0b29sdGlwQ29udGVudEVsKTtcblxuICAgICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlID09PSAnJykge1xuICAgICAgICB2YWxpZGF0b3JFbC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICAgIHZhbGlkYXRvckVsLmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0b3JFbC52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgIH1cblxuICAgICAgdmFsaWRhdG9yRWwuc2V0Q3VzdG9tVmFsaWRpdHkodmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgaWYgKG9wdGlvbnNFeHQuc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHRvb2x0aXBDb250ZW50RWwudGV4dENvbnRlbnQgPSB2YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgdG9vbHRpcEVsPy50b2dnbGUoISF2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHNldFRvb2x0aXAodmFsaWRhdG9yRWwsIHZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGxheUxlZ2FjeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExlZ2FjeSB3YXkgdG8gcmVuZGVyIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIGltcGVyYXRpdmVseS5cbiAgICpcbiAgICogVGhlIHByZS1kZWNsYXJhdGl2ZSBmYWxsYmFjazogT2JzaWRpYW4gb25seSBjYWxscyBpdCB3aGVuIHtAbGluayBnZXRTZXR0aW5nRGVmaW5pdGlvbnN9IHJldHVybnMgYW4gZW1wdHlcbiAgICogYXJyYXksIGkuZS4gd2hlbiB0aGUgY29uc3VtZXIgaGFzIG5vdCBvdmVycmlkZGVuIHtAbGluayBnZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zfS4gU3VjaCBhIGNvbnN1bWVyXG4gICAqIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCBhbmQgYnVpbGRzIHRoZSBVSSB3aXRoIHtAbGluayBTZXR0aW5nRXh9IGFuZCB7QGxpbmsgYmluZH0uXG4gICAqL1xuICBwdWJsaWMgZGlzcGxheUxlZ2FjeSgpOiB2b2lkIHtcbiAgICB0aGlzLmJlZ2luUmVuZGVyQ3ljbGUoKTtcbiAgICB0aGlzLmNvbnRhaW5lckVsLmVtcHR5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHZhbHVlIGJhY2tpbmcgYSBuYXRpdmUgYGNvbnRyb2xgIHNldHRpbmcgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogT2JzaWRpYW4gY2FsbHMgaXQgb24gZXZlcnkgcmVuZGVyIG9mIGEgYGNvbnRyb2xgLXR5cGUgZGVmaW5pdGlvbi4gVGhlIGluaGVyaXRlZCBpbXBsZW1lbnRhdGlvbiByZWFkc1xuICAgKiBgcGx1Z2luLnNldHRpbmdzYCwgd2hpY2ggYSBwbHVnaW4gYnVpbHQgb24ge0BsaW5rIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZX0gbmV2ZXIgcG9wdWxhdGVzLCBzbyBpdCBpc1xuICAgKiByb3V0ZWQgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHZhbHVlLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGdldENvbnRyb2xWYWx1ZShrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmdldFBsdWdpblNldHRpbmdzUHJvcGVydHkoY2FzdFRvPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWNsYXJhdGl2ZSBzZXR0aW5nIGRlZmluaXRpb25zIHJlbmRlcmVkIGJ5IE9ic2lkaWFuIDEuMTMrLlxuICAgKlxuICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9LiBXaGVuIGEgY29uc3VtZXIgaGFzIG5vdCBvdmVycmlkZGVuIHRoYXQgaG9vayBpdCByZXR1cm5zXG4gICAqIGFuIGVtcHR5IGFycmF5LCBhbmQgT2JzaWRpYW4gZmFsbHMgYmFjayB0byB0aGUgaW1wZXJhdGl2ZSB7QGxpbmsgZGlzcGxheUxlZ2FjeX0gcGF0aC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0U2V0dGluZ0RlZmluaXRpb25zKCk6IFNldHRpbmdEZWZpbml0aW9uSXRlbVtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcbiAgICBzdXBlci5oaWRlKCk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQuY2FuY2VsKCk7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5lbmRSZW5kZXJDeWNsZSgpO1xuICAgIHRoaXMuY29tcG9uZW50LnVubG9hZCgpO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHRoaXMuaGlkZUFzeW5jKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGFjdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHRoZSBzZXR0aW5ncyB0YWIgaXMgYmVpbmcgaGlkZGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIHRhYiBpcyBoaWRkZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaGlkZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuc2F2ZVRvRmlsZShTQVZFX1RPX0ZJTEVfQ09OVEVYVCk7XG4gIH1cblxuICAvKipcbiAgICogUmUtcmVuZGVycyB0aGUgc2V0dGluZ3MgdGFiIGFmdGVyIHRoZSB1bmRlcmx5aW5nIHN0YXRlIGNoYW5nZWQuXG4gICAqXG4gICAqIFJlYnVpbGRzIHRoZSBkZWZpbml0aW9ucyBhbmQgcmUtcmVuZGVycywgd2hpY2ggY292ZXJzIGJvdGggcGF0aHM6IE9ic2lkaWFuIHJlbmRlcnMgdGhlIGRlY2xhcmF0aXZlXG4gICAqIGRlZmluaXRpb25zIHdoZW4ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9IHByb3ZpZGVzIHRoZW0sIGFuZCBmYWxscyBiYWNrIHRvXG4gICAqIHtAbGluayBkaXNwbGF5TGVnYWN5fSB3aGVuIGl0IGRvZXMgbm90LiBOb3RoaW5nIGlzIHJlbmRlcmVkIHdoaWxlIHRoZSB0YWIgaXMgbm90IHRoZSBvbmUgb24gc2NyZWVuLlxuICAgKlxuICAgKiBVc2UgaXQgb25seSBmb3IgY2hhbmdlcyB0aGF0IGFsdGVyIHRoZSBTVFJVQ1RVUkUgb2YgdGhlIHRhYiBcdTIwMTQgcm93cyBhZGRlZCBvciByZW1vdmVkLiBXaGVuIG9ubHkgYVxuICAgKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLmRpc2FibGVkfSAvIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMudmlzaWJsZX1cbiAgICogcHJlZGljYXRlIGhhcyB0byBiZSByZS1ldmFsdWF0ZWQsIGNhbGwgdGhlIG11Y2ggY2hlYXBlciB7QGxpbmsgcmVmcmVzaERvbVN0YXRlfSBpbnN0ZWFkLCB3aGljaCB0b2dnbGVzIHRoZVxuICAgKiByZW5kZXJlZCBET00gaW4gcGxhY2UuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3RzIHRoZSB2YWx1ZSBvZiBhIG5hdGl2ZSBgY29udHJvbGAgc2V0dGluZyBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGdldENvbnRyb2xWYWx1ZX06IGl0IHJvdXRlcyB0aGUgd3JpdGUgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCBpbnN0ZWFkIG9mIHRoZVxuICAgKiBpbmhlcml0ZWQgYHBsdWdpbi5zYXZlRGF0YWAgcGF0aCwgc28gdmFsaWRhdGlvbiwgdHJhbnNmb3JtZXJzIGFuZCB0aGUgZGVib3VuY2VkIHNhdmUgYWxsIGFwcGx5IGFzIHRoZXkgZG9cbiAgICogZm9yIGEge0BsaW5rIGJpbmR9LWVkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFRoZSBzZXR0aW5ncyBwcm9wZXJ0eSBuYW1lLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcGVyc2lzdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgc2V0Q29udHJvbFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHR5cGUgUHJvcGVydHlOYW1lID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz47XG4gICAgYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXRQcm9wZXJ0eShjYXN0VG88UHJvcGVydHlOYW1lPihrZXkpLCBjYXN0VG88UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4odmFsdWUpKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgcHVibGljIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuVGFiKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWNsYXJhdGl2ZSBzZXR0aW5nIGRlZmluaXRpb25zIGZvciB0aGUgdGFiIChPYnNpZGlhbiAxLjEzKykuXG4gICAqXG4gICAqIENvbnN1bWVycyBvdmVycmlkZSB0aGlzLCB0eXBpY2FsbHkgYnVpbGRpbmcgZWFjaCByb3cgd2l0aCB7QGxpbmsgc2V0dGluZ0V4fSBhbmQge0BsaW5rIGJpbmR9IGFuZCBncm91cGluZ1xuICAgKiB0aGVtIHdpdGggYHNldHRpbmdHcm91cEV4YC4gUmV0dXJuaW5nIGFuIGVtcHR5IGFycmF5IFx1MjAxNCB0aGUgZGVmYXVsdCBcdTIwMTQgbWFrZXMgT2JzaWRpYW4gZmFsbCBiYWNrIHRvIHRoZVxuICAgKiBpbXBlcmF0aXZlIHtAbGluayBkaXNwbGF5TGVnYWN5fSBwYXRoLlxuICAgKlxuICAgKiBNVVNUIGJlIGEgcHVyZSBidWlsZGVyLiBPYnNpZGlhbiBjYWxscyBpdCB3aGVuIHRoZSB0YWIgaXMgcmVnaXN0ZXJlZCAoYGFkZFNldHRpbmdUYWJgKSwgbG9uZyBiZWZvcmUgdGhlXG4gICAqIHRhYiBpcyBldmVyIG9wZW5lZCwgaW4gb3JkZXIgdG8gaW5kZXggdGhlIHNldHRpbmdzIGZvciBzZWFyY2guIEFueXRoaW5nIHdpdGggYSBzaWRlIGVmZmVjdCBiZWxvbmdzIGluc2lkZVxuICAgKiBhIHJvdydzIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMucmVuZGVyfSBjYWxsYmFjaywgd2hpY2ggcnVucyBvbmx5IHdoZW4gdGhlIHJvdyBpc1xuICAgKiBhY3R1YWxseSByZW5kZXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U2V0dGluZ0RlZmluaXRpb25JdGVtcygpOiBTZXR0aW5nRGVmaW5pdGlvbkl0ZW1bXSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICpcbiAgICogQHBhcmFtIF9sb2FkZWRTdGF0ZSAtIFRoZSBsb2FkZWQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhlIHNldHRpbmdzIGFyZSBiZWluZyBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkU2V0dGluZ3MoX2xvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LCBfaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmFsaWRhdGVzIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgcmV2YWxpZGF0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmV2YWxpZGF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YWxpZGF0aW9uTWVzc2FnZXMgPSBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnJldmFsaWRhdGUoKTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKHZhbGlkYXRpb25NZXNzYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc2VhcmNoLWluZGV4YWJsZSBkZWNsYXJhdGl2ZSByb3cgdGhhdCBpcyByZW5kZXJlZCBpbXBlcmF0aXZlbHkuXG4gICAqXG4gICAqIFRoZSBicmlkZ2UgYmV0d2VlbiB0aGUgZGVjbGFyYXRpdmUgQVBJIGFuZCBPRFUncyBpbXBlcmF0aXZlIGJ1aWxkaW5nIGJsb2NrczogT2JzaWRpYW4gb3ducyB0aGUgcm93IChzbyBpdFxuICAgKiBpbmRleGVzIGl0IGZvciBzZWFyY2ggYW5kIGV2YWx1YXRlcyBpdHMge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcy52aXNpYmxlfSAvXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMuZGlzYWJsZWR9IHByZWRpY2F0ZXMgb24gZXZlcnlcbiAgICoge0BsaW5rIHJlZnJlc2hEb21TdGF0ZX0pLCB3aGlsZSB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLnJlbmRlcn0gZmlsbHMgaXQgaW4gd2l0aFxuICAgKiB7QGxpbmsgU2V0dGluZ0V4fSBhZGRlcnMgYW5kIHtAbGluayBiaW5kfSBleGFjdGx5IGFzIGFuIGltcGVyYXRpdmUgdGFiIHdvdWxkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJvdyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGRlZmluaXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0dGluZ0V4KHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zKTogU2V0dGluZ0RlZmluaXRpb25SZW5kZXIge1xuICAgIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2V0dGluZ0RlZmluaXRpb25SZW5kZXI+KHtcbiAgICAgIGFsaWFzZXM6IHBhcmFtcy5hbGlhc2VzLFxuICAgICAgZGVzYzogcGFyYW1zLmRlc2MsXG4gICAgICBkaXNhYmxlZDogcGFyYW1zLmRpc2FibGVkLFxuICAgICAgbmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICByZW5kZXI6IChzZXR0aW5nOiBTZXR0aW5nLCBncm91cDogU2V0dGluZ0dyb3VwKSA9PiB0aGlzLnJlbmRlclNldHRpbmdFeCh7IGdyb3VwLCBzZXR0aW5nLCBzZXR0aW5nRXhQYXJhbXM6IHBhcmFtcyB9KSxcbiAgICAgIHNlYXJjaGFibGU6IHBhcmFtcy5zZWFyY2hhYmxlLFxuICAgICAgdmlzaWJsZTogcGFyYW1zLnZpc2libGVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBkZWNsYXJhdGl2ZSBoZWFkaW5nIGdyb3VwLlxuICAgKlxuICAgKiBUaGUgZGVjbGFyYXRpdmUgY291bnRlcnBhcnQgb2YgYFNldHRpbmdHcm91cEV4YDogd2hlcmUgdGhhdCBjbGFzcyBhcHBlbmRzIGEgZ3JvdXAgdG8gYSBjb250YWluZXJcbiAgICogaW1wZXJhdGl2ZWx5LCB0aGlzIHJldHVybnMgdGhlIGRlZmluaXRpb24gT2JzaWRpYW4gcmVuZGVycywgc28gYSBncm91cC1zdHJ1Y3R1cmVkIHRhYiBrZWVwcyBpdHMgc2hhcGVcbiAgICogYWZ0ZXIgdGhlIG1pZ3JhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBncm91cCBwYXJhbXMuXG4gICAqIEByZXR1cm5zIFRoZSBncm91cCBkZWZpbml0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldHRpbmdHcm91cEV4KHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0dyb3VwRXhQYXJhbXMpOiBTZXR0aW5nRGVmaW5pdGlvbkdyb3VwIHtcbiAgICByZXR1cm4gbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNldHRpbmdEZWZpbml0aW9uR3JvdXA+KHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHR5cGU6ICdncm91cCdcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmVnaW5SZW5kZXJDeWNsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFJlbmRlckN5Y2xlKCk7XG4gICAgdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50ID0gdGhpcy5jcmVhdGVSZW5kZXJDb21wb25lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk6IENvbXBvbmVudEV4IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMuY29tcG9uZW50LmxvYWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQuYWRkQ2hpbGQobmV3IENvbXBvbmVudEV4KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRSZW5kZXJDeWNsZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZW5kZXJDb21wb25lbnQgPSB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQ7XG4gICAgaWYgKCFyZW5kZXJDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMuY29tcG9uZW50LnJlbW92ZUNoaWxkKHJlbmRlckNvbXBvbmVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldFBsdWdpblNldHRpbmdzUHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lXG4gICk6IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnBsdWdpblNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIHJldHVybiBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVuZGVyQ29tcG9uZW50KCk6IENvbXBvbmVudEV4IHtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPz89IHRoaXMuY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25TYXZlU2V0dGluZ3MocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VPblNhdmVTZXR0aW5nc1BhcmFtczxQbHVnaW5TZXR0aW5ncz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgbmV3U3RhdGUsXG4gICAgICBvbGRTdGF0ZTogX29sZFN0YXRlXG4gICAgfSA9IHBhcmFtcztcbiAgICBpZiAoY29udGV4dCA9PT0gU0FWRV9UT19GSUxFX0NPTlRFWFQpIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmFsaWRhdGlvbnMobmV3U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzIGFzIFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlIC0tIE1pcnJvcnMgT2JzaWRpYW4ncyBgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIucmVuZGVyYCwgd2hvc2UgY2xlYW51cCBmdW5jdGlvbiBpcyBvcHRpb25hbC5cbiAgcHJpdmF0ZSByZW5kZXJTZXR0aW5nRXgocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VSZW5kZXJTZXR0aW5nRXhQYXJhbXMpOiAoKCkgPT4gdm9pZCkgfCB2b2lkIHtcbiAgICBjb25zdCByb3dDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVJlbmRlckNvbXBvbmVudCgpO1xuICAgIGNvbnN0IHByZXZpb3VzUmVuZGVyQ29tcG9uZW50ID0gdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50O1xuICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IHJvd0NvbXBvbmVudDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGVhbnVwID0gcGFyYW1zLnNldHRpbmdFeFBhcmFtcy5yZW5kZXIoYWRvcHRTZXR0aW5nRXgocGFyYW1zLnNldHRpbmcpLCBwYXJhbXMuZ3JvdXApO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnQucmVtb3ZlQ2hpbGQocm93Q29tcG9uZW50KTtcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IHByZXZpb3VzUmVuZGVyQ29tcG9uZW50O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbk1lc3NhZ2VzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbGlkYXRpb25NZXNzYWdlXSBvZiBPYmplY3QuZW50cmllcyh2YWxpZGF0aW9uTWVzc2FnZXMpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyaWdnZXJBc3luYygndmFsaWRhdGlvbk1lc3NhZ2VDaGFuZ2VkJywgcHJvcGVydHlOYW1lLCB2YWxpZGF0aW9uTWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1QkEsc0JBSU87QUFZUCwwQkFBaUM7QUFDakMsbUJBR087QUFDUCxzQkFHTztBQUNQLDBCQUlPO0FBQ1AseUJBQWtDO0FBQ2xDLG9DQUFtQztBQUNuQywwQkFBNEI7QUFDNUIsdUJBQXlCO0FBQ3pCLHVDQUE4QjtBQUM5QixrQ0FBMkM7QUFDM0MsaUNBQXNDO0FBQ3RDLHdCQUErQjtBQUMvQix3QkFBMEM7QUFDMUMsNEJBQW9DO0FBSzdCLE1BQU0sdUJBQXVCO0FBNFNwQyxNQUFNLHlDQUF3RSxnQ0FBWTtBQUFBLEVBQ3ZFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUEyRTtBQUM1RixVQUFNO0FBQ04sU0FBSyxTQUFTO0FBQUEsRUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLFVBQU0sT0FBTztBQUNiLFVBQU0sRUFBRSx3QkFBd0IsSUFBSSxLQUFLO0FBQ3pDLDBEQUFtQixNQUFNLHdCQUF3QixHQUFHLGdCQUFnQixDQUFDLGFBQWEsa0JBQWtCLEtBQUssT0FBTyxlQUFlLGFBQWEsYUFBYSxDQUFDLENBQUM7QUFDM0osMERBQW1CLE1BQU0sd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxVQUFVLFlBQVksS0FBSyxPQUFPLGVBQWUsVUFBVSxVQUFVLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFDL0o7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
|
|
600
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRGVib3VuY2VyLFxuICBQbHVnaW4sXG4gIFNldHRpbmcsXG4gIFNldHRpbmdEZWZpbml0aW9uR3JvdXAsXG4gIFNldHRpbmdEZWZpbml0aW9uSXRlbSxcbiAgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIsXG4gIFNldHRpbmdHcm91cFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIENvbmRpdGlvbmFsS2V5cyxcbiAgRXhjZXB0LFxuICBQcm9taXNhYmxlLFxuICBSZWFkb25seURlZXBcbn0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHtcbiAgZGVib3VuY2UsXG4gIFBsdWdpblNldHRpbmdUYWIsXG4gIHNldFRvb2x0aXBcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzLFxuICBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGVcbn0gZnJvbSAnLi4vY29tcG9uZW50cy9wbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50LnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdmFsdWUtY29tcG9uZW50LXdpdGgtY2hhbmdlLXRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgU2V0dGluZ0V4IH0gZnJvbSAnLi4vc2V0dGluZy1leC50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vdmFsaWRhdGlvbi50cyc7XG5cbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgY2FzdFRvLFxuICBpc0RlZXBFcXVhbCxcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzXG59IGZyb20gJy4uLy4uL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyQXN5bmNFdmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXN5bmMtZXZlbnRzLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGVuc3VyZVdyYXBwZWQgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvc2V0dGluZy1jb21wb25lbnQtd3JhcHBlci50cyc7XG5pbXBvcnQgeyBnZXRUZXh0QmFzZWRDb21wb25lbnRWYWx1ZSB9IGZyb20gJy4uL3NldHRpbmctY29tcG9uZW50cy90ZXh0LWJhc2VkLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9zZXR0aW5nLWNvbXBvbmVudHMvdmFsaWRhdG9yLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBhZG9wdFNldHRpbmdFeCB9IGZyb20gJy4uL3NldHRpbmctZXgudHMnO1xuaW1wb3J0IHsgaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB9IGZyb20gJy4uL3ZhbGlkYXRpb24udHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIEEgY29udGV4dCBwYXNzZWQgdG8gdGhlIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2Uuc2F2ZVRvRmlsZX0gbWV0aG9kLlxuICovXG5leHBvcnQgY29uc3QgU0FWRV9UT19GSUxFX0NPTlRFWFQgPSAnUGx1Z2luU2V0dGluZ3NUYWInO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBQbHVnaW5TZXR0aW5nc1RhYkJhc2UuYmluZGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHNldHRpbmdzIHByb3BlcnR5IHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zPFQ+IHtcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2VkPyhuZXdWYWx1ZTogUmVhZG9ubHlEZWVwPFQ+LCBvbGRWYWx1ZTogUmVhZG9ubHlEZWVwPFQ+KTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXNldCB0aGUgc2V0dGluZyB3aGVuIHRoZSBjb21wb25lbnQgdmFsdWUgaXMgZW1wdHkuXG4gICAqIEFwcGxpY2FibGUgb25seSB0byB0ZXh0LWJhc2VkIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVzZXRTZXR0aW5nV2hlbkNvbXBvbmVudElzRW1wdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBsYWNlaG9sZGVyIGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICogQXBwbGljYWJsZSBvbmx5IHRvIHRleHQtYmFzZWQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTaG93UGxhY2Vob2xkZXJGb3JEZWZhdWx0VmFsdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBzaG93IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2hlbiB0aGUgY29tcG9uZW50IHZhbHVlIGlzIGludmFsaWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBvcHRpb25zIGZvciBgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmRgLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUuXG4gKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBzZXR0aW5ncyBwcm9wZXJ0eSBuYW1lIGJlaW5nIGJvdW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zRXh0ZW5kZWQ8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPlxuPiBleHRlbmRzIEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZSBwbHVnaW4gc2V0dGluZ3MgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcih1aVZhbHVlOiBVSVZhbHVlKTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSB8IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlIHRvIHRoZSB2YWx1ZSB1c2VkIGJ5IHRoZSBVSSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5TZXR0aW5nc1ZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBVSSBjb21wb25lbnQuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIocGx1Z2luU2V0dGluZ3NWYWx1ZTogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+KTogVUlWYWx1ZTtcbn1cblxuLyoqXG4gKiBFeHRlbmRlZCBwYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UuYmluZH0gd2l0aCB2YWx1ZSBjb252ZXJ0ZXJzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUuXG4gKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBzZXR0aW5ncyBwcm9wZXJ0eSBuYW1lIGJlaW5nIGJvdW5kLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRFeHRlbmRlZFBhcmFtczxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFRWYWx1ZUNvbXBvbmVudCxcbiAgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5cbj4gZXh0ZW5kcyBCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eU5hbWU+IHtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLmJpbmR9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUuXG4gKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJCYXNlQmluZFBhcmFtczxcbiAgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QsXG4gIFVJVmFsdWUsXG4gIFRWYWx1ZUNvbXBvbmVudFxuPiBleHRlbmRzIEJpbmRPcHRpb25zPFVJVmFsdWU+IHtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eU5hbWU6IENvbmRpdGlvbmFsS2V5czxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZT47XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBjb21wb25lbnQgdG8gYmluZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIGNyZWF0aW5nIGEge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpbnN0YW5jZSAobmVlZGVkIGJ5IE9ic2lkaWFuJ3MgUGx1Z2luU2V0dGluZ1RhYikuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3M+O1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5zZXR0aW5nRXh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHNlYXJjaCB0ZXJtcyBmb3IgdGhlIHNldHRpbmcuXG4gICAqL1xuICByZWFkb25seSBhbGlhc2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2V0dGluZy4gVXNlZCBmb3IgcmVuZGVyaW5nOyB0aGUgdGV4dCBjb250ZW50IG9mIGEgZnJhZ21lbnQgaXMgdXNlZCBmb3Igc2VhcmNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzYz86IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNldHRpbmcgcm93IGlzIGRpc2FibGVkLlxuICAgKlxuICAgKiBBIGZ1bmN0aW9uIGZvcm0gaXMgcmUtZXZhbHVhdGVkIG9uIGV2ZXJ5IHJlbmRlciBBTkQgb24gZXZlcnkge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5yZWZyZXNoRG9tU3RhdGV9XG4gICAqIGNhbGwsIHNvIGl0IGNhbiByZWZsZWN0IHJ1bnRpbWUgc3RhdGUuIE9ic2lkaWFuIGFwcGxpZXMgaXQgd2l0aCBgU2V0dGluZy5zZXREaXNhYmxlZGAsIHdoaWNoIGRpc2FibGVzIHRoZVxuICAgKiByb3cgYW5kIGV2ZXJ5IGNvbXBvbmVudCByZWdpc3RlcmVkIG9uIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZWQ/OiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBzZXR0aW5nLiBVc2VkIGZvciByZW5kZXJpbmcgYW5kIHNlYXJjaC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgc2V0dGluZyByb3cgaW1wZXJhdGl2ZWx5LCB0eXBpY2FsbHkgdmlhIHRoZSB7QGxpbmsgU2V0dGluZ0V4fSBhZGRlcnMgYW5kXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2UuYmluZH0uXG4gICAqXG4gICAqIFRoZSBzZXR0aW5nIE9ic2lkaWFuIGNyZWF0ZXMgZm9yIHRoZSByb3cgaXMgYWRvcHRlZCBpbnRvIGEge0BsaW5rIFNldHRpbmdFeH0gYmVmb3JlIGl0IGlzIGhhbmRlZCBvdmVyLCBzb1xuICAgKiBhbiBpbXBlcmF0aXZlIHJvdyBib2R5IGNhcnJpZXMgb3ZlciB1bmNoYW5nZWQuIE1heSByZXR1cm4gYSBjbGVhbnVwIGZ1bmN0aW9uLCBpbnZva2VkIGJlZm9yZSB0aGUgcm93IGlzXG4gICAqIHRvcm4gZG93biBvciByZS1yZW5kZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmcgLSBUaGUgc2V0dGluZyB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGdyb3VwIC0gVGhlIGdyb3VwIHRoZSBzZXR0aW5nIGJlbG9uZ3MgdG8uXG4gICAqIEByZXR1cm5zIEFuIG9wdGlvbmFsIGNsZWFudXAgZnVuY3Rpb24uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlIC0tIE1pcnJvcnMgT2JzaWRpYW4ncyBgU2V0dGluZ0RlZmluaXRpb25SZW5kZXIucmVuZGVyYCwgd2hvc2UgY2xlYW51cCBmdW5jdGlvbiBpcyBvcHRpb25hbC5cbiAgcmVuZGVyKHNldHRpbmc6IFNldHRpbmdFeCwgZ3JvdXA6IFNldHRpbmdHcm91cCk6ICgoKSA9PiB2b2lkKSB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHNldHRpbmcgaXMgaW5jbHVkZWQgaW4gdGhlIHNldHRpbmdzIHNlYXJjaC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoYWJsZT86ICgoKSA9PiBib29sZWFuKSB8IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHNldHRpbmcgcm93IGlzIHJlbmRlcmVkLiBBIGZ1bmN0aW9uIGZvcm0gaXMgcmUtZXZhbHVhdGVkIG9uIGV2ZXJ5IHJlbmRlciBhbmQgb25cbiAgICogZXZlcnkge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5yZWZyZXNoRG9tU3RhdGV9IGNhbGwuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHJlYWRvbmx5IHZpc2libGU/OiAoKCkgPT4gYm9vbGVhbikgfCBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5zZXR0aW5nR3JvdXBFeH0uXG4gKlxuICogRXZlcnkgbWVtYmVyIG9mIHtAbGluayBTZXR0aW5nRGVmaW5pdGlvbkdyb3VwfSBleGNlcHQgaXRzIGRpc2NyaW1pbmF0b3IsIHdoaWNoXG4gKiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLnNldHRpbmdHcm91cEV4fSBzZXRzLlxuICovXG5leHBvcnQgdHlwZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nR3JvdXBFeFBhcmFtcyA9IEV4Y2VwdDxTZXR0aW5nRGVmaW5pdGlvbkdyb3VwLCAndHlwZSc+O1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIHBhcmFtcyBmb3Ige0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZS5iaW5kfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICogQHR5cGVQYXJhbSBVSVZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIFVJIGNvbXBvbmVudCdzIHZhbHVlLlxuICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZSBiZWluZyBib3VuZC5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZUJpbmRJbXBsUGFyYW1zPFxuICBQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCxcbiAgVUlWYWx1ZSxcbiAgVFZhbHVlQ29tcG9uZW50LFxuICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPlxuPiBleHRlbmRzIEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqL1xuICByZWFkb25seSB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT47XG59XG5cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VFdmVudE1hcCB7XG4gIHZhbGlkYXRpb25NZXNzYWdlQ2hhbmdlZDogW3Byb3BlcnR5TmFtZTogc3RyaW5nLCB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLm9uU2F2ZVNldHRpbmdzfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQmFzZU9uU2F2ZVNldHRpbmdzUGFyYW1zPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgc2F2ZSBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dDogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIG5ldyBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1N0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkIHNldHRpbmdzIHN0YXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlLnJlbmRlclNldHRpbmdFeH0uXG4gKi9cbmludGVyZmFjZSBQbHVnaW5TZXR0aW5nc1RhYkJhc2VSZW5kZXJTZXR0aW5nRXhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGdyb3VwIHRoZSByb3cgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3VwOiBTZXR0aW5nR3JvdXA7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nIE9ic2lkaWFuIGNyZWF0ZWQgZm9yIHRoZSByb3cuXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nOiBTZXR0aW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIHRoZSByb3cgd2FzIGRlY2xhcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nRXhQYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcztcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBwYXJhbXMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiRXZlbnRzQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICovXG4gIG9uTG9hZFNldHRpbmdzKGxvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LCBpc0luaXRpYWxMb2FkOiBib29sZWFuKTogUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBvblNhdmVTZXR0aW5ncyhcbiAgICBuZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBvbGRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBjb250ZXh0OiB1bmtub3duXG4gICk6IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBjb21wb25lbnQgdG8gc3Vic2NyaWJlIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDb21wb25lbnQ6IFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxQbHVnaW5TZXR0aW5ncz47XG59XG5cbi8qKlxuICogT3ducyB0aGUgdGFiJ3Mgc3Vic2NyaXB0aW9ucyB0byB0aGUgc2V0dGluZ3MgY29tcG9uZW50LlxuICpcbiAqIFRoZSBzdWJzY3JpcHRpb25zIGxpdmUgaW4ge0BsaW5rIG9ubG9hZH0gcmF0aGVyIHRoYW4gYXQgZWFjaCByZW5kZXIsIHNvIHRoYXQgYSBsb2FkL3VubG9hZCBwYWlyIHJlZ2lzdGVyc1xuICogdGhlbSBleGFjdGx5IG9uY2UuIFJlZ2lzdGVyaW5nIHRoZW0gcGVyIHJlbmRlciBpbnN0ZWFkIHdvdWxkIGFjY3VtdWxhdGUgYSBmcmVzaCBwYWlyIG9uIGV2ZXJ5IHJlbmRlciBjeWNsZSxcbiAqIGJlY2F1c2Uge0BsaW5rIENvbXBvbmVudEV4LmxvYWR9IGVhcmx5LXJldHVybnMgb25jZSB0aGUgY29tcG9uZW50IGlzIGxvYWRlZCBhbmQgbm90aGluZyByZXNldHMgaW4gYmV0d2Vlbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICovXG5jbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkV2ZW50c0NvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1zLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIHNldHRpbmdzIGNvbXBvbmVudCdzIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgY29uc3QgeyBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudCB9ID0gdGhpcy5wYXJhbXM7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHBsdWdpblNldHRpbmdzQ29tcG9uZW50Lm9uKCdsb2FkU2V0dGluZ3MnLCAobG9hZGVkU3RhdGUsIGlzSW5pdGlhbExvYWQpID0+IHRoaXMucGFyYW1zLm9uTG9hZFNldHRpbmdzKGxvYWRlZFN0YXRlLCBpc0luaXRpYWxMb2FkKSkpO1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5vbignc2F2ZVNldHRpbmdzJywgKG5ld1N0YXRlLCBvbGRTdGF0ZSwgY29udGV4dCkgPT4gdGhpcy5wYXJhbXMub25TYXZlU2V0dGluZ3MobmV3U3RhdGUsIG9sZFN0YXRlLCBjb250ZXh0KSkpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgcGx1Z2luIHNldHRpbmdzIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBQcm92aWRlcyBhIG1ldGhvZCBmb3IgYmluZGluZyB2YWx1ZSBjb21wb25lbnRzIHRvIHBsdWdpbiBzZXR0aW5ncyBhbmQgaGFuZGxpbmcgY2hhbmdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0eXBlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGx1Z2luU2V0dGluZ3NUYWJCYXNlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luU2V0dGluZ3NUYWJCYXNlRXZlbnRNYXA+KCkoUGx1Z2luU2V0dGluZ1RhYikge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYiBpcyBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiIGlzIG9wZW4uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBtYW5hZ2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ29tcG9uZW50OiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBBIGRlYm91bmNlIHRpbWVvdXQgZm9yIHNhdmluZyBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGRlYm91bmNlIHRpbWVvdXQgZm9yIHNhdmluZyBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2F2ZVNldHRpbmdzRGVib3VuY2VUaW1lb3V0SW5NaWxsaXNlY29uZHMoKTogbnVtYmVyIHtcbiAgICBjb25zdCBERUZBVUxUID0gMjAwMDtcbiAgICByZXR1cm4gREVGQVVMVDtcbiAgfVxuXG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudDogUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnQ8UGx1Z2luU2V0dGluZ3M+O1xuICBwcml2YXRlIGN1cnJlbnRSZW5kZXJDb21wb25lbnQ6IENvbXBvbmVudEV4IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2ZVNldHRpbmdzRGVib3VuY2VkOiBEZWJvdW5jZXI8W10sIHZvaWQ+O1xuXG4gIHByaXZhdGUgZ2V0IHBsdWdpblNldHRpbmdzKCk6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3M8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXR0aW5nc1N0YXRlLmlucHV0VmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIHRhYi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbXMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VDb25zdHJ1Y3RvclBhcmFtczxQbHVnaW5TZXR0aW5ncz4pIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudDtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKHRoaXMuY29udGFpbmVyRWwsIENzc0NsYXNzLlBsdWdpblNldHRpbmdzVGFiKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlZCA9IGRlYm91bmNlKFxuICAgICAgY29udmVydEFzeW5jVG9TeW5jKCgpID0+IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQuc2F2ZVRvRmlsZShTQVZFX1RPX0ZJTEVfQ09OVEVYVCkpLFxuICAgICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgICk7XG4gICAgdGhpcy5jb21wb25lbnQgPSBuZXcgUGx1Z2luU2V0dGluZ3NUYWJFdmVudHNDb21wb25lbnQ8UGx1Z2luU2V0dGluZ3M+KHtcbiAgICAgIG9uTG9hZFNldHRpbmdzOiAobG9hZGVkU3RhdGUsIGlzSW5pdGlhbExvYWQpOiBQcm9taXNhYmxlPHZvaWQ+ID0+IHRoaXMub25Mb2FkU2V0dGluZ3MobG9hZGVkU3RhdGUsIGlzSW5pdGlhbExvYWQpLFxuICAgICAgb25TYXZlU2V0dGluZ3M6IChuZXdTdGF0ZSwgb2xkU3RhdGUsIGNvbnRleHQpOiBQcm9taXNhYmxlPHZvaWQ+ID0+IHRoaXMub25TYXZlU2V0dGluZ3MoeyBjb250ZXh0LCBuZXdTdGF0ZSwgb2xkU3RhdGUgfSksXG4gICAgICBwbHVnaW5TZXR0aW5nc0NvbXBvbmVudDogdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1zIGZvciBiaW5kaW5nIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgYmluZDxcbiAgICBVSVZhbHVlLFxuICAgIFRWYWx1ZUNvbXBvbmVudFxuICA+KFxuICAgIHBhcmFtczogUGx1Z2luU2V0dGluZ3NUYWJCYXNlQmluZFBhcmFtczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50PlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbXMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4gID4oXG4gICAgcGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kRXh0ZW5kZWRQYXJhbXM8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFRWYWx1ZUNvbXBvbmVudCwgUHJvcGVydHlOYW1lPlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbXMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XG4gID4oXG4gICAgcGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VCaW5kSW1wbFBhcmFtczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgVFZhbHVlQ29tcG9uZW50LCBQcm9wZXJ0eU5hbWU+IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2ggLS0gYmluZCBvdmVybG9hZCBzaGFyZXMgdGhlIEJpbmQqIHBhcmFtIGZhbWlseS5cbiAgKTogVFZhbHVlQ29tcG9uZW50IHtcbiAgICBjb25zdCB7XG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICB2YWx1ZUNvbXBvbmVudCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9ID0gcGFyYW1zO1xuICAgIHR5cGUgUHJvcGVydHlUeXBlID0gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXTtcbiAgICBjb25zdCBERUZBVUxUX09QVElPTlM6IFJlcXVpcmVkPEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5TmFtZT4+ID0ge1xuICAgICAgY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyOiAodmFsdWU6IFVJVmFsdWUpOiBQcm9wZXJ0eVR5cGUgPT4gdmFsdWUgYXMgUHJvcGVydHlUeXBlLFxuICAgICAgb25DaGFuZ2VkOiBub29wLFxuICAgICAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAodmFsdWU6IFJlYWRvbmx5RGVlcDxQcm9wZXJ0eVR5cGU+KTogVUlWYWx1ZSA9PiB2YWx1ZSBhcyBVSVZhbHVlLFxuICAgICAgc2hvdWxkUmVzZXRTZXR0aW5nV2hlbkNvbXBvbmVudElzRW1wdHk6IHRydWUsXG4gICAgICBzaG91bGRTaG93UGxhY2Vob2xkZXJGb3JEZWZhdWx0VmFsdWVzOiB0cnVlLFxuICAgICAgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlOiB0cnVlXG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvbnNFeHRlbnNpb246IFJlcXVpcmVkPEJpbmRPcHRpb25zRXh0ZW5kZWQ8UGx1Z2luU2V0dGluZ3MsIFVJVmFsdWUsIFByb3BlcnR5TmFtZT4+ID0geyAuLi5ERUZBVUxUX09QVElPTlMsIC4uLm9wdGlvbnMgfTtcblxuICAgIGNvbnN0IHZhbGlkYXRvckVsID0gZ2V0VmFsaWRhdG9yQ29tcG9uZW50KHZhbHVlQ29tcG9uZW50KT8udmFsaWRhdG9yRWw7XG5cbiAgICBjb25zdCB0ZXh0QmFzZWRDb21wb25lbnQgPSBnZXRUZXh0QmFzZWRDb21wb25lbnRWYWx1ZSh2YWx1ZUNvbXBvbmVudCk7XG5cbiAgICBjb25zdCByZWFkb25seVZhbHVlID0gdGhpcy5nZXRQbHVnaW5TZXR0aW5nc1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IGRlZmF1bHRDb21wb25lbnRWYWx1ZSA9IG9wdGlvbnNFeHRlbnNpb24ucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKGRlZmF1bHRWYWx1ZSBhcyBSZWFkb25seURlZXA8UHJvcGVydHlUeXBlPik7XG4gICAgdGV4dEJhc2VkQ29tcG9uZW50Py5zZXRQbGFjZWhvbGRlclZhbHVlKGRlZmF1bHRDb21wb25lbnRWYWx1ZSk7XG5cbiAgICBsZXQgdmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZztcbiAgICBsZXQgdG9vbHRpcEVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b29sdGlwQ29udGVudEVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGlmICh2YWxpZGF0b3JFbCkge1xuICAgICAgY29uc3Qgd3JhcHBlciA9IGVuc3VyZVdyYXBwZWQodmFsaWRhdG9yRWwpO1xuICAgICAgdG9vbHRpcEVsID0gd3JhcHBlci5jcmVhdGVEaXYoKTtcbiAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXModG9vbHRpcEVsLCBbQ3NzQ2xhc3MuVG9vbHRpcCwgQ3NzQ2xhc3MuVG9vbHRpcFZhbGlkYXRvcl0pO1xuICAgICAgdG9vbHRpcENvbnRlbnRFbCA9IHRvb2x0aXBFbC5jcmVhdGVTcGFuKCk7XG4gICAgICBjb25zdCB0b29sdGlwQXJyb3dFbCA9IHRvb2x0aXBFbC5jcmVhdGVEaXYoKTtcbiAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXModG9vbHRpcEFycm93RWwsIENzc0NsYXNzLlRvb2x0aXBBcnJvdyk7XG4gICAgICB0b29sdGlwRWwuaGlkZSgpO1xuICAgICAgd3JhcHBlci5hcHBlbmQodG9vbHRpcEVsKTtcbiAgICB9XG5cbiAgICByZWdpc3RlckFzeW5jRXZlbnQoXG4gICAgICB0aGlzLmdldFJlbmRlckNvbXBvbmVudCgpLFxuICAgICAgdGhpcy5vbigndmFsaWRhdGlvbk1lc3NhZ2VDaGFuZ2VkJywgKGFub3RoZXJQcm9wZXJ0eU5hbWUsIGFub3RoZXJWYWxpZGF0aW9uTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAocHJvcGVydHlOYW1lICE9PSBhbm90aGVyUHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBhbm90aGVyVmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnREZWJvdW5jZWQoKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGxldCBzaG91bGRFbXB0eU9uQmx1ciA9IGZhbHNlO1xuICAgIGxldCBzaG91bGRSZXZlcnRUb0RlZmF1bHRWYWx1ZU9uQmx1ciA9IGZhbHNlO1xuXG4gICAgaWYgKHRleHRCYXNlZENvbXBvbmVudCAmJiBvcHRpb25zRXh0ZW5zaW9uLnNob3VsZFNob3dQbGFjZWhvbGRlckZvckRlZmF1bHRWYWx1ZXMgJiYgaXNEZWVwRXF1YWwocmVhZG9ubHlWYWx1ZSwgZGVmYXVsdFZhbHVlKSkge1xuICAgICAgdGV4dEJhc2VkQ29tcG9uZW50LmVtcHR5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlQ29tcG9uZW50LnNldFZhbHVlKG9wdGlvbnNFeHRlbnNpb24ucGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyKHJlYWRvbmx5VmFsdWUpKTtcbiAgICB9XG5cbiAgICBsZXQgc2hvdWxkU2tpcE9uQ2hhbmdlID0gZmFsc2U7XG4gICAgY29uc3QgVVBEQVRFX1ZBTElEQVRPUl9FTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbiAgICBjb25zdCB1cGRhdGVWYWxpZGF0b3JFbGVtZW50RGVib3VuY2VkID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVZhbGlkYXRvckVsKCk7XG4gICAgICB9KTtcbiAgICB9LCBVUERBVEVfVkFMSURBVE9SX0VMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHZhbHVlQ29tcG9uZW50Lm9uQ2hhbmdlKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAodWlWYWx1ZSkgPT4ge1xuICAgICAgaWYgKHNob3VsZFNraXBPbkNoYW5nZSkge1xuICAgICAgICBzaG91bGRTa2lwT25DaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzaG91bGRFbXB0eU9uQmx1ciA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0UGx1Z2luU2V0dGluZ3NQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpO1xuICAgICAgbGV0IG5ld1ZhbHVlOiBQcm9wZXJ0eVR5cGUgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgc2hvdWxkU2V0UHJvcGVydHkgPSB0cnVlO1xuICAgICAgc2hvdWxkUmV2ZXJ0VG9EZWZhdWx0VmFsdWVPbkJsdXIgPSAhIXRleHRCYXNlZENvbXBvbmVudD8uaXNFbXB0eSgpICYmIG9wdGlvbnNFeHRlbnNpb24uc2hvdWxkUmVzZXRTZXR0aW5nV2hlbkNvbXBvbmVudElzRW1wdHk7XG4gICAgICBpZiAoc2hvdWxkUmV2ZXJ0VG9EZWZhdWx0VmFsdWVPbkJsdXIpIHtcbiAgICAgICAgbmV3VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRWYWx1ZSA9IG9wdGlvbnNFeHRlbnNpb24uY29tcG9uZW50VG9QbHVnaW5TZXR0aW5nc1ZhbHVlQ29udmVydGVyKHVpVmFsdWUpO1xuICAgICAgICBpZiAoaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcihjb252ZXJ0ZWRWYWx1ZSkpIHtcbiAgICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZSA9IGNvbnZlcnRlZFZhbHVlLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIHNob3VsZFNldFByb3BlcnR5ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSBjb252ZXJ0ZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkU2V0UHJvcGVydHkpIHtcbiAgICAgICAgdmFsaWRhdGlvbk1lc3NhZ2UgPSBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3VmFsdWUgYXMgUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSk7XG4gICAgICAgIGlmICh0ZXh0QmFzZWRDb21wb25lbnQgJiYgb3B0aW9uc0V4dGVuc2lvbi5zaG91bGRTaG93UGxhY2Vob2xkZXJGb3JEZWZhdWx0VmFsdWVzICYmICF0ZXh0QmFzZWRDb21wb25lbnQuaXNFbXB0eSgpICYmIGlzRGVlcEVxdWFsKG5ld1ZhbHVlLCBkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgc2hvdWxkRW1wdHlPbkJsdXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnREZWJvdW5jZWQoKTtcbiAgICAgIGlmIChzaG91bGRTZXRQcm9wZXJ0eSkge1xuICAgICAgICBhd2FpdCBvcHRpb25zRXh0ZW5zaW9uLm9uQ2hhbmdlZChuZXdWYWx1ZSBhcyBSZWFkb25seURlZXA8UHJvcGVydHlUeXBlPiwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlU2V0dGluZ3NEZWJvdW5jZWQoKTtcbiAgICB9KSk7XG5cbiAgICB2YWxpZGF0b3JFbD8uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB1cGRhdGVWYWxpZGF0b3JFbGVtZW50RGVib3VuY2VkKCk7XG4gICAgfSk7XG4gICAgdmFsaWRhdG9yRWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCAoKSA9PiB7XG4gICAgICB1cGRhdGVWYWxpZGF0b3JFbGVtZW50RGVib3VuY2VkKCk7XG4gICAgfSk7XG4gICAgdmFsaWRhdG9yRWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVZhbGlkYXRvckVsZW1lbnREZWJvdW5jZWQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2VzID0gdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zZXR0aW5nc1N0YXRlLnZhbGlkYXRpb25NZXNzYWdlcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPz8gJyc7XG4gICAgdXBkYXRlVmFsaWRhdG9yRWxlbWVudERlYm91bmNlZCgpO1xuXG4gICAgcmV0dXJuIHZhbHVlQ29tcG9uZW50O1xuXG4gICAgZnVuY3Rpb24gdXBkYXRlVmFsaWRhdG9yRWwoKTogdm9pZCB7XG4gICAgICBpZiAoIXZhbGlkYXRvckVsPy5pc0FjdGl2ZUVsZW1lbnQoKSkge1xuICAgICAgICBpZiAoc2hvdWxkRW1wdHlPbkJsdXIpIHtcbiAgICAgICAgICBzaG91bGRFbXB0eU9uQmx1ciA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKCF0ZXh0QmFzZWRDb21wb25lbnQ/LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgc2hvdWxkU2tpcE9uQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRleHRCYXNlZENvbXBvbmVudD8uZW1wdHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoc2hvdWxkUmV2ZXJ0VG9EZWZhdWx0VmFsdWVPbkJsdXIpIHtcbiAgICAgICAgICBzaG91bGRSZXZlcnRUb0RlZmF1bHRWYWx1ZU9uQmx1ciA9IGZhbHNlO1xuXG4gICAgICAgICAgaWYgKHRleHRCYXNlZENvbXBvbmVudD8uaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICBzaG91bGRTa2lwT25DaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgICAgdmFsdWVDb21wb25lbnQuc2V0VmFsdWUoZGVmYXVsdENvbXBvbmVudFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF2YWxpZGF0b3JFbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKHRvb2x0aXBDb250ZW50RWwpO1xuXG4gICAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2UgPT09ICcnKSB7XG4gICAgICAgIHZhbGlkYXRvckVsLnNldEN1c3RvbVZhbGlkaXR5KCcnKTtcbiAgICAgICAgdmFsaWRhdG9yRWwuY2hlY2tWYWxpZGl0eSgpO1xuICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZSA9IHZhbGlkYXRvckVsLnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgfVxuXG4gICAgICB2YWxpZGF0b3JFbC5zZXRDdXN0b21WYWxpZGl0eSh2YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICBpZiAob3B0aW9uc0V4dGVuc2lvbi5zaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgdG9vbHRpcENvbnRlbnRFbC50ZXh0Q29udGVudCA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICB0b29sdGlwRWw/LnRvZ2dsZSghIXZhbGlkYXRpb25NZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgc2V0VG9vbHRpcCh2YWxpZGF0b3JFbCwgdmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5TGVnYWN5KCk7XG4gIH1cblxuICAvKipcbiAgICogTGVnYWN5IHdheSB0byByZW5kZXIgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgaW1wZXJhdGl2ZWx5LlxuICAgKlxuICAgKiBUaGUgcHJlLWRlY2xhcmF0aXZlIGZhbGxiYWNrOiBPYnNpZGlhbiBvbmx5IGNhbGxzIGl0IHdoZW4ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uc30gcmV0dXJucyBhbiBlbXB0eVxuICAgKiBhcnJheSwgaS5lLiB3aGVuIHRoZSBjb25zdW1lciBoYXMgbm90IG92ZXJyaWRkZW4ge0BsaW5rIGdldFNldHRpbmdEZWZpbml0aW9uSXRlbXN9LiBTdWNoIGEgY29uc3VtZXJcbiAgICogb3ZlcnJpZGVzIHRoaXMgbWV0aG9kIGFuZCBidWlsZHMgdGhlIFVJIHdpdGgge0BsaW5rIFNldHRpbmdFeH0gYW5kIHtAbGluayBiaW5kfS5cbiAgICovXG4gIHB1YmxpYyBkaXNwbGF5TGVnYWN5KCk6IHZvaWQge1xuICAgIHRoaXMuYmVnaW5SZW5kZXJDeWNsZSgpO1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgdmFsdWUgYmFja2luZyBhIG5hdGl2ZSBgY29udHJvbGAgc2V0dGluZyBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBPYnNpZGlhbiBjYWxscyBpdCBvbiBldmVyeSByZW5kZXIgb2YgYSBgY29udHJvbGAtdHlwZSBkZWZpbml0aW9uLiBUaGUgaW5oZXJpdGVkIGltcGxlbWVudGF0aW9uIHJlYWRzXG4gICAqIGBwbHVnaW4uc2V0dGluZ3NgLCB3aGljaCBhIHBsdWdpbiBidWlsdCBvbiB7QGxpbmsgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlfSBuZXZlciBwb3B1bGF0ZXMsIHNvIGl0IGlzXG4gICAqIHJvdXRlZCB0byB0aGUgc2V0dGluZ3MgY29tcG9uZW50IGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgc2V0dGluZ3MgcHJvcGVydHkgbmFtZS5cbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0Q29udHJvbFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGx1Z2luU2V0dGluZ3NQcm9wZXJ0eShjYXN0VG88U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlY2xhcmF0aXZlIHNldHRpbmcgZGVmaW5pdGlvbnMgcmVuZGVyZWQgYnkgT2JzaWRpYW4gMS4xMysuXG4gICAqXG4gICAqIERlbGVnYXRlcyB0byB7QGxpbmsgZ2V0U2V0dGluZ0RlZmluaXRpb25JdGVtc30uIFdoZW4gYSBjb25zdW1lciBoYXMgbm90IG92ZXJyaWRkZW4gdGhhdCBob29rIGl0IHJldHVybnNcbiAgICogYW4gZW1wdHkgYXJyYXksIGFuZCBPYnNpZGlhbiBmYWxscyBiYWNrIHRvIHRoZSBpbXBlcmF0aXZlIHtAbGluayBkaXNwbGF5TGVnYWN5fSBwYXRoLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBkZWZpbml0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTZXR0aW5nRGVmaW5pdGlvbnMoKTogU2V0dGluZ0RlZmluaXRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdEZWZpbml0aW9uSXRlbXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgcGx1Z2luIHNldHRpbmdzIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBoaWRlKCk6IHZvaWQge1xuICAgIHN1cGVyLmhpZGUoKTtcbiAgICB0aGlzLnNhdmVTZXR0aW5nc0RlYm91bmNlZC5jYW5jZWwoKTtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmVuZFJlbmRlckN5Y2xlKCk7XG4gICAgdGhpcy5jb21wb25lbnQudW5sb2FkKCk7XG4gICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gdGhpcy5oaWRlQXN5bmMoKSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmMgYWN0aW9ucyB0byBwZXJmb3JtIHdoZW4gdGhlIHNldHRpbmdzIHRhYiBpcyBiZWluZyBoaWRkZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgdGFiIGlzIGhpZGRlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBoaWRlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW5TZXR0aW5nc0NvbXBvbmVudC5zYXZlVG9GaWxlKFNBVkVfVE9fRklMRV9DT05URVhUKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZW5kZXJzIHRoZSBzZXR0aW5ncyB0YWIgYWZ0ZXIgdGhlIHVuZGVybHlpbmcgc3RhdGUgY2hhbmdlZC5cbiAgICpcbiAgICogUmVidWlsZHMgdGhlIGRlZmluaXRpb25zIGFuZCByZS1yZW5kZXJzLCB3aGljaCBjb3ZlcnMgYm90aCBwYXRoczogT2JzaWRpYW4gcmVuZGVycyB0aGUgZGVjbGFyYXRpdmVcbiAgICogZGVmaW5pdGlvbnMgd2hlbiB7QGxpbmsgZ2V0U2V0dGluZ0RlZmluaXRpb25JdGVtc30gcHJvdmlkZXMgdGhlbSwgYW5kIGZhbGxzIGJhY2sgdG9cbiAgICoge0BsaW5rIGRpc3BsYXlMZWdhY3l9IHdoZW4gaXQgZG9lcyBub3QuIE5vdGhpbmcgaXMgcmVuZGVyZWQgd2hpbGUgdGhlIHRhYiBpcyBub3QgdGhlIG9uZSBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFVzZSBpdCBvbmx5IGZvciBjaGFuZ2VzIHRoYXQgYWx0ZXIgdGhlIFNUUlVDVFVSRSBvZiB0aGUgdGFiIFx1MjAxNCByb3dzIGFkZGVkIG9yIHJlbW92ZWQuIFdoZW4gb25seSBhXG4gICAqIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMuZGlzYWJsZWR9IC8ge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcy52aXNpYmxlfVxuICAgKiBwcmVkaWNhdGUgaGFzIHRvIGJlIHJlLWV2YWx1YXRlZCwgY2FsbCB0aGUgbXVjaCBjaGVhcGVyIHtAbGluayByZWZyZXNoRG9tU3RhdGV9IGluc3RlYWQsIHdoaWNoIHRvZ2dsZXMgdGhlXG4gICAqIHJlbmRlcmVkIERPTSBpbiBwbGFjZS5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogUGVyc2lzdHMgdGhlIHZhbHVlIG9mIGEgbmF0aXZlIGBjb250cm9sYCBzZXR0aW5nIGRlZmluaXRpb24uXG4gICAqXG4gICAqIFRoZSBjb3VudGVycGFydCBvZiB7QGxpbmsgZ2V0Q29udHJvbFZhbHVlfTogaXQgcm91dGVzIHRoZSB3cml0ZSB0byB0aGUgc2V0dGluZ3MgY29tcG9uZW50IGluc3RlYWQgb2YgdGhlXG4gICAqIGluaGVyaXRlZCBgcGx1Z2luLnNhdmVEYXRhYCBwYXRoLCBzbyB2YWxpZGF0aW9uLCB0cmFuc2Zvcm1lcnMgYW5kIHRoZSBkZWJvdW5jZWQgc2F2ZSBhbGwgYXBwbHkgYXMgdGhleSBkb1xuICAgKiBmb3IgYSB7QGxpbmsgYmluZH0tZWQgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHNldHRpbmdzIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBwZXJzaXN0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHZhbHVlIGlzIHNldC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBzZXRDb250cm9sVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHlwZSBQcm9wZXJ0eU5hbWUgPSBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPjtcbiAgICBhd2FpdCB0aGlzLnBsdWdpblNldHRpbmdzQ29tcG9uZW50LnNldFByb3BlcnR5KGNhc3RUbzxQcm9wZXJ0eU5hbWU+KGtleSksIGNhc3RUbzxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPih2YWx1ZSkpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzRGVib3VuY2VkKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBwdWJsaWMgc2hvdygpOiB2b2lkIHtcbiAgICB0aGlzLmFwcC5zZXR0aW5nLm9wZW5UYWIodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRlY2xhcmF0aXZlIHNldHRpbmcgZGVmaW5pdGlvbnMgZm9yIHRoZSB0YWIgKE9ic2lkaWFuIDEuMTMrKS5cbiAgICpcbiAgICogQ29uc3VtZXJzIG92ZXJyaWRlIHRoaXMsIHR5cGljYWxseSBidWlsZGluZyBlYWNoIHJvdyB3aXRoIHtAbGluayBzZXR0aW5nRXh9IGFuZCB7QGxpbmsgYmluZH0gYW5kIGdyb3VwaW5nXG4gICAqIHRoZW0gd2l0aCBgc2V0dGluZ0dyb3VwRXhgLiBSZXR1cm5pbmcgYW4gZW1wdHkgYXJyYXkgXHUyMDE0IHRoZSBkZWZhdWx0IFx1MjAxNCBtYWtlcyBPYnNpZGlhbiBmYWxsIGJhY2sgdG8gdGhlXG4gICAqIGltcGVyYXRpdmUge0BsaW5rIGRpc3BsYXlMZWdhY3l9IHBhdGguXG4gICAqXG4gICAqIE1VU1QgYmUgYSBwdXJlIGJ1aWxkZXIuIE9ic2lkaWFuIGNhbGxzIGl0IHdoZW4gdGhlIHRhYiBpcyByZWdpc3RlcmVkIChgYWRkU2V0dGluZ1RhYmApLCBsb25nIGJlZm9yZSB0aGVcbiAgICogdGFiIGlzIGV2ZXIgb3BlbmVkLCBpbiBvcmRlciB0byBpbmRleCB0aGUgc2V0dGluZ3MgZm9yIHNlYXJjaC4gQW55dGhpbmcgd2l0aCBhIHNpZGUgZWZmZWN0IGJlbG9uZ3MgaW5zaWRlXG4gICAqIGEgcm93J3Mge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcy5yZW5kZXJ9IGNhbGxiYWNrLCB3aGljaCBydW5zIG9ubHkgd2hlbiB0aGUgcm93IGlzXG4gICAqIGFjdHVhbGx5IHJlbmRlcmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBkZWZpbml0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRTZXR0aW5nRGVmaW5pdGlvbkl0ZW1zKCk6IFNldHRpbmdEZWZpbml0aW9uSXRlbVtdIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gX2xvYWRlZFN0YXRlIC0gVGhlIGxvYWRlZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9pc0luaXRpYWxMb2FkIC0gV2hldGhlciB0aGUgc2V0dGluZ3MgYXJlIGJlaW5nIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkxvYWRTZXR0aW5ncyhfbG9hZGVkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sIF9pc0luaXRpYWxMb2FkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV2YWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSByZXZhbGlkYXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZXZhbGlkYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlcyA9IGF3YWl0IHRoaXMucGx1Z2luU2V0dGluZ3NDb21wb25lbnQucmV2YWxpZGF0ZSgpO1xuICAgIGF3YWl0IHRoaXMudXBkYXRlVmFsaWRhdGlvbnModmFsaWRhdGlvbk1lc3NhZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzZWFyY2gtaW5kZXhhYmxlIGRlY2xhcmF0aXZlIHJvdyB0aGF0IGlzIHJlbmRlcmVkIGltcGVyYXRpdmVseS5cbiAgICpcbiAgICogVGhlIGJyaWRnZSBiZXR3ZWVuIHRoZSBkZWNsYXJhdGl2ZSBBUEkgYW5kIE9EVSdzIGltcGVyYXRpdmUgYnVpbGRpbmcgYmxvY2tzOiBPYnNpZGlhbiBvd25zIHRoZSByb3cgKHNvIGl0XG4gICAqIGluZGV4ZXMgaXQgZm9yIHNlYXJjaCBhbmQgZXZhbHVhdGVzIGl0cyB7QGxpbmsgUGx1Z2luU2V0dGluZ3NUYWJCYXNlU2V0dGluZ0V4UGFyYW1zLnZpc2libGV9IC9cbiAgICoge0BsaW5rIFBsdWdpblNldHRpbmdzVGFiQmFzZVNldHRpbmdFeFBhcmFtcy5kaXNhYmxlZH0gcHJlZGljYXRlcyBvbiBldmVyeVxuICAgKiB7QGxpbmsgcmVmcmVzaERvbVN0YXRlfSksIHdoaWxlIHtAbGluayBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMucmVuZGVyfSBmaWxscyBpdCBpbiB3aXRoXG4gICAqIHtAbGluayBTZXR0aW5nRXh9IGFkZGVycyBhbmQge0BsaW5rIGJpbmR9IGV4YWN0bHkgYXMgYW4gaW1wZXJhdGl2ZSB0YWIgd291bGQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcm93IHBhcmFtcy5cbiAgICogQHJldHVybnMgVGhlIHNldHRpbmcgZGVmaW5pdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBzZXR0aW5nRXgocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nRXhQYXJhbXMpOiBTZXR0aW5nRGVmaW5pdGlvblJlbmRlciB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTZXR0aW5nRGVmaW5pdGlvblJlbmRlcj4oe1xuICAgICAgYWxpYXNlczogcGFyYW1zLmFsaWFzZXMsXG4gICAgICBkZXNjOiBwYXJhbXMuZGVzYyxcbiAgICAgIGRpc2FibGVkOiBwYXJhbXMuZGlzYWJsZWQsXG4gICAgICBuYW1lOiBwYXJhbXMubmFtZSxcbiAgICAgIHJlbmRlcjogKHNldHRpbmc6IFNldHRpbmcsIGdyb3VwOiBTZXR0aW5nR3JvdXApID0+IHRoaXMucmVuZGVyU2V0dGluZ0V4KHsgZ3JvdXAsIHNldHRpbmcsIHNldHRpbmdFeFBhcmFtczogcGFyYW1zIH0pLFxuICAgICAgc2VhcmNoYWJsZTogcGFyYW1zLnNlYXJjaGFibGUsXG4gICAgICB2aXNpYmxlOiBwYXJhbXMudmlzaWJsZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGRlY2xhcmF0aXZlIGhlYWRpbmcgZ3JvdXAuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJhdGl2ZSBjb3VudGVycGFydCBvZiBgU2V0dGluZ0dyb3VwRXhgOiB3aGVyZSB0aGF0IGNsYXNzIGFwcGVuZHMgYSBncm91cCB0byBhIGNvbnRhaW5lclxuICAgKiBpbXBlcmF0aXZlbHksIHRoaXMgcmV0dXJucyB0aGUgZGVmaW5pdGlvbiBPYnNpZGlhbiByZW5kZXJzLCBzbyBhIGdyb3VwLXN0cnVjdHVyZWQgdGFiIGtlZXBzIGl0cyBzaGFwZVxuICAgKiBhZnRlciB0aGUgbWlncmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGdyb3VwIHBhcmFtcy5cbiAgICogQHJldHVybnMgVGhlIGdyb3VwIGRlZmluaXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgc2V0dGluZ0dyb3VwRXgocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkJhc2VTZXR0aW5nR3JvdXBFeFBhcmFtcyk6IFNldHRpbmdEZWZpbml0aW9uR3JvdXAge1xuICAgIHJldHVybiBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2V0dGluZ0RlZmluaXRpb25Hcm91cD4oe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgdHlwZTogJ2dyb3VwJ1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiZWdpblJlbmRlckN5Y2xlKCk6IHZvaWQge1xuICAgIHRoaXMuZW5kUmVuZGVyQ3ljbGUoKTtcbiAgICB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQgPSB0aGlzLmNyZWF0ZVJlbmRlckNvbXBvbmVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVSZW5kZXJDb21wb25lbnQoKTogQ29tcG9uZW50RXgge1xuICAgIHRoaXMuX2lzT3BlbiA9IHRydWU7XG4gICAgdGhpcy5jb21wb25lbnQubG9hZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5hZGRDaGlsZChuZXcgQ29tcG9uZW50RXgoKSk7XG4gIH1cblxuICBwcml2YXRlIGVuZFJlbmRlckN5Y2xlKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmRlckNvbXBvbmVudCA9IHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudDtcbiAgICBpZiAoIXJlbmRlckNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA9IG51bGw7XG4gICAgdGhpcy5jb21wb25lbnQucmVtb3ZlQ2hpbGQocmVuZGVyQ29tcG9uZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWVcbiAgKTogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMucGx1Z2luU2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgcmV0dXJuIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gYXMgUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZW5kZXJDb21wb25lbnQoKTogQ29tcG9uZW50RXgge1xuICAgIHRoaXMuY3VycmVudFJlbmRlckNvbXBvbmVudCA/Pz0gdGhpcy5jcmVhdGVSZW5kZXJDb21wb25lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblNhdmVTZXR0aW5ncyhwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZU9uU2F2ZVNldHRpbmdzUGFyYW1zPFBsdWdpblNldHRpbmdzPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBuZXdTdGF0ZSxcbiAgICAgIG9sZFN0YXRlOiBfb2xkU3RhdGVcbiAgICB9ID0gcGFyYW1zO1xuICAgIGlmIChjb250ZXh0ID09PSBTQVZFX1RPX0ZJTEVfQ09OVEVYVCkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVWYWxpZGF0aW9ucyhuZXdTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXMgYXMgUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW52YWxpZC12b2lkLXR5cGUgLS0gTWlycm9ycyBPYnNpZGlhbidzIGBTZXR0aW5nRGVmaW5pdGlvblJlbmRlci5yZW5kZXJgLCB3aG9zZSBjbGVhbnVwIGZ1bmN0aW9uIGlzIG9wdGlvbmFsLlxuICBwcml2YXRlIHJlbmRlclNldHRpbmdFeChwYXJhbXM6IFBsdWdpblNldHRpbmdzVGFiQmFzZVJlbmRlclNldHRpbmdFeFBhcmFtcyk6ICgoKSA9PiB2b2lkKSB8IHZvaWQge1xuICAgIGNvbnN0IHJvd0NvbXBvbmVudCA9IHRoaXMuY3JlYXRlUmVuZGVyQ29tcG9uZW50KCk7XG4gICAgY29uc3QgcHJldmlvdXNSZW5kZXJDb21wb25lbnQgPSB0aGlzLmN1cnJlbnRSZW5kZXJDb21wb25lbnQ7XG4gICAgdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50ID0gcm93Q29tcG9uZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSBwYXJhbXMuc2V0dGluZ0V4UGFyYW1zLnJlbmRlcihhZG9wdFNldHRpbmdFeChwYXJhbXMuc2V0dGluZyksIHBhcmFtcy5ncm91cCk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBvbmVudC5yZW1vdmVDaGlsZChyb3dDb21wb25lbnQpO1xuICAgICAgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jdXJyZW50UmVuZGVyQ29tcG9uZW50ID0gcHJldmlvdXNSZW5kZXJDb21wb25lbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVWYWxpZGF0aW9ucyh2YWxpZGF0aW9uTWVzc2FnZXM6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsaWRhdGlvbk1lc3NhZ2VdIG9mIE9iamVjdC5lbnRyaWVzKHZhbGlkYXRpb25NZXNzYWdlcykpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJpZ2dlckFzeW5jKCd2YWxpZGF0aW9uTWVzc2FnZUNoYW5nZWQnLCBwcm9wZXJ0eU5hbWUsIHZhbGlkYXRpb25NZXNzYWdlIGFzIHN0cmluZyk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdUJBLHNCQUlPO0FBWVAsMEJBQWlDO0FBQ2pDLG1CQUdPO0FBQ1Asc0JBR087QUFDUCwwQkFJTztBQUNQLHlCQUFrQztBQUNsQyxvQ0FBbUM7QUFDbkMsMEJBQTRCO0FBQzVCLHVCQUF5QjtBQUN6Qix1Q0FBOEI7QUFDOUIsa0NBQTJDO0FBQzNDLGlDQUFzQztBQUN0Qyx3QkFBK0I7QUFDL0Isd0JBQTBDO0FBQzFDLDRCQUFvQztBQUs3QixNQUFNLHVCQUF1QjtBQTRTcEMsTUFBTSx5Q0FBd0UsZ0NBQVk7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBMkU7QUFDNUYsVUFBTTtBQUNOLFNBQUssU0FBUztBQUFBLEVBQ2hCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFDYixVQUFNLEVBQUUsd0JBQXdCLElBQUksS0FBSztBQUN6QywwREFBbUIsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLGtCQUFrQixLQUFLLE9BQU8sZUFBZSxhQUFhLGFBQWEsQ0FBQyxDQUFDO0FBQzNKLDBEQUFtQixNQUFNLHdCQUF3QixHQUFHLGdCQUFn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
|