293 lines
30 KiB
Plaintext
293 lines
30 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/models/VirtualTreeItem.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/ExpansionTriangle.vue";
|
|
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/VisibilityButton.vue";
|
|
import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/IsolateButton.vue";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createElementVNode as __createElementVNode,createBlock as __createBlock,createElementBlock as __createElementBlock,createVNode as __createVNode } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...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 { containsAll } from "/_nuxt/lib/common/helpers/utils.ts";
|
|
import {
|
|
getTargetObjectIds,
|
|
getHeaderAndSubheaderForSpeckleObject
|
|
} from "/_nuxt/lib/object-sidebar/helpers.ts";
|
|
import {
|
|
useSelectionUtilities,
|
|
useHighlightedObjectsUtilities,
|
|
useCameraUtilities
|
|
} from "/_nuxt/lib/viewer/composables/ui.ts";
|
|
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
|
|
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
|
|
import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ViewerModelsVirtualTreeItem",
|
|
props: {
|
|
item: { type: Object, required: true }
|
|
},
|
|
emits: ["toggle-expansion", "item-click"],
|
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
__expose();
|
|
const props = __props;
|
|
const emit = __emit;
|
|
const { objects: selectedObjects } = useSelectionUtilities();
|
|
const { hideObjects, showObjects, isolateObjects, unIsolateObjects } = useFilterUtilities();
|
|
const { highlightObjects, unhighlightObjects } = useHighlightedObjectsUtilities();
|
|
const { zoom } = useCameraUtilities();
|
|
const {
|
|
viewer: {
|
|
metadata: { filteringState }
|
|
},
|
|
ui: { filters }
|
|
} = useInjectedViewerState();
|
|
const hiddenObjects = computed(() => filteringState.value?.hiddenObjects);
|
|
const { isolatedObjectsSet } = filters;
|
|
const stateHasIsolatedObjectsInGeneral = computed(() => {
|
|
if (!isolatedObjectsSet.value) return false;
|
|
return isolatedObjectsSet.value.size > 0;
|
|
});
|
|
const rawSpeckleData = computed(() => {
|
|
if (props.item.type !== "tree-item") return null;
|
|
const node = props.item.data;
|
|
return node.raw || null;
|
|
});
|
|
const isTreeItemHidden = computed(() => {
|
|
if (!rawSpeckleData.value || !hiddenObjects.value) return false;
|
|
const ids = getTargetObjectIds(rawSpeckleData.value);
|
|
return containsAll(ids, hiddenObjects.value);
|
|
});
|
|
const isTreeItemIsolated = computed(() => {
|
|
if (!rawSpeckleData.value || !isolatedObjectsSet.value) return false;
|
|
const ids = getTargetObjectIds(rawSpeckleData.value);
|
|
const isolatedObjectsArray = Array.from(isolatedObjectsSet.value);
|
|
return containsAll(ids, isolatedObjectsArray);
|
|
});
|
|
const toggleTreeItemVisibility = () => {
|
|
if (!rawSpeckleData.value) return;
|
|
const ids = getTargetObjectIds(rawSpeckleData.value);
|
|
if (!isTreeItemHidden.value) {
|
|
hideObjects(ids);
|
|
} else {
|
|
showObjects(ids);
|
|
}
|
|
};
|
|
const toggleTreeItemIsolation = () => {
|
|
if (!rawSpeckleData.value) return;
|
|
const ids = getTargetObjectIds(rawSpeckleData.value);
|
|
if (!isTreeItemIsolated.value) {
|
|
isolateObjects(ids);
|
|
} else {
|
|
unIsolateObjects(ids);
|
|
}
|
|
};
|
|
const toggleExpansion = () => {
|
|
emit("toggle-expansion", props.item.id);
|
|
};
|
|
const handleItemClick = (event) => {
|
|
emit("item-click", props.item, event);
|
|
};
|
|
const handleItemDoubleClick = () => {
|
|
if (!rawSpeckleData.value?.id) return;
|
|
zoom([rawSpeckleData.value.id]);
|
|
};
|
|
const handleItemMouseEnter = () => {
|
|
if (!rawSpeckleData.value) return;
|
|
highlightObjects(getTargetObjectIds(rawSpeckleData.value));
|
|
};
|
|
const handleItemMouseLeave = () => {
|
|
if (!rawSpeckleData.value) return;
|
|
unhighlightObjects(getTargetObjectIds(rawSpeckleData.value));
|
|
};
|
|
const getItemBackgroundClass = () => {
|
|
if (props.item.type !== "tree-item") return "";
|
|
const node = props.item.data;
|
|
const speckleData = node.raw;
|
|
if (!speckleData?.id) return "";
|
|
const isSelected = selectedObjects.value.find((o) => o.id === speckleData.id);
|
|
const isChildOfSelected = props.item.isDescendantOfSelected;
|
|
if (isSelected) return "bg-highlight-3 rounded-sm";
|
|
if (isChildOfSelected) return "bg-foundation-2 hover:bg-highlight-3";
|
|
return "bg-foundation hover:bg-highlight-1 hover:rounded-sm";
|
|
};
|
|
const getItemOpacityClass = () => {
|
|
if (!rawSpeckleData.value) return "";
|
|
const isHidden = isTreeItemHidden.value;
|
|
const isIsolated = isTreeItemIsolated.value;
|
|
if (isHidden || !isIsolated && stateHasIsolatedObjectsInGeneral.value) {
|
|
return "opacity-60";
|
|
}
|
|
return "";
|
|
};
|
|
const getItemTextColorClass = () => {
|
|
if (!rawSpeckleData.value) return "";
|
|
const isHidden = isTreeItemHidden.value;
|
|
const isIsolated = isTreeItemIsolated.value;
|
|
if (isHidden || !isIsolated && stateHasIsolatedObjectsInGeneral.value) {
|
|
return "text-foreground-2";
|
|
}
|
|
return "";
|
|
};
|
|
const getTreeItemHeader = () => {
|
|
if (props.item.type !== "tree-item") return "";
|
|
const node = props.item.data;
|
|
const speckleData = node.raw;
|
|
if (!speckleData) return "";
|
|
const { header } = getHeaderAndSubheaderForSpeckleObject(speckleData);
|
|
return header;
|
|
};
|
|
const getTreeItemSubheader = () => {
|
|
if (props.item.type !== "tree-item") return "";
|
|
const node = props.item.data;
|
|
const speckleData = node.raw;
|
|
if (!speckleData) return "";
|
|
const { subheader } = getHeaderAndSubheaderForSpeckleObject(speckleData);
|
|
return subheader;
|
|
};
|
|
const __returned__ = { props, emit, selectedObjects, hideObjects, showObjects, isolateObjects, unIsolateObjects, highlightObjects, unhighlightObjects, zoom, filteringState, filters, hiddenObjects, isolatedObjectsSet, stateHasIsolatedObjectsInGeneral, rawSpeckleData, isTreeItemHidden, isTreeItemIsolated, toggleTreeItemVisibility, toggleTreeItemIsolation, toggleExpansion, handleItemClick, handleItemDoubleClick, handleItemMouseEnter, handleItemMouseLeave, getItemBackgroundClass, getItemOpacityClass, getItemTextColorClass, getTreeItemHeader, getTreeItemSubheader };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { normalizeStyle as _normalizeStyle, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = {
|
|
class: "px-1",
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:2:3"
|
|
};
|
|
const _hoisted_2 = {
|
|
class: "flex items-center gap-0.5 min-w-0",
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:14:7"
|
|
};
|
|
const _hoisted_3 = {
|
|
key: 1,
|
|
class: "w-4 shrink-0",
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:27:9"
|
|
};
|
|
const _hoisted_4 = {
|
|
class: "truncate text-body-2xs",
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:34:11"
|
|
};
|
|
const _hoisted_5 = {
|
|
class: "truncate text-body-3xs text-foreground-2",
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:37:11"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_ViewerExpansionTriangle = __nuxt_component_0;
|
|
const _component_ViewerVisibilityButton = __nuxt_component_1;
|
|
const _component_ViewerIsolateButton = __nuxt_component_2;
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_createElementVNode(
|
|
"button",
|
|
{
|
|
type: "button",
|
|
class: _normalizeClass(["group flex items-center w-full p-1 pr-2 cursor-pointer text-left justify-between", [$setup.getItemBackgroundClass(), $setup.getItemOpacityClass()]]),
|
|
onClick: _cache[3] || (_cache[3] = ($event) => $setup.handleItemClick($event)),
|
|
onDblclick: _cache[4] || (_cache[4] = ($event) => $setup.handleItemDoubleClick()),
|
|
onMouseenter: _cache[5] || (_cache[5] = ($event) => $setup.handleItemMouseEnter()),
|
|
onMouseleave: _cache[6] || (_cache[6] = ($event) => $setup.handleItemMouseLeave()),
|
|
onFocusin: _cache[7] || (_cache[7] = ($event) => $setup.handleItemMouseEnter()),
|
|
onFocusout: _cache[8] || (_cache[8] = ($event) => $setup.handleItemMouseLeave()),
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:3:5"
|
|
},
|
|
[
|
|
_createElementVNode("div", _hoisted_2, [
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
style: _normalizeStyle({ width: `${($props.item.indent || 0) * 0.375}rem` }),
|
|
class: "shrink-0",
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:15:9"
|
|
},
|
|
null,
|
|
4
|
|
/* STYLE */
|
|
),
|
|
$props.item.hasChildren ? (_openBlock(), _createBlock(_component_ViewerExpansionTriangle, {
|
|
key: 0,
|
|
class: _normalizeClass(["h-8", $setup.getItemOpacityClass()]),
|
|
"is-expanded": $props.item.isExpanded,
|
|
onClick: _cache[0] || (_cache[0] = ($event) => $setup.toggleExpansion()),
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:20:9"
|
|
}, null, 8, ["is-expanded", "class"])) : (_openBlock(), _createElementBlock("div", _hoisted_3)),
|
|
_createCommentVNode(" Item content "),
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(["flex min-w-0 flex-col", [$setup.getItemTextColorClass(), $setup.getItemOpacityClass()]]),
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:30:9"
|
|
},
|
|
[
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_4,
|
|
_toDisplayString($setup.getTreeItemHeader()),
|
|
1
|
|
/* TEXT */
|
|
),
|
|
_createElementVNode(
|
|
"div",
|
|
_hoisted_5,
|
|
_toDisplayString($setup.getTreeItemSubheader()),
|
|
1
|
|
/* TEXT */
|
|
)
|
|
],
|
|
2
|
|
/* CLASS */
|
|
)
|
|
]),
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(["flex items-center group-hover:w-auto overflow-hidden shrink-0", $setup.isTreeItemHidden || $setup.isTreeItemIsolated ? "w-auto" : "sm:w-0"]),
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:43:7"
|
|
},
|
|
[
|
|
_createVNode(_component_ViewerVisibilityButton, {
|
|
"is-hidden": $setup.isTreeItemHidden,
|
|
onClick: _cache[1] || (_cache[1] = ($event) => $setup.toggleTreeItemVisibility()),
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:47:9"
|
|
}, null, 8, ["is-hidden"]),
|
|
_createVNode(_component_ViewerIsolateButton, {
|
|
"is-isolated": $setup.isTreeItemIsolated,
|
|
onClick: _cache[2] || (_cache[2] = ($event) => $setup.toggleTreeItemIsolation()),
|
|
"data-v-inspector": "components/viewer/models/VirtualTreeItem.vue:51:9"
|
|
}, null, 8, ["is-isolated"])
|
|
],
|
|
2
|
|
/* CLASS */
|
|
)
|
|
],
|
|
34
|
|
/* CLASS, NEED_HYDRATION */
|
|
)
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "76d1a6a0";
|
|
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/models/VirtualTreeItem.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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QUFLLGlCQUFDLE9BRUUsMkJBQW1CO0FBQUEsWUFEMUIsZUFBYSxZQUFLO0FBQUEsWUFFbEIsU0FBSyxzQ0FBRSx1QkFBZTtBQUFBLFlBQUksb0JBQWlCO0FBQUEsa0VBRTlDLG9CQUE0RyxPQUE1RyxVQUE0RztBQUFBLFVBRTVHO0FBQUEsVUFDQTtBQUFBLFlBVU07QUFBQTtBQUFBLGNBVEosT0FBSyxpQkFBQyx5QkFBdUIsQ0FDcEIsNkJBQXFCLEdBQUksMkJBQW1CO0FBQUEsY0FBSyxvQkFBaUI7QUFBQTs7Y0FFM0U7QUFBQSxnQkFFTTtBQUFBLGdCQUZOO0FBQUEsZ0JBRU0saUJBREQseUJBQWlCO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FFdEI7QUFBQSxnQkFFTTtBQUFBLGdCQUZOO0FBQUEsZ0JBRU0saUJBREQsNEJBQW9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7O1FBSzdCO0FBQUEsVUFZTTtBQUFBO0FBQUEsWUFYSixPQUFLLGlCQUFDLGlFQUNFLDJCQUFvQiw0QkFBa0I7QUFBQSxZQUF3QixvQkFBaUI7QUFBQTs7WUFFdkYsYUFHRTtBQUFBLGNBRkMsYUFBVztBQUFBLGNBQ1gsU0FBSyxzQ0FBRSxnQ0FBd0I7QUFBQSxjQUFJLG9CQUFpQjtBQUFBO1lBRXZELGFBR0U7QUFBQSxjQUZDLGVBQWE7QUFBQSxjQUNiLFNBQUssc0NBQUUsK0JBQXVCO0FBQUEsY0FBSSxvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiVmlydHVhbFRyZWVJdGVtLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInB4LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MjozXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cImdyb3VwIGZsZXggaXRlbXMtY2VudGVyIHctZnVsbCBwLTEgcHItMiBjdXJzb3ItcG9pbnRlciB0ZXh0LWxlZnQganVzdGlmeS1iZXR3ZWVuXCJcclxuICAgICAgOmNsYXNzPVwiW2dldEl0ZW1CYWNrZ3JvdW5kQ2xhc3MoKSwgZ2V0SXRlbU9wYWNpdHlDbGFzcygpXVwiXHJcbiAgICAgIEBjbGljaz1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCJcclxuICAgICAgQGRibGNsaWNrPVwiaGFuZGxlSXRlbURvdWJsZUNsaWNrKClcIlxyXG4gICAgICBAbW91c2VlbnRlcj1cImhhbmRsZUl0ZW1Nb3VzZUVudGVyKClcIlxyXG4gICAgICBAbW91c2VsZWF2ZT1cImhhbmRsZUl0ZW1Nb3VzZUxlYXZlKClcIlxyXG4gICAgICBAZm9jdXNpbj1cImhhbmRsZUl0ZW1Nb3VzZUVudGVyKClcIlxyXG4gICAgICBAZm9jdXNvdXQ9XCJoYW5kbGVJdGVtTW91c2VMZWF2ZSgpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9WaXJ0dWFsVHJlZUl0ZW0udnVlOjM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMC41IG1pbi13LTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MTQ6N1wiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIDpzdHlsZT1cInsgd2lkdGg6IGAkeyhpdGVtLmluZGVudCB8fCAwKSAqIDAuMzc1fXJlbWAgfVwiXHJcbiAgICAgICAgICBjbGFzcz1cInNocmluay0wXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9WaXJ0dWFsVHJlZUl0ZW0udnVlOjE1OjlcIlxyXG4gICAgICAgID48L2Rpdj5cclxuXHJcbiAgICAgICAgPFZpZXdlckV4cGFuc2lvblRyaWFuZ2xlXHJcbiAgICAgICAgICB2LWlmPVwiaXRlbS5oYXNDaGlsZHJlblwiXHJcbiAgICAgICAgICBjbGFzcz1cImgtOFwiXHJcbiAgICAgICAgICA6aXMtZXhwYW5kZWQ9XCJpdGVtLmlzRXhwYW5kZWRcIlxyXG4gICAgICAgICAgOmNsYXNzPVwiZ2V0SXRlbU9wYWNpdHlDbGFzcygpXCJcclxuICAgICAgICAgIEBjbGljaz1cInRvZ2dsZUV4cGFuc2lvbigpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL21vZGVscy9WaXJ0dWFsVHJlZUl0ZW0udnVlOjIwOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPGRpdiB2LWVsc2UgY2xhc3M9XCJ3LTQgc2hyaW5rLTBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6Mjc6OVwiPjwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIEl0ZW0gY29udGVudCAtLT5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggbWluLXctMCBmbGV4LWNvbFwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJbZ2V0SXRlbVRleHRDb2xvckNsYXNzKCksIGdldEl0ZW1PcGFjaXR5Q2xhc3MoKV1cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MzA6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRydW5jYXRlIHRleHQtYm9keS0yeHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6MzQ6MTFcIj5cclxuICAgICAgICAgICAge3sgZ2V0VHJlZUl0ZW1IZWFkZXIoKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHJ1bmNhdGUgdGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9tb2RlbHMvVmlydHVhbFRyZWVJdGVtLnZ1ZTozNzoxMVwiPlxyXG4gICAgICAgICAgICB7eyBnZXRUcmVlSXRlbVN1YmhlYWRlcigpIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBncm91cC1ob3Zlcjp3LWF1dG8gb3ZlcmZsb3ctaGlkZGVuIHNocmluay0wXCJcclxuICAgICAgICA6Y2xhc3M9XCJpc1RyZWVJdGVtSGlkZGVuIHx8IGlzVHJlZUl0ZW1Jc29sYXRlZCA/ICd3LWF1dG8nIDogJ3NtOnctMCdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6NDM6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8Vmlld2VyVmlzaWJpbGl0eUJ1dHRvblxyXG4gICAgICAgICAgOmlzLWhpZGRlbj1cImlzVHJlZUl0ZW1IaWRkZW5cIlxyXG4gICAgICAgICAgQGNsaWNrPVwidG9nZ2xlVHJlZUl0ZW1WaXNpYmlsaXR5KClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6NDc6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICA8Vmlld2VySXNvbGF0ZUJ1dHRvblxyXG4gICAgICAgICAgOmlzLWlzb2xhdGVkPVwiaXNUcmVlSXRlbUlzb2xhdGVkXCJcclxuICAgICAgICAgIEBjbGljaz1cInRvZ2dsZVRyZWVJdGVtSXNvbGF0aW9uKClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWU6NTE6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB0eXBlIHsgRXhwbG9yZXJOb2RlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9oZWxwZXJzL3NjZW5lRXhwbG9yZXInXHJcbmltcG9ydCB7IGNvbnRhaW5zQWxsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL3V0aWxzJ1xyXG5pbXBvcnQge1xyXG4gIGdldFRhcmdldE9iamVjdElkcyxcclxuICBnZXRIZWFkZXJBbmRTdWJoZWFkZXJGb3JTcGVja2xlT2JqZWN0XHJcbn0gZnJvbSAnfn4vbGliL29iamVjdC1zaWRlYmFyL2hlbHBlcnMnXHJcbmltcG9ydCB7XHJcbiAgdXNlU2VsZWN0aW9uVXRpbGl0aWVzLFxyXG4gIHVzZUhpZ2hsaWdodGVkT2JqZWN0c1V0aWxpdGllcyxcclxuICB1c2VDYW1lcmFVdGlsaXRpZXNcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB0eXBlIHsgVW5pZmllZFZpcnR1YWxJdGVtIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy90cmVlJ1xyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgaXRlbTogVW5pZmllZFZpcnR1YWxJdGVtXHJcbn0+KClcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgJ3RvZ2dsZS1leHBhbnNpb24nOiBbaXRlbUlkOiBzdHJpbmddXHJcbiAgJ2l0ZW0tY2xpY2snOiBbaXRlbTogVW5pZmllZFZpcnR1YWxJdGVtLCBldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnRdXHJcbn0+KClcclxuXHJcbmNvbnN0IHsgb2JqZWN0czogc2VsZWN0ZWRPYmplY3RzIH0gPSB1c2VTZWxlY3Rpb25VdGlsaXRpZXMoKVxyXG5jb25zdCB7IGhpZGVPYmplY3RzLCBzaG93T2JqZWN0cywgaXNvbGF0ZU9iamVjdHMsIHVuSXNvbGF0ZU9iamVjdHMgfSA9XHJcbiAgdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuY29uc3QgeyBoaWdobGlnaHRPYmplY3RzLCB1bmhpZ2hsaWdodE9iamVjdHMgfSA9IHVzZUhpZ2hsaWdodGVkT2JqZWN0c1V0aWxpdGllcygpXHJcbmNvbnN0IHsgem9vbSB9ID0gdXNlQ2FtZXJhVXRpbGl0aWVzKClcclxuXHJcbmNvbnN0IHtcclxuICB2aWV3ZXI6IHtcclxuICAgIG1ldGFkYXRhOiB7IGZpbHRlcmluZ1N0YXRlIH1cclxuICB9LFxyXG4gIHVpOiB7IGZpbHRlcnMgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcblxyXG5jb25zdCBoaWRkZW5PYmplY3RzID0gY29tcHV0ZWQoKCkgPT4gZmlsdGVyaW5nU3RhdGUudmFsdWU/LmhpZGRlbk9iamVjdHMpXHJcbi8vIFVzZSBzaW5nbGV0b24gaXNvbGF0ZWRPYmplY3RzU2V0IGZyb20gdmlld2VyIHN0YXRlXHJcbmNvbnN0IHsgaXNvbGF0ZWRPYmplY3RzU2V0IH0gPSBmaWx0ZXJzXHJcblxyXG5jb25zdCBzdGF0ZUhhc0lzb2xhdGVkT2JqZWN0c0luR2VuZXJhbCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIWlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZSkgcmV0dXJuIGZhbHNlXHJcbiAgcmV0dXJuIGlzb2xhdGVkT2JqZWN0c1NldC52YWx1ZS5zaXplID4gMFxyXG59KVxyXG5cclxuY29uc3QgcmF3U3BlY2tsZURhdGEgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKHByb3BzLml0ZW0udHlwZSAhPT0gJ3RyZWUtaXRlbScpIHJldHVybiBudWxsXHJcbiAgY29uc3Qgbm9kZSA9IHByb3BzLml0ZW0uZGF0YSBhcyBFeHBsb3Jlck5vZGVcclxuICByZXR1cm4gbm9kZS5yYXcgfHwgbnVsbFxyXG59KVxyXG5cclxuY29uc3QgaXNUcmVlSXRlbUhpZGRlbiA9IGNvbXB1dGVkKCgpOiBib29sZWFuID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlIHx8ICFoaWRkZW5PYmplY3RzLnZhbHVlKSByZXR1cm4gZmFsc2VcclxuICBjb25zdCBpZHMgPSBnZXRUYXJnZXRPYmplY3RJZHMocmF3U3BlY2tsZURhdGEudmFsdWUpXHJcbiAgcmV0dXJuIGNvbnRhaW5zQWxsKGlkcywgaGlkZGVuT2JqZWN0cy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGlzVHJlZUl0ZW1Jc29sYXRlZCA9IGNvbXB1dGVkKCgpOiBib29sZWFuID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlIHx8ICFpc29sYXRlZE9iamVjdHNTZXQudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gIGNvbnN0IGlkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSlcclxuICBjb25zdCBpc29sYXRlZE9iamVjdHNBcnJheSA9IEFycmF5LmZyb20oaXNvbGF0ZWRPYmplY3RzU2V0LnZhbHVlKVxyXG4gIHJldHVybiBjb250YWluc0FsbChpZHMsIGlzb2xhdGVkT2JqZWN0c0FycmF5KVxyXG59KVxyXG5cclxuY29uc3QgdG9nZ2xlVHJlZUl0ZW1WaXNpYmlsaXR5ID0gKCkgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVyblxyXG4gIGNvbnN0IGlkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSlcclxuXHJcbiAgaWYgKCFpc1RyZWVJdGVtSGlkZGVuLnZhbHVlKSB7XHJcbiAgICBoaWRlT2JqZWN0cyhpZHMpXHJcbiAgfSBlbHNlIHtcclxuICAgIHNob3dPYmplY3RzKGlkcylcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHRvZ2dsZVRyZWVJdGVtSXNvbGF0aW9uID0gKCkgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVyblxyXG4gIGNvbnN0IGlkcyA9IGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSlcclxuXHJcbiAgaWYgKCFpc1RyZWVJdGVtSXNvbGF0ZWQudmFsdWUpIHtcclxuICAgIGlzb2xhdGVPYmplY3RzKGlkcylcclxuICB9IGVsc2Uge1xyXG4gICAgdW5Jc29sYXRlT2JqZWN0cyhpZHMpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCB0b2dnbGVFeHBhbnNpb24gPSAoKSA9PiB7XHJcbiAgZW1pdCgndG9nZ2xlLWV4cGFuc2lvbicsIHByb3BzLml0ZW0uaWQpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1DbGljayA9IChldmVudDogTW91c2VFdmVudCB8IEtleWJvYXJkRXZlbnQpID0+IHtcclxuICBlbWl0KCdpdGVtLWNsaWNrJywgcHJvcHMuaXRlbSwgZXZlbnQpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1Eb3VibGVDbGljayA9ICgpID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlPy5pZCkgcmV0dXJuXHJcbiAgem9vbShbcmF3U3BlY2tsZURhdGEudmFsdWUuaWRdKVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVJdGVtTW91c2VFbnRlciA9ICgpID0+IHtcclxuICBpZiAoIXJhd1NwZWNrbGVEYXRhLnZhbHVlKSByZXR1cm5cclxuICBoaWdobGlnaHRPYmplY3RzKGdldFRhcmdldE9iamVjdElkcyhyYXdTcGVja2xlRGF0YS52YWx1ZSkpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUl0ZW1Nb3VzZUxlYXZlID0gKCkgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVyblxyXG4gIHVuaGlnaGxpZ2h0T2JqZWN0cyhnZXRUYXJnZXRPYmplY3RJZHMocmF3U3BlY2tsZURhdGEudmFsdWUpKVxyXG59XHJcblxyXG5jb25zdCBnZXRJdGVtQmFja2dyb3VuZENsYXNzID0gKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHByb3BzLml0ZW0udHlwZSAhPT0gJ3RyZWUtaXRlbScpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCBub2RlID0gcHJvcHMuaXRlbS5kYXRhIGFzIEV4cGxvcmVyTm9kZVxyXG4gIGNvbnN0IHNwZWNrbGVEYXRhID0gbm9kZS5yYXdcclxuICBpZiAoIXNwZWNrbGVEYXRhPy5pZCkgcmV0dXJuICcnXHJcblxyXG4gIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZE9iamVjdHMudmFsdWUuZmluZCgobykgPT4gby5pZCA9PT0gc3BlY2tsZURhdGEuaWQpXHJcbiAgY29uc3QgaXNDaGlsZE9mU2VsZWN0ZWQgPSBwcm9wcy5pdGVtLmlzRGVzY2VuZGFudE9mU2VsZWN0ZWRcclxuXHJcbiAgaWYgKGlzU2VsZWN0ZWQpIHJldHVybiAnYmctaGlnaGxpZ2h0LTMgcm91bmRlZC1zbSdcclxuICBpZiAoaXNDaGlsZE9mU2VsZWN0ZWQpIHJldHVybiAnYmctZm91bmRhdGlvbi0yIGhvdmVyOmJnLWhpZ2hsaWdodC0zJ1xyXG4gIHJldHVybiAnYmctZm91bmRhdGlvbiBob3ZlcjpiZy1oaWdobGlnaHQtMSBob3Zlcjpyb3VuZGVkLXNtJ1xyXG59XHJcblxyXG5jb25zdCBnZXRJdGVtT3BhY2l0eUNsYXNzID0gKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKCFyYXdTcGVja2xlRGF0YS52YWx1ZSkgcmV0dXJuICcnXHJcblxyXG4gIGNvbnN0IGlzSGlkZGVuID0gaXNUcmVlSXRlbUhpZGRlbi52YWx1ZVxyXG4gIGNvbnN0IGlzSXNvbGF0ZWQgPSBpc1RyZWVJdGVtSXNvbGF0ZWQudmFsdWVcclxuXHJcbiAgaWYgKGlzSGlkZGVuIHx8ICghaXNJc29sYXRlZCAmJiBzdGF0ZUhhc0lzb2xhdGVkT2JqZWN0c0luR2VuZXJhbC52YWx1ZSkpIHtcclxuICAgIHJldHVybiAnb3BhY2l0eS02MCdcclxuICB9XHJcbiAgcmV0dXJuICcnXHJcbn1cclxuXHJcbmNvbnN0IGdldEl0ZW1UZXh0Q29sb3JDbGFzcyA9ICgpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghcmF3U3BlY2tsZURhdGEudmFsdWUpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCBpc0hpZGRlbiA9IGlzVHJlZUl0ZW1IaWRkZW4udmFsdWVcclxuICBjb25zdCBpc0lzb2xhdGVkID0gaXNUcmVlSXRlbUlzb2xhdGVkLnZhbHVlXHJcblxyXG4gIGlmIChpc0hpZGRlbiB8fCAoIWlzSXNvbGF0ZWQgJiYgc3RhdGVIYXNJc29sYXRlZE9iamVjdHNJbkdlbmVyYWwudmFsdWUpKSB7XHJcbiAgICByZXR1cm4gJ3RleHQtZm9yZWdyb3VuZC0yJ1xyXG4gIH1cclxuICByZXR1cm4gJydcclxufVxyXG5cclxuY29uc3QgZ2V0VHJlZUl0ZW1IZWFkZXIgPSAoKTogc3RyaW5nID0+IHtcclxuICBpZiAocHJvcHMuaXRlbS50eXBlICE9PSAndHJlZS1pdGVtJykgcmV0dXJuICcnXHJcblxyXG4gIGNvbnN0IG5vZGUgPSBwcm9wcy5pdGVtLmRhdGEgYXMgRXhwbG9yZXJOb2RlXHJcbiAgY29uc3Qgc3BlY2tsZURhdGEgPSBub2RlLnJhd1xyXG4gIGlmICghc3BlY2tsZURhdGEpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCB7IGhlYWRlciB9ID0gZ2V0SGVhZGVyQW5kU3ViaGVhZGVyRm9yU3BlY2tsZU9iamVjdChzcGVja2xlRGF0YSlcclxuICByZXR1cm4gaGVhZGVyXHJcbn1cclxuXHJcbmNvbnN0IGdldFRyZWVJdGVtU3ViaGVhZGVyID0gKCk6IHN0cmluZyA9PiB7XHJcbiAgaWYgKHByb3BzLml0ZW0udHlwZSAhPT0gJ3RyZWUtaXRlbScpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCBub2RlID0gcHJvcHMuaXRlbS5kYXRhIGFzIEV4cGxvcmVyTm9kZVxyXG4gIGNvbnN0IHNwZWNrbGVEYXRhID0gbm9kZS5yYXdcclxuICBpZiAoIXNwZWNrbGVEYXRhKSByZXR1cm4gJydcclxuXHJcbiAgY29uc3QgeyBzdWJoZWFkZXIgfSA9IGdldEhlYWRlckFuZFN1YmhlYWRlckZvclNwZWNrbGVPYmplY3Qoc3BlY2tsZURhdGEpXHJcbiAgcmV0dXJuIHN1YmhlYWRlclxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvbW9kZWxzL1ZpcnR1YWxUcmVlSXRlbS52dWUifQ== |