obsidian-dev-utils 88.8.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 +19 -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 +11 -15
- 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 +12 -15
- 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/vitest-config.mjs +2 -1
- 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/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
|
@@ -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);
|
|
@@ -170,7 +166,7 @@ var __callDispose = (stack, error, hasError) => {
|
|
|
170
166
|
};
|
|
171
167
|
var rename_delete_handler_component_exports = {};
|
|
172
168
|
__export(rename_delete_handler_component_exports, {
|
|
173
|
-
EmptyFolderBehavior: () =>
|
|
169
|
+
EmptyFolderBehavior: () => import_vault2.EmptyFolderBehavior,
|
|
174
170
|
RenameDeleteHandlerComponent: () => RenameDeleteHandlerComponent
|
|
175
171
|
});
|
|
176
172
|
module.exports = __toCommonJS(rename_delete_handler_component_exports);
|
|
@@ -184,6 +180,7 @@ var import_obsidian_dev_utils_state = require('../../obsidian-dev-utils-state.cj
|
|
|
184
180
|
var import_path = require('../../path.cjs');
|
|
185
181
|
var import_attachment_path = require('../attachment-path.cjs');
|
|
186
182
|
var import_canvas = require('../canvas.cjs');
|
|
183
|
+
var import_file_manager = require('../file-manager.cjs');
|
|
187
184
|
var import_file_system = require('../file-system.cjs');
|
|
188
185
|
var import_link = require('../link.cjs');
|
|
189
186
|
var import_metadata_cache = require('../metadata-cache.cjs');
|
|
@@ -193,6 +190,7 @@ var import_vault_delete = require('../vault-delete.cjs');
|
|
|
193
190
|
var import_vault = require('../vault.cjs');
|
|
194
191
|
var import_component_ex = require('./component-ex.cjs');
|
|
195
192
|
var import_monkey_around_component = require('./monkey-around-component.cjs');
|
|
193
|
+
var import_vault2 = require('../vault.cjs');
|
|
196
194
|
const PATCH_TOKEN = /* @__PURE__ */ Symbol.for("renameDeleteHandler");
|
|
197
195
|
class SettingsManager {
|
|
198
196
|
renameDeleteHandlersMap;
|
|
@@ -200,7 +198,7 @@ class SettingsManager {
|
|
|
200
198
|
this.renameDeleteHandlersMap = (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)("renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
|
|
201
199
|
}
|
|
202
200
|
getSettings() {
|
|
203
|
-
const settingsBuilders =
|
|
201
|
+
const settingsBuilders = [...this.renameDeleteHandlersMap.values()].reverse();
|
|
204
202
|
const settings = {};
|
|
205
203
|
settings.isNote = (path) => (0, import_file_system.isNote)(path);
|
|
206
204
|
settings.isPathIgnored = () => false;
|
|
@@ -287,7 +285,7 @@ class DeleteHandler {
|
|
|
287
285
|
await (0, import_vault.cleanupEmptyFolders)({
|
|
288
286
|
app: this.app,
|
|
289
287
|
emptyFolderBehavior: settings.emptyFolderBehavior ?? import_vault.EmptyFolderBehavior.Keep,
|
|
290
|
-
folderPaths:
|
|
288
|
+
folderPaths: [...parentFolderPaths]
|
|
291
289
|
});
|
|
292
290
|
this.abortSignal.throwIfAborted();
|
|
293
291
|
if (!settings.shouldHandleDeletions) {
|
|
@@ -331,11 +329,11 @@ class FileManagerRunAsyncLinkUpdatePatchComponent extends import_monkey_around_c
|
|
|
331
329
|
}
|
|
332
330
|
onload() {
|
|
333
331
|
this.registerMethodPatch({
|
|
332
|
+
$object: this.fileManager,
|
|
334
333
|
methodName: "runAsyncLinkUpdate",
|
|
335
|
-
obj: this.fileManager,
|
|
336
334
|
patchHandler: ({
|
|
337
335
|
fallback,
|
|
338
|
-
|
|
336
|
+
originalArguments: [linkUpdatesHandler],
|
|
339
337
|
originalMethod,
|
|
340
338
|
originalMethodBound
|
|
341
339
|
}) => {
|
|
@@ -418,12 +416,12 @@ class HandledRenames {
|
|
|
418
416
|
class MetadataDeletedHandler {
|
|
419
417
|
deletedMetadataCacheMap;
|
|
420
418
|
file;
|
|
421
|
-
|
|
419
|
+
previousCache;
|
|
422
420
|
settingsManager;
|
|
423
421
|
constructor(params) {
|
|
424
422
|
this.deletedMetadataCacheMap = params.deletedMetadataCacheMap;
|
|
425
423
|
this.file = params.file;
|
|
426
|
-
this.
|
|
424
|
+
this.previousCache = params.previousCache;
|
|
427
425
|
this.settingsManager = params.settingsManager;
|
|
428
426
|
}
|
|
429
427
|
handle() {
|
|
@@ -435,8 +433,8 @@ class MetadataDeletedHandler {
|
|
|
435
433
|
(0, import_debug.getLibDebugger)("RenameDeleteHandler:handleMetadataDeleted")(`Skipping metadata delete handler of ${this.file.path} as the path is ignored.`);
|
|
436
434
|
return;
|
|
437
435
|
}
|
|
438
|
-
if ((0, import_file_system.isMarkdownFile)(this.file) && this.
|
|
439
|
-
this.deletedMetadataCacheMap.set(this.file.path, this.
|
|
436
|
+
if ((0, import_file_system.isMarkdownFile)(this.file) && this.previousCache) {
|
|
437
|
+
this.deletedMetadataCacheMap.set(this.file.path, this.previousCache);
|
|
440
438
|
}
|
|
441
439
|
}
|
|
442
440
|
}
|
|
@@ -451,7 +449,6 @@ class RenameHandler {
|
|
|
451
449
|
oldCache;
|
|
452
450
|
oldPath;
|
|
453
451
|
oldPathBacklinksMap;
|
|
454
|
-
oldPathLinks;
|
|
455
452
|
pluginNoticeComponent;
|
|
456
453
|
resourceLockComponent;
|
|
457
454
|
settingsManager;
|
|
@@ -467,7 +464,6 @@ class RenameHandler {
|
|
|
467
464
|
this.oldCache = params.oldCache;
|
|
468
465
|
this.oldPath = params.oldPath;
|
|
469
466
|
this.oldPathBacklinksMap = params.oldPathBacklinksMap;
|
|
470
|
-
this.oldPathLinks = this.oldCache ? (0, import_metadata_cache.getLinks)({ cache: this.oldCache }) : [];
|
|
471
467
|
this.pluginNoticeComponent = params.pluginNoticeComponent;
|
|
472
468
|
this.settingsManager = params.settingsManager;
|
|
473
469
|
}
|
|
@@ -476,10 +472,14 @@ class RenameHandler {
|
|
|
476
472
|
return;
|
|
477
473
|
}
|
|
478
474
|
this.abortSignal.throwIfAborted();
|
|
479
|
-
await this.
|
|
475
|
+
await (0, import_file_manager.waitForPendingLinkUpdates)(this.app);
|
|
480
476
|
this.abortSignal.throwIfAborted();
|
|
481
|
-
await this.
|
|
477
|
+
await this.continueInterruptedRenames();
|
|
482
478
|
this.abortSignal.throwIfAborted();
|
|
479
|
+
if (this.settingsManager.getSettings().shouldHandleRenames) {
|
|
480
|
+
await this.refreshLinks();
|
|
481
|
+
this.abortSignal.throwIfAborted();
|
|
482
|
+
}
|
|
483
483
|
if (await this.handleCaseCollision()) {
|
|
484
484
|
return;
|
|
485
485
|
}
|
|
@@ -511,7 +511,8 @@ class RenameHandler {
|
|
|
511
511
|
if (attachmentOldPath === this.oldPath) {
|
|
512
512
|
continue;
|
|
513
513
|
}
|
|
514
|
-
const
|
|
514
|
+
const attachmentOldPathBacklinks = await (0, import_metadata_cache.getBacklinksForFileSafe)({ app: this.app, pathOrFile: attachmentOldPath });
|
|
515
|
+
const attachmentOldPathBacklinksMap = attachmentOldPathBacklinks.data;
|
|
515
516
|
this.abortSignal.throwIfAborted();
|
|
516
517
|
renameMap.initBacklinksMap({
|
|
517
518
|
combinedBacklinksMap,
|
|
@@ -534,15 +535,13 @@ class RenameHandler {
|
|
|
534
535
|
await (0, import_vault.cleanupEmptyFolders)({
|
|
535
536
|
app: this.app,
|
|
536
537
|
emptyFolderBehavior: settings.emptyFolderBehavior ?? import_vault.EmptyFolderBehavior.Keep,
|
|
537
|
-
folderPaths:
|
|
538
|
+
folderPaths: [...parentFolderPaths]
|
|
538
539
|
});
|
|
539
540
|
this.abortSignal.throwIfAborted();
|
|
540
541
|
if (!settings.shouldHandleRenames) {
|
|
541
542
|
return;
|
|
542
543
|
}
|
|
543
|
-
const backlinkEntries =
|
|
544
|
-
Array.from(this.interruptedCombinedBacklinksMap.entries())
|
|
545
|
-
);
|
|
544
|
+
const backlinkEntries = [...combinedBacklinksMap, ...this.interruptedCombinedBacklinksMap];
|
|
546
545
|
let processedBacklinkFiles = 0;
|
|
547
546
|
for (const [newBacklinkPath, linkJsonToPathMap] of backlinkEntries) {
|
|
548
547
|
let linkIndex = 0;
|
|
@@ -603,10 +602,10 @@ class RenameHandler {
|
|
|
603
602
|
});
|
|
604
603
|
}
|
|
605
604
|
} finally {
|
|
606
|
-
const orphanKeys =
|
|
605
|
+
const orphanKeys = [...this.handledRenames.keys()];
|
|
607
606
|
(0, import_queue.addToQueue)({
|
|
608
607
|
abortSignal: this.abortSignal,
|
|
609
|
-
|
|
608
|
+
operationFunction: () => {
|
|
610
609
|
for (const orphanKey of orphanKeys) {
|
|
611
610
|
this.handledRenames.delete(orphanKey.oldPath, orphanKey.newPath);
|
|
612
611
|
}
|
|
@@ -648,15 +647,15 @@ class RenameHandler {
|
|
|
648
647
|
if (!(0, import_implementations.getDataAdapterEx)(this.app).insensitive || this.oldPath.toLowerCase() !== this.newPath.toLowerCase()) {
|
|
649
648
|
return false;
|
|
650
649
|
}
|
|
651
|
-
const
|
|
652
|
-
await this.renameHandled(this.newPath,
|
|
650
|
+
const temporaryPath = (0, import_path.join)((0, import_path.dirname)(this.newPath), `__temp__${(0, import_path.basename)(this.newPath)}`);
|
|
651
|
+
await this.renameHandled(this.newPath, temporaryPath);
|
|
653
652
|
await new RenameHandler({
|
|
654
653
|
abortSignal: this.abortSignal,
|
|
655
654
|
app: this.app,
|
|
656
655
|
handledRenames: this.handledRenames,
|
|
657
656
|
interruptedRenamesMap: this.interruptedRenamesMap,
|
|
658
657
|
linkUpdateProgressReporter: this.linkUpdateProgressReporter,
|
|
659
|
-
newPath:
|
|
658
|
+
newPath: temporaryPath,
|
|
660
659
|
oldCache: this.oldCache,
|
|
661
660
|
oldPath: this.oldPath,
|
|
662
661
|
oldPathBacklinksMap: this.oldPathBacklinksMap,
|
|
@@ -664,32 +663,25 @@ class RenameHandler {
|
|
|
664
663
|
resourceLockComponent: this.resourceLockComponent,
|
|
665
664
|
settingsManager: this.settingsManager
|
|
666
665
|
}).handle();
|
|
667
|
-
await this.app.fileManager.renameFile((0, import_file_system.getFile)({ app: this.app, pathOrFile:
|
|
666
|
+
await this.app.fileManager.renameFile((0, import_file_system.getFile)({ app: this.app, pathOrFile: temporaryPath }), this.newPath);
|
|
668
667
|
return true;
|
|
669
668
|
}
|
|
670
669
|
async refreshLinks() {
|
|
671
|
-
const cache = this.app.metadataCache.getCache(this.oldPath) ?? this.app.metadataCache.getCache(this.newPath);
|
|
672
|
-
const oldPathLinksRefreshed = cache ? (0, import_metadata_cache.getLinks)({ cache }) : [];
|
|
673
670
|
const fakeOldFile = (0, import_file_system.getFile)({ app: this.app, pathOrFile: this.oldPath, shouldIncludeNonExisting: true });
|
|
674
671
|
let oldPathBacklinksMapRefreshed;
|
|
675
672
|
{
|
|
676
673
|
var _stack = [];
|
|
677
674
|
try {
|
|
678
675
|
const _registration = __using(_stack, (0, import_metadata_cache.registerFiles)(this.app, [fakeOldFile]));
|
|
679
|
-
|
|
676
|
+
const fakeOldFileBacklinks = await (0, import_metadata_cache.getBacklinksForFileSafe)({ app: this.app, pathOrFile: fakeOldFile });
|
|
677
|
+
oldPathBacklinksMapRefreshed = fakeOldFileBacklinks.data;
|
|
680
678
|
} catch (_) {
|
|
681
679
|
var _error = _, _hasError = true;
|
|
682
680
|
} finally {
|
|
683
681
|
__callDispose(_stack, _error, _hasError);
|
|
684
682
|
}
|
|
685
683
|
}
|
|
686
|
-
for (const
|
|
687
|
-
if (this.oldPathLinks.includes(link)) {
|
|
688
|
-
continue;
|
|
689
|
-
}
|
|
690
|
-
this.oldPathLinks.push(link);
|
|
691
|
-
}
|
|
692
|
-
for (const [backlinkPath, refreshedLinks] of oldPathBacklinksMapRefreshed.entries()) {
|
|
684
|
+
for (const [backlinkPath, refreshedLinks] of oldPathBacklinksMapRefreshed) {
|
|
693
685
|
let oldLinks = this.oldPathBacklinksMap.get(backlinkPath);
|
|
694
686
|
if (!oldLinks) {
|
|
695
687
|
oldLinks = [];
|
|
@@ -823,10 +815,10 @@ class RenameMap {
|
|
|
823
815
|
this.abortSignal.throwIfAborted();
|
|
824
816
|
}
|
|
825
817
|
} else {
|
|
826
|
-
const
|
|
827
|
-
const
|
|
828
|
-
const baseName = (0, import_path.basename)(newAttachmentFilePath,
|
|
829
|
-
newAttachmentFilePath = this.app.vault.getAvailablePath((0, import_path.join)(
|
|
818
|
+
const directory = (0, import_path.dirname)(newAttachmentFilePath);
|
|
819
|
+
const extension = (0, import_path.extname)(newAttachmentFilePath);
|
|
820
|
+
const baseName = (0, import_path.basename)(newAttachmentFilePath, extension);
|
|
821
|
+
newAttachmentFilePath = this.app.vault.getAvailablePath((0, import_path.join)(directory, baseName), extension.slice(1));
|
|
830
822
|
}
|
|
831
823
|
this.map.set(oldAttachmentFile.path, newAttachmentFilePath);
|
|
832
824
|
}
|
|
@@ -840,7 +832,7 @@ class RenameMap {
|
|
|
840
832
|
path,
|
|
841
833
|
singleBacklinksMap
|
|
842
834
|
} = params;
|
|
843
|
-
for (const [backlinkPath, links] of singleBacklinksMap
|
|
835
|
+
for (const [backlinkPath, links] of singleBacklinksMap) {
|
|
844
836
|
const newBacklinkPath = this.map.get(backlinkPath) ?? backlinkPath;
|
|
845
837
|
const linkJsonToPathMap = combinedBacklinksMap.get(newBacklinkPath) ?? /* @__PURE__ */ new Map();
|
|
846
838
|
combinedBacklinksMap.set(newBacklinkPath, linkJsonToPathMap);
|
|
@@ -855,8 +847,7 @@ class RenameMap {
|
|
|
855
847
|
if (!oldAttachmentFile) {
|
|
856
848
|
continue;
|
|
857
849
|
}
|
|
858
|
-
const backlinksMap = /* @__PURE__ */ new Map();
|
|
859
|
-
backlinksMap.set(this.newPath, [oldPathLink]);
|
|
850
|
+
const backlinksMap = /* @__PURE__ */ new Map([[this.newPath, [oldPathLink]]]);
|
|
860
851
|
this.initBacklinksMap({
|
|
861
852
|
combinedBacklinksMap,
|
|
862
853
|
path: oldAttachmentFile.path,
|
|
@@ -967,7 +958,7 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
967
958
|
return;
|
|
968
959
|
}
|
|
969
960
|
(0, import_queue.addToQueue)({
|
|
970
|
-
|
|
961
|
+
operationFunction: (abortSignal) => new DeleteHandler({
|
|
971
962
|
abortSignal,
|
|
972
963
|
app: this.app,
|
|
973
964
|
deletedMetadataCacheMap: this.deletedMetadataCacheMap,
|
|
@@ -977,14 +968,14 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
977
968
|
operationName: (0, import_i18next.t)(($) => $.obsidianDevUtils.renameDeleteHandler.handleDelete, { filePath: file.path })
|
|
978
969
|
});
|
|
979
970
|
}
|
|
980
|
-
handleMetadataDeleted(file,
|
|
971
|
+
handleMetadataDeleted(file, previousCache) {
|
|
981
972
|
if (!this.shouldInvokeHandler()) {
|
|
982
973
|
return;
|
|
983
974
|
}
|
|
984
975
|
new MetadataDeletedHandler({
|
|
985
976
|
deletedMetadataCacheMap: this.deletedMetadataCacheMap,
|
|
986
977
|
file,
|
|
987
|
-
|
|
978
|
+
previousCache,
|
|
988
979
|
settingsManager: this.settingsManager
|
|
989
980
|
}).handle();
|
|
990
981
|
}
|
|
@@ -1011,6 +1002,12 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
1011
1002
|
if (!settings.shouldHandleRenames && !settings.shouldRenameAttachmentFolder && !settings.shouldRenameAttachmentFiles) {
|
|
1012
1003
|
return;
|
|
1013
1004
|
}
|
|
1005
|
+
if (this.isNoOpRename(settings, oldPath, newPath)) {
|
|
1006
|
+
(0, import_debug.getLibDebugger)("RenameDeleteHandler:handleRename")(
|
|
1007
|
+
`Skipping rename handler of ${oldPath} -> ${newPath} as it is not a note and there is nothing to do with link updates disabled.`
|
|
1008
|
+
);
|
|
1009
|
+
return;
|
|
1010
|
+
}
|
|
1014
1011
|
if (settings.isPathIgnored?.(oldPath)) {
|
|
1015
1012
|
(0, import_debug.getLibDebugger)("RenameDeleteHandler:handleRename")(`Skipping rename handler of old path ${oldPath} as the path is ignored.`);
|
|
1016
1013
|
return;
|
|
@@ -1023,7 +1020,7 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
1023
1020
|
const oldPathBacklinksMap = (0, import_metadata_cache.getBacklinksForFileOrPath)(this.app, oldPath).data;
|
|
1024
1021
|
(0, import_queue.addToQueue)({
|
|
1025
1022
|
abortSignal: this.abortSignalComponent.abortSignal,
|
|
1026
|
-
|
|
1023
|
+
operationFunction: (abortSignal) => new RenameHandler({
|
|
1027
1024
|
abortSignal,
|
|
1028
1025
|
app: this.app,
|
|
1029
1026
|
handledRenames: this.handledRenames,
|
|
@@ -1040,15 +1037,28 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
1040
1037
|
operationName: (0, import_i18next.t)(($) => $.obsidianDevUtils.renameDeleteHandler.handleRename, { newPath, oldPath })
|
|
1041
1038
|
});
|
|
1042
1039
|
}
|
|
1040
|
+
/**
|
|
1041
|
+
* With link rewriting off, the handler's only remaining jobs are moving a NOTE's attachments and pruning
|
|
1042
|
+
* the folder a moved file vacated. A non-note rename needs neither when empty folders are kept, so there
|
|
1043
|
+
* is nothing to queue.
|
|
1044
|
+
*
|
|
1045
|
+
* @param settings - The aggregated rename/delete handler settings.
|
|
1046
|
+
* @param oldPath - The path the file was renamed from.
|
|
1047
|
+
* @param newPath - The path the file was renamed to.
|
|
1048
|
+
* @returns `true` when the handler would do no work for this rename.
|
|
1049
|
+
*/
|
|
1050
|
+
isNoOpRename(settings, oldPath, newPath) {
|
|
1051
|
+
return !settings.shouldHandleRenames && !(settings.isNote?.(oldPath) ?? false) && !(settings.isNote?.(newPath) ?? false) && (settings.emptyFolderBehavior ?? import_vault.EmptyFolderBehavior.Keep) === import_vault.EmptyFolderBehavior.Keep;
|
|
1052
|
+
}
|
|
1043
1053
|
logRegisteredHandlers() {
|
|
1044
1054
|
const renameDeleteHandlersMap = this.settingsManager.renameDeleteHandlersMap;
|
|
1045
1055
|
(0, import_debug.getLibDebugger)("RenameDeleteHandler:logRegisteredHandlers")(
|
|
1046
|
-
`Plugins with registered rename/delete handlers: ${JSON.stringify(
|
|
1056
|
+
`Plugins with registered rename/delete handlers: ${JSON.stringify([...renameDeleteHandlersMap.keys()])}`
|
|
1047
1057
|
);
|
|
1048
1058
|
}
|
|
1049
1059
|
shouldInvokeHandler() {
|
|
1050
1060
|
const renameDeleteHandlersMap = this.settingsManager.renameDeleteHandlersMap;
|
|
1051
|
-
const mainPluginId =
|
|
1061
|
+
const mainPluginId = [...renameDeleteHandlersMap.keys()][0];
|
|
1052
1062
|
return mainPluginId === this.pluginId;
|
|
1053
1063
|
}
|
|
1054
1064
|
}
|
|
@@ -1057,4 +1067,4 @@ class RenameDeleteHandlerComponent extends import_component_ex.ComponentEx {
|
|
|
1057
1067
|
EmptyFolderBehavior,
|
|
1058
1068
|
RenameDeleteHandlerComponent
|
|
1059
1069
|
});
|
|
1060
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgeyBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4uL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgVXBkYXRlTGlua1BhcmFtcyxcbiAgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4vYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vLi4vYXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi8uLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQge1xuICBDQU5WQVNfRklMRV9FWFRFTlNJT04sXG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZWRpdExpbmtzLFxuICBleHRyYWN0TGlua0ZpbGUsXG4gIHVwZGF0ZUxpbmssXG4gIHVwZGF0ZUxpbmtzSW5GaWxlXG59IGZyb20gJy4uL2xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZU9yUGF0aCxcbiAgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUsXG4gIGdldExpbmtzLFxuICByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSxcbiAgcmVnaXN0ZXJGaWxlc1xufSBmcm9tICcuLi9tZXRhZGF0YS1jYWNoZS50cyc7XG5pbXBvcnQgeyBhZGRUb1F1ZXVlIH0gZnJvbSAnLi4vcXVldWUudHMnO1xuaW1wb3J0IHsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yIH0gZnJvbSAnLi4vcmVzb3VyY2UtbG9jay50cyc7XG5pbXBvcnQgeyBkZWxldGVJZk5vdFVzZWQgfSBmcm9tICcuLi92YXVsdC1kZWxldGUudHMnO1xuaW1wb3J0IHtcbiAgY2xlYW51cEVtcHR5Rm9sZGVycyxcbiAgRW1wdHlGb2xkZXJCZWhhdmlvcixcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmUsXG4gIHRyYXNoU2FmZVxufSBmcm9tICcuLi92YXVsdC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7XG4gIGhhc1BhdGNoVG9rZW4sXG4gIE1vbmtleUFyb3VuZENvbXBvbmVudFxufSBmcm9tICcuL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcblxuZXhwb3J0IHsgRW1wdHlGb2xkZXJCZWhhdmlvciB9O1xuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICBpc05vdGUocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZWRSZW5hbWVLZXkge1xuICBuZXdQYXRoOiBzdHJpbmc7XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVycnVwdGVkUmVuYW1lIHtcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbWJpbmVkIGJhY2tsaW5rcyBtYXAsIGtleWVkIGJ5IG5ldyBiYWNrbGluayBwYXRoLCBhY2N1bXVsYXRpbmcgbGluay1KU09OIHRvIHNvdXJjZS1wYXRoIG1hcHBpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aG9zZSBiYWNrbGlua3MgYXJlIGJlaW5nIHJlY29yZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFja2xpbmtzIG1hcCBmb3IgYSBzaW5nbGUgZmlsZSwga2V5ZWQgYnkgYmFja2xpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHNpbmdsZUJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xufVxuXG5jb25zdCBQQVRDSF9UT0tFTiA9IFN5bWJvbC5mb3IoJ3JlbmFtZURlbGV0ZUhhbmRsZXInKTtcblxuaW50ZXJmYWNlIERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbENvbXBvbmVudDogQWJvcnRTaWduYWxDb21wb25lbnQ7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuICBzZXR0aW5nc0J1aWxkZXIodGhpczogdm9pZCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcbn1cblxuY2xhc3MgU2V0dGluZ3NNYW5hZ2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwOiBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVEZWxldGVIYW5kbGVyc01hcCcsIG5ldyBNYXA8c3RyaW5nLCAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4+KCkpLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldFNldHRpbmdzKCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gICAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20odGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzTm90ZShwYXRoKTtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IHNldHRpbmdzQnVpbGRlciBvZiBzZXR0aW5nc0J1aWxkZXJzKSB7XG4gICAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cyA/PyBmYWxzZTtcbiAgICAgIGlmIChuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yKSB7XG4gICAgICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IG5ld1NldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3I7XG4gICAgICB9XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcyA/PyBmYWxzZTtcbiAgICAgIHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgfHw9IG5ld1NldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICAgIGNvbnN0IGlzUGF0aElnbm9yZWQgPSBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkO1xuICAgICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGlzUGF0aElnbm9yZWQocGF0aCkgfHwgKG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZSk7XG4gICAgICBjb25zdCBjdXJyZW50SXNOb3RlID0gc2V0dGluZ3MuaXNOb3RlO1xuICAgICAgc2V0dGluZ3MuaXNOb3RlID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gY3VycmVudElzTm90ZShwYXRoKSAmJiAobmV3U2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/Pz0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBpc05vdGVFeChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoKTtcbiAgICByZXR1cm4gc2V0dGluZ3MuaXNOb3RlPy4ocGF0aCkgPz8gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgRGVsZXRlSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZTogVEFic3RyYWN0RmlsZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBEZWxldGVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBIYW5kbGUgRGVsZXRlICR7dGhpcy5maWxlLnBhdGh9YCk7XG4gICAgaWYgKCFpc05vdGUodGhpcy5maWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyh0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKFxuICAgICAgICBgU2tpcHBpbmcgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIGZpbGUgc3RpbGwgZXhpc3RzIG9uIGRpc2sgKGluZGV4LW9ubHkgcmVtb3ZhbCwgbm90IGEgcmVhbCBkZWxldGlvbikuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKHRoaXMuZmlsZS5wYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlRGVsZXRlJykoYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oW2Rpcm5hbWUodGhpcy5maWxlLnBhdGgpXSk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKHRoaXMuZmlsZS5wYXRoKTtcbiAgICAgIGlmIChjYWNoZSkge1xuICAgICAgICBjb25zdCBsaW5rcyA9IGdldExpbmtzKHsgY2FjaGUgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aCB9KTtcbiAgICAgICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgoYXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChhdHRhY2htZW50RmlsZS5wYXJlbnQ/LnBhdGggPz8gJycpO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZUlmTm90VXNlZCh7XG4gICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgZGVsZXRlZE5vdGVQYXRoOiB0aGlzLmZpbGUucGF0aCxcbiAgICAgICAgICAgIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgICAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yICE9PSBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJlbnRGb2xkZXJQYXRocy5kZWxldGUoJycpO1xuICAgIGF3YWl0IGNsZWFudXBFbXB0eUZvbGRlcnMoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgZm9sZGVyUGF0aHM6IEFycmF5LmZyb20ocGFyZW50Rm9sZGVyUGF0aHMpXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aFxuICAgIH0pO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5maWxlLnBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZvbGRlcixcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG59XG5cbmNsYXNzIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgIG1ldGhvZE5hbWU6ICdydW5Bc3luY0xpbmtVcGRhdGUnLFxuICAgICAgb2JqOiB0aGlzLmZpbGVNYW5hZ2VyLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmdzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZEJvdW5kKG5ld0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgbGV0IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICogQSByZW5hbWUgcGVyZm9ybWVkIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBBZHZhbmNlZCBOb3RlIENvbXBvc2VyJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oJ2JhY2tsaW5rLWNhY2hlJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEhhbmRsZWRSZW5hbWVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlZFJlbmFtZUtleT4oKTtcblxuICBwdWJsaWMgYWRkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCksIHsgbmV3UGF0aCwgb2xkUGF0aCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5kZWxldGUodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhcyh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SGFuZGxlZFJlbmFtZUtleT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9TdHJpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbiAgfVxufVxuXG5jbGFzcyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldkNhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogTWV0YWRhdGFEZWxldGVkSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IHBhcmFtcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcDtcbiAgICB0aGlzLmZpbGUgPSBwYXJhbXMuZmlsZTtcbiAgICB0aGlzLnByZXZDYWNoZSA9IHBhcmFtcy5wcmV2Q2FjaGU7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZDYWNoZSkge1xuICAgICAgdGhpcy5kZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQodGhpcy5maWxlLnBhdGgsIHRoaXMucHJldkNhY2hlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgUmVuYW1lSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZWRSZW5hbWVzOiBIYW5kbGVkUmVuYW1lcztcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMub2xkUGF0aExpbmtzID0gdGhpcy5vbGRDYWNoZSA/IGdldExpbmtzKHsgY2FjaGU6IHRoaXMub2xkQ2FjaGUgfSkgOiBbXTtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5vbGRQYXRoID09PSB0aGlzLm5ld1BhdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGF3YWl0IHRoaXMuY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuaGFuZGxlQ2FzZUNvbGxpc2lvbigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgY29uc3QgcGx1Z2luTm90aWNlQ29tcG9uZW50ID0gdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgICBjb25zdCByZW5hbWVkRmlsZVBhdGhzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkRmlsZVBhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuICAgIGNvbnN0IHJlbmFtZWRMaW5rcyA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lZExpbmtQYXRocycsIG5ldyBTZXQ8c3RyaW5nPigpKS52YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgUmVuYW1lTWFwKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIG5ld1BhdGg6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBhd2FpdCByZW5hbWVNYXAuZmlsbCgpO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICAgIGNvbnN0IGNvbWJpbmVkQmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KCk7XG5cbiAgICAgIC8vIEJhY2tsaW5rcyBhcmUgb25seSBjb25zdW1lZCBieSB0aGUgbGluay1yZXdyaXRlIHN0ZXBzIGJlbG93LCB3aGljaCBhcmUgZ2F0ZWQgb25cbiAgICAgIC8vIGBzaG91bGRIYW5kbGVSZW5hbWVzYC4gU2tpcCBnYXRoZXJpbmcgdGhlbSAoYSBiYWNrbGluayBmZXRjaCBwZXIgYXR0YWNobWVudCkgb24gYSBtb3ZlLW9ubHkgcmVuYW1lLlxuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRPcmlnaW5hbExpbmtzTWFwKGNvbWJpbmVkQmFja2xpbmtzTWFwKTtcbiAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgICAgICBpZiAoYXR0YWNobWVudE9sZFBhdGggPT09IHRoaXMub2xkUGF0aCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudE9sZFBhdGggfSkpLmRhdGE7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgICAgcGF0aDogYXR0YWNobWVudE9sZFBhdGgsXG4gICAgICAgICAgICBzaW5nbGVCYWNrbGlua3NNYXA6IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyZW50Rm9sZGVyUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgICAgZm9yIChjb25zdCBbb2xkQXR0YWNobWVudFBhdGgsIG5ld0F0dGFjaG1lbnRQYXRoXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChvbGRBdHRhY2htZW50UGF0aCAhPT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHRoaXMucmVuYW1lSGFuZGxlZChvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICByZW5hbWVNYXAuc2V0KG9sZEF0dGFjaG1lbnRQYXRoLCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KG9sZEF0dGFjaG1lbnRQYXRoKSkge1xuICAgICAgICAgIHBhcmVudEZvbGRlclBhdGhzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY2xlYW51cEVtcHR5Rm9sZGVycyh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGVtcHR5Rm9sZGVyQmVoYXZpb3I6IHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwLFxuICAgICAgICBmb2xkZXJQYXRoczogQXJyYXkuZnJvbShwYXJlbnRGb2xkZXJQYXRocylcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgICAvKlxuICAgICAgICogVGhlIGF0dGFjaG1lbnQgbW92ZSBhYm92ZSBydW5zIHJlZ2FyZGxlc3Mgb2YgYHNob3VsZEhhbmRsZVJlbmFtZXNgICh0aGF0IGlzIHRoZSBwb2ludCBvZiBkZWNvdXBsaW5nXG4gICAgICAgKiBcIk1vdmUgYXR0YWNobWVudHMgd2l0aCBub3RlXCIgZnJvbSBcIlVwZGF0ZSBsaW5rc1wiKS4gVGhlIHJlbWFpbmluZyBzdGVwcyBvbmx5IHJld3JpdGUgbGlua3MsIHNvIHNraXBcbiAgICAgICAqIHRoZW0gd2hlbiBsaW5rIHVwZGF0ZXMgYXJlIGRpc2FibGVkOyB0aGUgYGZpbmFsbHlgIGJsb2NrIGJlbG93IHN0aWxsIHJ1bnMuXG4gICAgICAgKi9cbiAgICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhY2tsaW5rRW50cmllcyA9IEFycmF5LmZyb20oY29tYmluZWRCYWNrbGlua3NNYXAuZW50cmllcygpKS5jb25jYXQoXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5pbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwLmVudHJpZXMoKSlcbiAgICAgICk7XG4gICAgICBsZXQgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwXSBvZiBiYWNrbGlua0VudHJpZXMpIHtcbiAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgICAgICAgbGlua0luZGV4Kys7XG4gICAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50UGF0aCA9IGxpbmtKc29uVG9QYXRoTWFwLmdldCh0b0pzb24obGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgICByZW5hbWVkTGlua3MuYWRkKGAke25ld0JhY2tsaW5rUGF0aH0vLyR7U3RyaW5nKGxpbmtJbmRleCl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgIGxpbmssXG4gICAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcysrO1xuICAgICAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPy4oe1xuICAgICAgICAgIGN1cnJlbnRQYXRoOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgcHJvY2Vzc2VkOiBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzLFxuICAgICAgICAgIHRvdGFsOiBiYWNrbGlua0VudHJpZXMubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gQXJyYXkuZnJvbSh0aGlzLmhhbmRsZWRSZW5hbWVzLmtleXMoKSk7XG4gICAgICBhZGRUb1F1ZXVlKHtcbiAgICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWwsXG4gICAgICAgIG9wZXJhdGlvbkZuOiAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBvcnBoYW5LZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob3JwaGFuS2V5Lm9sZFBhdGgsIG9ycGhhbktleS5uZXdQYXRoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVuYW1lZExpbmtzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIudXBkYXRlZExpbmtzLCB7IGZpbGVzQ291bnQ6IHJlbmFtZWRGaWxlUGF0aHMuc2l6ZSwgbGlua3NDb3VudDogcmVuYW1lZExpbmtzLnNpemUgfSkpO1xuICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuY2xlYXIoKTtcbiAgICAgICAgICByZW5hbWVkTGlua3MuY2xlYXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlT3JwaGFuZWRSZW5hbWVzKVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb250aW51ZUludGVycnVwdGVkUmVuYW1lcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXMgPSB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5nZXQodGhpcy5vbGRQYXRoKTtcbiAgICBpZiAoaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcC5kZWxldGUodGhpcy5vbGRQYXRoKTtcbiAgICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgIGF3YWl0IG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IGludGVycnVwdGVkUmVuYW1lLmNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICAgIG9sZENhY2hlOiB0aGlzLm9sZENhY2hlLFxuICAgICAgICAgIG9sZFBhdGg6IGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsXG4gICAgICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ2FzZUNvbGxpc2lvbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWdldERhdGFBZGFwdGVyRXgodGhpcy5hcHApLmluc2Vuc2l0aXZlIHx8IHRoaXMub2xkUGF0aC50b0xvd2VyQ2FzZSgpICE9PSB0aGlzLm5ld1BhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBQYXRoID0gam9pbihkaXJuYW1lKHRoaXMubmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUodGhpcy5uZXdQYXRoKX1gKTtcbiAgICBhd2FpdCB0aGlzLnJlbmFtZUhhbmRsZWQodGhpcy5uZXdQYXRoLCB0ZW1wUGF0aCk7XG5cbiAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgIG5ld1BhdGg6IHRlbXBQYXRoLFxuICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICBvbGRQYXRoOiB0aGlzLm9sZFBhdGgsXG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcblxuICAgIGF3YWl0IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLnJlbmFtZUZpbGUoZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRlbXBQYXRoIH0pLCB0aGlzLm5ld1BhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoTGlua3MoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKHRoaXMub2xkUGF0aCkgPz8gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZSh0aGlzLm5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhMaW5rc1JlZnJlc2hlZCA9IGNhY2hlID8gZ2V0TGlua3MoeyBjYWNoZSB9KSA6IFtdO1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gICAge1xuICAgICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtmYWtlT2xkRmlsZV0pO1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IChhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGZha2VPbGRGaWxlIH0pKS5kYXRhO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGluayBvZiBvbGRQYXRoTGlua3NSZWZyZXNoZWQpIHtcbiAgICAgIGlmICh0aGlzLm9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGxldCBvbGRMaW5rcyA9IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcC5nZXQoYmFja2xpbmtQYXRoKTtcbiAgICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgICAgb2xkTGlua3MgPSBbXTtcbiAgICAgICAgdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIHJlZnJlc2hlZExpbmtzKSB7XG4gICAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZW5hbWVIYW5kbGVkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBuZXdQYXRoID0gZ2V0U2FmZVJlbmFtZVBhdGgoeyBhcHA6IHRoaXMuYXBwLCBuZXdQYXRoLCBvbGRQYXRoT3JBYnN0cmFjdEZpbGU6IG9sZFBhdGggfSk7XG4gICAgaWYgKG9sZFBhdGggPT09IG5ld1BhdGgpIHtcbiAgICAgIHJldHVybiBuZXdQYXRoO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmFkZChvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZSh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICByZXR1cm4gbmV3UGF0aDtcbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVNYXAge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZU1hcENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbCA9IHBhcmFtcy5hYm9ydFNpZ25hbDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMub2xkQ2FjaGUgPSBwYXJhbXMub2xkQ2FjaGU7XG4gICAgdGhpcy5vbGRQYXRoID0gcGFyYW1zLm9sZFBhdGg7XG4gICAgdGhpcy5uZXdQYXRoID0gcGFyYW1zLm5ld1BhdGg7XG4gICAgdGhpcy5vbGRQYXRoTGlua3MgPSB0aGlzLm9sZENhY2hlID8gZ2V0TGlua3MoeyBjYWNoZTogdGhpcy5vbGRDYWNoZSB9KSA6IFtdO1xuICB9XG5cbiAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBzdHJpbmddPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmVudHJpZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB0aGlzLm1hcC5zZXQodGhpcy5vbGRQYXRoLCB0aGlzLm5ld1BhdGgpO1xuXG4gICAgaWYgKCFpc05vdGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ic2lkaWFuIGRvZXMgbm90IGluZGV4IGEgY2FudmFzIGZpbGUgaW50byB0aGUgbWV0YWRhdGEgY2FjaGUuXG4gICAgLy8gVGhlIGNhY2hlLWRlcml2ZWQgYG9sZFBhdGhMaW5rc2AgaXMgZW1wdHkgZm9yIGEgY2FudmFzLCBoaWRpbmcgaXRzIGVtYmVkZGVkIGF0dGFjaG1lbnRzLlxuICAgIC8vIFJlYWRpbmcgdGhlIGNhbnZhcyByZWZlcmVuY2VzIGRpcmVjdGx5IG1vdmVzIHRoZW0gd2l0aCB0aGUgY2FudmFzIChtaXJyb3Jpbmcgbm90ZSBiZWhhdmlvcikuXG4gICAgLy8gVGhlIGZpbGUgYWxyZWFkeSBsaXZlcyBhdCB0aGUgbmV3IHBhdGggYWZ0ZXIgdGhlIHJlbmFtZSwgc28gcmVhZCB0aGUgcmVmZXJlbmNlcyBmcm9tIHRoZXJlLlxuICAgIGlmIChpc0NhbnZhc0ZpbGUodGhpcy5vbGRQYXRoKSkge1xuICAgICAgY29uc3QgY2FudmFzUmVmZXJlbmNlcyA9IGF3YWl0IGdldENhbnZhc1JlZmVyZW5jZXModGhpcy5hcHAsIHRoaXMubmV3UGF0aCk7XG4gICAgICB0aGlzLm9sZFBhdGhMaW5rcy5wdXNoKC4uLmNhbnZhc1JlZmVyZW5jZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgIGNvbnN0IG9sZEZpbGUgPSBnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCB0aGlzLmdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGUpO1xuXG4gICAgY29uc3QgbmV3QXR0YWNobWVudEZvbGRlclBhdGggPSBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyXG4gICAgICA/IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGhcbiAgICAgIH0pXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoO1xuXG4gICAgY29uc3QgaXNPbGRBdHRhY2htZW50Rm9sZGVyQXRSb290ID0gb2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09ICcvJztcblxuICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFvbGRBdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGVzOiBURmlsZVtdID0gW107XG5cbiAgICBpZiAoXG4gICAgICBhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgIHBhdGg6IHRoaXMub2xkUGF0aFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIFZhdWx0LnJlY3Vyc2VDaGlsZHJlbihvbGRBdHRhY2htZW50Rm9sZGVyLCAob2xkQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2YgdGhpcy5vbGRQYXRoTGlua3MpIHtcbiAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgfHwgb2xkQXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlIH0pO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0gbmV3IFNldDxzdHJpbmc+KG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpKTtcbiAgICAgICAgICBrZXlzLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMubmV3UGF0aCk7XG4gICAgICAgICAgaWYgKGtleXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAodGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudEZpbGUucGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdBdHRhY2htZW50RmlsZVBhdGg6IHN0cmluZztcbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgICAgbmV3QXR0YWNobWVudEZpbGVQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRGaWxlLFxuICAgICAgICAgIG9sZE5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsXG4gICAgICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPyBvbGRBdHRhY2htZW50RmlsZS5wYXRoIDogcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgICAgICBjb25zdCBuZXdGb2xkZXIgPSBqb2luKG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoLCBkaXJuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBqb2luKG5ld0ZvbGRlciwgb2xkQXR0YWNobWVudEZpbGUubmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdBdHRhY2htZW50RmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50RmlsZSA9IGdldEZpbGVPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiBuZXdBdHRhY2htZW50RmlsZVBhdGggfSk7XG4gICAgICAgIGlmIChuZXdBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmZpbGxSZW5hbWVNYXAnKShgUmVtb3ZpbmcgY29uZmxpY3RpbmcgYXR0YWNobWVudCAke25ld0F0dGFjaG1lbnRGaWxlLnBhdGh9LmApO1xuICAgICAgICAgIGF3YWl0IHRyYXNoU2FmZSh0aGlzLmFwcCwgbmV3QXR0YWNobWVudEZpbGUpO1xuICAgICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSBleHRuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGJhc2VOYW1lID0gYmFzZW5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoLCBleHQpO1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSB0aGlzLmFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4oZGlyLCBiYXNlTmFtZSksIGV4dC5zbGljZSgxKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KG9sZFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmdldChvbGRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0QmFja2xpbmtzTWFwKHBhcmFtczogUmVuYW1lTWFwSW5pdEJhY2tsaW5rc01hcFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLFxuICAgICAgcGF0aCxcbiAgICAgIHNpbmdsZUJhY2tsaW5rc01hcFxuICAgIH0gPSBwYXJhbXM7XG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2Ygc2luZ2xlQmFja2xpbmtzTWFwLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gdGhpcy5tYXAuZ2V0KGJhY2tsaW5rUGF0aCkgPz8gYmFja2xpbmtQYXRoO1xuICAgICAgY29uc3QgbGlua0pzb25Ub1BhdGhNYXAgPSBjb21iaW5lZEJhY2tsaW5rc01hcC5nZXQobmV3QmFja2xpbmtQYXRoKSA/PyBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAuc2V0KG5ld0JhY2tsaW5rUGF0aCwgbGlua0pzb25Ub1BhdGhNYXApO1xuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgIGxpbmtKc29uVG9QYXRoTWFwLnNldCh0b0pzb24obGluayksIHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0T3JpZ2luYWxMaW5rc01hcChjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IG9sZFBhdGhMaW5rIG9mIHRoaXMub2xkUGF0aExpbmtzKSB7XG4gICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZSh7IGFwcDogdGhpcy5hcHAsIGxpbms6IG9sZFBhdGhMaW5rLCBzb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGggfSk7XG4gICAgICBpZiAoIW9sZEF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja2xpbmtzTWFwID0gbmV3IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPigpO1xuICAgICAgYmFja2xpbmtzTWFwLnNldCh0aGlzLm5ld1BhdGgsIFtvbGRQYXRoTGlua10pO1xuICAgICAgdGhpcy5pbml0QmFja2xpbmtzTWFwKHtcbiAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgIHBhdGg6IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgsXG4gICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYmFja2xpbmtzTWFwXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMga2V5cygpOiBJdGVyYWJsZUl0ZXJhdG9yPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcC5rZXlzKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRPbGRBdHRhY2htZW50Rm9sZGVyUGF0aChvbGRGaWxlOiBURmlsZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtvbGRGaWxlXSk7XG4gICAgdXNpbmcgX2NhY2hlUmVnaXN0cmF0aW9uID0gdGhpcy5vbGRDYWNoZSAmJiBvbGRGaWxlLmRlbGV0ZWRcbiAgICAgID8gcmVnaXN0ZXJGaWxlQ2FjaGVGb3JOb25FeGlzdGluZ0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBjYWNoZTogdGhpcy5vbGRDYWNoZSwgcGF0aE9yRmlsZTogb2xkRmlsZSB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXBvbmVudCB0aGF0IGhhbmRsZXMgcmVuYW1lIGFuZCBkZWxldGUgZXZlbnRzIGluIE9ic2lkaWFuLlxuICogSXQgbGlzdGVucyB0byByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgYW5kIHVwZGF0ZXMgbGlua3MgYWNjb3JkaW5nbHkuXG4gKiBJdCBhbHNvIGhhbmRsZXMgZWRnZSBjYXNlcyBzdWNoIGFzIGNhc2Utb25seSByZW5hbWVzIGFuZCBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgZmlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCBjb21wb25lbnQgd2hvc2Ugc2lnbmFsIGNhbmNlbHMgaW4tZmxpZ2h0IHJlbmFtZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFib3J0U2lnbmFsQ29tcG9uZW50OiBBYm9ydFNpZ25hbENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSB3aG9zZSBsaW5rcyBhcmUgdXBkYXRlZCBkdXJpbmcgYSByZW5hbWUvbW92ZSxcbiAgICogd2l0aCB0aGUgcnVubmluZyBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBgbnVsbGAsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIElEIHVzZWQgdG8gaWRlbnRpZnkgdGhpcyBoYW5kbGVyIGFtb25nIHRoZSByZWdpc3RlcmVkIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gcmVwb3J0IHVwZGF0ZWQgbGlua3MgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgbG9jayBjb21wb25lbnQgdXNlZCB0byBndWFyZCBsaW5rIHVwZGF0ZXMsIG9yIGBudWxsYCBpZiBub25lIGlzIHVzZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhpcyBwbHVnaW4ncyByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG5cbiAgLyoqXG4gICAqIFRoZSBtYW5hZ2VyIHRoYXQgYWdncmVnYXRlcyByZW5hbWUvZGVsZXRlIGhhbmRsZXIgc2V0dGluZ3MgYWNyb3NzIHJlZ2lzdGVyZWQgcGx1Z2lucy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXMgPSBuZXcgSGFuZGxlZFJlbmFtZXMoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVEZWxldGVIYW5kbGVyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQgPSBwYXJhbXMuYWJvcnRTaWduYWxDb21wb25lbnQ7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPSBwYXJhbXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgPz8gbnVsbDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gICAgdGhpcy5zZXR0aW5nc0J1aWxkZXIgPSBwYXJhbXMuc2V0dGluZ3NCdWlsZGVyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gbmV3IFNldHRpbmdzTWFuYWdlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBjb21wb25lbnRcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcblxuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldCh0aGlzLnBsdWdpbklkLCB0aGlzLnNldHRpbmdzQnVpbGRlcik7XG4gICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHRoaXMucGx1Z2luSWQpO1xuICAgICAgdGhpcy5sb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgdGhpcy5oYW5kbGVEZWxldGUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgdGhpcy5oYW5kbGVSZW5hbWUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgdGhpcy5oYW5kbGVNZXRhZGF0YURlbGV0ZWQuYmluZCh0aGlzKSkpO1xuXG4gICAgdGhpcy5hZGRDaGlsZChcbiAgICAgIG5ldyBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50KHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZmlsZU1hbmFnZXI6IHRoaXMuYXBwLmZpbGVNYW5hZ2VyLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURlbGV0ZShmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhZGRUb1F1ZXVlKHtcbiAgICAgIG9wZXJhdGlvbkZuOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBEZWxldGVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLFxuICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgICAgICB9KS5oYW5kbGUoKSxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZW5hbWVEZWxldGVIYW5kbGVyLmhhbmRsZURlbGV0ZSwgeyBmaWxlUGF0aDogZmlsZS5wYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldkNhY2hlLFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW5hbWUoZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3VsZEludm9rZUhhbmRsZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghaXNGaWxlKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3UGF0aCA9IGZpbGUucGF0aDtcblxuICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBIYW5kbGUgUmVuYW1lICR7b2xkUGF0aH0gLT4gJHtuZXdQYXRofWApO1xuICAgIGlmICh0aGlzLmhhbmRsZWRSZW5hbWVzLmhhcyhvbGRQYXRoLCBuZXdQYXRoKSkge1xuICAgICAgdGhpcy5oYW5kbGVkUmVuYW1lcy5kZWxldGUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBBIHJlbmFtZSBvY2N1cnJpbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGVcbiAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBBZHZhbmNlZCBOb3RlIENvbXBvc2VyJ3MgZm9sZGVyIG1lcmdlKSBpcyBvcmNoZXN0cmF0ZWQgYnkgdGhhdFxuICAgICAqIHRyYW5zYWN0aW9uJ3Mgb3duZXIsIHdoaWNoIHRha2VzIHJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3duIGxpbmsgY29uc2lzdGVuY3kuIFJlYWN0aW5nIHRvIGl0XG4gICAgICogaGVyZSB3b3VsZCAoYSkgcGVydHVyYiBPYnNpZGlhbidzIG5hdGl2ZSBwb3N0LXJlbmFtZSBsaW5rIHVwZGF0ZSBhbmQgbGVhdmUgbGlua3MgZGFuZ2xpbmcsIGFuZFxuICAgICAqIChiKSBjb2xsaWRlIHdpdGggdGhlIGZvcmVpZ24gdHJhbnNhY3Rpb24gXHUyMDE0IGFuIGFzeW5jIGFib3J0IGZyb20gdGhpcyBoYW5kbGVyIGFib3J0cyBhblxuICAgICAqIGFscmVhZHktY29tbWl0dGVkIHRyYW5zYWN0aW9uLCB0aHJvd2luZyBcIkNhbm5vdCByb2xsIGJhY2sgYSBjb21taXR0ZWQgdHJhbnNhY3Rpb25cIi4gVGhpc1xuICAgICAqIGhhbmRsZXIncyBvd24gYXR0YWNobWVudCBtb3ZlcyBhcmUgYWxyZWFkeSBleGNsdWRlZCBhYm92ZSB2aWEgYGhhbmRsZWRSZW5hbWVzYCwgc28gYSBsb2NrIHN0aWxsXG4gICAgICogaGVsZCBoZXJlIGFsd2F5cyBiZWxvbmdzIHRvIGEgZm9yZWlnbiBvcGVyYXRpb247IHN0YXkgb3V0IG9mIGl0cyB3YXkuIFNlZVxuICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1hZHZhbmNlZC1ub3RlLWNvbXBvc2VyL2lzc3Vlcy8xNDYuXG4gICAgICovXG4gICAgaWYgKGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkgfHwgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBuZXdQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoXG4gICAgICAgIGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH0gYXMgaXQgb2NjdXJzIGluc2lkZSBhIGZvcmVpZ24gbG9ja2VkIHRyYW5zYWN0aW9uLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcyAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciAmJiAhc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihvbGRQYXRoKSkge1xuICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6aGFuZGxlUmVuYW1lJykoYFNraXBwaW5nIHJlbmFtZSBoYW5kbGVyIG9mIG9sZCBwYXRoICR7b2xkUGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG5ld1BhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgbmV3IHBhdGggJHtuZXdQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZENhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5nZXRDYWNoZShvbGRQYXRoKSA/PyB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG5ld1BhdGgpO1xuICAgIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKHRoaXMuYXBwLCBvbGRQYXRoKS5kYXRhO1xuICAgIGFkZFRvUXVldWUoe1xuICAgICAgYWJvcnRTaWduYWw6IHRoaXMuYWJvcnRTaWduYWxDb21wb25lbnQuYWJvcnRTaWduYWwsXG4gICAgICBvcGVyYXRpb25GbjogKGFib3J0U2lnbmFsKSA9PlxuICAgICAgICBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXA6IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLFxuICAgICAgICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyOiB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlUmVuYW1lLCB7IG5ld1BhdGgsIG9sZFBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6bG9nUmVnaXN0ZXJlZEhhbmRsZXJzJykoXG4gICAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkpfWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG91bGRJbnZva2VIYW5kbGVyKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gdGhpcy5zZXR0aW5nc01hbmFnZXIucmVuYW1lRGVsZXRlSGFuZGxlcnNNYXA7XG4gICAgY29uc3QgbWFpblBsdWdpbklkID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpWzBdO1xuICAgIHJldHVybiBtYWluUGx1Z2luSWQgPT09IHRoaXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAog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
|
|
1070
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBMaW5rVXBkYXRlLFxuICBMaW5rVXBkYXRlc0hhbmRsZXJcbn0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIEZpbGVNYW5hZ2VyLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERlZXBseSBjb3VwbGVkIHRvIE9ic2lkaWFuIHJ1bnRpbWU7IHJlcXVpcmVzIHJ1bm5pbmcgdmF1bHQgZm9yIG1lYW5pbmdmdWwgdGVzdGluZy4gKi9cbmltcG9ydCB7XG4gIGdldERhdGFBZGFwdGVyRXgsXG4gIEludGVybmFsUGx1Z2luTmFtZVxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnaTE4bmV4dCc7XG5pbXBvcnQgeyBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4uL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgVXBkYXRlTGlua1BhcmFtcyxcbiAgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXNcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQgdHlwZSB7IFJlc291cmNlTG9ja0NvbXBvbmVudCB9IGZyb20gJy4uL3Jlc291cmNlLWxvY2sudHMnO1xuaW1wb3J0IHR5cGUgeyBBYm9ydFNpZ25hbENvbXBvbmVudCB9IGZyb20gJy4vYWJvcnQtc2lnbmFsLWNvbXBvbmVudC50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBmaWx0ZXJJblBsYWNlIH0gZnJvbSAnLi4vLi4vYXJyYXkudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuLi8uLi9kZWJ1Zy50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHRvSnNvblxufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi8uLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnRQYXRoQ29udGV4dCxcbiAgZ2V0QXR0YWNobWVudEZpbGVQYXRoLFxuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuLi9hdHRhY2htZW50LXBhdGgudHMnO1xuaW1wb3J0IHsgZ2V0Q2FudmFzUmVmZXJlbmNlcyB9IGZyb20gJy4uL2NhbnZhcy50cyc7XG5pbXBvcnQgeyB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzIH0gZnJvbSAnLi4vZmlsZS1tYW5hZ2VyLnRzJztcbmltcG9ydCB7XG4gIENBTlZBU19GSUxFX0VYVEVOU0lPTixcbiAgZ2V0RmlsZSxcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIGlzTm90ZVxufSBmcm9tICcuLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBlZGl0TGlua3MsXG4gIGV4dHJhY3RMaW5rRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlTGlua3NJbkZpbGVcbn0gZnJvbSAnLi4vbGluay50cyc7XG5pbXBvcnQge1xuICBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0TGlua3MsXG4gIHJlZ2lzdGVyRmlsZUNhY2hlRm9yTm9uRXhpc3RpbmdGaWxlLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4uL21ldGFkYXRhLWNhY2hlLnRzJztcbmltcG9ydCB7IGFkZFRvUXVldWUgfSBmcm9tICcuLi9xdWV1ZS50cyc7XG5pbXBvcnQgeyBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IgfSBmcm9tICcuLi9yZXNvdXJjZS1sb2NrLnRzJztcbmltcG9ydCB7IGRlbGV0ZUlmTm90VXNlZCB9IGZyb20gJy4uL3ZhdWx0LWRlbGV0ZS50cyc7XG5pbXBvcnQge1xuICBjbGVhbnVwRW1wdHlGb2xkZXJzLFxuICBFbXB0eUZvbGRlckJlaGF2aW9yLFxuICBnZXRTYWZlUmVuYW1lUGF0aCxcbiAgcmVuYW1lU2FmZSxcbiAgdHJhc2hTYWZlXG59IGZyb20gJy4uL3ZhdWx0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHtcbiAgaGFzUGF0Y2hUb2tlbixcbiAgTW9ua2V5QXJvdW5kQ29tcG9uZW50XG59IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIG9mIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXIgd2hlbiBkZWxldGluZyBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgZW1wdHlGb2xkZXJCZWhhdmlvcjogRW1wdHlGb2xkZXJCZWhhdmlvcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGF0aCBpcyBhIG5vdGUuXG4gICAqL1xuICBpc05vdGUocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNlczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEhhbmRsZWRSZW5hbWVLZXkge1xuICBuZXdQYXRoOiBzdHJpbmc7XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEludGVycnVwdGVkUmVuYW1lIHtcbiAgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBvbGRQYXRoOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBoYW5kbGVkUmVuYW1lczogSGFuZGxlZFJlbmFtZXM7XG4gIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA/OiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcbiAgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiBNYXA8c3RyaW5nLCBJbnRlcnJ1cHRlZFJlbmFtZVtdPjtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICByZWFkb25seSBvbGRDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPjtcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBSZW5hbWVNYXBDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IG5ld1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcbn1cblxuaW50ZXJmYWNlIFJlbmFtZU1hcEluaXRCYWNrbGlua3NNYXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvbWJpbmVkIGJhY2tsaW5rcyBtYXAsIGtleWVkIGJ5IG5ldyBiYWNrbGluayBwYXRoLCBhY2N1bXVsYXRpbmcgbGluay1KU09OIHRvIHNvdXJjZS1wYXRoIG1hcHBpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB3aG9zZSBiYWNrbGlua3MgYXJlIGJlaW5nIHJlY29yZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYmFja2xpbmtzIG1hcCBmb3IgYSBzaW5nbGUgZmlsZSwga2V5ZWQgYnkgYmFja2xpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IHNpbmdsZUJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xufVxuXG5jb25zdCBQQVRDSF9UT0tFTiA9IFN5bWJvbC5mb3IoJ3JlbmFtZURlbGV0ZUhhbmRsZXInKTtcblxuaW50ZXJmYWNlIERlbGV0ZUhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwOiBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT47XG4gIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgRmlsZU1hbmFnZXJSdW5Bc3luY0xpbmtVcGRhdGVQYXRjaENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG59XG5cbmludGVyZmFjZSBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICByZWFkb25seSBmaWxlOiBUQWJzdHJhY3RGaWxlO1xuICByZWFkb25seSBwcmV2aW91c0NhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xufVxuXG5pbnRlcmZhY2UgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgc2V0dGluZ3NCdWlsZGVyKHRoaXM6IHZvaWQpOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz47XG59XG5cbmNsYXNzIFNldHRpbmdzTWFuYWdlciB7XG4gIHB1YmxpYyByZWFkb25seSByZW5hbWVEZWxldGVIYW5kbGVyc01hcDogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXR0aW5ncygpOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4ge1xuICAgIGNvbnN0IHNldHRpbmdzQnVpbGRlcnMgPSBbLi4udGhpcy5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKV0ucmV2ZXJzZSgpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWltbWVkaWF0ZS1tdXRhdGlvbiAtLSBGb2xkaW5nIHRoZXNlIGludG8gdGhlIG9iamVjdCBsaXRlcmFsIGtlZXBzIHRoZW0gb3B0aW9uYWwgdW5kZXIgYFBhcnRpYWw8PmAsIGxvc2luZyB0aGUgbmFycm93aW5nIHRoYXQgbWFrZXMgdGhlbSBjYWxsYWJsZSBiZWxvdyB3aXRob3V0IGEgbnVsbGlzaCBjaGVjay5cbiAgICBzZXR0aW5ncy5pc05vdGUgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc05vdGUocGF0aCk7XG4gICAgc2V0dGluZ3MuaXNQYXRoSWdub3JlZCA9ICgpOiBib29sZWFuID0+IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgICAgY29uc3QgbmV3U2V0dGluZ3MgPSBzZXR0aW5nc0J1aWxkZXIoKTtcbiAgICAgIHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgfHw9IG5ld1NldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMgPz8gZmFsc2U7XG4gICAgICBpZiAobmV3U2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvcikge1xuICAgICAgICBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/PSBuZXdTZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yO1xuICAgICAgfVxuICAgICAgc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRIYW5kbGVSZW5hbWVzID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgPz8gZmFsc2U7XG4gICAgICBzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyID8/IGZhbHNlO1xuICAgICAgc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc2VzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXMgPz8gZmFsc2U7XG4gICAgICBjb25zdCBpc1BhdGhJZ25vcmVkID0gc2V0dGluZ3MuaXNQYXRoSWdub3JlZDtcbiAgICAgIHNldHRpbmdzLmlzUGF0aElnbm9yZWQgPSAocGF0aDogc3RyaW5nKTogYm9vbGVhbiA9PiBpc1BhdGhJZ25vcmVkKHBhdGgpIHx8IChuZXdTZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4ocGF0aCkgPz8gZmFsc2UpO1xuICAgICAgY29uc3QgY3VycmVudElzTm90ZSA9IHNldHRpbmdzLmlzTm90ZTtcbiAgICAgIHNldHRpbmdzLmlzTm90ZSA9IChwYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1cnJlbnRJc05vdGUocGF0aCkgJiYgKG5ld1NldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IHRydWUpO1xuICAgIH1cblxuICAgIHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz89IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcDtcbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgaXNOb3RlRXgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKCk7XG4gICAgcmV0dXJuIHNldHRpbmdzLmlzTm90ZT8uKHBhdGgpID8/IGZhbHNlO1xuICB9XG59XG5cbmNsYXNzIERlbGV0ZUhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVsZXRlSGFuZGxlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuZmlsZSA9IHBhcmFtcy5maWxlO1xuICAgIHRoaXMuYWJvcnRTaWduYWwgPSBwYXJhbXMuYWJvcnRTaWduYWw7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3RoaXMuZmlsZS5wYXRofWApO1xuICAgIGlmICghaXNOb3RlKHRoaXMuZmlsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHModGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShcbiAgICAgICAgYFNraXBwaW5nIGRlbGV0ZSBoYW5kbGVyIG9mICR7dGhpcy5maWxlLnBhdGh9IGFzIHRoZSBmaWxlIHN0aWxsIGV4aXN0cyBvbiBkaXNrIChpbmRleC1vbmx5IHJlbW92YWwsIG5vdCBhIHJlYWwgZGVsZXRpb24pLmBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/Lih0aGlzLmZpbGUucGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZURlbGV0ZScpKGBTa2lwcGluZyBkZWxldGUgaGFuZGxlciBvZiAke3RoaXMuZmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlclBhdGhzID0gbmV3IFNldDxzdHJpbmc+KFtkaXJuYW1lKHRoaXMuZmlsZS5wYXRoKV0pO1xuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgY29uc3QgY2FjaGUgPSB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmdldCh0aGlzLmZpbGUucGF0aCk7XG4gICAgICB0aGlzLmRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZSh0aGlzLmZpbGUucGF0aCk7XG4gICAgICBpZiAoY2FjaGUpIHtcbiAgICAgICAgY29uc3QgbGlua3MgPSBnZXRMaW5rcyh7IGNhY2hlIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5maWxlLnBhdGggfSk7XG4gICAgICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmlzTm90ZUV4KGF0dGFjaG1lbnRGaWxlLnBhdGgpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJlbnRGb2xkZXJQYXRocy5hZGQoYXR0YWNobWVudEZpbGUucGFyZW50Py5wYXRoID8/ICcnKTtcbiAgICAgICAgICBhd2FpdCBkZWxldGVJZk5vdFVzZWQoe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIGRlbGV0ZWROb3RlUGF0aDogdGhpcy5maWxlLnBhdGgsXG4gICAgICAgICAgICBwYXRoT3JGaWxlOiBhdHRhY2htZW50RmlsZSxcbiAgICAgICAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyZW50Rm9sZGVyUGF0aHMuZGVsZXRlKCcnKTtcbiAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBlbXB0eUZvbGRlckJlaGF2aW9yOiBzZXR0aW5ncy5lbXB0eUZvbGRlckJlaGF2aW9yID8/IEVtcHR5Rm9sZGVyQmVoYXZpb3IuS2VlcCxcbiAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgaWYgKCFzZXR0aW5ncy5zaG91bGRIYW5kbGVEZWxldGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgIG5vdGVQYXRoT3JGaWxlOiB0aGlzLmZpbGUucGF0aFxuICAgIH0pO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pO1xuXG4gICAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuRGVsZXRlTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5maWxlLnBhdGhcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgYXdhaXQgZGVsZXRlSWZOb3RVc2VkKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBkZWxldGVkTm90ZVBhdGg6IHRoaXMuZmlsZS5wYXRoLFxuICAgICAgcGF0aE9yRmlsZTogYXR0YWNobWVudEZvbGRlcixcbiAgICAgIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciAhPT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwXG4gICAgfSk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICB9XG59XG5cbmNsYXNzIEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGVNYW5hZ2VyOiBGaWxlTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlTWFuYWdlclJ1bkFzeW5jTGlua1VwZGF0ZVBhdGNoQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmZpbGVNYW5hZ2VyID0gcGFyYW1zLmZpbGVNYW5hZ2VyO1xuICAgIHRoaXMuc2V0dGluZ3NNYW5hZ2VyID0gcGFyYW1zLnNldHRpbmdzTWFuYWdlcjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IHRoaXMuZmlsZU1hbmFnZXIsXG4gICAgICBtZXRob2ROYW1lOiAncnVuQXN5bmNMaW5rVXBkYXRlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHtcbiAgICAgICAgZmFsbGJhY2ssXG4gICAgICAgIG9yaWdpbmFsQXJndW1lbnRzOiBbbGlua1VwZGF0ZXNIYW5kbGVyXSxcbiAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmRcbiAgICAgIH0pID0+IHtcbiAgICAgICAgaWYgKGhhc1BhdGNoVG9rZW4ob3JpZ2luYWxNZXRob2QsIFBBVENIX1RPS0VOKSkge1xuICAgICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyID0gKGxpbmtVcGRhdGVzKSA9PiB0aGlzLndyYXBMaW5rVXBkYXRlc0hhbmRsZXIobGlua1VwZGF0ZXMsIGxpbmtVcGRhdGVzSGFuZGxlcik7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZEJvdW5kKG5ld0hhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cmFwTGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzOiBMaW5rVXBkYXRlW10sIGxpbmtVcGRhdGVzSGFuZGxlcjogTGlua1VwZGF0ZXNIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGlzUmVuYW1lQ2FsbGVkID0gZmFsc2U7XG4gICAgbGV0IGlzRm9yZWlnbkxvY2tlZFJlbmFtZUNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5hcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBpc1JlbmFtZUNhbGxlZCA9IHRydWU7XG4gICAgICAvKlxuICAgICAgICogQSByZW5hbWUgcGVyZm9ybWVkIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICAgKiBhZmZlY3RlZCBmb2xkZXIgc3VidHJlZSwgZS5nLiBBZHZhbmNlZCBOb3RlIENvbXBvc2VyJ3MgZm9sZGVyIG1lcmdlKSBpcyBvd25lZCBieSB0aGF0XG4gICAgICAgKiB0cmFuc2FjdGlvbiwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gbGluayBjb25zaXN0ZW5jeS4gVGhpcyBoYW5kbGVyIGRlbGliZXJhdGVseSBkb2VzXG4gICAgICAgKiBOT1QgcmV3cml0ZSBsaW5rcyBmb3IgaXQsIHNvIHN1cHByZXNzaW5nIE9ic2lkaWFuJ3MgbmF0aXZlIGxpbmsgdXBkYXRlIGJlbG93IHdvdWxkIGxlYXZlIHRoZVxuICAgICAgICogbGlua3MgZGFuZ2xpbmcuIExldCB0aGUgbmF0aXZlIHVwZGF0ZSBwcm9jZWVkIHVudG91Y2hlZC4gU2VlXG4gICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAgICovXG4gICAgICBpZiAoaXNSZXNvdXJjZUxvY2tlZEZvclBhdGhCeUFuY2VzdG9yKHRoaXMuYXBwLCBmaWxlLnBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgb2xkUGF0aCkpIHtcbiAgICAgICAgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbGlua1VwZGF0ZXNIYW5kbGVyKGxpbmtVcGRhdGVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5hcHAudmF1bHQub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIEl0IG1pZ2h0IGNoYW5nZWQgaW4gYHJlbmFtZWAgZXZlbnQgaGFuZGxlci4gRVNMaW50IG1pc3Rha2VubHkgZG9lcyBub3QgcmVjb2duaXplIGl0LlxuICAgIGlmICghaXNSZW5hbWVDYWxsZWQgfHwgIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgaXNGb3JlaWduTG9ja2VkUmVuYW1lQ2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShcbiAgICAgIGxpbmtVcGRhdGVzLFxuICAgICAgKGxpbmtVcGRhdGUpID0+IHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnNvdXJjZUZpbGUucGF0aCkpIHtcbiAgICAgICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpydW5Bc3luY0xpbmtVcGRhdGUnKShcbiAgICAgICAgICAgIGBSb2xsIGJhY2sgdG8gZGVmYXVsdCBsaW5rIHVwZGF0ZSBvZiBzb3VyY2UgZmlsZSAke2xpbmtVcGRhdGUuc291cmNlRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRoKSkge1xuICAgICAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOnJ1bkFzeW5jTGlua1VwZGF0ZScpKFxuICAgICAgICAgICAgYFJvbGwgYmFjayB0byBkZWZhdWx0IGxpbmsgdXBkYXRlIG9mIHJlc29sdmVkIGZpbGUgJHtsaW5rVXBkYXRlLnJlc29sdmVkRmlsZS5wYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oJ2JhY2tsaW5rLWNhY2hlJykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5zb3VyY2VGaWxlLmV4dGVuc2lvbiA9PT0gQ0FOVkFTX0ZJTEVfRVhURU5TSU9OKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGlua1VwZGF0ZS5yZXNvbHZlZEZpbGUuZXh0ZW5zaW9uID09PSBDQU5WQVNfRklMRV9FWFRFTlNJT04pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEhhbmRsZWRSZW5hbWVzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXAgPSBuZXcgTWFwPHN0cmluZywgSGFuZGxlZFJlbmFtZUtleT4oKTtcblxuICBwdWJsaWMgYWRkKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXAuc2V0KHRoaXMua2V5VG9TdHJpbmcob2xkUGF0aCwgbmV3UGF0aCksIHsgbmV3UGF0aCwgb2xkUGF0aCB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5kZWxldGUodGhpcy5rZXlUb1N0cmluZyhvbGRQYXRoLCBuZXdQYXRoKSk7XG4gIH1cblxuICBwdWJsaWMgaGFzKG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmhhcyh0aGlzLmtleVRvU3RyaW5nKG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SGFuZGxlZFJlbmFtZUtleT4ge1xuICAgIHJldHVybiB0aGlzLm1hcC52YWx1ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9TdHJpbmcob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbiAgfVxufVxuXG5jbGFzcyBNZXRhZGF0YURlbGV0ZWRIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcDogTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IFRBYnN0cmFjdEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJldmlvdXNDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBwYXJhbXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA7XG4gICAgdGhpcy5maWxlID0gcGFyYW1zLmZpbGU7XG4gICAgdGhpcy5wcmV2aW91c0NhY2hlID0gcGFyYW1zLnByZXZpb3VzQ2FjaGU7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBwYXJhbXMuc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCk7XG5cbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4odGhpcy5maWxlLnBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVNZXRhZGF0YURlbGV0ZWQnKShgU2tpcHBpbmcgbWV0YWRhdGEgZGVsZXRlIGhhbmRsZXIgb2YgJHt0aGlzLmZpbGUucGF0aH0gYXMgdGhlIHBhdGggaXMgaWdub3JlZC5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXJrZG93bkZpbGUodGhpcy5maWxlKSAmJiB0aGlzLnByZXZpb3VzQ2FjaGUpIHtcbiAgICAgIHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KHRoaXMuZmlsZS5wYXRoLCB0aGlzLnByZXZpb3VzQ2FjaGUpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBSZW5hbWVIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWw7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlZFJlbmFtZXM6IEhhbmRsZWRSZW5hbWVzO1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+O1xuICBwcml2YXRlIHJlYWRvbmx5IGludGVycnVwdGVkUmVuYW1lc01hcDogTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBuZXdQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbGRQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+O1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlTG9ja0NvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nc01hbmFnZXI6IFNldHRpbmdzTWFuYWdlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZW5hbWVIYW5kbGVyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCA9IHBhcmFtcy5yZXNvdXJjZUxvY2tDb21wb25lbnQ7XG4gICAgdGhpcy5oYW5kbGVkUmVuYW1lcyA9IHBhcmFtcy5oYW5kbGVkUmVuYW1lcztcbiAgICB0aGlzLmludGVycnVwdGVkQ29tYmluZWRCYWNrbGlua3NNYXAgPSBwYXJhbXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcCA/PyBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgICB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCA9IHBhcmFtcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZENhY2hlID0gcGFyYW1zLm9sZENhY2hlO1xuICAgIHRoaXMub2xkUGF0aCA9IHBhcmFtcy5vbGRQYXRoO1xuICAgIHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCA9IHBhcmFtcy5vbGRQYXRoQmFja2xpbmtzTWFwO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLm9sZFBhdGggPT09IHRoaXMubmV3UGF0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAvKlxuICAgICAqIFRoZSByZW5hbWUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBoYW5kbGVyIGlzIHZlcnkgbGlrZWx5IHN0aWxsIGluc2lkZSBPYnNpZGlhbidzIG93blxuICAgICAqIGBGaWxlTWFuYWdlci5ydW5Bc3luY0xpbmtVcGRhdGVgIGN5Y2xlLCB3aGljaCBpcyBhYm91dCB0byBkZWNpZGUgXHUyMDE0IHN5bmNocm9ub3VzbHkgXHUyMDE0IHdoaWNoIGxpbmtzIHRvXG4gICAgICogcmV3cml0ZSwgYnkgcmUtcmVzb2x2aW5nIGVhY2ggb25lLiBFdmVyeXRoaW5nIGJlbG93IHRlbXBvcmFyaWx5IHJlZ2lzdGVycyBhIHBoYW50b20gZmlsZSBhdCB0aGVcbiAgICAgKiBvbGQgcGF0aCAoYHJlZ2lzdGVyRmlsZXNgLCBkaXJlY3RseSBoZXJlIGFuZCBpbnNpZGUgYFJlbmFtZU1hcGApIGFuZCBob2xkcyBpdCBhY3Jvc3MgYW4gYGF3YWl0YDtcbiAgICAgKiBzZWVuIG1pZC1kZWNpc2lvbiwgdGhhdCBwaGFudG9tIG1ha2VzIHRoZSBvbGQgcGF0aCBzdGlsbCByZXNvbHZlLCBzbyBPYnNpZGlhbiBjb25jbHVkZXMgbm90aGluZ1xuICAgICAqIGNoYW5nZWQgYW5kIHJld3JpdGVzIG5vdGhpbmcuIFN0YW5kaW5nIGludmFyaWFudDogbmV2ZXIgdG91Y2ggdGhlIHZhdWx0IGluZGV4IHdoaWxlIE9ic2lkaWFuIGlzXG4gICAgICogbWlkLWRlY2lzaW9uLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWN1c3RvbS1hdHRhY2htZW50LWxvY2F0aW9uL2lzc3Vlcy80Ny5cbiAgICAgKi9cbiAgICBhd2FpdCB3YWl0Rm9yUGVuZGluZ0xpbmtVcGRhdGVzKHRoaXMuYXBwKTtcbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBhd2FpdCB0aGlzLmNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gICAgLy8gVGhlIHJlZnJlc2hlZCBiYWNrbGlua3MgZmVlZCBgb2xkUGF0aEJhY2tsaW5rc01hcGAsIHdoaWNoIG9ubHkgdGhlIGxpbmstcmV3cml0ZSBzdGVwcyBiZWxvdyByZWFkLCBhbmQgdGhvc2UgYXJlIGdhdGVkIG9uIHRoZSBzYW1lIGZsYWcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NNYW5hZ2VyLmdldFNldHRpbmdzKCkuc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoTGlua3MoKTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICB9XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5oYW5kbGVDYXNlQ29sbGlzaW9uKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICBjb25zdCBwbHVnaW5Ob3RpY2VDb21wb25lbnQgPSB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAgIGNvbnN0IHJlbmFtZWRGaWxlUGF0aHMgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ3JlbmFtZWRGaWxlUGF0aHMnLCBuZXcgU2V0PHN0cmluZz4oKSkudmFsdWU7XG4gICAgY29uc3QgcmVuYW1lZExpbmtzID0gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKCdyZW5hbWVkTGlua1BhdGhzJywgbmV3IFNldDxzdHJpbmc+KCkpLnZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBSZW5hbWVNYXAoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgbmV3UGF0aDogdGhpcy5uZXdQYXRoLFxuICAgICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlbmFtZU1hcC5maWxsKCk7XG4gICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcblxuICAgICAgY29uc3QgY29tYmluZWRCYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICAgICAgLy8gQmFja2xpbmtzIGFyZSBvbmx5IGNvbnN1bWVkIGJ5IHRoZSBsaW5rLXJld3JpdGUgc3RlcHMgYmVsb3csIHdoaWNoIGFyZSBnYXRlZCBvblxuICAgICAgLy8gYHNob3VsZEhhbmRsZVJlbmFtZXNgLiBTa2lwIGdhdGhlcmluZyB0aGVtIChhIGJhY2tsaW5rIGZldGNoIHBlciBhdHRhY2htZW50KSBvbiBhIG1vdmUtb25seSByZW5hbWUuXG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkSGFuZGxlUmVuYW1lcykge1xuICAgICAgICByZW5hbWVNYXAuaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgICAgICByZW5hbWVNYXAuaW5pdEJhY2tsaW5rc01hcCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgYXR0YWNobWVudE9sZFBhdGggb2YgcmVuYW1lTWFwLmtleXMoKSkge1xuICAgICAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gdGhpcy5vbGRQYXRoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGF0dGFjaG1lbnRPbGRQYXRoIH0pO1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3MuZGF0YTtcbiAgICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgICAgcmVuYW1lTWFwLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgICBwYXRoOiBhdHRhY2htZW50T2xkUGF0aCxcbiAgICAgICAgICAgIHNpbmdsZUJhY2tsaW5rc01hcDogYXR0YWNobWVudE9sZFBhdGhCYWNrbGlua3NNYXBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnRGb2xkZXJQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGhdIG9mIHJlbmFtZU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoICE9PSB0aGlzLm9sZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCBmaXhlZE5ld0F0dGFjaG1lbnRQYXRoID0gYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKG9sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudFBhdGgsIGZpeGVkTmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nc01hbmFnZXIuaXNOb3RlRXgob2xkQXR0YWNobWVudFBhdGgpKSB7XG4gICAgICAgICAgcGFyZW50Rm9sZGVyUGF0aHMuYWRkKGRpcm5hbWUob2xkQXR0YWNobWVudFBhdGgpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjbGVhbnVwRW1wdHlGb2xkZXJzKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgZW1wdHlGb2xkZXJCZWhhdmlvcjogc2V0dGluZ3MuZW1wdHlGb2xkZXJCZWhhdmlvciA/PyBFbXB0eUZvbGRlckJlaGF2aW9yLktlZXAsXG4gICAgICAgIGZvbGRlclBhdGhzOiBbLi4ucGFyZW50Rm9sZGVyUGF0aHNdXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgLypcbiAgICAgICAqIFRoZSBhdHRhY2htZW50IG1vdmUgYWJvdmUgcnVucyByZWdhcmRsZXNzIG9mIGBzaG91bGRIYW5kbGVSZW5hbWVzYCAodGhhdCBpcyB0aGUgcG9pbnQgb2YgZGVjb3VwbGluZ1xuICAgICAgICogXCJNb3ZlIGF0dGFjaG1lbnRzIHdpdGggbm90ZVwiIGZyb20gXCJVcGRhdGUgbGlua3NcIikuIFRoZSByZW1haW5pbmcgc3RlcHMgb25seSByZXdyaXRlIGxpbmtzLCBzbyBza2lwXG4gICAgICAgKiB0aGVtIHdoZW4gbGluayB1cGRhdGVzIGFyZSBkaXNhYmxlZDsgdGhlIGBmaW5hbGx5YCBibG9jayBiZWxvdyBzdGlsbCBydW5zLlxuICAgICAgICovXG4gICAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYWNrbGlua0VudHJpZXMgPSBbLi4uY29tYmluZWRCYWNrbGlua3NNYXAsIC4uLnRoaXMuaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcF07XG4gICAgICBsZXQgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwXSBvZiBiYWNrbGlua0VudHJpZXMpIHtcbiAgICAgICAgbGV0IGxpbmtJbmRleCA9IDA7XG4gICAgICAgIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgICAgICAgbGlua0luZGV4Kys7XG4gICAgICAgICAgICBjb25zdCBvbGRBdHRhY2htZW50UGF0aCA9IGxpbmtKc29uVG9QYXRoTWFwLmdldCh0b0pzb24obGluaykpO1xuICAgICAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50UGF0aCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRQYXRoID0gcmVuYW1lTWFwLmdldChvbGRBdHRhY2htZW50UGF0aCkgPz8gb2xkQXR0YWNobWVudFBhdGg7XG5cbiAgICAgICAgICAgIHJlbmFtZWRGaWxlUGF0aHMuYWRkKG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgICAgICAgICByZW5hbWVkTGlua3MuYWRkKGAke25ld0JhY2tsaW5rUGF0aH0vLyR7U3RyaW5nKGxpbmtJbmRleCl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICAgIGxpbmssXG4gICAgICAgICAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICAgICAgbmV3VGFyZ2V0UGF0aE9yRmlsZTogbmV3QXR0YWNobWVudFBhdGgsXG4gICAgICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhdGhPckZpbGU6IG5ld0JhY2tsaW5rUGF0aCxcbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgcmVzb3VyY2VMb2NrQ29tcG9uZW50OiB0aGlzLnJlc291cmNlTG9ja0NvbXBvbmVudCxcbiAgICAgICAgICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgICAgcHJvY2Vzc2VkQmFja2xpbmtGaWxlcysrO1xuICAgICAgICB0aGlzLmxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPy4oe1xuICAgICAgICAgIGN1cnJlbnRQYXRoOiBuZXdCYWNrbGlua1BhdGgsXG4gICAgICAgICAgcHJvY2Vzc2VkOiBwcm9jZXNzZWRCYWNrbGlua0ZpbGVzLFxuICAgICAgICAgIHRvdGFsOiBiYWNrbGlua0VudHJpZXMubGVuZ3RoXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKHRoaXMubmV3UGF0aCkpIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zPih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoLFxuICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZSxcbiAgICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzZXNcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCB9KSkge1xuICAgICAgICBsZXQgaW50ZXJydXB0ZWRSZW5hbWVzID0gdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZ2V0KHRoaXMubmV3UGF0aCk7XG4gICAgICAgIGlmICghaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzID0gW107XG4gICAgICAgICAgdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAuc2V0KHRoaXMubmV3UGF0aCwgaW50ZXJydXB0ZWRSZW5hbWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMucHVzaCh7XG4gICAgICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgb2xkUGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCBvcnBoYW5LZXlzID0gWy4uLnRoaXMuaGFuZGxlZFJlbmFtZXMua2V5cygpXTtcbiAgICAgIGFkZFRvUXVldWUoe1xuICAgICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246ICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG9ycGhhbktleSBvZiBvcnBoYW5LZXlzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZWRSZW5hbWVzLmRlbGV0ZShvcnBoYW5LZXkub2xkUGF0aCwgb3JwaGFuS2V5Lm5ld1BhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChyZW5hbWVkTGlua3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci51cGRhdGVkTGlua3MsIHsgZmlsZXNDb3VudDogcmVuYW1lZEZpbGVQYXRocy5zaXplLCBsaW5rc0NvdW50OiByZW5hbWVkTGlua3Muc2l6ZSB9KSk7XG4gICAgICAgICAgcmVuYW1lZEZpbGVQYXRocy5jbGVhcigpO1xuICAgICAgICAgIHJlbmFtZWRMaW5rcy5jbGVhcigpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVPcnBoYW5lZFJlbmFtZXMpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmdldCh0aGlzLm9sZFBhdGgpO1xuICAgIGlmIChpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgIHRoaXMuaW50ZXJydXB0ZWRSZW5hbWVzTWFwLmRlbGV0ZSh0aGlzLm9sZFBhdGgpO1xuICAgICAgZm9yIChjb25zdCBpbnRlcnJ1cHRlZFJlbmFtZSBvZiBpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICAgICAgYXdhaXQgbmV3IFJlbmFtZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsOiB0aGlzLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgaGFuZGxlZFJlbmFtZXM6IHRoaXMuaGFuZGxlZFJlbmFtZXMsXG4gICAgICAgICAgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcDogaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwOiB0aGlzLmludGVycnVwdGVkUmVuYW1lc01hcCxcbiAgICAgICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgICAgICBuZXdQYXRoOiB0aGlzLm5ld1BhdGgsXG4gICAgICAgICAgb2xkQ2FjaGU6IHRoaXMub2xkQ2FjaGUsXG4gICAgICAgICAgb2xkUGF0aDogaW50ZXJydXB0ZWRSZW5hbWUub2xkUGF0aCxcbiAgICAgICAgICBvbGRQYXRoQmFja2xpbmtzTWFwOiB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDYXNlQ29sbGlzaW9uKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghZ2V0RGF0YUFkYXB0ZXJFeCh0aGlzLmFwcCkuaW5zZW5zaXRpdmUgfHwgdGhpcy5vbGRQYXRoLnRvTG93ZXJDYXNlKCkgIT09IHRoaXMubmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGpvaW4oZGlybmFtZSh0aGlzLm5ld1BhdGgpLCBgX190ZW1wX18ke2Jhc2VuYW1lKHRoaXMubmV3UGF0aCl9YCk7XG4gICAgYXdhaXQgdGhpcy5yZW5hbWVIYW5kbGVkKHRoaXMubmV3UGF0aCwgdGVtcG9yYXJ5UGF0aCk7XG5cbiAgICBhd2FpdCBuZXcgUmVuYW1lSGFuZGxlcih7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbCxcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBoYW5kbGVkUmVuYW1lczogdGhpcy5oYW5kbGVkUmVuYW1lcyxcbiAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjogdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICAgIG5ld1BhdGg6IHRlbXBvcmFyeVBhdGgsXG4gICAgICBvbGRDYWNoZTogdGhpcy5vbGRDYWNoZSxcbiAgICAgIG9sZFBhdGg6IHRoaXMub2xkUGF0aCxcbiAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXA6IHRoaXMub2xkUGF0aEJhY2tsaW5rc01hcCxcbiAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgc2V0dGluZ3NNYW5hZ2VyOiB0aGlzLnNldHRpbmdzTWFuYWdlclxuICAgIH0pLmhhbmRsZSgpO1xuXG4gICAgYXdhaXQgdGhpcy5hcHAuZmlsZU1hbmFnZXIucmVuYW1lRmlsZShnZXRGaWxlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogdGVtcG9yYXJ5UGF0aCB9KSwgdGhpcy5uZXdQYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaExpbmtzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZha2VPbGRGaWxlID0gZ2V0RmlsZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICAgIGxldCBvbGRQYXRoQmFja2xpbmtzTWFwUmVmcmVzaGVkOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT47XG4gICAge1xuICAgICAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXModGhpcy5hcHAsIFtmYWtlT2xkRmlsZV0pO1xuICAgICAgY29uc3QgZmFrZU9sZEZpbGVCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IGZha2VPbGRGaWxlIH0pO1xuICAgICAgb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCA9IGZha2VPbGRGaWxlQmFja2xpbmtzLmRhdGE7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZCkge1xuICAgICAgbGV0IG9sZExpbmtzID0gdGhpcy5vbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgICAgaWYgKCFvbGRMaW5rcykge1xuICAgICAgICBvbGRMaW5rcyA9IFtdO1xuICAgICAgICB0aGlzLm9sZFBhdGhCYWNrbGlua3NNYXAuc2V0KGJhY2tsaW5rUGF0aCwgb2xkTGlua3MpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgICAgaWYgKG9sZExpbmtzLmluY2x1ZGVzKGxpbmspKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgb2xkTGlua3MucHVzaChsaW5rKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlbmFtZUhhbmRsZWQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIG5ld1BhdGggPSBnZXRTYWZlUmVuYW1lUGF0aCh7IGFwcDogdGhpcy5hcHAsIG5ld1BhdGgsIG9sZFBhdGhPckFic3RyYWN0RmlsZTogb2xkUGF0aCB9KTtcbiAgICBpZiAob2xkUGF0aCA9PT0gbmV3UGF0aCkge1xuICAgICAgcmV0dXJuIG5ld1BhdGg7XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuYWRkKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgbmV3UGF0aCwgb2xkUGF0aE9yQWJzdHJhY3RGaWxlOiBvbGRQYXRoIH0pO1xuICAgIHJldHVybiBuZXdQYXRoO1xuICB9XG59XG5cbmNsYXNzIFJlbmFtZU1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmV3UGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZENhY2hlOiBDYWNoZWRNZXRhZGF0YSB8IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2xkUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3NNYW5hZ2VyOiBTZXR0aW5nc01hbmFnZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVuYW1lTWFwQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFib3J0U2lnbmFsID0gcGFyYW1zLmFib3J0U2lnbmFsO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLnNldHRpbmdzTWFuYWdlciA9IHBhcmFtcy5zZXR0aW5nc01hbmFnZXI7XG4gICAgdGhpcy5vbGRDYWNoZSA9IHBhcmFtcy5vbGRDYWNoZTtcbiAgICB0aGlzLm9sZFBhdGggPSBwYXJhbXMub2xkUGF0aDtcbiAgICB0aGlzLm5ld1BhdGggPSBwYXJhbXMubmV3UGF0aDtcbiAgICB0aGlzLm9sZFBhdGhMaW5rcyA9IHRoaXMub2xkQ2FjaGUgPyBnZXRMaW5rcyh7IGNhY2hlOiB0aGlzLm9sZENhY2hlIH0pIDogW107XG4gIH1cblxuICBwdWJsaWMgZW50cmllcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFtzdHJpbmcsIHN0cmluZ10+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZW50cmllcygpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHRoaXMubWFwLnNldCh0aGlzLm9sZFBhdGgsIHRoaXMubmV3UGF0aCk7XG5cbiAgICBpZiAoIWlzTm90ZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gT2JzaWRpYW4gZG9lcyBub3QgaW5kZXggYSBjYW52YXMgZmlsZSBpbnRvIHRoZSBtZXRhZGF0YSBjYWNoZS5cbiAgICAvLyBUaGUgY2FjaGUtZGVyaXZlZCBgb2xkUGF0aExpbmtzYCBpcyBlbXB0eSBmb3IgYSBjYW52YXMsIGhpZGluZyBpdHMgZW1iZWRkZWQgYXR0YWNobWVudHMuXG4gICAgLy8gUmVhZGluZyB0aGUgY2FudmFzIHJlZmVyZW5jZXMgZGlyZWN0bHkgbW92ZXMgdGhlbSB3aXRoIHRoZSBjYW52YXMgKG1pcnJvcmluZyBub3RlIGJlaGF2aW9yKS5cbiAgICAvLyBUaGUgZmlsZSBhbHJlYWR5IGxpdmVzIGF0IHRoZSBuZXcgcGF0aCBhZnRlciB0aGUgcmVuYW1lLCBzbyByZWFkIHRoZSByZWZlcmVuY2VzIGZyb20gdGhlcmUuXG4gICAgaWYgKGlzQ2FudmFzRmlsZSh0aGlzLm9sZFBhdGgpKSB7XG4gICAgICBjb25zdCBjYW52YXNSZWZlcmVuY2VzID0gYXdhaXQgZ2V0Q2FudmFzUmVmZXJlbmNlcyh0aGlzLmFwcCwgdGhpcy5uZXdQYXRoKTtcbiAgICAgIHRoaXMub2xkUGF0aExpbmtzLnB1c2goLi4uY2FudmFzUmVmZXJlbmNlcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5nZXRTZXR0aW5ncygpO1xuXG4gICAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoeyBhcHA6IHRoaXMuYXBwLCBwYXRoT3JGaWxlOiB0aGlzLm9sZFBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IHRoaXMuZ2V0T2xkQXR0YWNobWVudEZvbGRlclBhdGgob2xkRmlsZSk7XG5cbiAgICBjb25zdCBuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXJcbiAgICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aFxuICAgICAgfSlcbiAgICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgICBjb25zdCBpc09sZEF0dGFjaG1lbnRGb2xkZXJBdFJvb3QgPSBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy8nO1xuXG4gICAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZvbGRlcjogb2xkQXR0YWNobWVudEZvbGRlclBhdGggfSk7XG5cbiAgICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICAgIGlmIChcbiAgICAgIGF3YWl0IGhhc093bkF0dGFjaG1lbnRGb2xkZXIoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQuUmVuYW1lTm90ZSxcbiAgICAgICAgcGF0aDogdGhpcy5vbGRQYXRoXG4gICAgICB9KVxuICAgICkge1xuICAgICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGlmIChpc0ZpbGUob2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgICB0aGlzLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHsgYXBwOiB0aGlzLmFwcCwgbGluazogb2xkUGF0aExpbmssIHNvdXJjZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCB9KTtcbiAgICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCB8fCBvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwOiB0aGlzLmFwcCwgcGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUgfSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4ob2xkQXR0YWNobWVudEJhY2tsaW5rcy5rZXlzKCkpO1xuICAgICAgICAgIGtleXMuZGVsZXRlKHRoaXMub2xkUGF0aCk7XG4gICAgICAgICAga2V5cy5kZWxldGUodGhpcy5uZXdQYXRoKTtcbiAgICAgICAgICBpZiAoa2V5cy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzTWFuYWdlci5pc05vdGVFeChvbGRBdHRhY2htZW50RmlsZS5wYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG5ld0F0dGFjaG1lbnRGaWxlUGF0aDogc3RyaW5nO1xuICAgICAgaWYgKHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgICBuZXdBdHRhY2htZW50RmlsZVBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0LlJlbmFtZU5vdGUsXG4gICAgICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMubmV3UGF0aCxcbiAgICAgICAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogb2xkQXR0YWNobWVudEZpbGUsXG4gICAgICAgICAgb2xkTm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aCxcbiAgICAgICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGlzT2xkQXR0YWNobWVudEZvbGRlckF0Um9vdCA/IG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggOiByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgICAgIGNvbnN0IG5ld0ZvbGRlciA9IGpvaW4obmV3QXR0YWNobWVudEZvbGRlclBhdGgsIGRpcm5hbWUocmVsYXRpdmVQYXRoKSk7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IGpvaW4obmV3Rm9sZGVyLCBvbGRBdHRhY2htZW50RmlsZS5uYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggPT09IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5ld0F0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcDogdGhpcy5hcHAsIHBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRGaWxlUGF0aCB9KTtcbiAgICAgICAgaWYgKG5ld0F0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1JlbmFtZURlbGV0ZUhhbmRsZXI6ZmlsbFJlbmFtZU1hcCcpKGBSZW1vdmluZyBjb25mbGljdGluZyBhdHRhY2htZW50ICR7bmV3QXR0YWNobWVudEZpbGUucGF0aH0uYCk7XG4gICAgICAgICAgYXdhaXQgdHJhc2hTYWZlKHRoaXMuYXBwLCBuZXdBdHRhY2htZW50RmlsZSk7XG4gICAgICAgICAgdGhpcy5hYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnkgPSBkaXJuYW1lKG5ld0F0dGFjaG1lbnRGaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobmV3QXR0YWNobWVudEZpbGVQYXRoKTtcbiAgICAgICAgY29uc3QgYmFzZU5hbWUgPSBiYXNlbmFtZShuZXdBdHRhY2htZW50RmlsZVBhdGgsIGV4dGVuc2lvbik7XG4gICAgICAgIG5ld0F0dGFjaG1lbnRGaWxlUGF0aCA9IHRoaXMuYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihkaXJlY3RvcnksIGJhc2VOYW1lKSwgZXh0ZW5zaW9uLnNsaWNlKDEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdBdHRhY2htZW50RmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQob2xkUGF0aDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5tYXAuZ2V0KG9sZFBhdGgpO1xuICB9XG5cbiAgcHVibGljIGluaXRCYWNrbGlua3NNYXAocGFyYW1zOiBSZW5hbWVNYXBJbml0QmFja2xpbmtzTWFwUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgY29tYmluZWRCYWNrbGlua3NNYXAsXG4gICAgICBwYXRoLFxuICAgICAgc2luZ2xlQmFja2xpbmtzTWFwXG4gICAgfSA9IHBhcmFtcztcbiAgICBmb3IgKGNvbnN0IFtiYWNrbGlua1BhdGgsIGxpbmtzXSBvZiBzaW5nbGVCYWNrbGlua3NNYXApIHtcbiAgICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHRoaXMubWFwLmdldChiYWNrbGlua1BhdGgpID8/IGJhY2tsaW5rUGF0aDtcbiAgICAgIGNvbnN0IGxpbmtKc29uVG9QYXRoTWFwID0gY29tYmluZWRCYWNrbGlua3NNYXAuZ2V0KG5ld0JhY2tsaW5rUGF0aCkgPz8gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5pdE9yaWdpbmFsTGlua3NNYXAoY29tYmluZWRCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBvbGRQYXRoTGluayBvZiB0aGlzLm9sZFBhdGhMaW5rcykge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoeyBhcHA6IHRoaXMuYXBwLCBsaW5rOiBvbGRQYXRoTGluaywgc291cmNlUGF0aE9yRmlsZTogdGhpcy5vbGRQYXRoIH0pO1xuICAgICAgaWYgKCFvbGRBdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4oW1t0aGlzLm5ld1BhdGgsIFtvbGRQYXRoTGlua11dXSk7XG4gICAgICB0aGlzLmluaXRCYWNrbGlua3NNYXAoe1xuICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgcGF0aDogb2xkQXR0YWNobWVudEZpbGUucGF0aCxcbiAgICAgICAgc2luZ2xlQmFja2xpbmtzTWFwOiBiYWNrbGlua3NNYXBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBrZXlzKCk6IEl0ZXJhYmxlSXRlcmF0b3I8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmtleXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKG9sZEZpbGU6IFRGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyh0aGlzLmFwcCwgW29sZEZpbGVdKTtcbiAgICB1c2luZyBfY2FjaGVSZWdpc3RyYXRpb24gPSB0aGlzLm9sZENhY2hlICYmIG9sZEZpbGUuZGVsZXRlZFxuICAgICAgPyByZWdpc3RlckZpbGVDYWNoZUZvck5vbkV4aXN0aW5nRmlsZSh7IGFwcDogdGhpcy5hcHAsIGNhY2hlOiB0aGlzLm9sZENhY2hlLCBwYXRoT3JGaWxlOiBvbGRGaWxlIH0pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGNvbnRleHQ6IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5SZW5hbWVOb3RlLFxuICAgICAgbm90ZVBhdGhPckZpbGU6IHRoaXMub2xkUGF0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHRoYXQgaGFuZGxlcyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKiBJdCBsaXN0ZW5zIHRvIHJlbmFtZSBhbmQgZGVsZXRlIGV2ZW50cyBhbmQgdXBkYXRlcyBsaW5rcyBhY2NvcmRpbmdseS5cbiAqIEl0IGFsc28gaGFuZGxlcyBlZGdlIGNhc2VzIHN1Y2ggYXMgY2FzZS1vbmx5IHJlbmFtZXMgYW5kIGNvbGxpc2lvbnMgd2l0aCBleGlzdGluZyBmaWxlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIGNvbXBvbmVudCB3aG9zZSBzaWduYWwgY2FuY2VscyBpbi1mbGlnaHQgcmVuYW1lIG9wZXJhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWJvcnRTaWduYWxDb21wb25lbnQ6IEFib3J0U2lnbmFsQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIHdob3NlIGxpbmtzIGFyZSB1cGRhdGVkIGR1cmluZyBhIHJlbmFtZS9tb3ZlLFxuICAgKiB3aXRoIHRoZSBydW5uaW5nIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIGBudWxsYCwgbm8gcHJvZ3Jlc3MgaXMgcmVwb3J0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gSUQgdXNlZCB0byBpZGVudGlmeSB0aGlzIGhhbmRsZXIgYW1vbmcgdGhlIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVycy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgdXNlZCB0byByZXBvcnQgdXBkYXRlZCBsaW5rcyB0byB0aGUgdXNlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBsb2NrIGNvbXBvbmVudCB1c2VkIHRvIGd1YXJkIGxpbmsgdXBkYXRlcywgb3IgYG51bGxgIGlmIG5vbmUgaXMgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvdXJjZUxvY2tDb21wb25lbnQ6IG51bGwgfCBSZXNvdXJjZUxvY2tDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGlzIHBsdWdpbidzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPjtcblxuICAvKipcbiAgICogVGhlIG1hbmFnZXIgdGhhdCBhZ2dyZWdhdGVzIHJlbmFtZS9kZWxldGUgaGFuZGxlciBzZXR0aW5ncyBhY3Jvc3MgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNldHRpbmdzTWFuYWdlcjogU2V0dGluZ3NNYW5hZ2VyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkTWV0YWRhdGE+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVkUmVuYW1lcyA9IG5ldyBIYW5kbGVkUmVuYW1lcygpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJydXB0ZWRSZW5hbWVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEludGVycnVwdGVkUmVuYW1lW10+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgUmVuYW1lRGVsZXRlSGFuZGxlckNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlbmFtZURlbGV0ZUhhbmRsZXJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudCA9IHBhcmFtcy5hYm9ydFNpZ25hbENvbXBvbmVudDtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA9IHBhcmFtcy5saW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciA/PyBudWxsO1xuICAgIHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50ID0gcGFyYW1zLnJlc291cmNlTG9ja0NvbXBvbmVudDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnNldHRpbmdzQnVpbGRlciA9IHBhcmFtcy5zZXR0aW5nc0J1aWxkZXI7XG4gICAgdGhpcy5zZXR0aW5nc01hbmFnZXIgPSBuZXcgU2V0dGluZ3NNYW5hZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwO1xuXG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHRoaXMucGx1Z2luSWQsIHRoaXMuc2V0dGluZ3NCdWlsZGVyKTtcbiAgICB0aGlzLmxvZ1JlZ2lzdGVyZWRIYW5kbGVycygpO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5kZWxldGUodGhpcy5wbHVnaW5JZCk7XG4gICAgICB0aGlzLmxvZ1JlZ2lzdGVyZWRIYW5kbGVycygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCB0aGlzLmhhbmRsZURlbGV0ZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLnZhdWx0Lm9uKCdyZW5hbWUnLCB0aGlzLmhhbmRsZVJlbmFtZS5iaW5kKHRoaXMpKSk7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCB0aGlzLmhhbmRsZU1ldGFkYXRhRGVsZXRlZC5iaW5kKHRoaXMpKSk7XG5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IEZpbGVNYW5hZ2VyUnVuQXN5bmNMaW5rVXBkYXRlUGF0Y2hDb21wb25lbnQoe1xuICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICBmaWxlTWFuYWdlcjogdGhpcy5hcHAuZmlsZU1hbmFnZXIsXG4gICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRGVsZXRlKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkSW52b2tlSGFuZGxlcigpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGFkZFRvUXVldWUoe1xuICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IChhYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgbmV3IERlbGV0ZUhhbmRsZXIoe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICBzZXR0aW5nc01hbmFnZXI6IHRoaXMuc2V0dGluZ3NNYW5hZ2VyXG4gICAgICAgIH0pLmhhbmRsZSgpLFxuICAgICAgb3BlcmF0aW9uTmFtZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlbmFtZURlbGV0ZUhhbmRsZXIuaGFuZGxlRGVsZXRlLCB7IGZpbGVQYXRoOiBmaWxlLnBhdGggfSlcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZpb3VzQ2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbmV3IE1ldGFkYXRhRGVsZXRlZEhhbmRsZXIoe1xuICAgICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXA6IHRoaXMuZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAsXG4gICAgICBmaWxlLFxuICAgICAgcHJldmlvdXNDYWNoZSxcbiAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICB9KS5oYW5kbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaG91bGRJbnZva2VIYW5kbGVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzRmlsZShmaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG5cbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gKTtcbiAgICBpZiAodGhpcy5oYW5kbGVkUmVuYW1lcy5oYXMob2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlZFJlbmFtZXMuZGVsZXRlKG9sZFBhdGgsIG5ld1BhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSByZW5hbWUgb2NjdXJyaW5nIGluc2lkZSBhIGZvcmVpZ24gcGx1Z2luJ3MgaW4tZmxpZ2h0IGxvY2tlZCB0cmFuc2FjdGlvbiAod2hpY2ggbG9ja3MgdGhlXG4gICAgICogYWZmZWN0ZWQgZm9sZGVyIHN1YnRyZWUsIGUuZy4gQWR2YW5jZWQgTm90ZSBDb21wb3NlcidzIGZvbGRlciBtZXJnZSkgaXMgb3JjaGVzdHJhdGVkIGJ5IHRoYXRcbiAgICAgKiB0cmFuc2FjdGlvbidzIG93bmVyLCB3aGljaCB0YWtlcyByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG93biBsaW5rIGNvbnNpc3RlbmN5LiBSZWFjdGluZyB0byBpdFxuICAgICAqIGhlcmUgd291bGQgKGEpIHBlcnR1cmIgT2JzaWRpYW4ncyBuYXRpdmUgcG9zdC1yZW5hbWUgbGluayB1cGRhdGUgYW5kIGxlYXZlIGxpbmtzIGRhbmdsaW5nLCBhbmRcbiAgICAgKiAoYikgY29sbGlkZSB3aXRoIHRoZSBmb3JlaWduIHRyYW5zYWN0aW9uIFx1MjAxNCBhbiBhc3luYyBhYm9ydCBmcm9tIHRoaXMgaGFuZGxlciBhYm9ydHMgYW5cbiAgICAgKiBhbHJlYWR5LWNvbW1pdHRlZCB0cmFuc2FjdGlvbiwgdGhyb3dpbmcgXCJDYW5ub3Qgcm9sbCBiYWNrIGEgY29tbWl0dGVkIHRyYW5zYWN0aW9uXCIuIFRoaXNcbiAgICAgKiBoYW5kbGVyJ3Mgb3duIGF0dGFjaG1lbnQgbW92ZXMgYXJlIGFscmVhZHkgZXhjbHVkZWQgYWJvdmUgdmlhIGBoYW5kbGVkUmVuYW1lc2AsIHNvIGEgbG9jayBzdGlsbFxuICAgICAqIGhlbGQgaGVyZSBhbHdheXMgYmVsb25ncyB0byBhIGZvcmVpZ24gb3BlcmF0aW9uOyBzdGF5IG91dCBvZiBpdHMgd2F5LiBTZWVcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tYWR2YW5jZWQtbm90ZS1jb21wb3Nlci9pc3N1ZXMvMTQ2LlxuICAgICAqL1xuICAgIGlmIChpc1Jlc291cmNlTG9ja2VkRm9yUGF0aEJ5QW5jZXN0b3IodGhpcy5hcHAsIG9sZFBhdGgpIHx8IGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3Rvcih0aGlzLmFwcCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKFxuICAgICAgICBgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9IGFzIGl0IG9jY3VycyBpbnNpZGUgYSBmb3JlaWduIGxvY2tlZCB0cmFuc2FjdGlvbi5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5zZXR0aW5nc01hbmFnZXIuZ2V0U2V0dGluZ3MoKTtcbiAgICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXIgJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzTm9PcFJlbmFtZShzZXR0aW5ncywgb2xkUGF0aCwgbmV3UGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKFxuICAgICAgICBgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2YgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9IGFzIGl0IGlzIG5vdCBhIG5vdGUgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gd2l0aCBsaW5rIHVwZGF0ZXMgZGlzYWJsZWQuYFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpKSB7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgU2tpcHBpbmcgcmVuYW1lIGhhbmRsZXIgb2Ygb2xkIHBhdGggJHtvbGRQYXRofSBhcyB0aGUgcGF0aCBpcyBpZ25vcmVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4obmV3UGF0aCkpIHtcbiAgICAgIGdldExpYkRlYnVnZ2VyKCdSZW5hbWVEZWxldGVIYW5kbGVyOmhhbmRsZVJlbmFtZScpKGBTa2lwcGluZyByZW5hbWUgaGFuZGxlciBvZiBuZXcgcGF0aCAke25ld1BhdGh9IGFzIHRoZSBwYXRoIGlzIGlnbm9yZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkQ2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLmdldENhY2hlKG9sZFBhdGgpID8/IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gICAgY29uc3Qgb2xkUGF0aEJhY2tsaW5rc01hcCA9IGdldEJhY2tsaW5rc0ZvckZpbGVPclBhdGgodGhpcy5hcHAsIG9sZFBhdGgpLmRhdGE7XG4gICAgYWRkVG9RdWV1ZSh7XG4gICAgICBhYm9ydFNpZ25hbDogdGhpcy5hYm9ydFNpZ25hbENvbXBvbmVudC5hYm9ydFNpZ25hbCxcbiAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiAoYWJvcnRTaWduYWwpID0+XG4gICAgICAgIG5ldyBSZW5hbWVIYW5kbGVyKHtcbiAgICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIGhhbmRsZWRSZW5hbWVzOiB0aGlzLmhhbmRsZWRSZW5hbWVzLFxuICAgICAgICAgIGludGVycnVwdGVkUmVuYW1lc01hcDogdGhpcy5pbnRlcnJ1cHRlZFJlbmFtZXNNYXAsXG4gICAgICAgICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI6IHRoaXMubGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgICAgICAgbmV3UGF0aCxcbiAgICAgICAgICBvbGRDYWNoZSxcbiAgICAgICAgICBvbGRQYXRoLFxuICAgICAgICAgIG9sZFBhdGhCYWNrbGlua3NNYXAsXG4gICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICByZXNvdXJjZUxvY2tDb21wb25lbnQ6IHRoaXMucmVzb3VyY2VMb2NrQ29tcG9uZW50LFxuICAgICAgICAgIHNldHRpbmdzTWFuYWdlcjogdGhpcy5zZXR0aW5nc01hbmFnZXJcbiAgICAgICAgfSkuaGFuZGxlKCksXG4gICAgICBvcGVyYXRpb25OYW1lOiB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucmVuYW1lRGVsZXRlSGFuZGxlci5oYW5kbGVSZW5hbWUsIHsgbmV3UGF0aCwgb2xkUGF0aCB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpdGggbGluayByZXdyaXRpbmcgb2ZmLCB0aGUgaGFuZGxlcidzIG9ubHkgcmVtYWluaW5nIGpvYnMgYXJlIG1vdmluZyBhIE5PVEUncyBhdHRhY2htZW50cyBhbmQgcHJ1bmluZ1xuICAgKiB0aGUgZm9sZGVyIGEgbW92ZWQgZmlsZSB2YWNhdGVkLiBBIG5vbi1ub3RlIHJlbmFtZSBuZWVkcyBuZWl0aGVyIHdoZW4gZW1wdHkgZm9sZGVycyBhcmUga2VwdCwgc28gdGhlcmVcbiAgICogaXMgbm90aGluZyB0byBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIGFnZ3JlZ2F0ZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyIHNldHRpbmdzLlxuICAgKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSBmaWxlIHdhcyByZW5hbWVkIGZyb20uXG4gICAqIEBwYXJhbSBuZXdQYXRoIC0gVGhlIHBhdGggdGhlIGZpbGUgd2FzIHJlbmFtZWQgdG8uXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBoYW5kbGVyIHdvdWxkIGRvIG5vIHdvcmsgZm9yIHRoaXMgcmVuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBpc05vT3BSZW5hbWUoc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXNcbiAgICAgICYmICEoc2V0dGluZ3MuaXNOb3RlPy4ob2xkUGF0aCkgPz8gZmFsc2UpXG4gICAgICAmJiAhKHNldHRpbmdzLmlzTm90ZT8uKG5ld1BhdGgpID8/IGZhbHNlKVxuICAgICAgJiYgKHNldHRpbmdzLmVtcHR5Rm9sZGVyQmVoYXZpb3IgPz8gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwKSA9PT0gRW1wdHlGb2xkZXJCZWhhdmlvci5LZWVwO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dSZWdpc3RlcmVkSGFuZGxlcnMoKTogdm9pZCB7XG4gICAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSB0aGlzLnNldHRpbmdzTWFuYWdlci5yZW5hbWVEZWxldGVIYW5kbGVyc01hcDtcbiAgICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpsb2dSZWdpc3RlcmVkSGFuZGxlcnMnKShcbiAgICAgIGBQbHVnaW5zIHdpdGggcmVnaXN0ZXJlZCByZW5hbWUvZGVsZXRlIGhhbmRsZXJzOiAke0pTT04uc3RyaW5naWZ5KFsuLi5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCldKX1gXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkSW52b2tlSGFuZGxlcigpOiBib29sZWFuIHtcbiAgICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwO1xuICAgIGNvbnN0IG1haW5QbHVnaW5JZCA9IFsuLi5yZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCldWzBdO1xuICAgIHJldHVybiBtYWluUGx1Z2luSWQgPT09IHRoaXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuZXhwb3J0IHsgRW1wdHlGb2xkZXJCZWhhdmlvciB9IGZyb20gJy4uL3ZhdWx0LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFvQkEsNkJBR087QUFDUCxxQkFBa0I7QUFDbEIsc0JBQXNCO0FBV3RCLG1CQUE4QjtBQUM5QixtQkFBK0I7QUFDL0IsMEJBR087QUFDUCxzQ0FBeUM7QUFDekMsa0JBTU87QUFDUCw2QkFLTztBQUNQLG9CQUFvQztBQUNwQywwQkFBMEM7QUFDMUMseUJBU087QUFDUCxrQkFLTztBQUNQLDRCQU1PO0FBQ1AsbUJBQTJCO0FBQzNCLDJCQUFrRDtBQUNsRCwwQkFBZ0M7QUFDaEMsbUJBTU87QUFDUCwwQkFBNEI7QUFDNUIscUNBR087QUF3cUNQLElBQUFBLGdCQUFvQztBQWhrQ3BDLE1BQU0sY0FBYyx1QkFBTyxJQUFJLHFCQUFxQjtBQWlDcEQsTUFBTSxnQkFBZ0I7QUFBQSxFQUNKO0FBQUEsRUFFVCxjQUFj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
|