obsidian-dev-utils 88.7.0 → 89.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/demo-vault-helper/main.js +20 -23
- package/dist/integration-test-plugin/main.js +2218 -1734
- package/dist/lib/cjs/__merged.cjs +57 -35
- package/dist/lib/cjs/__merged.d.cts +12 -10
- package/dist/lib/cjs/abort-controller.cjs +15 -22
- package/dist/lib/cjs/array.cjs +27 -26
- package/dist/lib/cjs/array.d.cts +25 -7
- package/dist/lib/cjs/async-events.cjs +87 -91
- package/dist/lib/cjs/async-events.d.cts +50 -50
- package/dist/lib/cjs/async.cjs +80 -80
- package/dist/lib/cjs/async.d.cts +23 -23
- package/dist/lib/cjs/beeper.cjs +11 -15
- package/dist/lib/cjs/blob.cjs +14 -25
- package/dist/lib/cjs/codemirror/index.cjs +11 -15
- package/dist/lib/cjs/codemirror/state-field-spec.cjs +11 -15
- package/dist/lib/cjs/debug-controller.cjs +11 -15
- package/dist/lib/cjs/debug.cjs +24 -32
- package/dist/lib/cjs/debug.d.cts +1 -1
- package/dist/lib/cjs/disposable.cjs +59 -43
- package/dist/lib/cjs/disposable.d.cts +27 -8
- package/dist/lib/cjs/enum.cjs +11 -15
- package/dist/lib/cjs/error.cjs +28 -33
- package/dist/lib/cjs/function.cjs +30 -34
- package/dist/lib/cjs/function.d.cts +26 -26
- package/dist/lib/cjs/generated-during-build.cjs +12 -16
- package/dist/lib/cjs/html-element.cjs +84 -89
- package/dist/lib/cjs/html-element.d.cts +15 -15
- package/dist/lib/cjs/index.cjs +11 -15
- package/dist/lib/cjs/integration-test-setup.cjs +11 -15
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +11 -15
- package/dist/lib/cjs/jest-setup.cjs +11 -15
- package/dist/lib/cjs/library.cjs +11 -15
- package/dist/lib/cjs/object-utils.cjs +120 -117
- package/dist/lib/cjs/object-utils.d.cts +27 -27
- package/dist/lib/cjs/obsidian/@types/dataview/data-model/value.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/expression/field.d.cts +1 -1
- package/dist/lib/cjs/obsidian/@types/dataview/expression/functions.d.cts +4 -4
- package/dist/lib/cjs/obsidian/active-file-provider.cjs +11 -15
- package/dist/lib/cjs/obsidian/app.cjs +11 -15
- package/dist/lib/cjs/obsidian/async-with-notice.cjs +28 -32
- package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
- package/dist/lib/cjs/obsidian/attachment-path.cjs +20 -24
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +5 -5
- package/dist/lib/cjs/obsidian/backlink.cjs +12 -16
- package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/callout.cjs +27 -26
- package/dist/lib/cjs/obsidian/callout.d.cts +9 -3
- package/dist/lib/cjs/obsidian/canvas.cjs +13 -16
- package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +18 -20
- package/dist/lib/cjs/obsidian/code-block-markdown-information.cjs +11 -15
- package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +2 -2
- package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +18 -16
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +5 -0
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +56 -31
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +42 -8
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +10 -0
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +26 -30
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +8 -8
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +12 -16
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +12 -16
- package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.cjs +13 -17
- package/dist/lib/cjs/obsidian/command-handlers/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/command-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/community-plugins.cjs +28 -25
- package/dist/lib/cjs/obsidian/community-plugins.d.cts +19 -5
- package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +4 -4
- package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +13 -16
- package/dist/lib/cjs/obsidian/components/async-events-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/component-ex.cjs +26 -28
- package/dist/lib/cjs/obsidian/components/component-ex.d.cts +3 -3
- package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/components/disposable-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/index.cjs +14 -15
- package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +29 -33
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +55 -55
- package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.cjs +297 -0
- package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.d.cts +139 -0
- package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +28 -31
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +26 -30
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +8 -8
- package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +13 -17
- package/dist/lib/cjs/obsidian/components/registry-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +72 -62
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +12 -1
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +8 -8
- package/dist/lib/cjs/obsidian/constructors/get-dom-events-handlers-constructor.cjs +14 -18
- package/dist/lib/cjs/obsidian/constructors/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/css-class.cjs +11 -15
- package/dist/lib/cjs/obsidian/data-handler.cjs +11 -15
- package/dist/lib/cjs/obsidian/dataview-link.cjs +13 -17
- package/dist/lib/cjs/obsidian/dataview.cjs +35 -41
- package/dist/lib/cjs/obsidian/dataview.d.cts +2 -2
- package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +13 -17
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +22 -26
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +23 -21
- package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/editor.cjs +17 -19
- package/dist/lib/cjs/obsidian/events.cjs +12 -16
- package/dist/lib/cjs/obsidian/events.d.cts +2 -2
- package/dist/lib/cjs/obsidian/extensions-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/file-change.cjs +76 -80
- package/dist/lib/cjs/obsidian/file-change.d.cts +3 -3
- package/dist/lib/cjs/obsidian/file-manager.cjs +33 -22
- package/dist/lib/cjs/obsidian/file-manager.d.cts +20 -1
- package/dist/lib/cjs/obsidian/file-system.cjs +15 -19
- package/dist/lib/cjs/obsidian/file-system.d.cts +3 -3
- package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.cjs +11 -15
- package/dist/lib/cjs/obsidian/frontmatter.cjs +15 -19
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/html-element.cjs +13 -17
- package/dist/lib/cjs/obsidian/html-element.d.cts +2 -2
- package/dist/lib/cjs/obsidian/i18n/custom-type-options.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/default-translations.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/i18n.cjs +13 -16
- package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +7 -0
- package/dist/lib/cjs/obsidian/i18n/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.cjs +11 -15
- package/dist/lib/cjs/obsidian/index.cjs +14 -15
- package/dist/lib/cjs/obsidian/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/is-in-obsidian.cjs +11 -15
- package/dist/lib/cjs/obsidian/link-update-progress.cjs +11 -15
- package/dist/lib/cjs/obsidian/link.cjs +91 -81
- package/dist/lib/cjs/obsidian/link.d.cts +22 -22
- package/dist/lib/cjs/obsidian/logger.cjs +21 -25
- package/dist/lib/cjs/obsidian/logger.d.cts +5 -5
- package/dist/lib/cjs/obsidian/loop.cjs +14 -18
- package/dist/lib/cjs/obsidian/loop.d.cts +1 -1
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +12 -16
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +35 -40
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +12 -16
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +3 -3
- package/dist/lib/cjs/obsidian/markdown-view.cjs +11 -15
- package/dist/lib/cjs/obsidian/markdown.cjs +22 -24
- package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
- package/dist/lib/cjs/obsidian/metadata-cache.cjs +16 -20
- package/dist/lib/cjs/obsidian/metadata-cache.d.cts +2 -2
- package/dist/lib/cjs/obsidian/modals/alert.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/confirm.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +28 -32
- package/dist/lib/cjs/obsidian/modals/modal.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +16 -20
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
- package/dist/lib/cjs/obsidian/modals/select-option.cjs +11 -15
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +26 -28
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +5 -5
- package/dist/lib/cjs/obsidian/notebook-navigator.cjs +155 -0
- package/dist/lib/cjs/obsidian/notebook-navigator.d.cts +132 -0
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/obsidian-settings.cjs +11 -15
- package/dist/lib/cjs/obsidian/parse-link.cjs +61 -62
- package/dist/lib/cjs/obsidian/parse-link.d.cts +4 -4
- package/dist/lib/cjs/obsidian/path-settings.cjs +27 -25
- package/dist/lib/cjs/obsidian/pdf.cjs +13 -17
- package/dist/lib/cjs/obsidian/pdf.d.cts +2 -2
- package/dist/lib/cjs/obsidian/plugin/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +11 -15
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +156 -52
- package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +17 -21
- package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +2 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +20 -24
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +11 -9
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +29 -33
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +33 -16
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +11 -1
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +14 -18
- package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +2 -2
- package/dist/lib/cjs/obsidian/popovers/popover.cjs +19 -23
- package/dist/lib/cjs/obsidian/queue.cjs +16 -20
- package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
- package/dist/lib/cjs/obsidian/react/app-context.cjs +11 -15
- package/dist/lib/cjs/obsidian/react/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/reference.cjs +11 -15
- package/dist/lib/cjs/obsidian/resource-lock.cjs +157 -78
- package/dist/lib/cjs/obsidian/resource-lock.d.cts +5 -0
- package/dist/lib/cjs/obsidian/resource-url.cjs +12 -16
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +18 -22
- package/dist/lib/cjs/obsidian/setting-components/checkbox-component.d.cts +5 -5
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -31
- package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/date-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/email-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/index.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/month-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +17 -21
- package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +12 -16
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +15 -19
- package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/number-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/password-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/text-based-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/text-based-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/time-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +15 -19
- package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +16 -20
- package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +18 -22
- package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-range-text-component.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +16 -19
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +4 -4
- package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/url-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +45 -49
- package/dist/lib/cjs/obsidian/setting-components/validator-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.cjs +11 -15
- package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-components/week-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-ex.cjs +76 -80
- package/dist/lib/cjs/obsidian/setting-ex.d.cts +42 -42
- package/dist/lib/cjs/obsidian/setting-group-ex.cjs +14 -18
- package/dist/lib/cjs/obsidian/setting-group-ex.d.cts +2 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/validation.cjs +11 -15
- package/dist/lib/cjs/obsidian/vault-delete.cjs +23 -20
- package/dist/lib/cjs/obsidian/vault-delete.d.cts +16 -2
- package/dist/lib/cjs/obsidian/vault-transaction.cjs +17 -18
- package/dist/lib/cjs/obsidian/vault.cjs +81 -63
- package/dist/lib/cjs/obsidian/vault.d.cts +32 -11
- package/dist/lib/cjs/obsidian/view-registrar.cjs +11 -15
- package/dist/lib/cjs/obsidian/workspace.cjs +12 -16
- package/dist/lib/cjs/obsidian-dev-utils-state.cjs +11 -15
- package/dist/lib/cjs/path.cjs +18 -22
- package/dist/lib/cjs/path.d.cts +1 -1
- package/dist/lib/cjs/reg-exp.cjs +38 -35
- package/dist/lib/cjs/reg-exp.d.cts +4 -4
- package/dist/lib/cjs/script-utils/build.cjs +21 -25
- package/dist/lib/cjs/script-utils/build.d.cts +1 -1
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +24 -28
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +36 -34
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +20 -24
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +13 -17
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +16 -20
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +6 -2
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +32 -36
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/esbuild.cjs +11 -15
- package/dist/lib/cjs/script-utils/bundlers/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/check-project-types.cjs +13 -17
- package/dist/lib/cjs/script-utils/check-project-types.d.cts +12 -4
- package/dist/lib/cjs/script-utils/cli-utils.cjs +39 -47
- package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -6
- package/dist/lib/cjs/script-utils/code-generator.cjs +11 -15
- package/dist/lib/cjs/script-utils/commitlint-config.cjs +11 -15
- package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +22 -23
- package/dist/lib/cjs/script-utils/demo-vault.cjs +11 -15
- package/dist/lib/cjs/script-utils/env-toggle.cjs +13 -17
- package/dist/lib/cjs/script-utils/exec.cjs +40 -44
- package/dist/lib/cjs/script-utils/exec.d.cts +4 -4
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +12 -16
- package/dist/lib/cjs/script-utils/formatters/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/fs.cjs +13 -17
- package/dist/lib/cjs/script-utils/git.cjs +11 -15
- package/dist/lib/cjs/script-utils/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/json.cjs +15 -19
- package/dist/lib/cjs/script-utils/json.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +12 -16
- package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +402 -16
- package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +27 -31
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +27 -31
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +21 -25
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +109 -113
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +13 -17
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +21 -25
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +51 -55
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +9 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +25 -27
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +6 -2
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +33 -37
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.cjs +11 -15
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +14 -18
- package/dist/lib/cjs/script-utils/linters/index.cjs +14 -15
- package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +18 -17
- package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.d.cts +2 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.cjs +138 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.d.cts +35 -0
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +20 -23
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +18 -22
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +54 -18
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +11 -15
- package/dist/lib/cjs/script-utils/npm-publish.cjs +11 -15
- package/dist/lib/cjs/script-utils/npm-run.cjs +20 -17
- package/dist/lib/cjs/script-utils/npm-run.d.cts +16 -2
- package/dist/lib/cjs/script-utils/npm.cjs +21 -25
- package/dist/lib/cjs/script-utils/npm.d.cts +11 -11
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +11 -15
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +165 -55
- package/dist/lib/cjs/script-utils/root.cjs +11 -15
- package/dist/lib/cjs/script-utils/test-runners/index.cjs +16 -17
- package/dist/lib/cjs/script-utils/test-runners/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +11 -15
- package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +325 -0
- package/dist/lib/cjs/script-utils/test-runners/vitest-config.d.cts +118 -0
- package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +11 -15
- package/dist/lib/cjs/script-utils/validate-declarations.cjs +11 -15
- package/dist/lib/cjs/script-utils/version.cjs +62 -63
- package/dist/lib/cjs/script-utils/version.d.cts +21 -21
- package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +11 -15
- package/dist/lib/cjs/setup.cjs +11 -15
- package/dist/lib/cjs/setup.d.cts +1 -1
- package/dist/lib/cjs/strict-proxy.cjs +30 -34
- package/dist/lib/cjs/strict-proxy.d.cts +2 -2
- package/dist/lib/cjs/string.cjs +90 -93
- package/dist/lib/cjs/string.d.cts +60 -60
- package/dist/lib/cjs/transformers/date-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/duration-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/group-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/index.cjs +11 -15
- package/dist/lib/cjs/transformers/map-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/set-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/transformer.cjs +11 -15
- package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +12 -16
- package/dist/lib/cjs/transformers/typed-transformer.cjs +11 -15
- package/dist/lib/cjs/two-way-map.cjs +11 -15
- package/dist/lib/cjs/type-guards.cjs +16 -20
- package/dist/lib/cjs/type-guards.d.cts +6 -6
- package/dist/lib/cjs/type.cjs +13 -17
- package/dist/lib/cjs/type.d.cts +2 -2
- package/dist/lib/cjs/url.cjs +18 -22
- package/dist/lib/cjs/url.d.cts +4 -4
- package/dist/lib/cjs/value-provider.cjs +15 -19
- package/dist/lib/cjs/value-provider.d.cts +6 -6
- package/dist/lib/cjs/value-wrapper.cjs +11 -15
- package/dist/lib/cjs/vitest-setup.cjs +11 -15
- package/dist/lib/esm/__merged.d.mts +12 -10
- package/dist/lib/esm/__merged.mjs +51 -23
- package/dist/lib/esm/abort-controller.mjs +5 -8
- package/dist/lib/esm/array.d.mts +25 -7
- package/dist/lib/esm/array.mjs +16 -12
- package/dist/lib/esm/async-events.d.mts +50 -50
- package/dist/lib/esm/async-events.mjs +81 -78
- package/dist/lib/esm/async.d.mts +23 -23
- package/dist/lib/esm/async.mjs +70 -66
- package/dist/lib/esm/blob.mjs +4 -11
- package/dist/lib/esm/debug.d.mts +1 -1
- package/dist/lib/esm/debug.mjs +14 -18
- package/dist/lib/esm/disposable.d.mts +27 -8
- package/dist/lib/esm/disposable.mjs +47 -29
- package/dist/lib/esm/error.mjs +18 -19
- package/dist/lib/esm/function.d.mts +26 -26
- package/dist/lib/esm/function.mjs +20 -20
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/html-element.d.mts +15 -15
- package/dist/lib/esm/html-element.mjs +74 -75
- package/dist/lib/esm/object-utils.d.mts +27 -27
- package/dist/lib/esm/object-utils.mjs +109 -102
- package/dist/lib/esm/obsidian/@types/dataview/data-model/value.d.mts +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/expression/field.d.mts +1 -1
- package/dist/lib/esm/obsidian/@types/dataview/expression/functions.d.mts +4 -4
- package/dist/lib/esm/obsidian/app.mjs +1 -1
- package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
- package/dist/lib/esm/obsidian/async-with-notice.mjs +18 -18
- package/dist/lib/esm/obsidian/attachment-path.d.mts +5 -5
- package/dist/lib/esm/obsidian/attachment-path.mjs +10 -10
- package/dist/lib/esm/obsidian/backlink.mjs +2 -2
- package/dist/lib/esm/obsidian/callout.d.mts +9 -3
- package/dist/lib/esm/obsidian/callout.mjs +17 -12
- package/dist/lib/esm/obsidian/canvas.mjs +3 -2
- package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +8 -6
- package/dist/lib/esm/obsidian/code-block-markdown-information.d.mts +2 -2
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +5 -0
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +8 -2
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +42 -8
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +46 -17
- package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +10 -0
- package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +8 -8
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +16 -16
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +2 -2
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +2 -2
- package/dist/lib/esm/obsidian/command-handlers/global-command-handler.mjs +3 -3
- package/dist/lib/esm/obsidian/community-plugins.d.mts +19 -5
- package/dist/lib/esm/obsidian/community-plugins.mjs +17 -11
- package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +4 -4
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
- package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -2
- package/dist/lib/esm/obsidian/components/component-ex.d.mts +3 -3
- package/dist/lib/esm/obsidian/components/component-ex.mjs +16 -14
- package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/components/console-debug-component.mjs +4 -4
- package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/components/index.mjs +3 -1
- package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +5 -5
- package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +55 -55
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +19 -19
- package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.d.mts +139 -0
- package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.mjs +196 -0
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +18 -17
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +8 -8
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +18 -18
- package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +3 -3
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +12 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +62 -48
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +8 -8
- package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +6 -6
- package/dist/lib/esm/obsidian/constructors/get-dom-events-handlers-constructor.mjs +4 -4
- package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/dataview-link.mjs +3 -3
- package/dist/lib/esm/obsidian/dataview.d.mts +2 -2
- package/dist/lib/esm/obsidian/dataview.mjs +25 -27
- package/dist/lib/esm/obsidian/demo-vault-helper.mjs +4 -3
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +12 -12
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +13 -7
- package/dist/lib/esm/obsidian/editor.mjs +7 -5
- package/dist/lib/esm/obsidian/events.d.mts +2 -2
- package/dist/lib/esm/obsidian/events.mjs +2 -2
- package/dist/lib/esm/obsidian/file-change.d.mts +3 -3
- package/dist/lib/esm/obsidian/file-change.mjs +67 -67
- package/dist/lib/esm/obsidian/file-manager.d.mts +20 -1
- package/dist/lib/esm/obsidian/file-manager.mjs +22 -8
- package/dist/lib/esm/obsidian/file-system.d.mts +3 -3
- package/dist/lib/esm/obsidian/file-system.mjs +4 -4
- package/dist/lib/esm/obsidian/frontmatter.mjs +5 -5
- package/dist/lib/esm/obsidian/html-element.d.mts +2 -2
- package/dist/lib/esm/obsidian/html-element.mjs +3 -3
- package/dist/lib/esm/obsidian/i18n/i18n.d.mts +7 -0
- package/dist/lib/esm/obsidian/i18n/i18n.mjs +3 -2
- package/dist/lib/esm/obsidian/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/index.mjs +3 -1
- package/dist/lib/esm/obsidian/link.d.mts +22 -22
- package/dist/lib/esm/obsidian/link.mjs +76 -62
- package/dist/lib/esm/obsidian/logger.d.mts +5 -5
- package/dist/lib/esm/obsidian/logger.mjs +11 -11
- package/dist/lib/esm/obsidian/loop.d.mts +1 -1
- package/dist/lib/esm/obsidian/loop.mjs +4 -4
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +25 -26
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -3
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +2 -2
- package/dist/lib/esm/obsidian/markdown.mjs +12 -10
- package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -1
- package/dist/lib/esm/obsidian/metadata-cache.d.mts +2 -2
- package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
- package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +18 -18
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
- package/dist/lib/esm/obsidian/modals/select-item.mjs +6 -6
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +5 -5
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +16 -14
- package/dist/lib/esm/obsidian/notebook-navigator.d.mts +132 -0
- package/dist/lib/esm/obsidian/notebook-navigator.mjs +49 -0
- package/dist/lib/esm/obsidian/parse-link.d.mts +4 -4
- package/dist/lib/esm/obsidian/parse-link.mjs +51 -48
- package/dist/lib/esm/obsidian/path-settings.mjs +17 -11
- package/dist/lib/esm/obsidian/pdf.d.mts +2 -2
- package/dist/lib/esm/obsidian/pdf.mjs +3 -3
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +156 -52
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +1 -1
- package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -2
- package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +7 -7
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +11 -9
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +10 -10
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +20 -20
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +11 -1
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +23 -2
- package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +2 -2
- package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +4 -4
- package/dist/lib/esm/obsidian/popovers/popover.mjs +9 -9
- package/dist/lib/esm/obsidian/queue.d.mts +2 -2
- package/dist/lib/esm/obsidian/queue.mjs +6 -6
- package/dist/lib/esm/obsidian/resource-lock.d.mts +5 -0
- package/dist/lib/esm/obsidian/resource-lock.mjs +147 -64
- package/dist/lib/esm/obsidian/resource-url.mjs +2 -2
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +2 -2
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.d.mts +5 -5
- package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +8 -8
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +18 -17
- package/dist/lib/esm/obsidian/setting-components/date-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/date-time-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/email-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/email-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/month-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/month-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +7 -7
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +5 -5
- package/dist/lib/esm/obsidian/setting-components/number-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/number-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/password-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/text-based-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/time-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/time-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +5 -5
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +6 -6
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -8
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +4 -4
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -5
- package/dist/lib/esm/obsidian/setting-components/url-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/url-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-components/validator-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +35 -35
- package/dist/lib/esm/obsidian/setting-components/week-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/week-component.mjs +4 -4
- package/dist/lib/esm/obsidian/setting-ex.d.mts +42 -42
- package/dist/lib/esm/obsidian/setting-ex.mjs +66 -66
- package/dist/lib/esm/obsidian/setting-group-ex.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-group-ex.mjs +4 -4
- package/dist/lib/esm/obsidian/vault-delete.d.mts +16 -2
- package/dist/lib/esm/obsidian/vault-delete.mjs +12 -6
- package/dist/lib/esm/obsidian/vault-transaction.mjs +8 -4
- package/dist/lib/esm/obsidian/vault.d.mts +32 -11
- package/dist/lib/esm/obsidian/vault.mjs +67 -47
- package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
- package/dist/lib/esm/obsidian/workspace.mjs +2 -2
- package/dist/lib/esm/path.d.mts +1 -1
- package/dist/lib/esm/path.mjs +7 -7
- package/dist/lib/esm/reg-exp.d.mts +4 -4
- package/dist/lib/esm/reg-exp.mjs +28 -21
- package/dist/lib/esm/script-utils/build.d.mts +1 -1
- package/dist/lib/esm/script-utils/build.mjs +15 -12
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +14 -14
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +26 -20
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +10 -10
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +3 -3
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -6
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +6 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +20 -20
- package/dist/lib/esm/script-utils/check-project-types.d.mts +12 -4
- package/dist/lib/esm/script-utils/check-project-types.mjs +3 -3
- package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -6
- package/dist/lib/esm/script-utils/cli-utils.mjs +29 -33
- package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +12 -9
- package/dist/lib/esm/script-utils/env-toggle.mjs +3 -3
- package/dist/lib/esm/script-utils/exec.d.mts +4 -4
- package/dist/lib/esm/script-utils/exec.mjs +32 -32
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +2 -2
- package/dist/lib/esm/script-utils/fs.mjs +3 -3
- package/dist/lib/esm/script-utils/json.d.mts +2 -2
- package/dist/lib/esm/script-utils/json.mjs +5 -5
- package/dist/lib/esm/script-utils/linters/cspell.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +392 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +17 -17
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +17 -17
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +11 -11
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +99 -99
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +11 -11
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +9 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +41 -41
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +6 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +15 -13
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +23 -23
- package/dist/lib/esm/script-utils/linters/eslint.mjs +4 -4
- package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.d.mts +2 -2
- package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/markdownlint-ignores.d.mts +35 -0
- package/dist/lib/esm/script-utils/linters/markdownlint-ignores.mjs +33 -0
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -9
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +54 -18
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +8 -8
- package/dist/lib/esm/script-utils/npm-run.d.mts +16 -2
- package/dist/lib/esm/script-utils/npm-run.mjs +9 -3
- package/dist/lib/esm/script-utils/npm.d.mts +11 -11
- package/dist/lib/esm/script-utils/npm.mjs +11 -11
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +165 -55
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +1 -1
- package/dist/lib/esm/script-utils/test-runners/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/test-runners/index.mjs +4 -2
- package/dist/lib/esm/script-utils/test-runners/vitest-config.d.mts +118 -0
- package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +210 -0
- package/dist/lib/esm/script-utils/validate-declarations.mjs +1 -1
- package/dist/lib/esm/script-utils/version.d.mts +21 -21
- package/dist/lib/esm/script-utils/version.mjs +48 -45
- package/dist/lib/esm/setup.d.mts +1 -1
- package/dist/lib/esm/setup.mjs +1 -1
- package/dist/lib/esm/strict-proxy.d.mts +2 -2
- package/dist/lib/esm/strict-proxy.mjs +20 -20
- package/dist/lib/esm/string.d.mts +60 -60
- package/dist/lib/esm/string.mjs +80 -79
- package/dist/lib/esm/transformers/map-transformer.mjs +2 -2
- package/dist/lib/esm/transformers/set-transformer.mjs +2 -2
- package/dist/lib/esm/transformers/two-way-map-transformer.mjs +2 -2
- package/dist/lib/esm/type-guards.d.mts +6 -6
- package/dist/lib/esm/type-guards.mjs +6 -6
- package/dist/lib/esm/type.d.mts +2 -2
- package/dist/lib/esm/type.mjs +3 -3
- package/dist/lib/esm/url.d.mts +4 -4
- package/dist/lib/esm/url.mjs +8 -8
- package/dist/lib/esm/value-provider.d.mts +6 -6
- package/dist/lib/esm/value-provider.mjs +5 -5
- package/dist/templates/scripts/vitest-config.ts +2 -88
- package/obsidian/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
- package/obsidian/notebook-navigator/package.json +6 -0
- package/package.json +17 -33
- package/script-utils/linters/markdownlint-ignores/package.json +6 -0
- package/script-utils/test-runners/vitest-config/package.json +6 -0
|
@@ -40,16 +40,11 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
40
40
|
globalThisRecord[key] ??= newFuncs[key]?.();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
function name(obj) {
|
|
44
|
-
return obj;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
43
|
function extractDefault(module) {
|
|
48
44
|
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
49
45
|
}
|
|
50
46
|
|
|
51
|
-
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
|
|
52
|
-
'obsidian',
|
|
47
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
53
48
|
'@codemirror/autocomplete',
|
|
54
49
|
'@codemirror/collab',
|
|
55
50
|
'@codemirror/commands',
|
|
@@ -60,11 +55,12 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
60
55
|
'@codemirror/text',
|
|
61
56
|
'@codemirror/view',
|
|
62
57
|
'@lezer/common',
|
|
58
|
+
'@lezer/highlight',
|
|
63
59
|
'@lezer/lr',
|
|
64
|
-
'
|
|
60
|
+
'obsidian']
|
|
61
|
+
);
|
|
65
62
|
|
|
66
|
-
|
|
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);
|
|
@@ -181,13 +177,13 @@ __export(link_exports, {
|
|
|
181
177
|
generateMarkdownLink: () => generateMarkdownLink,
|
|
182
178
|
generateRawMarkdownLink: () => generateRawMarkdownLink,
|
|
183
179
|
getGenerateMarkdownLinkDefaultParamsFns: () => getGenerateMarkdownLinkDefaultParamsFns,
|
|
180
|
+
hasAngleBrackets: () => hasAngleBrackets,
|
|
181
|
+
hasEmbedSyntax: () => hasEmbedSyntax,
|
|
182
|
+
hasLeadingDot: () => hasLeadingDot,
|
|
183
|
+
hasLeadingSlash: () => hasLeadingSlash,
|
|
184
|
+
hasWikilinkSyntax: () => hasWikilinkSyntax,
|
|
184
185
|
shouldResetAlias: () => shouldResetAlias,
|
|
185
186
|
splitSubpath: () => splitSubpath,
|
|
186
|
-
testAngleBrackets: () => testAngleBrackets,
|
|
187
|
-
testEmbed: () => testEmbed,
|
|
188
|
-
testLeadingDot: () => testLeadingDot,
|
|
189
|
-
testLeadingSlash: () => testLeadingSlash,
|
|
190
|
-
testWikilink: () => testWikilink,
|
|
191
187
|
updateFileUrlLinksInContent: () => updateFileUrlLinksInContent,
|
|
192
188
|
updateFileUrlLinksInFile: () => updateFileUrlLinksInFile,
|
|
193
189
|
updateLink: () => updateLink,
|
|
@@ -210,7 +206,7 @@ var import_metadata_cache = require('./metadata-cache.cjs');
|
|
|
210
206
|
var import_obsidian_settings = require('./obsidian-settings.cjs');
|
|
211
207
|
var import_parse_link = require('./parse-link.cjs');
|
|
212
208
|
var import_reference = require('./reference.cjs');
|
|
213
|
-
const ESCAPED_WIKILINK_DIVIDER =
|
|
209
|
+
const ESCAPED_WIKILINK_DIVIDER = String.raw`\|`;
|
|
214
210
|
const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g;
|
|
215
211
|
var LinkPathStyle = /* @__PURE__ */ ((LinkPathStyle2) => {
|
|
216
212
|
LinkPathStyle2["AbsolutePathInVault"] = "AbsolutePathInVault";
|
|
@@ -254,7 +250,7 @@ async function editBacklinks(params) {
|
|
|
254
250
|
...options
|
|
255
251
|
} = params;
|
|
256
252
|
const backlinks = await (0, import_metadata_cache.getBacklinksForFileSafe)({ app, pathOrFile, ...options });
|
|
257
|
-
const backlinkNotePaths =
|
|
253
|
+
const backlinkNotePaths = [...backlinks.keys()];
|
|
258
254
|
let processed = 0;
|
|
259
255
|
for (const backlinkNotePath of backlinkNotePaths) {
|
|
260
256
|
const currentLinks = (0, import_type_guards.ensureNonNullable)(backlinks.get(backlinkNotePath));
|
|
@@ -386,7 +382,7 @@ function generateMarkdownLink(params) {
|
|
|
386
382
|
const DEFAULT_PARAMS = {
|
|
387
383
|
isEmptyEmbedAliasAllowed: true
|
|
388
384
|
};
|
|
389
|
-
const customDefaultParams = getGenerateMarkdownLinkDefaultParamsFns().map((
|
|
385
|
+
const customDefaultParams = getGenerateMarkdownLinkDefaultParamsFns().map((defaultParamsFunction) => defaultParamsFunction());
|
|
390
386
|
params = Object.assign({}, DEFAULT_PARAMS, ...customDefaultParams, params);
|
|
391
387
|
const targetFile = (0, import_file_system.getFile)((0, import_object_utils.normalizeOptionalProperties)({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
|
|
392
388
|
const _registration = __using(_stack, (0, import_metadata_cache.registerFiles)(app, [targetFile]));
|
|
@@ -413,6 +409,26 @@ function generateRawMarkdownLink(params) {
|
|
|
413
409
|
function getGenerateMarkdownLinkDefaultParamsFns() {
|
|
414
410
|
return (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)("generateMarkdownLinkDefaultParamsFns", []).value;
|
|
415
411
|
}
|
|
412
|
+
function hasAngleBrackets(link) {
|
|
413
|
+
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
414
|
+
return parseLinkResult?.hasAngleBrackets ?? false;
|
|
415
|
+
}
|
|
416
|
+
function hasEmbedSyntax(link) {
|
|
417
|
+
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
418
|
+
return parseLinkResult?.isEmbed ?? false;
|
|
419
|
+
}
|
|
420
|
+
function hasLeadingDot(link) {
|
|
421
|
+
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
422
|
+
return parseLinkResult?.url.startsWith("./") ?? false;
|
|
423
|
+
}
|
|
424
|
+
function hasLeadingSlash(link) {
|
|
425
|
+
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
426
|
+
return parseLinkResult?.url.startsWith("/") ?? false;
|
|
427
|
+
}
|
|
428
|
+
function hasWikilinkSyntax(link) {
|
|
429
|
+
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
430
|
+
return parseLinkResult?.isWikilink ?? false;
|
|
431
|
+
}
|
|
416
432
|
function shouldResetAlias(params) {
|
|
417
433
|
const {
|
|
418
434
|
app,
|
|
@@ -449,9 +465,9 @@ function shouldResetAlias(params) {
|
|
|
449
465
|
aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
|
|
450
466
|
}
|
|
451
467
|
const cleanDisplayText = (0, import_string.replaceAll)({
|
|
468
|
+
$string: (0, import_obsidian.normalizePath)((0, import_type_guards.ensureNonNullable)(displayText.split(" > ", 1)[0])),
|
|
452
469
|
replacer: "",
|
|
453
|
-
searchValue: /^\.\//g
|
|
454
|
-
str: (0, import_obsidian.normalizePath)((0, import_type_guards.ensureNonNullable)(displayText.split(" > ")[0]))
|
|
470
|
+
searchValue: /^\.\//g
|
|
455
471
|
}).toLowerCase();
|
|
456
472
|
for (const alias of aliasesToReset) {
|
|
457
473
|
if (alias.toLowerCase() === cleanDisplayText) {
|
|
@@ -472,26 +488,6 @@ function splitSubpath(link) {
|
|
|
472
488
|
subpath: parsed.subpath
|
|
473
489
|
};
|
|
474
490
|
}
|
|
475
|
-
function testAngleBrackets(link) {
|
|
476
|
-
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
477
|
-
return parseLinkResult?.hasAngleBrackets ?? false;
|
|
478
|
-
}
|
|
479
|
-
function testEmbed(link) {
|
|
480
|
-
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
481
|
-
return parseLinkResult?.isEmbed ?? false;
|
|
482
|
-
}
|
|
483
|
-
function testLeadingDot(link) {
|
|
484
|
-
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
485
|
-
return parseLinkResult?.url.startsWith("./") ?? false;
|
|
486
|
-
}
|
|
487
|
-
function testLeadingSlash(link) {
|
|
488
|
-
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
489
|
-
return parseLinkResult?.url.startsWith("/") ?? false;
|
|
490
|
-
}
|
|
491
|
-
function testWikilink(link) {
|
|
492
|
-
const parseLinkResult = (0, import_parse_link.parseLink)(link);
|
|
493
|
-
return parseLinkResult?.isWikilink ?? false;
|
|
494
|
-
}
|
|
495
491
|
async function updateFileUrlLinksInContent(params) {
|
|
496
492
|
const { app, content, shouldUseAngleBrackets = false } = params;
|
|
497
493
|
return await editLinksInContent((0, import_object_utils.normalizeOptionalProperties)({
|
|
@@ -544,10 +540,8 @@ function updateLink(params) {
|
|
|
544
540
|
originalLink: link.original
|
|
545
541
|
}));
|
|
546
542
|
const { subpath } = splitSubpath(link.link);
|
|
547
|
-
if ((0, import_file_system.isCanvasFile)(newSourcePathOrFile)) {
|
|
548
|
-
|
|
549
|
-
return newTargetFile.path + subpath;
|
|
550
|
-
}
|
|
543
|
+
if ((0, import_file_system.isCanvasFile)(newSourcePathOrFile) && (0, import_reference.isCanvasFileNodeReference)(link)) {
|
|
544
|
+
return newTargetFile.path + subpath;
|
|
551
545
|
}
|
|
552
546
|
const parseLinkResult = (0, import_parse_link.parseLink)(link.original);
|
|
553
547
|
let alias;
|
|
@@ -596,7 +590,7 @@ async function updateLinksInContent(params) {
|
|
|
596
590
|
app,
|
|
597
591
|
content,
|
|
598
592
|
linkConverter: (link) => {
|
|
599
|
-
const isEmbedLink =
|
|
593
|
+
const isEmbedLink = hasEmbedSyntax(link.original);
|
|
600
594
|
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
|
|
601
595
|
return;
|
|
602
596
|
}
|
|
@@ -626,7 +620,7 @@ async function updateLinksInFile(params) {
|
|
|
626
620
|
await editLinks({
|
|
627
621
|
...params,
|
|
628
622
|
linkConverter: (link) => {
|
|
629
|
-
const isEmbedLink =
|
|
623
|
+
const isEmbedLink = hasEmbedSyntax(link.original);
|
|
630
624
|
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
|
|
631
625
|
return;
|
|
632
626
|
}
|
|
@@ -692,18 +686,20 @@ function generateLinkText(params) {
|
|
|
692
686
|
} else {
|
|
693
687
|
switch (config.linkPathStyle) {
|
|
694
688
|
/* v8 ignore stop */
|
|
695
|
-
case "AbsolutePathInVault" /* AbsolutePathInVault */:
|
|
689
|
+
case "AbsolutePathInVault" /* AbsolutePathInVault */: {
|
|
696
690
|
linkText = targetFile.path;
|
|
697
691
|
if (config.shouldUseLeadingSlashForAbsolutePaths && !linkText.startsWith("/")) {
|
|
698
692
|
linkText = `/${linkText}`;
|
|
699
693
|
}
|
|
700
694
|
break;
|
|
701
|
-
|
|
695
|
+
}
|
|
696
|
+
case "RelativePathToTheNote" /* RelativePathToTheSource */: {
|
|
702
697
|
linkText = (0, import_path.relative)((0, import_path.dirname)(sourcePath), targetFile.path);
|
|
703
698
|
if (config.shouldUseLeadingDotForRelativePaths && !linkText.startsWith(".")) {
|
|
704
699
|
linkText = `./${linkText}`;
|
|
705
700
|
}
|
|
706
701
|
break;
|
|
702
|
+
}
|
|
707
703
|
case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
|
|
708
704
|
const shortestName = (0, import_file_system.isMarkdownFile)(targetFile) ? targetFile.basename : targetFile.name;
|
|
709
705
|
const matchedFiles = app.metadataCache.getLinkpathDest(shortestName, sourcePath);
|
|
@@ -711,12 +707,13 @@ function generateLinkText(params) {
|
|
|
711
707
|
break;
|
|
712
708
|
}
|
|
713
709
|
/* v8 ignore start -- All valid FinalLinkPathStyle values are handled above. */
|
|
714
|
-
default:
|
|
710
|
+
default: {
|
|
715
711
|
(0, import_type_guards.assertNever)(config.linkPathStyle);
|
|
712
|
+
}
|
|
716
713
|
}
|
|
717
714
|
}
|
|
718
715
|
linkText = config.isWikilink ? (0, import_string.trimEnd)({
|
|
719
|
-
|
|
716
|
+
$string: linkText,
|
|
720
717
|
suffix: `.${import_file_system.MARKDOWN_FILE_EXTENSION}`
|
|
721
718
|
}) : linkText;
|
|
722
719
|
linkText += subpath;
|
|
@@ -812,11 +809,10 @@ async function getFileChanges(params) {
|
|
|
812
809
|
changes.push(fileChange);
|
|
813
810
|
} else {
|
|
814
811
|
console.error("Unsupported file change", fileChange);
|
|
815
|
-
continue;
|
|
816
812
|
}
|
|
817
813
|
} else {
|
|
818
814
|
if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) {
|
|
819
|
-
fileChange.newContent = fileChange.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, ESCAPED_WIKILINK_DIVIDER);
|
|
815
|
+
fileChange.newContent = fileChange.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, () => ESCAPED_WIKILINK_DIVIDER);
|
|
820
816
|
}
|
|
821
817
|
changes.push(fileChange);
|
|
822
818
|
}
|
|
@@ -826,22 +822,27 @@ async function getFileChanges(params) {
|
|
|
826
822
|
function getFinalLinkPathStyle(app, linkPathStyle) {
|
|
827
823
|
const resolvedStyle = linkPathStyle ?? "ObsidianSettingsDefault" /* ObsidianSettingsDefault */;
|
|
828
824
|
switch (resolvedStyle) {
|
|
829
|
-
case "AbsolutePathInVault" /* AbsolutePathInVault */:
|
|
825
|
+
case "AbsolutePathInVault" /* AbsolutePathInVault */: {
|
|
830
826
|
return "AbsolutePathInVault" /* AbsolutePathInVault */;
|
|
831
|
-
|
|
827
|
+
}
|
|
828
|
+
case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
|
|
832
829
|
return resolveFinalLinkPathStyleFromObsidianSettings(app);
|
|
833
|
-
|
|
830
|
+
}
|
|
831
|
+
case "RelativePathToTheSource" /* RelativePathToTheSource */: {
|
|
834
832
|
return "RelativePathToTheNote" /* RelativePathToTheSource */;
|
|
835
|
-
|
|
833
|
+
}
|
|
834
|
+
case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
|
|
836
835
|
return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
|
|
837
|
-
|
|
836
|
+
}
|
|
837
|
+
default: {
|
|
838
838
|
(0, import_type_guards.assertNever)(resolvedStyle);
|
|
839
|
+
}
|
|
839
840
|
}
|
|
840
841
|
}
|
|
841
842
|
function getLinkConfig(params) {
|
|
842
843
|
const { app } = params;
|
|
843
844
|
return {
|
|
844
|
-
isEmbed: params.isEmbed ?? (params.originalLink ?
|
|
845
|
+
isEmbed: params.isEmbed ?? (params.originalLink ? hasEmbedSyntax(params.originalLink) : false),
|
|
845
846
|
isSingleSubpathAllowed: params.isSingleSubpathAllowed ?? true,
|
|
846
847
|
isWikilink: shouldUseWikilinkStyle((0, import_object_utils.normalizeOptionalProperties)({
|
|
847
848
|
app,
|
|
@@ -849,9 +850,9 @@ function getLinkConfig(params) {
|
|
|
849
850
|
originalLink: params.originalLink
|
|
850
851
|
})),
|
|
851
852
|
linkPathStyle: getFinalLinkPathStyle(app, params.linkPathStyle),
|
|
852
|
-
shouldUseAngleBrackets: params.shouldUseAngleBrackets ?? (params.originalLink ?
|
|
853
|
-
shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths ?? (params.originalLink ?
|
|
854
|
-
shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths ?? (params.originalLink ?
|
|
853
|
+
shouldUseAngleBrackets: params.shouldUseAngleBrackets ?? (params.originalLink ? hasAngleBrackets(params.originalLink) : void 0) ?? false,
|
|
854
|
+
shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths ?? (params.originalLink ? hasLeadingDot(params.originalLink) : void 0) ?? false,
|
|
855
|
+
shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths ?? (params.originalLink ? hasLeadingSlash(params.originalLink) : void 0) ?? false
|
|
855
856
|
};
|
|
856
857
|
}
|
|
857
858
|
function normalizeFileUrlLink(link, shouldUseAngleBrackets) {
|
|
@@ -879,14 +880,18 @@ function normalizeFileUrlLink(link, shouldUseAngleBrackets) {
|
|
|
879
880
|
function resolveFinalLinkPathStyleFromObsidianSettings(app) {
|
|
880
881
|
const newLinkFormat = (0, import_obsidian_settings.getNewLinkFormat)(app);
|
|
881
882
|
switch (newLinkFormat) {
|
|
882
|
-
case "absolute":
|
|
883
|
+
case "absolute": {
|
|
883
884
|
return "AbsolutePathInVault" /* AbsolutePathInVault */;
|
|
884
|
-
|
|
885
|
+
}
|
|
886
|
+
case "relative": {
|
|
885
887
|
return "RelativePathToTheNote" /* RelativePathToTheSource */;
|
|
886
|
-
|
|
888
|
+
}
|
|
889
|
+
case "shortest": {
|
|
887
890
|
return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
|
|
888
|
-
|
|
891
|
+
}
|
|
892
|
+
default: {
|
|
889
893
|
(0, import_type_guards.assertNever)(newLinkFormat);
|
|
894
|
+
}
|
|
890
895
|
}
|
|
891
896
|
}
|
|
892
897
|
function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
|
|
@@ -902,16 +907,21 @@ function shouldUseWikilinkStyle(params) {
|
|
|
902
907
|
const { app, linkStyle, originalLink } = params;
|
|
903
908
|
const resolvedStyle = linkStyle ?? "PreserveExisting" /* PreserveExisting */;
|
|
904
909
|
switch (resolvedStyle) {
|
|
905
|
-
case "Markdown" /* Markdown */:
|
|
910
|
+
case "Markdown" /* Markdown */: {
|
|
906
911
|
return false;
|
|
907
|
-
|
|
912
|
+
}
|
|
913
|
+
case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
|
|
908
914
|
return (0, import_obsidian_settings.shouldUseWikilinks)(app);
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
915
|
+
}
|
|
916
|
+
case "PreserveExisting" /* PreserveExisting */: {
|
|
917
|
+
return originalLink === void 0 ? (0, import_obsidian_settings.shouldUseWikilinks)(app) : hasWikilinkSyntax(originalLink);
|
|
918
|
+
}
|
|
919
|
+
case "Wikilink" /* Wikilink */: {
|
|
912
920
|
return true;
|
|
913
|
-
|
|
921
|
+
}
|
|
922
|
+
default: {
|
|
914
923
|
(0, import_type_guards.assertNever)(resolvedStyle);
|
|
924
|
+
}
|
|
915
925
|
}
|
|
916
926
|
}
|
|
917
927
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -927,17 +937,17 @@ function shouldUseWikilinkStyle(params) {
|
|
|
927
937
|
generateMarkdownLink,
|
|
928
938
|
generateRawMarkdownLink,
|
|
929
939
|
getGenerateMarkdownLinkDefaultParamsFns,
|
|
940
|
+
hasAngleBrackets,
|
|
941
|
+
hasEmbedSyntax,
|
|
942
|
+
hasLeadingDot,
|
|
943
|
+
hasLeadingSlash,
|
|
944
|
+
hasWikilinkSyntax,
|
|
930
945
|
shouldResetAlias,
|
|
931
946
|
splitSubpath,
|
|
932
|
-
testAngleBrackets,
|
|
933
|
-
testEmbed,
|
|
934
|
-
testLeadingDot,
|
|
935
|
-
testLeadingSlash,
|
|
936
|
-
testWikilink,
|
|
937
947
|
updateFileUrlLinksInContent,
|
|
938
948
|
updateFileUrlLinksInFile,
|
|
939
949
|
updateLink,
|
|
940
950
|
updateLinksInContent,
|
|
941
951
|
updateLinksInFile
|
|
942
952
|
});
|
|
943
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBHZXRGaWxlUGFyYW1zLFxuICBQYXRoT3JGaWxlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVN0cmluZyxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVGaWxlVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBlc2NhcGVBbGlhcyxcbiAgaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgaXNQYXJzZUxpbmtSZWZlcmVuY2UsXG4gIHBhcnNlTGlua1xufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gJ1xcXFx8JztcblxuLyoqXG4gKiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHVuZXNjYXBlZCBwaXBlcy5cbiAqL1xuY29uc3QgVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQID0gLyg/PCFcXFxcKVxcfC9nO1xuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1BhdGhTdHlsZSB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGFic29sdXRlIHBhdGggaW4gdGhlIHZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL2Zyb20vdGhlL3ZhdWx0L3Jvb3QvdGFyZ2V0XV1gXG4gICAqL1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBwYXRoIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1suLi8uLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHNob3J0ZXN0IHBhdGggd2hlbiBwb3NzaWJsZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbc2hvcnRlc3QtcGF0aC10by10YXJnZXRdXWBcbiAgICovXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAqL1xuZXhwb3J0IGVudW0gTGlua1N0eWxlIHtcbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIG1hcmtkb3duIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFthbGlhc10ocGF0aC90by90YXJnZXQubWQpYFxuICAgKi9cbiAgTWFya2Rvd24gPSAnTWFya2Rvd24nLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIGRlZmF1bHQgbGluayBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBQcmVzZXJ2ZSB0aGUgZXhpc3RpbmcgbGluayBzdHlsZS5cbiAgICovXG4gIFByZXNlcnZlRXhpc3RpbmcgPSAnUHJlc2VydmVFeGlzdGluZycsXG5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSBsaW5rIHRvIGJlIGluIHdpa2lsaW5rIGZvcm1hdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXRdXWBcbiAgICogQGV4YW1wbGUgYFtbcGF0aC90by90YXJnZXR8YWxpYXNdXWBcbiAgICovXG4gIFdpa2lsaW5rID0gJ1dpa2lsaW5rJ1xufVxuXG5lbnVtIEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlTm90ZScsXG4gIFNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSA9ICdTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUnXG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRCYWNrbGlua3NPcHRpb25zID0gUHJvY2Vzc09wdGlvbnM7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRCYWNrbGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRCYWNrbGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0QmFja2xpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgbGlua0NvbnZlcnRlcih0aGlzOiB2b2lkLCBsaW5rOiBSZWZlcmVuY2UpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIGVkaXQgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlblxuICAgKiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzbyByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBlYWNoIGV4dGVybmFsIGxpbmsgd2l0aGluIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSAoZWFjaCBsb2NhdGVkIGJ5IGl0cyBvZmZzZXRzLCBzbyBvbmx5IHRoYXQgbGluayBpcyBzcGxpY2VkIGJhY2sgaW4gcGxhY2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRMaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRMaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0TGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXh0cmFjdExpbmtGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TGlua0ZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIElmIGBmYWxzZWAgYW5kIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGFuZCB7QGxpbmsgc291cmNlUGF0aE9yRmlsZX0gYXJlIHRoZSBzYW1lIGZpbGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbI3N1YnBhdGhdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3NvdXJjZSNzdWJwYXRoXV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBpc0VtYmVkfVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1NvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXNlIGFuZ2xlIGJyYWNrZXRzLiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzV2lraWxpbmt9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFJlc2V0QWxpYXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW1pdCB0aGUgbm9ybWFsaXplZCBsaW5rcyB3aXRoIGFuZ2xlIGJyYWNrZXRzIGFuZCByYXcgc3BhY2VzIGluc3RlYWQgb2YgYCUyMGAtZW5jb2RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBtYXJrZG93biBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1RhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luRmlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua3NJbkZpbGVQYXJhbXMgZXh0ZW5kcyBQcm9jZXNzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBmaWxlIHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGx9LlxuICovXG5pbnRlcmZhY2UgRml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWV0YWRhdGEgY2FjaGUgdG8gZml4IHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlOiBDYWNoZWRNZXRhZGF0YTtcblxuICAvKipcbiAgICogVGhlIGtleSBwYXRoIG9mIHRoZSBjdXJyZW50IHZhbHVlIHdpdGhpbiB0aGUgZnJvbnRtYXR0ZXIuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZnJvbnRtYXR0ZXIgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTGlua1RleHR9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVMaW5rVGV4dFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IGZpbGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRGaWxlOiBURmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rfS5cbiAqL1xuaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQSBjb25maWd1cmF0aW9uIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnOiBMaW5rQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGZvciBnZW5lcmF0aW5nIHRoZSBtYXJrZG93biBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd25MaW5rUGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlV2lraUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVXaWtpTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rVGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdldEZpbGVDaGFuZ2VzfS5cbiAqL1xuaW50ZXJmYWNlIEdldEZpbGVDaGFuZ2VzUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQSBtZXRhZGF0YSBjYWNoZSB0byBleHRyYWN0IHRoZSBsaW5rcyBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2FjaGUgYmVsb25ncyB0byBhIGNhbnZhcyBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDYW52YXNGaWxlQ2FjaGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSwgYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5KSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXIgdmFsdWVzKSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTGlua0NvbmZpZyB7XG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU6IEZpbmFsTGlua1BhdGhTdHlsZTtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkVXNlV2lraWxpbmtTdHlsZX0uXG4gKi9cbmludGVyZmFjZSBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbExpbms/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUYWJsZVBvc2l0aW9uIHtcbiAgZW5kOiBudW1iZXI7XG4gIHN0YXJ0OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkNvbnRlbnR9LlxuICovXG5pbnRlcmZhY2UgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIG5ldyBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKHBhcmFtczogQ29udmVydExpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgc291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG4gIGlmICghdGFyZ2V0RmlsZSkge1xuICAgIHJldHVybiBwYXJhbXMubGluay5vcmlnaW5hbDtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIGxpbms6IHBhcmFtcy5saW5rLFxuICAgIGxpbmtTdHlsZTogcGFyYW1zLmxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5vbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHBhcmFtcy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgYmFja2xpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGJhY2tsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYmFja2xpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0QmFja2xpbmtzKHBhcmFtczogRWRpdEJhY2tsaW5rc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKHsgYXBwLCBwYXRoT3JGaWxlLCAuLi5vcHRpb25zIH0pO1xuICBjb25zdCBiYWNrbGlua05vdGVQYXRocyA9IEFycmF5LmZyb20oYmFja2xpbmtzLmtleXMoKSk7XG4gIGxldCBwcm9jZXNzZWQgPSAwO1xuICBmb3IgKGNvbnN0IGJhY2tsaW5rTm90ZVBhdGggb2YgYmFja2xpbmtOb3RlUGF0aHMpIHtcbiAgICBjb25zdCBjdXJyZW50TGlua3MgPSBlbnN1cmVOb25OdWxsYWJsZShiYWNrbGlua3MuZ2V0KGJhY2tsaW5rTm90ZVBhdGgpKTtcbiAgICBjb25zdCBsaW5rSnNvbnMgPSBuZXcgU2V0PHN0cmluZz4oY3VycmVudExpbmtzLm1hcCgobGluaykgPT4gSlNPTi5zdHJpbmdpZnkobGluaykpKTtcbiAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgYXBwLFxuICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgY29uc3QgbGlua0pzb24gPSBKU09OLnN0cmluZ2lmeShsaW5rKTtcbiAgICAgICAgaWYgKCFsaW5rSnNvbnMuaGFzKGxpbmtKc29uKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsaW5rQ29udmVydGVyKGxpbmspO1xuICAgICAgfSxcbiAgICAgIHBhdGhPckZpbGU6IGJhY2tsaW5rTm90ZVBhdGgsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfSk7XG4gICAgcHJvY2Vzc2VkKys7XG4gICAgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/Lih7XG4gICAgICBjdXJyZW50UGF0aDogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIHByb2Nlc3NlZCxcbiAgICAgIHRvdGFsOiBiYWNrbGlua05vdGVQYXRocy5sZW5ndGhcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBmb3IgYSBmaWxlIG9yIHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rcyhwYXJhbXM6IEVkaXRMaW5rc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgYXdhaXQgYXBwbHlGaWxlQ2hhbmdlcyh7XG4gICAgYXBwLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKHsgYWJvcnRTaWduYWwsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBwYXRoT3JGaWxlLCB7XG4gICAgICAgIHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBmaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZSB9KTtcbiAgICAgIGNvbnN0IGNhY2hlZENvbnRlbnQgPSBhd2FpdCBhcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBpZiAoY29udGVudCAhPT0gY2FjaGVkQ29udGVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IGdldEZpbGVDaGFuZ2VzKHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogaXNDYW52YXNGaWxlKHBhdGhPckZpbGUpLFxuICAgICAgICBsaW5rQ29udmVydGVyLFxuICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcyBpbiB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIFRoZSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rc0luQ29udGVudChwYXJhbXM6IEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBsaW5rQ29udmVydGVyLCBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UgfSA9IHBhcmFtcztcbiAgbGV0IHsgYWJvcnRTaWduYWwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgYXBwbHlDb250ZW50Q2hhbmdlcyh7XG4gICAgYWJvcnRTaWduYWwsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHBhcnNlTWV0YWRhdGEoYXBwLCBjb250ZW50LCB7XG4gICAgICAgIHNob3VsZFBhcnNlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZ2V0RmlsZUNoYW5nZXMoe1xuICAgICAgICBhYm9ydFNpZ25hbCxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBmYWxzZSxcbiAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0sXG4gICAgY29udGVudCxcbiAgICBwYXRoOiAnJ1xuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhc3NlcnROb25OdWxsYWJsZShuZXdDb250ZW50LCAnRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGV4dHJhY3RpbmcgdGhlIGxpbmsgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShwYXJhbXM6IEV4dHJhY3RMaW5rRmlsZVBhcmFtcyk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlLFxuICAgIHNvdXJjZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGxpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgaWYgKGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGZ1bGxMaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xufVxuXG4vKipcbiAqIEZpeGVzIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyBpbiB0aGUgcHJvdmlkZWQgbWV0YWRhdGEgY2FjaGUuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG1ldGFkYXRhIGNhY2hlIHRvIGZpeCB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4uXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmcm9udG1hdHRlciBtYXJrZG93biBsaW5rcyB3ZXJlIGZpeGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzKGNhY2hlOiBDYWNoZWRNZXRhZGF0YSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbCh7IGNhY2hlLCBrZXk6ICcnLCB2YWx1ZTogY2FjaGUuZnJvbnRtYXR0ZXIgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcblxuICBjb25zdCBERUZBVUxUX1BBUkFNUzogUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4gPSB7XG4gICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkOiB0cnVlXG4gIH07XG5cbiAgY29uc3QgY3VzdG9tRGVmYXVsdFBhcmFtcyA9IGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpLm1hcCgoZGVmYXVsdFBhcmFtc0ZuKSA9PiBkZWZhdWx0UGFyYW1zRm4oKSk7XG4gIHBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfUEFSQU1TLCAuLi5jdXN0b21EZWZhdWx0UGFyYW1zLCBwYXJhbXMpO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuXG4gIHVzaW5nIF9yZWdpc3RyYXRpb24gPSByZWdpc3RlckZpbGVzKGFwcCwgW3RhcmdldEZpbGVdKTtcbiAgcmV0dXJuIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXMpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhdyBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBnZW5lcmF0aW5nIGEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKiBAcmV0dXJucyBBIHJhdyBtYXJrZG93biBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsocGFyYW1zOiBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IGVtYmVkUHJlZml4ID0gcGFyYW1zLmlzRW1iZWQgPyAnIScgOiAnJztcblxuICBpZiAocGFyYW1zLmlzV2lraWxpbmspIHtcbiAgICBjb25zdCBhbGlhc1BhcnQgPSBwYXJhbXMuYWxpYXMgPyBgfCR7cGFyYW1zLmFsaWFzfWAgOiAnJztcbiAgICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9W1ske3BhcmFtcy51cmx9JHthbGlhc1BhcnR9XV1gO1xuICB9XG5cbiAgY29uc3QgYWxpYXMgPSBwYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGNvbnN0IHNob3VsZEVzY2FwZUFsaWFzID0gcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBjb25zdCBlc2NhcGVkQWxpYXMgPSBzaG91bGRFc2NhcGVBbGlhcyA/IGVzY2FwZUFsaWFzKGFsaWFzKSA6IGFsaWFzO1xuXG4gIGNvbnN0IHVybCA9IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzXG4gICAgPyBgPCR7cGFyYW1zLnVybH0+YFxuICAgIDogZW5jb2RlVXJsKHBhcmFtcy51cmwpO1xuXG4gIGNvbnN0IHRpdGxlUGFydCA9IHBhcmFtcy50aXRsZSA/IGAgJHtKU09OLnN0cmluZ2lmeShwYXJhbXMudGl0bGUpfWAgOiAnJztcblxuICByZXR1cm4gYCR7ZW1iZWRQcmVmaXh9WyR7ZXNjYXBlZEFsaWFzfV0oJHt1cmx9JHt0aXRsZVBhcnR9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgc2hhcmVkLCBtdXRhYmxlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBkZWZhdWx0IHBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfS5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGlzIGludm9rZWQgb24gZXZlcnkge0BsaW5rIGdlbmVyYXRlTWFya2Rvd25MaW5rfSBjYWxsIGFuZCBpdHMgcmVzdWx0IGlzIG1lcmdlZCBpbnRvIHRoZSBwYXJhbXMgKGxhdGVyXG4gKiByZWdpc3RyYXRpb25zIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBidWlsdC1pbiBkZWZhdWx0cywgYnV0IG5ldmVyIG92ZXIgZXhwbGljaXRseSBwYXNzZWQgcGFyYW1zKS4gUmVnaXN0ZXIgZW50cmllc1xuICogYnkgYWRkaW5nIGEgYEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0NvbXBvbmVudGAgdG8gYSBjb21wb25lbnQgdHJlZSByYXRoZXIgdGhhbiBtdXRhdGluZyB0aGlzIGxpc3QgZGlyZWN0bHkuXG4gKlxuICogQHJldHVybnMgVGhlIG11dGFibGUgbGlzdCBvZiBkZWZhdWx0LXBhcmFtcyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMoKTogKCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTwoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10+KCdnZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNGbnMnLCBbXSkudmFsdWU7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLlxcLy9nLFxuICAgIHN0cjogbm9ybWFsaXplUGF0aChlbnN1cmVOb25OdWxsYWJsZShkaXNwbGF5VGV4dC5zcGxpdCgnID4gJylbMF0pKVxuICB9KS50b0xvd2VyQ2FzZSgpO1xuXG4gIGZvciAoY29uc3QgYWxpYXMgb2YgYWxpYXNlc1RvUmVzZXQpIHtcbiAgICBpZiAoYWxpYXMudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShhbGlhcyk7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGFsaWFzLCBleHRuYW1lKGFsaWFzKSk7XG4gICAgaWYgKGpvaW4oZm9sZGVyLCBiYXNlKS50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKlxuICogQHBhcmFtIGxpbmsgLSBUaGUgbGluayB0byBzcGxpdC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN1YnBhdGgobGluazogc3RyaW5nKTogU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VMaW5rdGV4dChub3JtYWxpemVTdHJpbmcobGluaykpO1xuICByZXR1cm4ge1xuICAgIGxpbmtQYXRoOiBwYXJzZWQucGF0aCxcbiAgICBzdWJwYXRoOiBwYXJzZWQuc3VicGF0aFxuICB9O1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0QW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0RW1iZWQobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNFbWJlZCA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBoYXMgYSBsZWFkaW5nIGRvdCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1suL2xpbmtdXWAsIGBbdGl0bGVdKC4vbGluaylgLCBgW3RpdGxlXSg8Li9saW5rPilgLFxuICogYCFbWy4vbGlua11dYCwgYCFbdGl0bGVdKC4vbGluaylgLCBgIVt0aXRsZV0oPC4vbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIGRvdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVzdExlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1svbGlua11dYCwgYFt0aXRsZV0oL2xpbmspYCwgYFt0aXRsZV0oPC9saW5rPilgLFxuICogYCFbWy9saW5rXV1gLCBgIVt0aXRsZV0oL2xpbmspYCwgYCFbdGl0bGVdKDwvbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0TGVhZGluZ1NsYXNoKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcvJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0V2lraWxpbmsobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8uaXNXaWtpbGluayA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyB0byBhIHByZXR0eSBmb3JtLCBjb252ZXJ0aW5nIGJhY2tzbGFzaGVzIHRvIGZvcndhcmRcbiAqIHNsYXNoZXMuIE90aGVyIGxpbmtzIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIG5vcm1hbGl6aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCBub3JtYWxpemVkIGBmaWxlOi8vYCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdExpbmtzSW5Db250ZW50UGFyYW1zPih7XG4gICAgYWJvcnRTaWduYWw6IHBhcmFtcy5hYm9ydFNpZ25hbCxcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogdHJ1ZVxuICB9KSk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluIGEgZmlsZSB0byBhIHByZXR0eSBmb3JtLCBjb252ZXJ0aW5nIGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcy5cbiAqIE90aGVyIGxpbmtzIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIG5vcm1hbGl6aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlua3MgYXJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlVXJsTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVGaWxlVXJsTGlua3NJbkZpbGVQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPSBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IGVkaXRMaW5rcyh7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiBub3JtYWxpemVGaWxlVXJsTGluayhsaW5rLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzKSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIHVwZGF0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmsocGFyYW1zOiBVcGRhdGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMgPSB0cnVlXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBsaW5rLm9yaWdpbmFsO1xuICB9XG4gIGNvbnN0IG5ld1RhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBuZXdUYXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsXG4gIH0pKTtcblxuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkpIHtcbiAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gICAgaWYgKGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UobGluaykpIHtcbiAgICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuICAgIH1cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzO1xuXG4gIC8vIFJlZnJlc2ggYSBmaWxlLW5hbWUgYWxpYXMgdG8gdGhlIG5ldyBiYXNlIG5hbWUgd2hlbiB0aGUgZmxhZyBpcyBzZXQuXG4gIC8vIEEgZmlsZS1uYW1lIGFsaWFzIGVxdWFscyB0aGUgT0xEIGJhc2UgbmFtZSAod2l0aCBvciB3aXRob3V0IGV4dGVuc2lvbik7IGEgY3VzdG9tIGFsaWFzIGlzIGtlcHQuXG4gIC8vIEdhdGluZyBvbiB0aGUgZmxhZyBhbHNvIHJlZnJlc2hlcyB3aWtpbGlua3MgdGhhdCBjYXJyeSBhbiBleHBsaWNpdCBhbGlhcy5cbiAgLy8gVGhvc2UgcHJldmlvdXNseSBzaG9ydC1jaXJjdWl0ZWQgdGhlIHJlZnJlc2ggYW5kIGtlcHQgdGhlIHN0YWxlIG9sZCBiYXNlIG5hbWUuXG4gIGlmIChzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzU2luZ2xlU3VicGF0aEFsbG93ZWQ6IG9sZFNvdXJjZVBhdGggPT09IG9sZFRhcmdldFBhdGggJiYgISFwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc291cmNlUGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgfSkpO1xuICByZXR1cm4gbmV3TGluaztcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgY29udGVudCB3aXRoIHVwZGF0ZWQgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUxpbmtzSW5Db250ZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQoe1xuICAgIGFwcCxcbiAgICBjb250ZW50LFxuICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICBjb25zdCBpc0VtYmVkTGluayA9IHRlc3RFbWJlZChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIC4uLnBhcmFtcyxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSB0ZXN0RW1iZWQobGluay5vcmlnaW5hbCk7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnZlcnRMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxDb252ZXJ0TGlua1BhcmFtcz4oe1xuICAgICAgICBhcHAsXG4gICAgICAgIGxpbmssXG4gICAgICAgIGxpbmtTdHlsZSxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICAgICAgfSkpO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChwYXJhbXM6IEZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGxQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCB2YWx1ZTogY2hpbGRWYWx1ZSB9KTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICAgIGxpbmtUZXh0ID0gcmVsYXRpdmUoZGlybmFtZShzb3VyY2VQYXRoKSwgdGFyZ2V0RmlsZS5wYXRoKTtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyAmJiAhbGlua1RleHQuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgbGlua1RleHQgPSBgLi8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgICAgY29uc3Qgc2hvcnRlc3ROYW1lID0gaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgPyB0YXJnZXRGaWxlLmJhc2VuYW1lIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgICAgICBjb25zdCBtYXRjaGVkRmlsZXMgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRMaW5rcGF0aERlc3Qoc2hvcnRlc3ROYW1lLCBzb3VyY2VQYXRoKTtcbiAgICAgICAgbGlua1RleHQgPSBtYXRjaGVkRmlsZXMubGVuZ3RoID09PSAxICYmIG1hdGNoZWRGaWxlc1swXSA9PT0gdGFyZ2V0RmlsZSA/IHRhcmdldEZpbGUubmFtZSA6IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQWxsIHZhbGlkIEZpbmFsTGlua1BhdGhTdHlsZSB2YWx1ZXMgYXJlIGhhbmRsZWQgYWJvdmUuICovXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICBzdHI6IGxpbmtUZXh0LFxuICAgICAgc3VmZml4OiBgLiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YFxuICAgIH0pXG4gICAgOiBsaW5rVGV4dDtcbiAgbGlua1RleHQgKz0gc3VicGF0aDtcblxuICByZXR1cm4gbGlua1RleHQ7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rSW1wbChwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAgfSA9IHBhcmFtcztcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMuc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IHN1YnBhdGggPSBwYXJhbXMuc3VicGF0aCA/PyAnJztcblxuICBjb25zdCBsaW5rQ29uZmlnID0gZ2V0TGlua0NvbmZpZyhwYXJhbXMpO1xuICBjb25zdCBsaW5rVGV4dCA9IGdlbmVyYXRlTGlua1RleHQoe1xuICAgIGFwcCxcbiAgICBjb25maWc6IGxpbmtDb25maWcsXG4gICAgc291cmNlUGF0aCxcbiAgICBzdWJwYXRoLFxuICAgIHRhcmdldEZpbGVcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmtDb25maWcuaXNXaWtpbGlua1xuICAgID8gZ2VuZXJhdGVXaWtpTGluayh7XG4gICAgICBhbGlhczogcGFyYW1zLmFsaWFzLFxuICAgICAgaXNFbWJlZDogbGlua0NvbmZpZy5pc0VtYmVkLFxuICAgICAgbGlua1RleHRcbiAgICB9KVxuICAgIDogZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayh7XG4gICAgICBjb25maWc6IGxpbmtDb25maWcsXG4gICAgICBsaW5rVGV4dCxcbiAgICAgIG1hcmtkb3duTGlua1BhcmFtczogcGFyYW1zLFxuICAgICAgdGFyZ2V0RmlsZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgY29uZmlnLCBsaW5rVGV4dCwgbWFya2Rvd25MaW5rUGFyYW1zLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCBhbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5hbGlhcyA/PyAnJztcbiAgbGV0IHNob3VsZEVzY2FwZUFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzID8/IGZhbHNlO1xuICBpZiAoIWFsaWFzICYmIChpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSB8fCAhbWFya2Rvd25MaW5rUGFyYW1zLmlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCkpIHtcbiAgICBhbGlhcyA9ICFtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMgfHwgaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSlcbiAgICAgID8gdGFyZ2V0RmlsZS5iYXNlbmFtZVxuICAgICAgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgc2hvdWxkRXNjYXBlQWxpYXMgPSB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBhbGlhcyxcbiAgICBpc0VtYmVkOiBjb25maWcuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRFc2NhcGVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBjb25maWcuc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVdpa2lMaW5rKHBhcmFtczogR2VuZXJhdGVXaWtpTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYWxpYXMsIGlzRW1iZWQsIGxpbmtUZXh0IH0gPSBwYXJhbXM7XG4gIGlmIChhbGlhcz8udG9Mb3dlckNhc2UoKSA9PT0gbGlua1RleHQudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgICBpc0VtYmVkLFxuICAgICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICAgIHVybDogYWxpYXNcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiB0cnVlLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpbGVDaGFuZ2VzKHBhcmFtczogR2V0RmlsZUNoYW5nZXNQYXJhbXMpOiBQcm9taXNlPEZpbGVDaGFuZ2VbXT4ge1xuICBjb25zdCB7XG4gICAgY2FjaGUsXG4gICAgaXNDYW52YXNGaWxlQ2FjaGUsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlXG4gIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZXM6IEZpbGVDaGFuZ2VbXSA9IFtdO1xuXG4gIGNvbnN0IHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10gPSAoY2FjaGUuc2VjdGlvbnMgPz8gW10pLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi50eXBlID09PSAndGFibGUnKS5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgZW5kOiBzZWN0aW9uLnBvc2l0aW9uLmVuZC5vZmZzZXQsXG4gICAgc3RhcnQ6IHNlY3Rpb24ucG9zaXRpb24uc3RhcnQub2Zmc2V0XG4gIH0pKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0TGlua3MoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBuZXdDb250ZW50ID0gYXdhaXQgbGlua0NvbnZlcnRlcihsaW5rLCBhYm9ydFNpZ25hbCk7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlQ2hhbmdlID0gcmVmZXJlbmNlVG9GaWxlQ2hhbmdlKGxpbmssIG5ld0NvbnRlbnQpO1xuXG4gICAgaWYgKGlzQ2FudmFzRmlsZUNhY2hlKSB7XG4gICAgICBpZiAoaXNDYW52YXNDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5zdXBwb3J0ZWQgZmlsZSBjaGFuZ2UnLCBmaWxlQ2hhbmdlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OlxuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICBkZWZhdWx0OlxuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyB0ZXN0RW1iZWQocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdEFuZ2xlQnJhY2tldHMocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHNcbiAgICAgID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gdGVzdExlYWRpbmdEb3QocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IHRlc3RMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbms6IFJlZmVyZW5jZSwgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogYm9vbGVhbik6IE1heWJlUmV0dXJuPHN0cmluZz4ge1xuICBpZiAoaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZShsaW5rKSkge1xuICAgIGlmICghbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICBpZiAoIXBhcnNlTGlua1Jlc3VsdC5pc0ZpbGVVcmwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXM6IHBhcnNlTGlua1Jlc3VsdC5hbGlhcyxcbiAgICBpc0VtYmVkOiBwYXJzZUxpbmtSZXN1bHQuaXNFbWJlZCxcbiAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbm9ybWFsaXplRmlsZVVybChwYXJzZUxpbmtSZXN1bHQudXJsKVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHA6IEFwcCk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IG5ld0xpbmtGb3JtYXQgPSBnZXROZXdMaW5rRm9ybWF0KGFwcCk7XG4gIHN3aXRjaCAobmV3TGlua0Zvcm1hdCkge1xuICAgIGNhc2UgJ2Fic29sdXRlJzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDtcbiAgICBjYXNlICdyZWxhdGl2ZSc6XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIGNhc2UgJ3Nob3J0ZXN0JzpcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihuZXdMaW5rRm9ybWF0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZTogRmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnM6IFRhYmxlUG9zaXRpb25bXSk6IGJvb2xlYW4ge1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZ2V0RmlsZUNoYW5nZXMgb25seSBjYWxscyB0aGlzIGZvciBub24tY2FudmFzIGZpbGVzIHdoaWNoIGFsd2F5cyBoYXZlIGNvbnRlbnQgY2hhbmdlcy4gKi9cbiAgaWYgKCFpc0NvbnRlbnRDaGFuZ2UoZmlsZUNoYW5nZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cblxuICBpZiAoIVVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDpcbiAgICAgIHJldHVybiBzaG91bGRVc2VXaWtpbGlua3MoYXBwKTtcbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOlxuICAgICAgcmV0dXJuIG9yaWdpbmFsTGluayA9PT0gdW5kZWZpbmVkID8gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCkgOiB0ZXN0V2lraWxpbmsob3JpZ2luYWxMaW5rKTtcbiAgICBjYXNlIExpbmtTdHlsZS5XaWtpbGluazpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGRlZmF1bHQ6XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFlQSw2QkFBbUM7QUFDbkMsc0JBR087QUFZUCw4QkFBaUM7QUFDakMsMEJBQTRDO0FBQzVDLHNDQUF5QztBQUN6QyxrQkFNTztBQUNQLG9CQUlPO0FBQ1AseUJBSU87QUFDUCxpQkFBaUM7QUFDakMseUJBS087QUFDUCx5QkFNTztBQUNQLDRCQU1PO0FBQ1AsK0JBR087QUFDUCx3QkFNTztBQUNQLHVCQUdPO0FBRVAsTUFBTSwyQkFBMkI7QUFLakMsTUFBTSxvQ0FBb0M7QUFLbkMsSUFBSyxnQkFBTCxrQkFBS0EsbUJBQUw7QUFNTCxFQUFBQSxlQUFBLHlCQUFzQjtBQUt0QixFQUFBQSxlQUFBLDZCQUEwQjtBQU8xQixFQUFBQSxlQUFBLDZCQUEwQjtBQU8xQixFQUFBQSxlQUFBLDhCQUEyQjtBQXpCakIsU0FBQUE7QUFBQSxHQUFBO0FBK0JMLElBQUssWUFBTCxrQkFBS0MsZUFBTDtBQU1MLEVBQUFBLFdBQUEsY0FBVztBQUtYLEVBQUFBLFdBQUEsNkJBQTBCO0FBSzFCLEVBQUFB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O0FBQUEsRUFDVDtBQUVBLFNBQU8sZUFBZSxLQUFLLENBQUMsa0JBQWtCLGNBQWMsU0FBUyxXQUFXLFVBQVUsU0FBUyxNQUFNLFVBQVUsV0FBVyxVQUFVLFNBQVMsSUFBSSxVQUFVLGNBQWMsR0FBRztBQUNsTDtBQUVBLFNBQVMsdUJBQXVCLFFBQStDO0FBQzdFLFFBQU0sRUFBRSxLQUFLLFdBQVcsYUFBYSxJQUFJO0FBQ3pDLFFBQU0sZ0JBQWdCLGFBQWE7QUFDbkMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSztBQUNILGFBQU87QUFBQSxJQUNULEtBQUs7QUFDSCxpQkFBTyw2Q0FBbUIsR0FBRztBQUFBLElBQy9CLEtBQUs7QUFDSCxhQUFPLGlCQUFpQixhQUFZLDZDQUFtQixHQUFHLElBQUksYUFBYSxZQUFZO0FBQUEsSUFDekYsS0FBSztBQUNILGFBQU87QUFBQSxJQUNUO0FBQ0UsMENBQVksYUFBYTtBQUFBLEVBQzdCO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkxpbmtQYXRoU3R5bGUiLCAiTGlua1N0eWxlIl0KfQo=
|
|
953
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdC9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vZmlsZS1jaGFuZ2UudHMnO1xuaW1wb3J0IHR5cGUge1xuICBHZXRGaWxlUGFyYW1zLFxuICBQYXRoT3JGaWxlXG59IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlciB9IGZyb20gJy4vbGluay11cGRhdGUtcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vdmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vYWJvcnQtY29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVN0cmluZyxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICcuLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVGaWxlVXJsIH0gZnJvbSAnLi4vdXJsLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBlc2NhcGVBbGlhcyxcbiAgaXNQYXJzZUxpbmtGcm9udG1hdHRlclJlZmVyZW5jZSxcbiAgaXNQYXJzZUxpbmtSZWZlcmVuY2UsXG4gIHBhcnNlTGlua1xufSBmcm9tICcuL3BhcnNlLWxpbmsudHMnO1xuaW1wb3J0IHtcbiAgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gU3RyaW5nLnJhd2BcXHxgO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBjb252ZXJ0TGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udmVydExpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtTdHlsZT86IExpbmtTdHlsZTtcblxuICAvKipcbiAgICogQSBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEJhY2tsaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRCYWNrbGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICBsaW5rQ29udmVydGVyKHRoaXM6IHZvaWQsIGxpbms6IFJlZmVyZW5jZSk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIHJlcG9ydGVyIGludm9rZWQgb25jZSBwZXIgYmFja2xpbmsgZmlsZSBhZnRlciBpdHMgbGlua3MgYXJlIHVwZGF0ZWQsIHdpdGggdGhlIHJ1bm5pbmdcbiAgICogY291bnQgb2YgcHJvY2Vzc2VkIGZpbGVzIGFuZCB0aGUgdG90YWwuIFdoZW4gb21pdHRlZCwgbm8gcHJvZ3Jlc3MgaXMgcmVwb3J0ZWQuXG4gICAqL1xuICByZWFkb25seSBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj86IExpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIGVkaXQgdGhlIGJhY2tsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3NJbkNvbnRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgdG8gZWRpdCB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdExpbmtzT3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0TGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVkaXRMaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRMaW5rc09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlKTogUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBsaW5rcyBmb3IuXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSB0aGUgbm90ZSBib2R5LiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBmcm9udG1hdHRlciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIG11bHRpLWxpbmsgKG11bHRpLXZhbHVlKSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW5cbiAgICogYHRydWVgLCB0aGUgY29udmVydGVyIGFsc28gcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZWFjaCBleHRlcm5hbCBsaW5rIHdpdGhpbiBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgKGVhY2ggbG9jYXRlZCBieSBpdHMgb2Zmc2V0cywgc28gb25seSB0aGF0IGxpbmsgaXMgc3BsaWNlZCBiYWNrIGluIHBsYWNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBleHRyYWN0TGlua0ZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RMaW5rRmlsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSBjYWNoZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWxpYXMgZm9yIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1thbGlhc3xsaW5rXV1gXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKGxpbmsubWQpYFxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIGJlIGVtYmVkZGVkLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGZpbGUgdHlwZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtbdGFyZ2V0XV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1t0YXJnZXRdXWAuXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogSWYgYGZhbHNlYCBhbmQge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGlzIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gYW5kIHtAbGluayBzb3VyY2VQYXRoT3JGaWxlfSBhcmUgdGhlIHNhbWUgZmlsZS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1sjc3VicGF0aF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbc291cmNlI3N1YnBhdGhdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICpcbiAgICogSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBpbmZlciB0aGUgdmFsdWVzIG9mXG4gICAqXG4gICAqIC0ge0BsaW5rIGhhc0VtYmVkU3ludGF4fVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFc2NhcGVBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgYXR0YWNobWVudCBleHRlbnNpb24gaW4gdGhlIGVtYmVkIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2Zvby5wbmddKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1NvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGggb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIFNob3VsZCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGAjYC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLWVtcHR5LXN1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoI25lc3RlZC1zdWJwYXRoXV1gXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLiBEZWZhdWx0cyB0byBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsaW5rIHNob3VsZCBiZSBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBoYXNXaWtpbGlua1N5bnRheH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBoYXNXaWtpbGlua1N5bnRheH0gaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgc2hvdWxkUmVzZXRBbGlhc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICAvKipcbiAgICogQSBsaW5rIHBhdGguXG4gICAqL1xuICByZWFkb25seSBsaW5rUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN1YnBhdGguXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFib3J0IHNpZ25hbCB0byBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUxpbmtzSW5GaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgdG8gdXBkYXRlIHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIG9ubHkgZW1iZWRkZWQgbGlua3MuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbH0uXG4gKi9cbmludGVyZmFjZSBGaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBtZXRhZGF0YSBjYWNoZSB0byBmaXggdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGU6IENhY2hlZE1ldGFkYXRhO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHBhdGggb2YgdGhlIGN1cnJlbnQgdmFsdWUgd2l0aGluIHRoZSBmcm9udG1hdHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmcm9udG1hdHRlciB2YWx1ZSB0byBpbnNwZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIGxpbmtDb252ZXJ0ZXIodGhpczogdm9pZCwgbGluazogUmVmZXJlbmNlLCBhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgZXh0ZXJuYWwgbGlua3MgKHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzKSBpbiB0aGUgY2hhbmdlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gbXVsdGktbGluayBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMaW5rQ29uZmlnIHtcbiAgcmVhZG9ubHkgaXNFbWJlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNXaWtpbGluazogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZTogRmluYWxMaW5rUGF0aFN0eWxlO1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRVc2VXaWtpbGlua1N0eWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICBlbmQ6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBvbmx5IGVtYmVkZGVkIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsaW5rIHRvIGEgbmV3IHBhdGguXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBjb252ZXJ0aW5nIHRoZSBsaW5rLlxuICogQHJldHVybnMgVGhlIGNvbnZlcnRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydExpbmsocGFyYW1zOiBDb252ZXJ0TGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoe1xuICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICBzb3VyY2VQYXRoT3JGaWxlOiBwYXJhbXMub2xkU291cmNlUGF0aE9yRmlsZSA/PyBwYXJhbXMubmV3U291cmNlUGF0aE9yRmlsZVxuICB9KTtcbiAgaWYgKCF0YXJnZXRGaWxlKSB7XG4gICAgcmV0dXJuIHBhcmFtcy5saW5rLm9yaWdpbmFsO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtQYXJhbXM+KHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGU6IHBhcmFtcy5uZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IHRhcmdldEZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhczogcGFyYW1zLnNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSkpO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGNvbnN0IGJhY2tsaW5rTm90ZVBhdGhzID0gWy4uLmJhY2tsaW5rcy5rZXlzKCldO1xuICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgZm9yIChjb25zdCBiYWNrbGlua05vdGVQYXRoIG9mIGJhY2tsaW5rTm90ZVBhdGhzKSB7XG4gICAgY29uc3QgY3VycmVudExpbmtzID0gZW5zdXJlTm9uTnVsbGFibGUoYmFja2xpbmtzLmdldChiYWNrbGlua05vdGVQYXRoKSk7XG4gICAgY29uc3QgbGlua0pzb25zID0gbmV3IFNldDxzdHJpbmc+KGN1cnJlbnRMaW5rcy5tYXAoKGxpbmspID0+IEpTT04uc3RyaW5naWZ5KGxpbmspKSk7XG4gICAgYXdhaXQgZWRpdExpbmtzKHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmtDb252ZXJ0ZXI6IChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmtKc29uID0gSlNPTi5zdHJpbmdpZnkobGluayk7XG4gICAgICAgIGlmICghbGlua0pzb25zLmhhcyhsaW5rSnNvbikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGlua0NvbnZlcnRlcihsaW5rKTtcbiAgICAgIH0sXG4gICAgICBwYXRoT3JGaWxlOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH0pO1xuICAgIHByb2Nlc3NlZCsrO1xuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPy4oe1xuICAgICAgY3VycmVudFBhdGg6IGJhY2tsaW5rTm90ZVBhdGgsXG4gICAgICBwcm9jZXNzZWQsXG4gICAgICB0b3RhbDogYmFja2xpbmtOb3RlUGF0aHMubGVuZ3RoXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFZGl0cyB0aGUgbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGhhdmUgYmVlbiBlZGl0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3MocGFyYW1zOiBFZGl0TGlua3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIHBhdGhPckZpbGUsXG4gICAgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoe1xuICAgIGFwcCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICh7IGFib3J0U2lnbmFsLCBjb250ZW50IH0pID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgZ2V0Q2FjaGVTYWZlKGFwcCwgcGF0aE9yRmlsZSwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgZmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGUgfSk7XG4gICAgICBjb25zdCBjYWNoZWRDb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgaWYgKGNvbnRlbnQgIT09IGNhY2hlZENvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCBnZXRGaWxlQ2hhbmdlcyh7XG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjYWNoZSxcbiAgICAgICAgaXNDYW52YXNGaWxlQ2FjaGU6IGlzQ2FudmFzRmlsZShwYXRoT3JGaWxlKSxcbiAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcGF0aE9yRmlsZSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBsaW5rcyBpbiBhIGNvbnRlbnQgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgbGlua3MgaW4gdGhlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyBUaGUgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0TGlua3NJbkNvbnRlbnQocGFyYW1zOiBFZGl0TGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGFwcCwgY29udGVudCwgbGlua0NvbnZlcnRlciwgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSwgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGFwcGx5Q29udGVudENoYW5nZXMoe1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGNoYW5nZXNQcm92aWRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCBwYXJzZU1ldGFkYXRhKGFwcCwgY29udGVudCwge1xuICAgICAgICBzaG91bGRQYXJzZUV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzLFxuICAgICAgICBzaG91bGRQYXJzZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSk7XG4gICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGdldEZpbGVDaGFuZ2VzKHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogZmFsc2UsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgICAgIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzXG4gICAgICB9KTtcbiAgICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICByZXR1cm4gY2hhbmdlcztcbiAgICB9LFxuICAgIGNvbnRlbnQsXG4gICAgcGF0aDogJydcbiAgfSk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3Q29udGVudCwgJ0ZhaWxlZCB0byB1cGRhdGUgbGlua3MgaW4gY29udGVudCcpO1xuXG4gIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIGxpbmsuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBleHRyYWN0aW5nIHRoZSBsaW5rIGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmssIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlua0ZpbGUocGFyYW1zOiBFeHRyYWN0TGlua0ZpbGVQYXJhbXMpOiBudWxsIHwgVEZpbGUge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmssXG4gICAgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGUgPSBmYWxzZSxcbiAgICBzb3VyY2VQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHsgbGlua1BhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBmaWxlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QobGlua1BhdGgsIHNvdXJjZVBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgaWYgKCFzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGxpbmtQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBsaW5rUGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICB9XG5cbiAgY29uc3QgZnVsbExpbmtQYXRoID0gam9pbihkaXJuYW1lKHNvdXJjZVBhdGgpLCBgLi8ke2xpbmtQYXRofWApO1xuXG4gIGlmIChmdWxsTGlua1BhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBmdWxsTGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBGaXhlcyB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3MgaW4gdGhlIHByb3ZpZGVkIG1ldGFkYXRhIGNhY2hlLlxuICpcbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBtZXRhZGF0YSBjYWNoZSB0byBmaXggdGhlIGZyb250bWF0dGVyIG1hcmtkb3duIGxpbmtzIGluLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZnJvbnRtYXR0ZXIgbWFya2Rvd24gbGlua3Mgd2VyZSBmaXhlZC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gVGhlIG5hbWUgc3RhdGVzIHRoZSBhY3Rpb247IHRoZSBib29sZWFuIG9ubHkgcmVwb3J0cyB3aGV0aGVyIGFueXRoaW5nIHdhcyBmaXhlZC5cbmV4cG9ydCBmdW5jdGlvbiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3MoY2FjaGU6IENhY2hlZE1ldGFkYXRhKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaXhGcm9udG1hdHRlck1hcmtkb3duTGlua3NJbXBsKHsgY2FjaGUsIGtleTogJycsIHZhbHVlOiBjYWNoZS5mcm9udG1hdHRlciB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRnVuY3Rpb24pID0+IGRlZmF1bHRQYXJhbXNGdW5jdGlvbigpKTtcbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHBhcmFtcyk7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG5cbiAgdXNpbmcgX3JlZ2lzdHJhdGlvbiA9IHJlZ2lzdGVyRmlsZXMoYXBwLCBbdGFyZ2V0RmlsZV0pO1xuICByZXR1cm4gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtcyk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmF3IG1hcmtkb3duIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGdlbmVyYXRpbmcgYSByYXcgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIEEgcmF3IG1hcmtkb3duIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhwYXJhbXM6IEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgZW1iZWRQcmVmaXggPSBwYXJhbXMuaXNFbWJlZCA/ICchJyA6ICcnO1xuXG4gIGlmIChwYXJhbXMuaXNXaWtpbGluaykge1xuICAgIGNvbnN0IGFsaWFzUGFydCA9IHBhcmFtcy5hbGlhcyA/IGB8JHtwYXJhbXMuYWxpYXN9YCA6ICcnO1xuICAgIHJldHVybiBgJHtlbWJlZFByZWZpeH1bWyR7cGFyYW1zLnVybH0ke2FsaWFzUGFydH1dXWA7XG4gIH1cblxuICBjb25zdCBhbGlhcyA9IHBhcmFtcy5hbGlhcyA/PyAnJztcbiAgY29uc3Qgc2hvdWxkRXNjYXBlQWxpYXMgPSBwYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGNvbnN0IGVzY2FwZWRBbGlhcyA9IHNob3VsZEVzY2FwZUFsaWFzID8gZXNjYXBlQWxpYXMoYWxpYXMpIDogYWxpYXM7XG5cbiAgY29uc3QgdXJsID0gcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHNcbiAgICA/IGA8JHtwYXJhbXMudXJsfT5gXG4gICAgOiBlbmNvZGVVcmwocGFyYW1zLnVybCk7XG5cbiAgY29uc3QgdGl0bGVQYXJ0ID0gcGFyYW1zLnRpdGxlID8gYCAke0pTT04uc3RyaW5naWZ5KHBhcmFtcy50aXRsZSl9YCA6ICcnO1xuXG4gIHJldHVybiBgJHtlbWJlZFByZWZpeH1bJHtlc2NhcGVkQWxpYXN9XSgke3VybH0ke3RpdGxlUGFydH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaGFyZWQsIG11dGFibGUgbGlzdCBvZiBmdW5jdGlvbnMgdGhhdCBwcm92aWRlIGRlZmF1bHQgcGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gaXMgaW52b2tlZCBvbiBldmVyeSB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9IGNhbGwgYW5kIGl0cyByZXN1bHQgaXMgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyAobGF0ZXJcbiAqIHJlZ2lzdHJhdGlvbnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGJ1aWx0LWluIGRlZmF1bHRzLCBidXQgbmV2ZXIgb3ZlciBleHBsaWNpdGx5IHBhc3NlZCBwYXJhbXMpLiBSZWdpc3RlciBlbnRyaWVzXG4gKiBieSBhZGRpbmcgYSBgR2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zQ29tcG9uZW50YCB0byBhIGNvbXBvbmVudCB0cmVlIHJhdGhlciB0aGFuIG11dGF0aW5nIHRoaXMgbGlzdCBkaXJlY3RseS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbXV0YWJsZSBsaXN0IG9mIGRlZmF1bHQtcGFyYW1zIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucygpOiAoKCkgPT4gUGFydGlhbDxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4pW10ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlPCgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXT4oJ2dlbmVyYXRlTWFya2Rvd25MaW5rRGVmYXVsdFBhcmFtc0ZucycsIFtdKS52YWx1ZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbdGl0bGVdKDxsaW5rPilgLCBgIVt0aXRsZV0oPGxpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgdXNlcyBhbmdsZSBicmFja2V0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQW5nbGVCcmFja2V0cyhsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5oYXNBbmdsZUJyYWNrZXRzID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGlzIGFuIGVtYmVkIGxpbms6XG4gKiBgIVtbbGlua11dYCwgYCFbdGl0bGVdKGxpbmspYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWJlZFN5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc0VtYmVkID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90LCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbWy4vbGlua11dYCwgYFt0aXRsZV0oLi9saW5rKWAsIGBbdGl0bGVdKDwuL2xpbms+KWAsXG4gKiBgIVtbLi9saW5rXV1gLCBgIVt0aXRsZV0oLi9saW5rKWAsIGAhW3RpdGxlXSg8Li9saW5rPilgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGhhcyBhIGxlYWRpbmcgZG90XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nRG90KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcuLycpID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIGhhcyBhIGxlYWRpbmcgc2xhc2gsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbL2xpbmtdXWAsIGBbdGl0bGVdKC9saW5rKWAsIGBbdGl0bGVdKDwvbGluaz4pYCxcbiAqIGAhW1svbGlua11dYCwgYCFbdGl0bGVdKC9saW5rKWAsIGAhW3RpdGxlXSg8L2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzTGVhZGluZ1NsYXNoKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LnVybC5zdGFydHNXaXRoKCcvJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYSB3aWtpbGluaywgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1tsaW5rXV1gLCBgIVtbbGlua11dYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBpcyBhIHdpa2lsaW5rXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNXaWtpbGlua1N5bnRheChsaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmspO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0Py5pc1dpa2lsaW5rID8/IGZhbHNlO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGFsaWFzIG9mIGEgbGluayBzaG91bGQgYmUgcmVzZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICogQHJldHVybnMgV2hldGhlciB0aGUgYWxpYXMgc2hvdWxkIGJlIHJlc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkUmVzZXRBbGlhcyhwYXJhbXM6IFNob3VsZFJlc2V0QWxpYXNQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBkaXNwbGF5VGV4dCxcbiAgICBpc1dpa2lsaW5rLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkU291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRUYXJnZXRQYXRoLFxuICAgIHRhcmdldFBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgaWYgKGlzV2lraWxpbmsgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFkaXNwbGF5VGV4dCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IHRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbiAgY29uc3QgbmV3U291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkU291cmNlUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRTb3VyY2VQYXRoT3JGaWxlID8/IG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBuZXdTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG5ld1NvdXJjZVBhdGgpO1xuICBjb25zdCBvbGRTb3VyY2VGb2xkZXIgPSBkaXJuYW1lKG9sZFNvdXJjZVBhdGgpO1xuICBjb25zdCBhbGlhc2VzVG9SZXNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGF0aE9yRmlsZSBvZiBbdGFyZ2V0RmlsZS5wYXRoLCBvbGRUYXJnZXRQYXRoXSkge1xuICAgIGlmICghcGF0aE9yRmlsZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocGF0aCk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGJhc2VuYW1lKHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUobmV3U291cmNlRm9sZGVyLCBwYXRoKSk7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKHJlbGF0aXZlKG9sZFNvdXJjZUZvbGRlciwgcGF0aCkpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIFtvbGRTb3VyY2VQYXRoLCBuZXdTb3VyY2VQYXRoXSkge1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChhcHAubWV0YWRhdGFDYWNoZS5maWxlVG9MaW5rdGV4dCh0YXJnZXRGaWxlLCBzb3VyY2VQYXRoLCBmYWxzZSkpO1xuICB9XG5cbiAgY29uc3QgY2xlYW5EaXNwbGF5VGV4dCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IG5vcm1hbGl6ZVBhdGgoZW5zdXJlTm9uTnVsbGFibGUoZGlzcGxheVRleHQuc3BsaXQoJyA+ICcsIDEpWzBdKSksXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAvXlxcLlxcLy9nXG4gIH0pLnRvTG93ZXJDYXNlKCk7XG5cbiAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzVG9SZXNldCkge1xuICAgIGlmIChhbGlhcy50b0xvd2VyQ2FzZSgpID09PSBjbGVhbkRpc3BsYXlUZXh0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGFsaWFzKTtcbiAgICBjb25zdCBiYXNlID0gYmFzZW5hbWUoYWxpYXMsIGV4dG5hbWUoYWxpYXMpKTtcbiAgICBpZiAoam9pbihmb2xkZXIsIGJhc2UpLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBTcGxpdHMgYSBsaW5rIGludG8gaXRzIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRvIHNwbGl0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGxpbmsgcGF0aCBhbmQgc3VicGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3VicGF0aChsaW5rOiBzdHJpbmcpOiBTcGxpdFN1YnBhdGhSZXN1bHQge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUxpbmt0ZXh0KG5vcm1hbGl6ZVN0cmluZyhsaW5rKSk7XG4gIHJldHVybiB7XG4gICAgbGlua1BhdGg6IHBhcnNlZC5wYXRoLFxuICAgIHN1YnBhdGg6IHBhcnNlZC5zdWJwYXRoXG4gIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkXG4gKiBzbGFzaGVzLiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IHdpdGggbm9ybWFsaXplZCBgZmlsZTovL2AgbGlua3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVGaWxlVXJsTGlua3NJbkNvbnRlbnRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IGFwcCwgY29udGVudCwgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsOiBwYXJhbXMuYWJvcnRTaWduYWwsXG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWVcbiAgfSkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGZpbGUgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuXG4gKiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIGxpbmsgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSB1cGRhdGVkIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMaW5rKHBhcmFtczogVXBkYXRlTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBuZXdUYXJnZXRQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgb2xkVGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzID0gdHJ1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoIW5ld1RhcmdldFBhdGhPckZpbGUpIHtcbiAgICByZXR1cm4gbGluay5vcmlnaW5hbDtcbiAgfVxuICBjb25zdCBuZXdUYXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogbmV3VGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG9sZFRhcmdldFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkVGFyZ2V0UGF0aE9yRmlsZSA/PyBuZXdUYXJnZXRQYXRoT3JGaWxlKTtcbiAgY29uc3QgaXNXaWtpbGluayA9IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICBhcHAsXG4gICAgbGlua1N0eWxlLFxuICAgIG9yaWdpbmFsTGluazogbGluay5vcmlnaW5hbFxuICB9KSk7XG5cbiAgY29uc3QgeyBzdWJwYXRoIH0gPSBzcGxpdFN1YnBhdGgobGluay5saW5rKTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gQ2FudmFzIGZpbGUgbm9kZSByZWZlcmVuY2UgYnJhbmNoIGlzIGhhcmQgdG8gcmVwcm9kdWNlIGluIHVuaXQgdGVzdHMuICovXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgaXNDYW52YXNGaWxlTm9kZVJlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybiBuZXdUYXJnZXRGaWxlLnBhdGggKyBzdWJwYXRoO1xuXG4gICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgfVxuXG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rLm9yaWdpbmFsKTtcbiAgbGV0IGFsaWFzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzV2lraWxpbmsgJiYgcGFyc2VMaW5rUmVzdWx0Py5hbGlhcykge1xuICAgIGFsaWFzID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICB9XG5cbiAgYWxpYXMgPz89IHNob3VsZFJlc2V0QWxpYXMobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFJlc2V0QWxpYXNQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGRpc3BsYXlUZXh0OiBsaW5rLmRpc3BsYXlUZXh0LFxuICAgICAgaXNXaWtpbGluayxcbiAgICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgb2xkVGFyZ2V0UGF0aCxcbiAgICAgIHRhcmdldFBhdGhPckZpbGU6IG5ld1RhcmdldEZpbGVcbiAgICB9KSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogcGFyc2VMaW5rUmVzdWx0Py5hbGlhcztcblxuICAvLyBSZWZyZXNoIGEgZmlsZS1uYW1lIGFsaWFzIHRvIHRoZSBuZXcgYmFzZSBuYW1lIHdoZW4gdGhlIGZsYWcgaXMgc2V0LlxuICAvLyBBIGZpbGUtbmFtZSBhbGlhcyBlcXVhbHMgdGhlIE9MRCBiYXNlIG5hbWUgKHdpdGggb3Igd2l0aG91dCBleHRlbnNpb24pOyBhIGN1c3RvbSBhbGlhcyBpcyBrZXB0LlxuICAvLyBHYXRpbmcgb24gdGhlIGZsYWcgYWxzbyByZWZyZXNoZXMgd2lraWxpbmtzIHRoYXQgY2FycnkgYW4gZXhwbGljaXQgYWxpYXMuXG4gIC8vIFRob3NlIHByZXZpb3VzbHkgc2hvcnQtY2lyY3VpdGVkIHRoZSByZWZyZXNoIGFuZCBrZXB0IHRoZSBzdGFsZSBvbGQgYmFzZSBuYW1lLlxuICBpZiAoc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcykge1xuICAgIGlmIChhbGlhcyA9PT0gYmFzZW5hbWUob2xkVGFyZ2V0UGF0aCwgZXh0bmFtZShvbGRUYXJnZXRQYXRoKSkpIHtcbiAgICAgIGFsaWFzID0gbmV3VGFyZ2V0RmlsZS5iYXNlbmFtZTtcbiAgICB9IGVsc2UgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLm5hbWU7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3TGluayA9IGdlbmVyYXRlTWFya2Rvd25MaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcz4oe1xuICAgIGFsaWFzLFxuICAgIGFwcCxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBvbGRTb3VyY2VQYXRoID09PSBvbGRUYXJnZXRQYXRoICYmICEhcGFyc2VMaW5rUmVzdWx0Py5hbGlhcyxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gIH0pKTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXNcbiAgfSA9IHBhcmFtcztcblxuICByZXR1cm4gYXdhaXQgZWRpdExpbmtzSW5Db250ZW50KHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChpc0NhbnZhc0ZpbGUobmV3U291cmNlUGF0aE9yRmlsZSkgJiYgIWFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkNhbnZhcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBlZGl0TGlua3Moe1xuICAgIC4uLnBhcmFtcyxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4ge1xuICAgICAgY29uc3QgaXNFbWJlZExpbmsgPSBoYXNFbWJlZFN5bnRheChsaW5rLm9yaWdpbmFsKTtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gdW5kZWZpbmVkICYmIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzICE9PSBpc0VtYmVkTGluaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udmVydExpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPENvbnZlcnRMaW5rUGFyYW1zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbGluayxcbiAgICAgICAgbGlua1N0eWxlLFxuICAgICAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzXG4gICAgICB9KSk7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlOiBuZXdTb3VyY2VQYXRoT3JGaWxlXG4gIH0pO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWJvb2xlYW4tbmFtZSAtLSBNaXJyb3JzIHRoZSBleHBvcnRlZCBmdW5jdGlvbiBpdCBpbXBsZW1lbnRzLlxuZnVuY3Rpb24gZml4RnJvbnRtYXR0ZXJNYXJrZG93bkxpbmtzSW1wbChwYXJhbXM6IEZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGxQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGtleSxcbiAgICB2YWx1ZVxuICB9ID0gcGFyYW1zO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayh2YWx1ZSk7XG4gICAgaWYgKCFwYXJzZUxpbmtSZXN1bHQgfHwgcGFyc2VMaW5rUmVzdWx0LmlzV2lraWxpbmsgfHwgcGFyc2VMaW5rUmVzdWx0LmlzRXh0ZXJuYWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzID8/PSBbXTtcbiAgICBsZXQgbGluayA9IGNhY2hlLmZyb250bWF0dGVyTGlua3MuZmluZCgoZnJvbnRtYXR0ZXJMaW5rKSA9PiBmcm9udG1hdHRlckxpbmsua2V5ID09PSBrZXkpO1xuXG4gICAgaWYgKCFsaW5rKSB7XG4gICAgICBsaW5rID0ge1xuICAgICAgICBrZXksXG4gICAgICAgIGxpbms6ICcnLFxuICAgICAgICBvcmlnaW5hbDogJydcbiAgICAgIH07XG4gICAgICBjYWNoZS5mcm9udG1hdHRlckxpbmtzLnB1c2gobGluayk7XG4gICAgfVxuXG4gICAgbGluay5saW5rID0gcGFyc2VMaW5rUmVzdWx0LnVybDtcbiAgICBsaW5rLm9yaWdpbmFsID0gdmFsdWU7XG4gICAgaWYgKHBhcnNlTGlua1Jlc3VsdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW5rLmRpc3BsYXlUZXh0ID0gcGFyc2VMaW5rUmVzdWx0LmFsaWFzO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgaGFzRnJvbnRtYXR0ZXJMaW5rcyA9IGZhbHNlO1xuXG4gIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSBhcyBHZW5lcmljT2JqZWN0KSkge1xuICAgIGNvbnN0IGhhc0NoaWxkRnJvbnRtYXR0ZXJMaW5rcyA9IGZpeEZyb250bWF0dGVyTWFya2Rvd25MaW5rc0ltcGwoeyBjYWNoZSwga2V5OiBrZXkgPyBgJHtrZXl9LiR7Y2hpbGRLZXl9YCA6IGNoaWxkS2V5LCB2YWx1ZTogY2hpbGRWYWx1ZSB9KTtcbiAgICBoYXNGcm9udG1hdHRlckxpbmtzIHx8PSBoYXNDaGlsZEZyb250bWF0dGVyTGlua3M7XG4gIH1cblxuICByZXR1cm4gaGFzRnJvbnRtYXR0ZXJMaW5rcztcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVMaW5rVGV4dChwYXJhbXM6IEdlbmVyYXRlTGlua1RleHRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCwgY29uZmlnLCBzdWJwYXRoLCB0YXJnZXRGaWxlIH0gPSBwYXJhbXM7XG4gIGxldCB7IHNvdXJjZVBhdGggfSA9IHBhcmFtcztcbiAgaWYgKHNvdXJjZVBhdGggPT09ICcvJykge1xuICAgIHNvdXJjZVBhdGggPSAnJztcbiAgfVxuXG4gIGxldCBsaW5rVGV4dDogc3RyaW5nO1xuXG4gIGlmICh0YXJnZXRGaWxlLnBhdGggPT09IHNvdXJjZVBhdGggJiYgc3VicGF0aCAmJiBjb25maWcuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCkge1xuICAgIGxpbmtUZXh0ID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCBicmFuY2hlcyBjb3ZlcmVkIGJ1dCB2OCByZXBvcnRzIHN3aXRjaCBhcyBwYXJ0aWFsLiAqL1xuICAgIHN3aXRjaCAoY29uZmlnLmxpbmtQYXRoU3R5bGUpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OiB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC8ke2xpbmtUZXh0fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZToge1xuICAgICAgICBsaW5rVGV4dCA9IHJlbGF0aXZlKGRpcm5hbWUoc291cmNlUGF0aCksIHRhcmdldEZpbGUucGF0aCk7XG4gICAgICAgIGlmIChjb25maWcuc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHMgJiYgIWxpbmtUZXh0LnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgICAgICAgIGxpbmtUZXh0ID0gYC4vJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICAgIGNvbnN0IHNob3J0ZXN0TmFtZSA9IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpID8gdGFyZ2V0RmlsZS5iYXNlbmFtZSA6IHRhcmdldEZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZEZpbGVzID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0TGlua3BhdGhEZXN0KHNob3J0ZXN0TmFtZSwgc291cmNlUGF0aCk7XG4gICAgICAgIGxpbmtUZXh0ID0gbWF0Y2hlZEZpbGVzLmxlbmd0aCA9PT0gMSAmJiBtYXRjaGVkRmlsZXNbMF0gPT09IHRhcmdldEZpbGUgPyB0YXJnZXRGaWxlLm5hbWUgOiB0YXJnZXRGaWxlLnBhdGg7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIEFsbCB2YWxpZCBGaW5hbExpbmtQYXRoU3R5bGUgdmFsdWVzIGFyZSBoYW5kbGVkIGFib3ZlLiAqL1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBhc3NlcnROZXZlcihjb25maWcubGlua1BhdGhTdHlsZSk7XG4gICAgICB9XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgfVxuICB9XG5cbiAgbGlua1RleHQgPSBjb25maWcuaXNXaWtpbGlua1xuICAgID8gdHJpbUVuZCh7XG4gICAgICAkc3RyaW5nOiBsaW5rVGV4dCxcbiAgICAgIHN1ZmZpeDogYC4ke01BUktET1dOX0ZJTEVfRVhURU5TSU9OfWBcbiAgICB9KVxuICAgIDogbGlua1RleHQ7XG4gIGxpbmtUZXh0ICs9IHN1YnBhdGg7XG5cbiAgcmV0dXJuIGxpbmtUZXh0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHRhcmdldEZpbGUgPSBnZXRGaWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlUGFyYW1zPih7IGFwcCwgcGF0aE9yRmlsZTogcGFyYW1zLnRhcmdldFBhdGhPckZpbGUsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogcGFyYW1zLmlzTm9uRXhpc3RpbmdGaWxlQWxsb3dlZCB9KSk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgcGFyYW1zLnNvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBzdWJwYXRoID0gcGFyYW1zLnN1YnBhdGggPz8gJyc7XG5cbiAgY29uc3QgbGlua0NvbmZpZyA9IGdldExpbmtDb25maWcocGFyYW1zKTtcbiAgY29uc3QgbGlua1RleHQgPSBnZW5lcmF0ZUxpbmtUZXh0KHtcbiAgICBhcHAsXG4gICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgIHNvdXJjZVBhdGgsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRGaWxlXG4gIH0pO1xuXG4gIHJldHVybiBsaW5rQ29uZmlnLmlzV2lraWxpbmtcbiAgICA/IGdlbmVyYXRlV2lraUxpbmsoe1xuICAgICAgYWxpYXM6IHBhcmFtcy5hbGlhcyxcbiAgICAgIGlzRW1iZWQ6IGxpbmtDb25maWcuaXNFbWJlZCxcbiAgICAgIGxpbmtUZXh0XG4gICAgfSlcbiAgICA6IGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsoe1xuICAgICAgY29uZmlnOiBsaW5rQ29uZmlnLFxuICAgICAgbGlua1RleHQsXG4gICAgICBtYXJrZG93bkxpbmtQYXJhbXM6IHBhcmFtcyxcbiAgICAgIHRhcmdldEZpbGVcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93blN0eWxlTGluayhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGNvbmZpZywgbGlua1RleHQsIG1hcmtkb3duTGlua1BhcmFtcywgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgYWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuYWxpYXMgPz8gJyc7XG4gIGxldCBzaG91bGRFc2NhcGVBbGlhcyA9IG1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgaWYgKCFhbGlhcyAmJiAoaXNNYXJrZG93bkZpbGUodGFyZ2V0RmlsZSkgfHwgIW1hcmtkb3duTGlua1BhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQpKSB7XG4gICAgYWxpYXMgPSAhbWFya2Rvd25MaW5rUGFyYW1zLnNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzIHx8IGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpXG4gICAgICA/IHRhcmdldEZpbGUuYmFzZW5hbWVcbiAgICAgIDogdGFyZ2V0RmlsZS5uYW1lO1xuICAgIHNob3VsZEVzY2FwZUFsaWFzID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayh7XG4gICAgYWxpYXMsXG4gICAgaXNFbWJlZDogY29uZmlnLmlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogZmFsc2UsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogY29uZmlnLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBsaW5rVGV4dFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVXaWtpTGluayhwYXJhbXM6IEdlbmVyYXRlV2lraUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFsaWFzLCBpc0VtYmVkLCBsaW5rVGV4dCB9ID0gcGFyYW1zO1xuICBpZiAoYWxpYXM/LnRvTG93ZXJDYXNlKCkgPT09IGxpbmtUZXh0LnRvTG93ZXJDYXNlKCkpIHtcbiAgICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgICAgaXNFbWJlZCxcbiAgICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgICB1cmw6IGFsaWFzXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQsXG4gICAgaXNXaWtpbGluazogdHJ1ZSxcbiAgICB1cmw6IGxpbmtUZXh0XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgZm9yIChjb25zdCBsaW5rIG9mIGdldExpbmtzKHsgY2FjaGUsIHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzLCBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzLCBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyB9KSkge1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgY29uc3QgbmV3Q29udGVudCA9IGF3YWl0IGxpbmtDb252ZXJ0ZXIobGluaywgYWJvcnRTaWduYWwpO1xuICAgIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgaWYgKG5ld0NvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZUNoYW5nZSA9IHJlZmVyZW5jZVRvRmlsZUNoYW5nZShsaW5rLCBuZXdDb250ZW50KTtcblxuICAgIGlmIChpc0NhbnZhc0ZpbGVDYWNoZSkge1xuICAgICAgaWYgKGlzQ2FudmFzQ2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Vuc3VwcG9ydGVkIGZpbGUgY2hhbmdlJywgZmlsZUNoYW5nZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG91bGRFc2NhcGVXaWtpbGlua0RpdmlkZXIoZmlsZUNoYW5nZSwgdGFibGVQb3NpdGlvbnMpKSB7XG4gICAgICAgIGZpbGVDaGFuZ2UubmV3Q29udGVudCA9IGZpbGVDaGFuZ2UubmV3Q29udGVudC5yZXBsYWNlQWxsKFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCwgKCkgPT4gRVNDQVBFRF9XSUtJTElOS19ESVZJREVSKTtcbiAgICAgIH1cblxuICAgICAgY2hhbmdlcy5wdXNoKGZpbGVDaGFuZ2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2hhbmdlcztcbn1cblxuZnVuY3Rpb24gZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcDogQXBwLCBsaW5rUGF0aFN0eWxlPzogTGlua1BhdGhTdHlsZSk6IEZpbmFsTGlua1BhdGhTdHlsZSB7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rUGF0aFN0eWxlID8/IExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0OiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHJlc29sdmVGaW5hbExpbmtQYXRoU3R5bGVGcm9tT2JzaWRpYW5TZXR0aW5ncyhhcHApO1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U7XG4gICAgfVxuICAgIGNhc2UgTGlua1BhdGhTdHlsZS5TaG9ydGVzdFBhdGhXaGVuUG9zc2libGU6IHtcbiAgICAgIHJldHVybiBGaW5hbExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGlua0NvbmZpZyhwYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zKTogTGlua0NvbmZpZyB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgaXNFbWJlZDogcGFyYW1zLmlzRW1iZWQgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNFbWJlZFN5bnRheChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IGZhbHNlKSxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBwYXJhbXMuaXNTaW5nbGVTdWJwYXRoQWxsb3dlZCA/PyB0cnVlLFxuICAgIGlzV2lraWxpbms6IHNob3VsZFVzZVdpa2lsaW5rU3R5bGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXM+KHtcbiAgICAgIGFwcCxcbiAgICAgIGxpbmtTdHlsZTogcGFyYW1zLmxpbmtTdHlsZSxcbiAgICAgIG9yaWdpbmFsTGluazogcGFyYW1zLm9yaWdpbmFsTGlua1xuICAgIH0pKSxcbiAgICBsaW5rUGF0aFN0eWxlOiBnZXRGaW5hbExpbmtQYXRoU3R5bGUoYXBwLCBwYXJhbXMubGlua1BhdGhTdHlsZSksXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNBbmdsZUJyYWNrZXRzKHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0xlYWRpbmdEb3QocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICA/PyAocGFyYW1zLm9yaWdpbmFsTGluayA/IGhhc0xlYWRpbmdTbGFzaChwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRmlsZVVybExpbmsobGluazogUmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogTWF5YmVSZXR1cm48c3RyaW5nPiB7XG4gIGlmIChpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgaWYgKCFsaW5rLnBhcnNlTGlua1Jlc3VsdC5pc0ZpbGVVcmwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBIGZyb250bWF0dGVyIHZhbHVlIGhvbGRzIGEgYmFyZSBVUkwgKHJlLXNlcmlhbGl6ZWQvcXVvdGVkIGFzIFlBTUwpLCBub3QgYSBgW2FsaWFzXSh1cmwpYCBtYXJrZG93biBsaW5rLlxuICAgIHJldHVybiBub3JtYWxpemVGaWxlVXJsKGxpbmsucGFyc2VMaW5rUmVzdWx0LnVybCk7XG4gIH1cblxuICBpZiAoIWlzUGFyc2VMaW5rUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBwYXJzZUxpbmtSZXN1bHQgfSA9IGxpbms7XG4gIGlmICghcGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJldHVybiBnZW5lcmF0ZVJhd01hcmtkb3duTGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXM+KHtcbiAgICBhbGlhczogcGFyc2VMaW5rUmVzdWx0LmFsaWFzLFxuICAgIGlzRW1iZWQ6IHBhcnNlTGlua1Jlc3VsdC5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgdXJsOiBub3JtYWxpemVGaWxlVXJsKHBhcnNlTGlua1Jlc3VsdC51cmwpXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3JlbGF0aXZlJzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSAnc2hvcnRlc3QnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEVzY2FwZVdpa2lsaW5rRGl2aWRlcihmaWxlQ2hhbmdlOiBGaWxlQ2hhbmdlLCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdKTogYm9vbGVhbiB7XG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBnZXRGaWxlQ2hhbmdlcyBvbmx5IGNhbGxzIHRoaXMgZm9yIG5vbi1jYW52YXMgZmlsZXMgd2hpY2ggYWx3YXlzIGhhdmUgY29udGVudCBjaGFuZ2VzLiAqL1xuICBpZiAoIWlzQ29udGVudENoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGlmICghVU5FU0NBUEVEX1dJS0lMSU5LX0RJVklERVJfUkVHRVhQLnRlc3QoZmlsZUNoYW5nZS5uZXdDb250ZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0YWJsZVBvc2l0aW9ucy5zb21lKCh0YWJsZVBvc2l0aW9uKSA9PiB0YWJsZVBvc2l0aW9uLnN0YXJ0IDw9IGZpbGVDaGFuZ2UucmVmZXJlbmNlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCAmJiBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5lbmQub2Zmc2V0IDw9IHRhYmxlUG9zaXRpb24uZW5kKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShwYXJhbXM6IFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBhcHAsIGxpbmtTdHlsZSwgb3JpZ2luYWxMaW5rIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlc29sdmVkU3R5bGUgPSBsaW5rU3R5bGUgPz8gTGlua1N0eWxlLlByZXNlcnZlRXhpc3Rpbmc7XG4gIHN3aXRjaCAocmVzb2x2ZWRTdHlsZSkge1xuICAgIGNhc2UgTGlua1N0eWxlLk1hcmtkb3duOiB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0OiB7XG4gICAgICByZXR1cm4gc2hvdWxkVXNlV2lraWxpbmtzKGFwcCk7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLlByZXNlcnZlRXhpc3Rpbmc6IHtcbiAgICAgIHJldHVybiBvcmlnaW5hbExpbmsgPT09IHVuZGVmaW5lZCA/IHNob3VsZFVzZVdpa2lsaW5rcyhhcHApIDogaGFzV2lraWxpbmtTeW50YXgob3JpZ2luYWxMaW5rKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rU3R5bGUuV2lraWxpbms6IHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBhc3NlcnROZXZlcihyZXNvbHZlZFN0eWxlKTtcbiAgICB9XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFB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SUFBSSxHQUFHO0FBQy9CO0FBQUEsRUFDRjtBQUVBLFFBQU0sRUFBRSxnQkFBZ0IsSUFBSTtBQUM1QixNQUFJLENBQUMsZ0JBQWdCLFdBQVc7QUFDOUI7QUFBQSxFQUNGO0FBRUEsU0FBTyw0QkFBd0IsaURBQTJEO0FBQUEsSUFDeEYsT0FBTyxnQkFBZ0I7QUFBQSxJQUN2QixTQUFTLGdCQUFnQjtBQUFBLElBQ3pCLFlBQVk7QUFBQSxJQUNaO0FBQUEsSUFDQSxTQUFLLDZCQUFpQixnQkFBZ0IsR0FBRztBQUFBLEVBQzNDLENBQUMsQ0FBQztBQUNKO0FBRUEsU0FBUyw4Q0FBOEMsS0FBOEI7QUFDbkYsUUFBTSxvQkFBZ0IsMkNBQWlCLEdBQUc7QUFDMUMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSyxZQUFZO0FBQ2YsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssWUFBWTtBQUNmLGFBQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxLQUFLLFlBQVk7QUFDZixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsU0FBUztBQUNQLDBDQUFZLGFBQWE7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsNEJBQTRCLFlBQXdCLGdCQUEwQztBQUVyRyxNQUFJLEtBQUMsb0NBQWdCLFVBQVUsR0FBRztBQUNoQyxXQUFPO0FBQUEsRUFDVDtBQUdBLE1BQUksQ0FBQyxrQ0FBa0MsS0FBSyxXQUFXLFVBQVUsR0FBRztBQUNsRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sZUFBZSxLQUFLLENBQUMsa0JBQWtCLGNBQWMsU0FBUyxXQUFXLFVBQVUsU0FBUyxNQUFNLFVBQVUsV0FBVyxVQUFVLFNBQVMsSUFBSSxVQUFVLGNBQWMsR0FBRztBQUNsTDtBQUVBLFNBQVMsdUJBQXVCLFFBQStDO0FBQzdFLFFBQU0sRUFBRSxLQUFLLFdBQVcsYUFBYSxJQUFJO0FBQ3pDLFFBQU0sZ0JBQWdCLGFBQWE7QUFDbkMsVUFBUSxlQUFlO0FBQUEsSUFDckIsS0FBSywyQkFBb0I7QUFDdkIsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUsseURBQW1DO0FBQ3RDLGlCQUFPLDZDQUFtQixHQUFHO0FBQUEsSUFDL0I7QUFBQSxJQUNBLEtBQUssMkNBQTRCO0FBQy9CLGFBQU8saUJBQWlCLGFBQVksNkNBQW1CLEdBQUcsSUFBSSxrQkFBa0IsWUFBWTtBQUFBLElBQzlGO0FBQUEsSUFDQSxLQUFLLDJCQUFvQjtBQUN2QixhQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0EsU0FBUztBQUNQLDBDQUFZLGFBQWE7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsiTGlua1BhdGhTdHlsZSIsICJMaW5rU3R5bGUiXQp9Cg==
|