Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_000153
T

163 lines
17 KiB
Plaintext

import { useInjectedViewerInterfaceState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { useViewerAnchoredPoints } from "/_nuxt/lib/viewer/composables/anchorPoints.ts";
import { useSelectionEvents } from "/_nuxt/lib/viewer/composables/viewer.ts";
import { useSelectionUtilities, useCameraUtilities } from "/_nuxt/lib/viewer/composables/ui.ts";
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
import { useEventListener } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import { useClipboard } from "/_nuxt/composables/browser.ts";
import { ref, computed, nextTick, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
export function useViewerContextMenu(params) {
const { parentEl, isOpen } = params;
const { filters } = useInjectedViewerInterfaceState();
const { setSelectionFromObjectIds, clearSelection } = useSelectionUtilities();
const { isolateObjects, hideObjects, unIsolateObjects } = useFilterUtilities();
const { copy } = useClipboard();
const { zoomExtentsOrSelection } = useCameraUtilities();
useEventListener(
parentEl,
"contextmenu",
(event) => {
event.preventDefault();
event.stopPropagation();
},
{ passive: false }
);
const contextMenuState = ref({
isVisible: false,
clickLocation: null,
selectedObjectId: null,
style: {}
});
const contextMenuItems = computed(() => {
const selectedObject = filters.selectedObjects.value[0];
if (!selectedObject) return [];
const isIsolated = filters.isolatedObjectIds.value.includes(selectedObject.id);
return [
[
{
id: "hide",
title: "Hide selection",
icon: void 0
},
{
id: isIsolated ? "unisolate" : "isolate",
title: isIsolated ? "Un-isolate selection" : "Isolate selection",
icon: void 0
},
{
id: "fit-to-view",
title: "Fit to view",
icon: void 0
},
{
id: "copy-id",
title: "Copy Object ID",
icon: void 0
}
],
[
{
id: "clear-selection",
title: "Clear selection",
icon: void 0
}
]
];
});
const shouldShowContextMenu = computed(() => {
return contextMenuState.value.isVisible && filters.selectedObjects.value.length > 0;
});
const { updatePositions } = useViewerAnchoredPoints({
parentEl,
points: computed(() => contextMenuState.value),
pointLocationGetter: (b) => b.clickLocation,
updatePositionCallback: (state, result) => {
state.style = {
...state.style,
...result.style,
opacity: result.isOccluded ? "0.8" : "1.0"
};
}
});
const closeContextMenu = () => {
contextMenuState.value.isVisible = false;
contextMenuState.value.clickLocation = null;
contextMenuState.value.selectedObjectId = null;
isOpen.value = false;
};
const onItemChosen = ({ item }) => {
closeContextMenu();
const selectedObject = filters.selectedObjects.value[0];
if (!selectedObject) return;
switch (item.id) {
case "hide": {
hideObjects([selectedObject.id]);
break;
}
case "isolate": {
isolateObjects([selectedObject.id]);
break;
}
case "unisolate": {
unIsolateObjects([selectedObject.id]);
break;
}
case "copy-id": {
copy(selectedObject.id);
break;
}
case "fit-to-view": {
zoomExtentsOrSelection();
break;
}
case "clear-selection": {
clearSelection();
break;
}
}
};
useSelectionEvents({
singleClickCallback: (event, { firstVisibleSelectionHit }) => {
if (event?.event && event.event.button === 2) {
if (firstVisibleSelectionHit) {
const clickLocation = firstVisibleSelectionHit.point.clone();
const selectedObjectId = firstVisibleSelectionHit.node.model.id;
setSelectionFromObjectIds([selectedObjectId]);
contextMenuState.value.clickLocation = clickLocation;
contextMenuState.value.selectedObjectId = selectedObjectId;
contextMenuState.value.isVisible = true;
isOpen.value = true;
nextTick(() => {
updatePositions();
});
} else {
closeContextMenu();
}
}
if (event?.event && event.event.button === 0 && isOpen.value) {
closeContextMenu();
}
}
});
watch(
() => filters.selectedObjectIds.value,
(newSelectionIds) => {
if (contextMenuState.value.isVisible) {
const currentMenuObjectId = contextMenuState.value.selectedObjectId;
if (!newSelectionIds.has(currentMenuObjectId || "")) {
closeContextMenu();
}
}
}
);
return {
contextMenuState,
contextMenuItems,
shouldShowContextMenu,
onItemChosen,
closeContextMenu
};
}
//# sourceMappingURL=data:application/json;base64,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QUFNLFFBQVEsa0JBQWtCO0FBQUEsSUFDaEMsQ0FBQyxvQkFBb0I7QUFDbkIsVUFBSSxpQkFBaUIsTUFBTSxXQUFXO0FBQ3BDLGNBQU0sc0JBQXNCLGlCQUFpQixNQUFNO0FBQ25ELFlBQUksQ0FBQyxnQkFBZ0IsSUFBSSx1QkFBdUIsRUFBRSxHQUFHO0FBQ25ELDJCQUFpQjtBQUFBLFFBQ25CO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJjb250ZXh0TWVudS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tICd2dWUnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VySW50ZXJmYWNlU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgdHlwZSB7IFZlY3RvcjMgfSBmcm9tICd0aHJlZSdcclxuaW1wb3J0IHsgdXNlVmlld2VyQW5jaG9yZWRQb2ludHMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2FuY2hvclBvaW50cydcclxuaW1wb3J0IHsgdXNlU2VsZWN0aW9uRXZlbnRzIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy92aWV3ZXInXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0TWVudUl0ZW0gfSBmcm9tICd+fi9saWIvbGF5b3V0L2hlbHBlcnMvY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlU2VsZWN0aW9uVXRpbGl0aWVzLCB1c2VDYW1lcmFVdGlsaXRpZXMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5pbXBvcnQgeyB1c2VGaWx0ZXJVdGlsaXRpZXMgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvZmlsdGVyaW5nL2ZpbHRlcmluZydcclxuaW1wb3J0IHsgdXNlRXZlbnRMaXN0ZW5lciB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuXHJcbmV4cG9ydCB0eXBlIFZpZXdlckNvbnRleHRNZW51TW9kZWwgPSB7XHJcbiAgaXNWaXNpYmxlOiBib29sZWFuXHJcbiAgY2xpY2tMb2NhdGlvbjogTnVsbGFibGU8VmVjdG9yMz5cclxuICBzZWxlY3RlZE9iamVjdElkOiBOdWxsYWJsZTxzdHJpbmc+XHJcbiAgc3R5bGU6IFBhcnRpYWw8Q1NTUHJvcGVydGllcz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVZpZXdlckNvbnRleHRNZW51KHBhcmFtczoge1xyXG4gIHBhcmVudEVsOiBSZWY8TnVsbGFibGU8SFRNTEVsZW1lbnQ+PlxyXG4gIGlzT3BlbjogUmVmPGJvb2xlYW4+XHJcbn0pIHtcclxuICBjb25zdCB7IHBhcmVudEVsLCBpc09wZW4gfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHsgZmlsdGVycyB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcbiAgY29uc3QgeyBzZXRTZWxlY3Rpb25Gcm9tT2JqZWN0SWRzLCBjbGVhclNlbGVjdGlvbiB9ID0gdXNlU2VsZWN0aW9uVXRpbGl0aWVzKClcclxuICBjb25zdCB7IGlzb2xhdGVPYmplY3RzLCBoaWRlT2JqZWN0cywgdW5Jc29sYXRlT2JqZWN0cyB9ID0gdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuICBjb25zdCB7IGNvcHkgfSA9IHVzZUNsaXBib2FyZCgpXHJcbiAgY29uc3QgeyB6b29tRXh0ZW50c09yU2VsZWN0aW9uIH0gPSB1c2VDYW1lcmFVdGlsaXRpZXMoKVxyXG5cclxuICAvLyBQcmV2ZW50IG5hdGl2ZSBjb250ZXh0IG1lbnUgb24gdGhlIHZpZXdlclxyXG4gIHVzZUV2ZW50TGlzdGVuZXIoXHJcbiAgICBwYXJlbnRFbCxcclxuICAgICdjb250ZXh0bWVudScsXHJcbiAgICAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfSxcclxuICAgIHsgcGFzc2l2ZTogZmFsc2UgfVxyXG4gIClcclxuXHJcbiAgY29uc3QgY29udGV4dE1lbnVTdGF0ZSA9IHJlZjxWaWV3ZXJDb250ZXh0TWVudU1vZGVsPih7XHJcbiAgICBpc1Zpc2libGU6IGZhbHNlLFxyXG4gICAgY2xpY2tMb2NhdGlvbjogbnVsbCxcclxuICAgIHNlbGVjdGVkT2JqZWN0SWQ6IG51bGwsXHJcbiAgICBzdHlsZToge31cclxuICB9KVxyXG5cclxuICAvLyBHZW5lcmF0ZSBjb250ZXh0IG1lbnUgaXRlbXMgYmFzZWQgb24gc2VsZWN0ZWQgb2JqZWN0c1xyXG4gIGNvbnN0IGNvbnRleHRNZW51SXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IHtcclxuICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0ID0gZmlsdGVycy5zZWxlY3RlZE9iamVjdHMudmFsdWVbMF1cclxuICAgIGlmICghc2VsZWN0ZWRPYmplY3QpIHJldHVybiBbXVxyXG5cclxuICAgIGNvbnN0IGlzSXNvbGF0ZWQgPSBmaWx0ZXJzLmlzb2xhdGVkT2JqZWN0SWRzLnZhbHVlLmluY2x1ZGVzKHNlbGVjdGVkT2JqZWN0LmlkKVxyXG5cclxuICAgIHJldHVybiBbXHJcbiAgICAgIFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2hpZGUnLFxyXG4gICAgICAgICAgdGl0bGU6ICdIaWRlIHNlbGVjdGlvbicsXHJcbiAgICAgICAgICBpY29uOiB1bmRlZmluZWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiBpc0lzb2xhdGVkID8gJ3VuaXNvbGF0ZScgOiAnaXNvbGF0ZScsXHJcbiAgICAgICAgICB0aXRsZTogaXNJc29sYXRlZCA/ICdVbi1pc29sYXRlIHNlbGVjdGlvbicgOiAnSXNvbGF0ZSBzZWxlY3Rpb24nLFxyXG4gICAgICAgICAgaWNvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2ZpdC10by12aWV3JyxcclxuICAgICAgICAgIHRpdGxlOiAnRml0IHRvIHZpZXcnLFxyXG4gICAgICAgICAgaWNvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2NvcHktaWQnLFxyXG4gICAgICAgICAgdGl0bGU6ICdDb3B5IE9iamVjdCBJRCcsXHJcbiAgICAgICAgICBpY29uOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgIF0sXHJcbiAgICAgIFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2NsZWFyLXNlbGVjdGlvbicsXHJcbiAgICAgICAgICB0aXRsZTogJ0NsZWFyIHNlbGVjdGlvbicsXHJcbiAgICAgICAgICBpY29uOiB1bmRlZmluZWRcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIF1cclxuICB9KVxyXG5cclxuICBjb25zdCBzaG91bGRTaG93Q29udGV4dE1lbnUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICByZXR1cm4gY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5pc1Zpc2libGUgJiYgZmlsdGVycy5zZWxlY3RlZE9iamVjdHMudmFsdWUubGVuZ3RoID4gMFxyXG4gIH0pXHJcblxyXG4gIC8vIFVzZSBhbmNob3JlZCBwb2ludHMgZm9yIHBvc2l0aW9uaW5nXHJcbiAgY29uc3QgeyB1cGRhdGVQb3NpdGlvbnMgfSA9IHVzZVZpZXdlckFuY2hvcmVkUG9pbnRzKHtcclxuICAgIHBhcmVudEVsLFxyXG4gICAgcG9pbnRzOiBjb21wdXRlZCgoKSA9PiBjb250ZXh0TWVudVN0YXRlLnZhbHVlKSxcclxuICAgIHBvaW50TG9jYXRpb25HZXR0ZXI6IChiKSA9PiBiLmNsaWNrTG9jYXRpb24sXHJcbiAgICB1cGRhdGVQb3NpdGlvbkNhbGxiYWNrOiAoc3RhdGUsIHJlc3VsdCkgPT4ge1xyXG4gICAgICBzdGF0ZS5zdHlsZSA9IHtcclxuICAgICAgICAuLi5zdGF0ZS5zdHlsZSxcclxuICAgICAgICAuLi5yZXN1bHQuc3R5bGUsXHJcbiAgICAgICAgb3BhY2l0eTogcmVzdWx0LmlzT2NjbHVkZWQgPyAnMC44JyA6ICcxLjAnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KVxyXG5cclxuICBjb25zdCBjbG9zZUNvbnRleHRNZW51ID0gKCkgPT4ge1xyXG4gICAgY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5pc1Zpc2libGUgPSBmYWxzZVxyXG4gICAgY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5jbGlja0xvY2F0aW9uID0gbnVsbFxyXG4gICAgY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5zZWxlY3RlZE9iamVjdElkID0gbnVsbFxyXG4gICAgaXNPcGVuLnZhbHVlID0gZmFsc2VcclxuICB9XHJcblxyXG4gIGNvbnN0IG9uSXRlbUNob3NlbiA9ICh7IGl0ZW0gfTogeyBpdGVtOiBMYXlvdXRNZW51SXRlbSB9KSA9PiB7XHJcbiAgICBjbG9zZUNvbnRleHRNZW51KClcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZE9iamVjdCA9IGZpbHRlcnMuc2VsZWN0ZWRPYmplY3RzLnZhbHVlWzBdXHJcbiAgICBpZiAoIXNlbGVjdGVkT2JqZWN0KSByZXR1cm5cclxuXHJcbiAgICBzd2l0Y2ggKGl0ZW0uaWQpIHtcclxuICAgICAgY2FzZSAnaGlkZSc6IHtcclxuICAgICAgICBoaWRlT2JqZWN0cyhbc2VsZWN0ZWRPYmplY3QuaWRdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgJ2lzb2xhdGUnOiB7XHJcbiAgICAgICAgaXNvbGF0ZU9iamVjdHMoW3NlbGVjdGVkT2JqZWN0LmlkXSlcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlICd1bmlzb2xhdGUnOiB7XHJcbiAgICAgICAgdW5Jc29sYXRlT2JqZWN0cyhbc2VsZWN0ZWRPYmplY3QuaWRdKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgJ2NvcHktaWQnOiB7XHJcbiAgICAgICAgY29weShzZWxlY3RlZE9iamVjdC5pZClcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlICdmaXQtdG8tdmlldyc6IHtcclxuICAgICAgICB6b29tRXh0ZW50c09yU2VsZWN0aW9uKClcclxuICAgICAgICBicmVha1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlICdjbGVhci1zZWxlY3Rpb24nOiB7XHJcbiAgICAgICAgY2xlYXJTZWxlY3Rpb24oKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEhhbmRsZSByaWdodC1jbGlja3MgZm9yIGNvbnRleHQgbWVudSBhbmQgbGVmdC1jbGlja3MgdG8gY2xvc2UgaXRcclxuICB1c2VTZWxlY3Rpb25FdmVudHMoe1xyXG4gICAgc2luZ2xlQ2xpY2tDYWxsYmFjazogKGV2ZW50LCB7IGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCB9KSA9PiB7XHJcbiAgICAgIC8vIEhhbmRsZSByaWdodC1jbGlja3MgdG8gb3BlbiBjb250ZXh0IG1lbnVcclxuICAgICAgaWYgKGV2ZW50Py5ldmVudCAmJiBldmVudC5ldmVudC5idXR0b24gPT09IDIpIHtcclxuICAgICAgICBpZiAoZmlyc3RWaXNpYmxlU2VsZWN0aW9uSGl0KSB7XHJcbiAgICAgICAgICBjb25zdCBjbGlja0xvY2F0aW9uID0gZmlyc3RWaXNpYmxlU2VsZWN0aW9uSGl0LnBvaW50LmNsb25lKClcclxuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0SWQgPSBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQubm9kZS5tb2RlbC5pZFxyXG5cclxuICAgICAgICAgIHNldFNlbGVjdGlvbkZyb21PYmplY3RJZHMoW3NlbGVjdGVkT2JqZWN0SWRdKVxyXG5cclxuICAgICAgICAgIGNvbnRleHRNZW51U3RhdGUudmFsdWUuY2xpY2tMb2NhdGlvbiA9IGNsaWNrTG9jYXRpb25cclxuICAgICAgICAgIGNvbnRleHRNZW51U3RhdGUudmFsdWUuc2VsZWN0ZWRPYmplY3RJZCA9IHNlbGVjdGVkT2JqZWN0SWRcclxuICAgICAgICAgIGNvbnRleHRNZW51U3RhdGUudmFsdWUuaXNWaXNpYmxlID0gdHJ1ZVxyXG4gICAgICAgICAgaXNPcGVuLnZhbHVlID0gdHJ1ZVxyXG5cclxuICAgICAgICAgIG5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgdXBkYXRlUG9zaXRpb25zKClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNsb3NlQ29udGV4dE1lbnUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIGxlZnQtY2xpY2tzIHRvIGNsb3NlIGNvbnRleHQgbWVudVxyXG4gICAgICBpZiAoZXZlbnQ/LmV2ZW50ICYmIGV2ZW50LmV2ZW50LmJ1dHRvbiA9PT0gMCAmJiBpc09wZW4udmFsdWUpIHtcclxuICAgICAgICBjbG9zZUNvbnRleHRNZW51KClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIC8vIENsb3NlIGNvbnRleHQgbWVudSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXHJcbiAgd2F0Y2goXHJcbiAgICAoKSA9PiBmaWx0ZXJzLnNlbGVjdGVkT2JqZWN0SWRzLnZhbHVlLFxyXG4gICAgKG5ld1NlbGVjdGlvbklkcykgPT4ge1xyXG4gICAgICBpZiAoY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5pc1Zpc2libGUpIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50TWVudU9iamVjdElkID0gY29udGV4dE1lbnVTdGF0ZS52YWx1ZS5zZWxlY3RlZE9iamVjdElkXHJcbiAgICAgICAgaWYgKCFuZXdTZWxlY3Rpb25JZHMuaGFzKGN1cnJlbnRNZW51T2JqZWN0SWQgfHwgJycpKSB7XHJcbiAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICApXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjb250ZXh0TWVudVN0YXRlLFxyXG4gICAgY29udGV4dE1lbnVJdGVtcyxcclxuICAgIHNob3VsZFNob3dDb250ZXh0TWVudSxcclxuICAgIG9uSXRlbUNob3NlbixcclxuICAgIGNsb3NlQ29udGV4dE1lbnVcclxuICB9XHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvY29udGV4dE1lbnUudHMifQ==