296 lines
31 KiB
Plaintext
296 lines
31 KiB
Plaintext
import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/selection/KeyValuePair.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/viewer/filters/LargePropertyWarningDialog.vue";
|
|
/* Injection by vite-plugin-vue-inspector Start */
|
|
import { createElementVNode as __createElementVNode,createElementBlock as __createElementBlock,createVNode as __createVNode } 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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
|
|
function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
|
|
function _createVNode(...args) { return _interopVNode(__createVNode(...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 { VALID_HTTP_URL } from "/_nuxt/lib/common/helpers/validation.ts";
|
|
import { LayoutMenu } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
|
|
import { Ellipsis } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29";
|
|
import { useFilterUtilities } from "/_nuxt/lib/viewer/composables/filtering/filtering.ts";
|
|
import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts";
|
|
import { isNumericPropertyInfo } from "/_nuxt/lib/viewer/helpers/sceneExplorer.ts";
|
|
import {
|
|
BooleanFilterCondition,
|
|
NumericFilterCondition
|
|
} from "/_nuxt/lib/viewer/helpers/filters/types.ts";
|
|
import { isBooleanProperty } from "/_nuxt/lib/viewer/helpers/filters/utils.ts";
|
|
|
|
import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useClipboard } from "/_nuxt/composables/browser.ts";
|
|
const _sfc_main = /* @__PURE__ */ _defineComponent({
|
|
__name: "ViewerSelectionKeyValuePair",
|
|
props: {
|
|
kvp: { type: Object, required: true }
|
|
},
|
|
setup(__props, { expose: __expose }) {
|
|
__expose();
|
|
const props = __props;
|
|
const {
|
|
isKvpFilterable,
|
|
getFilterDisabledReason,
|
|
findFilterByKvp,
|
|
addActiveFilter,
|
|
updateActiveFilterValues,
|
|
updateFilterCondition,
|
|
setNumericRange,
|
|
isLargeProperty,
|
|
getPropertyOptionsFromDataStore
|
|
} = useFilterUtilities();
|
|
const {
|
|
ui: {
|
|
panels: { active: activePanel }
|
|
}
|
|
} = useInjectedViewerState();
|
|
const availableFilters = computed(
|
|
() => getPropertyOptionsFromDataStore()
|
|
);
|
|
const showActionsMenu = ref(false);
|
|
const showLargePropertyWarning = ref(false);
|
|
const pendingFilter = ref(null);
|
|
const pendingFilterCount = ref(0);
|
|
const isUrlString = (v) => typeof v === "string" && VALID_HTTP_URL.test(v);
|
|
const isCopyable = computed(() => {
|
|
return props.kvp.value !== null && props.kvp.value !== void 0 && typeof props.kvp.value !== "object";
|
|
});
|
|
const isFilterable = computed(() => {
|
|
if (props.kvp.value === null || props.kvp.value === void 0) {
|
|
return false;
|
|
}
|
|
return isKvpFilterable(props.kvp, availableFilters.value);
|
|
});
|
|
const getDisabledReason = computed(() => {
|
|
if (props.kvp.value === null || props.kvp.value === void 0) {
|
|
return "Cannot filter on null values";
|
|
}
|
|
return getFilterDisabledReason(props.kvp, availableFilters.value);
|
|
});
|
|
const handleAddToFilters = (kvp) => {
|
|
const filter = findFilterByKvp(kvp, availableFilters.value);
|
|
if (filter && kvp.value !== null && kvp.value !== void 0) {
|
|
const { isLarge, count } = isLargeProperty(filter.key);
|
|
if (isLarge) {
|
|
pendingFilter.value = filter;
|
|
pendingFilterCount.value = count;
|
|
showLargePropertyWarning.value = true;
|
|
return;
|
|
}
|
|
addFilterWithValue(filter, kvp);
|
|
}
|
|
};
|
|
const addFilterWithValue = (filter, kvp) => {
|
|
const filterId = addActiveFilter(filter);
|
|
if (isNumericPropertyInfo(filter)) {
|
|
const numericValue = typeof kvp.value === "number" ? kvp.value : parseFloat(String(kvp.value));
|
|
if (!isNaN(numericValue)) {
|
|
updateFilterCondition(filterId, NumericFilterCondition.IsEqualTo);
|
|
setNumericRange(filterId, numericValue, numericValue);
|
|
}
|
|
} else if (isBooleanProperty(filter)) {
|
|
const boolValue = kvp.value === true || kvp.value === "true";
|
|
const condition = boolValue ? BooleanFilterCondition.IsTrue : BooleanFilterCondition.IsFalse;
|
|
updateFilterCondition(filterId, condition);
|
|
} else {
|
|
const values = [String(kvp.value)];
|
|
updateActiveFilterValues(filterId, values);
|
|
}
|
|
activePanel.value = "filters";
|
|
};
|
|
const confirmLargePropertySelection = () => {
|
|
if (pendingFilter.value) {
|
|
addFilterWithValue(pendingFilter.value, props.kvp);
|
|
pendingFilter.value = null;
|
|
pendingFilterCount.value = 0;
|
|
}
|
|
};
|
|
const handleCopy = async (kvp) => {
|
|
const { copy } = useClipboard();
|
|
if (isCopyable.value) {
|
|
await copy(kvp.value, {
|
|
successMessage: `${kvp.key} copied to clipboard`,
|
|
failureMessage: `Failed to copy ${kvp.key} to clipboard`
|
|
});
|
|
}
|
|
};
|
|
const actionsItems = computed(() => {
|
|
return [
|
|
[
|
|
{
|
|
title: "Copy value",
|
|
id: "copy-value",
|
|
disabled: !isCopyable.value,
|
|
disabledTooltip: isCopyable.value ? void 0 : "Cannot copy objects, arrays, or null values"
|
|
}
|
|
],
|
|
[
|
|
{
|
|
title: "Add to filters",
|
|
id: "add-to-filters",
|
|
disabled: !isFilterable.value,
|
|
disabledTooltip: isFilterable.value ? "Add this property to filters" : getDisabledReason.value
|
|
}
|
|
]
|
|
];
|
|
});
|
|
const onActionChosen = (params) => {
|
|
const { item } = params;
|
|
if (item.disabled) return;
|
|
switch (item.id) {
|
|
case "copy-value":
|
|
handleCopy(props.kvp);
|
|
break;
|
|
case "add-to-filters":
|
|
handleAddToFilters(props.kvp);
|
|
break;
|
|
}
|
|
};
|
|
const __returned__ = { props, isKvpFilterable, getFilterDisabledReason, findFilterByKvp, addActiveFilter, updateActiveFilterValues, updateFilterCondition, setNumericRange, isLargeProperty, getPropertyOptionsFromDataStore, activePanel, availableFilters, showActionsMenu, showLargePropertyWarning, pendingFilter, pendingFilterCount, isUrlString, isCopyable, isFilterable, getDisabledReason, handleAddToFilters, addFilterWithValue, confirmLargePropertySelection, handleCopy, actionsItems, onActionChosen, get LayoutMenu() {
|
|
return LayoutMenu;
|
|
}, get Ellipsis() {
|
|
return Ellipsis;
|
|
} };
|
|
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
|
|
return __returned__;
|
|
}
|
|
});
|
|
import { toDisplayString as _toDisplayString, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, openBlock as _openBlock, withModifiers as _withModifiers, withCtx as _withCtx, resolveComponent as _resolveComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
const _hoisted_1 = { "data-v-inspector": "components/viewer/selection/KeyValuePair.vue:2:3" };
|
|
const _hoisted_2 = {
|
|
class: "flex w-full",
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:3:5"
|
|
};
|
|
const _hoisted_3 = ["title"];
|
|
const _hoisted_4 = ["title"];
|
|
const _hoisted_5 = {
|
|
class: "flex gap-1 items-center w-full",
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:19:11"
|
|
};
|
|
const _hoisted_6 = ["href"];
|
|
const _hoisted_7 = {
|
|
key: 2,
|
|
class: "truncate opacity-70",
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:40:13"
|
|
};
|
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
const _component_ViewerFiltersLargePropertyWarningDialog = __nuxt_component_0;
|
|
return _openBlock(), _createElementBlock("div", _hoisted_1, [
|
|
_createElementVNode("div", _hoisted_2, [
|
|
_createElementVNode(
|
|
"div",
|
|
{
|
|
class: _normalizeClass(`grid grid-cols-3 w-full pl-2 h-5 items-center ${$props.kvp.value === null || $props.kvp.value === void 0 ? "text-foreground-2" : ""}`),
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:4:7"
|
|
},
|
|
[
|
|
_createElementVNode("div", {
|
|
class: "col-span-1 truncate text-body-3xs mr-2 font-medium text-foreground-2",
|
|
title: $props.kvp.key,
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:9:9"
|
|
}, _toDisplayString($props.kvp.key), 9, _hoisted_3),
|
|
_createElementVNode("div", {
|
|
class: "group col-span-2 pl-1 truncate text-body-3xs flex gap-1 items-center text-foreground",
|
|
title: $props.kvp.value,
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:15:9"
|
|
}, [
|
|
_createElementVNode("div", _hoisted_5, [
|
|
_createCommentVNode(" NOTE: can't do kvp.value || 'null' because 0 || 'null' = 'null' "),
|
|
$setup.isUrlString($props.kvp.value) ? (_openBlock(), _createElementBlock("a", {
|
|
key: 0,
|
|
href: $props.kvp.value,
|
|
target: "_blank",
|
|
rel: "noopener",
|
|
class: _normalizeClass(["truncate border-b border-outline-3 hover:border-outline-5", $props.kvp.value === null ? "" : "group-hover:max-w-[calc(100%-1rem)]"]),
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:22:15"
|
|
}, _toDisplayString($props.kvp.value), 11, _hoisted_6)) : (_openBlock(), _createElementBlock(
|
|
"span",
|
|
{
|
|
key: 1,
|
|
class: _normalizeClass(["truncate", $props.kvp.value === null ? "" : "group-hover:max-w-[calc(100%-1rem)]"]),
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:33:15"
|
|
},
|
|
_toDisplayString($props.kvp.value === null ? "null" : $props.kvp.value),
|
|
3
|
|
/* TEXT, CLASS */
|
|
)),
|
|
$props.kvp.units ? (_openBlock(), _createElementBlock(
|
|
"span",
|
|
_hoisted_7,
|
|
_toDisplayString($props.kvp.units),
|
|
1
|
|
/* TEXT */
|
|
)) : _createCommentVNode("v-if", true),
|
|
_createVNode($setup["LayoutMenu"], {
|
|
open: $setup.showActionsMenu,
|
|
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = $event),
|
|
items: $setup.actionsItems,
|
|
"mount-menu-on-body": "",
|
|
onClick: _cache[2] || (_cache[2] = _withModifiers(() => {
|
|
}, ["stop", "prevent"])),
|
|
onChosen: $setup.onActionChosen,
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:43:13"
|
|
}, {
|
|
default: _withCtx(() => [
|
|
_createElementVNode(
|
|
"button",
|
|
{
|
|
class: _normalizeClass(["group-hover:opacity-100 hover:bg-highlight-1 rounded h-4 w-4 flex items-center justify-center", $setup.showActionsMenu ? "bg-highlight-1 opacity-100" : "opacity-0"]),
|
|
onClick: _cache[0] || (_cache[0] = ($event) => $setup.showActionsMenu = !$setup.showActionsMenu),
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:50:15"
|
|
},
|
|
[
|
|
_createVNode($setup["Ellipsis"], {
|
|
class: "h-3 w-3",
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:55:17"
|
|
})
|
|
],
|
|
2
|
|
/* CLASS */
|
|
)
|
|
]),
|
|
_: 1
|
|
/* STABLE */
|
|
}, 8, ["open", "items"])
|
|
])
|
|
], 8, _hoisted_4)
|
|
],
|
|
2
|
|
/* CLASS */
|
|
)
|
|
]),
|
|
_createVNode(_component_ViewerFiltersLargePropertyWarningDialog, {
|
|
open: $setup.showLargePropertyWarning,
|
|
"onUpdate:open": _cache[3] || (_cache[3] = ($event) => $setup.showLargePropertyWarning = $event),
|
|
count: $setup.pendingFilterCount,
|
|
onConfirm: $setup.confirmLargePropertySelection,
|
|
"data-v-inspector": "components/viewer/selection/KeyValuePair.vue:63:5"
|
|
}, null, 8, ["open", "count"])
|
|
]);
|
|
}
|
|
_sfc_main.__hmrId = "5bb083b2";
|
|
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/selection/KeyValuePair.vue"]]);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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aUJBREYsV0FBSSxLQUFLO0FBQUE7QUFBQTtBQUFBO2NBRWQsYUFjYTtBQUFBLGdCQWJILE1BQU07QUFBQSxnR0FBZTtBQUFBLGdCQUM1QixPQUFPO0FBQUEsZ0JBQ1I7QUFBQSxnQkFDQyxTQUFLLHlDQUFOO0FBQUEsbUJBQW1CO0FBQUEsZ0JBQ2xCLFVBQVE7QUFBQSxnQkFBZ0Isb0JBQWlCO0FBQUE7a0NBRTFDLE1BTVM7QUFBQSxrQkFOVDtBQUFBLG9CQU1TO0FBQUE7QUFBQSxzQkFMUCxPQUFLLGlCQUFDLGlHQUNFLHlCQUFlO0FBQUEsc0JBQ3RCLFNBQUssc0NBQUUseUJBQWUsQ0FBSTtBQUFBLHNCQUFpQixvQkFBaUI7QUFBQTs7c0JBRTdELGFBQWtHO0FBQUEsd0JBQXhGLE9BQU07QUFBQSx3QkFBVSxvQkFBaUI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7OztJQVF2RCxhQUlFO0FBQUEsTUFIUSxNQUFNO0FBQUEsK0ZBQXdCO0FBQUEsTUFDckMsT0FBTztBQUFBLE1BQ1AsV0FBUztBQUFBLE1BQStCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJLZXlWYWx1ZVBhaXIudnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjx0ZW1wbGF0ZT5cclxuICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZToyOjNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTozOjVcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIDpjbGFzcz1cImBncmlkIGdyaWQtY29scy0zIHctZnVsbCBwbC0yIGgtNSBpdGVtcy1jZW50ZXIgJHtcclxuICAgICAgICAgIGt2cC52YWx1ZSA9PT0gbnVsbCB8fCBrdnAudmFsdWUgPT09IHVuZGVmaW5lZCA/ICd0ZXh0LWZvcmVncm91bmQtMicgOiAnJ1xyXG4gICAgICAgIH1gXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9LZXlWYWx1ZVBhaXIudnVlOjQ6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cImNvbC1zcGFuLTEgdHJ1bmNhdGUgdGV4dC1ib2R5LTN4cyBtci0yIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZC0yXCJcclxuICAgICAgICAgIDp0aXRsZT1cImt2cC5rZXlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL0tleVZhbHVlUGFpci52dWU6OTo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBrdnAua2V5IH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgY2xhc3M9XCJncm91cCBjb2wtc3Bhbi0yIHBsLTEgdHJ1bmNhdGUgdGV4dC1ib2R5LTN4cyBmbGV4IGdhcC0xIGl0ZW1zLWNlbnRlciB0ZXh0LWZvcmVncm91bmRcIlxyXG4gICAgICAgICAgOnRpdGxlPVwiKGt2cC52YWx1ZSBhcyBzdHJpbmcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9LZXlWYWx1ZVBhaXIudnVlOjE1OjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0xIGl0ZW1zLWNlbnRlciB3LWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL0tleVZhbHVlUGFpci52dWU6MTk6MTFcIj5cclxuICAgICAgICAgICAgPCEtLSBOT1RFOiBjYW4ndCBkbyBrdnAudmFsdWUgfHwgJ251bGwnIGJlY2F1c2UgMCB8fCAnbnVsbCcgPSAnbnVsbCcgLS0+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSB2LWlmPVwiaXNVcmxTdHJpbmcoa3ZwLnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICA6aHJlZj1cImt2cC52YWx1ZSBhcyBzdHJpbmdcIlxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcclxuICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGUgYm9yZGVyLWIgYm9yZGVyLW91dGxpbmUtMyBob3Zlcjpib3JkZXItb3V0bGluZS01XCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cImt2cC52YWx1ZSA9PT0gbnVsbCA/ICcnIDogJ2dyb3VwLWhvdmVyOm1heC13LVtjYWxjKDEwMCUtMXJlbSldJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZToyMjoxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sga3ZwLnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlXCJcclxuICAgICAgICAgICAgICAgIDpjbGFzcz1cImt2cC52YWx1ZSA9PT0gbnVsbCA/ICcnIDogJ2dyb3VwLWhvdmVyOm1heC13LVtjYWxjKDEwMCUtMXJlbSldJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTozMzoxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3sga3ZwLnZhbHVlID09PSBudWxsID8gJ251bGwnIDoga3ZwLnZhbHVlIH19XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgICAgICA8c3BhbiB2LWlmPVwia3ZwLnVuaXRzXCIgY2xhc3M9XCJ0cnVuY2F0ZSBvcGFjaXR5LTcwXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi9LZXlWYWx1ZVBhaXIudnVlOjQwOjEzXCI+XHJcbiAgICAgICAgICAgICAge3sga3ZwLnVuaXRzIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPExheW91dE1lbnVcclxuICAgICAgICAgICAgICB2LW1vZGVsOm9wZW49XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICAgICAgICAgIDppdGVtcz1cImFjdGlvbnNJdGVtc1wiXHJcbiAgICAgICAgICAgICAgbW91bnQtbWVudS1vbi1ib2R5XHJcbiAgICAgICAgICAgICAgQGNsaWNrLnN0b3AucHJldmVudFxyXG4gICAgICAgICAgICAgIEBjaG9zZW49XCJvbkFjdGlvbkNob3NlblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo0MzoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIGhvdmVyOmJnLWhpZ2hsaWdodC0xIHJvdW5kZWQgaC00IHctNCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICA6Y2xhc3M9XCJzaG93QWN0aW9uc01lbnUgPyAnYmctaGlnaGxpZ2h0LTEgb3BhY2l0eS0xMDAnIDogJ29wYWNpdHktMCdcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrPVwic2hvd0FjdGlvbnNNZW51ID0gIXNob3dBY3Rpb25zTWVudVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo1MDoxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPEVsbGlwc2lzIGNsYXNzPVwiaC0zIHctM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo1NToxN1wiIC8+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvTGF5b3V0TWVudT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxWaWV3ZXJGaWx0ZXJzTGFyZ2VQcm9wZXJ0eVdhcm5pbmdEaWFsb2dcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd0xhcmdlUHJvcGVydHlXYXJuaW5nXCJcclxuICAgICAgOmNvdW50PVwicGVuZGluZ0ZpbHRlckNvdW50XCJcclxuICAgICAgQGNvbmZpcm09XCJjb25maXJtTGFyZ2VQcm9wZXJ0eVNlbGVjdGlvblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9zZWxlY3Rpb24vS2V5VmFsdWVQYWlyLnZ1ZTo2Mzo1XCJcclxuICAgIC8+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBWQUxJRF9IVFRQX1VSTCB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy92YWxpZGF0aW9uJ1xyXG5pbXBvcnQgeyBMYXlvdXRNZW51LCB0eXBlIExheW91dE1lbnVJdGVtIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgRWxsaXBzaXMgfSBmcm9tICdsdWNpZGUtdnVlLW5leHQnXHJcbmltcG9ydCB7IHVzZUZpbHRlclV0aWxpdGllcyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9maWx0ZXJpbmcvZmlsdGVyaW5nJ1xyXG5pbXBvcnQgeyB1c2VJbmplY3RlZFZpZXdlclN0YXRlIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zZXR1cCdcclxuaW1wb3J0IHR5cGUgeyBLZXlWYWx1ZVBhaXIgfSBmcm9tICd+L2NvbXBvbmVudHMvdmlld2VyL3NlbGVjdGlvbi90eXBlcydcclxuaW1wb3J0IHsgaXNOdW1lcmljUHJvcGVydHlJbmZvIH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvc2NlbmVFeHBsb3JlcidcclxuaW1wb3J0IHtcclxuICBCb29sZWFuRmlsdGVyQ29uZGl0aW9uLFxyXG4gIE51bWVyaWNGaWx0ZXJDb25kaXRpb24sXHJcbiAgdHlwZSBFeHRlbmRlZFByb3BlcnR5SW5mb1xyXG59IGZyb20gJ34vbGliL3ZpZXdlci9oZWxwZXJzL2ZpbHRlcnMvdHlwZXMnXHJcbmltcG9ydCB7IGlzQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnfi9saWIvdmlld2VyL2hlbHBlcnMvZmlsdGVycy91dGlscydcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGt2cDogS2V5VmFsdWVQYWlyXHJcbn0+KClcclxuXHJcbmNvbnN0IHtcclxuICBpc0t2cEZpbHRlcmFibGUsXHJcbiAgZ2V0RmlsdGVyRGlzYWJsZWRSZWFzb24sXHJcbiAgZmluZEZpbHRlckJ5S3ZwLFxyXG4gIGFkZEFjdGl2ZUZpbHRlcixcclxuICB1cGRhdGVBY3RpdmVGaWx0ZXJWYWx1ZXMsXHJcbiAgdXBkYXRlRmlsdGVyQ29uZGl0aW9uLFxyXG4gIHNldE51bWVyaWNSYW5nZSxcclxuICBpc0xhcmdlUHJvcGVydHksXHJcbiAgZ2V0UHJvcGVydHlPcHRpb25zRnJvbURhdGFTdG9yZVxyXG59ID0gdXNlRmlsdGVyVXRpbGl0aWVzKClcclxuXHJcbmNvbnN0IHtcclxuICB1aToge1xyXG4gICAgcGFuZWxzOiB7IGFjdGl2ZTogYWN0aXZlUGFuZWwgfVxyXG4gIH1cclxufSA9IHVzZUluamVjdGVkVmlld2VyU3RhdGUoKVxyXG5cclxuY29uc3QgYXZhaWxhYmxlRmlsdGVycyA9IGNvbXB1dGVkKFxyXG4gICgpID0+IGdldFByb3BlcnR5T3B0aW9uc0Zyb21EYXRhU3RvcmUoKSBhcyBFeHRlbmRlZFByb3BlcnR5SW5mb1tdXHJcbilcclxuXHJcbmNvbnN0IHNob3dBY3Rpb25zTWVudSA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IHNob3dMYXJnZVByb3BlcnR5V2FybmluZyA9IHJlZihmYWxzZSlcclxuY29uc3QgcGVuZGluZ0ZpbHRlciA9IHJlZjxFeHRlbmRlZFByb3BlcnR5SW5mbyB8IG51bGw+KG51bGwpXHJcbmNvbnN0IHBlbmRpbmdGaWx0ZXJDb3VudCA9IHJlZigwKVxyXG5cclxuY29uc3QgaXNVcmxTdHJpbmcgPSAodjogdW5rbm93bikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIFZBTElEX0hUVFBfVVJMLnRlc3QodilcclxuXHJcbmNvbnN0IGlzQ29weWFibGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIChcclxuICAgIHByb3BzLmt2cC52YWx1ZSAhPT0gbnVsbCAmJlxyXG4gICAgcHJvcHMua3ZwLnZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgIHR5cGVvZiBwcm9wcy5rdnAudmFsdWUgIT09ICdvYmplY3QnXHJcbiAgKVxyXG59KVxyXG5cclxuY29uc3QgaXNGaWx0ZXJhYmxlID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5rdnAudmFsdWUgPT09IG51bGwgfHwgcHJvcHMua3ZwLnZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICByZXR1cm4gaXNLdnBGaWx0ZXJhYmxlKHByb3BzLmt2cCwgYXZhaWxhYmxlRmlsdGVycy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGdldERpc2FibGVkUmVhc29uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChwcm9wcy5rdnAudmFsdWUgPT09IG51bGwgfHwgcHJvcHMua3ZwLnZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgIHJldHVybiAnQ2Fubm90IGZpbHRlciBvbiBudWxsIHZhbHVlcydcclxuICB9XHJcbiAgcmV0dXJuIGdldEZpbHRlckRpc2FibGVkUmVhc29uKHByb3BzLmt2cCwgYXZhaWxhYmxlRmlsdGVycy52YWx1ZSlcclxufSlcclxuXHJcbmNvbnN0IGhhbmRsZUFkZFRvRmlsdGVycyA9IChrdnA6IEtleVZhbHVlUGFpcikgPT4ge1xyXG4gIGNvbnN0IGZpbHRlciA9IGZpbmRGaWx0ZXJCeUt2cChrdnAsIGF2YWlsYWJsZUZpbHRlcnMudmFsdWUpXHJcbiAgaWYgKGZpbHRlciAmJiBrdnAudmFsdWUgIT09IG51bGwgJiYga3ZwLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgIGNvbnN0IHsgaXNMYXJnZSwgY291bnQgfSA9IGlzTGFyZ2VQcm9wZXJ0eShmaWx0ZXIua2V5KVxyXG5cclxuICAgIGlmIChpc0xhcmdlKSB7XHJcbiAgICAgIHBlbmRpbmdGaWx0ZXIudmFsdWUgPSBmaWx0ZXJcclxuICAgICAgcGVuZGluZ0ZpbHRlckNvdW50LnZhbHVlID0gY291bnRcclxuICAgICAgc2hvd0xhcmdlUHJvcGVydHlXYXJuaW5nLnZhbHVlID0gdHJ1ZVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBhZGRGaWx0ZXJXaXRoVmFsdWUoZmlsdGVyLCBrdnApXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBhZGRGaWx0ZXJXaXRoVmFsdWUgPSAoZmlsdGVyOiBFeHRlbmRlZFByb3BlcnR5SW5mbywga3ZwOiBLZXlWYWx1ZVBhaXIpID0+IHtcclxuICBjb25zdCBmaWx0ZXJJZCA9IGFkZEFjdGl2ZUZpbHRlcihmaWx0ZXIpXHJcblxyXG4gIGlmIChpc051bWVyaWNQcm9wZXJ0eUluZm8oZmlsdGVyKSkge1xyXG4gICAgLy8gRm9yIG51bWVyaWMgZmlsdGVycywgc2V0IHRoZSBzcGVjaWZpYyBudW1lcmljIHZhbHVlIHdpdGggSXNFcXVhbFRvIGNvbmRpdGlvblxyXG4gICAgY29uc3QgbnVtZXJpY1ZhbHVlID1cclxuICAgICAgdHlwZW9mIGt2cC52YWx1ZSA9PT0gJ251bWJlcicgPyBrdnAudmFsdWUgOiBwYXJzZUZsb2F0KFN0cmluZyhrdnAudmFsdWUpKVxyXG4gICAgaWYgKCFpc05hTihudW1lcmljVmFsdWUpKSB7XHJcbiAgICAgIHVwZGF0ZUZpbHRlckNvbmRpdGlvbihmaWx0ZXJJZCwgTnVtZXJpY0ZpbHRlckNvbmRpdGlvbi5Jc0VxdWFsVG8pXHJcbiAgICAgIHNldE51bWVyaWNSYW5nZShmaWx0ZXJJZCwgbnVtZXJpY1ZhbHVlLCBudW1lcmljVmFsdWUpXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5Qcm9wZXJ0eShmaWx0ZXIpKSB7XHJcbiAgICAvLyBGb3IgYm9vbGVhbiBmaWx0ZXJzLCBzZXQgdGhlIGNvbmRpdGlvbiBiYXNlZCBvbiB0aGUgdmFsdWVcclxuICAgIGNvbnN0IGJvb2xWYWx1ZSA9IGt2cC52YWx1ZSA9PT0gdHJ1ZSB8fCBrdnAudmFsdWUgPT09ICd0cnVlJ1xyXG4gICAgY29uc3QgY29uZGl0aW9uID0gYm9vbFZhbHVlXHJcbiAgICAgID8gQm9vbGVhbkZpbHRlckNvbmRpdGlvbi5Jc1RydWVcclxuICAgICAgOiBCb29sZWFuRmlsdGVyQ29uZGl0aW9uLklzRmFsc2VcclxuICAgIHVwZGF0ZUZpbHRlckNvbmRpdGlvbihmaWx0ZXJJZCwgY29uZGl0aW9uKVxyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBGb3Igc3RyaW5nIGZpbHRlcnMsIHVzZSB0aGUgc2VsZWN0ZWRWYWx1ZXMgYXJyYXlcclxuICAgIGNvbnN0IHZhbHVlcyA9IFtTdHJpbmcoa3ZwLnZhbHVlKV1cclxuICAgIHVwZGF0ZUFjdGl2ZUZpbHRlclZhbHVlcyhmaWx0ZXJJZCwgdmFsdWVzKVxyXG4gIH1cclxuXHJcbiAgYWN0aXZlUGFuZWwudmFsdWUgPSAnZmlsdGVycydcclxufVxyXG5cclxuY29uc3QgY29uZmlybUxhcmdlUHJvcGVydHlTZWxlY3Rpb24gPSAoKSA9PiB7XHJcbiAgaWYgKHBlbmRpbmdGaWx0ZXIudmFsdWUpIHtcclxuICAgIGFkZEZpbHRlcldpdGhWYWx1ZShwZW5kaW5nRmlsdGVyLnZhbHVlLCBwcm9wcy5rdnApXHJcbiAgICBwZW5kaW5nRmlsdGVyLnZhbHVlID0gbnVsbFxyXG4gICAgcGVuZGluZ0ZpbHRlckNvdW50LnZhbHVlID0gMFxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlQ29weSA9IGFzeW5jIChrdnA6IEtleVZhbHVlUGFpcikgPT4ge1xyXG4gIGNvbnN0IHsgY29weSB9ID0gdXNlQ2xpcGJvYXJkKClcclxuICBpZiAoaXNDb3B5YWJsZS52YWx1ZSkge1xyXG4gICAgYXdhaXQgY29weShrdnAudmFsdWUgYXMgc3RyaW5nLCB7XHJcbiAgICAgIHN1Y2Nlc3NNZXNzYWdlOiBgJHtrdnAua2V5fSBjb3BpZWQgdG8gY2xpcGJvYXJkYCxcclxuICAgICAgZmFpbHVyZU1lc3NhZ2U6IGBGYWlsZWQgdG8gY29weSAke2t2cC5rZXl9IHRvIGNsaXBib2FyZGBcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBhY3Rpb25zSXRlbXMgPSBjb21wdXRlZDxMYXlvdXRNZW51SXRlbVtdW10+KCgpID0+IHtcclxuICByZXR1cm4gW1xyXG4gICAgW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdDb3B5IHZhbHVlJyxcclxuICAgICAgICBpZDogJ2NvcHktdmFsdWUnLFxyXG4gICAgICAgIGRpc2FibGVkOiAhaXNDb3B5YWJsZS52YWx1ZSxcclxuICAgICAgICBkaXNhYmxlZFRvb2x0aXA6IGlzQ29weWFibGUudmFsdWVcclxuICAgICAgICAgID8gdW5kZWZpbmVkXHJcbiAgICAgICAgICA6ICdDYW5ub3QgY29weSBvYmplY3RzLCBhcnJheXMsIG9yIG51bGwgdmFsdWVzJ1xyXG4gICAgICB9XHJcbiAgICBdLFxyXG4gICAgW1xyXG4gICAgICB7XHJcbiAgICAgICAgdGl0bGU6ICdBZGQgdG8gZmlsdGVycycsXHJcbiAgICAgICAgaWQ6ICdhZGQtdG8tZmlsdGVycycsXHJcbiAgICAgICAgZGlzYWJsZWQ6ICFpc0ZpbHRlcmFibGUudmFsdWUsXHJcbiAgICAgICAgZGlzYWJsZWRUb29sdGlwOiBpc0ZpbHRlcmFibGUudmFsdWVcclxuICAgICAgICAgID8gJ0FkZCB0aGlzIHByb3BlcnR5IHRvIGZpbHRlcnMnXHJcbiAgICAgICAgICA6IGdldERpc2FibGVkUmVhc29uLnZhbHVlXHJcbiAgICAgIH1cclxuICAgIF1cclxuICBdXHJcbn0pXHJcblxyXG5jb25zdCBvbkFjdGlvbkNob3NlbiA9IChwYXJhbXM6IHsgaXRlbTogTGF5b3V0TWVudUl0ZW0gfSkgPT4ge1xyXG4gIGNvbnN0IHsgaXRlbSB9ID0gcGFyYW1zXHJcblxyXG4gIC8vIERvbid0IGV4ZWN1dGUgaWYgaXRlbSBpcyBkaXNhYmxlZFxyXG4gIGlmIChpdGVtLmRpc2FibGVkKSByZXR1cm5cclxuXHJcbiAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICBjYXNlICdjb3B5LXZhbHVlJzpcclxuICAgICAgaGFuZGxlQ29weShwcm9wcy5rdnApXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlICdhZGQtdG8tZmlsdGVycyc6XHJcbiAgICAgIGhhbmRsZUFkZFRvRmlsdGVycyhwcm9wcy5rdnApXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy92aWV3ZXIvc2VsZWN0aW9uL0tleVZhbHVlUGFpci52dWUifQ== |