import { SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import {
CameraController,
MeasurementsExtension
} from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js";
import { Box3, Vector3, Matrix3 } from "/_nuxt/node_modules/.cache/vite/client/deps/three.js?v=e4f18c29";
import { OBB } from "/_nuxt/node_modules/.cache/vite/client/deps/three_examples_jsm_math_OBB.js?v=e4f18c29";
import { until } from "/_nuxt/node_modules/@vueuse/shared/index.mjs?v=e4f18c29";
import { useActiveElement } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import { isString, isEqualWith } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
import { useEmbedState, useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts";
import { isNonNullable } from "/_nuxt/lib/common/helpers/utils.ts";
import {
useInjectedViewer,
useInjectedViewerInterfaceState,
useInjectedViewerState
} from "/_nuxt/lib/viewer/composables/setup.ts";
import { ViewerRenderPageType } from "/_nuxt/lib/viewer/helpers/state.ts";
import { useDiffBuilderUtilities } from "/_nuxt/lib/viewer/composables/setup/diff.ts";
import { getKeyboardShortcutTitle, onKeyboardShortcut } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { ViewerShortcuts } from "/_nuxt/lib/viewer/helpers/shortcuts/shortcuts.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import {
defaultMeasurementOptions
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/state.js";
import { getTargetObjectIds } from "/_nuxt/lib/object-sidebar/helpers.ts";
import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { useIsSmallerOrEqualThanBreakpoint } from "/_nuxt/composables/browser.ts";
export function useSectionBoxUtilities() {
const { instance } = useInjectedViewer();
const {
sectionBox,
sectionBoxContext: { visible, edited },
filters: { selectedObjects },
threads: {
openThread: { thread }
}
} = useInjectedViewerInterfaceState();
const isSectionBoxEnabled = computed(() => !!sectionBox.value);
const isSectionBoxVisible = computed(() => visible.value);
const isSectionBoxEdited = computed(() => edited.value);
const box3ToSectionBoxData = (box) => {
if (box instanceof Box3) {
return {
min: box.min.toArray(),
max: box.max.toArray()
};
} else {
const min = box.center.clone().sub(box.halfSize);
const max = box.center.clone().add(box.halfSize);
return {
min: min.toArray(),
max: max.toArray(),
...box.rotation && { rotation: box.rotation.toArray() }
};
}
};
const sectionBoxDataToBox3 = (data) => {
let box;
if (!data.rotation || !data.rotation.length) {
const min = new Vector3().fromArray(data.min);
const max = new Vector3().fromArray(data.max);
box = new Box3(min, max);
} else {
box = new OBB();
const min = new Vector3().fromArray(data.min);
const max = new Vector3().fromArray(data.max);
const _box3 = new Box3();
_box3.set(min, max);
_box3.getCenter(box.center);
_box3.getSize(box.halfSize);
box.halfSize.multiplyScalar(0.5);
box.rotation = new Matrix3().fromArray(data.rotation);
}
return box;
};
const sectionBoxDataEquals = (a, b) => {
return isEqualWith(a, b, (objValue, othValue) => {
if (typeof objValue === "number" && typeof othValue === "number") {
return Math.abs(objValue - othValue) < 1e-6;
}
return void 0;
});
};
const resolveSectionBoxFromSelection = () => {
const objectIds = selectedObjects.value.map((o) => o.id).filter(isNonNullable);
const box = instance.getRenderer().boxFromObjects(objectIds);
sectionBox.value = box3ToSectionBoxData(box);
};
const closeSectionBox = () => {
visible.value = false;
};
const toggleSectionBox = () => {
if (!isSectionBoxEnabled.value) {
resolveSectionBoxFromSelection();
return;
}
if (isSectionBoxVisible.value) {
visible.value = false;
} else {
visible.value = true;
}
};
const resetSectionBox = () => {
const serializedSectionBox = thread.value?.viewerState?.ui.sectionBox;
sectionBox.value = null;
if (serializedSectionBox) {
sectionBox.value = {
min: serializedSectionBox.min,
max: serializedSectionBox.max,
rotation: serializedSectionBox.rotation
};
}
};
const resetSectionBoxCompletely = () => {
sectionBox.value = null;
visible.value = false;
};
return {
isSectionBoxEnabled,
isSectionBoxVisible,
isSectionBoxEdited,
toggleSectionBox,
resetSectionBox,
resetSectionBoxCompletely,
sectionBox,
closeSectionBox,
box3ToSectionBoxData,
sectionBoxDataToBox3,
sectionBoxDataEquals
};
}
export function useCameraUtilities() {
const { instance } = useInjectedViewer();
const {
filters: { selectedObjects, isolatedObjectIds },
camera
} = useInjectedViewerInterfaceState();
const cameraController = instance.getExtension(CameraController);
const setView = (view, transition = true) => {
cameraController.setCameraView(view, transition);
};
const zoomExtentsOrSelection = () => {
const ids = selectedObjects.value.flatMap((o) => getTargetObjectIds(o)).filter(isNonNullable);
if (ids.length > 0) {
return cameraController.setCameraView(ids, true);
}
if (isolatedObjectIds.value.length) {
return cameraController.setCameraView(isolatedObjectIds.value, true);
}
cameraController.setCameraView(void 0, true);
};
const toggleProjection = () => {
camera.isOrthoProjection.value = !camera.isOrthoProjection.value;
cameraController.toggleCameras();
};
const forceViewToViewerSync = () => {
setView(
{
position: camera.position.value,
target: camera.target.value
},
true
);
};
const zoom = (objectIds, fit, transition) => {
cameraController.setCameraView(objectIds, transition, fit);
};
return {
zoomExtentsOrSelection,
toggleProjection,
camera,
setView,
zoom,
forceViewToViewerSync,
cameraController
};
}
export function useSelectionUtilities() {
const {
filters: { selectedObjects, selectedObjectIds }
} = useInjectedViewerInterfaceState();
const { metadata } = useInjectedViewer();
const setSelectionFromObjectIds = (objectIds) => {
const objs = [];
objectIds.forEach((value) => {
objs.push(
...(metadata?.worldTree.value?.findId(value) || []).map(
(node) => node.model.raw
)
);
});
selectedObjects.value = objs;
};
const addToSelectionFromObjectIds = (objectIds) => {
const originalObjects = selectedObjects.value.slice();
setSelectionFromObjectIds(objectIds);
const newObjects = selectedObjects.value.filter(
(newObj) => !originalObjects.some((existingObj) => existingObj.id === newObj.id)
);
selectedObjects.value = [...originalObjects, ...newObjects];
};
const removeFromSelectionObjectIds = (objectIds) => {
const finalObjects = selectedObjects.value.filter(
(o) => !objectIds.includes(o.id || "")
);
selectedObjects.value = finalObjects;
};
const addToSelection = (object) => {
const idx = selectedObjects.value.findIndex((o) => o.id === object.id);
if (idx !== -1) return;
selectedObjects.value = [...selectedObjects.value, object];
};
const removeFromSelection = (objectOrId) => {
const oid = isString(objectOrId) ? objectOrId : objectOrId.id;
const idx = selectedObjects.value.findIndex((o) => o.id === oid);
if (idx === -1) return;
const newObjects = selectedObjects.value.slice();
newObjects.splice(idx, 1);
selectedObjects.value = newObjects;
};
const clearSelection = () => {
selectedObjects.value = [];
};
return {
addToSelection,
removeFromSelection,
clearSelection,
setSelectionFromObjectIds,
addToSelectionFromObjectIds,
removeFromSelectionObjectIds,
objects: selectedObjects,
objectIds: selectedObjectIds
};
}
export function useDiffUtilities() {
const state = useInjectedViewerState();
const { serializeDiffCommand, deserializeDiffCommand, areDiffsEqual } = useDiffBuilderUtilities();
const endDiff = async () => {
await state.urlHashState.diff.update(null);
};
const diffModelVersions = async (modelId, versionA, versionB) => {
await state.urlHashState.diff.update({
diffs: [
{
versionA: new SpeckleViewer.ViewerRoute.ViewerVersionResource(
modelId,
versionA
),
versionB: new SpeckleViewer.ViewerRoute.ViewerVersionResource(
modelId,
versionB
)
}
]
});
};
return {
serializeDiffCommand,
deserializeDiffCommand,
endDiff,
diffModelVersions,
areDiffsEqual
};
}
export function useThreadUtilities() {
const {
urlHashState: { focusedThreadId },
ui: {
threads: {
openThread: { thread: openThread }
}
}
} = useInjectedViewerState();
const isOpenThread = (id) => focusedThreadId.value === id;
const closeAllThreads = async () => {
await focusedThreadId.update(null);
};
const open = async (id) => {
if (id === focusedThreadId.value) return;
await focusedThreadId.update(id);
await Promise.all([
until(focusedThreadId).toMatch((tid) => tid === id),
until(openThread).toMatch((t) => t?.id === id)
]);
};
return { closeAllThreads, open, isOpenThread };
}
export function useMeasurementUtilities() {
const state = useInjectedViewerState();
const measurementsExtension = state.viewer.instance.getExtension(MeasurementsExtension);
const measurementOptions = computed(() => state.ui.measurement.options.value);
const hasMeasurements = computed(
() => state.ui.measurement.measurements.value.length > 0
);
const enableMeasurements = (enabled) => {
state.ui.measurement.enabled.value = enabled;
};
const setMeasurementOptions = (options) => {
state.ui.measurement.options.value = options;
};
const removeActiveMeasurement = () => {
measurementsExtension.removeMeasurement();
};
const clearMeasurements = () => {
state.ui.measurement.measurements.value = [];
};
const reset = () => {
state.ui.measurement.enabled.value = false;
state.ui.measurement.measurements.value = [];
state.ui.measurement.options.value = { ...defaultMeasurementOptions };
};
return {
measurementOptions,
enableMeasurements,
setMeasurementOptions,
removeActiveMeasurement,
clearMeasurements,
hasMeasurements,
reset,
measurements: state.ui.measurement.measurements
};
}
export function useConditionalViewerRendering() {
const embedMode = useEmbedState();
const showControls = computed(() => {
if (embedMode.embedOptions.value?.isEnabled && embedMode.embedOptions.value.hideControls) {
return false;
}
return true;
});
const showNavbar = computed(() => {
if (!showControls.value) return false;
if (embedMode.embedOptions.value?.isEnabled) return false;
return true;
});
return {
showNavbar,
showControls
};
}
export function useHighlightedObjectsUtilities() {
const {
ui: { highlightedObjectIds },
pageType
} = useInjectedViewerState();
const highlightObjects = (ids) => {
if (pageType.value === ViewerRenderPageType.Presentation) return;
highlightedObjectIds.value = [.../* @__PURE__ */ new Set([...highlightedObjectIds.value, ...ids])];
};
const unhighlightObjects = (ids) => {
highlightedObjectIds.value = highlightedObjectIds.value.filter(
(id) => !ids.includes(id)
);
};
const clearHighlightedObjects = () => {
highlightedObjectIds.value = [];
};
return {
highlightObjects,
unhighlightObjects,
clearHighlightedObjects
};
}
export function useViewModeUtilities() {
const { viewMode } = useInjectedViewerInterfaceState();
const mp = useMixpanel();
const setViewMode = (mode) => {
viewMode.mode.value = mode;
mp.track("Viewer Action", {
type: "action",
name: "set-view-mode",
mode
});
};
const toggleEdgesEnabled = () => {
viewMode.edgesEnabled.value = !viewMode.edgesEnabled.value;
mp.track("Viewer Action", {
type: "action",
name: "toggle-edges",
enabled: viewMode.edgesEnabled.value
});
};
const setEdgesWeight = (weight) => {
viewMode.edgesWeight.value = Number(weight);
mp.track("Viewer Action", {
type: "action",
name: "set-edges-weight",
weight: viewMode.edgesWeight.value
});
};
const setEdgesColor = (color) => {
viewMode.edgesColor.value = color;
mp.track("Viewer Action", {
type: "action",
name: "set-edges-color",
color: color.toString(16).padStart(6, "0")
});
};
return {
viewMode,
setViewMode,
toggleEdgesEnabled,
setEdgesWeight,
setEdgesColor,
resetViewMode: viewMode.resetViewMode
};
}
export function useViewerShortcuts() {
const { ui } = useInjectedViewerState();
const { isSmallerOrEqualSm } = useIsSmallerOrEqualThanBreakpoint();
const { isEnabled: isEmbedEnabled } = useEmbed();
const activeElement = useActiveElement();
const isTypingComment = computed(() => {
if (activeElement.value && (activeElement.value.tagName.toLowerCase() === "input" || activeElement.value.tagName.toLowerCase() === "textarea" || activeElement.value.getAttribute("contenteditable") === "true")) {
return true;
}
const isNewThreadEditorOpen = ui.threads.openThread.newThreadEditor.value;
const isExistingThreadEditorOpen = !!ui.threads.openThread.thread.value;
return isNewThreadEditorOpen || isExistingThreadEditorOpen;
});
const formatKey = (key) => {
if (key.startsWith("Digit")) {
return key.slice(5);
}
return key;
};
const getShortcutDisplayText = (shortcut, options) => {
if (isSmallerOrEqualSm.value) return void 0;
if (isEmbedEnabled.value) return void 0;
const shortcutText = getKeyboardShortcutTitle([
...shortcut.modifiers,
formatKey(shortcut.key)
]);
if (options?.format === "separate") {
const modifiersText = shortcut.modifiers.length > 0 ? getKeyboardShortcutTitle([...shortcut.modifiers]) : "";
const keyText = getKeyboardShortcutTitle([formatKey(shortcut.key)]);
return {
content: `
${shortcut.name}
${modifiersText ? `${modifiersText}` : ""}${keyText}
`,
allowHTML: true,
theme: "speckleTooltip"
};
}
if (!options?.hideName) {
return `${shortcut.name} (${shortcutText})`;
}
return shortcutText;
};
const disableShortcuts = computed(() => isTypingComment.value || isEmbedEnabled.value);
const registerShortcuts = (handlers) => {
Object.values(ViewerShortcuts).forEach((shortcut) => {
const handler = handlers[shortcut.action];
if (handler) {
onKeyboardShortcut([...shortcut.modifiers], shortcut.key, () => {
if (!disableShortcuts.value) handler();
});
}
});
};
return {
shortcuts: ViewerShortcuts,
registerShortcuts,
getShortcutDisplayText
};
}
//# sourceMappingURL=data:application/json;base64,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O0FBQUEsSUFDeEIsQ0FBQztBQUVELFFBQUksU0FBUyxXQUFXLFlBQVk7QUFDbEMsWUFBTSxnQkFDSixTQUFTLFVBQVUsU0FBUyxJQUN4Qix5QkFBeUIsQ0FBQyxHQUFHLFNBQVMsU0FBUyxDQUFDLElBQ2hEO0FBQ04sWUFBTSxVQUFVLHlCQUF5QixDQUFDLFVBQVUsU0FBUyxHQUFHLENBQUMsQ0FBQztBQUVsRSxhQUFPO0FBQUEsUUFDTCxTQUFTO0FBQUE7QUFBQSx1REFFc0MsU0FBUyxJQUFJO0FBQUE7QUFBQSxjQUd0RCxnQkFDSSwrRkFBK0YsYUFBYSxXQUM1RyxFQUNOLDZFQUE2RSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFJeEYsV0FBVztBQUFBLFFBQ1gsT0FBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLFNBQVMsVUFBVTtBQUN0QixhQUFPLEdBQUcsU0FBUyxJQUFJLEtBQUssWUFBWTtBQUFBLElBQzFDO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixTQUFTLE1BQU0sZ0JBQWdCLFNBQVMsZUFBZSxLQUFLO0FBRXJGLFFBQU0sb0JBQW9CLENBQ3hCLGFBQ0c7QUFDSCxXQUFPLE9BQU8sZUFBZSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0FBQ25ELFlBQU0sVUFBVSxTQUFTLFNBQVMsTUFBOEI7QUFDaEUsVUFBSSxTQUFTO0FBQ1gsMkJBQW1CLENBQUMsR0FBRyxTQUFTLFNBQVMsR0FBRyxTQUFTLEtBQUssTUFBTTtBQUM5RCxjQUFJLENBQUMsaUJBQWlCLE1BQU8sU0FBUTtBQUFBLFFBQ3ZDLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFBQSxJQUNMLFdBQVc7QUFBQSxJQUNYO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFDRiIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsidWkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BlY2tsZVZpZXdlciB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHtcclxuICBDYW1lcmFDb250cm9sbGVyLFxyXG4gIHR5cGUgVHJlZU5vZGUsXHJcbiAgdHlwZSBWaWV3TW9kZSxcclxuICB0eXBlIENhbm9uaWNhbFZpZXcsXHJcbiAgdHlwZSBJbmxpbmVWaWV3LFxyXG4gIHR5cGUgU3BlY2tsZVZpZXcsXHJcbiAgTWVhc3VyZW1lbnRzRXh0ZW5zaW9uXHJcbn0gZnJvbSAnQHNwZWNrbGUvdmlld2VyJ1xyXG5pbXBvcnQgeyBCb3gzLCBWZWN0b3IzLCBNYXRyaXgzIH0gZnJvbSAndGhyZWUnXHJcbmltcG9ydCB7IE9CQiB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9tYXRoL09CQidcclxuaW1wb3J0IHsgdW50aWwgfSBmcm9tICdAdnVldXNlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlQWN0aXZlRWxlbWVudCB9IGZyb20gJ0B2dWV1c2UvY29yZSdcclxuaW1wb3J0IHsgaXNTdHJpbmcsIGlzRXF1YWxXaXRoIH0gZnJvbSAnbG9kYXNoLWVzJ1xyXG5pbXBvcnQgeyB1c2VFbWJlZFN0YXRlLCB1c2VFbWJlZCB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cC9lbWJlZCdcclxuaW1wb3J0IHR5cGUgeyBTcGVja2xlT2JqZWN0IH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2NlbmVFeHBsb3JlcidcclxuaW1wb3J0IHsgaXNOb25OdWxsYWJsZSB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy91dGlscydcclxuaW1wb3J0IHtcclxuICB1c2VJbmplY3RlZFZpZXdlcixcclxuICB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlLFxyXG4gIHVzZUluamVjdGVkVmlld2VyU3RhdGVcclxufSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyBWaWV3ZXJSZW5kZXJQYWdlVHlwZSB9IGZyb20gJ34vbGliL3ZpZXdlci9oZWxwZXJzL3N0YXRlJ1xyXG5pbXBvcnQgeyB1c2VEaWZmQnVpbGRlclV0aWxpdGllcyB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZGlmZidcclxuaW1wb3J0IHsgZ2V0S2V5Ym9hcmRTaG9ydGN1dFRpdGxlLCBvbktleWJvYXJkU2hvcnRjdXQgfSBmcm9tICdAc3BlY2tsZS91aS1jb21wb25lbnRzJ1xyXG5pbXBvcnQgeyBWaWV3ZXJTaG9ydGN1dHMgfSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zaG9ydGN1dHMvc2hvcnRjdXRzJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgVmlld2VyU2hvcnRjdXQsXHJcbiAgVmlld2VyU2hvcnRjdXRBY3Rpb25cclxufSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9zaG9ydGN1dHMvdHlwZXMnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcbmltcG9ydCB0eXBlIHsgZGVmYXVsdEVkZ2VDb2xvclZhbHVlIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwL3ZpZXdNb2RlJ1xuaW1wb3J0IHtcbiAgZGVmYXVsdE1lYXN1cmVtZW50T3B0aW9ucyxcbiAgdHlwZSBNZWFzdXJlbWVudE9wdGlvbnNcbn0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkL3ZpZXdlci9zdGF0ZSdcbmltcG9ydCB7IGdldFRhcmdldE9iamVjdElkcyB9IGZyb20gJ34vbGliL29iamVjdC1zaWRlYmFyL2hlbHBlcnMnXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlY3Rpb25Cb3hVdGlsaXRpZXMoKSB7XHJcbiAgY29uc3QgeyBpbnN0YW5jZSB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXIoKVxyXG4gIGNvbnN0IHtcclxuICAgIHNlY3Rpb25Cb3gsXHJcbiAgICBzZWN0aW9uQm94Q29udGV4dDogeyB2aXNpYmxlLCBlZGl0ZWQgfSxcclxuICAgIGZpbHRlcnM6IHsgc2VsZWN0ZWRPYmplY3RzIH0sXHJcbiAgICB0aHJlYWRzOiB7XHJcbiAgICAgIG9wZW5UaHJlYWQ6IHsgdGhyZWFkIH1cclxuICAgIH1cclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IGlzU2VjdGlvbkJveEVuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiAhIXNlY3Rpb25Cb3gudmFsdWUpXHJcbiAgY29uc3QgaXNTZWN0aW9uQm94VmlzaWJsZSA9IGNvbXB1dGVkKCgpID0+IHZpc2libGUudmFsdWUpXHJcbiAgY29uc3QgaXNTZWN0aW9uQm94RWRpdGVkID0gY29tcHV0ZWQoKCkgPT4gZWRpdGVkLnZhbHVlKVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0cyBhIEJveDMgb3IgT0JCIHRvIFNlY3Rpb25Cb3hEYXRhIGZvcm1hdFxyXG4gICAqL1xyXG4gIGNvbnN0IGJveDNUb1NlY3Rpb25Cb3hEYXRhID0gKFxyXG4gICAgYm94OiBCb3gzIHwgT0JCXHJcbiAgKTogU3BlY2tsZVZpZXdlci5WaWV3ZXJTdGF0ZS5TZWN0aW9uQm94RGF0YSA9PiB7XHJcbiAgICBpZiAoYm94IGluc3RhbmNlb2YgQm94Mykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1pbjogYm94Lm1pbi50b0FycmF5KCksXHJcbiAgICAgICAgbWF4OiBib3gubWF4LnRvQXJyYXkoKVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBPQkIgY2FzZSAtIGNhbGN1bGF0ZSBtaW4vbWF4IGZyb20gY2VudGVyIGFuZCBoYWxmU2l6ZVxyXG4gICAgICBjb25zdCBtaW4gPSBib3guY2VudGVyLmNsb25lKCkuc3ViKGJveC5oYWxmU2l6ZSlcclxuICAgICAgY29uc3QgbWF4ID0gYm94LmNlbnRlci5jbG9uZSgpLmFkZChib3guaGFsZlNpemUpXHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIG1pbjogbWluLnRvQXJyYXkoKSxcclxuICAgICAgICBtYXg6IG1heC50b0FycmF5KCksXHJcbiAgICAgICAgLi4uKGJveC5yb3RhdGlvbiAmJiB7IHJvdGF0aW9uOiBib3gucm90YXRpb24udG9BcnJheSgpIH0pXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnRzIFNlY3Rpb25Cb3hEYXRhIHRvIEJveDMgb3IgT0JCIGZvcm1hdCAocmV2ZXJzZSBvZiBib3gzVG9TZWN0aW9uQm94RGF0YSlcclxuICAgKi9cclxuICBjb25zdCBzZWN0aW9uQm94RGF0YVRvQm94MyA9IChcclxuICAgIGRhdGE6IFNwZWNrbGVWaWV3ZXIuVmlld2VyU3RhdGUuU2VjdGlvbkJveERhdGFcclxuICApOiBCb3gzIHwgT0JCID0+IHtcclxuICAgIGxldCBib3g6IEJveDMgfCBPQkJcclxuXHJcbiAgICBpZiAoIWRhdGEucm90YXRpb24gfHwgIWRhdGEucm90YXRpb24ubGVuZ3RoKSB7XHJcbiAgICAgIC8vIE5vIHJvdGF0aW9uLCB1c2UgQm94M1xyXG4gICAgICBjb25zdCBtaW4gPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheShkYXRhLm1pbilcclxuICAgICAgY29uc3QgbWF4ID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YS5tYXgpXHJcbiAgICAgIGJveCA9IG5ldyBCb3gzKG1pbiwgbWF4KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSGFzIHJvdGF0aW9uLCBjcmVhdGUgT0JCXHJcbiAgICAgIGJveCA9IG5ldyBPQkIoKVxyXG4gICAgICBjb25zdCBtaW4gPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheShkYXRhLm1pbilcclxuICAgICAgY29uc3QgbWF4ID0gbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoZGF0YS5tYXgpXHJcblxyXG4gICAgICBjb25zdCBfYm94MyA9IG5ldyBCb3gzKClcclxuICAgICAgX2JveDMuc2V0KG1pbiwgbWF4KVxyXG4gICAgICBfYm94My5nZXRDZW50ZXIoYm94LmNlbnRlcilcclxuICAgICAgX2JveDMuZ2V0U2l6ZShib3guaGFsZlNpemUpXHJcbiAgICAgIGJveC5oYWxmU2l6ZS5tdWx0aXBseVNjYWxhcigwLjUpXHJcblxyXG4gICAgICBib3gucm90YXRpb24gPSBuZXcgTWF0cml4MygpLmZyb21BcnJheShkYXRhLnJvdGF0aW9uKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBib3hcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXBhcmVzIHR3byBTZWN0aW9uQm94RGF0YSBvYmplY3RzIGZvciBlcXVhbGl0eSB3aXRoIGZsb2F0aW5nLXBvaW50IHRvbGVyYW5jZVxyXG4gICAqL1xyXG4gIGNvbnN0IHNlY3Rpb25Cb3hEYXRhRXF1YWxzID0gKFxyXG4gICAgYTogU3BlY2tsZVZpZXdlci5WaWV3ZXJTdGF0ZS5TZWN0aW9uQm94RGF0YSxcclxuICAgIGI6IFNwZWNrbGVWaWV3ZXIuVmlld2VyU3RhdGUuU2VjdGlvbkJveERhdGFcclxuICApOiBib29sZWFuID0+IHtcclxuICAgIHJldHVybiBpc0VxdWFsV2l0aChhLCBiLCAob2JqVmFsdWUsIG90aFZhbHVlKSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2Ygb2JqVmFsdWUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvdGhWYWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnMob2JqVmFsdWUgLSBvdGhWYWx1ZSkgPCAxZS02XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc29sdmVTZWN0aW9uQm94RnJvbVNlbGVjdGlvbiA9ICgpID0+IHtcclxuICAgIGNvbnN0IG9iamVjdElkcyA9IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5tYXAoKG8pID0+IG8uaWQpLmZpbHRlcihpc05vbk51bGxhYmxlKVxyXG4gICAgY29uc3QgYm94ID0gaW5zdGFuY2UuZ2V0UmVuZGVyZXIoKS5ib3hGcm9tT2JqZWN0cyhvYmplY3RJZHMpXHJcbiAgICBzZWN0aW9uQm94LnZhbHVlID0gYm94M1RvU2VjdGlvbkJveERhdGEoYm94KVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xvc2VTZWN0aW9uQm94ID0gKCkgPT4ge1xyXG4gICAgdmlzaWJsZS52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG5cclxuICBjb25zdCB0b2dnbGVTZWN0aW9uQm94ID0gKCkgPT4ge1xyXG4gICAgaWYgKCFpc1NlY3Rpb25Cb3hFbmFibGVkLnZhbHVlKSB7XHJcbiAgICAgIHJlc29sdmVTZWN0aW9uQm94RnJvbVNlbGVjdGlvbigpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmIChpc1NlY3Rpb25Cb3hWaXNpYmxlLnZhbHVlKSB7XHJcbiAgICAgIHZpc2libGUudmFsdWUgPSBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmlzaWJsZS52YWx1ZSA9IHRydWVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc2V0U2VjdGlvbkJveCA9ICgpID0+IHtcclxuICAgIGNvbnN0IHNlcmlhbGl6ZWRTZWN0aW9uQm94ID0gdGhyZWFkLnZhbHVlPy52aWV3ZXJTdGF0ZT8udWkuc2VjdGlvbkJveFxyXG4gICAgc2VjdGlvbkJveC52YWx1ZSA9IG51bGxcclxuXHJcbiAgICBpZiAoc2VyaWFsaXplZFNlY3Rpb25Cb3gpIHtcclxuICAgICAgLy8gU2FtZSBsb2dpYyB3ZSBoYXZlIGluIGRlc2VyaWFsaXphdGlvblxyXG4gICAgICBzZWN0aW9uQm94LnZhbHVlID0ge1xyXG4gICAgICAgIG1pbjogc2VyaWFsaXplZFNlY3Rpb25Cb3gubWluLFxyXG4gICAgICAgIG1heDogc2VyaWFsaXplZFNlY3Rpb25Cb3gubWF4LFxyXG4gICAgICAgIHJvdGF0aW9uOiBzZXJpYWxpemVkU2VjdGlvbkJveC5yb3RhdGlvblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCByZXNldFNlY3Rpb25Cb3hDb21wbGV0ZWx5ID0gKCkgPT4ge1xyXG4gICAgc2VjdGlvbkJveC52YWx1ZSA9IG51bGxcclxuICAgIHZpc2libGUudmFsdWUgPSBmYWxzZVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGlzU2VjdGlvbkJveEVuYWJsZWQsXHJcbiAgICBpc1NlY3Rpb25Cb3hWaXNpYmxlLFxyXG4gICAgaXNTZWN0aW9uQm94RWRpdGVkLFxyXG4gICAgdG9nZ2xlU2VjdGlvbkJveCxcclxuICAgIHJlc2V0U2VjdGlvbkJveCxcclxuICAgIHJlc2V0U2VjdGlvbkJveENvbXBsZXRlbHksXHJcbiAgICBzZWN0aW9uQm94LFxyXG4gICAgY2xvc2VTZWN0aW9uQm94LFxyXG4gICAgYm94M1RvU2VjdGlvbkJveERhdGEsXHJcbiAgICBzZWN0aW9uQm94RGF0YVRvQm94MyxcclxuICAgIHNlY3Rpb25Cb3hEYXRhRXF1YWxzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlQ2FtZXJhVXRpbGl0aWVzKCkge1xyXG4gIGNvbnN0IHsgaW5zdGFuY2UgfSA9IHVzZUluamVjdGVkVmlld2VyKClcclxuICBjb25zdCB7XHJcbiAgICBmaWx0ZXJzOiB7IHNlbGVjdGVkT2JqZWN0cywgaXNvbGF0ZWRPYmplY3RJZHMgfSxcclxuICAgIGNhbWVyYVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlKClcclxuXHJcbiAgY29uc3QgY2FtZXJhQ29udHJvbGxlciA9IGluc3RhbmNlLmdldEV4dGVuc2lvbihDYW1lcmFDb250cm9sbGVyKVxyXG5cclxuICBjb25zdCBzZXRWaWV3ID0gKFxyXG4gICAgdmlldzogQ2Fub25pY2FsVmlldyB8IElubGluZVZpZXcgfCBTcGVja2xlVmlldyxcclxuICAgIHRyYW5zaXRpb24gPSB0cnVlXHJcbiAgKSA9PiB7XHJcbiAgICBjYW1lcmFDb250cm9sbGVyLnNldENhbWVyYVZpZXcodmlldywgdHJhbnNpdGlvbilcclxuICB9XHJcblxyXG4gIGNvbnN0IHpvb21FeHRlbnRzT3JTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBjb25zdCBpZHMgPSBzZWxlY3RlZE9iamVjdHMudmFsdWVcbiAgICAgIC5mbGF0TWFwKChvKSA9PiBnZXRUYXJnZXRPYmplY3RJZHMobyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpXG4gICAgICAuZmlsdGVyKGlzTm9uTnVsbGFibGUpXG5cclxuICAgIGlmIChpZHMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gY2FtZXJhQ29udHJvbGxlci5zZXRDYW1lcmFWaWV3KGlkcywgdHJ1ZSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNvbGF0ZWRPYmplY3RJZHMudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiBjYW1lcmFDb250cm9sbGVyLnNldENhbWVyYVZpZXcoaXNvbGF0ZWRPYmplY3RJZHMudmFsdWUsIHRydWUpXHJcbiAgICB9XHJcblxyXG4gICAgY2FtZXJhQ29udHJvbGxlci5zZXRDYW1lcmFWaWV3KHVuZGVmaW5lZCwgdHJ1ZSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHRvZ2dsZVByb2plY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBjYW1lcmEuaXNPcnRob1Byb2plY3Rpb24udmFsdWUgPSAhY2FtZXJhLmlzT3J0aG9Qcm9qZWN0aW9uLnZhbHVlXHJcbiAgICBjYW1lcmFDb250cm9sbGVyLnRvZ2dsZUNhbWVyYXMoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZm9yY2VWaWV3VG9WaWV3ZXJTeW5jID0gKCkgPT4ge1xyXG4gICAgc2V0VmlldyhcclxuICAgICAge1xyXG4gICAgICAgIHBvc2l0aW9uOiBjYW1lcmEucG9zaXRpb24udmFsdWUsXHJcbiAgICAgICAgdGFyZ2V0OiBjYW1lcmEudGFyZ2V0LnZhbHVlXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgIClcclxuICB9XHJcblxyXG4gIGNvbnN0IHpvb20gPSAob2JqZWN0SWRzPzogc3RyaW5nW10sIGZpdD86IG51bWJlciwgdHJhbnNpdGlvbj86IGJvb2xlYW4pID0+IHtcclxuICAgIGNhbWVyYUNvbnRyb2xsZXIuc2V0Q2FtZXJhVmlldyhvYmplY3RJZHMsIHRyYW5zaXRpb24sIGZpdClcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB6b29tRXh0ZW50c09yU2VsZWN0aW9uLFxyXG4gICAgdG9nZ2xlUHJvamVjdGlvbixcclxuICAgIGNhbWVyYSxcclxuICAgIHNldFZpZXcsXHJcbiAgICB6b29tLFxyXG4gICAgZm9yY2VWaWV3VG9WaWV3ZXJTeW5jLFxyXG4gICAgY2FtZXJhQ29udHJvbGxlclxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNlbGVjdGlvblV0aWxpdGllcygpIHtcclxuICBjb25zdCB7XHJcbiAgICBmaWx0ZXJzOiB7IHNlbGVjdGVkT2JqZWN0cywgc2VsZWN0ZWRPYmplY3RJZHMgfVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlKClcclxuICBjb25zdCB7IG1ldGFkYXRhIH0gPSB1c2VJbmplY3RlZFZpZXdlcigpXHJcblxyXG4gIGNvbnN0IHNldFNlbGVjdGlvbkZyb21PYmplY3RJZHMgPSAob2JqZWN0SWRzOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgY29uc3Qgb2JqczogQXJyYXk8U3BlY2tsZU9iamVjdD4gPSBbXVxyXG4gICAgb2JqZWN0SWRzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgb2Jqcy5wdXNoKFxyXG4gICAgICAgIC4uLihcclxuICAgICAgICAgIChtZXRhZGF0YT8ud29ybGRUcmVlLnZhbHVlPy5maW5kSWQodmFsdWUpIHx8IFtdKSBhcyB1bmtub3duIGFzIFRyZWVOb2RlW11cclxuICAgICAgICApLm1hcChcclxuICAgICAgICAgIChub2RlOiBUcmVlTm9kZSkgPT5cclxuICAgICAgICAgICAgKG5vZGUubW9kZWwgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnJhdyBhcyBTcGVja2xlT2JqZWN0XHJcbiAgICAgICAgKVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gICAgc2VsZWN0ZWRPYmplY3RzLnZhbHVlID0gb2Jqc1xyXG4gIH1cclxuXHJcbiAgY29uc3QgYWRkVG9TZWxlY3Rpb25Gcm9tT2JqZWN0SWRzID0gKG9iamVjdElkczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IG9yaWdpbmFsT2JqZWN0cyA9IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5zbGljZSgpXHJcbiAgICBzZXRTZWxlY3Rpb25Gcm9tT2JqZWN0SWRzKG9iamVjdElkcylcclxuXHJcbiAgICAvLyBGaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgYnkgY2hlY2tpbmcgaWYgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIElEIGFscmVhZHkgZXhpc3RcclxuICAgIGNvbnN0IG5ld09iamVjdHMgPSBzZWxlY3RlZE9iamVjdHMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAobmV3T2JqKSA9PiAhb3JpZ2luYWxPYmplY3RzLnNvbWUoKGV4aXN0aW5nT2JqKSA9PiBleGlzdGluZ09iai5pZCA9PT0gbmV3T2JqLmlkKVxyXG4gICAgKVxyXG5cclxuICAgIHNlbGVjdGVkT2JqZWN0cy52YWx1ZSA9IFsuLi5vcmlnaW5hbE9iamVjdHMsIC4uLm5ld09iamVjdHNdXHJcbiAgfVxyXG5cclxuICBjb25zdCByZW1vdmVGcm9tU2VsZWN0aW9uT2JqZWN0SWRzID0gKG9iamVjdElkczogc3RyaW5nW10pID0+IHtcclxuICAgIGNvbnN0IGZpbmFsT2JqZWN0cyA9IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5maWx0ZXIoXHJcbiAgICAgIChvKSA9PiAhb2JqZWN0SWRzLmluY2x1ZGVzKG8uaWQgfHwgJycpXHJcbiAgICApXHJcbiAgICBzZWxlY3RlZE9iamVjdHMudmFsdWUgPSBmaW5hbE9iamVjdHNcclxuICB9XHJcblxyXG4gIGNvbnN0IGFkZFRvU2VsZWN0aW9uID0gKG9iamVjdDogU3BlY2tsZU9iamVjdCkgPT4ge1xyXG4gICAgY29uc3QgaWR4ID0gc2VsZWN0ZWRPYmplY3RzLnZhbHVlLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gb2JqZWN0LmlkKVxyXG4gICAgaWYgKGlkeCAhPT0gLTEpIHJldHVyblxyXG5cclxuICAgIHNlbGVjdGVkT2JqZWN0cy52YWx1ZSA9IFsuLi5zZWxlY3RlZE9iamVjdHMudmFsdWUsIG9iamVjdF1cclxuICB9XHJcblxyXG4gIGNvbnN0IHJlbW92ZUZyb21TZWxlY3Rpb24gPSAob2JqZWN0T3JJZDogU3BlY2tsZU9iamVjdCB8IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3Qgb2lkID0gaXNTdHJpbmcob2JqZWN0T3JJZCkgPyBvYmplY3RPcklkIDogb2JqZWN0T3JJZC5pZFxyXG4gICAgY29uc3QgaWR4ID0gc2VsZWN0ZWRPYmplY3RzLnZhbHVlLmZpbmRJbmRleCgobykgPT4gby5pZCA9PT0gb2lkKVxyXG4gICAgaWYgKGlkeCA9PT0gLTEpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IG5ld09iamVjdHMgPSBzZWxlY3RlZE9iamVjdHMudmFsdWUuc2xpY2UoKVxyXG4gICAgbmV3T2JqZWN0cy5zcGxpY2UoaWR4LCAxKVxyXG4gICAgc2VsZWN0ZWRPYmplY3RzLnZhbHVlID0gbmV3T2JqZWN0c1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xlYXJTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgICBzZWxlY3RlZE9iamVjdHMudmFsdWUgPSBbXVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGFkZFRvU2VsZWN0aW9uLFxyXG4gICAgcmVtb3ZlRnJvbVNlbGVjdGlvbixcclxuICAgIGNsZWFyU2VsZWN0aW9uLFxyXG4gICAgc2V0U2VsZWN0aW9uRnJvbU9iamVjdElkcyxcclxuICAgIGFkZFRvU2VsZWN0aW9uRnJvbU9iamVjdElkcyxcclxuICAgIHJlbW92ZUZyb21TZWxlY3Rpb25PYmplY3RJZHMsXHJcbiAgICBvYmplY3RzOiBzZWxlY3RlZE9iamVjdHMsXHJcbiAgICBvYmplY3RJZHM6IHNlbGVjdGVkT2JqZWN0SWRzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlRGlmZlV0aWxpdGllcygpIHtcclxuICBjb25zdCBzdGF0ZSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgc2VyaWFsaXplRGlmZkNvbW1hbmQsIGRlc2VyaWFsaXplRGlmZkNvbW1hbmQsIGFyZURpZmZzRXF1YWwgfSA9XHJcbiAgICB1c2VEaWZmQnVpbGRlclV0aWxpdGllcygpXHJcblxyXG4gIGNvbnN0IGVuZERpZmYgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBhd2FpdCBzdGF0ZS51cmxIYXNoU3RhdGUuZGlmZi51cGRhdGUobnVsbClcclxuICB9XHJcblxyXG4gIGNvbnN0IGRpZmZNb2RlbFZlcnNpb25zID0gYXN5bmMgKFxyXG4gICAgbW9kZWxJZDogc3RyaW5nLFxyXG4gICAgdmVyc2lvbkE6IHN0cmluZyxcclxuICAgIHZlcnNpb25COiBzdHJpbmdcclxuICApID0+IHtcclxuICAgIGF3YWl0IHN0YXRlLnVybEhhc2hTdGF0ZS5kaWZmLnVwZGF0ZSh7XHJcbiAgICAgIGRpZmZzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdmVyc2lvbkE6IG5ldyBTcGVja2xlVmlld2VyLlZpZXdlclJvdXRlLlZpZXdlclZlcnNpb25SZXNvdXJjZShcclxuICAgICAgICAgICAgbW9kZWxJZCxcclxuICAgICAgICAgICAgdmVyc2lvbkFcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICB2ZXJzaW9uQjogbmV3IFNwZWNrbGVWaWV3ZXIuVmlld2VyUm91dGUuVmlld2VyVmVyc2lvblJlc291cmNlKFxyXG4gICAgICAgICAgICBtb2RlbElkLFxyXG4gICAgICAgICAgICB2ZXJzaW9uQlxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgXVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzZXJpYWxpemVEaWZmQ29tbWFuZCxcclxuICAgIGRlc2VyaWFsaXplRGlmZkNvbW1hbmQsXHJcbiAgICBlbmREaWZmLFxyXG4gICAgZGlmZk1vZGVsVmVyc2lvbnMsXHJcbiAgICBhcmVEaWZmc0VxdWFsXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVGhyZWFkVXRpbGl0aWVzKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHVybEhhc2hTdGF0ZTogeyBmb2N1c2VkVGhyZWFkSWQgfSxcclxuICAgIHVpOiB7XHJcbiAgICAgIHRocmVhZHM6IHtcclxuICAgICAgICBvcGVuVGhyZWFkOiB7IHRocmVhZDogb3BlblRocmVhZCB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IGlzT3BlblRocmVhZCA9IChpZDogc3RyaW5nKSA9PiBmb2N1c2VkVGhyZWFkSWQudmFsdWUgPT09IGlkXHJcblxyXG4gIGNvbnN0IGNsb3NlQWxsVGhyZWFkcyA9IGFzeW5jICgpID0+IHtcclxuICAgIGF3YWl0IGZvY3VzZWRUaHJlYWRJZC51cGRhdGUobnVsbClcclxuICB9XHJcblxyXG4gIGNvbnN0IG9wZW4gPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKGlkID09PSBmb2N1c2VkVGhyZWFkSWQudmFsdWUpIHJldHVyblxyXG4gICAgYXdhaXQgZm9jdXNlZFRocmVhZElkLnVwZGF0ZShpZClcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgdW50aWwoZm9jdXNlZFRocmVhZElkKS50b01hdGNoKCh0aWQpID0+IHRpZCA9PT0gaWQpLFxyXG4gICAgICB1bnRpbChvcGVuVGhyZWFkKS50b01hdGNoKCh0KSA9PiB0Py5pZCA9PT0gaWQpXHJcbiAgICBdKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHsgY2xvc2VBbGxUaHJlYWRzLCBvcGVuLCBpc09wZW5UaHJlYWQgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlTWVhc3VyZW1lbnRVdGlsaXRpZXMoKSB7XHJcbiAgY29uc3Qgc3RhdGUgPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuICBjb25zdCBtZWFzdXJlbWVudHNFeHRlbnNpb24gPVxyXG4gICAgc3RhdGUudmlld2VyLmluc3RhbmNlLmdldEV4dGVuc2lvbihNZWFzdXJlbWVudHNFeHRlbnNpb24pXHJcblxyXG4gIGNvbnN0IG1lYXN1cmVtZW50T3B0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHN0YXRlLnVpLm1lYXN1cmVtZW50Lm9wdGlvbnMudmFsdWUpXHJcbiAgY29uc3QgaGFzTWVhc3VyZW1lbnRzID0gY29tcHV0ZWQoXHJcbiAgICAoKSA9PiBzdGF0ZS51aS5tZWFzdXJlbWVudC5tZWFzdXJlbWVudHMudmFsdWUubGVuZ3RoID4gMFxyXG4gIClcclxuXHJcbiAgY29uc3QgZW5hYmxlTWVhc3VyZW1lbnRzID0gKGVuYWJsZWQ6IGJvb2xlYW4pID0+IHtcclxuICAgIHN0YXRlLnVpLm1lYXN1cmVtZW50LmVuYWJsZWQudmFsdWUgPSBlbmFibGVkXHJcbiAgfVxyXG5cclxuICBjb25zdCBzZXRNZWFzdXJlbWVudE9wdGlvbnMgPSAob3B0aW9uczogTWVhc3VyZW1lbnRPcHRpb25zKSA9PiB7XHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5vcHRpb25zLnZhbHVlID0gb3B0aW9uc1xyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVtb3ZlQWN0aXZlTWVhc3VyZW1lbnQgPSAoKSA9PiB7XHJcbiAgICBtZWFzdXJlbWVudHNFeHRlbnNpb24ucmVtb3ZlTWVhc3VyZW1lbnQoKVxyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xlYXJNZWFzdXJlbWVudHMgPSAoKSA9PiB7XHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5tZWFzdXJlbWVudHMudmFsdWUgPSBbXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5lbmFibGVkLnZhbHVlID0gZmFsc2VcclxuICAgIHN0YXRlLnVpLm1lYXN1cmVtZW50Lm1lYXN1cmVtZW50cy52YWx1ZSA9IFtdXHJcbiAgICBzdGF0ZS51aS5tZWFzdXJlbWVudC5vcHRpb25zLnZhbHVlID0geyAuLi5kZWZhdWx0TWVhc3VyZW1lbnRPcHRpb25zIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBtZWFzdXJlbWVudE9wdGlvbnMsXHJcbiAgICBlbmFibGVNZWFzdXJlbWVudHMsXHJcbiAgICBzZXRNZWFzdXJlbWVudE9wdGlvbnMsXHJcbiAgICByZW1vdmVBY3RpdmVNZWFzdXJlbWVudCxcclxuICAgIGNsZWFyTWVhc3VyZW1lbnRzLFxyXG4gICAgaGFzTWVhc3VyZW1lbnRzLFxyXG4gICAgcmVzZXQsXHJcbiAgICBtZWFzdXJlbWVudHM6IHN0YXRlLnVpLm1lYXN1cmVtZW50Lm1lYXN1cmVtZW50c1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFNvbWUgY29uZGl0aW9uYWwgcmVuZGVyaW5nIHZhbHVlcyBkZXBlbmQgb24gbXVsdGlwbGUgJiBvdmVybGFwcGluZyBzdGF0ZXMuIFRoaXMgdXRpbGl0eSByZWNvbmNpbGVzIHRoYXQuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlQ29uZGl0aW9uYWxWaWV3ZXJSZW5kZXJpbmcoKSB7XHJcbiAgY29uc3QgZW1iZWRNb2RlID0gdXNlRW1iZWRTdGF0ZSgpXHJcblxyXG4gIGNvbnN0IHNob3dDb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGlmIChcclxuICAgICAgZW1iZWRNb2RlLmVtYmVkT3B0aW9ucy52YWx1ZT8uaXNFbmFibGVkICYmXHJcbiAgICAgIGVtYmVkTW9kZS5lbWJlZE9wdGlvbnMudmFsdWUuaGlkZUNvbnRyb2xzXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9KVxyXG5cclxuICBjb25zdCBzaG93TmF2YmFyID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKCFzaG93Q29udHJvbHMudmFsdWUpIHJldHVybiBmYWxzZVxyXG4gICAgaWYgKGVtYmVkTW9kZS5lbWJlZE9wdGlvbnMudmFsdWU/LmlzRW5hYmxlZCkgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzaG93TmF2YmFyLFxyXG4gICAgc2hvd0NvbnRyb2xzXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlSGlnaGxpZ2h0ZWRPYmplY3RzVXRpbGl0aWVzKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHVpOiB7IGhpZ2hsaWdodGVkT2JqZWN0SWRzIH0sXHJcbiAgICBwYWdlVHlwZVxyXG4gIH0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbiAgY29uc3QgaGlnaGxpZ2h0T2JqZWN0cyA9IChpZHM6IHN0cmluZ1tdKSA9PiB7XHJcbiAgICBpZiAocGFnZVR5cGUudmFsdWUgPT09IFZpZXdlclJlbmRlclBhZ2VUeXBlLlByZXNlbnRhdGlvbikgcmV0dXJuXHJcblxyXG4gICAgaGlnaGxpZ2h0ZWRPYmplY3RJZHMudmFsdWUgPSBbLi4ubmV3IFNldChbLi4uaGlnaGxpZ2h0ZWRPYmplY3RJZHMudmFsdWUsIC4uLmlkc10pXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgdW5oaWdobGlnaHRPYmplY3RzID0gKGlkczogc3RyaW5nW10pID0+IHtcclxuICAgIGhpZ2hsaWdodGVkT2JqZWN0SWRzLnZhbHVlID0gaGlnaGxpZ2h0ZWRPYmplY3RJZHMudmFsdWUuZmlsdGVyKFxyXG4gICAgICAoaWQpID0+ICFpZHMuaW5jbHVkZXMoaWQpXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBjb25zdCBjbGVhckhpZ2hsaWdodGVkT2JqZWN0cyA9ICgpID0+IHtcclxuICAgIGhpZ2hsaWdodGVkT2JqZWN0SWRzLnZhbHVlID0gW11cclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBoaWdobGlnaHRPYmplY3RzLFxyXG4gICAgdW5oaWdobGlnaHRPYmplY3RzLFxyXG4gICAgY2xlYXJIaWdobGlnaHRlZE9iamVjdHNcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VWaWV3TW9kZVV0aWxpdGllcygpIHtcclxuICBjb25zdCB7IHZpZXdNb2RlIH0gPSB1c2VJbmplY3RlZFZpZXdlckludGVyZmFjZVN0YXRlKClcclxuICBjb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuXHJcbiAgY29uc3Qgc2V0Vmlld01vZGUgPSAobW9kZTogVmlld01vZGUpID0+IHtcclxuICAgIHZpZXdNb2RlLm1vZGUudmFsdWUgPSBtb2RlXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdzZXQtdmlldy1tb2RlJyxcclxuICAgICAgbW9kZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHRvZ2dsZUVkZ2VzRW5hYmxlZCA9ICgpID0+IHtcclxuICAgIHZpZXdNb2RlLmVkZ2VzRW5hYmxlZC52YWx1ZSA9ICF2aWV3TW9kZS5lZGdlc0VuYWJsZWQudmFsdWVcclxuICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgICAgbmFtZTogJ3RvZ2dsZS1lZGdlcycsXHJcbiAgICAgIGVuYWJsZWQ6IHZpZXdNb2RlLmVkZ2VzRW5hYmxlZC52YWx1ZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHNldEVkZ2VzV2VpZ2h0ID0gKHdlaWdodDogbnVtYmVyKSA9PiB7XHJcbiAgICB2aWV3TW9kZS5lZGdlc1dlaWdodC52YWx1ZSA9IE51bWJlcih3ZWlnaHQpXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdzZXQtZWRnZXMtd2VpZ2h0JyxcclxuICAgICAgd2VpZ2h0OiB2aWV3TW9kZS5lZGdlc1dlaWdodC52YWx1ZVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHNldEVkZ2VzQ29sb3IgPSAoY29sb3I6IG51bWJlciB8IHR5cGVvZiBkZWZhdWx0RWRnZUNvbG9yVmFsdWUpID0+IHtcclxuICAgIHZpZXdNb2RlLmVkZ2VzQ29sb3IudmFsdWUgPSBjb2xvclxyXG4gICAgbXAudHJhY2soJ1ZpZXdlciBBY3Rpb24nLCB7XHJcbiAgICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgICBuYW1lOiAnc2V0LWVkZ2VzLWNvbG9yJyxcclxuICAgICAgY29sb3I6IGNvbG9yLnRvU3RyaW5nKDE2KS5wYWRTdGFydCg2LCAnMCcpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHZpZXdNb2RlLFxyXG4gICAgc2V0Vmlld01vZGUsXHJcbiAgICB0b2dnbGVFZGdlc0VuYWJsZWQsXHJcbiAgICBzZXRFZGdlc1dlaWdodCxcclxuICAgIHNldEVkZ2VzQ29sb3IsXHJcbiAgICByZXNldFZpZXdNb2RlOiB2aWV3TW9kZS5yZXNldFZpZXdNb2RlXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlVmlld2VyU2hvcnRjdXRzKCkge1xyXG4gIGNvbnN0IHsgdWkgfSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG4gIGNvbnN0IHsgaXNTbWFsbGVyT3JFcXVhbFNtIH0gPSB1c2VJc1NtYWxsZXJPckVxdWFsVGhhbkJyZWFrcG9pbnQoKVxyXG4gIGNvbnN0IHsgaXNFbmFibGVkOiBpc0VtYmVkRW5hYmxlZCB9ID0gdXNlRW1iZWQoKVxyXG4gIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB1c2VBY3RpdmVFbGVtZW50KClcclxuXHJcbiAgY29uc3QgaXNUeXBpbmdDb21tZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICBhY3RpdmVFbGVtZW50LnZhbHVlICYmXHJcbiAgICAgIChhY3RpdmVFbGVtZW50LnZhbHVlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyB8fFxyXG4gICAgICAgIGFjdGl2ZUVsZW1lbnQudmFsdWUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGV4dGFyZWEnIHx8XHJcbiAgICAgICAgYWN0aXZlRWxlbWVudC52YWx1ZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayB0aHJlYWQgZWRpdG9yIHN0YXRlc1xyXG4gICAgY29uc3QgaXNOZXdUaHJlYWRFZGl0b3JPcGVuID0gdWkudGhyZWFkcy5vcGVuVGhyZWFkLm5ld1RocmVhZEVkaXRvci52YWx1ZVxyXG4gICAgY29uc3QgaXNFeGlzdGluZ1RocmVhZEVkaXRvck9wZW4gPSAhIXVpLnRocmVhZHMub3BlblRocmVhZC50aHJlYWQudmFsdWVcclxuXHJcbiAgICByZXR1cm4gaXNOZXdUaHJlYWRFZGl0b3JPcGVuIHx8IGlzRXhpc3RpbmdUaHJlYWRFZGl0b3JPcGVuXHJcbiAgfSlcclxuXHJcbiAgY29uc3QgZm9ybWF0S2V5ID0gKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0RpZ2l0JykpIHtcclxuICAgICAgcmV0dXJuIGtleS5zbGljZSg1KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZ2V0U2hvcnRjdXREaXNwbGF5VGV4dCA9IChcclxuICAgIHNob3J0Y3V0OiBWaWV3ZXJTaG9ydGN1dCxcclxuICAgIG9wdGlvbnM/OiB7IGhpZGVOYW1lPzogYm9vbGVhbjsgZm9ybWF0PzogJ2RlZmF1bHQnIHwgJ3NlcGFyYXRlJyB9XHJcbiAgKSA9PiB7XHJcbiAgICBpZiAoaXNTbWFsbGVyT3JFcXVhbFNtLnZhbHVlKSByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICBpZiAoaXNFbWJlZEVuYWJsZWQudmFsdWUpIHJldHVybiB1bmRlZmluZWRcclxuXHJcbiAgICBjb25zdCBzaG9ydGN1dFRleHQgPSBnZXRLZXlib2FyZFNob3J0Y3V0VGl0bGUoW1xyXG4gICAgICAuLi5zaG9ydGN1dC5tb2RpZmllcnMsXHJcbiAgICAgIGZvcm1hdEtleShzaG9ydGN1dC5rZXkpXHJcbiAgICBdKVxyXG5cclxuICAgIGlmIChvcHRpb25zPy5mb3JtYXQgPT09ICdzZXBhcmF0ZScpIHtcclxuICAgICAgY29uc3QgbW9kaWZpZXJzVGV4dCA9XHJcbiAgICAgICAgc2hvcnRjdXQubW9kaWZpZXJzLmxlbmd0aCA+IDBcclxuICAgICAgICAgID8gZ2V0S2V5Ym9hcmRTaG9ydGN1dFRpdGxlKFsuLi5zaG9ydGN1dC5tb2RpZmllcnNdKVxyXG4gICAgICAgICAgOiAnJ1xyXG4gICAgICBjb25zdCBrZXlUZXh0ID0gZ2V0S2V5Ym9hcmRTaG9ydGN1dFRpdGxlKFtmb3JtYXRLZXkoc2hvcnRjdXQua2V5KV0pXHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGNvbnRlbnQ6IGBcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMiBtLTAgcC0wXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmRcIj4ke3Nob3J0Y3V0Lm5hbWV9PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmQtM1wiPlxyXG4gICAgICAgICAgICAke1xyXG4gICAgICAgICAgICAgIG1vZGlmaWVyc1RleHRcclxuICAgICAgICAgICAgICAgID8gYDxrYmQgY2xhc3M9XCJwLTAuNSBtaW4tdy00IHRleHQtZm9yZWdyb3VuZC0yIHJvdW5kZWQtbWQgdGV4dC1ib2R5LTN4cyBmb250LW5vcm1hbCBmb250LXNhbnNcIj4ke21vZGlmaWVyc1RleHR9PC9rYmQ+YFxyXG4gICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICAgICB9PGtiZCBjbGFzcz1cIm1pbi13LTMgdGV4dC1mb3JlZ3JvdW5kLTIgcm91bmRlZC1zbSB0ZXh0LWJvZHktM3hzIGZvbnQtc2Fuc1wiPiR7a2V5VGV4dH08L2tiZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICBgLFxyXG4gICAgICAgIGFsbG93SFRNTDogdHJ1ZSxcclxuICAgICAgICB0aGVtZTogJ3NwZWNrbGVUb29sdGlwJ1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFvcHRpb25zPy5oaWRlTmFtZSkge1xyXG4gICAgICByZXR1cm4gYCR7c2hvcnRjdXQubmFtZX0gKCR7c2hvcnRjdXRUZXh0fSlgXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNob3J0Y3V0VGV4dFxyXG4gIH1cclxuXHJcbiAgY29uc3QgZGlzYWJsZVNob3J0Y3V0cyA9IGNvbXB1dGVkKCgpID0+IGlzVHlwaW5nQ29tbWVudC52YWx1ZSB8fCBpc0VtYmVkRW5hYmxlZC52YWx1ZSlcclxuXHJcbiAgY29uc3QgcmVnaXN0ZXJTaG9ydGN1dHMgPSAoXHJcbiAgICBoYW5kbGVyczogUGFydGlhbDxSZWNvcmQ8Vmlld2VyU2hvcnRjdXRBY3Rpb24sICgpID0+IHZvaWQ+PlxyXG4gICkgPT4ge1xyXG4gICAgT2JqZWN0LnZhbHVlcyhWaWV3ZXJTaG9ydGN1dHMpLmZvckVhY2goKHNob3J0Y3V0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyc1tzaG9ydGN1dC5hY3Rpb24gYXMgVmlld2VyU2hvcnRjdXRBY3Rpb25dXHJcbiAgICAgIGlmIChoYW5kbGVyKSB7XHJcbiAgICAgICAgb25LZXlib2FyZFNob3J0Y3V0KFsuLi5zaG9ydGN1dC5tb2RpZmllcnNdLCBzaG9ydGN1dC5rZXksICgpID0+IHtcclxuICAgICAgICAgIGlmICghZGlzYWJsZVNob3J0Y3V0cy52YWx1ZSkgaGFuZGxlcigpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBzaG9ydGN1dHM6IFZpZXdlclNob3J0Y3V0cyxcclxuICAgIHJlZ2lzdGVyU2hvcnRjdXRzLFxyXG4gICAgZ2V0U2hvcnRjdXREaXNwbGF5VGV4dFxyXG4gIH1cclxufVxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aS50cyJ9