import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/controls/Bottom.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/controls/ButtonToggle.vue"; import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/controls/ButtonGroup.vue"; import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/measurements/Menu.vue"; import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/explode/Menu.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/view-modes/Menu.vue"; import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/lightControls/Menu.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/layout/Panel.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createElementBlock as __createElementBlock,createBlock as __createBlock,createElementVNode as __createElementVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } /* Injection by vite-plugin-vue-inspector End */ import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useSectionBoxUtilities, useMeasurementUtilities, useViewerShortcuts, useViewModeUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts"; import { ViewMode } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { onKeyStroke, useBreakpoints } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts"; import { TailwindBreakpoints } from "/_nuxt/lib/common/helpers/tailwind.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { Ruler, Scissors, Sun, Layers2, Glasses, Scan } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useOnViewerLoadComplete } from "/_nuxt/lib/viewer/composables/viewer.ts"; import { useSmartTooltipDelay } from "/_nuxt/composables/tooltips.ts"; import { computed, ref, shallowRef, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; var ActivePanel = /* @__PURE__ */ ((ActivePanel2) => { ActivePanel2["none"] = "none"; ActivePanel2["measurements"] = "measurements"; ActivePanel2["sectionBox"] = "sectionBox"; ActivePanel2["explode"] = "explode"; ActivePanel2["viewModes"] = "viewModes"; ActivePanel2["lightControls"] = "lightControls"; return ActivePanel2; })(ActivePanel || {}); const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerControlsBottom", emits: ["forceClosePanels"], setup(__props, { expose: __expose, emit: __emit }) { const emit = __emit; const { getShortcutDisplayText, shortcuts, registerShortcuts } = useViewerShortcuts(); const { toggleSectionBox, resetSectionBoxCompletely, closeSectionBox, isSectionBoxEnabled, isSectionBoxVisible } = useSectionBoxUtilities(); const { enableMeasurements, hasMeasurements, measurements } = useMeasurementUtilities(); const { resetExplode } = useFilterUtilities(); const { viewMode: { mode: currentViewMode }, setViewMode } = useViewModeUtilities(); const { ui: { explodeFactor, windowSelection } } = useInjectedViewerState(); const { getTooltipProps } = useSmartTooltipDelay(); const hasExplode = computed(() => explodeFactor.value > 0); const hasNonDefaultViewMode = computed(() => currentViewMode.value !== ViewMode.DEFAULT); const { isEnabled: isEmbedEnabled } = useEmbed(); const breakpoints = useBreakpoints(TailwindBreakpoints); const isMobile = breakpoints.smaller("sm"); const mixpanel = useMixpanel(); const activePanel = ref("none" /* none */); const viewerLoaded = ref(false); const isWindowSelectionEnabled = windowSelection.enabled; const panels = shallowRef({ ["measurements" /* measurements */]: { id: "measurements" /* measurements */, name: "Measure", icon: Ruler, tooltip: getShortcutDisplayText(shortcuts.ToggleMeasurements, { format: "separate" }), extraClasses: "" }, ["sectionBox" /* sectionBox */]: { id: "sectionBox" /* sectionBox */, name: "Section", icon: Scissors, tooltip: getShortcutDisplayText(shortcuts.ToggleSectionBox, { format: "separate" }), extraClasses: "" }, ["explode" /* explode */]: { id: "explode" /* explode */, name: "Explode", icon: Layers2, tooltip: getShortcutDisplayText(shortcuts.ToggleExplode, { format: "separate" }), extraClasses: "hidden md:flex" }, ["viewModes" /* viewModes */]: { id: "viewModes" /* viewModes */, name: "View modes", icon: Glasses, tooltip: getShortcutDisplayText(shortcuts.ToggleViewModes, { format: "separate" }), extraClasses: "" }, ["lightControls" /* lightControls */]: { id: "lightControls" /* lightControls */, name: "Light controls", icon: Sun, tooltip: getShortcutDisplayText(shortcuts.ToggleLightControls, { format: "separate" }), extraClasses: "hidden md:flex" } }); const showResetButton = computed(() => { return activePanel.value === "explode" /* explode */ || activePanel.value === "sectionBox" /* sectionBox */; }); const shouldShowDot = (panelId) => { switch (panelId) { case "measurements" /* measurements */: return hasMeasurements.value; case "sectionBox" /* sectionBox */: return isSectionBoxEnabled.value; case "explode" /* explode */: return hasExplode.value; case "viewModes" /* viewModes */: return hasNonDefaultViewMode.value; default: return false; } }; const toggleActivePanel = (panel) => { windowSelection.enabled.value = false; activePanel.value = activePanel.value === panel ? "none" /* none */ : panel; if (activePanel.value !== "none" /* none */ && isMobile.value) { emit("forceClosePanels"); } if (panel === "sectionBox" /* sectionBox */) { toggleSectionBox(); } if (panel === "measurements" /* measurements */) { enableMeasurements(true); } }; const toggleMeasurements = () => { windowSelection.enabled.value = false; if (activePanel.value === "sectionBox" /* sectionBox */) { toggleSectionBox(); } const isMeasurementsActive = activePanel.value === "measurements" /* measurements */; enableMeasurements(!isMeasurementsActive); activePanel.value = isMeasurementsActive ? "none" /* none */ : "measurements" /* measurements */; }; const toggleExplode = () => { windowSelection.enabled.value = false; activePanel.value = activePanel.value === "explode" /* explode */ ? "none" /* none */ : "explode" /* explode */; }; const toggleSectionBoxPanel = () => { windowSelection.enabled.value = false; if (activePanel.value === "measurements" /* measurements */) { enableMeasurements(false); } activePanel.value = activePanel.value === "sectionBox" /* sectionBox */ ? "none" /* none */ : "sectionBox" /* sectionBox */; toggleSectionBox(); }; const toggleViewModes = () => { windowSelection.enabled.value = false; activePanel.value = activePanel.value === "viewModes" /* viewModes */ ? "none" /* none */ : "viewModes" /* viewModes */; }; const toggleLightControls = () => { windowSelection.enabled.value = false; activePanel.value = activePanel.value === "lightControls" /* lightControls */ ? "none" /* none */ : "lightControls" /* lightControls */; }; const onActivePanelClose = () => { if (activePanel.value === "sectionBox" /* sectionBox */) { closeSectionBox(); } if (activePanel.value === "measurements" /* measurements */) { enableMeasurements(false); } activePanel.value = "none" /* none */; }; const toggleWindowSelection = () => { if (activePanel.value === "sectionBox" /* sectionBox */) { closeSectionBox(); } if (activePanel.value === "measurements" /* measurements */) { enableMeasurements(false); } activePanel.value = "none" /* none */; windowSelection.enabled.value = !windowSelection.enabled.value; if (windowSelection.enabled.value && isMobile.value) { emit("forceClosePanels"); } }; const onReset = () => { if (activePanel.value === "explode" /* explode */) { resetExplode(); } if (activePanel.value === "sectionBox" /* sectionBox */) { resetSectionBoxCompletely(); activePanel.value = "none" /* none */; } }; const forceClosePanels = () => { activePanel.value = "none" /* none */; }; const handleViewModeChange = (mode) => { setViewMode(mode); }; registerShortcuts({ ToggleMeasurements: () => toggleMeasurements(), ToggleExplode: () => toggleExplode(), ToggleSectionBox: () => toggleSectionBoxPanel(), ToggleViewModes: () => toggleViewModes(), ToggleLightControls: () => toggleLightControls(), SetViewModeDefault: () => handleViewModeChange(ViewMode.DEFAULT), SetViewModeSolid: () => handleViewModeChange(ViewMode.SOLID), SetViewModePen: () => handleViewModeChange(ViewMode.PEN), SetViewModeArctic: () => handleViewModeChange(ViewMode.ARCTIC), SetViewModeShaded: () => handleViewModeChange(ViewMode.SHADED) }); onKeyStroke("Escape", () => { const hasActiveMeasurements = measurements.value.length > 0; if (hasActiveMeasurements) return; if (activePanel.value === "measurements" /* measurements */) { toggleMeasurements(); } else if (activePanel.value === "sectionBox" /* sectionBox */) { closeSectionBox(); } windowSelection.enabled.value = false; activePanel.value = "none" /* none */; }); useOnViewerLoadComplete( () => { viewerLoaded.value = true; }, { initialOnly: true, waitForLoadingOver: true } ); watch(activePanel, (newVal) => { mixpanel.track("Viewer Action", { type: "action", name: "controls-toggle", action: newVal }); }); watch(isSectionBoxEnabled, (val) => { mixpanel.track("Viewer Action", { type: "action", name: "section-box", status: val }); }); watch(isSectionBoxVisible, (val) => { mixpanel.track("Viewer Action", { type: "action", name: "section-box-visibility", status: val }); }); __expose({ forceClosePanels }); const __returned__ = { ActivePanel, emit, getShortcutDisplayText, shortcuts, registerShortcuts, toggleSectionBox, resetSectionBoxCompletely, closeSectionBox, isSectionBoxEnabled, isSectionBoxVisible, enableMeasurements, hasMeasurements, measurements, resetExplode, currentViewMode, setViewMode, explodeFactor, windowSelection, getTooltipProps, hasExplode, hasNonDefaultViewMode, isEmbedEnabled, breakpoints, isMobile, mixpanel, activePanel, viewerLoaded, isWindowSelectionEnabled, panels, showResetButton, shouldShowDot, toggleActivePanel, toggleMeasurements, toggleExplode, toggleSectionBoxPanel, toggleViewModes, toggleLightControls, onActivePanelClose, toggleWindowSelection, onReset, forceClosePanels, handleViewModeChange, get Scan() { return Scan; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, withDirectives as _withDirectives, renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, normalizeClass as _normalizeClass, vShow as _vShow, withCtx as _withCtx, resolveDynamicComponent as _resolveDynamicComponent, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, createCommentVNode as _createCommentVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/viewer/controls/Bottom.vue:2:3" }; const _hoisted_2 = { class: "flex items-center", "data-v-inspector": "components/viewer/controls/Bottom.vue:33:7" }; const _hoisted_3 = { class: "text-body-2xs text-foreground", "data-v-inspector": "components/viewer/controls/Bottom.vue:35:9" }; const _hoisted_4 = { class: "flex items-center gap-1", "data-v-inspector": "components/viewer/controls/Bottom.vue:39:7" }; const _hoisted_5 = { class: "absolute left-1/2 -translate-x-1/2 bottom-11 w-80", "data-v-inspector": "components/viewer/controls/Bottom.vue:54:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ViewerControlsButtonToggle = __nuxt_component_0; const _component_ViewerControlsButtonGroup = __nuxt_component_1; const _component_FormButton = __nuxt_component_2; const _component_ViewerMeasurementsMenu = __nuxt_component_3; const _component_ViewerExplodeMenu = __nuxt_component_4; const _component_ViewerViewModesMenu = __nuxt_component_5; const _component_ViewerLightControlsMenu = __nuxt_component_6; const _component_ViewerLayoutPanel = __nuxt_component_7; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("aside", _hoisted_1, [ _withDirectives(_createVNode(_component_ViewerControlsButtonGroup, { class: _normalizeClass(["absolute left-1/2 -translate-x-1/2 z-40", $setup.isEmbedEnabled ? "bottom-[4rem]" : "bottom-4"]), "data-v-inspector": "components/viewer/controls/Bottom.vue:3:5" }, { default: _withCtx(() => [ _withDirectives(_createVNode(_component_ViewerControlsButtonToggle, { active: $setup.isWindowSelectionEnabled, disabled: !$setup.viewerLoaded, icon: $setup.Scan, onClick: $setup.toggleWindowSelection, "data-v-inspector": "components/viewer/controls/Bottom.vue:8:7" }, null, 8, ["active", "disabled", "icon"]), [ [_directive_tippy, $setup.getTooltipProps("Window selection")] ]), (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.panels, (panel) => { return _withDirectives((_openBlock(), _createBlock(_component_ViewerControlsButtonToggle, { key: panel.id, active: $setup.activePanel === panel.id, disabled: !$setup.viewerLoaded, dot: $setup.shouldShowDot(panel.id), icon: panel.icon, class: _normalizeClass(panel.extraClasses), onClick: ($event) => $setup.toggleActivePanel(panel.id), "data-v-inspector": "components/viewer/controls/Bottom.vue:15:7" }, null, 8, ["active", "disabled", "dot", "icon", "class", "onClick"])), [ [_directive_tippy, $setup.getTooltipProps(panel.tooltip)] ]); }), 128 /* KEYED_FRAGMENT */ )) ]), _: 1 /* STABLE */ }, 8, ["class"]), [ [_vShow, $setup.activePanel === "none"] ]), $setup.activePanel !== "none" ? (_openBlock(), _createBlock(_component_ViewerLayoutPanel, { key: 0, class: _normalizeClass(["absolute left-1/2 -translate-x-1/2 z-40 flex p-2 items-center justify-between w-80", $setup.isEmbedEnabled ? "bottom-[4rem]" : "bottom-4"]), "data-v-inspector": "components/viewer/controls/Bottom.vue:28:5" }, { default: _withCtx(() => [ _createElementVNode("span", _hoisted_2, [ (_openBlock(), _createBlock(_resolveDynamicComponent($setup.panels[$setup.activePanel].icon), { class: "h-4 w-4 ml-1 mr-1.5", "data-v-inspector": "components/viewer/controls/Bottom.vue:34:9" })), _createElementVNode( "p", _hoisted_3, _toDisplayString($setup.panels[$setup.activePanel].name), 1 /* TEXT */ ) ]), _createElementVNode("div", _hoisted_4, [ $setup.showResetButton ? (_openBlock(), _createBlock(_component_FormButton, { key: 0, tabindex: "-1", size: "sm", color: "subtle", onClick: $setup.onReset, "data-v-inspector": "components/viewer/controls/Bottom.vue:40:9" }, { default: _withCtx(() => [..._cache[0] || (_cache[0] = [ _createTextVNode( " Reset ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true), _createVNode(_component_FormButton, { tabindex: "-1", size: "sm", onClick: $setup.onActivePanelClose, "data-v-inspector": "components/viewer/controls/Bottom.vue:49:9" }, { default: _withCtx(() => [..._cache[1] || (_cache[1] = [ _createTextVNode( " Done ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }) ]), _createElementVNode("div", _hoisted_5, [ _withDirectives(_createVNode( _component_ViewerMeasurementsMenu, { "data-v-inspector": "components/viewer/controls/Bottom.vue:55:9" }, null, 512 /* NEED_PATCH */ ), [ [_vShow, $setup.activePanel === "measurements"] ]), _withDirectives(_createVNode( _component_ViewerExplodeMenu, { "data-v-inspector": "components/viewer/controls/Bottom.vue:56:9" }, null, 512 /* NEED_PATCH */ ), [ [_vShow, $setup.activePanel === "explode"] ]), _withDirectives(_createVNode( _component_ViewerViewModesMenu, { "data-v-inspector": "components/viewer/controls/Bottom.vue:57:9" }, null, 512 /* NEED_PATCH */ ), [ [_vShow, $setup.activePanel === "viewModes"] ]), _withDirectives(_createVNode( _component_ViewerLightControlsMenu, { "data-v-inspector": "components/viewer/controls/Bottom.vue:58:9" }, null, 512 /* NEED_PATCH */ ), [ [_vShow, $setup.activePanel === "lightControls"] ]) ]) ]), _: 1 /* STABLE */ }, 8, ["class"])) : _createCommentVNode("v-if", true) ]); } _sfc_main.__hmrId = "84d0746d"; typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main); import.meta.hot.on("file-changed", ({ file }) => { __VUE_HMR_RUNTIME__.CHANGED_FILE = file; }); import.meta.hot.accept((mod) => { if (!mod) return; const { default: updated, _rerender_only } = mod; if (_rerender_only) { __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render); } else { __VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated); } }); import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper"; export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/controls/Bottom.vue"]]); //# sourceMappingURL=data:application/json;base64,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UUFHRixvQkFLTSxPQUxOLFlBS007QUFBQSwwQkFKSjtBQUFBLFlBQWdJO0FBQUEsY0FBaEUsb0JBQWlCLDZDQUE0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQTdGLHVCQUFXO0FBQUE7MEJBQzNDO0FBQUEsWUFBc0g7QUFBQSxjQUFoRSxvQkFBaUIsNkNBQTRDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFBeEYsdUJBQVc7QUFBQTswQkFDdEM7QUFBQSxZQUEwSDtBQUFBLGNBQWhFLG9CQUFpQiw2Q0FBNEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHFCQUExRix1QkFBVztBQUFBOzBCQUN4QztBQUFBLFlBQWtJO0FBQUEsY0FBaEUsb0JBQWlCLDZDQUE0QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQTlGLHVCQUFXO0FBQUEiLCJuYW1lcyI6WyJBY3RpdmVQYW5lbCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJCb3R0b20udnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8YXNpZGUgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6MjozXCI+XHJcbiAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Hcm91cFxyXG4gICAgICB2LXNob3c9XCJhY3RpdmVQYW5lbCA9PT0gJ25vbmUnXCJcclxuICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBsZWZ0LTEvMiAtdHJhbnNsYXRlLXgtMS8yIHotNDBcIlxyXG4gICAgICA6Y2xhc3M9XCJpc0VtYmVkRW5hYmxlZCA/ICdib3R0b20tWzRyZW1dJyA6ICdib3R0b20tNCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTozOjVcIlxyXG4gICAgPlxuICAgICAgPFZpZXdlckNvbnRyb2xzQnV0dG9uVG9nZ2xlXG4gICAgICAgIHYtdGlwcHk9XCJnZXRUb29sdGlwUHJvcHMoJ1dpbmRvdyBzZWxlY3Rpb24nKVwiXG4gICAgICAgIDphY3RpdmU9XCJpc1dpbmRvd1NlbGVjdGlvbkVuYWJsZWRcIlxuICAgICAgICA6ZGlzYWJsZWQ9XCIhdmlld2VyTG9hZGVkXCJcbiAgICAgICAgOmljb249XCJTY2FuXCJcbiAgICAgICAgQGNsaWNrPVwidG9nZ2xlV2luZG93U2VsZWN0aW9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6ODo3XCJcbiAgICAgIC8+XG4gICAgICA8Vmlld2VyQ29udHJvbHNCdXR0b25Ub2dnbGVcbiAgICAgICAgdi1mb3I9XCJwYW5lbCBpbiBwYW5lbHNcIlxuICAgICAgICA6a2V5PVwicGFuZWwuaWRcIlxuICAgICAgICB2LXRpcHB5PVwiZ2V0VG9vbHRpcFByb3BzKHBhbmVsLnRvb2x0aXApXCJcclxuICAgICAgICA6YWN0aXZlPVwiYWN0aXZlUGFuZWwgPT09IHBhbmVsLmlkXCJcclxuICAgICAgICA6ZGlzYWJsZWQ9XCIhdmlld2VyTG9hZGVkXCJcclxuICAgICAgICA6ZG90PVwic2hvdWxkU2hvd0RvdChwYW5lbC5pZClcIlxyXG4gICAgICAgIDppY29uPVwicGFuZWwuaWNvblwiXHJcbiAgICAgICAgOmNsYXNzPVwicGFuZWwuZXh0cmFDbGFzc2VzXCJcclxuICAgICAgICBAY2xpY2s9XCJ0b2dnbGVBY3RpdmVQYW5lbChwYW5lbC5pZClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZToxNTo3XCJcclxuICAgICAgLz5cclxuICAgIDwvVmlld2VyQ29udHJvbHNCdXR0b25Hcm91cD5cclxuXHJcbiAgICA8Vmlld2VyTGF5b3V0UGFuZWxcclxuICAgICAgdi1pZj1cImFjdGl2ZVBhbmVsICE9PSAnbm9uZSdcIlxyXG4gICAgICBjbGFzcz1cImFic29sdXRlIGxlZnQtMS8yIC10cmFuc2xhdGUteC0xLzIgei00MCBmbGV4IHAtMiBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHctODBcIlxyXG4gICAgICA6Y2xhc3M9XCJpc0VtYmVkRW5hYmxlZCA/ICdib3R0b20tWzRyZW1dJyA6ICdib3R0b20tNCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZToyODo1XCJcclxuICAgID5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjMzOjdcIj5cclxuICAgICAgICA8Y29tcG9uZW50IDppcz1cInBhbmVsc1thY3RpdmVQYW5lbF0uaWNvblwiIGNsYXNzPVwiaC00IHctNCBtbC0xIG1yLTEuNVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjM0OjlcIiAvPlxyXG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTozNTo5XCI+XHJcbiAgICAgICAgICB7eyBwYW5lbHNbYWN0aXZlUGFuZWxdLm5hbWUgfX1cclxuICAgICAgICA8L3A+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6Mzk6N1wiPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LWlmPVwic2hvd1Jlc2V0QnV0dG9uXCJcclxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIGNvbG9yPVwic3VidGxlXCJcclxuICAgICAgICAgIEBjbGljaz1cIm9uUmVzZXRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTo0MDo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBSZXNldFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8Rm9ybUJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgc2l6ZT1cInNtXCIgQGNsaWNrPVwib25BY3RpdmVQYW5lbENsb3NlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6NDk6OVwiPlxyXG4gICAgICAgICAgRG9uZVxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYWJzb2x1dGUgbGVmdC0xLzIgLXRyYW5zbGF0ZS14LTEvMiBib3R0b20tMTEgdy04MFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjU0OjdcIj5cclxuICAgICAgICA8Vmlld2VyTWVhc3VyZW1lbnRzTWVudSB2LXNob3c9XCJhY3RpdmVQYW5lbCA9PT0gJ21lYXN1cmVtZW50cydcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZTo1NTo5XCIgLz5cclxuICAgICAgICA8Vmlld2VyRXhwbG9kZU1lbnUgdi1zaG93PVwiYWN0aXZlUGFuZWwgPT09ICdleHBsb2RlJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjU2OjlcIiAvPlxyXG4gICAgICAgIDxWaWV3ZXJWaWV3TW9kZXNNZW51IHYtc2hvdz1cImFjdGl2ZVBhbmVsID09PSAndmlld01vZGVzJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb250cm9scy9Cb3R0b20udnVlOjU3OjlcIiAvPlxyXG4gICAgICAgIDxWaWV3ZXJMaWdodENvbnRyb2xzTWVudSB2LXNob3c9XCJhY3RpdmVQYW5lbCA9PT0gJ2xpZ2h0Q29udHJvbHMnXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbnRyb2xzL0JvdHRvbS52dWU6NTg6OVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9WaWV3ZXJMYXlvdXRQYW5lbD5cclxuICA8L2FzaWRlPlxyXG48L3RlbXBsYXRlPlxyXG5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHtcclxuICB1c2VTZWN0aW9uQm94VXRpbGl0aWVzLFxyXG4gIHVzZU1lYXN1cmVtZW50VXRpbGl0aWVzLFxyXG4gIHVzZVZpZXdlclNob3J0Y3V0cyxcclxuICB1c2VWaWV3TW9kZVV0aWxpdGllc1xyXG59IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvdWknXHJcbmltcG9ydCB7IHVzZUZpbHRlclV0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZmlsdGVyaW5nJ1xyXG5pbXBvcnQgeyBWaWV3TW9kZSB9IGZyb20gJ0BzcGVja2xlL3ZpZXdlcidcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB7IG9uS2V5U3Ryb2tlLCB1c2VCcmVha3BvaW50cyB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgdXNlRW1iZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZW1iZWQnXHJcbmltcG9ydCB7IFRhaWx3aW5kQnJlYWtwb2ludHMgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvdGFpbHdpbmQnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXG5pbXBvcnQgeyBSdWxlciwgU2Npc3NvcnMsIFN1biwgTGF5ZXJzMiwgR2xhc3NlcywgU2NhbiB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcbmltcG9ydCB7IHVzZU9uVmlld2VyTG9hZENvbXBsZXRlIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3ZpZXdlcidcblxyXG5lbnVtIEFjdGl2ZVBhbmVsIHtcclxuICBub25lID0gJ25vbmUnLFxyXG4gIG1lYXN1cmVtZW50cyA9ICdtZWFzdXJlbWVudHMnLFxyXG4gIHNlY3Rpb25Cb3ggPSAnc2VjdGlvbkJveCcsXHJcbiAgZXhwbG9kZSA9ICdleHBsb2RlJyxcclxuICB2aWV3TW9kZXMgPSAndmlld01vZGVzJyxcclxuICBsaWdodENvbnRyb2xzID0gJ2xpZ2h0Q29udHJvbHMnXHJcbn1cclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgZm9yY2VDbG9zZVBhbmVsczogW11cclxufT4oKVxyXG5cclxuY29uc3QgeyBnZXRTaG9ydGN1dERpc3BsYXlUZXh0LCBzaG9ydGN1dHMsIHJlZ2lzdGVyU2hvcnRjdXRzIH0gPSB1c2VWaWV3ZXJTaG9ydGN1dHMoKVxyXG5jb25zdCB7XHJcbiAgdG9nZ2xlU2VjdGlvbkJveCxcclxuICByZXNldFNlY3Rpb25Cb3hDb21wbGV0ZWx5LFxyXG4gIGNsb3NlU2VjdGlvbkJveCxcclxuICBpc1NlY3Rpb25Cb3hFbmFibGVkLFxyXG4gIGlzU2VjdGlvbkJveFZpc2libGVcclxufSA9IHVzZVNlY3Rpb25Cb3hVdGlsaXRpZXMoKVxyXG5jb25zdCB7IGVuYWJsZU1lYXN1cmVtZW50cywgaGFzTWVhc3VyZW1lbnRzLCBtZWFzdXJlbWVudHMgfSA9IHVzZU1lYXN1cmVtZW50VXRpbGl0aWVzKClcclxuY29uc3QgeyByZXNldEV4cGxvZGUgfSA9IHVzZUZpbHRlclV0aWxpdGllcygpXHJcbmNvbnN0IHtcclxuICB2aWV3TW9kZTogeyBtb2RlOiBjdXJyZW50Vmlld01vZGUgfSxcclxuICBzZXRWaWV3TW9kZVxyXG59ID0gdXNlVmlld01vZGVVdGlsaXRpZXMoKVxyXG5jb25zdCB7XG4gIHVpOiB7IGV4cGxvZGVGYWN0b3IsIHdpbmRvd1NlbGVjdGlvbiB9XG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXG5jb25zdCB7IGdldFRvb2x0aXBQcm9wcyB9ID0gdXNlU21hcnRUb29sdGlwRGVsYXkoKVxyXG5cclxuY29uc3QgaGFzRXhwbG9kZSA9IGNvbXB1dGVkKCgpID0+IGV4cGxvZGVGYWN0b3IudmFsdWUgPiAwKVxyXG5jb25zdCBoYXNOb25EZWZhdWx0Vmlld01vZGUgPSBjb21wdXRlZCgoKSA9PiBjdXJyZW50Vmlld01vZGUudmFsdWUgIT09IFZpZXdNb2RlLkRFRkFVTFQpXHJcbmNvbnN0IHsgaXNFbmFibGVkOiBpc0VtYmVkRW5hYmxlZCB9ID0gdXNlRW1iZWQoKVxyXG5jb25zdCBicmVha3BvaW50cyA9IHVzZUJyZWFrcG9pbnRzKFRhaWx3aW5kQnJlYWtwb2ludHMpXHJcbmNvbnN0IGlzTW9iaWxlID0gYnJlYWtwb2ludHMuc21hbGxlcignc20nKVxyXG5jb25zdCBtaXhwYW5lbCA9IHVzZU1peHBhbmVsKClcclxuXHJcbmNvbnN0IGFjdGl2ZVBhbmVsID0gcmVmPEFjdGl2ZVBhbmVsPihBY3RpdmVQYW5lbC5ub25lKVxuY29uc3Qgdmlld2VyTG9hZGVkID0gcmVmKGZhbHNlKVxuY29uc3QgaXNXaW5kb3dTZWxlY3Rpb25FbmFibGVkID0gd2luZG93U2VsZWN0aW9uLmVuYWJsZWRcblxyXG5jb25zdCBwYW5lbHMgPSBzaGFsbG93UmVmKHtcclxuICBbQWN0aXZlUGFuZWwubWVhc3VyZW1lbnRzXToge1xyXG4gICAgaWQ6IEFjdGl2ZVBhbmVsLm1lYXN1cmVtZW50cyxcclxuICAgIG5hbWU6ICdNZWFzdXJlJyxcclxuICAgIGljb246IFJ1bGVyLFxyXG4gICAgdG9vbHRpcDogZ2V0U2hvcnRjdXREaXNwbGF5VGV4dChzaG9ydGN1dHMuVG9nZ2xlTWVhc3VyZW1lbnRzLCB7XHJcbiAgICAgIGZvcm1hdDogJ3NlcGFyYXRlJ1xyXG4gICAgfSksXHJcbiAgICBleHRyYUNsYXNzZXM6ICcnXHJcbiAgfSxcclxuICBbQWN0aXZlUGFuZWwuc2VjdGlvbkJveF06IHtcclxuICAgIGlkOiBBY3RpdmVQYW5lbC5zZWN0aW9uQm94LFxyXG4gICAgbmFtZTogJ1NlY3Rpb24nLFxyXG4gICAgaWNvbjogU2Npc3NvcnMsXHJcbiAgICB0b29sdGlwOiBnZXRTaG9ydGN1dERpc3BsYXlUZXh0KHNob3J0Y3V0cy5Ub2dnbGVTZWN0aW9uQm94LCB7IGZvcm1hdDogJ3NlcGFyYXRlJyB9KSxcclxuICAgIGV4dHJhQ2xhc3NlczogJydcclxuICB9LFxyXG4gIFtBY3RpdmVQYW5lbC5leHBsb2RlXToge1xyXG4gICAgaWQ6IEFjdGl2ZVBhbmVsLmV4cGxvZGUsXHJcbiAgICBuYW1lOiAnRXhwbG9kZScsXHJcbiAgICBpY29uOiBMYXllcnMyLFxyXG4gICAgdG9vbHRpcDogZ2V0U2hvcnRjdXREaXNwbGF5VGV4dChzaG9ydGN1dHMuVG9nZ2xlRXhwbG9kZSwgeyBmb3JtYXQ6ICdzZXBhcmF0ZScgfSksXHJcbiAgICBleHRyYUNsYXNzZXM6ICdoaWRkZW4gbWQ6ZmxleCdcclxuICB9LFxyXG4gIFtBY3RpdmVQYW5lbC52aWV3TW9kZXNdOiB7XHJcbiAgICBpZDogQWN0aXZlUGFuZWwudmlld01vZGVzLFxyXG4gICAgbmFtZTogJ1ZpZXcgbW9kZXMnLFxyXG4gICAgaWNvbjogR2xhc3NlcyxcclxuICAgIHRvb2x0aXA6IGdldFNob3J0Y3V0RGlzcGxheVRleHQoc2hvcnRjdXRzLlRvZ2dsZVZpZXdNb2RlcywgeyBmb3JtYXQ6ICdzZXBhcmF0ZScgfSksXHJcbiAgICBleHRyYUNsYXNzZXM6ICcnXHJcbiAgfSxcclxuICBbQWN0aXZlUGFuZWwubGlnaHRDb250cm9sc106IHtcclxuICAgIGlkOiBBY3RpdmVQYW5lbC5saWdodENvbnRyb2xzLFxyXG4gICAgbmFtZTogJ0xpZ2h0IGNvbnRyb2xzJyxcclxuICAgIGljb246IFN1bixcclxuICAgIHRvb2x0aXA6IGdldFNob3J0Y3V0RGlzcGxheVRleHQoc2hvcnRjdXRzLlRvZ2dsZUxpZ2h0Q29udHJvbHMsIHtcclxuICAgICAgZm9ybWF0OiAnc2VwYXJhdGUnXHJcbiAgICB9KSxcclxuICAgIGV4dHJhQ2xhc3NlczogJ2hpZGRlbiBtZDpmbGV4J1xyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IHNob3dSZXNldEJ1dHRvbiA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gKFxyXG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLmV4cGxvZGUgfHxcclxuICAgIGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5zZWN0aW9uQm94XHJcbiAgKVxyXG59KVxyXG5cclxuY29uc3Qgc2hvdWxkU2hvd0RvdCA9IChwYW5lbElkOiBBY3RpdmVQYW5lbCkgPT4ge1xyXG4gIHN3aXRjaCAocGFuZWxJZCkge1xyXG4gICAgY2FzZSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHM6XHJcbiAgICAgIHJldHVybiBoYXNNZWFzdXJlbWVudHMudmFsdWVcclxuICAgIGNhc2UgQWN0aXZlUGFuZWwuc2VjdGlvbkJveDpcclxuICAgICAgcmV0dXJuIGlzU2VjdGlvbkJveEVuYWJsZWQudmFsdWVcclxuICAgIGNhc2UgQWN0aXZlUGFuZWwuZXhwbG9kZTpcclxuICAgICAgcmV0dXJuIGhhc0V4cGxvZGUudmFsdWVcclxuICAgIGNhc2UgQWN0aXZlUGFuZWwudmlld01vZGVzOlxyXG4gICAgICByZXR1cm4gaGFzTm9uRGVmYXVsdFZpZXdNb2RlLnZhbHVlXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZUFjdGl2ZVBhbmVsID0gKHBhbmVsOiBBY3RpdmVQYW5lbCkgPT4ge1xuICB3aW5kb3dTZWxlY3Rpb24uZW5hYmxlZC52YWx1ZSA9IGZhbHNlXG4gIGFjdGl2ZVBhbmVsLnZhbHVlID0gYWN0aXZlUGFuZWwudmFsdWUgPT09IHBhbmVsID8gQWN0aXZlUGFuZWwubm9uZSA6IHBhbmVsXG5cclxuICBpZiAoYWN0aXZlUGFuZWwudmFsdWUgIT09IEFjdGl2ZVBhbmVsLm5vbmUgJiYgaXNNb2JpbGUudmFsdWUpIHtcclxuICAgIGVtaXQoJ2ZvcmNlQ2xvc2VQYW5lbHMnKVxyXG4gIH1cclxuXHJcbiAgaWYgKHBhbmVsID09PSBBY3RpdmVQYW5lbC5zZWN0aW9uQm94KSB7XHJcbiAgICB0b2dnbGVTZWN0aW9uQm94KClcclxuICB9XHJcblxyXG4gIGlmIChwYW5lbCA9PT0gQWN0aXZlUGFuZWwubWVhc3VyZW1lbnRzKSB7XHJcbiAgICBlbmFibGVNZWFzdXJlbWVudHModHJ1ZSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZU1lYXN1cmVtZW50cyA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBpZiAoYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLnNlY3Rpb25Cb3gpIHtcbiAgICB0b2dnbGVTZWN0aW9uQm94KClcclxuICB9XHJcblxyXG4gIGNvbnN0IGlzTWVhc3VyZW1lbnRzQWN0aXZlID0gYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLm1lYXN1cmVtZW50c1xyXG4gIGVuYWJsZU1lYXN1cmVtZW50cyghaXNNZWFzdXJlbWVudHNBY3RpdmUpXHJcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBpc01lYXN1cmVtZW50c0FjdGl2ZSA/IEFjdGl2ZVBhbmVsLm5vbmUgOiBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHNcclxufVxyXG5cclxuY29uc3QgdG9nZ2xlRXhwbG9kZSA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLmV4cGxvZGUgPyBBY3RpdmVQYW5lbC5ub25lIDogQWN0aXZlUGFuZWwuZXhwbG9kZVxyXG59XHJcblxyXG5jb25zdCB0b2dnbGVTZWN0aW9uQm94UGFuZWwgPSAoKSA9PiB7XG4gIHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlID0gZmFsc2VcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHMpIHtcbiAgICBlbmFibGVNZWFzdXJlbWVudHMoZmFsc2UpXHJcbiAgfVxyXG5cclxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XHJcbiAgICBhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuc2VjdGlvbkJveFxyXG4gICAgICA/IEFjdGl2ZVBhbmVsLm5vbmVcclxuICAgICAgOiBBY3RpdmVQYW5lbC5zZWN0aW9uQm94XHJcbiAgdG9nZ2xlU2VjdGlvbkJveCgpXHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZVZpZXdNb2RlcyA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLnZpZXdNb2Rlc1xyXG4gICAgICA/IEFjdGl2ZVBhbmVsLm5vbmVcclxuICAgICAgOiBBY3RpdmVQYW5lbC52aWV3TW9kZXNcclxufVxyXG5cclxuY29uc3QgdG9nZ2xlTGlnaHRDb250cm9scyA9ICgpID0+IHtcbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9XG4gICAgYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLmxpZ2h0Q29udHJvbHNcclxuICAgICAgPyBBY3RpdmVQYW5lbC5ub25lXHJcbiAgICAgIDogQWN0aXZlUGFuZWwubGlnaHRDb250cm9sc1xyXG59XHJcblxyXG5jb25zdCBvbkFjdGl2ZVBhbmVsQ2xvc2UgPSAoKSA9PiB7XG4gIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuc2VjdGlvbkJveCkge1xyXG4gICAgY2xvc2VTZWN0aW9uQm94KClcclxuICB9XHJcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHMpIHtcclxuICAgIGVuYWJsZU1lYXN1cmVtZW50cyhmYWxzZSlcclxuICB9XHJcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBBY3RpdmVQYW5lbC5ub25lXHJcbn1cblxuY29uc3QgdG9nZ2xlV2luZG93U2VsZWN0aW9uID0gKCkgPT4ge1xuICBpZiAoYWN0aXZlUGFuZWwudmFsdWUgPT09IEFjdGl2ZVBhbmVsLnNlY3Rpb25Cb3gpIHtcbiAgICBjbG9zZVNlY3Rpb25Cb3goKVxuICB9XG4gIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwubWVhc3VyZW1lbnRzKSB7XG4gICAgZW5hYmxlTWVhc3VyZW1lbnRzKGZhbHNlKVxuICB9XG5cbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBBY3RpdmVQYW5lbC5ub25lXG4gIHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlID0gIXdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlXG5cbiAgaWYgKHdpbmRvd1NlbGVjdGlvbi5lbmFibGVkLnZhbHVlICYmIGlzTW9iaWxlLnZhbHVlKSB7XG4gICAgZW1pdCgnZm9yY2VDbG9zZVBhbmVscycpXG4gIH1cbn1cblxyXG5jb25zdCBvblJlc2V0ID0gKCkgPT4ge1xyXG4gIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuZXhwbG9kZSkge1xyXG4gICAgcmVzZXRFeHBsb2RlKClcclxuICB9XHJcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5zZWN0aW9uQm94KSB7XHJcbiAgICByZXNldFNlY3Rpb25Cb3hDb21wbGV0ZWx5KClcclxuICAgIGFjdGl2ZVBhbmVsLnZhbHVlID0gQWN0aXZlUGFuZWwubm9uZVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgZm9yY2VDbG9zZVBhbmVscyA9ICgpID0+IHtcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSBBY3RpdmVQYW5lbC5ub25lXG59XG5cclxuY29uc3QgaGFuZGxlVmlld01vZGVDaGFuZ2UgPSAobW9kZTogVmlld01vZGUpID0+IHtcclxuICBzZXRWaWV3TW9kZShtb2RlKVxyXG59XHJcblxyXG5yZWdpc3RlclNob3J0Y3V0cyh7XHJcbiAgVG9nZ2xlTWVhc3VyZW1lbnRzOiAoKSA9PiB0b2dnbGVNZWFzdXJlbWVudHMoKSxcclxuICBUb2dnbGVFeHBsb2RlOiAoKSA9PiB0b2dnbGVFeHBsb2RlKCksXHJcbiAgVG9nZ2xlU2VjdGlvbkJveDogKCkgPT4gdG9nZ2xlU2VjdGlvbkJveFBhbmVsKCksXHJcbiAgVG9nZ2xlVmlld01vZGVzOiAoKSA9PiB0b2dnbGVWaWV3TW9kZXMoKSxcclxuICBUb2dnbGVMaWdodENvbnRyb2xzOiAoKSA9PiB0b2dnbGVMaWdodENvbnRyb2xzKCksXHJcbiAgU2V0Vmlld01vZGVEZWZhdWx0OiAoKSA9PiBoYW5kbGVWaWV3TW9kZUNoYW5nZShWaWV3TW9kZS5ERUZBVUxUKSxcclxuICBTZXRWaWV3TW9kZVNvbGlkOiAoKSA9PiBoYW5kbGVWaWV3TW9kZUNoYW5nZShWaWV3TW9kZS5TT0xJRCksXHJcbiAgU2V0Vmlld01vZGVQZW46ICgpID0+IGhhbmRsZVZpZXdNb2RlQ2hhbmdlKFZpZXdNb2RlLlBFTiksXHJcbiAgU2V0Vmlld01vZGVBcmN0aWM6ICgpID0+IGhhbmRsZVZpZXdNb2RlQ2hhbmdlKFZpZXdNb2RlLkFSQ1RJQyksXHJcbiAgU2V0Vmlld01vZGVTaGFkZWQ6ICgpID0+IGhhbmRsZVZpZXdNb2RlQ2hhbmdlKFZpZXdNb2RlLlNIQURFRClcclxufSlcclxuXHJcbm9uS2V5U3Ryb2tlKCdFc2NhcGUnLCAoKSA9PiB7XG4gIGNvbnN0IGhhc0FjdGl2ZU1lYXN1cmVtZW50cyA9IG1lYXN1cmVtZW50cy52YWx1ZS5sZW5ndGggPiAwXHJcbiAgaWYgKGhhc0FjdGl2ZU1lYXN1cmVtZW50cykgcmV0dXJuXHJcblxyXG4gIC8vIE9ubHkgY2xvc2UgcGFuZWxzIGlmIHRoZXJlJ3Mgbm8gYWN0aXZlIG1lYXN1cmVtZW50XHJcbiAgaWYgKGFjdGl2ZVBhbmVsLnZhbHVlID09PSBBY3RpdmVQYW5lbC5tZWFzdXJlbWVudHMpIHtcclxuICAgIHRvZ2dsZU1lYXN1cmVtZW50cygpXHJcbiAgfSBlbHNlIGlmIChhY3RpdmVQYW5lbC52YWx1ZSA9PT0gQWN0aXZlUGFuZWwuc2VjdGlvbkJveCkge1xuICAgIGNsb3NlU2VjdGlvbkJveCgpXG4gIH1cbiAgd2luZG93U2VsZWN0aW9uLmVuYWJsZWQudmFsdWUgPSBmYWxzZVxuICBhY3RpdmVQYW5lbC52YWx1ZSA9IEFjdGl2ZVBhbmVsLm5vbmVcbn0pXG5cclxudXNlT25WaWV3ZXJMb2FkQ29tcGxldGUoXHJcbiAgKCkgPT4ge1xyXG4gICAgdmlld2VyTG9hZGVkLnZhbHVlID0gdHJ1ZVxyXG4gIH0sXHJcbiAgeyBpbml0aWFsT25seTogdHJ1ZSwgd2FpdEZvckxvYWRpbmdPdmVyOiB0cnVlIH1cclxuKVxyXG5cclxud2F0Y2goYWN0aXZlUGFuZWwsIChuZXdWYWwpID0+IHtcclxuICAvLyBVc2luZyAnY29udHJvbHMnIGhlcmUgdG8gc3RpY2sgdG8gdGhlIG9sZCBuYW1pbmcgY29udmVudGlvblxyXG4gIG1peHBhbmVsLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnY29udHJvbHMtdG9nZ2xlJyxcclxuICAgIGFjdGlvbjogbmV3VmFsXHJcbiAgfSlcclxufSlcclxuXHJcbndhdGNoKGlzU2VjdGlvbkJveEVuYWJsZWQsICh2YWwpID0+IHtcclxuICBtaXhwYW5lbC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3NlY3Rpb24tYm94JyxcclxuICAgIHN0YXR1czogdmFsXHJcbiAgfSlcclxufSlcclxuXHJcbndhdGNoKGlzU2VjdGlvbkJveFZpc2libGUsICh2YWwpID0+IHtcclxuICBtaXhwYW5lbC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3NlY3Rpb24tYm94LXZpc2liaWxpdHknLFxyXG4gICAgc3RhdHVzOiB2YWxcclxuICB9KVxyXG59KVxyXG5cclxuZGVmaW5lRXhwb3NlKHtcclxuICBmb3JjZUNsb3NlUGFuZWxzXHJcbn0pXHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvY29udHJvbHMvQm90dG9tLnZ1ZSJ9