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

300 lines
42 KiB
Plaintext

import {
useInjectedViewerState,
useResetUiState
} from "/_nuxt/lib/viewer/composables/setup.ts";
import { isUndefinedOrVoid, SpeckleViewer } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { get } 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 {
useDiffUtilities,
useSelectionUtilities,
useSectionBoxUtilities
} from "/_nuxt/lib/viewer/composables/ui.ts";
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
import { useFilteringDataStore } from "/_nuxt/lib/viewer/composables/filtering/dataStore.ts";
import { CameraController, SectionTool, VisualDiffMode } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js";
import {
defaultMeasurementOptions,
formatSerializedViewerState
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/state.js";
import { useViewerRealtimeActivityTracker } from "/_nuxt/lib/viewer/composables/activity.ts";
import {
isModelResource,
resourceBuilder
} from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/route.js";
import { until } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
export function useStateSerialization() {
const state = useInjectedViewerState();
const { objects: selectedObjects } = useSelectionUtilities();
const { serializeDiffCommand } = useDiffUtilities();
const { filters } = useFilterUtilities();
const dataStore = useFilteringDataStore();
const { box3ToSectionBoxData } = useSectionBoxUtilities();
const serialize = (options) => {
const { concreteResourceIdString } = options || {};
const camControls = state.viewer.instance.getExtension(CameraController).controls;
const rawBox = state.viewer.instance.getExtension(SectionTool).getBox();
const box = rawBox ? box3ToSectionBoxData(rawBox) : null;
const ret = {
projectId: state.projectId.value,
sessionId: state.sessionId.value,
viewer: {
metadata: {
filteringState: state.viewer.metadata.filteringState.value ? {
passMin: state.viewer.metadata.filteringState.value.passMin,
passMax: state.viewer.metadata.filteringState.value.passMax
} : null
}
},
resources: {
request: {
resourceIdString: concreteResourceIdString ? state.resources.response.concreteResourceIdString.value : state.resources.request.resourceIdString.value,
threadFilters: { ...state.resources.request.threadFilters.value }
}
},
ui: {
threads: {
openThread: {
threadId: state.ui.threads.openThread.thread.value?.id || null,
isTyping: state.ui.threads.openThread.isTyping.value,
newThreadEditor: state.ui.threads.openThread.newThreadEditor.value
}
},
diff: {
command: state.urlHashState.diff.value ? serializeDiffCommand(state.urlHashState.diff.value) : null,
time: state.ui.diff.time.value,
mode: state.ui.diff.mode.value
},
spotlightUserSessionId: state.ui.spotlightUserSessionId.value,
filters: (() => {
const propertyFilters = filters.propertyFilters.value.map((filterData) => ({
key: filterData.filter?.key || null,
isApplied: filterData.isApplied,
selectedValues: filterData.selectedValues,
id: filterData.id,
condition: filterData.condition,
numericRange: filterData.type === "numeric" ? filterData.numericRange : void 0
}));
return {
isolatedObjectIds: state.ui.filters.isolatedObjectIds.value,
hiddenObjectIds: state.ui.filters.hiddenObjectIds.value,
selectedObjectApplicationIds: selectedObjects.value.reduce((ret2, obj) => {
ret2[obj.id] = obj.applicationId ?? null;
return ret2;
}, {}),
propertyFilters,
activeColorFilterId: state.ui.filters.activeColorFilterId.value,
filterLogic: dataStore.currentFilterLogic.value
};
})(),
camera: {
position: state.ui.camera.position.value.toArray(),
target: state.ui.camera.target.value.toArray(),
isOrthoProjection: state.ui.camera.isOrthoProjection.value,
zoom: get(camControls, "_zoom") || 1
// kinda hacky, _zoom is a protected prop
},
viewMode: {
mode: state.ui.viewMode.mode.value,
edgesEnabled: state.ui.viewMode.edgesEnabled.value,
edgesWeight: state.ui.viewMode.edgesWeight.value,
outlineOpacity: state.ui.viewMode.outlineOpacity.value,
edgesColor: state.ui.viewMode.edgesColor.value
},
sectionBox: state.ui.sectionBox.value ? box : null,
lightConfig: { ...state.ui.lightConfig.value },
explodeFactor: state.ui.explodeFactor.value,
selection: state.ui.selection.value?.toArray() || null,
measurement: {
enabled: state.ui.measurement.enabled.value,
options: state.ui.measurement.options.value,
measurements: state.ui.measurement.measurements.value.slice()
}
}
};
return ret;
};
return { serialize };
}
export var StateApplyMode = /* @__PURE__ */ ((StateApplyMode2) => {
StateApplyMode2[StateApplyMode2["Spotlight"] = 0] = "Spotlight";
StateApplyMode2[StateApplyMode2["ThreadOpen"] = 1] = "ThreadOpen";
StateApplyMode2[StateApplyMode2["ThreadFullContextOpen"] = 2] = "ThreadFullContextOpen";
StateApplyMode2[StateApplyMode2["Reset"] = 3] = "Reset";
StateApplyMode2[StateApplyMode2["FederatedContext"] = 4] = "FederatedContext";
StateApplyMode2[StateApplyMode2["SavedView"] = 5] = "SavedView";
return StateApplyMode2;
})(StateApplyMode || {});
export function useApplySerializedState() {
const {
projectId,
ui: {
camera: { position, target, isOrthoProjection },
sectionBox,
highlightedObjectIds,
explodeFactor,
lightConfig,
diff,
viewMode,
measurement,
sectionBoxContext,
loading
},
resources: {
request: { resourceIdString }
},
urlHashState
} = useInjectedViewerState();
const { resetFilters, hideObjects, restoreFilters } = useFilterUtilities();
const resetState = useResetUiState();
const { diffModelVersions, deserializeDiffCommand, endDiff } = useDiffUtilities();
const { setSelectionFromObjectIds } = useSelectionUtilities();
const { update } = useViewerRealtimeActivityTracker();
return async (state, mode, options) => {
if (mode === 3 /* Reset */) {
resetState();
update();
return;
}
const formattedState = formatSerializedViewerState(state);
if (formattedState.projectId && formattedState.projectId !== projectId.value) {
await projectId.update(formattedState.projectId);
}
let newResourceIdString = void 0;
if ([0 /* Spotlight */, 2 /* ThreadFullContextOpen */].includes(mode)) {
newResourceIdString = formattedState.resources?.request?.resourceIdString || "";
} else if (mode === 5 /* SavedView */) {
const { loadOriginal } = options || {};
const current = resourceBuilder().addResources(resourceIdString.value);
const incoming = resourceBuilder().addResources(
formattedState.resources?.request?.resourceIdString || ""
);
const finalItems = [];
for (const incomingItem of incoming) {
if (!isModelResource(incomingItem)) {
finalItems.push(incomingItem);
continue;
}
incomingItem.versionId = loadOriginal ? incomingItem.versionId : current.filter(isModelResource).find((r) => r.modelId === incomingItem.modelId)?.versionId;
finalItems.push(incomingItem);
}
newResourceIdString = resourceBuilder().addResources(finalItems).toString();
} else if (mode === 4 /* FederatedContext */) {
const { parseUrlParameters, ViewerModelResource, createGetParamFromResources } = SpeckleViewer.ViewerRoute;
const currentResources = parseUrlParameters(resourceIdString.value);
const newResources = parseUrlParameters(
formattedState.resources?.request?.resourceIdString ?? ""
).map((resource) => {
if (resource instanceof ViewerModelResource) {
return new ViewerModelResource(resource.modelId);
}
return resource;
});
if (newResources.length) {
const allResources = [...currentResources, ...newResources];
newResourceIdString = createGetParamFromResources(allResources);
}
}
if (newResourceIdString && newResourceIdString !== resourceIdString.value) {
await until(loading).toBe(false);
await resourceIdString.update(newResourceIdString);
await until(loading).toBe(false);
}
position.value = new Vector3(
formattedState.ui?.camera?.position?.[0],
formattedState.ui?.camera?.position?.[1],
formattedState.ui?.camera?.position?.[2]
);
target.value = new Vector3(
formattedState.ui?.camera?.target?.[0],
formattedState.ui?.camera?.target?.[1],
formattedState.ui?.camera?.target?.[2]
);
isOrthoProjection.value = !!formattedState.ui?.camera?.isOrthoProjection;
sectionBox.value = formattedState.ui?.sectionBox ? {
min: formattedState.ui.sectionBox.min || [],
max: formattedState.ui.sectionBox.max || [],
rotation: formattedState.ui.sectionBox.rotation || []
} : null;
sectionBoxContext.visible.value = false;
if (!sectionBox.value) {
sectionBoxContext.edited.value = false;
}
const filters = formattedState.ui?.filters || {};
resetFilters();
if (filters.hiddenObjectIds?.length) {
hideObjects(filters.hiddenObjectIds, { replace: true });
} else {
hideObjects([], { replace: true });
}
if (filters.propertyFilters?.length) {
restoreFilters(
filters.propertyFilters,
filters.activeColorFilterId,
filters.filterLogic
);
} else {
resetFilters();
}
if ([0 /* Spotlight */, 5 /* SavedView */].includes(mode)) {
await urlHashState.focusedThreadId.update(
formattedState.ui?.threads?.openThread?.threadId || null
);
}
const selectedObjectIds = Object.keys(filters.selectedObjectApplicationIds ?? {});
if (mode === 0 /* Spotlight */) {
highlightedObjectIds.value = selectedObjectIds;
} else {
if (selectedObjectIds.length || mode === 5 /* SavedView */) {
setSelectionFromObjectIds(selectedObjectIds);
}
}
const command = formattedState.ui?.diff?.command ? deserializeDiffCommand(formattedState.ui.diff.command) : null;
const activeDiffEnabled = !!diff.enabled.value;
if (command && command.diffs.length && formattedState.ui?.diff) {
diff.time.value = formattedState.ui.diff.time || 0.5;
diff.mode.value = formattedState.ui?.diff.mode || VisualDiffMode.COLORED;
const instruction = command.diffs[0];
await diffModelVersions(
instruction.versionA.modelId,
instruction.versionA.versionId,
instruction.versionB.versionId
);
} else if (!activeDiffEnabled || mode === 0 /* Spotlight */) {
await endDiff();
}
if (!isUndefinedOrVoid(formattedState.ui?.viewMode?.mode))
viewMode.mode.value = formattedState.ui.viewMode.mode;
if (!isUndefinedOrVoid(formattedState.ui?.viewMode?.edgesEnabled))
viewMode.edgesEnabled.value = formattedState.ui.viewMode.edgesEnabled;
if (!isUndefinedOrVoid(formattedState.ui?.viewMode?.edgesWeight))
viewMode.edgesWeight.value = formattedState.ui.viewMode.edgesWeight;
if (!isUndefinedOrVoid(formattedState.ui?.viewMode?.outlineOpacity))
viewMode.outlineOpacity.value = formattedState.ui.viewMode.outlineOpacity;
if (!isUndefinedOrVoid(formattedState.ui?.viewMode?.edgesColor))
viewMode.edgesColor.value = formattedState.ui.viewMode.edgesColor;
explodeFactor.value = formattedState.ui?.explodeFactor || 0;
lightConfig.value = {
...lightConfig.value,
...formattedState.ui?.lightConfig || {}
};
const incomingMeasurement = formattedState.ui?.measurement;
if (incomingMeasurement) {
if (!isUndefinedOrVoid(incomingMeasurement.enabled)) {
measurement.enabled.value = incomingMeasurement.enabled;
}
if (!isUndefinedOrVoid(incomingMeasurement.options)) {
measurement.options.value = {
...defaultMeasurementOptions,
...incomingMeasurement.options
};
}
if (!isUndefinedOrVoid(incomingMeasurement.measurements)) {
measurement.measurements.value = incomingMeasurement.measurements;
}
}
update();
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcmlhbGl6YXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICB1c2VJbmplY3RlZFZpZXdlclN0YXRlLFxyXG4gIHVzZVJlc2V0VWlTdGF0ZVxyXG59IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB7IGlzVW5kZWZpbmVkT3JWb2lkLCBTcGVja2xlVmlld2VyIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnXHJcbmltcG9ydCB7IFZlY3RvcjMgfSBmcm9tICd0aHJlZSdcclxuaW1wb3J0IHtcclxuICB1c2VEaWZmVXRpbGl0aWVzLFxyXG4gIHVzZVNlbGVjdGlvblV0aWxpdGllcyxcclxuICB1c2VTZWN0aW9uQm94VXRpbGl0aWVzXHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuaW1wb3J0IHsgdXNlRmlsdGVyVXRpbGl0aWVzIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2ZpbHRlcmluZy9maWx0ZXJpbmcnXHJcbmltcG9ydCB7IHVzZUZpbHRlcmluZ0RhdGFTdG9yZSB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZGF0YVN0b3JlJ1xyXG5pbXBvcnQgeyBDYW1lcmFDb250cm9sbGVyLCBTZWN0aW9uVG9vbCwgVmlzdWFsRGlmZk1vZGUgfSBmcm9tICdAc3BlY2tsZS92aWV3ZXInXHJcbmltcG9ydCB0eXBlIHtcclxuICBGaWx0ZXJMb2dpYyxcclxuICBTZXJpYWxpemVkRmlsdGVyRGF0YVxyXG59IGZyb20gJ34vbGliL3ZpZXdlci9oZWxwZXJzL2ZpbHRlcnMvdHlwZXMnXHJcbmltcG9ydCB0eXBlIHsgTWVyZ2UsIFBhcnRpYWxEZWVwIH0gZnJvbSAndHlwZS1mZXN0J1xyXG5pbXBvcnQge1xyXG4gIGRlZmF1bHRNZWFzdXJlbWVudE9wdGlvbnMsXHJcbiAgZm9ybWF0U2VyaWFsaXplZFZpZXdlclN0YXRlXHJcbn0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkL3ZpZXdlci9zdGF0ZSdcclxuaW1wb3J0IHsgdXNlVmlld2VyUmVhbHRpbWVBY3Rpdml0eVRyYWNrZXIgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvYWN0aXZpdHknXHJcbmltcG9ydCB7XHJcbiAgaXNNb2RlbFJlc291cmNlLFxyXG4gIHJlc291cmNlQnVpbGRlcixcclxuICB0eXBlIFZpZXdlclJlc291cmNlXHJcbn0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkL3ZpZXdlci9yb3V0ZSdcclxuaW1wb3J0IHsgdW50aWwgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcblxyXG50eXBlIFNlcmlhbGl6ZWRWaWV3ZXJTdGF0ZSA9IFNwZWNrbGVWaWV3ZXIuVmlld2VyU3RhdGUuU2VyaWFsaXplZFZpZXdlclN0YXRlXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXNlU3RhdGVTZXJpYWxpemF0aW9uKCkge1xyXG4gIGNvbnN0IHN0YXRlID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcbiAgY29uc3QgeyBvYmplY3RzOiBzZWxlY3RlZE9iamVjdHMgfSA9IHVzZVNlbGVjdGlvblV0aWxpdGllcygpXHJcbiAgY29uc3QgeyBzZXJpYWxpemVEaWZmQ29tbWFuZCB9ID0gdXNlRGlmZlV0aWxpdGllcygpXHJcbiAgY29uc3QgeyBmaWx0ZXJzIH0gPSB1c2VGaWx0ZXJVdGlsaXRpZXMoKVxyXG4gIGNvbnN0IGRhdGFTdG9yZSA9IHVzZUZpbHRlcmluZ0RhdGFTdG9yZSgpXHJcbiAgY29uc3QgeyBib3gzVG9TZWN0aW9uQm94RGF0YSB9ID0gdXNlU2VjdGlvbkJveFV0aWxpdGllcygpXHJcblxyXG4gIGNvbnN0IHNlcmlhbGl6ZSA9IChcclxuICAgIG9wdGlvbnM/OiBQYXJ0aWFsPHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEluc3RlYWQgb2Ygc2F2aW5nIHRoZSBjdXJyZW50IHJlc291cmNlSWRTdHJpbmcgdmFsdWUsIGJ1aWxkIGEgbW9yZSBjb25jcmV0ZSBvbmUgdGhhdCBzcGVjaWZpZXMgZXhhY3QgdmVyc2lvbiAmIG9iamVjdCBpZHMsIHNvIHRoYXQgdGhlXHJcbiAgICAgICAqIHN0cmluZyBkb2Vzbid0IHJlc29sdmUgdG8gZGlmZmVyZW50IG9iamVjdHMgaW4gdGhlIGZ1dHVyZS4gVXNlZnVsIHdoZW4gc2VyaWFsaXppbmcgc3RhdGUgZm9yIHBvc3Rlcml0eSAoZS5nLiBmb3IgbmV3IGNvbW1lbnQgdGhyZWFkcylcclxuICAgICAgICovXHJcbiAgICAgIGNvbmNyZXRlUmVzb3VyY2VJZFN0cmluZzogYm9vbGVhblxyXG4gICAgfT5cclxuICApOiBTZXJpYWxpemVkVmlld2VyU3RhdGUgPT4ge1xyXG4gICAgY29uc3QgeyBjb25jcmV0ZVJlc291cmNlSWRTdHJpbmcgfSA9IG9wdGlvbnMgfHwge31cclxuXHJcbiAgICBjb25zdCBjYW1Db250cm9scyA9IHN0YXRlLnZpZXdlci5pbnN0YW5jZS5nZXRFeHRlbnNpb24oQ2FtZXJhQ29udHJvbGxlcikuY29udHJvbHNcclxuXHJcbiAgICBjb25zdCByYXdCb3ggPSBzdGF0ZS52aWV3ZXIuaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKFNlY3Rpb25Ub29sKS5nZXRCb3goKVxyXG4gICAgY29uc3QgYm94ID0gcmF3Qm94ID8gYm94M1RvU2VjdGlvbkJveERhdGEocmF3Qm94KSA6IG51bGxcclxuXHJcbiAgICBjb25zdCByZXQ6IFNlcmlhbGl6ZWRWaWV3ZXJTdGF0ZSA9IHtcclxuICAgICAgcHJvamVjdElkOiBzdGF0ZS5wcm9qZWN0SWQudmFsdWUsXHJcbiAgICAgIHNlc3Npb25JZDogc3RhdGUuc2Vzc2lvbklkLnZhbHVlLFxyXG4gICAgICB2aWV3ZXI6IHtcclxuICAgICAgICBtZXRhZGF0YToge1xyXG4gICAgICAgICAgZmlsdGVyaW5nU3RhdGU6IHN0YXRlLnZpZXdlci5tZXRhZGF0YS5maWx0ZXJpbmdTdGF0ZS52YWx1ZVxyXG4gICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgIHBhc3NNaW46IHN0YXRlLnZpZXdlci5tZXRhZGF0YS5maWx0ZXJpbmdTdGF0ZS52YWx1ZS5wYXNzTWluLFxyXG4gICAgICAgICAgICAgICAgcGFzc01heDogc3RhdGUudmlld2VyLm1ldGFkYXRhLmZpbHRlcmluZ1N0YXRlLnZhbHVlLnBhc3NNYXhcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgcmVzb3VyY2VzOiB7XHJcbiAgICAgICAgcmVxdWVzdDoge1xyXG4gICAgICAgICAgcmVzb3VyY2VJZFN0cmluZzogY29uY3JldGVSZXNvdXJjZUlkU3RyaW5nXHJcbiAgICAgICAgICAgID8gc3RhdGUucmVzb3VyY2VzLnJlc3BvbnNlLmNvbmNyZXRlUmVzb3VyY2VJZFN0cmluZy52YWx1ZVxyXG4gICAgICAgICAgICA6IHN0YXRlLnJlc291cmNlcy5yZXF1ZXN0LnJlc291cmNlSWRTdHJpbmcudmFsdWUsXHJcbiAgICAgICAgICB0aHJlYWRGaWx0ZXJzOiB7IC4uLnN0YXRlLnJlc291cmNlcy5yZXF1ZXN0LnRocmVhZEZpbHRlcnMudmFsdWUgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgdWk6IHtcclxuICAgICAgICB0aHJlYWRzOiB7XHJcbiAgICAgICAgICBvcGVuVGhyZWFkOiB7XHJcbiAgICAgICAgICAgIHRocmVhZElkOiBzdGF0ZS51aS50aHJlYWRzLm9wZW5UaHJlYWQudGhyZWFkLnZhbHVlPy5pZCB8fCBudWxsLFxyXG4gICAgICAgICAgICBpc1R5cGluZzogc3RhdGUudWkudGhyZWFkcy5vcGVuVGhyZWFkLmlzVHlwaW5nLnZhbHVlLFxyXG4gICAgICAgICAgICBuZXdUaHJlYWRFZGl0b3I6IHN0YXRlLnVpLnRocmVhZHMub3BlblRocmVhZC5uZXdUaHJlYWRFZGl0b3IudmFsdWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGRpZmY6IHtcclxuICAgICAgICAgIGNvbW1hbmQ6IHN0YXRlLnVybEhhc2hTdGF0ZS5kaWZmLnZhbHVlXHJcbiAgICAgICAgICAgID8gc2VyaWFsaXplRGlmZkNvbW1hbmQoc3RhdGUudXJsSGFzaFN0YXRlLmRpZmYudmFsdWUpXHJcbiAgICAgICAgICAgIDogbnVsbCxcclxuICAgICAgICAgIHRpbWU6IHN0YXRlLnVpLmRpZmYudGltZS52YWx1ZSxcclxuICAgICAgICAgIG1vZGU6IHN0YXRlLnVpLmRpZmYubW9kZS52YWx1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3BvdGxpZ2h0VXNlclNlc3Npb25JZDogc3RhdGUudWkuc3BvdGxpZ2h0VXNlclNlc3Npb25JZC52YWx1ZSxcclxuICAgICAgICBmaWx0ZXJzOiAoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gQ29udmVydCBjdXJyZW50IEZpbHRlckRhdGEgdG8gc2VyaWFsaXphYmxlIGZvcm1hdFxyXG4gICAgICAgICAgY29uc3QgcHJvcGVydHlGaWx0ZXJzID0gZmlsdGVycy5wcm9wZXJ0eUZpbHRlcnMudmFsdWUubWFwKChmaWx0ZXJEYXRhKSA9PiAoe1xyXG4gICAgICAgICAgICBrZXk6IGZpbHRlckRhdGEuZmlsdGVyPy5rZXkgfHwgbnVsbCxcclxuICAgICAgICAgICAgaXNBcHBsaWVkOiBmaWx0ZXJEYXRhLmlzQXBwbGllZCxcclxuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXM6IGZpbHRlckRhdGEuc2VsZWN0ZWRWYWx1ZXMsXHJcbiAgICAgICAgICAgIGlkOiBmaWx0ZXJEYXRhLmlkLFxyXG4gICAgICAgICAgICBjb25kaXRpb246IGZpbHRlckRhdGEuY29uZGl0aW9uLFxyXG4gICAgICAgICAgICBudW1lcmljUmFuZ2U6XHJcbiAgICAgICAgICAgICAgZmlsdGVyRGF0YS50eXBlID09PSAnbnVtZXJpYycgPyBmaWx0ZXJEYXRhLm51bWVyaWNSYW5nZSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgfSkpXHJcblxyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaXNvbGF0ZWRPYmplY3RJZHM6IHN0YXRlLnVpLmZpbHRlcnMuaXNvbGF0ZWRPYmplY3RJZHMudmFsdWUsXHJcbiAgICAgICAgICAgIGhpZGRlbk9iamVjdElkczogc3RhdGUudWkuZmlsdGVycy5oaWRkZW5PYmplY3RJZHMudmFsdWUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkT2JqZWN0QXBwbGljYXRpb25JZHM6IHNlbGVjdGVkT2JqZWN0cy52YWx1ZS5yZWR1Y2UoKHJldCwgb2JqKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0W29iai5pZF0gPSBvYmouYXBwbGljYXRpb25JZCA/PyBudWxsXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJldFxyXG4gICAgICAgICAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiksXHJcbiAgICAgICAgICAgIHByb3BlcnR5RmlsdGVycyxcclxuICAgICAgICAgICAgYWN0aXZlQ29sb3JGaWx0ZXJJZDogc3RhdGUudWkuZmlsdGVycy5hY3RpdmVDb2xvckZpbHRlcklkLnZhbHVlLFxyXG4gICAgICAgICAgICBmaWx0ZXJMb2dpYzogZGF0YVN0b3JlLmN1cnJlbnRGaWx0ZXJMb2dpYy52YWx1ZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCksXHJcbiAgICAgICAgY2FtZXJhOiB7XHJcbiAgICAgICAgICBwb3NpdGlvbjogc3RhdGUudWkuY2FtZXJhLnBvc2l0aW9uLnZhbHVlLnRvQXJyYXkoKSxcclxuICAgICAgICAgIHRhcmdldDogc3RhdGUudWkuY2FtZXJhLnRhcmdldC52YWx1ZS50b0FycmF5KCksXHJcbiAgICAgICAgICBpc09ydGhvUHJvamVjdGlvbjogc3RhdGUudWkuY2FtZXJhLmlzT3J0aG9Qcm9qZWN0aW9uLnZhbHVlLFxyXG4gICAgICAgICAgem9vbTogKGdldChjYW1Db250cm9scywgJ196b29tJykgYXMgdW5rbm93biBhcyBudW1iZXIpIHx8IDEgLy8ga2luZGEgaGFja3ksIF96b29tIGlzIGEgcHJvdGVjdGVkIHByb3BcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZXdNb2RlOiB7XHJcbiAgICAgICAgICBtb2RlOiBzdGF0ZS51aS52aWV3TW9kZS5tb2RlLnZhbHVlLFxyXG4gICAgICAgICAgZWRnZXNFbmFibGVkOiBzdGF0ZS51aS52aWV3TW9kZS5lZGdlc0VuYWJsZWQudmFsdWUsXHJcbiAgICAgICAgICBlZGdlc1dlaWdodDogc3RhdGUudWkudmlld01vZGUuZWRnZXNXZWlnaHQudmFsdWUsXHJcbiAgICAgICAgICBvdXRsaW5lT3BhY2l0eTogc3RhdGUudWkudmlld01vZGUub3V0bGluZU9wYWNpdHkudmFsdWUsXHJcbiAgICAgICAgICBlZGdlc0NvbG9yOiBzdGF0ZS51aS52aWV3TW9kZS5lZGdlc0NvbG9yLnZhbHVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZWN0aW9uQm94OiBzdGF0ZS51aS5zZWN0aW9uQm94LnZhbHVlID8gYm94IDogbnVsbCxcclxuICAgICAgICBsaWdodENvbmZpZzogeyAuLi5zdGF0ZS51aS5saWdodENvbmZpZy52YWx1ZSB9LFxyXG4gICAgICAgIGV4cGxvZGVGYWN0b3I6IHN0YXRlLnVpLmV4cGxvZGVGYWN0b3IudmFsdWUsXHJcbiAgICAgICAgc2VsZWN0aW9uOiBzdGF0ZS51aS5zZWxlY3Rpb24udmFsdWU/LnRvQXJyYXkoKSB8fCBudWxsLFxyXG4gICAgICAgIG1lYXN1cmVtZW50OiB7XHJcbiAgICAgICAgICBlbmFibGVkOiBzdGF0ZS51aS5tZWFzdXJlbWVudC5lbmFibGVkLnZhbHVlLFxyXG4gICAgICAgICAgb3B0aW9uczogc3RhdGUudWkubWVhc3VyZW1lbnQub3B0aW9ucy52YWx1ZSxcclxuICAgICAgICAgIG1lYXN1cmVtZW50czogc3RhdGUudWkubWVhc3VyZW1lbnQubWVhc3VyZW1lbnRzLnZhbHVlLnNsaWNlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiByZXRcclxuICB9XHJcblxyXG4gIHJldHVybiB7IHNlcmlhbGl6ZSB9XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIFN0YXRlQXBwbHlNb2RlIHtcclxuICBTcG90bGlnaHQsXHJcbiAgVGhyZWFkT3BlbixcclxuICBUaHJlYWRGdWxsQ29udGV4dE9wZW4sXHJcbiAgUmVzZXQsXHJcbiAgRmVkZXJhdGVkQ29udGV4dCxcclxuICBTYXZlZFZpZXdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgU3RhdGVBcHBseU9wdGlvbnMgPSBNZXJnZTxcclxuICBSZWNvcmQ8U3RhdGVBcHBseU1vZGUsIG5ldmVyPixcclxuICB7XHJcbiAgICBbU3RhdGVBcHBseU1vZGUuU2F2ZWRWaWV3XTogeyBsb2FkT3JpZ2luYWw6IGJvb2xlYW4gfVxyXG4gIH1cclxuPlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUFwcGx5U2VyaWFsaXplZFN0YXRlKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHByb2plY3RJZCxcclxuICAgIHVpOiB7XHJcbiAgICAgIGNhbWVyYTogeyBwb3NpdGlvbiwgdGFyZ2V0LCBpc09ydGhvUHJvamVjdGlvbiB9LFxyXG4gICAgICBzZWN0aW9uQm94LFxyXG4gICAgICBoaWdobGlnaHRlZE9iamVjdElkcyxcclxuICAgICAgZXhwbG9kZUZhY3RvcixcclxuICAgICAgbGlnaHRDb25maWcsXHJcbiAgICAgIGRpZmYsXHJcbiAgICAgIHZpZXdNb2RlLFxyXG4gICAgICBtZWFzdXJlbWVudCxcclxuICAgICAgc2VjdGlvbkJveENvbnRleHQsXHJcbiAgICAgIGxvYWRpbmdcclxuICAgIH0sXHJcbiAgICByZXNvdXJjZXM6IHtcclxuICAgICAgcmVxdWVzdDogeyByZXNvdXJjZUlkU3RyaW5nIH1cclxuICAgIH0sXHJcbiAgICB1cmxIYXNoU3RhdGVcclxuICB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcbiAgY29uc3QgeyByZXNldEZpbHRlcnMsIGhpZGVPYmplY3RzLCByZXN0b3JlRmlsdGVycyB9ID0gdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuICBjb25zdCByZXNldFN0YXRlID0gdXNlUmVzZXRVaVN0YXRlKClcclxuICBjb25zdCB7IGRpZmZNb2RlbFZlcnNpb25zLCBkZXNlcmlhbGl6ZURpZmZDb21tYW5kLCBlbmREaWZmIH0gPSB1c2VEaWZmVXRpbGl0aWVzKClcclxuICBjb25zdCB7IHNldFNlbGVjdGlvbkZyb21PYmplY3RJZHMgfSA9IHVzZVNlbGVjdGlvblV0aWxpdGllcygpXHJcbiAgY29uc3QgeyB1cGRhdGUgfSA9IHVzZVZpZXdlclJlYWx0aW1lQWN0aXZpdHlUcmFja2VyKClcclxuXHJcbiAgcmV0dXJuIGFzeW5jIDxNb2RlIGV4dGVuZHMgU3RhdGVBcHBseU1vZGU+KFxyXG4gICAgc3RhdGU6IFBhcnRpYWxEZWVwPFNlcmlhbGl6ZWRWaWV3ZXJTdGF0ZT4sXHJcbiAgICBtb2RlOiBNb2RlLFxyXG4gICAgb3B0aW9ucz86IFN0YXRlQXBwbHlPcHRpb25zW01vZGVdXHJcbiAgKSA9PiB7XHJcbiAgICBpZiAobW9kZSA9PT0gU3RhdGVBcHBseU1vZGUuUmVzZXQpIHtcclxuICAgICAgcmVzZXRTdGF0ZSgpXHJcbiAgICAgIHVwZGF0ZSgpIC8vIFRyaWdnZXIgYWN0aXZpdHkgdXBkYXRlXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvcm1hdCB0aGUgc3RhdGUgdG8gaGFuZGxlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IChlLmcuLCBwcm9wZXJ0eUZpbHRlciAtPiBwcm9wZXJ0eUZpbHRlcnMpXHJcbiAgICBjb25zdCBmb3JtYXR0ZWRTdGF0ZSA9IGZvcm1hdFNlcmlhbGl6ZWRWaWV3ZXJTdGF0ZShzdGF0ZSlcclxuXHJcbiAgICBpZiAoZm9ybWF0dGVkU3RhdGUucHJvamVjdElkICYmIGZvcm1hdHRlZFN0YXRlLnByb2plY3RJZCAhPT0gcHJvamVjdElkLnZhbHVlKSB7XHJcbiAgICAgIGF3YWl0IHByb2plY3RJZC51cGRhdGUoZm9ybWF0dGVkU3RhdGUucHJvamVjdElkKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBsb2FkZWQgcmVzb3VyY2UgY2hhbmdlXHJcbiAgICBsZXQgbmV3UmVzb3VyY2VJZFN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXHJcbiAgICBpZiAoXHJcbiAgICAgIFtTdGF0ZUFwcGx5TW9kZS5TcG90bGlnaHQsIFN0YXRlQXBwbHlNb2RlLlRocmVhZEZ1bGxDb250ZXh0T3Blbl0uaW5jbHVkZXMobW9kZSlcclxuICAgICkge1xyXG4gICAgICBuZXdSZXNvdXJjZUlkU3RyaW5nID0gZm9ybWF0dGVkU3RhdGUucmVzb3VyY2VzPy5yZXF1ZXN0Py5yZXNvdXJjZUlkU3RyaW5nIHx8ICcnXHJcbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFN0YXRlQXBwbHlNb2RlLlNhdmVkVmlldykge1xyXG4gICAgICBjb25zdCB7IGxvYWRPcmlnaW5hbCB9ID0gb3B0aW9ucyB8fCB7fVxyXG5cclxuICAgICAgY29uc3QgY3VycmVudCA9IHJlc291cmNlQnVpbGRlcigpLmFkZFJlc291cmNlcyhyZXNvdXJjZUlkU3RyaW5nLnZhbHVlKVxyXG4gICAgICBjb25zdCBpbmNvbWluZyA9IHJlc291cmNlQnVpbGRlcigpLmFkZFJlc291cmNlcyhcclxuICAgICAgICBmb3JtYXR0ZWRTdGF0ZS5yZXNvdXJjZXM/LnJlcXVlc3Q/LnJlc291cmNlSWRTdHJpbmcgfHwgJydcclxuICAgICAgKVxyXG5cclxuICAgICAgY29uc3QgZmluYWxJdGVtczogVmlld2VyUmVzb3VyY2VbXSA9IFtdXHJcbiAgICAgIGZvciAoY29uc3QgaW5jb21pbmdJdGVtIG9mIGluY29taW5nKSB7XHJcbiAgICAgICAgaWYgKCFpc01vZGVsUmVzb3VyY2UoaW5jb21pbmdJdGVtKSkge1xyXG4gICAgICAgICAgZmluYWxJdGVtcy5wdXNoKGluY29taW5nSXRlbSlcclxuICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdmVyc2lvbklkIGJhc2VkIG9uIGxvYWRPcmlnaW5hbFxyXG4gICAgICAgIGluY29taW5nSXRlbS52ZXJzaW9uSWQgPSBsb2FkT3JpZ2luYWxcclxuICAgICAgICAgID8gaW5jb21pbmdJdGVtLnZlcnNpb25JZFxyXG4gICAgICAgICAgOiBjdXJyZW50XHJcbiAgICAgICAgICAgICAgLmZpbHRlcihpc01vZGVsUmVzb3VyY2UpXHJcbiAgICAgICAgICAgICAgLmZpbmQoKHIpID0+IHIubW9kZWxJZCA9PT0gaW5jb21pbmdJdGVtLm1vZGVsSWQpPy52ZXJzaW9uSWRcclxuICAgICAgICBmaW5hbEl0ZW1zLnB1c2goaW5jb21pbmdJdGVtKVxyXG4gICAgICB9XHJcbiAgICAgIG5ld1Jlc291cmNlSWRTdHJpbmcgPSByZXNvdXJjZUJ1aWxkZXIoKVxyXG4gICAgICAgIC5hZGRSZXNvdXJjZXMoZmluYWxJdGVtcylcclxuICAgICAgICAvLyAuYWRkTmV3KGN1cnJlbnQpIC8vIGtlZXBpbmcgb3RoZXIgZmVkZXJhdGVkIG1vZGVscyBhcm91bmRcclxuICAgICAgICAudG9TdHJpbmcoKVxyXG4gICAgfSBlbHNlIGlmIChtb2RlID09PSBTdGF0ZUFwcGx5TW9kZS5GZWRlcmF0ZWRDb250ZXh0KSB7XHJcbiAgICAgIC8vIEZvciBmZWRlcmF0ZWQgY29udGV4dCwgYXBwZW5kIG9ubHkgbW9kZWwgSURzICh3aXRob3V0IHZlcnNpb25zKSB0byBzaG93IGxhdGVzdFxyXG4gICAgICBjb25zdCB7IHBhcnNlVXJsUGFyYW1ldGVycywgVmlld2VyTW9kZWxSZXNvdXJjZSwgY3JlYXRlR2V0UGFyYW1Gcm9tUmVzb3VyY2VzIH0gPVxyXG4gICAgICAgIFNwZWNrbGVWaWV3ZXIuVmlld2VyUm91dGVcclxuXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRSZXNvdXJjZXMgPSBwYXJzZVVybFBhcmFtZXRlcnMocmVzb3VyY2VJZFN0cmluZy52YWx1ZSlcclxuICAgICAgY29uc3QgbmV3UmVzb3VyY2VzID0gcGFyc2VVcmxQYXJhbWV0ZXJzKFxyXG4gICAgICAgIGZvcm1hdHRlZFN0YXRlLnJlc291cmNlcz8ucmVxdWVzdD8ucmVzb3VyY2VJZFN0cmluZyA/PyAnJ1xyXG4gICAgICApLm1hcCgocmVzb3VyY2UpID0+IHtcclxuICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBWaWV3ZXJNb2RlbFJlc291cmNlKSB7XHJcbiAgICAgICAgICAvLyBPbmx5IGtlZXAgbW9kZWwgSUQsIGRyb3AgdmVyc2lvblxyXG4gICAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJNb2RlbFJlc291cmNlKHJlc291cmNlLm1vZGVsSWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNvdXJjZVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgaWYgKG5ld1Jlc291cmNlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBhbGxSZXNvdXJjZXMgPSBbLi4uY3VycmVudFJlc291cmNlcywgLi4ubmV3UmVzb3VyY2VzXVxyXG4gICAgICAgIG5ld1Jlc291cmNlSWRTdHJpbmcgPSBjcmVhdGVHZXRQYXJhbUZyb21SZXNvdXJjZXMoYWxsUmVzb3VyY2VzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGZpbmFsIHJlc291cmNlcyBoYXZlIGJlZW4gbG9hZGVkIGJlZm9yZSB3ZSBjb250aW51ZSBvblxyXG4gICAgLy8gd2l0aCBhcHBseWluZyB0aGUgcmVzdCBvZiB0aGUgc3RhdGVcclxuICAgIGlmIChuZXdSZXNvdXJjZUlkU3RyaW5nICYmIG5ld1Jlc291cmNlSWRTdHJpbmcgIT09IHJlc291cmNlSWRTdHJpbmcudmFsdWUpIHtcclxuICAgICAgYXdhaXQgdW50aWwobG9hZGluZykudG9CZShmYWxzZSlcclxuICAgICAgYXdhaXQgcmVzb3VyY2VJZFN0cmluZy51cGRhdGUobmV3UmVzb3VyY2VJZFN0cmluZylcclxuICAgICAgYXdhaXQgdW50aWwobG9hZGluZykudG9CZShmYWxzZSlcclxuICAgIH1cclxuXHJcbiAgICBwb3NpdGlvbi52YWx1ZSA9IG5ldyBWZWN0b3IzKFxyXG4gICAgICBmb3JtYXR0ZWRTdGF0ZS51aT8uY2FtZXJhPy5wb3NpdGlvbj8uWzBdLFxyXG4gICAgICBmb3JtYXR0ZWRTdGF0ZS51aT8uY2FtZXJhPy5wb3NpdGlvbj8uWzFdLFxyXG4gICAgICBmb3JtYXR0ZWRTdGF0ZS51aT8uY2FtZXJhPy5wb3NpdGlvbj8uWzJdXHJcbiAgICApXHJcbiAgICB0YXJnZXQudmFsdWUgPSBuZXcgVmVjdG9yMyhcclxuICAgICAgZm9ybWF0dGVkU3RhdGUudWk/LmNhbWVyYT8udGFyZ2V0Py5bMF0sXHJcbiAgICAgIGZvcm1hdHRlZFN0YXRlLnVpPy5jYW1lcmE/LnRhcmdldD8uWzFdLFxyXG4gICAgICBmb3JtYXR0ZWRTdGF0ZS51aT8uY2FtZXJhPy50YXJnZXQ/LlsyXVxyXG4gICAgKVxyXG5cclxuICAgIGlzT3J0aG9Qcm9qZWN0aW9uLnZhbHVlID0gISFmb3JtYXR0ZWRTdGF0ZS51aT8uY2FtZXJhPy5pc09ydGhvUHJvamVjdGlvblxyXG5cclxuICAgIHNlY3Rpb25Cb3gudmFsdWUgPSBmb3JtYXR0ZWRTdGF0ZS51aT8uc2VjdGlvbkJveFxyXG4gICAgICA/IHtcclxuICAgICAgICAgIG1pbjogZm9ybWF0dGVkU3RhdGUudWkuc2VjdGlvbkJveC5taW4gfHwgW10sXHJcbiAgICAgICAgICBtYXg6IGZvcm1hdHRlZFN0YXRlLnVpLnNlY3Rpb25Cb3gubWF4IHx8IFtdLFxyXG4gICAgICAgICAgcm90YXRpb246IGZvcm1hdHRlZFN0YXRlLnVpLnNlY3Rpb25Cb3gucm90YXRpb24gfHwgW11cclxuICAgICAgICB9XHJcbiAgICAgIDogbnVsbFxyXG4gICAgc2VjdGlvbkJveENvbnRleHQudmlzaWJsZS52YWx1ZSA9IGZhbHNlXHJcbiAgICBpZiAoIXNlY3Rpb25Cb3gudmFsdWUpIHtcclxuICAgICAgc2VjdGlvbkJveENvbnRleHQuZWRpdGVkLnZhbHVlID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmaWx0ZXJzID0gZm9ybWF0dGVkU3RhdGUudWk/LmZpbHRlcnMgfHwge31cclxuXHJcbiAgICByZXNldEZpbHRlcnMoKVxyXG5cclxuICAgIGlmIChmaWx0ZXJzLmhpZGRlbk9iamVjdElkcz8ubGVuZ3RoKSB7XHJcbiAgICAgIGhpZGVPYmplY3RzKGZpbHRlcnMuaGlkZGVuT2JqZWN0SWRzLCB7IHJlcGxhY2U6IHRydWUgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGhpZGVPYmplY3RzKFtdLCB7IHJlcGxhY2U6IHRydWUgfSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmlsdGVycy5wcm9wZXJ0eUZpbHRlcnM/Lmxlbmd0aCkge1xyXG4gICAgICByZXN0b3JlRmlsdGVycyhcclxuICAgICAgICBmaWx0ZXJzLnByb3BlcnR5RmlsdGVycyBhcyBTZXJpYWxpemVkRmlsdGVyRGF0YVtdLFxyXG4gICAgICAgIGZpbHRlcnMuYWN0aXZlQ29sb3JGaWx0ZXJJZCxcclxuICAgICAgICBmaWx0ZXJzLmZpbHRlckxvZ2ljIGFzIEZpbHRlckxvZ2ljXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc2V0RmlsdGVycygpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFtTdGF0ZUFwcGx5TW9kZS5TcG90bGlnaHQsIFN0YXRlQXBwbHlNb2RlLlNhdmVkVmlld10uaW5jbHVkZXMobW9kZSkpIHtcclxuICAgICAgYXdhaXQgdXJsSGFzaFN0YXRlLmZvY3VzZWRUaHJlYWRJZC51cGRhdGUoXHJcbiAgICAgICAgZm9ybWF0dGVkU3RhdGUudWk/LnRocmVhZHM/Lm9wZW5UaHJlYWQ/LnRocmVhZElkIHx8IG51bGxcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkT2JqZWN0SWRzID0gT2JqZWN0LmtleXMoZmlsdGVycy5zZWxlY3RlZE9iamVjdEFwcGxpY2F0aW9uSWRzID8/IHt9KVxyXG4gICAgaWYgKG1vZGUgPT09IFN0YXRlQXBwbHlNb2RlLlNwb3RsaWdodCkge1xyXG4gICAgICBoaWdobGlnaHRlZE9iamVjdElkcy52YWx1ZSA9IHNlbGVjdGVkT2JqZWN0SWRzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoc2VsZWN0ZWRPYmplY3RJZHMubGVuZ3RoIHx8IG1vZGUgPT09IFN0YXRlQXBwbHlNb2RlLlNhdmVkVmlldykge1xyXG4gICAgICAgIHNldFNlbGVjdGlvbkZyb21PYmplY3RJZHMoc2VsZWN0ZWRPYmplY3RJZHMpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21tYW5kID0gZm9ybWF0dGVkU3RhdGUudWk/LmRpZmY/LmNvbW1hbmRcclxuICAgICAgPyBkZXNlcmlhbGl6ZURpZmZDb21tYW5kKGZvcm1hdHRlZFN0YXRlLnVpLmRpZmYuY29tbWFuZClcclxuICAgICAgOiBudWxsXHJcbiAgICBjb25zdCBhY3RpdmVEaWZmRW5hYmxlZCA9ICEhZGlmZi5lbmFibGVkLnZhbHVlXHJcbiAgICBpZiAoY29tbWFuZCAmJiBjb21tYW5kLmRpZmZzLmxlbmd0aCAmJiBmb3JtYXR0ZWRTdGF0ZS51aT8uZGlmZikge1xyXG4gICAgICBkaWZmLnRpbWUudmFsdWUgPSBmb3JtYXR0ZWRTdGF0ZS51aS5kaWZmLnRpbWUgfHwgMC41XHJcbiAgICAgIGRpZmYubW9kZS52YWx1ZSA9IGZvcm1hdHRlZFN0YXRlLnVpPy5kaWZmLm1vZGUgfHwgVmlzdWFsRGlmZk1vZGUuQ09MT1JFRFxyXG5cclxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBjb21tYW5kLmRpZmZzWzBdXHJcbiAgICAgIGF3YWl0IGRpZmZNb2RlbFZlcnNpb25zKFxyXG4gICAgICAgIGluc3RydWN0aW9uLnZlcnNpb25BLm1vZGVsSWQsXHJcbiAgICAgICAgaW5zdHJ1Y3Rpb24udmVyc2lvbkEudmVyc2lvbklkLFxyXG4gICAgICAgIGluc3RydWN0aW9uLnZlcnNpb25CLnZlcnNpb25JZFxyXG4gICAgICApXHJcbiAgICB9IGVsc2UgaWYgKCFhY3RpdmVEaWZmRW5hYmxlZCB8fCBtb2RlID09PSBTdGF0ZUFwcGx5TW9kZS5TcG90bGlnaHQpIHtcclxuICAgICAgYXdhaXQgZW5kRGlmZigpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVzdG9yZSB2aWV3IG1vZGVcclxuICAgIGlmICghaXNVbmRlZmluZWRPclZvaWQoZm9ybWF0dGVkU3RhdGUudWk/LnZpZXdNb2RlPy5tb2RlKSlcclxuICAgICAgdmlld01vZGUubW9kZS52YWx1ZSA9IGZvcm1hdHRlZFN0YXRlLnVpIS52aWV3TW9kZSEubW9kZVxyXG4gICAgaWYgKCFpc1VuZGVmaW5lZE9yVm9pZChmb3JtYXR0ZWRTdGF0ZS51aT8udmlld01vZGU/LmVkZ2VzRW5hYmxlZCkpXHJcbiAgICAgIHZpZXdNb2RlLmVkZ2VzRW5hYmxlZC52YWx1ZSA9IGZvcm1hdHRlZFN0YXRlLnVpIS52aWV3TW9kZSEuZWRnZXNFbmFibGVkXHJcbiAgICBpZiAoIWlzVW5kZWZpbmVkT3JWb2lkKGZvcm1hdHRlZFN0YXRlLnVpPy52aWV3TW9kZT8uZWRnZXNXZWlnaHQpKVxyXG4gICAgICB2aWV3TW9kZS5lZGdlc1dlaWdodC52YWx1ZSA9IGZvcm1hdHRlZFN0YXRlLnVpIS52aWV3TW9kZSEuZWRnZXNXZWlnaHRcclxuICAgIGlmICghaXNVbmRlZmluZWRPclZvaWQoZm9ybWF0dGVkU3RhdGUudWk/LnZpZXdNb2RlPy5vdXRsaW5lT3BhY2l0eSkpXHJcbiAgICAgIHZpZXdNb2RlLm91dGxpbmVPcGFjaXR5LnZhbHVlID0gZm9ybWF0dGVkU3RhdGUudWkhLnZpZXdNb2RlIS5vdXRsaW5lT3BhY2l0eVxyXG4gICAgaWYgKCFpc1VuZGVmaW5lZE9yVm9pZChmb3JtYXR0ZWRTdGF0ZS51aT8udmlld01vZGU/LmVkZ2VzQ29sb3IpKVxyXG4gICAgICB2aWV3TW9kZS5lZGdlc0NvbG9yLnZhbHVlID0gZm9ybWF0dGVkU3RhdGUudWkhLnZpZXdNb2RlIS5lZGdlc0NvbG9yXHJcblxyXG4gICAgZXhwbG9kZUZhY3Rvci52YWx1ZSA9IGZvcm1hdHRlZFN0YXRlLnVpPy5leHBsb2RlRmFjdG9yIHx8IDBcclxuICAgIGxpZ2h0Q29uZmlnLnZhbHVlID0ge1xyXG4gICAgICAuLi5saWdodENvbmZpZy52YWx1ZSxcclxuICAgICAgLi4uKGZvcm1hdHRlZFN0YXRlLnVpPy5saWdodENvbmZpZyB8fCB7fSlcclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBtZWFzdXJlbWVudHNcclxuICAgIGNvbnN0IGluY29taW5nTWVhc3VyZW1lbnQgPSBmb3JtYXR0ZWRTdGF0ZS51aT8ubWVhc3VyZW1lbnRcclxuICAgIGlmIChpbmNvbWluZ01lYXN1cmVtZW50KSB7XHJcbiAgICAgIGlmICghaXNVbmRlZmluZWRPclZvaWQoaW5jb21pbmdNZWFzdXJlbWVudC5lbmFibGVkKSkge1xyXG4gICAgICAgIG1lYXN1cmVtZW50LmVuYWJsZWQudmFsdWUgPSBpbmNvbWluZ01lYXN1cmVtZW50LmVuYWJsZWRcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkT3JWb2lkKGluY29taW5nTWVhc3VyZW1lbnQub3B0aW9ucykpIHtcclxuICAgICAgICBtZWFzdXJlbWVudC5vcHRpb25zLnZhbHVlID0ge1xyXG4gICAgICAgICAgLi4uZGVmYXVsdE1lYXN1cmVtZW50T3B0aW9ucyxcclxuICAgICAgICAgIC4uLmluY29taW5nTWVhc3VyZW1lbnQub3B0aW9uc1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzVW5kZWZpbmVkT3JWb2lkKGluY29taW5nTWVhc3VyZW1lbnQubWVhc3VyZW1lbnRzKSkge1xyXG4gICAgICAgIG1lYXN1cmVtZW50Lm1lYXN1cmVtZW50cy52YWx1ZSA9IGluY29taW5nTWVhc3VyZW1lbnQubWVhc3VyZW1lbnRzXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUcmlnZ2VyIGFjdGl2aXR5IHVwZGF0ZVxyXG4gICAgdXBkYXRlKClcclxuICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsbUJBQW1CLHFCQUFxQjtBQUNqRCxTQUFTLFdBQVc7QUFDcEIsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsa0JBQWtCLGFBQWEsc0JBQXNCO0FBTTlEO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx3Q0FBd0M7QUFDakQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BRUs7QUFDUCxTQUFTLGFBQWE7QUFJZixnQkFBUyx3QkFBd0I7QUFDdEMsUUFBTSxRQUFRLHVCQUF1QjtBQUNyQyxRQUFNLEVBQUUsU0FBUyxnQkFBZ0IsSUFBSSxzQkFBc0I7QUFDM0QsUUFBTSxFQUFFLHFCQUFxQixJQUFJLGlCQUFpQjtBQUNsRCxRQUFNLEVBQUUsUUFBUSxJQUFJLG1CQUFtQjtBQUN2QyxRQUFNLFlBQVksc0JBQXNCO0FBQ3hDLFFBQU0sRUFBRSxxQkFBcUIsSUFBSSx1QkFBdUI7QUFFeEQsUUFBTSxZQUFZLENBQ2hCLFlBTzBCO0FBQzFCLFVBQU0sRUFBRSx5QkFBeUIsSUFBSSxXQUFXLENBQUM7QUFFakQsVUFBTSxjQUFjLE1BQU0sT0FBTyxTQUFTLGFBQWEsZ0JBQWdCLEVBQUU7QUFFekUsVUFBTSxTQUFTLE1BQU0sT0FBTyxTQUFTLGFBQWEsV0FBVyxFQUFFLE9BQU87QUFDdEUsVUFBTSxNQUFNLFNBQVMscUJBQXFCLE1BQU0sSUFBSTtBQUVwRCxVQUFNLE1BQTZCO0FBQUEsTUFDakMsV0FBVyxNQUFNLFVBQVU7QUFBQSxNQUMzQixXQUFXLE1BQU0sVUFBVTtBQUFBLE1BQzNCLFFBQVE7QUFBQSxRQUNOLFVBQVU7QUFBQSxVQUNSLGdCQUFnQixNQUFNLE9BQU8sU0FBUyxlQUFlLFFBQ2pEO0FBQUEsWUFDRSxTQUFTLE1BQU0sT0FBTyxTQUFTLGVBQWUsTUFBTTtBQUFBLFlBQ3BELFNBQVMsTUFBTSxPQUFPLFNBQVMsZUFBZSxNQUFNO0FBQUEsVUFDdEQsSUFDQTtBQUFBLFFBQ047QUFBQSxNQUNGO0FBQUEsTUFDQSxXQUFXO0FBQUEsUUFDVCxTQUFTO0FBQUEsVUFDUCxrQkFBa0IsMkJBQ2QsTUFBTSxVQUFVLFNBQVMseUJBQXlCLFFBQ2xELE1BQU0sVUFBVSxRQUFRLGlCQUFpQjtBQUFBLFVBQzdDLGVBQWUsRUFBRSxHQUFHLE1BQU0sVUFBVSxRQUFRLGNBQWMsTUFBTTtBQUFBLFFBQ2xFO0FBQUEsTUFDRjtBQUFBLE1BQ0EsSUFBSTtBQUFBLFFBQ0YsU0FBUztBQUFBLFVBQ1AsWUFBWTtBQUFBLFlBQ1YsVUFBVSxNQUFNLEdBQUcsUUFBUSxXQUFXLE9BQU8sT0FBTyxNQUFNO0FBQUEsWUFDMUQsVUFBVSxNQUFNLEdBQUcsUUFBUSxXQUFXLFNBQVM7QUFBQSxZQUMvQyxpQkFBaUIsTUFBTSxHQUFHLFFBQVEsV0FBVyxnQkFBZ0I7QUFBQSxVQUMvRDtBQUFBLFFBQ0Y7QUFBQSxRQUNBLE1BQU07QUFBQSxVQUNKLFNBQVMsTUFBTSxhQUFhLEtBQUssUUFDN0IscUJBQXFCLE1BQU0sYUFBYSxLQUFLLEtBQUssSUFDbEQ7QUFBQSxVQUNKLE1BQU0sTUFBTSxHQUFHLEtBQUssS0FBSztBQUFBLFVBQ3pCLE1BQU0sTUFBTSxHQUFHLEtBQUssS0FBSztBQUFBLFFBQzNCO0FBQUEsUUFDQSx3QkFBd0IsTUFBTSxHQUFHLHVCQUF1QjtBQUFBLFFBQ3hELFVBQVUsTUFBTTtBQUVkLGdCQUFNLGtCQUFrQixRQUFRLGdCQUFnQixNQUFNLElBQUksQ0FBQyxnQkFBZ0I7QUFBQSxZQUN6RSxLQUFLLFdBQVcsUUFBUSxPQUFPO0FBQUEsWUFDL0IsV0FBVyxXQUFXO0FBQUEsWUFDdEIsZ0JBQWdCLFdBQVc7QUFBQSxZQUMzQixJQUFJLFdBQVc7QUFBQSxZQUNmLFdBQVcsV0FBVztBQUFBLFlBQ3RCLGNBQ0UsV0FBVyxTQUFTLFlBQVksV0FBVyxlQUFlO0FBQUEsVUFDOUQsRUFBRTtBQUVGLGlCQUFPO0FBQUEsWUFDTCxtQkFBbUIsTUFBTSxHQUFHLFFBQVEsa0JBQWtCO0FBQUEsWUFDdEQsaUJBQWlCLE1BQU0sR0FBRyxRQUFRLGdCQUFnQjtBQUFBLFlBQ2xELDhCQUE4QixnQkFBZ0IsTUFBTSxPQUFPLENBQUNBLE1BQUssUUFBUTtBQUN2RSxjQUFBQSxLQUFJLElBQUksRUFBRSxJQUFJLElBQUksaUJBQWlCO0FBQ25DLHFCQUFPQTtBQUFBLFlBQ1QsR0FBRyxDQUFDLENBQWtDO0FBQUEsWUFDdEM7QUFBQSxZQUNBLHFCQUFxQixNQUFNLEdBQUcsUUFBUSxvQkFBb0I7QUFBQSxZQUMxRCxhQUFhLFVBQVUsbUJBQW1CO0FBQUEsVUFDNUM7QUFBQSxRQUNGLEdBQUc7QUFBQSxRQUNILFFBQVE7QUFBQSxVQUNOLFVBQVUsTUFBTSxHQUFHLE9BQU8sU0FBUyxNQUFNLFFBQVE7QUFBQSxVQUNqRCxRQUFRLE1BQU0sR0FBRyxPQUFPLE9BQU8sTUFBTSxRQUFRO0FBQUEsVUFDN0MsbUJBQW1CLE1BQU0sR0FBRyxPQUFPLGtCQUFrQjtBQUFBLFVBQ3JELE1BQU8sSUFBSSxhQUFhLE9BQU8sS0FBMkI7QUFBQTtBQUFBLFFBQzVEO0FBQUEsUUFDQSxVQUFVO0FBQUEsVUFDUixNQUFNLE1BQU0sR0FBRyxTQUFTLEtBQUs7QUFBQSxVQUM3QixjQUFjLE1BQU0sR0FBRyxTQUFTLGFBQWE7QUFBQSxVQUM3QyxhQUFhLE1BQU0sR0FBRyxTQUFTLFlBQVk7QUFBQSxVQUMzQyxnQkFBZ0IsTUFBTSxHQUFHLFNBQVMsZUFBZTtBQUFBLFVBQ2pELFlBQVksTUFBTSxHQUFHLFNBQVMsV0FBVztBQUFBLFFBQzNDO0FBQUEsUUFDQSxZQUFZLE1BQU0sR0FBRyxXQUFXLFFBQVEsTUFBTTtBQUFBLFFBQzlDLGFBQWEsRUFBRSxHQUFHLE1BQU0sR0FBRyxZQUFZLE1BQU07QUFBQSxRQUM3QyxlQUFlLE1BQU0sR0FBRyxjQUFjO0FBQUEsUUFDdEMsV0FBVyxNQUFNLEdBQUcsVUFBVSxPQUFPLFFBQVEsS0FBSztBQUFBLFFBQ2xELGFBQWE7QUFBQSxVQUNYLFNBQVMsTUFBTSxHQUFHLFlBQVksUUFBUTtBQUFBLFVBQ3RDLFNBQVMsTUFBTSxHQUFHLFlBQVksUUFBUTtBQUFBLFVBQ3RDLGNBQWMsTUFBTSxHQUFHLFlBQVksYUFBYSxNQUFNLE1BQU07QUFBQSxRQUM5RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLEVBQUUsVUFBVTtBQUNyQjtBQUVPLFdBQUssaUJBQUwsa0JBQUtDLG9CQUFMO0FBQ0wsRUFBQUEsZ0NBQUE7QUFDQSxFQUFBQSxnQ0FBQTtBQUNBLEVBQUFBLGdDQUFBO0FBQ0EsRUFBQUEsZ0NBQUE7QUFDQSxFQUFBQSxnQ0FBQTtBQUNBLEVBQUFBLGdDQUFBO0FBTlUsU0FBQUE7QUFBQSxHQUFBO0FBZ0JMLGdCQUFTLDBCQUEwQjtBQUN4QyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsSUFBSTtBQUFBLE1BQ0YsUUFBUSxFQUFFLFVBQVUsUUFBUSxrQkFBa0I7QUFBQSxNQUM5QztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsV0FBVztBQUFBLE1BQ1QsU0FBUyxFQUFFLGlCQUFpQjtBQUFBLElBQzlCO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSSx1QkFBdUI7QUFDM0IsUUFBTSxFQUFFLGNBQWMsYUFBYSxlQUFlLElBQUksbUJBQW1CO0FBQ3pFLFFBQU0sYUFBYSxnQkFBZ0I7QUFDbkMsUUFBTSxFQUFFLG1CQUFtQix3QkFBd0IsUUFBUSxJQUFJLGlCQUFpQjtBQUNoRixRQUFNLEVBQUUsMEJBQTBCLElBQUksc0JBQXNCO0FBQzVELFFBQU0sRUFBRSxPQUFPLElBQUksaUNBQWlDO0FBRXBELFNBQU8sT0FDTCxPQUNBLE1BQ0EsWUFDRztBQUNILFFBQUksU0FBUyxlQUFzQjtBQUNqQyxpQkFBVztBQUNYLGFBQU87QUFDUDtBQUFBLElBQ0Y7QUFHQSxVQUFNLGlCQUFpQiw0QkFBNEIsS0FBSztBQUV4RCxRQUFJLGVBQWUsYUFBYSxlQUFlLGNBQWMsVUFBVSxPQUFPO0FBQzVFLFlBQU0sVUFBVSxPQUFPLGVBQWUsU0FBUztBQUFBLElBQ2pEO0FBR0EsUUFBSSxzQkFBMEM7QUFDOUMsUUFDRSxDQUFDLG1CQUEwQiw2QkFBb0MsRUFBRSxTQUFTLElBQUksR0FDOUU7QUFDQSw0QkFBc0IsZUFBZSxXQUFXLFNBQVMsb0JBQW9CO0FBQUEsSUFDL0UsV0FBVyxTQUFTLG1CQUEwQjtBQUM1QyxZQUFNLEVBQUUsYUFBYSxJQUFJLFdBQVcsQ0FBQztBQUVyQyxZQUFNLFVBQVUsZ0JBQWdCLEVBQUUsYUFBYSxpQkFBaUIsS0FBSztBQUNyRSxZQUFNLFdBQVcsZ0JBQWdCLEVBQUU7QUFBQSxRQUNqQyxlQUFlLFdBQVcsU0FBUyxvQkFBb0I7QUFBQSxNQUN6RDtBQUVBLFlBQU0sYUFBK0IsQ0FBQztBQUN0QyxpQkFBVyxnQkFBZ0IsVUFBVTtBQUNuQyxZQUFJLENBQUMsZ0JBQWdCLFlBQVksR0FBRztBQUNsQyxxQkFBVyxLQUFLLFlBQVk7QUFDNUI7QUFBQSxRQUNGO0FBR0EscUJBQWEsWUFBWSxlQUNyQixhQUFhLFlBQ2IsUUFDRyxPQUFPLGVBQWUsRUFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxZQUFZLGFBQWEsT0FBTyxHQUFHO0FBQ3hELG1CQUFXLEtBQUssWUFBWTtBQUFBLE1BQzlCO0FBQ0EsNEJBQXNCLGdCQUFnQixFQUNuQyxhQUFhLFVBQVUsRUFFdkIsU0FBUztBQUFBLElBQ2QsV0FBVyxTQUFTLDBCQUFpQztBQUVuRCxZQUFNLEVBQUUsb0JBQW9CLHFCQUFxQiw0QkFBNEIsSUFDM0UsY0FBYztBQUVoQixZQUFNLG1CQUFtQixtQkFBbUIsaUJBQWlCLEtBQUs7QUFDbEUsWUFBTSxlQUFlO0FBQUEsUUFDbkIsZUFBZSxXQUFXLFNBQVMsb0JBQW9CO0FBQUEsTUFDekQsRUFBRSxJQUFJLENBQUMsYUFBYTtBQUNsQixZQUFJLG9CQUFvQixxQkFBcUI7QUFFM0MsaUJBQU8sSUFBSSxvQkFBb0IsU0FBUyxPQUFPO0FBQUEsUUFDakQ7QUFDQSxlQUFPO0FBQUEsTUFDVCxDQUFDO0FBRUQsVUFBSSxhQUFhLFFBQVE7QUFDdkIsY0FBTSxlQUFlLENBQUMsR0FBRyxrQkFBa0IsR0FBRyxZQUFZO0FBQzFELDhCQUFzQiw0QkFBNEIsWUFBWTtBQUFBLE1BQ2hFO0FBQUEsSUFDRjtBQUlBLFFBQUksdUJBQXVCLHdCQUF3QixpQkFBaUIsT0FBTztBQUN6RSxZQUFNLE1BQU0sT0FBTyxFQUFFLEtBQUssS0FBSztBQUMvQixZQUFNLGlCQUFpQixPQUFPLG1CQUFtQjtBQUNqRCxZQUFNLE1BQU0sT0FBTyxFQUFFLEtBQUssS0FBSztBQUFBLElBQ2pDO0FBRUEsYUFBUyxRQUFRLElBQUk7QUFBQSxNQUNuQixlQUFlLElBQUksUUFBUSxXQUFXLENBQUM7QUFBQSxNQUN2QyxlQUFlLElBQUksUUFBUSxXQUFXLENBQUM7QUFBQSxNQUN2QyxlQUFlLElBQUksUUFBUSxXQUFXLENBQUM7QUFBQSxJQUN6QztBQUNBLFdBQU8sUUFBUSxJQUFJO0FBQUEsTUFDakIsZUFBZSxJQUFJLFFBQVEsU0FBUyxDQUFDO0FBQUEsTUFDckMsZUFBZSxJQUFJLFFBQVEsU0FBUyxDQUFDO0FBQUEsTUFDckMsZUFBZSxJQUFJLFFBQVEsU0FBUyxDQUFDO0FBQUEsSUFDdkM7QUFFQSxzQkFBa0IsUUFBUSxDQUFDLENBQUMsZUFBZSxJQUFJLFFBQVE7QUFFdkQsZUFBVyxRQUFRLGVBQWUsSUFBSSxhQUNsQztBQUFBLE1BQ0UsS0FBSyxlQUFlLEdBQUcsV0FBVyxPQUFPLENBQUM7QUFBQSxNQUMxQyxLQUFLLGVBQWUsR0FBRyxXQUFXLE9BQU8sQ0FBQztBQUFBLE1BQzFDLFVBQVUsZUFBZSxHQUFHLFdBQVcsWUFBWSxDQUFDO0FBQUEsSUFDdEQsSUFDQTtBQUNKLHNCQUFrQixRQUFRLFFBQVE7QUFDbEMsUUFBSSxDQUFDLFdBQVcsT0FBTztBQUNyQix3QkFBa0IsT0FBTyxRQUFRO0FBQUEsSUFDbkM7QUFFQSxVQUFNLFVBQVUsZUFBZSxJQUFJLFdBQVcsQ0FBQztBQUUvQyxpQkFBYTtBQUViLFFBQUksUUFBUSxpQkFBaUIsUUFBUTtBQUNuQyxrQkFBWSxRQUFRLGlCQUFpQixFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDeEQsT0FBTztBQUNMLGtCQUFZLENBQUMsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFDbkM7QUFFQSxRQUFJLFFBQVEsaUJBQWlCLFFBQVE7QUFDbkM7QUFBQSxRQUNFLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxNQUNWO0FBQUEsSUFDRixPQUFPO0FBQ0wsbUJBQWE7QUFBQSxJQUNmO0FBRUEsUUFBSSxDQUFDLG1CQUEwQixpQkFBd0IsRUFBRSxTQUFTLElBQUksR0FBRztBQUN2RSxZQUFNLGFBQWEsZ0JBQWdCO0FBQUEsUUFDakMsZUFBZSxJQUFJLFNBQVMsWUFBWSxZQUFZO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxvQkFBb0IsT0FBTyxLQUFLLFFBQVEsZ0NBQWdDLENBQUMsQ0FBQztBQUNoRixRQUFJLFNBQVMsbUJBQTBCO0FBQ3JDLDJCQUFxQixRQUFRO0FBQUEsSUFDL0IsT0FBTztBQUNMLFVBQUksa0JBQWtCLFVBQVUsU0FBUyxtQkFBMEI7QUFDakUsa0NBQTBCLGlCQUFpQjtBQUFBLE1BQzdDO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBVSxlQUFlLElBQUksTUFBTSxVQUNyQyx1QkFBdUIsZUFBZSxHQUFHLEtBQUssT0FBTyxJQUNyRDtBQUNKLFVBQU0sb0JBQW9CLENBQUMsQ0FBQyxLQUFLLFFBQVE7QUFDekMsUUFBSSxXQUFXLFFBQVEsTUFBTSxVQUFVLGVBQWUsSUFBSSxNQUFNO0FBQzlELFdBQUssS0FBSyxRQUFRLGVBQWUsR0FBRyxLQUFLLFFBQVE7QUFDakQsV0FBSyxLQUFLLFFBQVEsZUFBZSxJQUFJLEtBQUssUUFBUSxlQUFlO0FBRWpFLFlBQU0sY0FBYyxRQUFRLE1BQU0sQ0FBQztBQUNuQyxZQUFNO0FBQUEsUUFDSixZQUFZLFNBQVM7QUFBQSxRQUNyQixZQUFZLFNBQVM7QUFBQSxRQUNyQixZQUFZLFNBQVM7QUFBQSxNQUN2QjtBQUFBLElBQ0YsV0FBVyxDQUFDLHFCQUFxQixTQUFTLG1CQUEwQjtBQUNsRSxZQUFNLFFBQVE7QUFBQSxJQUNoQjtBQUdBLFFBQUksQ0FBQyxrQkFBa0IsZUFBZSxJQUFJLFVBQVUsSUFBSTtBQUN0RCxlQUFTLEtBQUssUUFBUSxlQUFlLEdBQUksU0FBVTtBQUNyRCxRQUFJLENBQUMsa0JBQWtCLGVBQWUsSUFBSSxVQUFVLFlBQVk7QUFDOUQsZUFBUyxhQUFhLFFBQVEsZUFBZSxHQUFJLFNBQVU7QUFDN0QsUUFBSSxDQUFDLGtCQUFrQixlQUFlLElBQUksVUFBVSxXQUFXO0FBQzdELGVBQVMsWUFBWSxRQUFRLGVBQWUsR0FBSSxTQUFVO0FBQzVELFFBQUksQ0FBQyxrQkFBa0IsZUFBZSxJQUFJLFVBQVUsY0FBYztBQUNoRSxlQUFTLGVBQWUsUUFBUSxlQUFlLEdBQUksU0FBVTtBQUMvRCxRQUFJLENBQUMsa0JBQWtCLGVBQWUsSUFBSSxVQUFVLFVBQVU7QUFDNUQsZUFBUyxXQUFXLFFBQVEsZUFBZSxHQUFJLFNBQVU7QUFFM0Qsa0JBQWMsUUFBUSxlQUFlLElBQUksaUJBQWlCO0FBQzFELGdCQUFZLFFBQVE7QUFBQSxNQUNsQixHQUFHLFlBQVk7QUFBQSxNQUNmLEdBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQztBQUFBLElBQ3pDO0FBR0EsVUFBTSxzQkFBc0IsZUFBZSxJQUFJO0FBQy9DLFFBQUkscUJBQXFCO0FBQ3ZCLFVBQUksQ0FBQyxrQkFBa0Isb0JBQW9CLE9BQU8sR0FBRztBQUNuRCxvQkFBWSxRQUFRLFFBQVEsb0JBQW9CO0FBQUEsTUFDbEQ7QUFDQSxVQUFJLENBQUMsa0JBQWtCLG9CQUFvQixPQUFPLEdBQUc7QUFDbkQsb0JBQVksUUFBUSxRQUFRO0FBQUEsVUFDMUIsR0FBRztBQUFBLFVBQ0gsR0FBRyxvQkFBb0I7QUFBQSxRQUN6QjtBQUFBLE1BQ0Y7QUFDQSxVQUFJLENBQUMsa0JBQWtCLG9CQUFvQixZQUFZLEdBQUc7QUFDeEQsb0JBQVksYUFBYSxRQUFRLG9CQUFvQjtBQUFBLE1BQ3ZEO0FBQUEsSUFDRjtBQUdBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7IiwibmFtZXMiOlsicmV0IiwiU3RhdGVBcHBseU1vZGUiXX0=