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

757 lines
78 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/StructureItem.vue");import { default as __nuxt_component_0 } from "/_nuxt/node_modules/nuxt/dist/app/components/nuxt-link.js?v=e4f18c29";
import { default as __nuxt_component_1 } from "/_nuxt/components/integrations/acc/SyncStatusModelItem.vue";
import { default as __nuxt_component_2 } from "/_nuxt/components/project/page/models/Actions.vue";
import { FormButton as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_4 } from "/_nuxt/components/project/PendingFileImportStatus.vue";
import { default as __nuxt_component_5 } from "/_nuxt/components/project/CardImportFileArea.vue";
import { default as __nuxt_component_6 } from "/_nuxt/components/global/icon/Discussions.vue";
import { default as __nuxt_component_7 } from "/_nuxt/components/automate/runs/TriggerStatus.vue";
import { default as __nuxt_component_8 } from "/_nuxt/components/global/icon/Versions.vue";
import { default as __nuxt_component_9 } from "/_nuxt/components/preview/Image.vue";
import { CommonLoadingBar as __nuxt_component_10 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_11 } from "/_nuxt/components/project/page/models/StructureItem.vue";
/* Injection by vite-plugin-vue-inspector Start */
import { createElementVNode as __createElementVNode,createVNode as __createVNode,createBlock as __createBlock,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 _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) }
function _createVNode(...args) { return _interopVNode(__createVNode(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...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 { modelVersionsRoute, modelRoute } from "/_nuxt/lib/common/helpers/route.ts";
import { ChevronDownIcon, PlusIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_20_solid.js?v=e4f18c29";
import { ExclamationCircleIcon, FolderIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { useQuery } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
import { projectModelChildrenTreeQuery } from "/_nuxt/lib/projects/graphql/queries.ts";
import { has } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { useIsModelExpanded } from "/_nuxt/lib/projects/composables/models.ts";
import { HorizontalDirection } from "/_nuxt/lib/common/composables/window.ts";
import { useCanCreateModel } from "/_nuxt/lib/projects/composables/permissions.ts";
import __vite__cjsImport25_dayjs from "/_nuxt/node_modules/.cache/vite/client/deps/dayjs.js?v=e4f18c29"; const dayjs = __vite__cjsImport25_dayjs.__esModule ? __vite__cjsImport25_dayjs.default : __vite__cjsImport25_dayjs;
import { FileUploadConvertedStatus } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js";
import { getModelItemRoute } from "/_nuxt/lib/projects/helpers/models.ts";
import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
import { useDateFormatters } from "/_nuxt/composables/dates.ts";
import { computed, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
var StructureItemType = /* @__PURE__ */ ((StructureItemType2) => {
StructureItemType2[StructureItemType2["EmptyModel"] = 0] = "EmptyModel";
StructureItemType2[StructureItemType2["ModelWithOnlyVersions"] = 1] = "ModelWithOnlyVersions";
StructureItemType2[StructureItemType2["ModelWithOnlySubmodels"] = 2] = "ModelWithOnlySubmodels";
StructureItemType2[StructureItemType2["ModelWithVersionsAndSubmodels"] = 3] = "ModelWithVersionsAndSubmodels";
StructureItemType2[StructureItemType2["PendingModel"] = 4] = "PendingModel";
return StructureItemType2;
})(StructureItemType || {});
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "ProjectPageModelsStructureItem",
props: {
item: { type: Object, required: true },
project: { type: Object, required: true },
isSearchResult: { type: Boolean, required: false }
},
emits: ["model-updated", "create-submodel"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
graphql(`
fragment ProjectPageModelsStructureItem_Project on Project {
id
...ProjectPageModelsActions_Project
...ProjectCardImportFileArea_Project
...UseCanCreateModel_Project
permissions {
canCreateModel {
...FullPermissionCheckResult
}
}
}
`);
graphql(`
fragment SingleLevelModelTreeItem on ModelsTreeItem {
id
name
fullName
model {
...ProjectPageLatestItemsModelItem
...ProjectCardImportFileArea_Model
...ProjectPageModelsCard_Model
accSyncItem {
id
...SyncStatusModelItem_AccSyncItem
}
}
hasChildren
updatedAt
}
`);
const emit = __emit;
const props = __props;
const router = useRouter();
const { formattedRelativeDate, formattedFullDate } = useDateFormatters();
const accSyncItem = computed(
() => props.item.__typename === "ModelsTreeItem" ? props.item.model?.accSyncItem : void 0
);
const isPendingFileUpload = (i) => has(i, "uploadDate");
const importArea = ref(
null
);
const actions = ref(
null
);
const isVersionUploading = ref(false);
const mp = useMixpanel();
const trackFederateModels = () => mp.track("Viewer Action", {
type: "action",
name: "federation",
action: "view-all",
source: "model grid item"
});
const showActionsMenu = ref(false);
const canCreateModel = useCanCreateModel({
project: computed(() => props.project)
});
const canEdit = computed(
() => isPendingFileUpload(props.item) ? void 0 : props.item.model?.permissions.canUpdate
);
const itemType = computed(() => {
if (isPendingFileUpload(props.item)) return 4 /* PendingModel */;
const item = props.item;
if (item.model?.versionCount.totalCount) {
if (hasChildren.value) {
return 3 /* ModelWithVersionsAndSubmodels */;
} else {
return 1 /* ModelWithOnlyVersions */;
}
} else {
if (hasChildren.value) {
return 2 /* ModelWithOnlySubmodels */;
} else {
return 0 /* EmptyModel */;
}
}
});
const hasVersions = computed(
() => [
1 /* ModelWithOnlyVersions */,
3 /* ModelWithVersionsAndSubmodels */
].includes(itemType.value)
);
const hasSubmodels = computed(
() => [
2 /* ModelWithOnlySubmodels */,
3 /* ModelWithVersionsAndSubmodels */
].includes(itemType.value)
);
const name = computed(() => {
if (isPendingFileUpload(props.item)) return props.item.modelName;
return props.isSearchResult ? props.item.fullName : props.item.name;
});
const fullName = computed(
() => isPendingFileUpload(props.item) ? props.item.modelName : props.item.fullName
);
const expanded = useIsModelExpanded({
fullName,
projectId: computed(() => props.project.id)
});
const model = computed(
() => !isPendingFileUpload(props.item) ? props.item.model : null
);
const pendingModel = computed(
() => isPendingFileUpload(props.item) ? props.item : null
);
const pendingVersion = computed(() => {
if (!model.value) {
return null;
}
const lastPendingVersion = model.value.pendingImportedVersions[0];
const lastVersion = model.value.lastVersion?.items[0];
if (!lastVersion || !lastPendingVersion) return lastPendingVersion;
if (dayjs(lastPendingVersion.updatedAt).isBefore(dayjs(lastVersion.createdAt))) {
return null;
}
return lastPendingVersion;
});
const showLastUploadFailed = computed(() => {
if (!model.value) return false;
const lastUpload = model.value.lastUpload?.items[0];
const lastVersion = model.value.lastVersion?.items[0];
if (lastUpload?.convertedStatus !== FileUploadConvertedStatus.Error) return false;
if (!lastVersion) return true;
return dayjs(lastUpload.updatedAt).isAfter(dayjs(lastVersion.createdAt));
});
const hasChildren = computed(
() => props.isSearchResult || isPendingFileUpload(props.item) ? false : props.item.hasChildren
);
const updatedAt = computed(() => {
const date = isPendingFileUpload(props.item) ? props.item.convertedLastUpdate || props.item.uploadDate : props.item.updatedAt;
return {
full: formattedFullDate(date),
relative: formattedRelativeDate(date, { prefix: true })
};
});
const modelLink = computed(() => {
const item = isPendingFileUpload(props.item) ? props.item : props.item.model;
if (!item) return null;
return getModelItemRoute(item);
});
const viewAllUrl = computed(() => {
if (isPendingFileUpload(props.item)) return void 0;
const fullName2 = props.item.fullName;
const encodedFullName = `$${fullName2}`.replace(/\//g, "%2F");
return modelRoute(props.project.id, encodedFullName);
});
const {
result: childrenResult,
refetch: refetchChildren,
loading: childrenLoading
} = useQuery(
projectModelChildrenTreeQuery,
() => ({
projectId: props.project.id,
parentName: isPendingFileUpload(props.item) ? "" : props.item.fullName
}),
() => ({
enabled: hasChildren.value && expanded.value && !isPendingFileUpload(props.item)
})
);
const children = computed(() => childrenResult.value?.project?.modelChildrenTree || []);
const onModelUpdated = () => {
emit("model-updated");
refetchChildren();
};
const triggerVersionUpload = () => {
if (isVersionUploading.value) return;
importArea.value?.triggerPicker();
};
const onVersionUploading = (payload) => {
isVersionUploading.value = payload.isUploading;
};
const onVersionsClick = () => {
if (model.value) {
router.push(modelVersionsRoute(props.project.id, model.value.id));
}
};
const __returned__ = { StructureItemType, emit, props, router, formattedRelativeDate, formattedFullDate, accSyncItem, isPendingFileUpload, importArea, actions, isVersionUploading, mp, trackFederateModels, showActionsMenu, canCreateModel, canEdit, itemType, hasVersions, hasSubmodels, name, fullName, expanded, model, pendingModel, pendingVersion, showLastUploadFailed, hasChildren, updatedAt, modelLink, viewAllUrl, childrenResult, refetchChildren, childrenLoading, children, onModelUpdated, triggerVersionUpload, onVersionUploading, onVersionsClick, get ChevronDownIcon() {
return ChevronDownIcon;
}, get PlusIcon() {
return PlusIcon;
}, get ExclamationCircleIcon() {
return ExclamationCircleIcon;
}, get FolderIcon() {
return FolderIcon;
}, get HorizontalDirection() {
return HorizontalDirection;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createCommentVNode as _createCommentVNode, toDisplayString as _toDisplayString, resolveComponent as _resolveComponent, withCtx as _withCtx, withModifiers as _withModifiers, resolveDirective as _resolveDirective, openBlock as _openBlock, withDirectives as _withDirectives, Fragment as _Fragment, createTextVNode as _createTextVNode, vShow as _vShow, normalizeClass as _normalizeClass, renderList as _renderList } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
key: 0,
class: "group relative bg-foundation w-full p-2 flex flex-row rounded-md transition-all border border-outline-3 items-stretch",
"data-v-inspector": "components/project/page/models/StructureItem.vue:5:5"
};
const _hoisted_2 = {
class: "flex items-center flex-grow order-2 sm:order-1 pl-2 sm:pl-4",
"data-v-inspector": "components/project/page/models/StructureItem.vue:9:7"
};
const _hoisted_3 = {
class: "flex gap-2 items-center",
"data-v-inspector": "components/project/page/models/StructureItem.vue:11:9"
};
const _hoisted_4 = {
class: "text-heading text-foreground hover:text-primary",
"data-v-inspector": "components/project/page/models/StructureItem.vue:13:13"
};
const _hoisted_5 = {
key: 0,
"data-v-inspector": "components/project/page/models/StructureItem.vue:49:9"
};
const _hoisted_6 = {
key: 1,
class: "flex items-center h-full",
"data-v-inspector": "components/project/page/models/StructureItem.vue:67:11"
};
const _hoisted_7 = {
key: 2,
class: "hidden sm:flex items-center gap-x-2",
"data-v-inspector": "components/project/page/models/StructureItem.vue:94:9"
};
const _hoisted_8 = {
class: "text-body-3xs text-foreground-2 text-right",
"data-v-inspector": "components/project/page/models/StructureItem.vue:95:11"
};
const _hoisted_9 = { "data-v-inspector": "components/project/page/models/StructureItem.vue:97:13" };
const _hoisted_10 = {
class: "space-x-2 flex flex-row",
"data-v-inspector": "components/project/page/models/StructureItem.vue:101:11"
};
const _hoisted_11 = {
class: "text-body-xs text-foreground flex items-center space-x-1 pl-2",
"data-v-inspector": "components/project/page/models/StructureItem.vue:102:13"
};
const _hoisted_12 = { "data-v-inspector": "components/project/page/models/StructureItem.vue:104:15" };
const _hoisted_13 = {
key: 0,
"data-v-inspector": "components/project/page/models/StructureItem.vue:106:13"
};
const _hoisted_14 = {
class: "flex gap-2 items-center",
"data-v-inspector": "components/project/page/models/StructureItem.vue:114:13"
};
const _hoisted_15 = {
key: 0,
class: "w-20 h-16",
"data-v-inspector": "components/project/page/models/StructureItem.vue:136:7"
};
const _hoisted_16 = {
key: 1,
class: "border-l-2 border-primary-muted hover:border-primary transition rounded-md",
"data-v-inspector": "components/project/page/models/StructureItem.vue:157:5"
};
const _hoisted_17 = { "data-v-inspector": "components/project/page/models/StructureItem.vue:184:9" };
const _hoisted_18 = {
class: "mx-2 flex items-center hover:text-primary text-foreground-2 h-14",
"data-v-inspector": "components/project/page/models/StructureItem.vue:185:11"
};
const _hoisted_19 = {
class: "ml-2 flex-grow text-left flex items-center gap-2",
"data-v-inspector": "components/project/page/models/StructureItem.vue:193:9"
};
const _hoisted_20 = {
class: "text-heading text-foreground",
"data-v-inspector": "components/project/page/models/StructureItem.vue:194:11"
};
const _hoisted_21 = {
class: "flex flex-col items-end sm:flex-row sm:items-center gap-1 sm:gap-4",
"data-v-inspector": "components/project/page/models/StructureItem.vue:200:9"
};
const _hoisted_22 = {
class: "text-body-2xs text-foreground-2",
"data-v-inspector": "components/project/page/models/StructureItem.vue:213:11"
};
const _hoisted_23 = { "data-v-inspector": "components/project/page/models/StructureItem.vue:215:13" };
const _hoisted_24 = {
key: 1,
class: "pl-8 mt-2 space-y-2",
"data-v-inspector": "components/project/page/models/StructureItem.vue:231:7"
};
const _hoisted_25 = {
key: 0,
class: "mr-8",
"data-v-inspector": "components/project/page/models/StructureItem.vue:235:9"
};
const _hoisted_26 = {
class: "h-20 absolute -ml-8 flex items-center mt-0 mr-1 pl-1",
"data-v-inspector": "components/project/page/models/StructureItem.vue:241:13"
};
const _hoisted_27 = {
key: 2,
class: "mr-8",
"data-v-inspector": "components/project/page/models/StructureItem.vue:254:9"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_NuxtLink = __nuxt_component_0;
const _component_IntegrationsAccSyncStatusModelItem = __nuxt_component_1;
const _component_ProjectPageModelsActions = __nuxt_component_2;
const _component_FormButton = __nuxt_component_3;
const _component_ProjectPendingFileImportStatus = __nuxt_component_4;
const _component_ProjectCardImportFileArea = __nuxt_component_5;
const _component_IconDiscussions = __nuxt_component_6;
const _component_AutomateRunsTriggerStatus = __nuxt_component_7;
const _component_IconVersions = __nuxt_component_8;
const _component_PreviewImage = __nuxt_component_9;
const _component_CommonLoadingBar = __nuxt_component_10;
const _component_ProjectPageModelsStructureItem = __nuxt_component_11;
const _directive_tippy = _resolveDirective("tippy");
const _directive_keyboard_clickable = _resolveDirective("keyboard-clickable");
return _openBlock(), _createElementBlock(
"div",
{
class: "space-y-4 relative",
onMouseleave: _cache[10] || (_cache[10] = ($event) => $setup.showActionsMenu = false),
"data-v-inspector": "components/project/page/models/StructureItem.vue:4:3"
},
[
$setup.itemType !== $setup.StructureItemType.ModelWithOnlySubmodels ? (_openBlock(), _createElementBlock("div", _hoisted_1, [
_createElementVNode("div", _hoisted_2, [
_createCommentVNode(" Name "),
_createElementVNode("div", _hoisted_3, [
_createVNode(_component_NuxtLink, {
to: $setup.modelLink || void 0,
"data-v-inspector": "components/project/page/models/StructureItem.vue:12:11"
}, {
default: _withCtx(() => [
_createElementVNode(
"span",
_hoisted_4,
_toDisplayString($setup.name),
1
/* TEXT */
)
]),
_: 1
/* STABLE */
}, 8, ["to"]),
$setup.model ? (_openBlock(), _createElementBlock(
_Fragment,
{ key: 0 },
[
$setup.showLastUploadFailed ? _withDirectives((_openBlock(), _createBlock(_component_NuxtLink, {
key: 0,
class: "text-body-3xs text-danger hover:text-danger-lighter cursor-pointer",
onClick: _cache[0] || (_cache[0] = _withModifiers(($event) => $setup.actions?.showUploads(), ["stop"])),
"data-v-inspector": "components/project/page/models/StructureItem.vue:18:13"
}, {
default: _withCtx(() => [
_createVNode($setup["ExclamationCircleIcon"], {
class: "w-4 h-4",
"data-v-inspector": "components/project/page/models/StructureItem.vue:25:15"
})
]),
_: 1
/* STABLE */
})), [
[_directive_tippy, "Last upload failed"],
[_directive_keyboard_clickable]
]) : _createCommentVNode("v-if", true),
$setup.accSyncItem ? _withDirectives((_openBlock(), _createBlock(_component_IntegrationsAccSyncStatusModelItem, {
key: 1,
item: $setup.accSyncItem,
"data-v-inspector": "components/project/page/models/StructureItem.vue:27:13"
}, null, 8, ["item"])), [
[_directive_tippy]
]) : _createCommentVNode("v-if", true),
_createVNode(_component_ProjectPageModelsActions, {
ref: "actions",
open: $setup.showActionsMenu,
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showActionsMenu = $event),
model: $setup.model,
project: $props.project,
"menu-position": $setup.itemType === $setup.StructureItemType.EmptyModel ? $setup.HorizontalDirection.Right : $setup.HorizontalDirection.Left,
onClick: _cache[2] || (_cache[2] = _withModifiers(() => {
}, ["stop", "prevent"])),
onModelUpdated: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("model-updated")),
onUploadVersion: $setup.triggerVersionUpload,
"data-v-inspector": "components/project/page/models/StructureItem.vue:32:13"
}, null, 8, ["open", "model", "project", "menu-position"])
],
64
/* STABLE_FRAGMENT */
)) : _createCommentVNode("v-if", true)
]),
_createCommentVNode(" Empty model action "),
$setup.itemType === $setup.StructureItemType.EmptyModel ? _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_5, [
_createVNode(_component_FormButton, {
color: "subtle",
"icon-left": $setup.PlusIcon,
size: "sm",
disabled: !$setup.canCreateModel.canClickCreate.value,
onClick: _cache[4] || (_cache[4] = _withModifiers(($event) => _ctx.$emit("create-submodel", $setup.model?.name || ""), ["stop"])),
"data-v-inspector": "components/project/page/models/StructureItem.vue:53:11"
}, {
default: _withCtx(() => [..._cache[11] || (_cache[11] = [
_createTextVNode(
" submodel ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["icon-left", "disabled"])
])), [
[_directive_tippy, $setup.canCreateModel.cantClickCreateReason.value]
]) : _createCommentVNode("v-if", true),
_createCommentVNode(" Spacer "),
_cache[13] || (_cache[13] = _createElementVNode(
"div",
{
class: "flex-grow",
"data-v-inspector": "components/project/page/models/StructureItem.vue:64:9"
},
null,
-1
/* CACHED */
)),
!$setup.isPendingFileUpload($props.item) ? _withDirectives((_openBlock(), _createElementBlock(
"div",
_hoisted_6,
[
$setup.pendingVersion ? (_openBlock(), _createBlock(_component_ProjectPendingFileImportStatus, {
key: 0,
upload: $setup.pendingVersion,
type: "subversion",
class: "px-4 w-full h-16",
"data-v-inspector": "components/project/page/models/StructureItem.vue:75:13"
}, null, 8, ["upload"])) : _createCommentVNode("v-if", true),
_createCommentVNode(" Import area must exist even if hidden, so that we can trigger uploads from actions "),
_withDirectives(_createVNode(_component_ProjectCardImportFileArea, {
ref: "importArea",
"empty-state-variant": "modelList",
project: $props.project,
"model-name": $props.item.fullName,
model: $props.item.model || void 0,
class: "h-full w-full",
onUploading: $setup.onVersionUploading,
"data-v-inspector": "components/project/page/models/StructureItem.vue:82:13"
}, null, 8, ["project", "model-name", "model"]), [
[_vShow, !$setup.pendingVersion && !$setup.accSyncItem]
])
],
512
/* NEED_PATCH */
)), [
[
_vShow,
$setup.pendingVersion || $setup.itemType === $setup.StructureItemType.EmptyModel || $setup.isVersionUploading
]
]) : $setup.hasVersions ? (_openBlock(), _createElementBlock("div", _hoisted_7, [
_createElementVNode("div", _hoisted_8, [
_cache[12] || (_cache[12] = _createTextVNode(
" Updated ",
-1
/* CACHED */
)),
_withDirectives((_openBlock(), _createElementBlock("span", _hoisted_9, [
_createTextVNode(
_toDisplayString($setup.updatedAt.relative),
1
/* TEXT */
)
])), [
[_directive_tippy, $setup.updatedAt.full]
])
]),
_createElementVNode("div", _hoisted_10, [
_createElementVNode("div", _hoisted_11, [
_createVNode(_component_IconDiscussions, {
class: "w-4 h-4",
"data-v-inspector": "components/project/page/models/StructureItem.vue:103:15"
}),
_createElementVNode(
"span",
_hoisted_12,
_toDisplayString($setup.model?.commentThreadCount.totalCount),
1
/* TEXT */
)
]),
$setup.model?.automationsStatus ? (_openBlock(), _createElementBlock("div", _hoisted_13, [
_createVNode(_component_AutomateRunsTriggerStatus, {
"project-id": $props.project.id,
status: $setup.model.automationsStatus,
"model-id": $setup.model.id,
"data-v-inspector": "components/project/page/models/StructureItem.vue:107:15"
}, null, 8, ["project-id", "status", "model-id"])
])) : _createCommentVNode("v-if", true),
_createElementVNode("div", _hoisted_14, [
!$setup.isPendingFileUpload($props.item) && $setup.model?.id ? (_openBlock(), _createBlock(_component_FormButton, {
key: 0,
rounded: "",
size: "sm",
class: "gap-0.5",
color: "subtle",
onClick: _withModifiers($setup.onVersionsClick, ["stop"]),
"data-v-inspector": "components/project/page/models/StructureItem.vue:115:15"
}, {
default: _withCtx(() => [
_createVNode(_component_IconVersions, {
class: "h-4 w-4",
"data-v-inspector": "components/project/page/models/StructureItem.vue:123:17"
}),
_createTextVNode(
" " + _toDisplayString($setup.model?.versionCount.totalCount),
1
/* TEXT */
)
]),
_: 1
/* STABLE */
})) : _createCommentVNode("v-if", true)
])
])
])) : $setup.pendingModel && $setup.itemType === $setup.StructureItemType.PendingModel ? (_openBlock(), _createBlock(_component_ProjectPendingFileImportStatus, {
key: 3,
upload: $setup.pendingModel,
class: "text-foreground-2 text-sm flex flex-col items-center space-y-1 mr-4",
"data-v-inspector": "components/project/page/models/StructureItem.vue:129:9"
}, null, 8, ["upload"])) : _createCommentVNode("v-if", true)
]),
_createCommentVNode(" Preview or icon section "),
!$setup.isPendingFileUpload($props.item) && $props.item.model?.previewUrl && !$setup.pendingVersion && !$setup.isVersionUploading ? (_openBlock(), _createElementBlock("div", _hoisted_15, [
_createVNode(_component_NuxtLink, {
to: $setup.modelLink || "",
class: "h-full w-full block bg-foundation-page rounded-lg border border-outline-3 hover:border-outline-5 overflow-hidden",
"data-v-inspector": "components/project/page/models/StructureItem.vue:145:9"
}, {
default: _withCtx(() => [
$props.item.model?.previewUrl ? (_openBlock(), _createBlock(_component_PreviewImage, {
key: 0,
"preview-url": $props.item.model.previewUrl,
"data-v-inspector": "components/project/page/models/StructureItem.vue:149:11"
}, null, 8, ["preview-url"])) : _createCommentVNode("v-if", true)
]),
_: 1
/* STABLE */
}, 8, ["to"])
])) : _createCommentVNode("v-if", true)
])) : _createCommentVNode("v-if", true),
_createCommentVNode(" Doubling up for mixed items "),
$setup.hasSubmodels ? (_openBlock(), _createElementBlock("div", _hoisted_16, [
_createCommentVNode(" So that we can trigger View Uploads from Last Upload Failed "),
$setup.model ? (_openBlock(), _createBlock(_component_ProjectPageModelsActions, {
key: 0,
ref: "actions",
open: $setup.showActionsMenu,
"onUpdate:open": _cache[5] || (_cache[5] = ($event) => $setup.showActionsMenu = $event),
model: $setup.model,
project: $props.project,
"menu-position": $setup.itemType === $setup.StructureItemType.EmptyModel ? $setup.HorizontalDirection.Right : $setup.HorizontalDirection.Left,
class: "hidden",
onClick: _cache[6] || (_cache[6] = _withModifiers(() => {
}, ["stop", "prevent"])),
onModelUpdated: _cache[7] || (_cache[7] = ($event) => _ctx.$emit("model-updated")),
onUploadVersion: $setup.triggerVersionUpload,
"data-v-inspector": "components/project/page/models/StructureItem.vue:162:7"
}, null, 8, ["open", "model", "project", "menu-position"])) : _createCommentVNode("v-if", true),
_createElementVNode("button", {
class: "group bg-foundation w-full py-1 pr-2 sm:pr-4 flex items-center rounded-md cursor-pointer hover:border-outline-5 transition-all border border-outline-3 border-l-0",
href: "/test",
onClick: _cache[8] || (_cache[8] = _withModifiers(($event) => $setup.expanded = !$setup.expanded, ["stop"])),
"data-v-inspector": "components/project/page/models/StructureItem.vue:178:7"
}, [
_createCommentVNode(" Icon "),
_createElementVNode("div", _hoisted_17, [
_createElementVNode("div", _hoisted_18, [
_createVNode($setup["ChevronDownIcon"], {
class: _normalizeClass(`w-4 h-4 transition ${$setup.expanded ? "rotate-180" : ""}`),
"data-v-inspector": "components/project/page/models/StructureItem.vue:186:13"
}, null, 8, ["class"])
])
]),
_createCommentVNode(" Name "),
_createVNode($setup["FolderIcon"], {
class: "w-4 h-4 text-foreground",
"data-v-inspector": "components/project/page/models/StructureItem.vue:192:9"
}),
_createElementVNode("div", _hoisted_19, [
_createElementVNode(
"div",
_hoisted_20,
_toDisplayString($setup.name),
1
/* TEXT */
)
]),
_createCommentVNode(" Preview "),
_createElementVNode("div", _hoisted_21, [
_createCommentVNode(" Commented out so that we need to load less data, can be added back "),
_createCommentVNode(' <div\r\n v-for="(child, index) in item.children"\r\n :key="index"\r\n :class="`w-16 h-16 ml-2`"\r\n >\r\n <div\r\n class="w-full h-full rounded-md bg-primary-muted shadow flex items-center justify-center text-blue-500/50 text-xs"\r\n >\r\n {{ child?.name }}\r\n </div>\r\n </div> '),
_createElementVNode("div", _hoisted_22, [
_cache[14] || (_cache[14] = _createTextVNode(
" Updated ",
-1
/* CACHED */
)),
_withDirectives((_openBlock(), _createElementBlock("span", _hoisted_23, [
_createTextVNode(
_toDisplayString($setup.updatedAt.relative),
1
/* TEXT */
)
])), [
[_directive_tippy, $setup.updatedAt.full]
])
]),
_createVNode(_component_FormButton, {
size: "sm",
color: "outline",
to: $setup.viewAllUrl,
disabled: !$setup.viewAllUrl,
onClick: _withModifiers($setup.trackFederateModels, ["stop"]),
"data-v-inspector": "components/project/page/models/StructureItem.vue:219:11"
}, {
default: _withCtx(() => [..._cache[15] || (_cache[15] = [
_createTextVNode(
" View all ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["to", "disabled"])
])
]),
_createCommentVNode(" Children list "),
$setup.hasChildren && $setup.expanded && !$setup.isPendingFileUpload($props.item) ? (_openBlock(), _createElementBlock("div", _hoisted_24, [
$setup.childrenLoading ? (_openBlock(), _createElementBlock("div", _hoisted_25, [
_createVNode(_component_CommonLoadingBar, {
loading: "",
"data-v-inspector": "components/project/page/models/StructureItem.vue:236:11"
})
])) : (_openBlock(true), _createElementBlock(
_Fragment,
{ key: 1 },
_renderList($setup.children, (child) => {
return _openBlock(), _createElementBlock("div", {
key: child.fullName,
class: "flex",
"data-v-inspector": "components/project/page/models/StructureItem.vue:240:11"
}, [
_createElementVNode("div", _hoisted_26, [
_createVNode($setup["ChevronDownIcon"], {
class: "w-4 h-4 rotate-45 text-foreground-2",
"data-v-inspector": "components/project/page/models/StructureItem.vue:242:15"
})
]),
_createVNode(_component_ProjectPageModelsStructureItem, {
item: child,
project: $props.project,
class: "flex-grow",
onModelUpdated: $setup.onModelUpdated,
onCreateSubmodel: _cache[9] || (_cache[9] = ($event) => $setup.emit("create-submodel", $event)),
"data-v-inspector": "components/project/page/models/StructureItem.vue:245:13"
}, null, 8, ["item", "project"])
]);
}),
128
/* KEYED_FRAGMENT */
)),
$setup.canEdit ? (_openBlock(), _createElementBlock("div", _hoisted_27)) : _createCommentVNode("v-if", true)
])) : _createCommentVNode("v-if", true)
])) : _createCommentVNode("v-if", true)
],
32
/* NEED_HYDRATION */
);
}
_sfc_main.__hmrId = "ea0216ee";
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/project/page/models/StructureItem.vue"]]);
//# sourceMappingURL=data:application/json;base64,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QkFBaUI7QUFBQTttQ0FJM0M7QUFBQSxZQVlNO0FBQUE7QUFBQSx3QkFaZSxpQkFBUSxDQUFqQixVQUFLO21DQUFqQixvQkFZTTtBQUFBLGdCQVowQixLQUFLLE1BQU07QUFBQSxnQkFBVSxPQUFNO0FBQUEsZ0JBQU8sb0JBQWlCO0FBQUE7Z0JBQ2pGLG9CQUVNLE9BRk4sYUFFTTtBQUFBLGtCQURKLGFBQTBJO0FBQUEsb0JBQXpILE9BQU07QUFBQSxvQkFBc0Msb0JBQWlCO0FBQUE7O2dCQUdoRixhQU1FO0FBQUEsa0JBTEMsTUFBTTtBQUFBLGtCQUNOLFNBQVM7QUFBQSxrQkFDVixPQUFNO0FBQUEsa0JBQ0wsZ0JBQWU7QUFBQSxrQkFDZixrQkFBZSxzQ0FBRSxZQUFJLG1CQUFvQixNQUFNO0FBQUEsa0JBQUcsb0JBQWlCO0FBQUE7Ozs7OztVQUkvRCxnQ0FBWCxvQkFBaUgsT0FBakgsV0FBaUgiLCJuYW1lcyI6WyJTdHJ1Y3R1cmVJdGVtVHlwZSIsImZ1bGxOYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIlN0cnVjdHVyZUl0ZW0udnVlIl0sInNvdXJjZXNDb250ZW50IjpbIjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgLS0+XHJcbjwhLS0gZXNsaW50LWRpc2FibGUgdnVlanMtYWNjZXNzaWJpbGl0eS9tb3VzZS1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInNwYWNlLXktNCByZWxhdGl2ZVwiIEBtb3VzZWxlYXZlPVwic2hvd0FjdGlvbnNNZW51ID0gZmFsc2VcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjQ6M1wiPlxyXG4gICAgPGRpdlxyXG4gICAgICB2LWlmPVwiaXRlbVR5cGUgIT09IFN0cnVjdHVyZUl0ZW1UeXBlLk1vZGVsV2l0aE9ubHlTdWJtb2RlbHNcIlxyXG4gICAgICBjbGFzcz1cImdyb3VwIHJlbGF0aXZlIGJnLWZvdW5kYXRpb24gdy1mdWxsIHAtMiBmbGV4IGZsZXgtcm93IHJvdW5kZWQtbWQgdHJhbnNpdGlvbi1hbGwgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgaXRlbXMtc3RyZXRjaFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6NTo1XCJcclxuICAgID5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGZsZXgtZ3JvdyBvcmRlci0yIHNtOm9yZGVyLTEgcGwtMiBzbTpwbC00XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZTo5OjdcIj5cclxuICAgICAgICA8IS0tIE5hbWUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTIgaXRlbXMtY2VudGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxMTo5XCI+XHJcbiAgICAgICAgICA8TnV4dExpbmsgOnRvPVwibW9kZWxMaW5rIHx8IHVuZGVmaW5lZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTI6MTFcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWhlYWRpbmcgdGV4dC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtcHJpbWFyeVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTM6MTNcIj5cclxuICAgICAgICAgICAgICB7eyBuYW1lIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvTnV4dExpbms+XHJcbiAgICAgICAgICA8dGVtcGxhdGUgdi1pZj1cIm1vZGVsXCI+XHJcbiAgICAgICAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgICAgICAgIHYtaWY9XCJzaG93TGFzdFVwbG9hZEZhaWxlZFwiXHJcbiAgICAgICAgICAgICAgdi10aXBweT1cIidMYXN0IHVwbG9hZCBmYWlsZWQnXCJcclxuICAgICAgICAgICAgICB2LWtleWJvYXJkLWNsaWNrYWJsZVxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1ib2R5LTN4cyB0ZXh0LWRhbmdlciBob3Zlcjp0ZXh0LWRhbmdlci1saWdodGVyIGN1cnNvci1wb2ludGVyXCJcclxuICAgICAgICAgICAgICBAY2xpY2suc3RvcD1cImFjdGlvbnM/LnNob3dVcGxvYWRzKClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjE4OjEzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxFeGNsYW1hdGlvbkNpcmNsZUljb24gY2xhc3M9XCJ3LTQgaC00XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToyNToxNVwiIC8+XHJcbiAgICAgICAgICAgIDwvTnV4dExpbms+XHJcbiAgICAgICAgICAgIDxJbnRlZ3JhdGlvbnNBY2NTeW5jU3RhdHVzTW9kZWxJdGVtXHJcbiAgICAgICAgICAgICAgdi1pZj1cImFjY1N5bmNJdGVtXCJcclxuICAgICAgICAgICAgICB2LXRpcHB5PVwiXCJcclxuICAgICAgICAgICAgICA6aXRlbT1cImFjY1N5bmNJdGVtXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToyNzoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNcclxuICAgICAgICAgICAgICByZWY9XCJhY3Rpb25zXCJcclxuICAgICAgICAgICAgICB2LW1vZGVsOm9wZW49XCJzaG93QWN0aW9uc01lbnVcIlxyXG4gICAgICAgICAgICAgIDptb2RlbD1cIm1vZGVsXCJcclxuICAgICAgICAgICAgICA6cHJvamVjdD1cInByb2plY3RcIlxyXG4gICAgICAgICAgICAgIDptZW51LXBvc2l0aW9uPVwiXHJcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSA9PT0gU3RydWN0dXJlSXRlbVR5cGUuRW1wdHlNb2RlbFxyXG4gICAgICAgICAgICAgICAgICA/IEhvcml6b250YWxEaXJlY3Rpb24uUmlnaHRcclxuICAgICAgICAgICAgICAgICAgOiBIb3Jpem9udGFsRGlyZWN0aW9uLkxlZnRcclxuICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICAgICAgICBAbW9kZWwtdXBkYXRlZD1cIiRlbWl0KCdtb2RlbC11cGRhdGVkJylcIlxyXG4gICAgICAgICAgICAgIEB1cGxvYWQtdmVyc2lvbj1cInRyaWdnZXJWZXJzaW9uVXBsb2FkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZTozMjoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gRW1wdHkgbW9kZWwgYWN0aW9uIC0tPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtaWY9XCJpdGVtVHlwZSA9PT0gU3RydWN0dXJlSXRlbVR5cGUuRW1wdHlNb2RlbFwiXHJcbiAgICAgICAgICB2LXRpcHB5PVwiY2FuQ3JlYXRlTW9kZWwuY2FudENsaWNrQ3JlYXRlUmVhc29uLnZhbHVlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZTo0OTo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgIDppY29uLWxlZnQ9XCJQbHVzSWNvblwiXHJcbiAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFjYW5DcmVhdGVNb2RlbC5jYW5DbGlja0NyZWF0ZS52YWx1ZVwiXHJcbiAgICAgICAgICAgIEBjbGljay5zdG9wPVwiJGVtaXQoJ2NyZWF0ZS1zdWJtb2RlbCcsIG1vZGVsPy5uYW1lIHx8ICcnKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6NTM6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBzdWJtb2RlbFxyXG4gICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gU3BhY2VyIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3dcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjY0OjlcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgPHRlbXBsYXRlIHYtaWY9XCIhaXNQZW5kaW5nRmlsZVVwbG9hZChpdGVtKVwiPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LXNob3c9XCJcclxuICAgICAgICAgICAgICBwZW5kaW5nVmVyc2lvbiB8fFxyXG4gICAgICAgICAgICAgIGl0ZW1UeXBlID09PSBTdHJ1Y3R1cmVJdGVtVHlwZS5FbXB0eU1vZGVsIHx8XHJcbiAgICAgICAgICAgICAgaXNWZXJzaW9uVXBsb2FkaW5nXHJcbiAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgaC1mdWxsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZTo2NzoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxQcm9qZWN0UGVuZGluZ0ZpbGVJbXBvcnRTdGF0dXNcclxuICAgICAgICAgICAgICB2LWlmPVwicGVuZGluZ1ZlcnNpb25cIlxyXG4gICAgICAgICAgICAgIDp1cGxvYWQ9XCJwZW5kaW5nVmVyc2lvblwiXHJcbiAgICAgICAgICAgICAgdHlwZT1cInN1YnZlcnNpb25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicHgtNCB3LWZ1bGwgaC0xNlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6NzU6MTNcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8IS0tIEltcG9ydCBhcmVhIG11c3QgZXhpc3QgZXZlbiBpZiBoaWRkZW4sIHNvIHRoYXQgd2UgY2FuIHRyaWdnZXIgdXBsb2FkcyBmcm9tIGFjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgIDxQcm9qZWN0Q2FyZEltcG9ydEZpbGVBcmVhXHJcbiAgICAgICAgICAgICAgdi1zaG93PVwiIXBlbmRpbmdWZXJzaW9uICYmICFhY2NTeW5jSXRlbVwiXHJcbiAgICAgICAgICAgICAgcmVmPVwiaW1wb3J0QXJlYVwiXHJcbiAgICAgICAgICAgICAgZW1wdHktc3RhdGUtdmFyaWFudD1cIm1vZGVsTGlzdFwiXHJcbiAgICAgICAgICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCJcclxuICAgICAgICAgICAgICA6bW9kZWwtbmFtZT1cIml0ZW0uZnVsbE5hbWVcIlxyXG4gICAgICAgICAgICAgIDptb2RlbD1cIml0ZW0ubW9kZWwgfHwgdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImgtZnVsbCB3LWZ1bGxcIlxyXG4gICAgICAgICAgICAgIEB1cGxvYWRpbmc9XCJvblZlcnNpb25VcGxvYWRpbmdcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjgyOjEzXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiB2LWVsc2UtaWY9XCJoYXNWZXJzaW9uc1wiIGNsYXNzPVwiaGlkZGVuIHNtOmZsZXggaXRlbXMtY2VudGVyIGdhcC14LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjk0OjlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJvZHktM3hzIHRleHQtZm9yZWdyb3VuZC0yIHRleHQtcmlnaHRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjk1OjExXCI+XHJcbiAgICAgICAgICAgIFVwZGF0ZWRcclxuICAgICAgICAgICAgPHNwYW4gdi10aXBweT1cInVwZGF0ZWRBdC5mdWxsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZTo5NzoxM1wiPlxyXG4gICAgICAgICAgICAgIHt7IHVwZGF0ZWRBdC5yZWxhdGl2ZSB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZS14LTIgZmxleCBmbGV4LXJvd1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTAxOjExXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJvZHkteHMgdGV4dC1mb3JlZ3JvdW5kIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMSBwbC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxMDI6MTNcIj5cclxuICAgICAgICAgICAgICA8SWNvbkRpc2N1c3Npb25zIGNsYXNzPVwidy00IGgtNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTAzOjE1XCIgLz5cclxuICAgICAgICAgICAgICA8c3BhbiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjEwNDoxNVwiPnt7IG1vZGVsPy5jb21tZW50VGhyZWFkQ291bnQudG90YWxDb3VudCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgdi1pZj1cIm1vZGVsPy5hdXRvbWF0aW9uc1N0YXR1c1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTA2OjEzXCI+XHJcbiAgICAgICAgICAgICAgPEF1dG9tYXRlUnVuc1RyaWdnZXJTdGF0dXNcclxuICAgICAgICAgICAgICAgIDpwcm9qZWN0LWlkPVwicHJvamVjdC5pZFwiXHJcbiAgICAgICAgICAgICAgICA6c3RhdHVzPVwibW9kZWwuYXV0b21hdGlvbnNTdGF0dXNcIlxyXG4gICAgICAgICAgICAgICAgOm1vZGVsLWlkPVwibW9kZWwuaWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjEwNzoxNVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMiBpdGVtcy1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjExNDoxM1wiPlxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LWlmPVwiIWlzUGVuZGluZ0ZpbGVVcGxvYWQoaXRlbSkgJiYgbW9kZWw/LmlkXCJcclxuICAgICAgICAgICAgICAgIHJvdW5kZWRcclxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdhcC0wLjVcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJvblZlcnNpb25zQ2xpY2tcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjExNToxNVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPEljb25WZXJzaW9ucyBjbGFzcz1cImgtNCB3LTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjEyMzoxN1wiIC8+XHJcbiAgICAgICAgICAgICAgICB7eyBtb2RlbD8udmVyc2lvbkNvdW50LnRvdGFsQ291bnQgfX1cclxuICAgICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPFByb2plY3RQZW5kaW5nRmlsZUltcG9ydFN0YXR1c1xyXG4gICAgICAgICAgdi1lbHNlLWlmPVwicGVuZGluZ01vZGVsICYmIGl0ZW1UeXBlID09PSBTdHJ1Y3R1cmVJdGVtVHlwZS5QZW5kaW5nTW9kZWxcIlxyXG4gICAgICAgICAgOnVwbG9hZD1cInBlbmRpbmdNb2RlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cInRleHQtZm9yZWdyb3VuZC0yIHRleHQtc20gZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgc3BhY2UteS0xIG1yLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjEyOTo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBQcmV2aWV3IG9yIGljb24gc2VjdGlvbiAtLT5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCJcclxuICAgICAgICAgICFpc1BlbmRpbmdGaWxlVXBsb2FkKGl0ZW0pICYmXHJcbiAgICAgICAgICBpdGVtLm1vZGVsPy5wcmV2aWV3VXJsICYmXHJcbiAgICAgICAgICAhcGVuZGluZ1ZlcnNpb24gJiZcclxuICAgICAgICAgICFpc1ZlcnNpb25VcGxvYWRpbmdcclxuICAgICAgICBcIlxyXG4gICAgICAgIGNsYXNzPVwidy0yMCBoLTE2XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxMzY6N1wiXHJcbiAgICAgID5cclxuICAgICAgICA8TnV4dExpbmtcclxuICAgICAgICAgIDp0bz1cIm1vZGVsTGluayB8fCAnJ1wiXHJcbiAgICAgICAgICBjbGFzcz1cImgtZnVsbCB3LWZ1bGwgYmxvY2sgYmctZm91bmRhdGlvbi1wYWdlIHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci1vdXRsaW5lLTMgaG92ZXI6Ym9yZGVyLW91dGxpbmUtNSBvdmVyZmxvdy1oaWRkZW5cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjE0NTo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8UHJldmlld0ltYWdlXHJcbiAgICAgICAgICAgIHYtaWY9XCJpdGVtLm1vZGVsPy5wcmV2aWV3VXJsXCJcclxuICAgICAgICAgICAgOnByZXZpZXctdXJsPVwiaXRlbS5tb2RlbC5wcmV2aWV3VXJsXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxNDk6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L051eHRMaW5rPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSBEb3VibGluZyB1cCBmb3IgbWl4ZWQgaXRlbXMgLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgIHYtaWY9XCJoYXNTdWJtb2RlbHNcIlxyXG4gICAgICBjbGFzcz1cImJvcmRlci1sLTIgYm9yZGVyLXByaW1hcnktbXV0ZWQgaG92ZXI6Ym9yZGVyLXByaW1hcnkgdHJhbnNpdGlvbiByb3VuZGVkLW1kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxNTc6NVwiXHJcbiAgICA+XHJcbiAgICAgIDwhLS0gU28gdGhhdCB3ZSBjYW4gdHJpZ2dlciBWaWV3IFVwbG9hZHMgZnJvbSBMYXN0IFVwbG9hZCBGYWlsZWQgLS0+XHJcbiAgICAgIDxQcm9qZWN0UGFnZU1vZGVsc0FjdGlvbnNcclxuICAgICAgICB2LWlmPVwibW9kZWxcIlxyXG4gICAgICAgIHJlZj1cImFjdGlvbnNcIlxyXG4gICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dBY3Rpb25zTWVudVwiXHJcbiAgICAgICAgOm1vZGVsPVwibW9kZWxcIlxyXG4gICAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiXHJcbiAgICAgICAgOm1lbnUtcG9zaXRpb249XCJcclxuICAgICAgICAgIGl0ZW1UeXBlID09PSBTdHJ1Y3R1cmVJdGVtVHlwZS5FbXB0eU1vZGVsXHJcbiAgICAgICAgICAgID8gSG9yaXpvbnRhbERpcmVjdGlvbi5SaWdodFxyXG4gICAgICAgICAgICA6IEhvcml6b250YWxEaXJlY3Rpb24uTGVmdFxyXG4gICAgICAgIFwiXHJcbiAgICAgICAgY2xhc3M9XCJoaWRkZW5cIlxyXG4gICAgICAgIEBjbGljay5zdG9wLnByZXZlbnRcclxuICAgICAgICBAbW9kZWwtdXBkYXRlZD1cIiRlbWl0KCdtb2RlbC11cGRhdGVkJylcIlxyXG4gICAgICAgIEB1cGxvYWQtdmVyc2lvbj1cInRyaWdnZXJWZXJzaW9uVXBsb2FkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxNjI6N1wiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cImdyb3VwIGJnLWZvdW5kYXRpb24gdy1mdWxsIHB5LTEgcHItMiBzbTpwci00IGZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtbWQgY3Vyc29yLXBvaW50ZXIgaG92ZXI6Ym9yZGVyLW91dGxpbmUtNSB0cmFuc2l0aW9uLWFsbCBib3JkZXIgYm9yZGVyLW91dGxpbmUtMyBib3JkZXItbC0wXCJcclxuICAgICAgICBocmVmPVwiL3Rlc3RcIlxyXG4gICAgICAgIEBjbGljay5zdG9wPVwiZXhwYW5kZWQgPSAhZXhwYW5kZWRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjE3ODo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDwhLS0gSWNvbiAtLT5cclxuICAgICAgICA8ZGl2IGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTg0OjlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIGZsZXggaXRlbXMtY2VudGVyIGhvdmVyOnRleHQtcHJpbWFyeSB0ZXh0LWZvcmVncm91bmQtMiBoLTE0XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToxODU6MTFcIj5cclxuICAgICAgICAgICAgPENoZXZyb25Eb3duSWNvblxyXG4gICAgICAgICAgICAgIDpjbGFzcz1cImB3LTQgaC00IHRyYW5zaXRpb24gJHtleHBhbmRlZCA/ICdyb3RhdGUtMTgwJyA6ICcnfWBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjE4NjoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIE5hbWUgLS0+XHJcbiAgICAgICAgPEZvbGRlckljb24gY2xhc3M9XCJ3LTQgaC00IHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTkyOjlcIiAvPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yIGZsZXgtZ3JvdyB0ZXh0LWxlZnQgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjE5Mzo5XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oZWFkaW5nIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MTk0OjExXCI+XHJcbiAgICAgICAgICAgIHt7IG5hbWUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFByZXZpZXcgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtZW5kIHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBnYXAtMSBzbTpnYXAtNFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MjAwOjlcIj5cclxuICAgICAgICAgIDwhLS0gQ29tbWVudGVkIG91dCBzbyB0aGF0IHdlIG5lZWQgdG8gbG9hZCBsZXNzIGRhdGEsIGNhbiBiZSBhZGRlZCBiYWNrIC0tPlxyXG4gICAgICAgICAgPCEtLSA8ZGl2XHJcbiAgICAgICAgICAgIHYtZm9yPVwiKGNoaWxkLCBpbmRleCkgaW4gaXRlbS5jaGlsZHJlblwiXHJcbiAgICAgICAgICAgIDprZXk9XCJpbmRleFwiXHJcbiAgICAgICAgICAgIDpjbGFzcz1cImB3LTE2IGgtMTYgbWwtMmBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHJvdW5kZWQtbWQgYmctcHJpbWFyeS1tdXRlZCBzaGFkb3cgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1ibHVlLTUwMC81MCB0ZXh0LXhzXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIHt7IGNoaWxkPy5uYW1lIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjIxMzoxMVwiPlxyXG4gICAgICAgICAgICBVcGRhdGVkXHJcbiAgICAgICAgICAgIDxzcGFuIHYtdGlwcHk9XCJ1cGRhdGVkQXQuZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MjE1OjEzXCI+XHJcbiAgICAgICAgICAgICAge3sgdXBkYXRlZEF0LnJlbGF0aXZlIH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgOnRvPVwidmlld0FsbFVybFwiXHJcbiAgICAgICAgICAgIDpkaXNhYmxlZD1cIiF2aWV3QWxsVXJsXCJcclxuICAgICAgICAgICAgQGNsaWNrLnN0b3A9XCJ0cmFja0ZlZGVyYXRlTW9kZWxzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToyMTk6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICBWaWV3IGFsbFxyXG4gICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPCEtLSBDaGlsZHJlbiBsaXN0IC0tPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgdi1pZj1cImhhc0NoaWxkcmVuICYmIGV4cGFuZGVkICYmICFpc1BlbmRpbmdGaWxlVXBsb2FkKGl0ZW0pXCJcclxuICAgICAgICBjbGFzcz1cInBsLTggbXQtMiBzcGFjZS15LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjIzMTo3XCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cImNoaWxkcmVuTG9hZGluZ1wiIGNsYXNzPVwibXItOFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MjM1OjlcIj5cclxuICAgICAgICAgIDxDb21tb25Mb2FkaW5nQmFyIGxvYWRpbmcgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToyMzY6MTFcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8dGVtcGxhdGUgdi1lbHNlPlxyXG4gICAgICAgICAgPGRpdiB2LWZvcj1cImNoaWxkIGluIGNoaWxkcmVuXCIgOmtleT1cImNoaWxkLmZ1bGxOYW1lXCIgY2xhc3M9XCJmbGV4XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9TdHJ1Y3R1cmVJdGVtLnZ1ZToyNDA6MTFcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtMjAgYWJzb2x1dGUgLW1sLTggZmxleCBpdGVtcy1jZW50ZXIgbXQtMCBtci0xIHBsLTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjI0MToxM1wiPlxyXG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93bkljb24gY2xhc3M9XCJ3LTQgaC00IHJvdGF0ZS00NSB0ZXh0LWZvcmVncm91bmQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvU3RydWN0dXJlSXRlbS52dWU6MjQyOjE1XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8UHJvamVjdFBhZ2VNb2RlbHNTdHJ1Y3R1cmVJdGVtXHJcbiAgICAgICAgICAgICAgOml0ZW09XCJjaGlsZFwiXHJcbiAgICAgICAgICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtZ3Jvd1wiXHJcbiAgICAgICAgICAgICAgQG1vZGVsLXVwZGF0ZWQ9XCJvbk1vZGVsVXBkYXRlZFwiXHJcbiAgICAgICAgICAgICAgQGNyZWF0ZS1zdWJtb2RlbD1cImVtaXQoJ2NyZWF0ZS1zdWJtb2RlbCcsICRldmVudClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjI0NToxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgdi1pZj1cImNhbkVkaXRcIiBjbGFzcz1cIm1yLThcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlOjI1NDo5XCI+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgbGFuZz1cInRzXCIgc2V0dXA+XHJcbmltcG9ydCB7IG1vZGVsVmVyc2lvbnNSb3V0ZSwgbW9kZWxSb3V0ZSB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgQ2hldnJvbkRvd25JY29uLCBQbHVzSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzIwL3NvbGlkJ1xyXG5pbXBvcnQgeyBFeGNsYW1hdGlvbkNpcmNsZUljb24sIEZvbGRlckljb24gfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5pbXBvcnQgdHlwZSB7XHJcbiAgUGVuZGluZ0ZpbGVVcGxvYWRGcmFnbWVudCxcclxuICBQcm9qZWN0UGFnZU1vZGVsc1N0cnVjdHVyZUl0ZW1fUHJvamVjdEZyYWdtZW50LFxyXG4gIFNpbmdsZUxldmVsTW9kZWxUcmVlSXRlbUZyYWdtZW50XHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwnXHJcbmltcG9ydCB7IHVzZVF1ZXJ5IH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHsgcHJvamVjdE1vZGVsQ2hpbGRyZW5UcmVlUXVlcnkgfSBmcm9tICd+fi9saWIvcHJvamVjdHMvZ3JhcGhxbC9xdWVyaWVzJ1xyXG5pbXBvcnQgeyBoYXMgfSBmcm9tICdsb2Rhc2gtZXMnXHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IHVzZUlzTW9kZWxFeHBhbmRlZCB9IGZyb20gJ35+L2xpYi9wcm9qZWN0cy9jb21wb3NhYmxlcy9tb2RlbHMnXHJcbmltcG9ydCB7IEhvcml6b250YWxEaXJlY3Rpb24gfSBmcm9tICd+fi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3dpbmRvdydcclxuaW1wb3J0IHsgdXNlQ2FuQ3JlYXRlTW9kZWwgfSBmcm9tICd+L2xpYi9wcm9qZWN0cy9jb21wb3NhYmxlcy9wZXJtaXNzaW9ucydcclxuaW1wb3J0IHR5cGUgeyBGaWxlQXJlYVVwbG9hZGluZ1BheWxvYWQgfSBmcm9tICd+L2xpYi9mb3JtL2hlbHBlcnMvZmlsZVVwbG9hZCdcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkL2Jsb2JzJ1xyXG5pbXBvcnQgeyBnZXRNb2RlbEl0ZW1Sb3V0ZSB9IGZyb20gJ34vbGliL3Byb2plY3RzL2hlbHBlcnMvbW9kZWxzJ1xyXG5cclxuLyoqXHJcbiAqIFRPRE86IFRoZSB0ZW1wbGF0ZSBpbiB0aGlzIGZpbGUgaXMgYSBjb21wbGV0ZSBtZXNzLCBuZWVkcyByZWZhY3RvcmluZ1xyXG4gKi9cclxuXHJcbmVudW0gU3RydWN0dXJlSXRlbVR5cGUge1xyXG4gIEVtcHR5TW9kZWwsIC8vIGVtcHR5TW9kZWxcclxuICBNb2RlbFdpdGhPbmx5VmVyc2lvbnMsIC8vIGZ1bGxNb2RlbFxyXG4gIE1vZGVsV2l0aE9ubHlTdWJtb2RlbHMsIC8vIGdyb3VwXHJcbiAgTW9kZWxXaXRoVmVyc2lvbnNBbmRTdWJtb2RlbHMsIC8vIG1peGVkXHJcbiAgUGVuZGluZ01vZGVsXHJcbn1cclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RQYWdlTW9kZWxzU3RydWN0dXJlSXRlbV9Qcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIC4uLlByb2plY3RQYWdlTW9kZWxzQWN0aW9uc19Qcm9qZWN0XHJcbiAgICAuLi5Qcm9qZWN0Q2FyZEltcG9ydEZpbGVBcmVhX1Byb2plY3RcclxuICAgIC4uLlVzZUNhbkNyZWF0ZU1vZGVsX1Byb2plY3RcclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuQ3JlYXRlTW9kZWwge1xyXG4gICAgICAgIC4uLkZ1bGxQZXJtaXNzaW9uQ2hlY2tSZXN1bHRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFNpbmdsZUxldmVsTW9kZWxUcmVlSXRlbSBvbiBNb2RlbHNUcmVlSXRlbSB7XHJcbiAgICBpZFxyXG4gICAgbmFtZVxyXG4gICAgZnVsbE5hbWVcclxuICAgIG1vZGVsIHtcclxuICAgICAgLi4uUHJvamVjdFBhZ2VMYXRlc3RJdGVtc01vZGVsSXRlbVxyXG4gICAgICAuLi5Qcm9qZWN0Q2FyZEltcG9ydEZpbGVBcmVhX01vZGVsXHJcbiAgICAgIC4uLlByb2plY3RQYWdlTW9kZWxzQ2FyZF9Nb2RlbFxyXG4gICAgICBhY2NTeW5jSXRlbSB7XHJcbiAgICAgICAgaWRcclxuICAgICAgICAuLi5TeW5jU3RhdHVzTW9kZWxJdGVtX0FjY1N5bmNJdGVtXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGhhc0NoaWxkcmVuXHJcbiAgICB1cGRhdGVkQXRcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAnbW9kZWwtdXBkYXRlZCcpOiB2b2lkXHJcbiAgKGU6ICdjcmVhdGUtc3VibW9kZWwnLCBwYXJlbnRNb2RlbE5hbWU6IHN0cmluZyk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgaXRlbTogU2luZ2xlTGV2ZWxNb2RlbFRyZWVJdGVtRnJhZ21lbnQgfCBQZW5kaW5nRmlsZVVwbG9hZEZyYWdtZW50XHJcbiAgcHJvamVjdDogUHJvamVjdFBhZ2VNb2RlbHNTdHJ1Y3R1cmVJdGVtX1Byb2plY3RGcmFnbWVudFxyXG4gIGlzU2VhcmNoUmVzdWx0PzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKVxyXG5jb25zdCB7IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZSwgZm9ybWF0dGVkRnVsbERhdGUgfSA9IHVzZURhdGVGb3JtYXR0ZXJzKClcclxuXHJcbmNvbnN0IGFjY1N5bmNJdGVtID0gY29tcHV0ZWQoKCkgPT5cclxuICBwcm9wcy5pdGVtLl9fdHlwZW5hbWUgPT09ICdNb2RlbHNUcmVlSXRlbScgPyBwcm9wcy5pdGVtLm1vZGVsPy5hY2NTeW5jSXRlbSA6IHVuZGVmaW5lZFxyXG4pXHJcblxyXG5jb25zdCBpc1BlbmRpbmdGaWxlVXBsb2FkID0gKFxyXG4gIGk6IFNpbmdsZUxldmVsTW9kZWxUcmVlSXRlbUZyYWdtZW50IHwgUGVuZGluZ0ZpbGVVcGxvYWRGcmFnbWVudFxyXG4pOiBpIGlzIFBlbmRpbmdGaWxlVXBsb2FkRnJhZ21lbnQgPT4gaGFzKGksICd1cGxvYWREYXRlJylcclxuXHJcbmNvbnN0IGltcG9ydEFyZWEgPSByZWYoXHJcbiAgbnVsbCBhcyBOdWxsYWJsZTx7XHJcbiAgICB0cmlnZ2VyUGlja2VyOiAoKSA9PiB2b2lkXHJcbiAgfT5cclxuKVxyXG5jb25zdCBhY3Rpb25zID0gcmVmKFxyXG4gIG51bGwgYXMgTnVsbGFibGU8e1xyXG4gICAgc2hvd1VwbG9hZHM6ICgpID0+IHZvaWRcclxuICB9PlxyXG4pXHJcbmNvbnN0IGlzVmVyc2lvblVwbG9hZGluZyA9IHJlZihmYWxzZSlcclxuXHJcbmNvbnN0IG1wID0gdXNlTWl4cGFuZWwoKVxyXG5jb25zdCB0cmFja0ZlZGVyYXRlTW9kZWxzID0gKCkgPT5cclxuICBtcC50cmFjaygnVmlld2VyIEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ2ZlZGVyYXRpb24nLFxyXG4gICAgYWN0aW9uOiAndmlldy1hbGwnLFxyXG4gICAgc291cmNlOiAnbW9kZWwgZ3JpZCBpdGVtJ1xyXG4gIH0pXHJcblxyXG5jb25zdCBzaG93QWN0aW9uc01lbnUgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBjYW5DcmVhdGVNb2RlbCA9IHVzZUNhbkNyZWF0ZU1vZGVsKHtcclxuICBwcm9qZWN0OiBjb21wdXRlZCgoKSA9PiBwcm9wcy5wcm9qZWN0KVxyXG59KVxyXG5cclxuY29uc3QgY2FuRWRpdCA9IGNvbXB1dGVkKCgpID0+XHJcbiAgaXNQZW5kaW5nRmlsZVVwbG9hZChwcm9wcy5pdGVtKSA/IHVuZGVmaW5lZCA6IHByb3BzLml0ZW0ubW9kZWw/LnBlcm1pc3Npb25zLmNhblVwZGF0ZVxyXG4pXHJcblxyXG5jb25zdCBpdGVtVHlwZSA9IGNvbXB1dGVkPFN0cnVjdHVyZUl0ZW1UeXBlPigoKSA9PiB7XHJcbiAgaWYgKGlzUGVuZGluZ0ZpbGVVcGxvYWQocHJvcHMuaXRlbSkpIHJldHVybiBTdHJ1Y3R1cmVJdGVtVHlwZS5QZW5kaW5nTW9kZWxcclxuXHJcbiAgY29uc3QgaXRlbSA9IHByb3BzLml0ZW1cclxuICBpZiAoaXRlbS5tb2RlbD8udmVyc2lvbkNvdW50LnRvdGFsQ291bnQpIHtcclxuICAgIGlmIChoYXNDaGlsZHJlbi52YWx1ZSkge1xyXG4gICAgICByZXR1cm4gU3RydWN0dXJlSXRlbVR5cGUuTW9kZWxXaXRoVmVyc2lvbnNBbmRTdWJtb2RlbHNcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBTdHJ1Y3R1cmVJdGVtVHlwZS5Nb2RlbFdpdGhPbmx5VmVyc2lvbnNcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgaWYgKGhhc0NoaWxkcmVuLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBTdHJ1Y3R1cmVJdGVtVHlwZS5Nb2RlbFdpdGhPbmx5U3VibW9kZWxzXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gU3RydWN0dXJlSXRlbVR5cGUuRW1wdHlNb2RlbFxyXG4gICAgfVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGhhc1ZlcnNpb25zID0gY29tcHV0ZWQoKCkgPT5cclxuICBbXHJcbiAgICBTdHJ1Y3R1cmVJdGVtVHlwZS5Nb2RlbFdpdGhPbmx5VmVyc2lvbnMsXHJcbiAgICBTdHJ1Y3R1cmVJdGVtVHlwZS5Nb2RlbFdpdGhWZXJzaW9uc0FuZFN1Ym1vZGVsc1xyXG4gIF0uaW5jbHVkZXMoaXRlbVR5cGUudmFsdWUpXHJcbilcclxuY29uc3QgaGFzU3VibW9kZWxzID0gY29tcHV0ZWQoKCkgPT5cclxuICBbXHJcbiAgICBTdHJ1Y3R1cmVJdGVtVHlwZS5Nb2RlbFdpdGhPbmx5U3VibW9kZWxzLFxyXG4gICAgU3RydWN0dXJlSXRlbVR5cGUuTW9kZWxXaXRoVmVyc2lvbnNBbmRTdWJtb2RlbHNcclxuICBdLmluY2x1ZGVzKGl0ZW1UeXBlLnZhbHVlKVxyXG4pXHJcblxyXG5jb25zdCBuYW1lID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChpc1BlbmRpbmdGaWxlVXBsb2FkKHByb3BzLml0ZW0pKSByZXR1cm4gcHJvcHMuaXRlbS5tb2RlbE5hbWVcclxuICByZXR1cm4gcHJvcHMuaXNTZWFyY2hSZXN1bHQgPyBwcm9wcy5pdGVtLmZ1bGxOYW1lIDogcHJvcHMuaXRlbS5uYW1lXHJcbn0pXHJcbmNvbnN0IGZ1bGxOYW1lID0gY29tcHV0ZWQoKCkgPT5cclxuICBpc1BlbmRpbmdGaWxlVXBsb2FkKHByb3BzLml0ZW0pID8gcHJvcHMuaXRlbS5tb2RlbE5hbWUgOiBwcm9wcy5pdGVtLmZ1bGxOYW1lXHJcbilcclxuY29uc3QgZXhwYW5kZWQgPSB1c2VJc01vZGVsRXhwYW5kZWQoe1xyXG4gIGZ1bGxOYW1lLFxyXG4gIHByb2plY3RJZDogY29tcHV0ZWQoKCkgPT4gcHJvcHMucHJvamVjdC5pZClcclxufSlcclxuXHJcbmNvbnN0IG1vZGVsID0gY29tcHV0ZWQoKCkgPT5cclxuICAhaXNQZW5kaW5nRmlsZVVwbG9hZChwcm9wcy5pdGVtKSA/IHByb3BzLml0ZW0ubW9kZWwgOiBudWxsXHJcbilcclxuY29uc3QgcGVuZGluZ01vZGVsID0gY29tcHV0ZWQoKCkgPT5cclxuICBpc1BlbmRpbmdGaWxlVXBsb2FkKHByb3BzLml0ZW0pID8gcHJvcHMuaXRlbSA6IG51bGxcclxuKVxyXG5cclxuY29uc3QgcGVuZGluZ1ZlcnNpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCFtb2RlbC52YWx1ZSkge1xyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIGNvbnN0IGxhc3RQZW5kaW5nVmVyc2lvbiA9IG1vZGVsLnZhbHVlLnBlbmRpbmdJbXBvcnRlZFZlcnNpb25zWzBdXHJcbiAgY29uc3QgbGFzdFZlcnNpb24gPSBtb2RlbC52YWx1ZS5sYXN0VmVyc2lvbj8uaXRlbXNbMF1cclxuICBpZiAoIWxhc3RWZXJzaW9uIHx8ICFsYXN0UGVuZGluZ1ZlcnNpb24pIHJldHVybiBsYXN0UGVuZGluZ1ZlcnNpb25cclxuXHJcbiAgLy8gSWYgcGVuZGluZyB2ZXJzaW9uIGlzIG9sZGVyIHRoYW4gbmV3ZXN0IHZlcnNpb24sIGhpZGUgaXQgKG1heSBiZSBhIHN0dWNrIGltcG9ydClcclxuICBpZiAoZGF5anMobGFzdFBlbmRpbmdWZXJzaW9uLnVwZGF0ZWRBdCkuaXNCZWZvcmUoZGF5anMobGFzdFZlcnNpb24uY3JlYXRlZEF0KSkpIHtcclxuICAgIHJldHVybiBudWxsXHJcbiAgfVxyXG5cclxuICByZXR1cm4gbGFzdFBlbmRpbmdWZXJzaW9uXHJcbn0pXHJcblxyXG5jb25zdCBzaG93TGFzdFVwbG9hZEZhaWxlZCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIW1vZGVsLnZhbHVlKSByZXR1cm4gZmFsc2VcclxuICBjb25zdCBsYXN0VXBsb2FkID0gbW9kZWwudmFsdWUubGFzdFVwbG9hZD8uaXRlbXNbMF1cclxuICBjb25zdCBsYXN0VmVyc2lvbiA9IG1vZGVsLnZhbHVlLmxhc3RWZXJzaW9uPy5pdGVtc1swXVxyXG5cclxuICAvLyBPbmx5IHNob3cgaWYgbGFzdCB1cGxvYWQgZmFpbGVkICYgdGhlcmUgaXMgbm8gbGFzdCB2ZXJzaW9uLFxyXG4gIC8vIG9yIGxhc3QgdmVyc2lvbiBpcyBvbGRlciB0aGFuIGxhc3QgdXBsb2FkXHJcbiAgaWYgKGxhc3RVcGxvYWQ/LmNvbnZlcnRlZFN0YXR1cyAhPT0gRmlsZVVwbG9hZENvbnZlcnRlZFN0YXR1cy5FcnJvcikgcmV0dXJuIGZhbHNlXHJcbiAgaWYgKCFsYXN0VmVyc2lvbikgcmV0dXJuIHRydWVcclxuICByZXR1cm4gZGF5anMobGFzdFVwbG9hZC51cGRhdGVkQXQpLmlzQWZ0ZXIoZGF5anMobGFzdFZlcnNpb24uY3JlYXRlZEF0KSlcclxufSlcclxuXHJcbmNvbnN0IGhhc0NoaWxkcmVuID0gY29tcHV0ZWQoKCkgPT5cclxuICBwcm9wcy5pc1NlYXJjaFJlc3VsdCB8fCBpc1BlbmRpbmdGaWxlVXBsb2FkKHByb3BzLml0ZW0pXHJcbiAgICA/IGZhbHNlXHJcbiAgICA6IHByb3BzLml0ZW0uaGFzQ2hpbGRyZW5cclxuKVxyXG5cclxuY29uc3QgdXBkYXRlZEF0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGRhdGUgPSBpc1BlbmRpbmdGaWxlVXBsb2FkKHByb3BzLml0ZW0pXHJcbiAgICA/IHByb3BzLml0ZW0uY29udmVydGVkTGFzdFVwZGF0ZSB8fCBwcm9wcy5pdGVtLnVwbG9hZERhdGVcclxuICAgIDogcHJvcHMuaXRlbS51cGRhdGVkQXRcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIGZ1bGw6IGZvcm1hdHRlZEZ1bGxEYXRlKGRhdGUpLFxyXG4gICAgcmVsYXRpdmU6IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShkYXRlLCB7IHByZWZpeDogdHJ1ZSB9KVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IG1vZGVsTGluayA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBpdGVtID0gaXNQZW5kaW5nRmlsZVVwbG9hZChwcm9wcy5pdGVtKSA/IHByb3BzLml0ZW0gOiBwcm9wcy5pdGVtLm1vZGVsXHJcbiAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbFxyXG4gIHJldHVybiBnZXRNb2RlbEl0ZW1Sb3V0ZShpdGVtKVxyXG59KVxyXG5cclxuY29uc3Qgdmlld0FsbFVybCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoaXNQZW5kaW5nRmlsZVVwbG9hZChwcm9wcy5pdGVtKSkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIGNvbnN0IGZ1bGxOYW1lID0gcHJvcHMuaXRlbS5mdWxsTmFtZVxyXG4gIGNvbnN0IGVuY29kZWRGdWxsTmFtZSA9IGAkJHtmdWxsTmFtZX1gLnJlcGxhY2UoL1xcLy9nLCAnJTJGJylcclxuICByZXR1cm4gbW9kZWxSb3V0ZShwcm9wcy5wcm9qZWN0LmlkLCBlbmNvZGVkRnVsbE5hbWUpXHJcbn0pXHJcblxyXG5jb25zdCB7XHJcbiAgcmVzdWx0OiBjaGlsZHJlblJlc3VsdCxcclxuICByZWZldGNoOiByZWZldGNoQ2hpbGRyZW4sXHJcbiAgbG9hZGluZzogY2hpbGRyZW5Mb2FkaW5nXHJcbn0gPSB1c2VRdWVyeShcclxuICBwcm9qZWN0TW9kZWxDaGlsZHJlblRyZWVRdWVyeSxcclxuICAoKSA9PiAoe1xyXG4gICAgcHJvamVjdElkOiBwcm9wcy5wcm9qZWN0LmlkLFxyXG4gICAgcGFyZW50TmFtZTogaXNQZW5kaW5nRmlsZVVwbG9hZChwcm9wcy5pdGVtKSA/ICcnIDogcHJvcHMuaXRlbS5mdWxsTmFtZVxyXG4gIH0pLFxyXG4gICgpID0+ICh7XHJcbiAgICBlbmFibGVkOiBoYXNDaGlsZHJlbi52YWx1ZSAmJiBleHBhbmRlZC52YWx1ZSAmJiAhaXNQZW5kaW5nRmlsZVVwbG9hZChwcm9wcy5pdGVtKVxyXG4gIH0pXHJcbilcclxuXHJcbmNvbnN0IGNoaWxkcmVuID0gY29tcHV0ZWQoKCkgPT4gY2hpbGRyZW5SZXN1bHQudmFsdWU/LnByb2plY3Q/Lm1vZGVsQ2hpbGRyZW5UcmVlIHx8IFtdKVxyXG5cclxuY29uc3Qgb25Nb2RlbFVwZGF0ZWQgPSAoKSA9PiB7XHJcbiAgZW1pdCgnbW9kZWwtdXBkYXRlZCcpXHJcbiAgcmVmZXRjaENoaWxkcmVuKClcclxufVxyXG5cclxuY29uc3QgdHJpZ2dlclZlcnNpb25VcGxvYWQgPSAoKSA9PiB7XHJcbiAgaWYgKGlzVmVyc2lvblVwbG9hZGluZy52YWx1ZSkgcmV0dXJuXHJcbiAgaW1wb3J0QXJlYS52YWx1ZT8udHJpZ2dlclBpY2tlcigpXHJcbn1cclxuXHJcbmNvbnN0IG9uVmVyc2lvblVwbG9hZGluZyA9IChwYXlsb2FkOiBGaWxlQXJlYVVwbG9hZGluZ1BheWxvYWQpID0+IHtcclxuICBpc1ZlcnNpb25VcGxvYWRpbmcudmFsdWUgPSBwYXlsb2FkLmlzVXBsb2FkaW5nXHJcbn1cclxuXHJcbmNvbnN0IG9uVmVyc2lvbnNDbGljayA9ICgpID0+IHtcclxuICBpZiAobW9kZWwudmFsdWUpIHtcclxuICAgIHJvdXRlci5wdXNoKG1vZGVsVmVyc2lvbnNSb3V0ZShwcm9wcy5wcm9qZWN0LmlkLCBtb2RlbC52YWx1ZS5pZCkpXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1N0cnVjdHVyZUl0ZW0udnVlIn0=