import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/saved-views/Panel.vue");import { FormButton as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { FormTextInput as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/button-group/Button.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/button-group/ButtonGroup.vue"; import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/saved-views/panel/Groups.vue"; import { CommonPromoAlert as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/saved-views/panel/groups/CreateDialog.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/viewer/layout/SidePanel.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementVNode as __createElementVNode,createVNode as __createVNode,createElementBlock as __createElementBlock,createBlock as __createBlock } 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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...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 { useMutationLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29"; import { Search, FolderPlus, Plus, X } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { useSynchronizedCookie } from "/_nuxt/lib/common/composables/reactiveCookie.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { WorkspaceSeatType } from "/_nuxt/lib/common/generated/gql/graphql.ts"; import { useCreateSavedView } from "/_nuxt/lib/viewer/composables/savedViews/management.ts"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { ViewsType, viewsTypeLabels } from "/_nuxt/lib/viewer/helpers/savedViews.ts"; import { useDebouncedTextInput } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { useKeepAliveScrollState } from "/_nuxt/lib/common/composables/dom.ts"; import { ref, useTemplateRef, computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useSmartTooltipDelay } from "/_nuxt/composables/tooltips.ts"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerSavedViewsPanel", emits: ["close"], setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ViewerSavedViewsPanel_Project on Project { id permissions { canCreateSavedView { ...FullPermissionCheckResult } } workspace { id seatType planSupportsSavedViews: hasAccessToFeature(featureName: savedViews) } } `); const { resources: { response: { project } }, ui: { savedViews: { openedGroupState } } } = useInjectedViewerState(); const createSavedView = useCreateSavedView(); const isLoading = useMutationLoading(); const { on, bind, value: search } = useDebouncedTextInput(); const selectedViewsType = ref(ViewsType.All); const hideViewerSeatDisclaimer = useSynchronizedCookie( "hideViewerSeatSavedViewsDisclaimer", { default: () => false } ); const searchMode = ref(false); const showCreateGroupDialog = ref(false); const { getTooltipProps } = useSmartTooltipDelay(); useKeepAliveScrollState(useTemplateRef("groupsScrollArea")); const canCreateViewOrGroup = computed( () => project.value?.permissions.canCreateSavedView ); const isViewerSeat = computed( () => project.value?.workspace?.seatType === WorkspaceSeatType.Viewer ); const onAddView = async () => { if (isLoading.value) return; const view = await createSavedView({}); if (view) { openedGroupState.value.set(view.group.id, true); } }; const onAddGroup = async (group) => { openedGroupState.value.set(group.id, true); }; const setSearchMode = (val) => { if (val) { searchMode.value = true; } else { searchMode.value = false; } search.value = ""; }; const __returned__ = { project, openedGroupState, createSavedView, isLoading, on, bind, search, selectedViewsType, hideViewerSeatDisclaimer, searchMode, showCreateGroupDialog, getTooltipProps, canCreateViewOrGroup, isViewerSeat, onAddView, onAddGroup, setSearchMode, get Search() { return Search; }, get FolderPlus() { return FolderPlus; }, get Plus() { return Plus; }, get X() { return X; }, get ViewsType() { return ViewsType; }, get viewsTypeLabels() { return viewsTypeLabels; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, withDirectives as _withDirectives, openBlock as _openBlock, toHandlers as _toHandlers, mergeProps as _mergeProps, renderList as _renderList, Fragment as _Fragment, toDisplayString as _toDisplayString, withCtx as _withCtx, createCommentVNode as _createCommentVNode, createSlots as _createSlots } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "flex items-center gap-0.5", "data-v-inspector": "components/viewer/saved-views/Panel.vue:9:7" }; const _hoisted_2 = { class: "flex items-center", "data-v-inspector": "components/viewer/saved-views/Panel.vue:18:9" }; const _hoisted_3 = { class: "flex items-center", "data-v-inspector": "components/viewer/saved-views/Panel.vue:30:9" }; const _hoisted_4 = { class: "self-center w-full pr-1 flex gap-2 items-center", "data-v-inspector": "components/viewer/saved-views/Panel.vue:45:7" }; const _hoisted_5 = { class: "px-2 pt-2", "data-v-inspector": "components/viewer/saved-views/Panel.vue:66:5" }; const _hoisted_6 = { class: "text-body-2xs text-foreground px-2 py-1", "data-v-inspector": "components/viewer/saved-views/Panel.vue:75:11" }; const _hoisted_7 = { ref: "groupsScrollArea", class: "text-body-sm flex-1 min-h-0 overflow-y-auto simple-scrollbar", "data-v-inspector": "components/viewer/saved-views/Panel.vue:81:5" }; const _hoisted_8 = { key: 0, class: "absolute bottom-0 left-0 right-0 p-2", "data-v-inspector": "components/viewer/saved-views/Panel.vue:90:5" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_FormButton = __nuxt_component_0; const _component_FormTextInput = __nuxt_component_1; const _component_ViewerButtonGroupButton = __nuxt_component_2; const _component_ViewerButtonGroup = __nuxt_component_3; const _component_ViewerSavedViewsPanelGroups = __nuxt_component_4; const _component_CommonPromoAlert = __nuxt_component_5; const _component_ViewerSavedViewsPanelGroupsCreateDialog = __nuxt_component_6; const _component_ViewerLayoutSidePanel = __nuxt_component_7; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createBlock( _component_ViewerLayoutSidePanel, { "disable-scrollbar": "", class: "relative", onClose: _cache[5] || (_cache[5] = ($event) => _ctx.$emit("close")), "data-v-inspector": "components/viewer/saved-views/Panel.vue:2:3" }, _createSlots({ title: _withCtx(() => [ _cache[6] || (_cache[6] = _createElementVNode( "div", { class: "flex justify-between items-center", "data-v-inspector": "components/viewer/saved-views/Panel.vue:4:7" }, [ _createElementVNode("div", { "data-v-inspector": "components/viewer/saved-views/Panel.vue:5:9" }, "Views") ], -1 /* CACHED */ )) ]), actions: _withCtx(() => [ _createElementVNode("div", _hoisted_1, [ _withDirectives(_createVNode(_component_FormButton, { size: "sm", color: "subtle", "icon-left": $setup.Search, "hide-text": "", onClick: _cache[0] || (_cache[0] = ($event) => $setup.setSearchMode(true)), "data-v-inspector": "components/viewer/saved-views/Panel.vue:10:9" }, null, 8, ["icon-left"]), [ [_directive_tippy, $setup.getTooltipProps("Search views")] ]), _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_2, [ _withDirectives(_createVNode(_component_FormButton, { size: "sm", color: "subtle", "icon-left": $setup.FolderPlus, "hide-text": "", name: "addGroup", disabled: !$setup.canCreateViewOrGroup?.authorized || $setup.isLoading, onClick: _cache[1] || (_cache[1] = () => $setup.showCreateGroupDialog = true), "data-v-inspector": "components/viewer/saved-views/Panel.vue:19:11" }, null, 8, ["icon-left", "disabled"]), [ [_directive_tippy, $setup.getTooltipProps("Create group")] ]) ])), [ [_directive_tippy, $setup.canCreateViewOrGroup?.errorMessage] ]), _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_3, [ _withDirectives(_createVNode(_component_FormButton, { size: "sm", color: "subtle", "icon-left": $setup.Plus, "hide-text": "", name: "addView", disabled: !$setup.canCreateViewOrGroup?.authorized || $setup.isLoading, onClick: $setup.onAddView, "data-v-inspector": "components/viewer/saved-views/Panel.vue:31:11" }, null, 8, ["icon-left", "disabled"]), [ [_directive_tippy, $setup.getTooltipProps("Create view")] ]) ])), [ [_directive_tippy, $setup.canCreateViewOrGroup?.errorMessage] ]) ]) ]), default: _withCtx(() => [ _createElementVNode("div", _hoisted_5, [ _createVNode(_component_ViewerButtonGroup, { "data-v-inspector": "components/viewer/saved-views/Panel.vue:67:7" }, { default: _withCtx(() => [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList(Object.values($setup.ViewsType), (viewsType) => { return _openBlock(), _createBlock(_component_ViewerButtonGroupButton, { key: viewsType, "is-active": $setup.selectedViewsType === viewsType, class: "grow", onClick: () => $setup.selectedViewsType = viewsType, "data-v-inspector": "components/viewer/saved-views/Panel.vue:68:9" }, { default: _withCtx(() => [ _createElementVNode( "span", _hoisted_6, _toDisplayString($setup.viewsTypeLabels[viewsType]), 1 /* TEXT */ ) ]), _: 2 /* DYNAMIC */ }, 1032, ["is-active", "onClick"]); }), 128 /* KEYED_FRAGMENT */ )) ]), _: 1 /* STABLE */ }) ]), _createElementVNode( "div", _hoisted_7, [ _createVNode(_component_ViewerSavedViewsPanelGroups, { "views-type": $setup.selectedViewsType, search: $setup.searchMode ? $setup.search || void 0 : void 0, "data-v-inspector": "components/viewer/saved-views/Panel.vue:85:7" }, null, 8, ["views-type", "search"]) ], 512 /* NEED_PATCH */ ), $setup.isViewerSeat && !$setup.hideViewerSeatDisclaimer ? (_openBlock(), _createElementBlock("div", _hoisted_8, [ _createVNode(_component_CommonPromoAlert, { title: "Save your views", text: "With an Editor seat, unlock the option to save views. A workspace admin can update your seat type.", "show-closer": "", onClose: _cache[3] || (_cache[3] = ($event) => $setup.hideViewerSeatDisclaimer = true), "data-v-inspector": "components/viewer/saved-views/Panel.vue:94:7" }) ])) : _createCommentVNode("v-if", true), _createVNode(_component_ViewerSavedViewsPanelGroupsCreateDialog, { open: $setup.showCreateGroupDialog, "onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showCreateGroupDialog = $event), onSuccess: $setup.onAddGroup, "data-v-inspector": "components/viewer/saved-views/Panel.vue:101:5" }, null, 8, ["open"]) ]), _: 2 /* DYNAMIC */ }, [ $setup.searchMode ? { name: "fullTitle", fn: _withCtx(() => [ _createElementVNode("div", _hoisted_4, [ _createVNode( _component_FormTextInput, _mergeProps($setup.bind, { name: "search", placeholder: "Search views...", color: "foundation", "auto-focus": "", size: "sm", "wrapper-classes": "flex-1 -ml-1" }, _toHandlers($setup.on), { "data-v-inspector": "components/viewer/saved-views/Panel.vue:46:9" }), null, 16 /* FULL_PROPS */ ), _createVNode(_component_FormButton, { size: "sm", color: "subtle", "icon-left": $setup.X, "hide-text": "", name: "disableSearch", onClick: _cache[2] || (_cache[2] = ($event) => $setup.setSearchMode(false)), "data-v-inspector": "components/viewer/saved-views/Panel.vue:56:9" }, null, 8, ["icon-left"]) ]) ]), key: "0" } : void 0 ]), 1024 /* DYNAMIC_SLOTS */ ); } _sfc_main.__hmrId = "b807abb3"; 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/saved-views/Panel.vue"]]); //# sourceMappingURL=data:application/json;base64,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QWlCO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlBhbmVsLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPFZpZXdlckxheW91dFNpZGVQYW5lbCBkaXNhYmxlLXNjcm9sbGJhciBjbGFzcz1cInJlbGF0aXZlXCIgQGNsb3NlPVwiJGVtaXQoJ2Nsb3NlJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjI6M1wiPlxyXG4gICAgPHRlbXBsYXRlICN0aXRsZT5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9QYW5lbC52dWU6NDo3XCI+XHJcbiAgICAgICAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjU6OVwiPlZpZXdzPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSAjYWN0aW9ucz5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0wLjVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjk6N1wiPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LXRpcHB5PVwiZ2V0VG9vbHRpcFByb3BzKCdTZWFyY2ggdmlld3MnKVwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgOmljb24tbGVmdD1cIlNlYXJjaFwiXHJcbiAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgIEBjbGljaz1cInNldFNlYXJjaE1vZGUodHJ1ZSlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjEwOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiB2LXRpcHB5PVwiY2FuQ3JlYXRlVmlld09yR3JvdXA/LmVycm9yTWVzc2FnZVwiIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjE4OjlcIj5cclxuICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCJnZXRUb29sdGlwUHJvcHMoJ0NyZWF0ZSBncm91cCcpXCJcclxuICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRm9sZGVyUGx1c1wiXHJcbiAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICBuYW1lPVwiYWRkR3JvdXBcIlxyXG4gICAgICAgICAgICA6ZGlzYWJsZWQ9XCIhY2FuQ3JlYXRlVmlld09yR3JvdXA/LmF1dGhvcml6ZWQgfHwgaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwiKCkgPT4gKHNob3dDcmVhdGVHcm91cERpYWxvZyA9IHRydWUpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL1BhbmVsLnZ1ZToxOToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgdi10aXBweT1cImNhbkNyZWF0ZVZpZXdPckdyb3VwPy5lcnJvck1lc3NhZ2VcIiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL1BhbmVsLnZ1ZTozMDo5XCI+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICB2LXRpcHB5PVwiZ2V0VG9vbHRpcFByb3BzKCdDcmVhdGUgdmlldycpXCJcclxuICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiUGx1c1wiXHJcbiAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICBuYW1lPVwiYWRkVmlld1wiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFjYW5DcmVhdGVWaWV3T3JHcm91cD8uYXV0aG9yaXplZCB8fCBpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICBAY2xpY2s9XCJvbkFkZFZpZXdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjMxOjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDx0ZW1wbGF0ZSB2LWlmPVwic2VhcmNoTW9kZVwiICNmdWxsVGl0bGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxmLWNlbnRlciB3LWZ1bGwgcHItMSBmbGV4IGdhcC0yIGl0ZW1zLWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9QYW5lbC52dWU6NDU6N1wiPlxyXG4gICAgICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgICAgICB2LWJpbmQ9XCJiaW5kXCJcclxuICAgICAgICAgIG5hbWU9XCJzZWFyY2hcIlxyXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggdmlld3MuLi5cIlxyXG4gICAgICAgICAgY29sb3I9XCJmb3VuZGF0aW9uXCJcclxuICAgICAgICAgIGF1dG8tZm9jdXNcclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICB3cmFwcGVyLWNsYXNzZXM9XCJmbGV4LTEgLW1sLTFcIlxyXG4gICAgICAgICAgdi1vbj1cIm9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL1BhbmVsLnZ1ZTo0Njo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgOmljb24tbGVmdD1cIlhcIlxyXG4gICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICBuYW1lPVwiZGlzYWJsZVNlYXJjaFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJzZXRTZWFyY2hNb2RlKGZhbHNlKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9QYW5lbC52dWU6NTY6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPGRpdiBjbGFzcz1cInB4LTIgcHQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9QYW5lbC52dWU6NjY6NVwiPlxyXG4gICAgICA8Vmlld2VyQnV0dG9uR3JvdXAgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL1BhbmVsLnZ1ZTo2Nzo3XCI+XHJcbiAgICAgICAgPFZpZXdlckJ1dHRvbkdyb3VwQnV0dG9uXHJcbiAgICAgICAgICB2LWZvcj1cInZpZXdzVHlwZSBpbiBPYmplY3QudmFsdWVzKFZpZXdzVHlwZSlcIlxyXG4gICAgICAgICAgOmtleT1cInZpZXdzVHlwZVwiXHJcbiAgICAgICAgICA6aXMtYWN0aXZlPVwic2VsZWN0ZWRWaWV3c1R5cGUgPT09IHZpZXdzVHlwZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImdyb3dcIlxyXG4gICAgICAgICAgQGNsaWNrPVwiKCkgPT4gKHNlbGVjdGVkVmlld3NUeXBlID0gdmlld3NUeXBlKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9QYW5lbC52dWU6Njg6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIHRleHQtZm9yZWdyb3VuZCBweC0yIHB5LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjc1OjExXCI+XHJcbiAgICAgICAgICAgIHt7IHZpZXdzVHlwZUxhYmVsc1t2aWV3c1R5cGVdIH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9WaWV3ZXJCdXR0b25Hcm91cEJ1dHRvbj5cclxuICAgICAgPC9WaWV3ZXJCdXR0b25Hcm91cD5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICByZWY9XCJncm91cHNTY3JvbGxBcmVhXCJcclxuICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktc20gZmxleC0xIG1pbi1oLTAgb3ZlcmZsb3cteS1hdXRvIHNpbXBsZS1zY3JvbGxiYXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjgxOjVcIlxyXG4gICAgPlxyXG4gICAgICA8Vmlld2VyU2F2ZWRWaWV3c1BhbmVsR3JvdXBzXHJcbiAgICAgICAgOnZpZXdzLXR5cGU9XCJzZWxlY3RlZFZpZXdzVHlwZVwiXHJcbiAgICAgICAgOnNlYXJjaD1cInNlYXJjaE1vZGUgPyBzZWFyY2ggfHwgdW5kZWZpbmVkIDogdW5kZWZpbmVkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL1BhbmVsLnZ1ZTo4NTo3XCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwiaXNWaWV3ZXJTZWF0ICYmICFoaWRlVmlld2VyU2VhdERpc2NsYWltZXJcIlxyXG4gICAgICBjbGFzcz1cImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCByaWdodC0wIHAtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zYXZlZC12aWV3cy9QYW5lbC52dWU6OTA6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxDb21tb25Qcm9tb0FsZXJ0XHJcbiAgICAgICAgdGl0bGU9XCJTYXZlIHlvdXIgdmlld3NcIlxyXG4gICAgICAgIHRleHQ9XCJXaXRoIGFuIEVkaXRvciBzZWF0LCB1bmxvY2sgdGhlIG9wdGlvbiB0byBzYXZlIHZpZXdzLiBBIHdvcmtzcGFjZSBhZG1pbiBjYW4gdXBkYXRlIHlvdXIgc2VhdCB0eXBlLlwiXHJcbiAgICAgICAgc2hvdy1jbG9zZXJcclxuICAgICAgICBAY2xvc2U9XCJoaWRlVmlld2VyU2VhdERpc2NsYWltZXIgPSB0cnVlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NhdmVkLXZpZXdzL1BhbmVsLnZ1ZTo5NDo3XCJcclxuICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPFZpZXdlclNhdmVkVmlld3NQYW5lbEdyb3Vwc0NyZWF0ZURpYWxvZ1xyXG4gICAgICB2LW1vZGVsOm9wZW49XCJzaG93Q3JlYXRlR3JvdXBEaWFsb2dcIlxyXG4gICAgICBAc3VjY2Vzcz1cIm9uQWRkR3JvdXBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlOjEwMTo1XCJcclxuICAgIC8+XHJcbiAgPC9WaWV3ZXJMYXlvdXRTaWRlUGFuZWw+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZU11dGF0aW9uTG9hZGluZyB9IGZyb20gJ0B2dWUvYXBvbGxvLWNvbXBvc2FibGUnXHJcbmltcG9ydCB7IFNlYXJjaCwgRm9sZGVyUGx1cywgUGx1cywgWCB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcclxuaW1wb3J0IHsgdXNlU3luY2hyb25pemVkQ29va2llIH0gZnJvbSAnfi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3JlYWN0aXZlQ29va2llJ1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwnXHJcbmltcG9ydCB7IFdvcmtzcGFjZVNlYXRUeXBlIH0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgdXNlQ3JlYXRlU2F2ZWRWaWV3IH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NhdmVkVmlld3MvbWFuYWdlbWVudCdcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHsgVmlld3NUeXBlLCB2aWV3c1R5cGVMYWJlbHMgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zYXZlZFZpZXdzJ1xyXG5pbXBvcnQgeyB1c2VEZWJvdW5jZWRUZXh0SW5wdXQgfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyB1c2VLZWVwQWxpdmVTY3JvbGxTdGF0ZSB9IGZyb20gJ34vbGliL2NvbW1vbi9jb21wb3NhYmxlcy9kb20nXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBWaWV3ZXJTYXZlZFZpZXdzUGFuZWxfUHJvamVjdCBvbiBQcm9qZWN0IHtcclxuICAgIGlkXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhbkNyZWF0ZVNhdmVkVmlldyB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB3b3Jrc3BhY2Uge1xyXG4gICAgICBpZFxyXG4gICAgICBzZWF0VHlwZVxyXG4gICAgICBwbGFuU3VwcG9ydHNTYXZlZFZpZXdzOiBoYXNBY2Nlc3NUb0ZlYXR1cmUoZmVhdHVyZU5hbWU6IHNhdmVkVmlld3MpXHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuZGVmaW5lRW1pdHM8e1xyXG4gIGNsb3NlOiBbXVxyXG59PigpXHJcblxyXG5jb25zdCB7XHJcbiAgcmVzb3VyY2VzOiB7XHJcbiAgICByZXNwb25zZTogeyBwcm9qZWN0IH1cclxuICB9LFxyXG4gIHVpOiB7XHJcbiAgICBzYXZlZFZpZXdzOiB7IG9wZW5lZEdyb3VwU3RhdGUgfVxyXG4gIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5jb25zdCBjcmVhdGVTYXZlZFZpZXcgPSB1c2VDcmVhdGVTYXZlZFZpZXcoKVxyXG5jb25zdCBpc0xvYWRpbmcgPSB1c2VNdXRhdGlvbkxvYWRpbmcoKVxyXG5jb25zdCB7IG9uLCBiaW5kLCB2YWx1ZTogc2VhcmNoIH0gPSB1c2VEZWJvdW5jZWRUZXh0SW5wdXQoKVxyXG5cclxuY29uc3Qgc2VsZWN0ZWRWaWV3c1R5cGUgPSByZWY8Vmlld3NUeXBlPihWaWV3c1R5cGUuQWxsKVxyXG5jb25zdCBoaWRlVmlld2VyU2VhdERpc2NsYWltZXIgPSB1c2VTeW5jaHJvbml6ZWRDb29raWU8Ym9vbGVhbj4oXHJcbiAgJ2hpZGVWaWV3ZXJTZWF0U2F2ZWRWaWV3c0Rpc2NsYWltZXInLFxyXG4gIHtcclxuICAgIGRlZmF1bHQ6ICgpID0+IGZhbHNlXHJcbiAgfVxyXG4pXHJcbmNvbnN0IHNlYXJjaE1vZGUgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNob3dDcmVhdGVHcm91cERpYWxvZyA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IHsgZ2V0VG9vbHRpcFByb3BzIH0gPSB1c2VTbWFydFRvb2x0aXBEZWxheSgpXHJcbnVzZUtlZXBBbGl2ZVNjcm9sbFN0YXRlKHVzZVRlbXBsYXRlUmVmKCdncm91cHNTY3JvbGxBcmVhJykpXHJcblxyXG5jb25zdCBjYW5DcmVhdGVWaWV3T3JHcm91cCA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHByb2plY3QudmFsdWU/LnBlcm1pc3Npb25zLmNhbkNyZWF0ZVNhdmVkVmlld1xyXG4pXHJcbmNvbnN0IGlzVmlld2VyU2VhdCA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHByb2plY3QudmFsdWU/LndvcmtzcGFjZT8uc2VhdFR5cGUgPT09IFdvcmtzcGFjZVNlYXRUeXBlLlZpZXdlclxyXG4pXHJcbmNvbnN0IG9uQWRkVmlldyA9IGFzeW5jICgpID0+IHtcclxuICBpZiAoaXNMb2FkaW5nLnZhbHVlKSByZXR1cm5cclxuICBjb25zdCB2aWV3ID0gYXdhaXQgY3JlYXRlU2F2ZWRWaWV3KHt9KVxyXG4gIGlmICh2aWV3KSB7XHJcbiAgICAvLyBBdXRvLW9wZW4gdGhlIGdyb3VwIHRoYXQgdGhlIHZpZXcgY3JlYXRlZCB0b1xyXG4gICAgb3BlbmVkR3JvdXBTdGF0ZS52YWx1ZS5zZXQodmlldy5ncm91cC5pZCwgdHJ1ZSlcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uQWRkR3JvdXAgPSBhc3luYyAoZ3JvdXA6IHsgaWQ6IHN0cmluZyB9KSA9PiB7XHJcbiAgb3BlbmVkR3JvdXBTdGF0ZS52YWx1ZS5zZXQoZ3JvdXAuaWQsIHRydWUpXHJcbn1cclxuXHJcbmNvbnN0IHNldFNlYXJjaE1vZGUgPSAodmFsOiBib29sZWFuKSA9PiB7XHJcbiAgaWYgKHZhbCkge1xyXG4gICAgc2VhcmNoTW9kZS52YWx1ZSA9IHRydWVcclxuICB9IGVsc2Uge1xyXG4gICAgc2VhcmNoTW9kZS52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBzZWFyY2gudmFsdWUgPSAnJ1xyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvc2F2ZWQtdmlld3MvUGFuZWwudnVlIn0=