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

339 lines
36 KiB
Plaintext

import { SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import {
useInjectedViewerInterfaceState,
useInjectedViewerState,
useResetUiState
} from "/_nuxt/lib/viewer/composables/setup.ts";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { debounce } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
import { Vector3 } from "/_nuxt/node_modules/.cache/vite/client/deps/three.js?v=e4f18c29";
import {
useOnViewerLoadComplete,
useViewerCameraTracker,
useSelectionEvents
} from "/_nuxt/lib/viewer/composables/viewer.ts";
import {
useGetScreenCenterObjectId,
useViewerAnchoredPoints
} from "/_nuxt/lib/viewer/composables/anchorPoints.ts";
import {
HorizontalDirection,
useOnBeforeWindowUnload,
useResponsiveHorizontalDirectionCalculation
} from "/_nuxt/lib/common/composables/window.ts";
import { useViewerUserActivityBroadcasting } from "/_nuxt/lib/viewer/composables/activity.ts";
import { useIntervalFn } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import {
StateApplyMode,
useApplySerializedState,
useStateSerialization
} from "/_nuxt/lib/viewer/composables/serialization.ts";
import { useSelectionUtilities } from "/_nuxt/lib/viewer/composables/ui.ts";
import { useLogger } from "/_nuxt/composables/logging.ts";
import { ref, computed, watch, onBeforeUnmount } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
graphql(`
fragment ViewerCommentBubblesData on Comment {
id
viewedAt
viewerState
}
`);
export function useViewerNewThreadBubble(params) {
const { parentEl, block } = params;
const {
threads: {
openThread: { newThreadEditor }
},
camera: { target },
selection,
filters: { selectedObjectIds }
} = useInjectedViewerInterfaceState();
const getCamCenterObjId = useGetScreenCenterObjectId();
const { setSelectionFromObjectIds } = useSelectionUtilities();
const logger = useLogger();
const buttonState = ref({
isExpanded: false,
isVisible: false,
isOccluded: false,
clickLocation: null,
selectedObjectId: null,
style: {}
});
const { updatePositions } = useViewerAnchoredPoints({
parentEl,
points: computed(() => buttonState.value),
pointLocationGetter: (b) => b.clickLocation,
updatePositionCallback: (state, result) => {
state.isOccluded = result.isOccluded;
state.style = {
...state.style,
...result.style,
opacity: state.isOccluded ? "0.8" : "1.0"
};
}
});
const closeNewThread = () => {
buttonState.value.isExpanded = false;
buttonState.value.isVisible = false;
buttonState.value.clickLocation = null;
buttonState.value.selectedObjectId = null;
};
useSelectionEvents({
singleClickCallback: (event, { firstVisibleSelectionHit }) => {
if (block?.value) return;
if (!event?.event || event.event.button !== 0) return;
buttonState.value.isExpanded = false;
if (firstVisibleSelectionHit) {
buttonState.value.clickLocation = firstVisibleSelectionHit.point.clone();
buttonState.value.selectedObjectId = firstVisibleSelectionHit.node.model.id;
buttonState.value.isVisible = true;
updatePositions();
} else {
closeNewThread();
}
}
});
if (block) {
watch(block, (isBlocked) => {
if (!isBlocked) return;
closeNewThread();
});
}
watch(
() => buttonState.value.isExpanded,
(newVal) => {
newThreadEditor.value = newVal;
}
);
watch(newThreadEditor, (isNewThread, oldIsNewThread) => {
if (isNewThread && !!isNewThread !== !!oldIsNewThread) {
if (!buttonState.value.clickLocation && !target.value && !selection.value) {
logger.warn("Unable to enable new thread editor due to missing position data");
newThreadEditor.value = false;
return;
}
if (!buttonState.value.clickLocation) {
if (target.value) {
buttonState.value.clickLocation = target.value.clone();
} else if (selection.value) {
buttonState.value.clickLocation = selection.value.clone();
}
}
buttonState.value.isExpanded = true;
buttonState.value.isVisible = true;
updatePositions();
if (selection.value) return;
const oid = getCamCenterObjId();
if (!oid) return;
setSelectionFromObjectIds([oid]);
}
});
watch(selectedObjectIds, () => {
if (!buttonState.value.isVisible || !buttonState.value.selectedObjectId) {
return;
}
const isStillSelected = selectedObjectIds.value.has(
buttonState.value.selectedObjectId
);
if (!isStillSelected) {
closeNewThread();
}
});
return { buttonState, closeNewThread };
}
export function useViewerCommentBubblesProjection(params) {
const { parentEl } = params;
const {
ui: {
threads: { items: commentThreads }
}
} = useInjectedViewerState();
useViewerAnchoredPoints({
parentEl,
points: computed(() => Object.values(commentThreads.value)),
pointLocationGetter: (t) => {
const state = t.viewerState;
const selection = state?.ui.selection;
if (selection?.length) {
return new Vector3(selection[0], selection[1], selection[2]);
}
const target = state?.ui.camera.target;
if (target?.length) {
return new Vector3(target[0], target[1], target[2]);
}
return void 0;
},
updatePositionCallback: (thread, result) => {
thread.isOccluded = result.isOccluded;
thread.style = {
...thread.style,
...result.style,
opacity: thread.isOccluded ? "0.5" : "1.0",
transition: "all 100ms ease"
};
}
});
}
export function useViewerOpenedThreadUpdateEmitter() {
if (false) return;
const {
urlHashState: { focusedThreadId }
} = useInjectedViewerState();
const { emitViewing } = useViewerUserActivityBroadcasting();
watch(focusedThreadId, (id, oldId) => {
if (id !== oldId) {
emitViewing();
}
});
}
export function useViewerThreadTracking() {
if (false) return;
const applyState = useApplySerializedState();
const { serialize: serializeState } = useStateSerialization();
const resetState = useResetUiState();
const state = useInjectedViewerState();
const {
ui: {
threads: { openThread },
camera: { position, target }
}
} = state;
const oldState = ref(
null
);
const refocus = async (commentState) => {
await applyState(commentState, StateApplyMode.ThreadOpen);
};
useOnViewerLoadComplete(({ isInitial }) => {
const viewerState = openThread.thread.value?.viewerState;
if (SpeckleViewer.ViewerState.isSerializedViewerState(viewerState)) {
refocus(viewerState);
}
if (isInitial) {
const old = oldState.value || serializeState();
oldState.value = {
...old,
ui: {
...old.ui,
camera: {
...old.ui.camera,
position: position.value.toArray(),
target: target.value.toArray()
}
}
};
}
});
watch(openThread.thread, async (newThread, oldThread) => {
if (newThread?.id !== oldThread?.id) {
const newState = newThread?.viewerState;
if (newState && SpeckleViewer.ViewerState.isSerializedViewerState(newState)) {
if (!oldThread) {
const currentState = serializeState();
oldState.value = {
...currentState,
ui: {
...currentState.ui,
threads: {
...currentState.ui.threads,
openThread: {
threadId: null,
isTyping: false,
newThreadEditor: false
}
}
}
};
}
await refocus(newState);
} else if (oldThread && newThread === null) {
if (oldState.value && SpeckleViewer.ViewerState.isSerializedViewerState(oldState.value)) {
await applyState(oldState.value, StateApplyMode.SavedView, {
loadOriginal: false
});
} else {
resetState();
}
}
}
});
}
export function useExpandedThreadResponsiveLocation(params) {
const { threadContainer, width } = params;
const stopUpdatesBelowWidth = params.stopUpdatesBelowWidth || width * 2;
const margin = 12;
const leftForShowingOnRightSide = `calc(100% + ${margin}px)`;
const leftForShowingOnLeftSide = `calc(-${width + margin}px)`;
const { direction, recalculateDirection } = useResponsiveHorizontalDirectionCalculation({
el: threadContainer,
defaultDirection: HorizontalDirection.Right,
stopUpdatesBelowWidth
});
const style = computed(() => ({
top: "50%",
left: direction.value === HorizontalDirection.Right ? leftForShowingOnRightSide : leftForShowingOnLeftSide,
transformOrigin: "center center",
transform: "translateY(-50%)",
width: `${width}px`
}));
useViewerCameraTracker(() => recalculateDirection());
return {
style,
recalculateStyle: recalculateDirection
};
}
export function useIsTypingUpdateEmitter() {
const {
ui: {
threads: {
openThread: { isTyping }
}
}
} = useInjectedViewerState();
const { emitViewing } = useViewerUserActivityBroadcasting();
const debouncedMarkNoLongerTyping = debounce(
() => automaticUpdateIsTyping(false),
7e3
);
const pauseAutomaticUpdates = ref(false);
const automaticUpdateIsTyping = (newVal) => {
if (pauseAutomaticUpdates.value) return;
updateIsTyping(newVal);
};
const updateIsTyping = (newVal) => {
if (newVal === isTyping.value) return;
isTyping.value = newVal;
};
const onKeyDownHandler = () => {
if (!isTyping.value) {
automaticUpdateIsTyping(true);
}
debouncedMarkNoLongerTyping();
};
watch(isTyping, (newVal, oldVal) => {
if (!!newVal === !!oldVal) return;
emitViewing();
});
onBeforeUnmount(() => updateIsTyping(false));
useOnBeforeWindowUnload(() => updateIsTyping(false));
return {
onKeyDownHandler,
updateIsTyping,
pauseAutomaticUpdates
};
}
export function useAnimatingEllipsis() {
const baseValue = ".";
const value = ref(baseValue);
const { pause, resume } = useIntervalFn(() => {
if (value.value.length < 3) {
value.value = value.value + baseValue;
} else {
value.value = baseValue;
}
}, 250);
return { ellipsis: value, controls: { pause, resume } };
}
//# sourceMappingURL=data:application/json;base64,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TUFBTSxTQUFTLEdBQUc7QUFDMUIsWUFBTSxRQUFRLE1BQU0sUUFBUTtBQUFBLElBQzlCLE9BQU87QUFDTCxZQUFNLFFBQVE7QUFBQSxJQUNoQjtBQUFBLEVBQ0YsR0FBRyxHQUFHO0FBRU4sU0FBTyxFQUFFLFVBQVUsT0FBTyxVQUFVLEVBQUUsT0FBTyxPQUFPLEVBQUU7QUFDeEQiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbImNvbW1lbnRCdWJibGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcywgUmVmIH0gZnJvbSAndnVlJ1xyXG5pbXBvcnQgeyBTcGVja2xlVmlld2VyIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQge1xyXG4gIHVzZUluamVjdGVkVmlld2VySW50ZXJmYWNlU3RhdGUsXHJcbiAgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSxcclxuICB1c2VSZXNldFVpU3RhdGVcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgdHlwZSB7IExvYWRlZENvbW1lbnRUaHJlYWQgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyBncmFwaHFsIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcydcclxuaW1wb3J0IHsgVmVjdG9yMyB9IGZyb20gJ3RocmVlJ1xyXG5pbXBvcnQge1xyXG4gIHVzZU9uVmlld2VyTG9hZENvbXBsZXRlLFxyXG4gIHVzZVZpZXdlckNhbWVyYVRyYWNrZXIsXHJcbiAgdXNlU2VsZWN0aW9uRXZlbnRzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy92aWV3ZXInXHJcblxyXG5pbXBvcnQge1xyXG4gIHVzZUdldFNjcmVlbkNlbnRlck9iamVjdElkLFxyXG4gIHVzZVZpZXdlckFuY2hvcmVkUG9pbnRzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9hbmNob3JQb2ludHMnXHJcbmltcG9ydCB7XHJcbiAgSG9yaXpvbnRhbERpcmVjdGlvbixcclxuICB1c2VPbkJlZm9yZVdpbmRvd1VubG9hZCxcclxuICB1c2VSZXNwb25zaXZlSG9yaXpvbnRhbERpcmVjdGlvbkNhbGN1bGF0aW9uXHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9jb21wb3NhYmxlcy93aW5kb3cnXHJcbmltcG9ydCB7IHVzZVZpZXdlclVzZXJBY3Rpdml0eUJyb2FkY2FzdGluZyB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvYWN0aXZpdHknXHJcbmltcG9ydCB7IHVzZUludGVydmFsRm4gfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7XHJcbiAgU3RhdGVBcHBseU1vZGUsXHJcbiAgdXNlQXBwbHlTZXJpYWxpemVkU3RhdGUsXHJcbiAgdXNlU3RhdGVTZXJpYWxpemF0aW9uXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXJpYWxpemF0aW9uJ1xyXG5pbXBvcnQgdHlwZSB7IE1lcmdlIH0gZnJvbSAndHlwZS1mZXN0J1xyXG5pbXBvcnQgeyB1c2VTZWxlY3Rpb25VdGlsaXRpZXMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgVmlld2VyQ29tbWVudEJ1YmJsZXNEYXRhIG9uIENvbW1lbnQge1xyXG4gICAgaWRcclxuICAgIHZpZXdlZEF0XHJcbiAgICB2aWV3ZXJTdGF0ZVxyXG4gIH1cclxuYClcclxuXHJcbmV4cG9ydCB0eXBlIFZpZXdlck5ld1RocmVhZEJ1YmJsZU1vZGVsID0ge1xyXG4gIGlzRXhwYW5kZWQ6IGJvb2xlYW5cclxuICBpc1Zpc2libGU6IGJvb2xlYW5cclxuICBpc09jY2x1ZGVkOiBib29sZWFuXHJcbiAgc3R5bGU6IFBhcnRpYWw8Q1NTUHJvcGVydGllcz5cclxuICBjbGlja0xvY2F0aW9uOiBOdWxsYWJsZTxWZWN0b3IzPlxyXG4gIHNlbGVjdGVkT2JqZWN0SWQ6IE51bGxhYmxlPHN0cmluZz5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVZpZXdlck5ld1RocmVhZEJ1YmJsZShwYXJhbXM6IHtcclxuICBwYXJlbnRFbDogUmVmPE51bGxhYmxlPEhUTUxFbGVtZW50Pj5cclxuICBibG9jaz86IFJlZjxib29sZWFuPlxyXG59KSB7XHJcbiAgY29uc3QgeyBwYXJlbnRFbCwgYmxvY2sgfSA9IHBhcmFtc1xyXG5cclxuICBjb25zdCB7XHJcbiAgICB0aHJlYWRzOiB7XHJcbiAgICAgIG9wZW5UaHJlYWQ6IHsgbmV3VGhyZWFkRWRpdG9yIH1cclxuICAgIH0sXHJcbiAgICBjYW1lcmE6IHsgdGFyZ2V0IH0sXHJcbiAgICBzZWxlY3Rpb24sXHJcbiAgICBmaWx0ZXJzOiB7IHNlbGVjdGVkT2JqZWN0SWRzIH1cclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcbiAgY29uc3QgZ2V0Q2FtQ2VudGVyT2JqSWQgPSB1c2VHZXRTY3JlZW5DZW50ZXJPYmplY3RJZCgpXHJcbiAgY29uc3QgeyBzZXRTZWxlY3Rpb25Gcm9tT2JqZWN0SWRzIH0gPSB1c2VTZWxlY3Rpb25VdGlsaXRpZXMoKVxyXG4gIGNvbnN0IGxvZ2dlciA9IHVzZUxvZ2dlcigpXHJcblxyXG4gIGNvbnN0IGJ1dHRvblN0YXRlID0gcmVmKHtcclxuICAgIGlzRXhwYW5kZWQ6IGZhbHNlLFxyXG4gICAgaXNWaXNpYmxlOiBmYWxzZSxcclxuICAgIGlzT2NjbHVkZWQ6IGZhbHNlLFxyXG4gICAgY2xpY2tMb2NhdGlvbjogbnVsbCxcclxuICAgIHNlbGVjdGVkT2JqZWN0SWQ6IG51bGwsXHJcbiAgICBzdHlsZToge31cclxuICB9IGFzIFZpZXdlck5ld1RocmVhZEJ1YmJsZU1vZGVsKVxyXG5cclxuICBjb25zdCB7IHVwZGF0ZVBvc2l0aW9ucyB9ID0gdXNlVmlld2VyQW5jaG9yZWRQb2ludHMoe1xyXG4gICAgcGFyZW50RWwsXHJcbiAgICBwb2ludHM6IGNvbXB1dGVkKCgpID0+IGJ1dHRvblN0YXRlLnZhbHVlKSxcclxuICAgIHBvaW50TG9jYXRpb25HZXR0ZXI6IChiKSA9PiBiLmNsaWNrTG9jYXRpb24sXHJcbiAgICB1cGRhdGVQb3NpdGlvbkNhbGxiYWNrOiAoc3RhdGUsIHJlc3VsdCkgPT4ge1xyXG4gICAgICBzdGF0ZS5pc09jY2x1ZGVkID0gcmVzdWx0LmlzT2NjbHVkZWRcclxuICAgICAgc3RhdGUuc3R5bGUgPSB7XHJcbiAgICAgICAgLi4uc3RhdGUuc3R5bGUsXHJcbiAgICAgICAgLi4ucmVzdWx0LnN0eWxlLFxyXG4gICAgICAgIG9wYWNpdHk6IHN0YXRlLmlzT2NjbHVkZWQgPyAnMC44JyA6ICcxLjAnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KVxyXG5cclxuICBjb25zdCBjbG9zZU5ld1RocmVhZCA9ICgpID0+IHtcclxuICAgIGJ1dHRvblN0YXRlLnZhbHVlLmlzRXhwYW5kZWQgPSBmYWxzZVxyXG4gICAgYnV0dG9uU3RhdGUudmFsdWUuaXNWaXNpYmxlID0gZmFsc2VcclxuICAgIGJ1dHRvblN0YXRlLnZhbHVlLmNsaWNrTG9jYXRpb24gPSBudWxsXHJcbiAgICBidXR0b25TdGF0ZS52YWx1ZS5zZWxlY3RlZE9iamVjdElkID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgdXNlU2VsZWN0aW9uRXZlbnRzKHtcclxuICAgIHNpbmdsZUNsaWNrQ2FsbGJhY2s6IChldmVudCwgeyBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQgfSkgPT4ge1xyXG4gICAgICBpZiAoYmxvY2s/LnZhbHVlKSByZXR1cm5cclxuICAgICAgaWYgKCFldmVudD8uZXZlbnQgfHwgZXZlbnQuZXZlbnQuYnV0dG9uICE9PSAwKSByZXR1cm5cclxuXHJcbiAgICAgIGJ1dHRvblN0YXRlLnZhbHVlLmlzRXhwYW5kZWQgPSBmYWxzZVxyXG5cclxuICAgICAgaWYgKGZpcnN0VmlzaWJsZVNlbGVjdGlvbkhpdCkge1xyXG4gICAgICAgIGJ1dHRvblN0YXRlLnZhbHVlLmNsaWNrTG9jYXRpb24gPSBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQucG9pbnQuY2xvbmUoKVxyXG4gICAgICAgIGJ1dHRvblN0YXRlLnZhbHVlLnNlbGVjdGVkT2JqZWN0SWQgPSBmaXJzdFZpc2libGVTZWxlY3Rpb25IaXQubm9kZS5tb2RlbC5pZFxyXG4gICAgICAgIGJ1dHRvblN0YXRlLnZhbHVlLmlzVmlzaWJsZSA9IHRydWVcclxuICAgICAgICB1cGRhdGVQb3NpdGlvbnMoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNsb3NlTmV3VGhyZWFkKClcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIGlmIChibG9jaykge1xyXG4gICAgd2F0Y2goYmxvY2ssIChpc0Jsb2NrZWQpID0+IHtcclxuICAgICAgaWYgKCFpc0Jsb2NrZWQpIHJldHVyblxyXG4gICAgICBjbG9zZU5ld1RocmVhZCgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgd2F0Y2goXHJcbiAgICAoKSA9PiBidXR0b25TdGF0ZS52YWx1ZS5pc0V4cGFuZGVkLFxyXG4gICAgKG5ld1ZhbCkgPT4ge1xyXG4gICAgICBuZXdUaHJlYWRFZGl0b3IudmFsdWUgPSBuZXdWYWxcclxuICAgIH1cclxuICApXHJcblxyXG4gIHdhdGNoKG5ld1RocmVhZEVkaXRvciwgKGlzTmV3VGhyZWFkLCBvbGRJc05ld1RocmVhZCkgPT4ge1xyXG4gICAgaWYgKGlzTmV3VGhyZWFkICYmICEhaXNOZXdUaHJlYWQgIT09ICEhb2xkSXNOZXdUaHJlYWQpIHtcclxuICAgICAgaWYgKCFidXR0b25TdGF0ZS52YWx1ZS5jbGlja0xvY2F0aW9uICYmICF0YXJnZXQudmFsdWUgJiYgIXNlbGVjdGlvbi52YWx1ZSkge1xyXG4gICAgICAgIGxvZ2dlci53YXJuKCdVbmFibGUgdG8gZW5hYmxlIG5ldyB0aHJlYWQgZWRpdG9yIGR1ZSB0byBtaXNzaW5nIHBvc2l0aW9uIGRhdGEnKVxyXG4gICAgICAgIG5ld1RocmVhZEVkaXRvci52YWx1ZSA9IGZhbHNlXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNldCBcIm5ldyB0aHJlYWQgYnViYmxlXCIgbG9jYXRpb24gJiBlbmFibGUgaXRcclxuICAgICAgaWYgKCFidXR0b25TdGF0ZS52YWx1ZS5jbGlja0xvY2F0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldC52YWx1ZSkge1xyXG4gICAgICAgICAgYnV0dG9uU3RhdGUudmFsdWUuY2xpY2tMb2NhdGlvbiA9IHRhcmdldC52YWx1ZS5jbG9uZSgpXHJcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24udmFsdWUpIHtcclxuICAgICAgICAgIGJ1dHRvblN0YXRlLnZhbHVlLmNsaWNrTG9jYXRpb24gPSBzZWxlY3Rpb24udmFsdWUuY2xvbmUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgYnV0dG9uU3RhdGUudmFsdWUuaXNFeHBhbmRlZCA9IHRydWVcclxuICAgICAgYnV0dG9uU3RhdGUudmFsdWUuaXNWaXNpYmxlID0gdHJ1ZVxyXG4gICAgICB1cGRhdGVQb3NpdGlvbnMoKVxyXG5cclxuICAgICAgLy8gQWxzbyBpbnZva2Ugc2VsZWN0aW9uLCBpZiBuZWVkZWRcclxuICAgICAgaWYgKHNlbGVjdGlvbi52YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBvaWQgPSBnZXRDYW1DZW50ZXJPYmpJZCgpXHJcbiAgICAgIGlmICghb2lkKSByZXR1cm5cclxuICAgICAgc2V0U2VsZWN0aW9uRnJvbU9iamVjdElkcyhbb2lkXSlcclxuICAgIH1cclxuICB9KVxyXG5cclxuICAvLyBDbGVhciBidXR0b24gd2hlbiBpdHMgc2VsZWN0ZWQgb2JqZWN0IGlzIG5vIGxvbmdlciBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb25cclxuICB3YXRjaChzZWxlY3RlZE9iamVjdElkcywgKCkgPT4ge1xyXG4gICAgaWYgKCFidXR0b25TdGF0ZS52YWx1ZS5pc1Zpc2libGUgfHwgIWJ1dHRvblN0YXRlLnZhbHVlLnNlbGVjdGVkT2JqZWN0SWQpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGJ1dHRvbidzIG9iamVjdCBpcyBzdGlsbCBzZWxlY3RlZFxyXG4gICAgY29uc3QgaXNTdGlsbFNlbGVjdGVkID0gc2VsZWN0ZWRPYmplY3RJZHMudmFsdWUuaGFzKFxyXG4gICAgICBidXR0b25TdGF0ZS52YWx1ZS5zZWxlY3RlZE9iamVjdElkXHJcbiAgICApXHJcbiAgICBpZiAoIWlzU3RpbGxTZWxlY3RlZCkge1xyXG4gICAgICBjbG9zZU5ld1RocmVhZCgpXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgcmV0dXJuIHsgYnV0dG9uU3RhdGUsIGNsb3NlTmV3VGhyZWFkIH1cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgQ29tbWVudEJ1YmJsZU1vZGVsID0gTWVyZ2U8XHJcbiAgTG9hZGVkQ29tbWVudFRocmVhZCxcclxuICB7IHZpZXdlclN0YXRlOiBOdWxsYWJsZTxTcGVja2xlVmlld2VyLlZpZXdlclN0YXRlLlNlcmlhbGl6ZWRWaWV3ZXJTdGF0ZT4gfVxyXG4+ICYge1xyXG4gIGlzT2NjbHVkZWQ6IGJvb2xlYW5cclxuICBzdHlsZTogUGFydGlhbDxDU1NQcm9wZXJ0aWVzPiAmIHsgeD86IG51bWJlcjsgeT86IG51bWJlciB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3ZXJDb21tZW50QnViYmxlc1Byb2plY3Rpb24ocGFyYW1zOiB7XHJcbiAgcGFyZW50RWw6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcbn0pIHtcclxuICBjb25zdCB7IHBhcmVudEVsIH0gPSBwYXJhbXNcclxuICBjb25zdCB7XHJcbiAgICB1aToge1xyXG4gICAgICB0aHJlYWRzOiB7IGl0ZW1zOiBjb21tZW50VGhyZWFkcyB9XHJcbiAgICB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5cclxuICB1c2VWaWV3ZXJBbmNob3JlZFBvaW50cyh7XHJcbiAgICBwYXJlbnRFbCxcclxuICAgIHBvaW50czogY29tcHV0ZWQoKCkgPT4gT2JqZWN0LnZhbHVlcyhjb21tZW50VGhyZWFkcy52YWx1ZSkpLFxyXG4gICAgcG9pbnRMb2NhdGlvbkdldHRlcjogKHQpID0+IHtcclxuICAgICAgY29uc3Qgc3RhdGUgPSB0LnZpZXdlclN0YXRlXHJcblxyXG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBzdGF0ZT8udWkuc2VsZWN0aW9uXHJcbiAgICAgIGlmIChzZWxlY3Rpb24/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgVmVjdG9yMyhzZWxlY3Rpb25bMF0sIHNlbGVjdGlvblsxXSwgc2VsZWN0aW9uWzJdKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0YXJnZXQgPSBzdGF0ZT8udWkuY2FtZXJhLnRhcmdldFxyXG4gICAgICBpZiAodGFyZ2V0Py5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjModGFyZ2V0WzBdLCB0YXJnZXRbMV0sIHRhcmdldFsyXSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgfSxcclxuICAgIHVwZGF0ZVBvc2l0aW9uQ2FsbGJhY2s6ICh0aHJlYWQsIHJlc3VsdCkgPT4ge1xyXG4gICAgICB0aHJlYWQuaXNPY2NsdWRlZCA9IHJlc3VsdC5pc09jY2x1ZGVkXHJcbiAgICAgIHRocmVhZC5zdHlsZSA9IHtcclxuICAgICAgICAuLi50aHJlYWQuc3R5bGUsXHJcbiAgICAgICAgLi4ucmVzdWx0LnN0eWxlLFxyXG4gICAgICAgIG9wYWNpdHk6IHRocmVhZC5pc09jY2x1ZGVkID8gJzAuNScgOiAnMS4wJyxcclxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDEwMG1zIGVhc2UnXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmlld2VyT3BlbmVkVGhyZWFkVXBkYXRlRW1pdHRlcigpIHtcclxuICBpZiAoaW1wb3J0Lm1ldGEuc2VydmVyKSByZXR1cm5cclxuXHJcbiAgY29uc3Qge1xyXG4gICAgdXJsSGFzaFN0YXRlOiB7IGZvY3VzZWRUaHJlYWRJZCB9XHJcbiAgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgZW1pdFZpZXdpbmcgfSA9IHVzZVZpZXdlclVzZXJBY3Rpdml0eUJyb2FkY2FzdGluZygpXHJcblxyXG4gIHdhdGNoKGZvY3VzZWRUaHJlYWRJZCwgKGlkLCBvbGRJZCkgPT4ge1xyXG4gICAgaWYgKGlkICE9PSBvbGRJZCkge1xyXG4gICAgICBlbWl0Vmlld2luZygpXHJcbiAgICB9XHJcbiAgfSlcclxufVxyXG5cclxuLyoqXHJcbiAqIFNldCB1cCBhdXRvLWZvY3VzaW5nIG9uIG9wZW5lZCB0aHJlYWQgYW5kIHNldHRpbmcvdW5zZXR0aW5nIHZpZXdlciBzdGF0ZVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVZpZXdlclRocmVhZFRyYWNraW5nKCkge1xyXG4gIGlmIChpbXBvcnQubWV0YS5zZXJ2ZXIpIHJldHVyblxyXG5cclxuICBjb25zdCBhcHBseVN0YXRlID0gdXNlQXBwbHlTZXJpYWxpemVkU3RhdGUoKVxyXG4gIGNvbnN0IHsgc2VyaWFsaXplOiBzZXJpYWxpemVTdGF0ZSB9ID0gdXNlU3RhdGVTZXJpYWxpemF0aW9uKClcclxuICBjb25zdCByZXNldFN0YXRlID0gdXNlUmVzZXRVaVN0YXRlKClcclxuXHJcbiAgY29uc3Qgc3RhdGUgPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuICBjb25zdCB7XHJcbiAgICB1aToge1xyXG4gICAgICB0aHJlYWRzOiB7IG9wZW5UaHJlYWQgfSxcclxuICAgICAgY2FtZXJhOiB7IHBvc2l0aW9uLCB0YXJnZXQgfVxyXG4gICAgfVxyXG4gIH0gPSBzdGF0ZVxyXG5cclxuICBjb25zdCBvbGRTdGF0ZSA9IHJlZihcclxuICAgIG51bGwgYXMgTnVsbGFibGU8U3BlY2tsZVZpZXdlci5WaWV3ZXJTdGF0ZS5TZXJpYWxpemVkVmlld2VyU3RhdGU+XHJcbiAgKVxyXG5cclxuICBjb25zdCByZWZvY3VzID0gYXN5bmMgKFxyXG4gICAgY29tbWVudFN0YXRlOiBTcGVja2xlVmlld2VyLlZpZXdlclN0YXRlLlNlcmlhbGl6ZWRWaWV3ZXJTdGF0ZVxyXG4gICkgPT4ge1xyXG4gICAgYXdhaXQgYXBwbHlTdGF0ZShjb21tZW50U3RhdGUsIFN0YXRlQXBwbHlNb2RlLlRocmVhZE9wZW4pXHJcbiAgfVxyXG5cclxuICAvLyBEbyB0aGlzIG9uY2Ugdmlld2VyIGxvYWRzIHRoaW5nc1xyXG4gIHVzZU9uVmlld2VyTG9hZENvbXBsZXRlKCh7IGlzSW5pdGlhbCB9KSA9PiB7XHJcbiAgICBjb25zdCB2aWV3ZXJTdGF0ZSA9IG9wZW5UaHJlYWQudGhyZWFkLnZhbHVlPy52aWV3ZXJTdGF0ZVxyXG4gICAgaWYgKFNwZWNrbGVWaWV3ZXIuVmlld2VyU3RhdGUuaXNTZXJpYWxpemVkVmlld2VyU3RhdGUodmlld2VyU3RhdGUpKSB7XHJcbiAgICAgIHJlZm9jdXModmlld2VyU3RhdGUpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gT24gaW5pdGlhbCAtIHJld3JpdGUgb2xkIHN0YXRlIGNvb3JkcyBjYXVzZSB0aGV5J3JlIG5vdCB2YWxpZCBiZWZvcmUgaW5pdGlhbCBsb2FkXHJcbiAgICBpZiAoaXNJbml0aWFsKSB7XHJcbiAgICAgIGNvbnN0IG9sZCA9IG9sZFN0YXRlLnZhbHVlIHx8IHNlcmlhbGl6ZVN0YXRlKClcclxuICAgICAgb2xkU3RhdGUudmFsdWUgPSB7XHJcbiAgICAgICAgLi4ub2xkLFxyXG4gICAgICAgIHVpOiB7XHJcbiAgICAgICAgICAuLi5vbGQudWksXHJcbiAgICAgICAgICBjYW1lcmE6IHtcclxuICAgICAgICAgICAgLi4ub2xkLnVpLmNhbWVyYSxcclxuICAgICAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLnZhbHVlLnRvQXJyYXkoKSxcclxuICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQudmFsdWUudG9BcnJheSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbiAgLy8gQWxzbyBkbyB0aGlzIHdoZW4gb3BlblRocmVhZCBjaGFuZ2VzXHJcbiAgd2F0Y2gob3BlblRocmVhZC50aHJlYWQsIGFzeW5jIChuZXdUaHJlYWQsIG9sZFRocmVhZCkgPT4ge1xyXG4gICAgaWYgKG5ld1RocmVhZD8uaWQgIT09IG9sZFRocmVhZD8uaWQpIHtcclxuICAgICAgY29uc3QgbmV3U3RhdGUgPSBuZXdUaHJlYWQ/LnZpZXdlclN0YXRlXHJcbiAgICAgIGlmIChuZXdTdGF0ZSAmJiBTcGVja2xlVmlld2VyLlZpZXdlclN0YXRlLmlzU2VyaWFsaXplZFZpZXdlclN0YXRlKG5ld1N0YXRlKSkge1xyXG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBzdGF0ZSBiZWZvcmUgYXBwbHlpbmcgdGhyZWFkIHN0YXRlIChvbmx5IGlmIG5vIHByZXZpb3VzIHRocmVhZClcclxuICAgICAgICBpZiAoIW9sZFRocmVhZCkge1xyXG4gICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlID0gc2VyaWFsaXplU3RhdGUoKVxyXG4gICAgICAgICAgb2xkU3RhdGUudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcclxuICAgICAgICAgICAgdWk6IHtcclxuICAgICAgICAgICAgICAuLi5jdXJyZW50U3RhdGUudWksXHJcbiAgICAgICAgICAgICAgdGhyZWFkczoge1xyXG4gICAgICAgICAgICAgICAgLi4uY3VycmVudFN0YXRlLnVpLnRocmVhZHMsXHJcbiAgICAgICAgICAgICAgICBvcGVuVGhyZWFkOiB7XHJcbiAgICAgICAgICAgICAgICAgIHRocmVhZElkOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICBpc1R5cGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgIG5ld1RocmVhZEVkaXRvcjogZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgcmVmb2N1cyhuZXdTdGF0ZSlcclxuICAgICAgfSBlbHNlIGlmIChvbGRUaHJlYWQgJiYgbmV3VGhyZWFkID09PSBudWxsKSB7XHJcbiAgICAgICAgLy8gQ2xvc2luZyBhIHRocmVhZCAtIHJlc3RvcmUgb2xkIHN0YXRlIGlmIGF2YWlsYWJsZVxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIG9sZFN0YXRlLnZhbHVlICYmXHJcbiAgICAgICAgICBTcGVja2xlVmlld2VyLlZpZXdlclN0YXRlLmlzU2VyaWFsaXplZFZpZXdlclN0YXRlKG9sZFN0YXRlLnZhbHVlKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgYXdhaXQgYXBwbHlTdGF0ZShvbGRTdGF0ZS52YWx1ZSwgU3RhdGVBcHBseU1vZGUuU2F2ZWRWaWV3LCB7XHJcbiAgICAgICAgICAgIGxvYWRPcmlnaW5hbDogZmFsc2VcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc2V0U3RhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXNwb25zaXZlbHkgc3dpdGNoZXMgYSBjb21tZW50IHRocmVhZC9uZXctdGhyZWFkIGNvbnRhaW5lciBmcm9tIGxlZnQgc2lkZSB0byByaWdodCBzaWRlIG9mIHRoZSBidXR0b25cclxuICogKG9yIHZpY2UgdmVyc2EpIGRlcGVuZGluZyBvbiBob3cgbXVjaCBzcGFjZSB0aGVyZSBpcyBvbiBlYWNoIHNpZGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VFeHBhbmRlZFRocmVhZFJlc3BvbnNpdmVMb2NhdGlvbihwYXJhbXM6IHtcclxuICB0aHJlYWRDb250YWluZXI6IFJlZjxOdWxsYWJsZTxIVE1MRWxlbWVudD4+XHJcbiAgd2lkdGg6IG51bWJlclxyXG4gIHN0b3BVcGRhdGVzQmVsb3dXaWR0aD86IG51bWJlclxyXG4gIHBvc2l0aW9uPzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9XHJcbn0pIHtcclxuICBjb25zdCB7IHRocmVhZENvbnRhaW5lciwgd2lkdGggfSA9IHBhcmFtc1xyXG4gIGNvbnN0IHN0b3BVcGRhdGVzQmVsb3dXaWR0aCA9IHBhcmFtcy5zdG9wVXBkYXRlc0JlbG93V2lkdGggfHwgd2lkdGggKiAyXHJcblxyXG4gIGNvbnN0IG1hcmdpbiA9IDEyXHJcbiAgY29uc3QgbGVmdEZvclNob3dpbmdPblJpZ2h0U2lkZSA9IGBjYWxjKDEwMCUgKyAke21hcmdpbn1weClgXHJcbiAgY29uc3QgbGVmdEZvclNob3dpbmdPbkxlZnRTaWRlID0gYGNhbGMoLSR7d2lkdGggKyBtYXJnaW59cHgpYFxyXG5cclxuICBjb25zdCB7IGRpcmVjdGlvbiwgcmVjYWxjdWxhdGVEaXJlY3Rpb24gfSA9XHJcbiAgICB1c2VSZXNwb25zaXZlSG9yaXpvbnRhbERpcmVjdGlvbkNhbGN1bGF0aW9uKHtcclxuICAgICAgZWw6IHRocmVhZENvbnRhaW5lcixcclxuICAgICAgZGVmYXVsdERpcmVjdGlvbjogSG9yaXpvbnRhbERpcmVjdGlvbi5SaWdodCxcclxuICAgICAgc3RvcFVwZGF0ZXNCZWxvd1dpZHRoXHJcbiAgICB9KVxyXG5cclxuICBjb25zdCBzdHlsZSA9IGNvbXB1dGVkKCgpID0+ICh7XHJcbiAgICB0b3A6ICc1MCUnLFxyXG4gICAgbGVmdDpcclxuICAgICAgZGlyZWN0aW9uLnZhbHVlID09PSBIb3Jpem9udGFsRGlyZWN0aW9uLlJpZ2h0XHJcbiAgICAgICAgPyBsZWZ0Rm9yU2hvd2luZ09uUmlnaHRTaWRlXHJcbiAgICAgICAgOiBsZWZ0Rm9yU2hvd2luZ09uTGVmdFNpZGUsXHJcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICdjZW50ZXIgY2VudGVyJyxcclxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSknLFxyXG4gICAgd2lkdGg6IGAke3dpZHRofXB4YFxyXG4gIH0pKVxyXG5cclxuICB1c2VWaWV3ZXJDYW1lcmFUcmFja2VyKCgpID0+IHJlY2FsY3VsYXRlRGlyZWN0aW9uKCkpXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzdHlsZSxcclxuICAgIHJlY2FsY3VsYXRlU3R5bGU6IHJlY2FsY3VsYXRlRGlyZWN0aW9uXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlSXNUeXBpbmdVcGRhdGVFbWl0dGVyKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHVpOiB7XHJcbiAgICAgIHRocmVhZHM6IHtcclxuICAgICAgICBvcGVuVGhyZWFkOiB7IGlzVHlwaW5nIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuICBjb25zdCB7IGVtaXRWaWV3aW5nIH0gPSB1c2VWaWV3ZXJVc2VyQWN0aXZpdHlCcm9hZGNhc3RpbmcoKVxyXG5cclxuICBjb25zdCBkZWJvdW5jZWRNYXJrTm9Mb25nZXJUeXBpbmcgPSBkZWJvdW5jZShcclxuICAgICgpID0+IGF1dG9tYXRpY1VwZGF0ZUlzVHlwaW5nKGZhbHNlKSxcclxuICAgIDcwMDBcclxuICApXHJcbiAgY29uc3QgcGF1c2VBdXRvbWF0aWNVcGRhdGVzID0gcmVmKGZhbHNlKVxyXG5cclxuICBjb25zdCBhdXRvbWF0aWNVcGRhdGVJc1R5cGluZyA9IChuZXdWYWw6IGJvb2xlYW4pID0+IHtcclxuICAgIGlmIChwYXVzZUF1dG9tYXRpY1VwZGF0ZXMudmFsdWUpIHJldHVyblxyXG4gICAgdXBkYXRlSXNUeXBpbmcobmV3VmFsKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgdXBkYXRlSXNUeXBpbmcgPSAobmV3VmFsOiBib29sZWFuKSA9PiB7XHJcbiAgICBpZiAobmV3VmFsID09PSBpc1R5cGluZy52YWx1ZSkgcmV0dXJuXHJcbiAgICBpc1R5cGluZy52YWx1ZSA9IG5ld1ZhbFxyXG4gIH1cclxuXHJcbiAgY29uc3Qgb25LZXlEb3duSGFuZGxlciA9ICgpID0+IHtcclxuICAgIGlmICghaXNUeXBpbmcudmFsdWUpIHtcclxuICAgICAgYXV0b21hdGljVXBkYXRlSXNUeXBpbmcodHJ1ZSlcclxuICAgIH1cclxuICAgIGRlYm91bmNlZE1hcmtOb0xvbmdlclR5cGluZygpXHJcbiAgfVxyXG5cclxuICB3YXRjaChpc1R5cGluZywgKG5ld1ZhbCwgb2xkVmFsKSA9PiB7XHJcbiAgICBpZiAoISFuZXdWYWwgPT09ICEhb2xkVmFsKSByZXR1cm5cclxuICAgIGVtaXRWaWV3aW5nKClcclxuICB9KVxyXG4gIG9uQmVmb3JlVW5tb3VudCgoKSA9PiB1cGRhdGVJc1R5cGluZyhmYWxzZSkpXHJcbiAgdXNlT25CZWZvcmVXaW5kb3dVbmxvYWQoKCkgPT4gdXBkYXRlSXNUeXBpbmcoZmFsc2UpKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgb25LZXlEb3duSGFuZGxlcixcclxuICAgIHVwZGF0ZUlzVHlwaW5nLFxyXG4gICAgcGF1c2VBdXRvbWF0aWNVcGRhdGVzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlQW5pbWF0aW5nRWxsaXBzaXMoKSB7XHJcbiAgY29uc3QgYmFzZVZhbHVlID0gJy4nXHJcbiAgY29uc3QgdmFsdWUgPSByZWYoYmFzZVZhbHVlKVxyXG5cclxuICBjb25zdCB7IHBhdXNlLCByZXN1bWUgfSA9IHVzZUludGVydmFsRm4oKCkgPT4ge1xyXG4gICAgaWYgKHZhbHVlLnZhbHVlLmxlbmd0aCA8IDMpIHtcclxuICAgICAgdmFsdWUudmFsdWUgPSB2YWx1ZS52YWx1ZSArIGJhc2VWYWx1ZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFsdWUudmFsdWUgPSBiYXNlVmFsdWVcclxuICAgIH1cclxuICB9LCAyNTApXHJcblxyXG4gIHJldHVybiB7IGVsbGlwc2lzOiB2YWx1ZSwgY29udHJvbHM6IHsgcGF1c2UsIHJlc3VtZSB9IH1cclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL3ZpZXdlci9jb21wb3NhYmxlcy9jb21tZW50QnViYmxlcy50cyJ9