import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/comments/ListItem.vue");import { UserAvatarGroup as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { FormButton as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_2 } from "/_nuxt/components/viewer/resources/LimitAlert.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/global/icon/CircleExclamation.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createVNode as __createVNode,createBlock as __createBlock,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 _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...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 { CheckCircleIcon, ClockIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_solid.js?v=e4f18c29"; import { CheckCircleIcon as CheckCircleIconOutlined } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29"; import { useInjectedViewerInterfaceState, useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts"; import { useArchiveComment, useCommentContext } from "/_nuxt/lib/viewer/composables/commentManagement.ts"; import { ToastNotificationType, useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts"; import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useThreadUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useDateFormatters } from "/_nuxt/composables/dates.ts"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerCommentsListItem", props: { thread: { type: null, required: true } }, setup(__props, { expose: __expose }) { __expose(); const props = __props; const { threads: { openThread } } = useInjectedViewerInterfaceState(); const { open: openThreadRaw } = useThreadUtilities(); const { activeUser } = useActiveUser(); const archiveComment = useArchiveComment(); const { triggerNotification } = useGlobalToast(); const { projectId, resources: { response: { project } } } = useInjectedViewerState(); const isLimited = computed(() => { return !props.thread.rawText || props.thread.rawText.trim() === ""; }); const mp = useMixpanel(); const open = (id) => { openThreadRaw(id); mp.track("Comment Action", { type: "action", name: "toggle", status: !isOpenInViewer.value, source: "sidebar" }); }; const { calculateThreadResourceStatus } = useCommentContext(); const itemStatus = computed(() => calculateThreadResourceStatus(props.thread)); const { formattedRelativeDate, formattedFullDate } = useDateFormatters(); const createdAt = computed(() => { return { full: formattedFullDate(props.thread.createdAt), relative: formattedRelativeDate(props.thread.createdAt, { capitalize: true }) }; }); const isOpenInViewer = computed(() => openThread.thread.value?.id === props.thread.id); const threadAuthors = computed(() => { const authors = [props.thread.author]; for (const author of props.thread.replyAuthors.items) { if (!authors.find((u) => u.id === author.id)) authors.push(author); } return authors; }); const canArchiveOrUnarchive = computed( () => activeUser.value && (props.thread.author.id === activeUser.value.id || project.value?.role === Roles.Stream.Owner) ); const toggleCommentResolvedStatus = async () => { await archiveComment({ commentId: props.thread.id, projectId: projectId.value, archived: !props.thread.archived }); mp.track("Comment Action", { type: "action", name: "archive", status: !props.thread.archived }); triggerNotification({ title: `Thread ${props.thread.archived ? "reopened." : "resolved."}`, type: ToastNotificationType.Info }); }; const __returned__ = { props, openThread, openThreadRaw, activeUser, archiveComment, triggerNotification, projectId, project, isLimited, mp, open, calculateThreadResourceStatus, itemStatus, formattedRelativeDate, formattedFullDate, createdAt, isOpenInViewer, threadAuthors, canArchiveOrUnarchive, toggleCommentResolvedStatus, get CheckCircleIcon() { return CheckCircleIcon; }, get ClockIcon() { return ClockIcon; }, get CheckCircleIconOutlined() { return CheckCircleIconOutlined; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { createCommentVNode as _createCommentVNode, resolveComponent as _resolveComponent, withModifiers as _withModifiers, resolveDirective as _resolveDirective, withDirectives as _withDirectives, openBlock as _openBlock, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "flex-1 flex flex-col gap-y-1", "data-v-inspector": "components/viewer/comments/ListItem.vue:11:5" }; const _hoisted_2 = { class: "flex items-center space-x-1.5 justify-between", "data-v-inspector": "components/viewer/comments/ListItem.vue:12:7" }; const _hoisted_3 = { class: "flex items-center gap-x-1.5 text-body-3xs", "data-v-inspector": "components/viewer/comments/ListItem.vue:24:7" }; const _hoisted_4 = { class: "text-foreground", "data-v-inspector": "components/viewer/comments/ListItem.vue:25:9" }; const _hoisted_5 = { key: 0, "data-v-inspector": "components/viewer/comments/ListItem.vue:27:11" }; const _hoisted_6 = { class: "text-foreground-3", "data-v-inspector": "components/viewer/comments/ListItem.vue:32:9" }; const _hoisted_7 = { key: 0, class: "text-body-2xs text-foreground dark:text-foreground-2 line-clamp-2 py-1", "data-v-inspector": "components/viewer/comments/ListItem.vue:36:7" }; const _hoisted_8 = { class: "text-body-3xs flex items-center space-x-1.5 text-foreground-3", "data-v-inspector": "components/viewer/comments/ListItem.vue:43:7" }; const _hoisted_9 = { key: 0, class: "flex items-center space-x-1", "data-v-inspector": "components/viewer/comments/ListItem.vue:44:9" }; const _hoisted_10 = { key: 0, "data-v-inspector": "components/viewer/comments/ListItem.vue:48:11" }; const _hoisted_11 = { key: 1, "data-v-inspector": "components/viewer/comments/ListItem.vue:54:11" }; const _hoisted_12 = { "data-v-inspector": "components/viewer/comments/ListItem.vue:61:9" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_UserAvatarGroup = __nuxt_component_0; const _component_FormButton = __nuxt_component_1; const _component_ViewerResourcesLimitAlert = __nuxt_component_2; const _component_IconCircleExclamation = __nuxt_component_3; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock( _Fragment, null, [ _createCommentVNode(" eslint-disable-next-line vuejs-accessibility/click-events-have-key-events "), _createElementVNode( "div", { class: _normalizeClass(`p-1.5 pt-0.5 flex flex-col rounded-md ${$setup.isOpenInViewer ? "bg-highlight-2" : ""} ${$setup.isLimited ? "cursor-default" : "cursor-pointer hover:bg-highlight-3"} `), onClick: _cache[1] || (_cache[1] = ($event) => $setup.isLimited ? null : $setup.open($props.thread.id)), "data-v-inspector": "components/viewer/comments/ListItem.vue:4:3" }, [ _createElementVNode("div", _hoisted_1, [ _createElementVNode("div", _hoisted_2, [ _createVNode(_component_UserAvatarGroup, { users: $setup.threadAuthors, size: "sm", "data-v-inspector": "components/viewer/comments/ListItem.vue:13:9" }, null, 8, ["users"]), !$setup.isLimited ? _withDirectives((_openBlock(), _createBlock(_component_FormButton, { key: 0, "icon-left": $props.thread.archived ? $setup.CheckCircleIcon : $setup.CheckCircleIconOutlined, text: "", "hide-text": "", disabled: !$setup.canArchiveOrUnarchive, onClick: _cache[0] || (_cache[0] = _withModifiers(($event) => $setup.toggleCommentResolvedStatus(), ["stop"])), "data-v-inspector": "components/viewer/comments/ListItem.vue:14:9" }, null, 8, ["icon-left", "disabled"])), [ [_directive_tippy, $props.thread.archived ? "Unresolve" : "Resolve"] ]) : _createCommentVNode("v-if", true) ]), _createElementVNode("div", _hoisted_3, [ _createElementVNode("span", _hoisted_4, [ _createTextVNode( _toDisplayString($props.thread.author.name) + " ", 1 /* TEXT */ ), $setup.threadAuthors.length !== 1 ? (_openBlock(), _createElementBlock( "span", _hoisted_5, " & " + _toDisplayString($props.thread.replyAuthors.totalCount) + " others ", 1 /* TEXT */ )) : _createCommentVNode("v-if", true) ]), _withDirectives((_openBlock(), _createElementBlock("span", _hoisted_6, [ _createTextVNode( _toDisplayString($setup.createdAt.relative), 1 /* TEXT */ ) ])), [ [_directive_tippy, $setup.createdAt.full] ]) ]), !$setup.isLimited ? (_openBlock(), _createElementBlock( "div", _hoisted_7, _toDisplayString($props.thread.rawText), 1 /* TEXT */ )) : (_openBlock(), _createBlock(_component_ViewerResourcesLimitAlert, { key: 1, "limit-type": "comment", project: $setup.project, "data-v-inspector": "components/viewer/comments/ListItem.vue:42:7" }, null, 8, ["project"])), _createElementVNode("div", _hoisted_8, [ $setup.itemStatus.isDifferentVersion || $setup.itemStatus.isFederatedModel ? (_openBlock(), _createElementBlock("div", _hoisted_9, [ $setup.itemStatus.isDifferentVersion ? _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_10, [ _createVNode($setup["ClockIcon"], { class: "size-3 text-foreground-2", "data-v-inspector": "components/viewer/comments/ListItem.vue:52:13" }) ])), [ [_directive_tippy, "Conversation started in a different version."] ]) : _createCommentVNode("v-if", true), $setup.itemStatus.isFederatedModel ? _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_11, [ _createVNode(_component_IconCircleExclamation, { class: "size-3 text-foreground-2", "data-v-inspector": "components/viewer/comments/ListItem.vue:58:13" }) ])), [ [_directive_tippy, "References models not currently loaded."] ]) : _createCommentVNode("v-if", true) ])) : _createCommentVNode("v-if", true), _createElementVNode( "span", _hoisted_12, _toDisplayString($props.thread.replies.totalCount) + " " + _toDisplayString($props.thread.replies.totalCount === 1 ? "reply" : "replies"), 1 /* TEXT */ ) ]) ]) ], 2 /* CLASS */ ) ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */ ); } _sfc_main.__hmrId = "3314803f"; 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/comments/ListItem.vue"]]); //# sourceMappingURL=data:application/json;base64,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LGNBQU8sT0FBTyxJQUFJLElBQUc7QUFBQSxrQkFDeEI7QUFBQTtBQUFBO0FBQUEsZ0JBQVkscUJBQWMsV0FBTSxtQkFBaEM7QUFBQSxrQkFFTztBQUFBLGtCQUZQO0FBQUEsa0JBQXlHLFFBQ3JHLGlCQUFHLGNBQU8sYUFBYSxVQUFVLElBQUc7QUFBQSxrQkFDeEM7QUFBQTtBQUFBOzs2Q0FHRixvQkFFTyxRQUZQLFlBRU87QUFBQTttQ0FERixpQkFBVSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7bUNBRFIsaUJBQVUsSUFBSTtBQUFBOzthQUt0QixrQ0FEVDtBQUFBLGNBS007QUFBQSxjQUxOO0FBQUEsY0FLTSxpQkFERCxjQUFPLE9BQU87QUFBQTtBQUFBO0FBQUEsZ0NBRW5CLGFBQTRJO0FBQUE7Y0FBMUcsY0FBVztBQUFBLGNBQVcsU0FBUztBQUFBLGNBQVMsb0JBQWlCO0FBQUE7WUFDM0Ysb0JBc0JNLE9BdEJOLFlBc0JNO0FBQUEsY0FwQkksa0JBQVcsc0JBQXNCLGtCQUFXLGtDQURwRCxvQkFnQk0sT0FoQk4sWUFnQk07QUFBQSxnQkFYSSxrQkFBVyxvREFEbkIsb0JBS00sT0FMTixhQUtNO0FBQUEsa0JBREosYUFBK0c7QUFBQSxvQkFBcEcsT0FBTTtBQUFBLG9CQUEyQixvQkFBaUI7QUFBQTs7cUNBRnBELDhDQUE4QztBQUFBO2dCQUtqRCxrQkFBVyxrREFEbkIsb0JBS00sT0FMTixhQUtNO0FBQUEsa0JBREosYUFBMkg7QUFBQSxvQkFBcEcsT0FBTTtBQUFBLG9CQUEyQixvQkFBaUI7QUFBQTs7cUNBRmhFLHlDQUF5QztBQUFBOztjQUt0RDtBQUFBLGdCQUdPO0FBQUEsZ0JBSFA7QUFBQSxnQkFHTyxpQkFGRixjQUFPLFFBQVEsVUFBVSxJQUFHLE1BQy9CLGlCQUFHLGNBQU8sUUFBUSxlQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIkxpc3RJdGVtLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48dGVtcGxhdGU+XHJcbiAgPCEtLSBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdnVlanMtYWNjZXNzaWJpbGl0eS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzIC0tPlxyXG4gIDxkaXZcclxuICAgIDpjbGFzcz1cImBwLTEuNSBwdC0wLjUgZmxleCBmbGV4LWNvbCByb3VuZGVkLW1kXHJcbiAgICAgICR7aXNPcGVuSW5WaWV3ZXIgPyAnYmctaGlnaGxpZ2h0LTInIDogJyd9XHJcbiAgICAgICR7aXNMaW1pdGVkID8gJ2N1cnNvci1kZWZhdWx0JyA6ICdjdXJzb3ItcG9pbnRlciBob3ZlcjpiZy1oaWdobGlnaHQtMyd9XHJcbiAgICBgXCJcclxuICAgIEBjbGljaz1cImlzTGltaXRlZCA/IG51bGwgOiBvcGVuKHRocmVhZC5pZClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjQ6M1wiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmbGV4IGZsZXgtY29sIGdhcC15LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjExOjVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMS41IGp1c3RpZnktYmV0d2VlblwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6MTI6N1wiPlxyXG4gICAgICAgIDxVc2VyQXZhdGFyR3JvdXAgOnVzZXJzPVwidGhyZWFkQXV0aG9yc1wiIHNpemU9XCJzbVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6MTM6OVwiIC8+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIHYtaWY9XCIhaXNMaW1pdGVkXCJcclxuICAgICAgICAgIHYtdGlwcHk9XCJ0aHJlYWQuYXJjaGl2ZWQgPyAnVW5yZXNvbHZlJyA6ICdSZXNvbHZlJ1wiXHJcbiAgICAgICAgICA6aWNvbi1sZWZ0PVwidGhyZWFkLmFyY2hpdmVkID8gQ2hlY2tDaXJjbGVJY29uIDogQ2hlY2tDaXJjbGVJY29uT3V0bGluZWRcIlxyXG4gICAgICAgICAgdGV4dFxyXG4gICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICA6ZGlzYWJsZWQ9XCIhY2FuQXJjaGl2ZU9yVW5hcmNoaXZlXCJcclxuICAgICAgICAgIEBjbGljay5zdG9wPVwidG9nZ2xlQ29tbWVudFJlc29sdmVkU3RhdHVzKClcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjE0OjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLXgtMS41IHRleHQtYm9keS0zeHNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjI0OjdcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6MjU6OVwiPlxyXG4gICAgICAgICAge3sgdGhyZWFkLmF1dGhvci5uYW1lIH19XHJcbiAgICAgICAgICA8c3BhbiB2LWlmPVwidGhyZWFkQXV0aG9ycy5sZW5ndGggIT09IDFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjI3OjExXCI+XHJcbiAgICAgICAgICAgICYge3sgdGhyZWFkLnJlcGx5QXV0aG9ycy50b3RhbENvdW50IH19IG90aGVyc1xyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNwYW4gdi10aXBweT1cImNyZWF0ZWRBdC5mdWxsXCIgY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6MzI6OVwiPlxyXG4gICAgICAgICAge3sgY3JlYXRlZEF0LnJlbGF0aXZlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIHYtaWY9XCIhaXNMaW1pdGVkXCJcclxuICAgICAgICBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kIGRhcms6dGV4dC1mb3JlZ3JvdW5kLTIgbGluZS1jbGFtcC0yIHB5LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjM2OjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgdGhyZWFkLnJhd1RleHQgfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxWaWV3ZXJSZXNvdXJjZXNMaW1pdEFsZXJ0IHYtZWxzZSBsaW1pdC10eXBlPVwiY29tbWVudFwiIDpwcm9qZWN0PVwicHJvamVjdFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6NDI6N1wiIC8+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJvZHktM3hzIGZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMS41IHRleHQtZm9yZWdyb3VuZC0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbW1lbnRzL0xpc3RJdGVtLnZ1ZTo0Mzo3XCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1pZj1cIml0ZW1TdGF0dXMuaXNEaWZmZXJlbnRWZXJzaW9uIHx8IGl0ZW1TdGF0dXMuaXNGZWRlcmF0ZWRNb2RlbFwiXHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHNwYWNlLXgtMVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6NDQ6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWlmPVwiaXRlbVN0YXR1cy5pc0RpZmZlcmVudFZlcnNpb25cIlxyXG4gICAgICAgICAgICB2LXRpcHB5PVwiJ0NvbnZlcnNhdGlvbiBzdGFydGVkIGluIGEgZGlmZmVyZW50IHZlcnNpb24uJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6NDg6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8Q2xvY2tJY29uIGNsYXNzPVwic2l6ZS0zIHRleHQtZm9yZWdyb3VuZC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbW1lbnRzL0xpc3RJdGVtLnZ1ZTo1MjoxM1wiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cIml0ZW1TdGF0dXMuaXNGZWRlcmF0ZWRNb2RlbFwiXHJcbiAgICAgICAgICAgIHYtdGlwcHk9XCInUmVmZXJlbmNlcyBtb2RlbHMgbm90IGN1cnJlbnRseSBsb2FkZWQuJ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWU6NTQ6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8SWNvbkNpcmNsZUV4Y2xhbWF0aW9uIGNsYXNzPVwic2l6ZS0zIHRleHQtZm9yZWdyb3VuZC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2NvbW1lbnRzL0xpc3RJdGVtLnZ1ZTo1ODoxM1wiIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c3BhbiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvY29tbWVudHMvTGlzdEl0ZW0udnVlOjYxOjlcIj5cclxuICAgICAgICAgIHt7IHRocmVhZC5yZXBsaWVzLnRvdGFsQ291bnQgfX1cclxuICAgICAgICAgIHt7IHRocmVhZC5yZXBsaWVzLnRvdGFsQ291bnQgPT09IDEgPyAncmVwbHknIDogJ3JlcGxpZXMnIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L3RlbXBsYXRlPlxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBDaGVja0NpcmNsZUljb24sIENsb2NrSWNvbiB9IGZyb20gJ0BoZXJvaWNvbnMvdnVlLzI0L3NvbGlkJ1xyXG5pbXBvcnQgeyBDaGVja0NpcmNsZUljb24gYXMgQ2hlY2tDaXJjbGVJY29uT3V0bGluZWQgfSBmcm9tICdAaGVyb2ljb25zL3Z1ZS8yNC9vdXRsaW5lJ1xyXG5pbXBvcnQgdHlwZSB7IExvYWRlZENvbW1lbnRUaHJlYWQgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQge1xyXG4gIHVzZUluamVjdGVkVmlld2VySW50ZXJmYWNlU3RhdGUsXHJcbiAgdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZVxyXG59IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAnXHJcbmltcG9ydCB7IHVzZUFjdGl2ZVVzZXIgfSBmcm9tICd+fi9saWIvYXV0aC9jb21wb3NhYmxlcy9hY3RpdmVVc2VyJ1xyXG5pbXBvcnQge1xyXG4gIHVzZUFyY2hpdmVDb21tZW50LFxyXG4gIHVzZUNvbW1lbnRDb250ZXh0XHJcbn0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9jb21tZW50TWFuYWdlbWVudCdcclxuaW1wb3J0IHsgVG9hc3ROb3RpZmljYXRpb25UeXBlLCB1c2VHbG9iYWxUb2FzdCB9IGZyb20gJ35+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvdG9hc3QnXHJcbmltcG9ydCB7IFJvbGVzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ35+L2xpYi9jb3JlL2NvbXBvc2FibGVzL21wJ1xyXG5pbXBvcnQgeyB1c2VUaHJlYWRVdGlsaXRpZXMgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3VpJ1xyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgdGhyZWFkOiBMb2FkZWRDb21tZW50VGhyZWFkXHJcbn0+KClcclxuXHJcbmNvbnN0IHtcclxuICB0aHJlYWRzOiB7IG9wZW5UaHJlYWQgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJJbnRlcmZhY2VTdGF0ZSgpXHJcbmNvbnN0IHsgb3Blbjogb3BlblRocmVhZFJhdyB9ID0gdXNlVGhyZWFkVXRpbGl0aWVzKClcclxuY29uc3QgeyBhY3RpdmVVc2VyIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuY29uc3QgYXJjaGl2ZUNvbW1lbnQgPSB1c2VBcmNoaXZlQ29tbWVudCgpXHJcbmNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG5jb25zdCB7XHJcbiAgcHJvamVjdElkLFxyXG4gIHJlc291cmNlczoge1xyXG4gICAgcmVzcG9uc2U6IHsgcHJvamVjdCB9XHJcbiAgfVxyXG59ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcblxyXG5jb25zdCBpc0xpbWl0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuICFwcm9wcy50aHJlYWQucmF3VGV4dCB8fCBwcm9wcy50aHJlYWQucmF3VGV4dC50cmltKCkgPT09ICcnXHJcbn0pXHJcblxyXG5jb25zdCBtcCA9IHVzZU1peHBhbmVsKClcclxuY29uc3Qgb3BlbiA9IChpZDogc3RyaW5nKSA9PiB7XHJcbiAgb3BlblRocmVhZFJhdyhpZClcclxuICBtcC50cmFjaygnQ29tbWVudCBBY3Rpb24nLCB7XHJcbiAgICB0eXBlOiAnYWN0aW9uJyxcclxuICAgIG5hbWU6ICd0b2dnbGUnLFxyXG4gICAgc3RhdHVzOiAhaXNPcGVuSW5WaWV3ZXIudmFsdWUsXHJcbiAgICBzb3VyY2U6ICdzaWRlYmFyJ1xyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IHsgY2FsY3VsYXRlVGhyZWFkUmVzb3VyY2VTdGF0dXMgfSA9IHVzZUNvbW1lbnRDb250ZXh0KClcclxuY29uc3QgaXRlbVN0YXR1cyA9IGNvbXB1dGVkKCgpID0+IGNhbGN1bGF0ZVRocmVhZFJlc291cmNlU3RhdHVzKHByb3BzLnRocmVhZCkpXHJcbmNvbnN0IHsgZm9ybWF0dGVkUmVsYXRpdmVEYXRlLCBmb3JtYXR0ZWRGdWxsRGF0ZSB9ID0gdXNlRGF0ZUZvcm1hdHRlcnMoKVxyXG5cclxuY29uc3QgY3JlYXRlZEF0ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBmdWxsOiBmb3JtYXR0ZWRGdWxsRGF0ZShwcm9wcy50aHJlYWQuY3JlYXRlZEF0KSxcclxuICAgIHJlbGF0aXZlOiBmb3JtYXR0ZWRSZWxhdGl2ZURhdGUocHJvcHMudGhyZWFkLmNyZWF0ZWRBdCwgeyBjYXBpdGFsaXplOiB0cnVlIH0pXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgaXNPcGVuSW5WaWV3ZXIgPSBjb21wdXRlZCgoKSA9PiBvcGVuVGhyZWFkLnRocmVhZC52YWx1ZT8uaWQgPT09IHByb3BzLnRocmVhZC5pZClcclxuXHJcbmNvbnN0IHRocmVhZEF1dGhvcnMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgYXV0aG9ycyA9IFtwcm9wcy50aHJlYWQuYXV0aG9yXVxyXG4gIGZvciAoY29uc3QgYXV0aG9yIG9mIHByb3BzLnRocmVhZC5yZXBseUF1dGhvcnMuaXRlbXMpIHtcclxuICAgIGlmICghYXV0aG9ycy5maW5kKCh1KSA9PiB1LmlkID09PSBhdXRob3IuaWQpKSBhdXRob3JzLnB1c2goYXV0aG9yKVxyXG4gIH1cclxuICByZXR1cm4gYXV0aG9yc1xyXG59KVxyXG5cclxuY29uc3QgY2FuQXJjaGl2ZU9yVW5hcmNoaXZlID0gY29tcHV0ZWQoXHJcbiAgKCkgPT5cclxuICAgIGFjdGl2ZVVzZXIudmFsdWUgJiZcclxuICAgIChwcm9wcy50aHJlYWQuYXV0aG9yLmlkID09PSBhY3RpdmVVc2VyLnZhbHVlLmlkIHx8XHJcbiAgICAgIHByb2plY3QudmFsdWU/LnJvbGUgPT09IFJvbGVzLlN0cmVhbS5Pd25lcilcclxuKVxyXG5cclxuY29uc3QgdG9nZ2xlQ29tbWVudFJlc29sdmVkU3RhdHVzID0gYXN5bmMgKCkgPT4ge1xyXG4gIGF3YWl0IGFyY2hpdmVDb21tZW50KHtcclxuICAgIGNvbW1lbnRJZDogcHJvcHMudGhyZWFkLmlkLFxyXG4gICAgcHJvamVjdElkOiBwcm9qZWN0SWQudmFsdWUsXHJcbiAgICBhcmNoaXZlZDogIXByb3BzLnRocmVhZC5hcmNoaXZlZFxyXG4gIH0pXHJcbiAgbXAudHJhY2soJ0NvbW1lbnQgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnYXJjaGl2ZScsXHJcbiAgICBzdGF0dXM6ICFwcm9wcy50aHJlYWQuYXJjaGl2ZWRcclxuICB9KVxyXG4gIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgdGl0bGU6IGBUaHJlYWQgJHtwcm9wcy50aHJlYWQuYXJjaGl2ZWQgPyAncmVvcGVuZWQuJyA6ICdyZXNvbHZlZC4nfWAsXHJcbiAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuSW5mb1xyXG4gIH0pXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9jb21tZW50cy9MaXN0SXRlbS52dWUifQ==