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

328 lines
30 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/compare-changes/Panel.vue");import { FormButton as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/compare-changes/Version.vue";
import { FormRange as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/compare-changes/ObjectGroup.vue";
import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/layout/SidePanel.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createVNode as __createVNode,createElementVNode as __createElementVNode,createBlock as __createBlock } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"
function _interopVNode(vnode) {
if (vnode && vnode.props && 'data-v-inspector' in vnode.props) {
const data = vnode.props['data-v-inspector']
delete vnode.props['data-v-inspector']
Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false })
}
return vnode
}
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
/* Injection by vite-plugin-vue-inspector End */
import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { ChevronLeft } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { VisualDiffMode } from "/_nuxt/@fs/D:/speckle-server/packages/viewer/dist/index.js";
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { uniqBy, debounce } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { TIME_MS } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { FormSwitch } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerCompareChangesPanel",
props: {
clearOnBack: { type: Boolean, required: false, default: true }
},
emits: ["close"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
const props = __props;
const emit = __emit;
const {
ui: { diff: diffState },
urlHashState: { diff }
} = useInjectedViewerState();
const localDiffTime = ref(diffState.time.value);
const isColoredModeEnabled = computed(() => {
return diffState.mode.value === VisualDiffMode.COLORED;
});
watch(
localDiffTime,
(newVal) => {
diffState.time.value = newVal;
debouncedTrackChangeDiffTime();
},
{ immediate: false }
);
const debouncedTrackChangeDiffTime = debounce(() => {
mp.track("Viewer Action", {
type: "action",
name: "diffs",
action: "set-diff-time",
value: localDiffTime.value
});
}, TIME_MS.second);
watch(diffState.result, () => {
localDiffTime.value = 0.5;
if (diffState.result.value) {
mp.track("Viewer Action", {
type: "stats",
name: "diffs",
size: {
changed: diffState.result.value.modified.length,
removed: diffState.result.value.removed.length,
added: diffState.result.value.added.length,
unchanged: diffState.result.value.unchanged.length
}
});
}
});
function swapDiffMode() {
if (diffState.mode.value === VisualDiffMode.COLORED) {
diffState.mode.value = VisualDiffMode.PLAIN;
mp.track("Viewer Action", {
type: "action",
name: "diffs",
action: "set-mode-plain"
});
return;
}
mp.track("Viewer Action", {
type: "action",
name: "diffs",
action: "set-mode-colored"
});
diffState.mode.value = VisualDiffMode.COLORED;
}
const added = computed(() => {
const mapped = diffState.result.value?.added.map(
(node) => node.model.raw
);
return uniqBy(mapped, (node) => node.id);
});
const addedIds = computed(() => added.value.map((o) => o.id));
const removed = computed(() => {
const mapped = diffState.result.value?.removed.map(
(node) => node.model.raw
);
return uniqBy(mapped, (node) => node.id);
});
const removedIds = computed(() => removed.value.map((o) => o.id));
const unchanged = computed(() => {
const mapped = diffState.result.value?.unchanged.map(
(node) => node.model.raw
);
return uniqBy(mapped, (node) => node.id);
});
const unchangedIds = computed(() => unchanged.value.map((o) => o.id));
const modified = computed(() => {
const mapped = diffState.result.value?.modified.map((tuple) => {
return [tuple[0].model.raw, tuple[1].model.raw];
});
return uniqBy(mapped, (tuple) => tuple[0].id);
});
const modifiedIds = computed(() => {
return [
...modified.value.map((t) => t[0].id),
...modified.value.map((t) => t[1].id)
];
});
const mp = useMixpanel();
const handleBack = async () => {
if (props.clearOnBack) {
mp.track("Viewer Action", {
type: "action",
name: "diffs",
action: "disable"
});
await diff.update(null);
} else {
emit("close");
}
};
const __returned__ = { props, emit, diffState, diff, localDiffTime, isColoredModeEnabled, debouncedTrackChangeDiffTime, swapDiffMode, added, addedIds, removed, removedIds, unchanged, unchangedIds, modified, modifiedIds, mp, handleBack, get ChevronLeft() {
return ChevronLeft;
}, get FormSwitch() {
return FormSwitch;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, createCommentVNode as _createCommentVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "flex items-center gap-x-1",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:4:7"
};
const _hoisted_2 = {
class: "flex flex-col text-sm p-2",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:18:5"
};
const _hoisted_3 = {
class: "flex space-x-2",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:24:7"
};
const _hoisted_4 = {
class: "grow w-1/2",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:25:9"
};
const _hoisted_5 = {
class: "grow w-1/2",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:33:9"
};
const _hoisted_6 = {
class: "border-y border-outline-3 py-3 mt-4",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:42:7"
};
const _hoisted_7 = {
class: "flex items-center justify-between w-full px-1 border-b border-outline-3 py-3 mb-4",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:53:7"
};
const _hoisted_8 = {
class: "flex flex-col gap-2",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:64:7"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_FormButton = __nuxt_component_0;
const _component_ViewerCompareChangesVersion = __nuxt_component_1;
const _component_FormRange = __nuxt_component_2;
const _component_ViewerCompareChangesObjectGroup = __nuxt_component_3;
const _component_ViewerLayoutSidePanel = __nuxt_component_4;
return _openBlock(), _createBlock(_component_ViewerLayoutSidePanel, { "data-v-inspector": "components/viewer/compare-changes/Panel.vue:2:3" }, {
title: _withCtx(() => [
_createElementVNode("div", _hoisted_1, [
_createVNode(_component_FormButton, {
"icon-left": $setup.ChevronLeft,
color: "subtle",
class: "-ml-3",
"hide-text": "",
size: "sm",
onClick: $setup.handleBack,
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:5:9"
}, {
default: _withCtx(() => [..._cache[3] || (_cache[3] = [
_createTextVNode(
" Go back ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["icon-left"]),
_cache[4] || (_cache[4] = _createTextVNode(
" Version changes ",
-1
/* CACHED */
))
])
]),
default: _withCtx(() => [
_createElementVNode("div", _hoisted_2, [
_cache[6] || (_cache[6] = _createElementVNode(
"div",
{
class: "text-body-2xs bg-foundation-2 text-foreground p-1 rounded mb-2 text-center",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:19:7"
},
" This is an experimental feature. ",
-1
/* CACHED */
)),
_createElementVNode("div", _hoisted_3, [
_createElementVNode("div", _hoisted_4, [
$setup.diffState.newVersion.value ? (_openBlock(), _createBlock(_component_ViewerCompareChangesVersion, {
key: 0,
version: $setup.diffState.newVersion.value,
"is-newest": true,
onClick: _cache[0] || (_cache[0] = ($event) => $setup.localDiffTime = 0),
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:26:11"
}, null, 8, ["version"])) : _createCommentVNode("v-if", true)
]),
_createElementVNode("div", _hoisted_5, [
$setup.diffState.oldVersion.value ? (_openBlock(), _createBlock(_component_ViewerCompareChangesVersion, {
key: 0,
version: $setup.diffState.oldVersion.value,
"is-newest": false,
onClick: _cache[1] || (_cache[1] = ($event) => $setup.localDiffTime = 1),
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:34:11"
}, null, 8, ["version"])) : _createCommentVNode("v-if", true)
])
]),
_createElementVNode("div", _hoisted_6, [
_createVNode(_component_FormRange, {
modelValue: $setup.localDiffTime,
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $setup.localDiffTime = $event),
label: "Diff time",
"hide-header": "",
min: 0,
max: 1,
step: 0.01,
name: "diffTime",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:43:9"
}, null, 8, ["modelValue"])
]),
_createElementVNode("div", _hoisted_7, [
_cache[5] || (_cache[5] = _createElementVNode(
"span",
{
class: "text-body-2xs text-left",
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:56:9"
},
"Color objects by status",
-1
/* CACHED */
)),
_createVNode($setup["FormSwitch"], {
"model-value": $setup.isColoredModeEnabled,
"show-label": false,
name: "color-objects-by-status",
"onUpdate:modelValue": $setup.swapDiffMode,
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:57:9"
}, null, 8, ["model-value"])
]),
_createElementVNode("div", _hoisted_8, [
_createVNode(_component_ViewerCompareChangesObjectGroup, {
name: "unchanged",
"object-ids": $setup.unchangedIds,
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:65:9"
}, null, 8, ["object-ids"]),
_createVNode(_component_ViewerCompareChangesObjectGroup, {
name: "modified",
"object-ids": $setup.modifiedIds,
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:66:9"
}, null, 8, ["object-ids"]),
_createVNode(_component_ViewerCompareChangesObjectGroup, {
name: "added",
"object-ids": $setup.addedIds,
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:67:9"
}, null, 8, ["object-ids"]),
_createVNode(_component_ViewerCompareChangesObjectGroup, {
name: "removed",
"object-ids": $setup.removedIds,
"data-v-inspector": "components/viewer/compare-changes/Panel.vue:68:9"
}, null, 8, ["object-ids"])
])
])
]),
_: 1
/* STABLE */
});
}
_sfc_main.__hmrId = "74e59403";
typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main);
import.meta.hot.on("file-changed", ({ file }) => {
__VUE_HMR_RUNTIME__.CHANGED_FILE = file;
});
import.meta.hot.accept((mod) => {
if (!mod) return;
const { default: updated, _rerender_only } = mod;
if (_rerender_only) {
__VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render);
} else {
__VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated);
}
});
import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper";
export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/compare-changes/Panel.vue"]]);
//# sourceMappingURL=data:application/json;base64,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U0FBSyxzQ0FBRSx1QkFBYTtBQUFBLGNBQU0sb0JBQWlCO0FBQUE7OztRQUlsRCxvQkFVTSxPQVZOLFlBVU07QUFBQSxVQVRKLGFBUUU7QUFBQSx3QkFQUztBQUFBLGdHQUFhO0FBQUEsWUFDdEIsT0FBTTtBQUFBLFlBQ047QUFBQSxZQUNDLEtBQUs7QUFBQSxZQUNMLEtBQUs7QUFBQSxZQUNMLE1BQU07QUFBQSxZQUNQLE1BQUs7QUFBQSxZQUFXLG9CQUFpQjtBQUFBOztRQUdyQyxvQkFVTSxPQVZOLFlBVU07QUFBQSxvQ0FQSjtBQUFBLFlBQXdJO0FBQUE7QUFBQSxjQUFsSSxPQUFNO0FBQUEsY0FBMEIsb0JBQWlCO0FBQUE7WUFBbUQ7QUFBQSxZQUF1QjtBQUFBO0FBQUE7QUFBQSxVQUNqSSxhQUtFO0FBQUEsWUFKQyxlQUFhO0FBQUEsWUFDYixjQUFZO0FBQUEsWUFDYixNQUFLO0FBQUEsWUFDSix1QkFBb0I7QUFBQSxZQUFjLG9CQUFpQjtBQUFBOztRQUd4RCxvQkFLTSxPQUxOLFlBS007QUFBQSxVQUpKLGFBQW1KO0FBQUEsWUFBbEgsTUFBSztBQUFBLFlBQWEsY0FBWTtBQUFBLFlBQWMsb0JBQWlCO0FBQUE7VUFDOUYsYUFBaUo7QUFBQSxZQUFoSCxNQUFLO0FBQUEsWUFBWSxjQUFZO0FBQUEsWUFBYSxvQkFBaUI7QUFBQTtVQUM1RixhQUEySTtBQUFBLFlBQTFHLE1BQUs7QUFBQSxZQUFTLGNBQVk7QUFBQSxZQUFVLG9CQUFpQjtBQUFBO1VBQ3RGLGFBQStJO0FBQUEsWUFBOUcsTUFBSztBQUFBLFlBQVcsY0FBWTtBQUFBLFlBQVksb0JBQWlCO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlBhbmVsLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPFZpZXdlckxheW91dFNpZGVQYW5lbCBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tcGFyZS1jaGFuZ2VzL1BhbmVsLnZ1ZToyOjNcIj5cclxuICAgIDx0ZW1wbGF0ZSAjdGl0bGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6NDo3XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJDaGV2cm9uTGVmdFwiXHJcbiAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICBjbGFzcz1cIi1tbC0zXCJcclxuICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgIEBjbGljaz1cImhhbmRsZUJhY2tcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tcGFyZS1jaGFuZ2VzL1BhbmVsLnZ1ZTo1OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIEdvIGJhY2tcclxuICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgVmVyc2lvbiBjaGFuZ2VzXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC90ZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHRleHQtc20gcC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6MTg6NVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIGJnLWZvdW5kYXRpb24tMiB0ZXh0LWZvcmVncm91bmQgcC0xIHJvdW5kZWQgbWItMiB0ZXh0LWNlbnRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjE5OjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjI0OjdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdyB3LTEvMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjI1OjlcIj5cclxuICAgICAgICAgIDxWaWV3ZXJDb21wYXJlQ2hhbmdlc1ZlcnNpb25cclxuICAgICAgICAgICAgdi1pZj1cImRpZmZTdGF0ZS5uZXdWZXJzaW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgOnZlcnNpb249XCJkaWZmU3RhdGUubmV3VmVyc2lvbi52YWx1ZVwiXHJcbiAgICAgICAgICAgIDppcy1uZXdlc3Q9XCJ0cnVlXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwibG9jYWxEaWZmVGltZSA9IDBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tcGFyZS1jaGFuZ2VzL1BhbmVsLnZ1ZToyNjoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJncm93IHctMS8yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6MzM6OVwiPlxyXG4gICAgICAgICAgPFZpZXdlckNvbXBhcmVDaGFuZ2VzVmVyc2lvblxyXG4gICAgICAgICAgICB2LWlmPVwiZGlmZlN0YXRlLm9sZFZlcnNpb24udmFsdWVcIlxyXG4gICAgICAgICAgICA6dmVyc2lvbj1cImRpZmZTdGF0ZS5vbGRWZXJzaW9uLnZhbHVlXCJcclxuICAgICAgICAgICAgOmlzLW5ld2VzdD1cImZhbHNlXCJcclxuICAgICAgICAgICAgQGNsaWNrPVwibG9jYWxEaWZmVGltZSA9IDFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tcGFyZS1jaGFuZ2VzL1BhbmVsLnZ1ZTozNDoxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci15IGJvcmRlci1vdXRsaW5lLTMgcHktMyBtdC00XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6NDI6N1wiPlxyXG4gICAgICAgIDxGb3JtUmFuZ2VcclxuICAgICAgICAgIHYtbW9kZWw9XCJsb2NhbERpZmZUaW1lXCJcclxuICAgICAgICAgIGxhYmVsPVwiRGlmZiB0aW1lXCJcclxuICAgICAgICAgIGhpZGUtaGVhZGVyXHJcbiAgICAgICAgICA6bWluPVwiMFwiXHJcbiAgICAgICAgICA6bWF4PVwiMVwiXHJcbiAgICAgICAgICA6c3RlcD1cIjAuMDFcIlxyXG4gICAgICAgICAgbmFtZT1cImRpZmZUaW1lXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6NDM6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiB3LWZ1bGwgcHgtMSBib3JkZXItYiBib3JkZXItb3V0bGluZS0zIHB5LTMgbWItNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjUzOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIHRleHQtbGVmdFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjU2OjlcIj5Db2xvciBvYmplY3RzIGJ5IHN0YXR1czwvc3Bhbj5cclxuICAgICAgICA8Rm9ybVN3aXRjaFxyXG4gICAgICAgICAgOm1vZGVsLXZhbHVlPVwiaXNDb2xvcmVkTW9kZUVuYWJsZWRcIlxyXG4gICAgICAgICAgOnNob3ctbGFiZWw9XCJmYWxzZVwiXHJcbiAgICAgICAgICBuYW1lPVwiY29sb3Itb2JqZWN0cy1ieS1zdGF0dXNcIlxyXG4gICAgICAgICAgQHVwZGF0ZTptb2RlbC12YWx1ZT1cInN3YXBEaWZmTW9kZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjU3OjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjY0OjdcIj5cclxuICAgICAgICA8Vmlld2VyQ29tcGFyZUNoYW5nZXNPYmplY3RHcm91cCBuYW1lPVwidW5jaGFuZ2VkXCIgOm9iamVjdC1pZHM9XCJ1bmNoYW5nZWRJZHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tcGFyZS1jaGFuZ2VzL1BhbmVsLnZ1ZTo2NTo5XCIgLz5cclxuICAgICAgICA8Vmlld2VyQ29tcGFyZUNoYW5nZXNPYmplY3RHcm91cCBuYW1lPVwibW9kaWZpZWRcIiA6b2JqZWN0LWlkcz1cIm1vZGlmaWVkSWRzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6NjY6OVwiIC8+XHJcbiAgICAgICAgPFZpZXdlckNvbXBhcmVDaGFuZ2VzT2JqZWN0R3JvdXAgbmFtZT1cImFkZGVkXCIgOm9iamVjdC1pZHM9XCJhZGRlZElkc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21wYXJlLWNoYW5nZXMvUGFuZWwudnVlOjY3OjlcIiAvPlxyXG4gICAgICAgIDxWaWV3ZXJDb21wYXJlQ2hhbmdlc09iamVjdEdyb3VwIG5hbWU9XCJyZW1vdmVkXCIgOm9iamVjdC1pZHM9XCJyZW1vdmVkSWRzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbXBhcmUtY2hhbmdlcy9QYW5lbC52dWU6Njg6OVwiIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9WaWV3ZXJMYXlvdXRTaWRlUGFuZWw+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IENoZXZyb25MZWZ0IH0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5pbXBvcnQgeyBWaXN1YWxEaWZmTW9kZSB9IGZyb20gJ0BzcGVja2xlL3ZpZXdlcidcclxuaW1wb3J0IHsgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB7IHVuaXFCeSwgZGVib3VuY2UgfSBmcm9tICdsb2Rhc2gtZXMnXHJcbmltcG9ydCB0eXBlIHsgU3BlY2tsZU9iamVjdCB9IGZyb20gJ35+L2xpYi92aWV3ZXIvaGVscGVycy9zY2VuZUV4cGxvcmVyJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5pbXBvcnQgeyBUSU1FX01TIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyBGb3JtU3dpdGNoIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuXHJcbmNvbnN0IHByb3BzID0gd2l0aERlZmF1bHRzKFxyXG4gIGRlZmluZVByb3BzPHtcclxuICAgIGNsZWFyT25CYWNrPzogYm9vbGVhblxyXG4gIH0+KCksXHJcbiAge1xyXG4gICAgY2xlYXJPbkJhY2s6IHRydWVcclxuICB9XHJcbilcclxuXHJcbmNvbnN0IGVtaXQgPSBkZWZpbmVFbWl0czx7XHJcbiAgKGU6ICdjbG9zZScpOiB2b2lkXHJcbn0+KClcclxuXHJcbmNvbnN0IHtcclxuICB1aTogeyBkaWZmOiBkaWZmU3RhdGUgfSxcclxuICB1cmxIYXNoU3RhdGU6IHsgZGlmZiB9XHJcbn0gPSB1c2VJbmplY3RlZFZpZXdlclN0YXRlKClcclxuXHJcbmNvbnN0IGxvY2FsRGlmZlRpbWUgPSByZWYoZGlmZlN0YXRlLnRpbWUudmFsdWUpXHJcblxyXG5jb25zdCBpc0NvbG9yZWRNb2RlRW5hYmxlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gZGlmZlN0YXRlLm1vZGUudmFsdWUgPT09IFZpc3VhbERpZmZNb2RlLkNPTE9SRURcclxufSlcclxuXHJcbndhdGNoKFxyXG4gIGxvY2FsRGlmZlRpbWUsXHJcbiAgKG5ld1ZhbCkgPT4ge1xyXG4gICAgZGlmZlN0YXRlLnRpbWUudmFsdWUgPSBuZXdWYWxcclxuICAgIGRlYm91bmNlZFRyYWNrQ2hhbmdlRGlmZlRpbWUoKVxyXG4gIH0sXHJcbiAgeyBpbW1lZGlhdGU6IGZhbHNlIH1cclxuKVxyXG5cclxuY29uc3QgZGVib3VuY2VkVHJhY2tDaGFuZ2VEaWZmVGltZSA9IGRlYm91bmNlKCgpID0+IHtcclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ2RpZmZzJyxcclxuICAgIGFjdGlvbjogJ3NldC1kaWZmLXRpbWUnLFxyXG4gICAgdmFsdWU6IGxvY2FsRGlmZlRpbWUudmFsdWVcclxuICB9KVxyXG59LCBUSU1FX01TLnNlY29uZClcclxuXHJcbndhdGNoKGRpZmZTdGF0ZS5yZXN1bHQsICgpID0+IHtcclxuICBsb2NhbERpZmZUaW1lLnZhbHVlID0gMC41XHJcbiAgaWYgKGRpZmZTdGF0ZS5yZXN1bHQudmFsdWUpIHtcclxuICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnc3RhdHMnLFxyXG4gICAgICBuYW1lOiAnZGlmZnMnLFxyXG4gICAgICBzaXplOiB7XHJcbiAgICAgICAgY2hhbmdlZDogZGlmZlN0YXRlLnJlc3VsdC52YWx1ZS5tb2RpZmllZC5sZW5ndGgsXHJcbiAgICAgICAgcmVtb3ZlZDogZGlmZlN0YXRlLnJlc3VsdC52YWx1ZS5yZW1vdmVkLmxlbmd0aCxcclxuICAgICAgICBhZGRlZDogZGlmZlN0YXRlLnJlc3VsdC52YWx1ZS5hZGRlZC5sZW5ndGgsXHJcbiAgICAgICAgdW5jaGFuZ2VkOiBkaWZmU3RhdGUucmVzdWx0LnZhbHVlLnVuY2hhbmdlZC5sZW5ndGhcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbn0pXHJcblxyXG5mdW5jdGlvbiBzd2FwRGlmZk1vZGUoKSB7XHJcbiAgaWYgKGRpZmZTdGF0ZS5tb2RlLnZhbHVlID09PSBWaXN1YWxEaWZmTW9kZS5DT0xPUkVEKSB7XHJcbiAgICBkaWZmU3RhdGUubW9kZS52YWx1ZSA9IFZpc3VhbERpZmZNb2RlLlBMQUlOXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdkaWZmcycsXHJcbiAgICAgIGFjdGlvbjogJ3NldC1tb2RlLXBsYWluJ1xyXG4gICAgfSlcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ2RpZmZzJyxcclxuICAgIGFjdGlvbjogJ3NldC1tb2RlLWNvbG9yZWQnXHJcbiAgfSlcclxuICBkaWZmU3RhdGUubW9kZS52YWx1ZSA9IFZpc3VhbERpZmZNb2RlLkNPTE9SRURcclxufVxyXG5cclxuLy8gTk9URTogZGVkdXBpbmcgd2lsbCBub3QgYmUgbmVlZGVkIGFueW1vcmVcclxuY29uc3QgYWRkZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbWFwcGVkID0gZGlmZlN0YXRlLnJlc3VsdC52YWx1ZT8uYWRkZWQubWFwKFxyXG4gICAgKG5vZGUpID0+IG5vZGUubW9kZWwucmF3IGFzIFNwZWNrbGVPYmplY3RcclxuICApXHJcbiAgcmV0dXJuIHVuaXFCeShtYXBwZWQsIChub2RlKSA9PiBub2RlLmlkKVxyXG59KVxyXG5jb25zdCBhZGRlZElkcyA9IGNvbXB1dGVkKCgpID0+IGFkZGVkLnZhbHVlLm1hcCgobykgPT4gby5pZCBhcyBzdHJpbmcpKVxyXG5cclxuY29uc3QgcmVtb3ZlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBtYXBwZWQgPSBkaWZmU3RhdGUucmVzdWx0LnZhbHVlPy5yZW1vdmVkLm1hcChcclxuICAgIChub2RlKSA9PiBub2RlLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0XHJcbiAgKVxyXG4gIHJldHVybiB1bmlxQnkobWFwcGVkLCAobm9kZSkgPT4gbm9kZS5pZClcclxufSlcclxuY29uc3QgcmVtb3ZlZElkcyA9IGNvbXB1dGVkKCgpID0+IHJlbW92ZWQudmFsdWUubWFwKChvKSA9PiBvLmlkIGFzIHN0cmluZykpXHJcblxyXG5jb25zdCB1bmNoYW5nZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgbWFwcGVkID0gZGlmZlN0YXRlLnJlc3VsdC52YWx1ZT8udW5jaGFuZ2VkLm1hcChcclxuICAgIChub2RlKSA9PiBub2RlLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0XHJcbiAgKVxyXG4gIHJldHVybiB1bmlxQnkobWFwcGVkLCAobm9kZSkgPT4gbm9kZS5pZClcclxufSlcclxuY29uc3QgdW5jaGFuZ2VkSWRzID0gY29tcHV0ZWQoKCkgPT4gdW5jaGFuZ2VkLnZhbHVlLm1hcCgobykgPT4gby5pZCBhcyBzdHJpbmcpKVxyXG5jb25zdCBtb2RpZmllZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBtYXBwZWQgPSBkaWZmU3RhdGUucmVzdWx0LnZhbHVlPy5tb2RpZmllZC5tYXAoKHR1cGxlKSA9PiB7XHJcbiAgICByZXR1cm4gW3R1cGxlWzBdLm1vZGVsLnJhdyBhcyBTcGVja2xlT2JqZWN0LCB0dXBsZVsxXS5tb2RlbC5yYXcgYXMgU3BlY2tsZU9iamVjdF1cclxuICB9KVxyXG4gIHJldHVybiB1bmlxQnkobWFwcGVkLCAodHVwbGUpID0+IHR1cGxlWzBdLmlkKVxyXG59KVxyXG5jb25zdCBtb2RpZmllZElkcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICByZXR1cm4gW1xyXG4gICAgLi4ubW9kaWZpZWQudmFsdWUubWFwKCh0KSA9PiB0WzBdLmlkIGFzIHN0cmluZyksXHJcbiAgICAuLi5tb2RpZmllZC52YWx1ZS5tYXAoKHQpID0+IHRbMV0uaWQgYXMgc3RyaW5nKVxyXG4gIF1cclxufSlcclxuXHJcbmNvbnN0IG1wID0gdXNlTWl4cGFuZWwoKVxyXG5cclxuY29uc3QgaGFuZGxlQmFjayA9IGFzeW5jICgpID0+IHtcclxuICBpZiAocHJvcHMuY2xlYXJPbkJhY2spIHtcclxuICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgICAgbmFtZTogJ2RpZmZzJyxcclxuICAgICAgYWN0aW9uOiAnZGlzYWJsZSdcclxuICAgIH0pXHJcbiAgICBhd2FpdCBkaWZmLnVwZGF0ZShudWxsKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBlbWl0KCdjbG9zZScpXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvY29tcGFyZS1jaGFuZ2VzL1BhbmVsLnZ1ZSJ9