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

423 lines
41 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/filters/Panel.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/filters/LogicSelector.vue";
import { default as __nuxt_component_1 } from "/_nuxt/components/viewer/filters/filter/Card.vue";
import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/filters/filter/EmptyState.vue";
import { default as __nuxt_component_3 } from "/_nuxt/components/viewer/filters/property-selection/Panel.vue";
import { default as __nuxt_component_4 } from "/_nuxt/components/viewer/filters/LargePropertyWarningDialog.vue";
import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/layout/SidePanel.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createBlock as __createBlock,createVNode as __createVNode,createElementVNode as __createElementVNode,createElementBlock as __createElementBlock } 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 _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...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 { useInjectedViewerInterfaceState } from "/_nuxt/lib/viewer/composables/setup.ts";
import { FilterType } from "/_nuxt/lib/viewer/helpers/filters/types.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { X, Plus } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
import { FormButton } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
import { onKeyStroke, onClickOutside } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29";
import { useFilteredObjectsCount } from "/_nuxt/lib/viewer/composables/filtering/counts.ts";
import { ref, computed, watch, nextTick } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ViewerFiltersPanel",
setup(__props, { expose: __expose }) {
__expose();
const {
filters: { propertyFilters },
getPropertyOptionsFromDataStore,
addActiveFilter,
updateFilterProperty,
resetFilters,
isLargeProperty
} = useFilterUtilities();
const { filteredObjectsCount } = useFilteredObjectsCount();
const mp = useMixpanel();
const {
filters: { hasAnyFiltersApplied }
} = useInjectedViewerInterfaceState();
const showPropertySelection = ref(false);
const propertySelectionRef = ref();
const swappingFilterId = ref(null);
const filtersContainerRef = ref();
const shouldScrollToNewFilter = ref(false);
const showLargePropertyWarning = ref(false);
const pendingProperty = ref(null);
const propertySelectOptions = computed(() => {
if (!showPropertySelection.value) {
return [];
}
const existingFilterKeys = new Set(
propertyFilters.value.map((f) => f.filter?.key).filter(Boolean)
);
const relevantFilters = getPropertyOptionsFromDataStore();
const allOptions = relevantFilters.filter((filter) => !existingFilterKeys.has(filter.key)).map((filter) => {
const lastDotIndex = filter.key.lastIndexOf(".");
let propertyName = lastDotIndex === -1 ? filter.key : filter.key.slice(lastDotIndex + 1);
let parentPath = lastDotIndex === -1 ? "" : filter.key.slice(0, lastDotIndex).replace(/\./g, " ");
if (propertyName === "value" && lastDotIndex !== -1) {
const valueParentPath = filter.key.slice(0, lastDotIndex);
const valueParentLastDot = valueParentPath.lastIndexOf(".");
propertyName = valueParentLastDot === -1 ? valueParentPath : valueParentPath.slice(valueParentLastDot + 1);
parentPath = valueParentLastDot === -1 ? "" : valueParentPath.slice(0, valueParentLastDot).replace(/\./g, " ");
}
return {
value: filter.key,
label: propertyName,
parentPath,
type: filter.type === "number" ? FilterType.Numeric : filter.type === "boolean" ? FilterType.Boolean : FilterType.String,
hasParent: parentPath !== ""
};
});
const sortedOptions = allOptions.sort((a, b) => {
if (a.hasParent !== b.hasParent) {
return a.hasParent ? 1 : -1;
}
if (a.hasParent && b.hasParent) {
const parentComparison = a.parentPath.localeCompare(b.parentPath);
if (parentComparison !== 0) return parentComparison;
}
return a.label.localeCompare(b.label);
});
return sortedOptions;
});
const addNewEmptyFilter = () => {
swappingFilterId.value = null;
showPropertySelection.value = true;
mp.track("Viewer Action", {
type: "action",
name: "filters",
action: "open-property-selection"
});
};
const startPropertySwap = (filterId) => {
swappingFilterId.value = filterId;
showPropertySelection.value = true;
mp.track("Viewer Action", {
type: "action",
name: "filters",
action: "open-property-swap"
});
};
const handleAddFilterClick = () => {
if (showPropertySelection.value) {
showPropertySelection.value = false;
} else {
addNewEmptyFilter();
}
};
const scrollToNewFilter = () => {
if (filtersContainerRef.value) {
filtersContainerRef.value.scrollTo({
top: filtersContainerRef.value.scrollHeight,
behavior: "smooth"
});
}
};
const selectProperty = async (propertyKey) => {
const relevantFilters = getPropertyOptionsFromDataStore();
const property = relevantFilters.find((p) => p.key === propertyKey);
if (!property) {
return;
}
const { isLarge, count } = isLargeProperty(property.key);
if (isLarge) {
pendingProperty.value = { property, count };
showLargePropertyWarning.value = true;
return;
}
processPropertySelection(property, propertyKey);
};
const processPropertySelection = (property, propertyKey) => {
if (swappingFilterId.value) {
updateFilterProperty(swappingFilterId.value, property);
mp.track("Viewer Action", {
type: "action",
name: "filters",
action: "swap-filter-property",
value: propertyKey
});
} else {
shouldScrollToNewFilter.value = true;
addActiveFilter(property);
mp.track("Viewer Action", {
type: "action",
name: "filters",
action: "add-new-filter",
value: propertyKey
});
}
showPropertySelection.value = false;
swappingFilterId.value = null;
};
const confirmLargePropertySelection = () => {
if (!pendingProperty.value) return;
processPropertySelection(
pendingProperty.value.property,
pendingProperty.value.property.key
);
pendingProperty.value = null;
};
onKeyStroke("Escape", () => {
if (showLargePropertyWarning.value) {
showLargePropertyWarning.value = false;
showPropertySelection.value = false;
swappingFilterId.value = null;
pendingProperty.value = null;
} else if (showPropertySelection.value) {
showPropertySelection.value = false;
}
});
onClickOutside(propertySelectionRef, () => {
if (showPropertySelection.value) {
showPropertySelection.value = false;
swappingFilterId.value = null;
}
});
watch(
() => propertyFilters.value.length,
(newLength, oldLength) => {
if (shouldScrollToNewFilter.value && newLength > oldLength) {
nextTick(() => {
scrollToNewFilter();
shouldScrollToNewFilter.value = false;
});
}
}
);
const __returned__ = { propertyFilters, getPropertyOptionsFromDataStore, addActiveFilter, updateFilterProperty, resetFilters, isLargeProperty, filteredObjectsCount, mp, hasAnyFiltersApplied, showPropertySelection, propertySelectionRef, swappingFilterId, filtersContainerRef, shouldScrollToNewFilter, showLargePropertyWarning, pendingProperty, propertySelectOptions, addNewEmptyFilter, startPropertySwap, handleAddFilterClick, scrollToNewFilter, selectProperty, processPropertySelection, confirmLargePropertySelection, get X() {
return X;
}, get Plus() {
return Plus;
}, get FormButton() {
return FormButton;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createTextVNode as _createTextVNode, withCtx as _withCtx, openBlock as _openBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, resolveDirective as _resolveDirective, withDirectives as _withDirectives, resolveComponent as _resolveComponent, toDisplayString as _toDisplayString, renderList as _renderList, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "flex gap-x-0.5 items-center",
"data-v-inspector": "components/viewer/filters/Panel.vue:5:7"
};
const _hoisted_2 = {
class: "flex items-center justify-between pr-0.5",
"data-v-inspector": "components/viewer/filters/Panel.vue:26:5"
};
const _hoisted_3 = {
key: 1,
class: "flex items-center pr-4 text-body-3xs text-foreground-2 select-none",
"data-v-inspector": "components/viewer/filters/Panel.vue:29:7"
};
const _hoisted_4 = { "data-v-inspector": "components/viewer/filters/Panel.vue:33:9" };
const _hoisted_5 = {
class: "flex flex-col h-full justify-center select-none group/panel",
"data-v-inspector": "components/viewer/filters/Panel.vue:38:5"
};
const _hoisted_6 = {
key: 0,
ref: "filtersContainerRef",
class: "flex-1 overflow-y-auto simple-scrollbar",
"data-v-inspector": "components/viewer/filters/Panel.vue:39:7"
};
const _hoisted_7 = {
class: "flex flex-col gap-1 p-2 py-0",
"data-v-inspector": "components/viewer/filters/Panel.vue:44:9"
};
const _hoisted_8 = {
class: "px-2 pb-6 mt-1 h-14",
"data-v-inspector": "components/viewer/filters/Panel.vue:53:9"
};
const _hoisted_9 = {
ref: "propertySelectionRef",
class: "h-full",
"data-v-inspector": "components/viewer/filters/Panel.vue:72:7"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_ViewerFiltersLogicSelector = __nuxt_component_0;
const _component_ViewerFiltersFilterCard = __nuxt_component_1;
const _component_ViewerFiltersFilterEmptyState = __nuxt_component_2;
const _component_ViewerFiltersPropertySelectionPanel = __nuxt_component_3;
const _component_Portal = _resolveComponent("Portal");
const _component_ViewerFiltersLargePropertyWarningDialog = __nuxt_component_4;
const _component_ViewerLayoutSidePanel = __nuxt_component_5;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createBlock(_component_ViewerLayoutSidePanel, {
"max-height-class": "max-h-[calc(100dvh-5rem)]",
"disable-scrollbar": "",
"data-v-inspector": "components/viewer/filters/Panel.vue:2:3"
}, {
title: _withCtx(() => [..._cache[2] || (_cache[2] = [
_createTextVNode(
"Filters",
-1
/* CACHED */
)
])]),
actions: _withCtx(() => [
_createElementVNode("div", _hoisted_1, [
$setup.hasAnyFiltersApplied ? (_openBlock(), _createBlock($setup["FormButton"], {
key: 0,
size: "sm",
color: "subtle",
tabindex: "-1",
onClick: _cache[0] || (_cache[0] = ($event) => $setup.resetFilters()),
"data-v-inspector": "components/viewer/filters/Panel.vue:6:9"
}, {
default: _withCtx(() => [..._cache[3] || (_cache[3] = [
_createTextVNode(
" Reset ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true),
_withDirectives(_createVNode($setup["FormButton"], {
color: "subtle",
size: "sm",
class: _normalizeClass($setup.showPropertySelection ? "!bg-highlight-3 !pointer-events-none" : ""),
"hide-text": "",
"icon-left": $setup.showPropertySelection ? $setup.X : $setup.Plus,
onClick: $setup.handleAddFilterClick,
"data-v-inspector": "components/viewer/filters/Panel.vue:15:9"
}, null, 8, ["class", "icon-left"]), [
[_directive_tippy, $setup.showPropertySelection ? void 0 : "Add new filter"]
])
])
]),
default: _withCtx(() => [
_createElementVNode("div", _hoisted_2, [
$setup.propertyFilters.length > 0 ? (_openBlock(), _createBlock(_component_ViewerFiltersLogicSelector, {
key: 0,
"data-v-inspector": "components/viewer/filters/Panel.vue:27:7"
})) : _createCommentVNode("v-if", true),
$setup.propertyFilters.length > 0 ? (_openBlock(), _createElementBlock("div", _hoisted_3, [
_createElementVNode(
"span",
_hoisted_4,
_toDisplayString($setup.filteredObjectsCount) + " result" + _toDisplayString($setup.filteredObjectsCount === 1 ? "" : "s"),
1
/* TEXT */
)
])) : _createCommentVNode("v-if", true)
]),
_createElementVNode("div", _hoisted_5, [
$setup.propertyFilters.length > 0 ? (_openBlock(), _createElementBlock(
"div",
_hoisted_6,
[
_createElementVNode("div", _hoisted_7, [
(_openBlock(true), _createElementBlock(
_Fragment,
null,
_renderList($setup.propertyFilters, (filter) => {
return _openBlock(), _createBlock(_component_ViewerFiltersFilterCard, {
key: filter.id,
filter,
collapsed: "",
onSwapProperty: $setup.startPropertySwap,
"data-v-inspector": "components/viewer/filters/Panel.vue:45:11"
}, null, 8, ["filter"]);
}),
128
/* KEYED_FRAGMENT */
))
]),
_createElementVNode("div", _hoisted_8, [
$setup.propertyFilters.length > 0 ? (_openBlock(), _createBlock($setup["FormButton"], {
key: 0,
"full-width": "",
color: "outline",
class: "rounded-xl text-foreground-2 hover:text-foreground !shadow-none",
"icon-left": $setup.Plus,
"hide-text": "",
onClick: $setup.addNewEmptyFilter,
"data-v-inspector": "components/viewer/filters/Panel.vue:54:11"
}, {
default: _withCtx(() => [..._cache[4] || (_cache[4] = [
_createTextVNode(
" Add filter ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["icon-left"])) : _createCommentVNode("v-if", true)
])
],
512
/* NEED_PATCH */
)) : (_openBlock(), _createBlock(_component_ViewerFiltersFilterEmptyState, {
key: 1,
onAddFilter: $setup.addNewEmptyFilter,
"data-v-inspector": "components/viewer/filters/Panel.vue:68:7"
}))
]),
$setup.showPropertySelection ? (_openBlock(), _createBlock(_component_Portal, {
key: 0,
to: "panel-extension",
"data-v-inspector": "components/viewer/filters/Panel.vue:71:5"
}, {
default: _withCtx(() => [
_createElementVNode(
"div",
_hoisted_9,
[
_createVNode(_component_ViewerFiltersPropertySelectionPanel, {
options: $setup.propertySelectOptions,
onSelectProperty: $setup.selectProperty,
"data-v-inspector": "components/viewer/filters/Panel.vue:73:9"
}, null, 8, ["options"])
],
512
/* NEED_PATCH */
)
]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true),
_createVNode(_component_ViewerFiltersLargePropertyWarningDialog, {
open: $setup.showLargePropertyWarning,
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showLargePropertyWarning = $event),
count: $setup.pendingProperty?.count,
onConfirm: $setup.confirmLargePropertySelection,
"data-v-inspector": "components/viewer/filters/Panel.vue:80:5"
}, null, 8, ["open", "count"])
]),
_: 1
/* STABLE */
});
}
_sfc_main.__hmrId = "618b7277";
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/filters/Panel.vue"]]);
//# sourceMappingURL=data:application/json;base64,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O0FBQUEsVUFMTjtBQUFBLFlBS007QUFBQSxZQUxOO0FBQUEsWUFLTTtBQUFBLGNBSkosYUFHRTtBQUFBLGdCQUZDLFNBQVM7QUFBQSxnQkFDVCxrQkFBaUI7QUFBQSxnQkFBZ0Isb0JBQWlCO0FBQUE7Ozs7Ozs7OztNQUt6RCxhQUlFO0FBQUEsUUFIUSxNQUFNO0FBQUEsaUdBQXdCO0FBQUEsUUFDckMsT0FBTyx3QkFBaUI7QUFBQSxRQUN4QixXQUFTO0FBQUEsUUFBK0Isb0JBQWlCO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlBhbmVsLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPFZpZXdlckxheW91dFNpZGVQYW5lbCBtYXgtaGVpZ2h0LWNsYXNzPVwibWF4LWgtW2NhbGMoMTAwZHZoLTVyZW0pXVwiIGRpc2FibGUtc2Nyb2xsYmFyIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToyOjNcIj5cclxuICAgIDx0ZW1wbGF0ZSAjdGl0bGU+RmlsdGVyczwvdGVtcGxhdGU+XHJcbiAgICA8dGVtcGxhdGUgI2FjdGlvbnM+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC14LTAuNSBpdGVtcy1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6NTo3XCI+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHYtaWY9XCJoYXNBbnlGaWx0ZXJzQXBwbGllZFwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJyZXNldEZpbHRlcnMoKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo2OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIFJlc2V0XHJcbiAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICB2LXRpcHB5PVwic2hvd1Byb3BlcnR5U2VsZWN0aW9uID8gdW5kZWZpbmVkIDogJ0FkZCBuZXcgZmlsdGVyJ1wiXHJcbiAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgOmNsYXNzPVwic2hvd1Byb3BlcnR5U2VsZWN0aW9uID8gJyFiZy1oaWdobGlnaHQtMyAhcG9pbnRlci1ldmVudHMtbm9uZScgOiAnJ1wiXHJcbiAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJzaG93UHJvcGVydHlTZWxlY3Rpb24gPyBYIDogUGx1c1wiXHJcbiAgICAgICAgICBAY2xpY2s9XCJoYW5kbGVBZGRGaWx0ZXJDbGlja1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToxNTo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvdGVtcGxhdGU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHByLTAuNVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToyNjo1XCI+XHJcbiAgICAgIDxWaWV3ZXJGaWx0ZXJzTG9naWNTZWxlY3RvciB2LWlmPVwicHJvcGVydHlGaWx0ZXJzLmxlbmd0aCA+IDBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6Mjc6N1wiIC8+XHJcblxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cInByb3BlcnR5RmlsdGVycy5sZW5ndGggPiAwXCJcclxuICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHByLTQgdGV4dC1ib2R5LTN4cyB0ZXh0LWZvcmVncm91bmQtMiBzZWxlY3Qtbm9uZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZToyOTo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxzcGFuIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTozMzo5XCI+XHJcbiAgICAgICAgICB7eyBmaWx0ZXJlZE9iamVjdHNDb3VudCB9fSByZXN1bHR7eyBmaWx0ZXJlZE9iamVjdHNDb3VudCA9PT0gMSA/ICcnIDogJ3MnIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaC1mdWxsIGp1c3RpZnktY2VudGVyIHNlbGVjdC1ub25lIGdyb3VwL3BhbmVsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2ZpbHRlcnMvUGFuZWwudnVlOjM4OjVcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJwcm9wZXJ0eUZpbHRlcnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgcmVmPVwiZmlsdGVyc0NvbnRhaW5lclJlZlwiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHNpbXBsZS1zY3JvbGxiYXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6Mzk6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBwLTIgcHktMFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo0NDo5XCI+XHJcbiAgICAgICAgICA8Vmlld2VyRmlsdGVyc0ZpbHRlckNhcmRcclxuICAgICAgICAgICAgdi1mb3I9XCJmaWx0ZXIgaW4gcHJvcGVydHlGaWx0ZXJzXCJcclxuICAgICAgICAgICAgOmtleT1cImZpbHRlci5pZFwiXHJcbiAgICAgICAgICAgIDpmaWx0ZXI9XCJmaWx0ZXJcIlxyXG4gICAgICAgICAgICBjb2xsYXBzZWRcclxuICAgICAgICAgICAgQHN3YXAtcHJvcGVydHk9XCJzdGFydFByb3BlcnR5U3dhcFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo0NToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJweC0yIHBiLTYgbXQtMSBoLTE0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2ZpbHRlcnMvUGFuZWwudnVlOjUzOjlcIj5cclxuICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgIHYtaWY9XCJwcm9wZXJ0eUZpbHRlcnMubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgIGZ1bGwtd2lkdGhcclxuICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXhsIHRleHQtZm9yZWdyb3VuZC0yIGhvdmVyOnRleHQtZm9yZWdyb3VuZCAhc2hhZG93LW5vbmVcIlxyXG4gICAgICAgICAgICA6aWNvbi1sZWZ0PVwiUGx1c1wiXHJcbiAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICBAY2xpY2s9XCJhZGROZXdFbXB0eUZpbHRlclwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo1NDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIEFkZCBmaWx0ZXJcclxuICAgICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8Vmlld2VyRmlsdGVyc0ZpbHRlckVtcHR5U3RhdGUgdi1lbHNlIEBhZGQtZmlsdGVyPVwiYWRkTmV3RW1wdHlGaWx0ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6Njg6N1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8UG9ydGFsIHYtaWY9XCJzaG93UHJvcGVydHlTZWxlY3Rpb25cIiB0bz1cInBhbmVsLWV4dGVuc2lvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo3MTo1XCI+XHJcbiAgICAgIDxkaXYgcmVmPVwicHJvcGVydHlTZWxlY3Rpb25SZWZcIiBjbGFzcz1cImgtZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZTo3Mjo3XCI+XHJcbiAgICAgICAgPFZpZXdlckZpbHRlcnNQcm9wZXJ0eVNlbGVjdGlvblBhbmVsXHJcbiAgICAgICAgICA6b3B0aW9ucz1cInByb3BlcnR5U2VsZWN0T3B0aW9uc1wiXHJcbiAgICAgICAgICBAc2VsZWN0LXByb3BlcnR5PVwic2VsZWN0UHJvcGVydHlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvZmlsdGVycy9QYW5lbC52dWU6NzM6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L1BvcnRhbD5cclxuXHJcbiAgICA8Vmlld2VyRmlsdGVyc0xhcmdlUHJvcGVydHlXYXJuaW5nRGlhbG9nXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dMYXJnZVByb3BlcnR5V2FybmluZ1wiXHJcbiAgICAgIDpjb3VudD1cInBlbmRpbmdQcm9wZXJ0eT8uY291bnRcIlxyXG4gICAgICBAY29uZmlybT1cImNvbmZpcm1MYXJnZVByb3BlcnR5U2VsZWN0aW9uXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2ZpbHRlcnMvUGFuZWwudnVlOjgwOjVcIlxyXG4gICAgLz5cclxuICA8L1ZpZXdlckxheW91dFNpZGVQYW5lbD5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VySW50ZXJmYWNlU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgUHJvcGVydHlTZWxlY3RPcHRpb24sXHJcbiAgRXh0ZW5kZWRQcm9wZXJ0eUluZm9cclxufSBmcm9tICd+L2xpYi92aWV3ZXIvaGVscGVycy9maWx0ZXJzL3R5cGVzJ1xyXG5pbXBvcnQgeyBGaWx0ZXJUeXBlIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvZmlsdGVycy90eXBlcydcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgWCwgUGx1cyB9IGZyb20gJ2x1Y2lkZS12dWUtbmV4dCdcclxuaW1wb3J0IHsgRm9ybUJ1dHRvbiB9IGZyb20gJ0BzcGVja2xlL3VpLWNvbXBvbmVudHMnXHJcbmltcG9ydCB7IHVzZUZpbHRlclV0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZmlsdGVyaW5nJ1xyXG5pbXBvcnQgeyBvbktleVN0cm9rZSwgb25DbGlja091dHNpZGUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IHVzZUZpbHRlcmVkT2JqZWN0c0NvdW50IH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2ZpbHRlcmluZy9jb3VudHMnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcblxyXG5jb25zdCB7XHJcbiAgZmlsdGVyczogeyBwcm9wZXJ0eUZpbHRlcnMgfSxcclxuICBnZXRQcm9wZXJ0eU9wdGlvbnNGcm9tRGF0YVN0b3JlLFxyXG4gIGFkZEFjdGl2ZUZpbHRlcixcclxuICB1cGRhdGVGaWx0ZXJQcm9wZXJ0eSxcclxuICByZXNldEZpbHRlcnMsXHJcbiAgaXNMYXJnZVByb3BlcnR5XHJcbn0gPSB1c2VGaWx0ZXJVdGlsaXRpZXMoKVxyXG5cclxuY29uc3QgeyBmaWx0ZXJlZE9iamVjdHNDb3VudCB9ID0gdXNlRmlsdGVyZWRPYmplY3RzQ291bnQoKVxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3Qge1xyXG4gIGZpbHRlcnM6IHsgaGFzQW55RmlsdGVyc0FwcGxpZWQgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcblxyXG5jb25zdCBzaG93UHJvcGVydHlTZWxlY3Rpb24gPSByZWYoZmFsc2UpXHJcbmNvbnN0IHByb3BlcnR5U2VsZWN0aW9uUmVmID0gcmVmPEhUTUxFbGVtZW50PigpXHJcbmNvbnN0IHN3YXBwaW5nRmlsdGVySWQgPSByZWY8TnVsbGFibGU8c3RyaW5nPj4obnVsbClcclxuY29uc3QgZmlsdGVyc0NvbnRhaW5lclJlZiA9IHJlZjxIVE1MRWxlbWVudD4oKVxyXG5jb25zdCBzaG91bGRTY3JvbGxUb05ld0ZpbHRlciA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IHNob3dMYXJnZVByb3BlcnR5V2FybmluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgcGVuZGluZ1Byb3BlcnR5ID1cclxuICByZWY8TnVsbGFibGU8eyBwcm9wZXJ0eTogRXh0ZW5kZWRQcm9wZXJ0eUluZm87IGNvdW50OiBudW1iZXIgfT4+KG51bGwpXHJcblxyXG5jb25zdCBwcm9wZXJ0eVNlbGVjdE9wdGlvbnMgPSBjb21wdXRlZCgoKTogUHJvcGVydHlTZWxlY3RPcHRpb25bXSA9PiB7XHJcbiAgaWYgKCFzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUpIHtcclxuICAgIHJldHVybiBbXVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZXhpc3RpbmdGaWx0ZXJLZXlzID0gbmV3IFNldChcclxuICAgIHByb3BlcnR5RmlsdGVycy52YWx1ZS5tYXAoKGYpID0+IGYuZmlsdGVyPy5rZXkpLmZpbHRlcihCb29sZWFuKVxyXG4gIClcclxuXHJcbiAgY29uc3QgcmVsZXZhbnRGaWx0ZXJzID0gZ2V0UHJvcGVydHlPcHRpb25zRnJvbURhdGFTdG9yZSgpXHJcblxyXG4gIGNvbnN0IGFsbE9wdGlvbnM6IFByb3BlcnR5U2VsZWN0T3B0aW9uW10gPSByZWxldmFudEZpbHRlcnNcclxuICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gIWV4aXN0aW5nRmlsdGVyS2V5cy5oYXMoZmlsdGVyLmtleSkpXHJcbiAgICAubWFwKChmaWx0ZXIpID0+IHtcclxuICAgICAgY29uc3QgbGFzdERvdEluZGV4ID0gZmlsdGVyLmtleS5sYXN0SW5kZXhPZignLicpXHJcbiAgICAgIGxldCBwcm9wZXJ0eU5hbWUgPVxyXG4gICAgICAgIGxhc3REb3RJbmRleCA9PT0gLTEgPyBmaWx0ZXIua2V5IDogZmlsdGVyLmtleS5zbGljZShsYXN0RG90SW5kZXggKyAxKVxyXG4gICAgICBsZXQgcGFyZW50UGF0aCA9XHJcbiAgICAgICAgbGFzdERvdEluZGV4ID09PSAtMVxyXG4gICAgICAgICAgPyAnJ1xyXG4gICAgICAgICAgOiBmaWx0ZXIua2V5LnNsaWNlKDAsIGxhc3REb3RJbmRleCkucmVwbGFjZSgvXFwuL2csICcg4oC6ICcpXHJcblxyXG4gICAgICAvLyBIYW5kbGUgbmFtZS12YWx1ZSBwYWlycyBieSBjb2xsYXBzaW5nIHRoZW0gdG8ganVzdCB0aGUgdmFsdWVcclxuICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IG5hbWUgZW5kcyB3aXRoICcudmFsdWUnLCB1c2UgdGhlIHBhcmVudCBhcyB0aGUgZGlzcGxheSBuYW1lXHJcbiAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT09ICd2YWx1ZScgJiYgbGFzdERvdEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlUGFyZW50UGF0aCA9IGZpbHRlci5rZXkuc2xpY2UoMCwgbGFzdERvdEluZGV4KVxyXG4gICAgICAgIGNvbnN0IHZhbHVlUGFyZW50TGFzdERvdCA9IHZhbHVlUGFyZW50UGF0aC5sYXN0SW5kZXhPZignLicpXHJcbiAgICAgICAgcHJvcGVydHlOYW1lID1cclxuICAgICAgICAgIHZhbHVlUGFyZW50TGFzdERvdCA9PT0gLTFcclxuICAgICAgICAgICAgPyB2YWx1ZVBhcmVudFBhdGhcclxuICAgICAgICAgICAgOiB2YWx1ZVBhcmVudFBhdGguc2xpY2UodmFsdWVQYXJlbnRMYXN0RG90ICsgMSlcclxuXHJcbiAgICAgICAgcGFyZW50UGF0aCA9XHJcbiAgICAgICAgICB2YWx1ZVBhcmVudExhc3REb3QgPT09IC0xXHJcbiAgICAgICAgICAgID8gJydcclxuICAgICAgICAgICAgOiB2YWx1ZVBhcmVudFBhdGguc2xpY2UoMCwgdmFsdWVQYXJlbnRMYXN0RG90KS5yZXBsYWNlKC9cXC4vZywgJyDigLogJylcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB2YWx1ZTogZmlsdGVyLmtleSxcclxuICAgICAgICBsYWJlbDogcHJvcGVydHlOYW1lLFxyXG4gICAgICAgIHBhcmVudFBhdGgsXHJcbiAgICAgICAgdHlwZTpcclxuICAgICAgICAgIGZpbHRlci50eXBlID09PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICA/IEZpbHRlclR5cGUuTnVtZXJpY1xyXG4gICAgICAgICAgICA6IChmaWx0ZXIgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZSA9PT0gJ2Jvb2xlYW4nXHJcbiAgICAgICAgICAgID8gRmlsdGVyVHlwZS5Cb29sZWFuXHJcbiAgICAgICAgICAgIDogRmlsdGVyVHlwZS5TdHJpbmcsXHJcbiAgICAgICAgaGFzUGFyZW50OiBwYXJlbnRQYXRoICE9PSAnJ1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICBjb25zdCBzb3J0ZWRPcHRpb25zID0gYWxsT3B0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAvLyBGaXJzdCBzb3J0IGJ5IHdoZXRoZXIgdGhleSBoYXZlIHBhcmVudHMgKG5vLXBhcmVudCBpdGVtcyBmaXJzdClcclxuICAgIGlmIChhLmhhc1BhcmVudCAhPT0gYi5oYXNQYXJlbnQpIHtcclxuICAgICAgcmV0dXJuIGEuaGFzUGFyZW50ID8gMSA6IC0xXHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgYm90aCBoYXZlIHBhcmVudHMsIHNvcnQgYnkgcGFyZW50IHBhdGggZmlyc3RcclxuICAgIGlmIChhLmhhc1BhcmVudCAmJiBiLmhhc1BhcmVudCkge1xyXG4gICAgICBjb25zdCBwYXJlbnRDb21wYXJpc29uID0gYS5wYXJlbnRQYXRoLmxvY2FsZUNvbXBhcmUoYi5wYXJlbnRQYXRoKVxyXG4gICAgICBpZiAocGFyZW50Q29tcGFyaXNvbiAhPT0gMCkgcmV0dXJuIHBhcmVudENvbXBhcmlzb25cclxuICAgIH1cclxuXHJcbiAgICAvLyBGaW5hbGx5IHNvcnQgYnkgbGFiZWxcclxuICAgIHJldHVybiBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbClcclxuICB9KVxyXG5cclxuICByZXR1cm4gc29ydGVkT3B0aW9uc1xyXG59KVxyXG5cclxuY29uc3QgYWRkTmV3RW1wdHlGaWx0ZXIgPSAoKSA9PiB7XHJcbiAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxuICBzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUgPSB0cnVlXHJcblxyXG4gIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnZmlsdGVycycsXHJcbiAgICBhY3Rpb246ICdvcGVuLXByb3BlcnR5LXNlbGVjdGlvbidcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBzdGFydFByb3BlcnR5U3dhcCA9IChmaWx0ZXJJZDogc3RyaW5nKSA9PiB7XHJcbiAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IGZpbHRlcklkXHJcbiAgc2hvd1Byb3BlcnR5U2VsZWN0aW9uLnZhbHVlID0gdHJ1ZVxyXG5cclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ2ZpbHRlcnMnLFxyXG4gICAgYWN0aW9uOiAnb3Blbi1wcm9wZXJ0eS1zd2FwJ1xyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZUFkZEZpbHRlckNsaWNrID0gKCkgPT4ge1xyXG4gIGlmIChzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUpIHtcclxuICAgIHNob3dQcm9wZXJ0eVNlbGVjdGlvbi52YWx1ZSA9IGZhbHNlXHJcbiAgfSBlbHNlIHtcclxuICAgIGFkZE5ld0VtcHR5RmlsdGVyKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IHNjcm9sbFRvTmV3RmlsdGVyID0gKCkgPT4ge1xyXG4gIGlmIChmaWx0ZXJzQ29udGFpbmVyUmVmLnZhbHVlKSB7XHJcbiAgICBmaWx0ZXJzQ29udGFpbmVyUmVmLnZhbHVlLnNjcm9sbFRvKHtcclxuICAgICAgdG9wOiBmaWx0ZXJzQ29udGFpbmVyUmVmLnZhbHVlLnNjcm9sbEhlaWdodCxcclxuICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuY29uc3Qgc2VsZWN0UHJvcGVydHkgPSBhc3luYyAocHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHJlbGV2YW50RmlsdGVycyA9IGdldFByb3BlcnR5T3B0aW9uc0Zyb21EYXRhU3RvcmUoKVxyXG4gIGNvbnN0IHByb3BlcnR5ID0gcmVsZXZhbnRGaWx0ZXJzLmZpbmQoKHApID0+IHAua2V5ID09PSBwcm9wZXJ0eUtleSlcclxuXHJcbiAgaWYgKCFwcm9wZXJ0eSkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiB0aGlzIHByb3BlcnR5IGhhcyB0b28gbWFueSB1bmlxdWUgdmFsdWVzXHJcbiAgY29uc3QgeyBpc0xhcmdlLCBjb3VudCB9ID0gaXNMYXJnZVByb3BlcnR5KHByb3BlcnR5LmtleSlcclxuXHJcbiAgaWYgKGlzTGFyZ2UpIHtcclxuICAgIC8vIFN0b3JlIHRoZSBwZW5kaW5nIHByb3BlcnR5IGFuZCBzaG93IHdhcm5pbmdcclxuICAgIHBlbmRpbmdQcm9wZXJ0eS52YWx1ZSA9IHsgcHJvcGVydHksIGNvdW50IH1cclxuICAgIHNob3dMYXJnZVByb3BlcnR5V2FybmluZy52YWx1ZSA9IHRydWVcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc1Byb3BlcnR5U2VsZWN0aW9uKHByb3BlcnR5LCBwcm9wZXJ0eUtleSlcclxufVxyXG5cclxuY29uc3QgcHJvY2Vzc1Byb3BlcnR5U2VsZWN0aW9uID0gKFxyXG4gIHByb3BlcnR5OiBFeHRlbmRlZFByb3BlcnR5SW5mbyxcclxuICBwcm9wZXJ0eUtleTogc3RyaW5nXHJcbikgPT4ge1xyXG4gIGlmIChzd2FwcGluZ0ZpbHRlcklkLnZhbHVlKSB7XHJcbiAgICB1cGRhdGVGaWx0ZXJQcm9wZXJ0eShzd2FwcGluZ0ZpbHRlcklkLnZhbHVlLCBwcm9wZXJ0eSlcclxuICAgIG1wLnRyYWNrKCdWaWV3ZXIgQWN0aW9uJywge1xyXG4gICAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgICAgbmFtZTogJ2ZpbHRlcnMnLFxyXG4gICAgICBhY3Rpb246ICdzd2FwLWZpbHRlci1wcm9wZXJ0eScsXHJcbiAgICAgIHZhbHVlOiBwcm9wZXJ0eUtleVxyXG4gICAgfSlcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gU2V0IGZsYWcgdG8gc2Nyb2xsIHdoZW4gbmV3IGZpbHRlciBpcyBhZGRlZFxyXG4gICAgc2hvdWxkU2Nyb2xsVG9OZXdGaWx0ZXIudmFsdWUgPSB0cnVlXHJcbiAgICBhZGRBY3RpdmVGaWx0ZXIocHJvcGVydHkpXHJcbiAgICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICAgIG5hbWU6ICdmaWx0ZXJzJyxcclxuICAgICAgYWN0aW9uOiAnYWRkLW5ldy1maWx0ZXInLFxyXG4gICAgICB2YWx1ZTogcHJvcGVydHlLZXlcclxuICAgIH0pXHJcbiAgfVxyXG4gIHNob3dQcm9wZXJ0eVNlbGVjdGlvbi52YWx1ZSA9IGZhbHNlXHJcbiAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxufVxyXG5cclxuY29uc3QgY29uZmlybUxhcmdlUHJvcGVydHlTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgaWYgKCFwZW5kaW5nUHJvcGVydHkudmFsdWUpIHJldHVyblxyXG5cclxuICBwcm9jZXNzUHJvcGVydHlTZWxlY3Rpb24oXHJcbiAgICBwZW5kaW5nUHJvcGVydHkudmFsdWUucHJvcGVydHksXHJcbiAgICBwZW5kaW5nUHJvcGVydHkudmFsdWUucHJvcGVydHkua2V5XHJcbiAgKVxyXG4gIHBlbmRpbmdQcm9wZXJ0eS52YWx1ZSA9IG51bGxcclxufVxyXG5cclxub25LZXlTdHJva2UoJ0VzY2FwZScsICgpID0+IHtcclxuICBpZiAoc2hvd0xhcmdlUHJvcGVydHlXYXJuaW5nLnZhbHVlKSB7XHJcbiAgICBzaG93TGFyZ2VQcm9wZXJ0eVdhcm5pbmcudmFsdWUgPSBmYWxzZVxyXG4gICAgc2hvd1Byb3BlcnR5U2VsZWN0aW9uLnZhbHVlID0gZmFsc2VcclxuICAgIHN3YXBwaW5nRmlsdGVySWQudmFsdWUgPSBudWxsXHJcbiAgICBwZW5kaW5nUHJvcGVydHkudmFsdWUgPSBudWxsXHJcbiAgfSBlbHNlIGlmIChzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUpIHtcclxuICAgIHNob3dQcm9wZXJ0eVNlbGVjdGlvbi52YWx1ZSA9IGZhbHNlXHJcbiAgfVxyXG59KVxyXG5cclxub25DbGlja091dHNpZGUocHJvcGVydHlTZWxlY3Rpb25SZWYsICgpID0+IHtcclxuICBpZiAoc2hvd1Byb3BlcnR5U2VsZWN0aW9uLnZhbHVlKSB7XHJcbiAgICBzaG93UHJvcGVydHlTZWxlY3Rpb24udmFsdWUgPSBmYWxzZVxyXG4gICAgc3dhcHBpbmdGaWx0ZXJJZC52YWx1ZSA9IG51bGxcclxuICB9XHJcbn0pXHJcblxyXG4vLyBXYXRjaCBmb3IgbmV3IGZpbHRlcnMgYmVpbmcgYWRkZWQgYW5kIHNjcm9sbCB3aGVuIG5lZWRlZFxyXG53YXRjaChcclxuICAoKSA9PiBwcm9wZXJ0eUZpbHRlcnMudmFsdWUubGVuZ3RoLFxyXG4gIChuZXdMZW5ndGgsIG9sZExlbmd0aCkgPT4ge1xyXG4gICAgaWYgKHNob3VsZFNjcm9sbFRvTmV3RmlsdGVyLnZhbHVlICYmIG5ld0xlbmd0aCA+IG9sZExlbmd0aCkge1xyXG4gICAgICBuZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgc2Nyb2xsVG9OZXdGaWx0ZXIoKVxyXG4gICAgICAgIHNob3VsZFNjcm9sbFRvTmV3RmlsdGVyLnZhbHVlID0gZmFsc2VcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbilcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9maWx0ZXJzL1BhbmVsLnZ1ZSJ9