import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/anchored-point/Thread.vue");import { UserAvatarGroup as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_1 } from "/_nuxt/components/global/icon/CircleCheck.vue"; import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutMenu 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/viewer/anchored-point/thread/Comment.vue"; import { default as __nuxt_component_5 } from "/_nuxt/components/viewer/anchored-point/thread/NewReply.vue"; import { default as __nuxt_component_6 } from "/_nuxt/components/viewer/comments/PortalOrDiv.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createBlock as __createBlock,createVNode as __createVNode,createElementVNode as __createElementVNode,createElementBlock as __createElementBlock } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } /* Injection by vite-plugin-vue-inspector End */ import { defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { MoveLeft, MoveRight, CircleCheck, X, ChevronLeft, ChevronRight, Ellipsis } from "/_nuxt/node_modules/.cache/vite/client/deps/lucide-vue-next.js?v=e4f18c29"; import { ensureError } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { onKeyDown, useClipboard, useDraggable, onClickOutside } from "/_nuxt/node_modules/@vueuse/core/index.mjs?v=e4f18c29"; import { scrollToBottom } from "/_nuxt/lib/common/helpers/dom.ts"; import { useViewerThreadTypingTracking } from "/_nuxt/lib/viewer/composables/activity.ts"; import { useAnimatingEllipsis } from "/_nuxt/lib/viewer/composables/commentBubbles.ts"; import { useArchiveComment, useCheckViewerCommentingAccess, useMarkThreadViewed, useCommentContext } from "/_nuxt/lib/viewer/composables/commentManagement.ts"; import { useInjectedViewerState } from "/_nuxt/lib/viewer/composables/setup.ts"; import { useActiveUser } from "/_nuxt/lib/auth/composables/activeUser.ts"; import { ToastNotificationType, useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts"; import { getLinkToThread } from "/_nuxt/lib/viewer/helpers/comments.ts"; import { useDisableGlobalTextSelection } from "/_nuxt/lib/common/composables/window.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useThreadUtilities } from "/_nuxt/lib/viewer/composables/ui.ts"; import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { computed, useId, ref, watch, onMounted } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useSafeRouter } from "/_nuxt/composables/routing.ts"; var ActionTypes = /* @__PURE__ */ ((ActionTypes2) => { ActionTypes2["CopyLink"] = "copy-link"; ActionTypes2["PopIn"] = "pop-in"; return ActionTypes2; })(ActionTypes || {}); const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerAnchoredPointThread", props: { modelValue: { type: Object, required: true }, hasPrevious: { type: Boolean, required: false }, hasNext: { type: Boolean, required: false } }, emits: ["update:modelValue", "update:expanded", "next", "prev", "login"], setup(__props, { expose: __expose, emit: __emit }) { __expose(); graphql(` fragment ViewerCommentThreadData on Comment { id permissions { canArchive { ...FullPermissionCheckResult } } } `); const emit = __emit; const props = __props; const { isEmbedEnabled } = useEmbed(); const threadId = computed(() => props.modelValue.id); const { copy } = useClipboard(); const { isLoggedIn } = useActiveUser(); const archiveComment = useArchiveComment(); const { triggerNotification } = useGlobalToast(); const { projectId } = useInjectedViewerState(); const canReply = useCheckViewerCommentingAccess(); const { disableTextSelection } = useDisableGlobalTextSelection(); const markThreadViewed = useMarkThreadViewed(); const { usersTyping } = useViewerThreadTypingTracking(threadId); const { ellipsis, controls } = useAnimatingEllipsis(); const { threadResourceStatus, hasClickedFullContext, goBack, handleContextClick } = useCommentContext(); const { isOpenThread, open, closeAllThreads } = useThreadUtilities(); const router = useSafeRouter(); const menuId = useId(); const showMenu = ref(false); const commentsContainer = ref(null); const threadContainer = ref(null); const threadActivator = ref(null); onClickOutside(threadContainer, (event) => { const viewerElement = document.getElementById("viewer"); if (isExpanded.value && viewerElement && (event.target === viewerElement || viewerElement.contains(event.target)) && !(threadActivator.value && threadActivator.value.contains(event.target))) { changeExpanded(false); } }); const handle = ref(null); const justCreatedReply = ref(false); const comments = computed(() => [ props.modelValue, ...props.modelValue.replies.items.slice().reverse() ]); const showNewReplyComponent = computed(() => { return !props.modelValue.archived && canReply.value && !isEmbedEnabled.value; }); const isExpanded = computed(() => isOpenThread(props.modelValue.id)); const isTypingMessage = computed(() => { if (!usersTyping.value.length) return null; return usersTyping.value.length > 1 ? `${usersTyping.value.map((u) => u.userName).join(", ")} are typing${ellipsis.value}` : `${usersTyping.value[0].userName} is typing${ellipsis.value}`; }); const isViewed = computed(() => !!props.modelValue.viewedAt); const initialDragPosition = computed(() => { return { x: props.modelValue.style.x, y: props.modelValue.style.y }; }); const mp = useMixpanel(); const isDragged = ref(false); const { x, y, isDragging, position } = useDraggable(threadContainer, { stopPropagation: true, handle, initialValue: initialDragPosition, onStart(_pos, event) { const target = event.target; const isWithinHandle = target === handle.value || handle.value?.contains(target); if (!isWithinHandle) return false; const isInteractiveElement = target.closest("button") || target.closest("a") || target.closest('[role="button"]'); if (isInteractiveElement) return false; if (!isDragged.value) position.value = { x: 0, y: 0 }; isDragged.value = true; mp.track("Comment Action", { type: "action", name: "drag" }); } }); const threadStyle = computed(() => { if (!threadActivator.value) return props.modelValue.style; const activatorRect = threadActivator.value?.getBoundingClientRect(); const areDraggableCoordsInitialized = x.value && y.value; const xOffset = isDragged.value && areDraggableCoordsInitialized ? x.value : props.modelValue.style.x + activatorRect.width + 20; const threadHeight = threadContainer.value?.getBoundingClientRect().height || 0; const threadWidth = threadContainer.value?.getBoundingClientRect().width || 0; const yOffset = isDragged.value && areDraggableCoordsInitialized ? y.value : props.modelValue.style.y - threadHeight / 2; const padding = isEmbedEnabled.value ? 5 : 10; const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; const topPadding = isEmbedEnabled.value ? padding : 58; const bottomPadding = isEmbedEnabled.value ? 62 : padding; const constrainedX = Math.min( Math.max(padding, xOffset), viewportWidth - threadWidth - padding ); const constrainedY = Math.min( Math.max(topPadding, yOffset), viewportHeight - threadHeight - bottomPadding ); const transition = isDragged.value ? "none" : props.modelValue.style.transition; return { ...props.modelValue.style, opacity: 1, transition, transform: `translate(${constrainedX}px,${constrainedY}px)` }; }); const threadAuthors = computed(() => { const authors = [props.modelValue.author]; for (const author of props.modelValue.replyAuthors.items) { if (!authors.find((u) => u.id === author.id)) authors.push(author); } return authors; }); const actionsItems = computed(() => [ [ { title: "Copy link", id: "copy-link" /* CopyLink */ }, { title: "Pop in", id: "pop-in" /* PopIn */, disabled: !isDragged.value } ] ]); const canArchiveOrUnarchive = computed( () => props.modelValue.permissions.canArchive.authorized ); const onActionChosen = (params) => { const { item } = params; switch (item.id) { case "copy-link" /* CopyLink */: showMenu.value = false; onCopyLink(); break; case "pop-in" /* PopIn */: showMenu.value = false; isDragged.value = false; break; } }; const changeExpanded = async (newVal) => { if (newVal) { await open(props.modelValue.id); } else { await closeAllThreads(); } emit("update:expanded", newVal); mp.track("Comment Action", { type: "action", name: "toggle", status: newVal, source: "bubble" }); }; const toggleCommentResolvedStatus = async () => { if (!props.modelValue.archived) { await router.replace(() => { const query = { ...router.currentRoute.value.query }; delete query.thread; return { query }; }); } await archiveComment({ commentId: props.modelValue.id, projectId: projectId.value, archived: !props.modelValue.archived }); mp.track("Comment Action", { type: "action", name: "archive", status: props.modelValue.archived }); triggerNotification({ title: `Thread ${props.modelValue.archived ? "reopened." : "resolved."}`, type: ToastNotificationType.Info }); }; const onNewReply = () => { justCreatedReply.value = true; mp.track("Comment Action", { type: "action", name: "reply" }); }; const onCommentMounted = () => { if (!justCreatedReply.value) return; const el = commentsContainer.value; if (!el) return; scrollToBottom(el); justCreatedReply.value = false; }; const onThreadClick = () => { changeExpanded(!isExpanded.value); }; const onCopyLink = async () => { if (false) return; const url = getLinkToThread(projectId.value, props.modelValue); if (!url) return; try { await copy(new URL(url, window.location.origin).toString()); } catch (e) { triggerNotification({ type: ToastNotificationType.Danger, title: "Thread link copy failed", description: ensureError(e).message }); throw e; } mp.track("Comment Action", { type: "action", name: "share" }); triggerNotification({ type: ToastNotificationType.Info, title: "Link copied" }); }; onKeyDown("Escape", () => { if (isExpanded.value) { changeExpanded(false); } }); watch( () => [isExpanded.value, isViewed.value], (newVals, oldVals) => { const [newIsExpanded, newIsViewed] = newVals; const [oldIsExpanded] = oldVals || [false]; if (newIsExpanded && newIsExpanded !== oldIsExpanded && !newIsViewed) { markThreadViewed(projectId.value, props.modelValue.id); } if (!newIsExpanded) { isDragged.value = false; } }, { immediate: true } // for triggering also when a comment is opened because of a thread link ); watch( () => usersTyping.value.length > 1, (areUsersTyping) => { if (areUsersTyping) { controls.resume(); } else { controls.pause(); } } ); watch(isDragging, (newVal, oldVal) => { if (!!newVal === !!oldVal) return; disableTextSelection.value = newVal; }); onMounted(() => { if (isExpanded.value) { emit("update:expanded", true); } }); const showBanner = computed( () => threadResourceStatus.value.isDifferentVersion || threadResourceStatus.value.isFederatedModel || hasClickedFullContext.value ); const bannerText = computed(() => { if (hasClickedFullContext.value) return "Viewing full context"; if (threadResourceStatus.value.isDifferentVersion && threadResourceStatus.value.isFederatedModel) return "References multiple models with different versions"; if (threadResourceStatus.value.isDifferentVersion) return "Conversation started in a different version"; if (threadResourceStatus.value.isFederatedModel) return "References models not currently loaded"; return ""; }); const bannerButton = computed(() => { if (hasClickedFullContext.value) { return { text: "Back", icon: MoveLeft, action: goBack }; } return { text: "Full context", icon: MoveRight, action: handleContextClick }; }); const __returned__ = { ActionTypes, emit, props, isEmbedEnabled, threadId, copy, isLoggedIn, archiveComment, triggerNotification, projectId, canReply, disableTextSelection, markThreadViewed, usersTyping, ellipsis, controls, threadResourceStatus, hasClickedFullContext, goBack, handleContextClick, isOpenThread, open, closeAllThreads, router, menuId, showMenu, commentsContainer, threadContainer, threadActivator, handle, justCreatedReply, comments, showNewReplyComponent, isExpanded, isTypingMessage, isViewed, initialDragPosition, mp, isDragged, x, y, isDragging, position, threadStyle, threadAuthors, actionsItems, canArchiveOrUnarchive, onActionChosen, changeExpanded, toggleCommentResolvedStatus, onNewReply, onCommentMounted, onThreadClick, onCopyLink, showBanner, bannerText, bannerButton, get CircleCheck() { return CircleCheck; }, get X() { return X; }, get ChevronLeft() { return ChevronLeft; }, get ChevronRight() { return ChevronRight; }, get Ellipsis() { return Ellipsis; }, get getLinkToThread() { return getLinkToThread; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle, withModifiers as _withModifiers, withCtx as _withCtx, resolveDirective as _resolveDirective, withDirectives as _withDirectives, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, renderList as _renderList, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "relative", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:2:3" }; const _hoisted_2 = { ref: "threadActivator", class: "relative", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:10:7" }; const _hoisted_3 = { key: 1, class: "w-7 h-7 flex items-center justify-center", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:23:11" }; const _hoisted_4 = { class: "w-6 h-6 flex items-center justify-center bg-foundation dark:bg-foundation-2 rounded-full", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:27:13" }; const _hoisted_5 = { ref: "handle", class: "relative w-full flex justify-between items-center border-b border-outline-2 p-2 pb-1.5 cursor-move", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:47:11" }; const _hoisted_6 = { class: "flex-grow flex items-center gap-x-1", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:51:13" }; const _hoisted_7 = { class: "flex items-center gap-x-0.5", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:52:15" }; const _hoisted_8 = { class: "flex gap-x-0.5", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:71:13" }; const _hoisted_9 = { class: "cursor-pointer", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:72:15" }; const _hoisted_10 = { key: 0, class: "flex items-center justify-between gap-4 border-b border-outline-2 py-2 px-2 w-full", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:109:11" }; const _hoisted_11 = { class: "text-body-2xs text-foreground-2 font-medium", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:113:13" }; const _hoisted_12 = { class: "relative w-full sm:w-80 flex flex-col flex-1 justify-between", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:125:11" }; const _hoisted_13 = { ref: "commentsContainer", class: "max-h-[200px] sm:max-h-[300px] 2xl:max-h-[500px] overflow-y-auto simple-scrollbar flex flex-col px-2 py-1", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:126:13" }; const _hoisted_14 = { key: 0, class: "w-full px-3 md:px-4 pb-3 caption mt-1 text-body-2xs", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:138:13" }; const _hoisted_15 = { key: 2, class: "flex justify-between w-full p-2 border-t border-outline-2", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:150:11" }; const _hoisted_16 = { key: 3, class: "flex justify-between w-full p-2 border-t border-outline-2", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:165:11" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_UserAvatarGroup = __nuxt_component_0; const _component_IconCircleCheck = __nuxt_component_1; const _component_FormButton = __nuxt_component_2; const _component_LayoutMenu = __nuxt_component_3; const _component_ViewerAnchoredPointThreadComment = __nuxt_component_4; const _component_ViewerAnchoredPointThreadNewReply = __nuxt_component_5; const _component_ViewerCommentsPortalOrDiv = __nuxt_component_6; const _directive_tippy = _resolveDirective("tippy"); return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createElementVNode( "div", { class: "absolute pointer-events-auto", style: _normalizeStyle({ ...$props.modelValue.style, opacity: 1 }), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:3:5" }, [ _createElementVNode( "div", _hoisted_2, [ _createElementVNode( "button", { class: _normalizeClass(` ${$props.modelValue.isOccluded && !$setup.isExpanded ? "opacity-60 hover:opacity-100" : ""} ${$setup.isExpanded ? "outline outline-2 outline-primary" : ""} transition bg-foundation shadow hover:shadow-xl flex -space-x-2 items-center p-[2px] rounded-tr-full rounded-tl-full rounded-br-full`), onClick: $setup.onThreadClick, "data-v-inspector": "components/viewer/anchored-point/Thread.vue:11:9" }, [ !$props.modelValue.archived ? (_openBlock(), _createBlock(_component_UserAvatarGroup, { key: 0, "hide-tooltips": "", users: $setup.threadAuthors, "data-v-inspector": "components/viewer/anchored-point/Thread.vue:18:11" }, null, 8, ["users"])) : _createCommentVNode("v-if", true), $props.modelValue.archived ? (_openBlock(), _createElementBlock("div", _hoisted_3, [ _createElementVNode("div", _hoisted_4, [ _createVNode(_component_IconCircleCheck, { class: "size-5 text-primary", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:30:15" }) ]) ])) : _createCommentVNode("v-if", true) ], 2 /* CLASS */ ) ], 512 /* NEED_PATCH */ ) ], 4 /* STYLE */ ), $setup.isExpanded ? (_openBlock(), _createElementBlock( "div", { key: 0, ref: "threadContainer", class: "thread-container fixed mb-16 bottom-0 right-0 sm:bottom-auto sm:right-auto w-screen sm:w-80 z-50 pointer-events-auto", style: _normalizeStyle($setup.threadStyle), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:36:5" }, [ _createVNode(_component_ViewerCommentsPortalOrDiv, { to: "mobileComments", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:42:7" }, { default: _withCtx(() => [ _createElementVNode( "div", { class: _normalizeClass(["relative bg-foundation border border-outline-2 flex flex-col overflow-hidden sm:shadow-md cursor-auto sm:rounded-lg h-full transition-all duration-200", { "is-dragging border-outline-5": $setup.isDragging }]), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:43:9" }, [ _createElementVNode( "div", _hoisted_5, [ _createElementVNode("div", _hoisted_6, [ _createElementVNode("div", _hoisted_7, [ _createVNode(_component_FormButton, { "icon-left": $setup.ChevronLeft, color: "outline", "hide-text": "", size: "sm", disabled: !$props.hasPrevious, onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("prev", $props.modelValue)), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:53:17" }, null, 8, ["icon-left", "disabled"]), _createVNode(_component_FormButton, { "icon-left": $setup.ChevronRight, color: "outline", "hide-text": "", size: "sm", disabled: !$props.hasNext, onClick: _cache[1] || (_cache[1] = ($event) => $setup.emit("next", $props.modelValue)), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:61:17" }, null, 8, ["icon-left", "disabled"]) ]) ]), _createElementVNode("div", _hoisted_8, [ _createElementVNode("div", _hoisted_9, [ _createVNode(_component_LayoutMenu, { open: $setup.showMenu, "onUpdate:open": _cache[3] || (_cache[3] = ($event) => $setup.showMenu = $event), "menu-id": $setup.menuId, items: $setup.actionsItems, "mount-menu-on-body": "", onClick: _cache[4] || (_cache[4] = _withModifiers(() => { }, ["stop", "prevent"])), onChosen: $setup.onActionChosen, "data-v-inspector": "components/viewer/anchored-point/Thread.vue:73:17" }, { default: _withCtx(() => [ _createVNode(_component_FormButton, { "hide-text": "", size: "sm", color: "subtle", class: _normalizeClass($setup.showMenu ? "!bg-highlight-3" : ""), "icon-left": $setup.Ellipsis, onClick: _cache[2] || (_cache[2] = ($event) => $setup.showMenu = !$setup.showMenu), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:81:19" }, null, 8, ["class", "icon-left"]) ]), _: 1 /* STABLE */ }, 8, ["open", "menu-id", "items"]) ]), _withDirectives(_createVNode(_component_FormButton, { "icon-left": $setup.CircleCheck, "hide-text": "", disabled: !$setup.canArchiveOrUnarchive, color: "subtle", size: "sm", onClick: _cache[5] || (_cache[5] = ($event) => $setup.toggleCommentResolvedStatus()), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:91:15" }, null, 8, ["icon-left", "disabled"]), [ [_directive_tippy, $props.modelValue.archived ? "Unresolve" : "Resolve"] ]), _createVNode(_component_FormButton, { "icon-left": $setup.X, "hide-text": "", color: "subtle", size: "sm", onClick: _cache[6] || (_cache[6] = ($event) => $setup.changeExpanded(false)), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:100:15" }, null, 8, ["icon-left"]) ]) ], 512 /* NEED_PATCH */ ), $setup.showBanner ? (_openBlock(), _createElementBlock("div", _hoisted_10, [ _createElementVNode( "div", _hoisted_11, _toDisplayString($setup.bannerText), 1 /* TEXT */ ), _createVNode(_component_FormButton, { "icon-right": $setup.bannerButton.icon, size: "sm", color: "outline", onClick: $setup.bannerButton.action, "data-v-inspector": "components/viewer/anchored-point/Thread.vue:116:13" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.bannerButton.text), 1 /* TEXT */ ) ]), _: 1 /* STABLE */ }, 8, ["icon-right", "onClick"]) ])) : _createCommentVNode("v-if", true), _createElementVNode("div", _hoisted_12, [ _createElementVNode( "div", _hoisted_13, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.comments, (comment) => { return _openBlock(), _createBlock(_component_ViewerAnchoredPointThreadComment, { key: comment.id, comment, "project-id": $setup.projectId, onMounted: $setup.onCommentMounted, "data-v-inspector": "components/viewer/anchored-point/Thread.vue:130:15" }, null, 8, ["comment", "project-id"]); }), 128 /* KEYED_FRAGMENT */ )) ], 512 /* NEED_PATCH */ ), $setup.isTypingMessage ? (_openBlock(), _createElementBlock( "div", _hoisted_14, _toDisplayString($setup.isTypingMessage), 1 /* TEXT */ )) : _createCommentVNode("v-if", true) ]), $setup.showNewReplyComponent ? (_openBlock(), _createBlock(_component_ViewerAnchoredPointThreadNewReply, { key: 1, "model-value": $props.modelValue, onSubmit: $setup.onNewReply, "data-v-inspector": "components/viewer/anchored-point/Thread.vue:145:11" }, null, 8, ["model-value"])) : _createCommentVNode("v-if", true), $setup.isEmbedEnabled ? (_openBlock(), _createElementBlock("div", _hoisted_15, [ _createVNode(_component_FormButton, { "full-width": "", to: $setup.getLinkToThread($setup.projectId, $setup.props.modelValue), external: "", target: "_blank", size: "sm", color: "outline", "data-v-inspector": "components/viewer/anchored-point/Thread.vue:154:13" }, { default: _withCtx(() => [..._cache[8] || (_cache[8] = [ _createTextVNode( " Reply in Speckle ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }, 8, ["to"]) ])) : _createCommentVNode("v-if", true), !$setup.canReply && !$setup.isEmbedEnabled && !$setup.isLoggedIn ? (_openBlock(), _createElementBlock("div", _hoisted_16, [ _createVNode(_component_FormButton, { "full-width": "", color: "outline", size: "sm", onClick: _cache[7] || (_cache[7] = ($event) => _ctx.$emit("login")), "data-v-inspector": "components/viewer/anchored-point/Thread.vue:169:13" }, { default: _withCtx(() => [..._cache[9] || (_cache[9] = [ _createTextVNode( " Reply ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ }) ])) : _createCommentVNode("v-if", true) ], 2 /* CLASS */ ) ]), _: 1 /* STABLE */ }) ], 4 /* STYLE */ )) : _createCommentVNode("v-if", true) ]); } import "/_nuxt/components/viewer/anchored-point/Thread.vue?vue&type=style&index=0&scoped=a8417d9a&lang.css"; _sfc_main.__hmrId = "a8417d9a"; 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], ["__scopeId", "data-v-a8417d9a"], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/anchored-point/Thread.vue"]]); //# sourceMappingURL=data:application/json;base64,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LFFBQVE7QUFBQSw0QkFDYjtBQUFBLDRCQUNBLGNBQVk7QUFBQSw0QkFDWixXQUFTO0FBQUEsNEJBQWtCLG9CQUFpQjtBQUFBOzs7Ozs7Ozs7a0JBSXpDLHdDQURSO0FBQUEsb0JBS007QUFBQSxvQkFMTjtBQUFBLG9CQUtNLGlCQURELHNCQUFlO0FBQUE7QUFBQTtBQUFBOztnQkFJZCw4Q0FEUixhQUlFO0FBQUE7a0JBRkMsZUFBYTtBQUFBLGtCQUNiLFVBQVE7QUFBQSxrQkFBWSxvQkFBaUI7QUFBQTtnQkFHaEMsdUNBRFIsb0JBY00sT0FkTixhQWNNO0FBQUEsa0JBVkosYUFTYTtBQUFBLG9CQVJYO0FBQUEsb0JBQ0MsSUFBSSx1QkFBZ0Isa0JBQVcsYUFBTSxVQUFVO0FBQUEsb0JBQ2hEO0FBQUEsb0JBQ0EsUUFBTztBQUFBLG9CQUNQLE1BQUs7QUFBQSxvQkFDTCxPQUFNO0FBQUEsb0JBQVUsb0JBQWlCO0FBQUE7c0NBQ2xDLE1BRUQ7QUFBQTt3QkFGQztBQUFBLHdCQUVEO0FBQUE7QUFBQTtBQUFBOzs7OztpQkFHTyxtQkFBUSxDQUFLLHlCQUFjLENBQUssbUNBRHpDLG9CQU9NLE9BUE4sYUFPTTtBQUFBLGtCQUhKLGFBRWE7QUFBQSxvQkFGRDtBQUFBLG9CQUFXLE9BQU07QUFBQSxvQkFBVSxNQUFLO0FBQUEsb0JBQU0sU0FBSyxzQ0FBRSxXQUFLO0FBQUEsb0JBQVcsb0JBQWlCO0FBQUE7c0NBQXFELE1BRS9JO0FBQUE7d0JBRitJO0FBQUEsd0JBRS9JO0FBQUE7QUFBQTtBQUFBIiwibmFtZXMiOlsiQWN0aW9uVHlwZXMiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiVGhyZWFkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6MjozXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwiYWJzb2x1dGUgcG9pbnRlci1ldmVudHMtYXV0b1wiXHJcbiAgICAgIDpzdHlsZT1cIntcclxuICAgICAgICAuLi5tb2RlbFZhbHVlLnN0eWxlLFxyXG4gICAgICAgIG9wYWNpdHk6IDFcclxuICAgICAgfVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgcmVmPVwidGhyZWFkQWN0aXZhdG9yXCIgY2xhc3M9XCJyZWxhdGl2ZVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEwOjdcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICA6Y2xhc3M9XCJgXHJcbiAgICAgICAgJHttb2RlbFZhbHVlLmlzT2NjbHVkZWQgJiYgIWlzRXhwYW5kZWQgPyAnb3BhY2l0eS02MCBob3ZlcjpvcGFjaXR5LTEwMCcgOiAnJ31cclxuICAgICAgICAke2lzRXhwYW5kZWQgPyAnb3V0bGluZSBvdXRsaW5lLTIgb3V0bGluZS1wcmltYXJ5JyA6ICcnfVxyXG4gICAgICAgIHRyYW5zaXRpb24gYmctZm91bmRhdGlvbiBzaGFkb3cgaG92ZXI6c2hhZG93LXhsIGZsZXggLXNwYWNlLXgtMiBpdGVtcy1jZW50ZXIgcC1bMnB4XSByb3VuZGVkLXRyLWZ1bGwgcm91bmRlZC10bC1mdWxsIHJvdW5kZWQtYnItZnVsbGBcIlxyXG4gICAgICAgICAgQGNsaWNrPVwib25UaHJlYWRDbGlja1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjExOjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxVc2VyQXZhdGFyR3JvdXBcclxuICAgICAgICAgICAgdi1pZj1cIiFtb2RlbFZhbHVlLmFyY2hpdmVkXCJcclxuICAgICAgICAgICAgaGlkZS10b29sdGlwc1xyXG4gICAgICAgICAgICA6dXNlcnM9XCJ0aHJlYWRBdXRob3JzXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6MTg6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cIm1vZGVsVmFsdWUuYXJjaGl2ZWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInctNyBoLTcgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToyMzoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICBjbGFzcz1cInctNiBoLTYgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctZm91bmRhdGlvbiBkYXJrOmJnLWZvdW5kYXRpb24tMiByb3VuZGVkLWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToyNzoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8SWNvbkNpcmNsZUNoZWNrIGNsYXNzPVwic2l6ZS01IHRleHQtcHJpbWFyeVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjMwOjE1XCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgdi1pZj1cImlzRXhwYW5kZWRcIlxyXG4gICAgICByZWY9XCJ0aHJlYWRDb250YWluZXJcIlxyXG4gICAgICBjbGFzcz1cInRocmVhZC1jb250YWluZXIgZml4ZWQgbWItMTYgYm90dG9tLTAgcmlnaHQtMCBzbTpib3R0b20tYXV0byBzbTpyaWdodC1hdXRvIHctc2NyZWVuIHNtOnctODAgei01MCBwb2ludGVyLWV2ZW50cy1hdXRvXCJcclxuICAgICAgOnN0eWxlPVwidGhyZWFkU3R5bGVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTozNjo1XCJcclxuICAgID5cclxuICAgICAgPFZpZXdlckNvbW1lbnRzUG9ydGFsT3JEaXYgdG89XCJtb2JpbGVDb21tZW50c1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjQyOjdcIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIGJnLWZvdW5kYXRpb24gYm9yZGVyIGJvcmRlci1vdXRsaW5lLTIgZmxleCBmbGV4LWNvbCBvdmVyZmxvdy1oaWRkZW4gc206c2hhZG93LW1kIGN1cnNvci1hdXRvIHNtOnJvdW5kZWQtbGcgaC1mdWxsIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMFwiXHJcbiAgICAgICAgICA6Y2xhc3M9XCJ7ICdpcy1kcmFnZ2luZyBib3JkZXItb3V0bGluZS01JzogaXNEcmFnZ2luZyB9XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NDM6OVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICByZWY9XCJoYW5kbGVcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInJlbGF0aXZlIHctZnVsbCBmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgYm9yZGVyLWIgYm9yZGVyLW91dGxpbmUtMiBwLTIgcGItMS41IGN1cnNvci1tb3ZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NDc6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93IGZsZXggaXRlbXMtY2VudGVyIGdhcC14LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTo1MToxM1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAteC0wLjVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTo1MjoxNVwiPlxyXG4gICAgICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICAgICAgOmljb24tbGVmdD1cIkNoZXZyb25MZWZ0XCJcclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFoYXNQcmV2aW91c1wiXHJcbiAgICAgICAgICAgICAgICAgIEBjbGljaz1cImVtaXQoJ3ByZXYnLCBtb2RlbFZhbHVlKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjUzOjE3XCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICA6aWNvbi1sZWZ0PVwiQ2hldnJvblJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFoYXNOZXh0XCJcclxuICAgICAgICAgICAgICAgICAgQGNsaWNrPVwiZW1pdCgnbmV4dCcsIG1vZGVsVmFsdWUpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NjE6MTdcIlxyXG4gICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC14LTAuNVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjcxOjEzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6NzI6MTVcIj5cclxuICAgICAgICAgICAgICAgIDxMYXlvdXRNZW51XHJcbiAgICAgICAgICAgICAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dNZW51XCJcclxuICAgICAgICAgICAgICAgICAgOm1lbnUtaWQ9XCJtZW51SWRcIlxyXG4gICAgICAgICAgICAgICAgICA6aXRlbXM9XCJhY3Rpb25zSXRlbXNcIlxyXG4gICAgICAgICAgICAgICAgICBtb3VudC1tZW51LW9uLWJvZHlcclxuICAgICAgICAgICAgICAgICAgQGNsaWNrLnN0b3AucHJldmVudFxyXG4gICAgICAgICAgICAgICAgICBAY2hvc2VuPVwib25BY3Rpb25DaG9zZW5cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZTo3MzoxN1wiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInN1YnRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgOmNsYXNzPVwic2hvd01lbnUgPyAnIWJnLWhpZ2hsaWdodC0zJyA6ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICA6aWNvbi1sZWZ0PVwiRWxsaXBzaXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIEBjbGljaz1cInNob3dNZW51ID0gIXNob3dNZW51XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6ODE6MTlcIlxyXG4gICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9MYXlvdXRNZW51PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgICB2LXRpcHB5PVwibW9kZWxWYWx1ZS5hcmNoaXZlZCA/ICdVbnJlc29sdmUnIDogJ1Jlc29sdmUnXCJcclxuICAgICAgICAgICAgICAgIDppY29uLWxlZnQ9XCJDaXJjbGVDaGVja1wiXHJcbiAgICAgICAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgICAgICAgIDpkaXNhYmxlZD1cIiFjYW5BcmNoaXZlT3JVbmFyY2hpdmVcIlxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cInRvZ2dsZUNvbW1lbnRSZXNvbHZlZFN0YXR1cygpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6OTE6MTVcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgICAgICAgIDppY29uLWxlZnQ9XCJYXCJcclxuICAgICAgICAgICAgICAgIGhpZGUtdGV4dFxyXG4gICAgICAgICAgICAgICAgY29sb3I9XCJzdWJ0bGVcIlxyXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICAgIEBjbGljaz1cImNoYW5nZUV4cGFuZGVkKGZhbHNlKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEwMDoxNVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cInNob3dCYW5uZXJcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNCBib3JkZXItYiBib3JkZXItb3V0bGluZS0yIHB5LTIgcHgtMiB3LWZ1bGxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxMDk6MTFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1ib2R5LTJ4cyB0ZXh0LWZvcmVncm91bmQtMiBmb250LW1lZGl1bVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjExMzoxM1wiPlxyXG4gICAgICAgICAgICAgIHt7IGJhbm5lclRleHQgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgOmljb24tcmlnaHQ9XCJiYW5uZXJCdXR0b24uaWNvblwiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgICAgIEBjbGljaz1cImJhbm5lckJ1dHRvbi5hY3Rpb25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxMTY6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgYmFubmVyQnV0dG9uLnRleHQgfX1cclxuICAgICAgICAgICAgPC9Gb3JtQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgdy1mdWxsIHNtOnctODAgZmxleCBmbGV4LWNvbCBmbGV4LTEganVzdGlmeS1iZXR3ZWVuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2FuY2hvcmVkLXBvaW50L1RocmVhZC52dWU6MTI1OjExXCI+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICByZWY9XCJjb21tZW50c0NvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC1bMjAwcHhdIHNtOm1heC1oLVszMDBweF0gMnhsOm1heC1oLVs1MDBweF0gb3ZlcmZsb3cteS1hdXRvIHNpbXBsZS1zY3JvbGxiYXIgZmxleCBmbGV4LWNvbCBweC0yIHB5LTFcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxMjY6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPFZpZXdlckFuY2hvcmVkUG9pbnRUaHJlYWRDb21tZW50XHJcbiAgICAgICAgICAgICAgICB2LWZvcj1cImNvbW1lbnQgaW4gY29tbWVudHNcIlxyXG4gICAgICAgICAgICAgICAgOmtleT1cImNvbW1lbnQuaWRcIlxyXG4gICAgICAgICAgICAgICAgOmNvbW1lbnQ9XCJjb21tZW50XCJcclxuICAgICAgICAgICAgICAgIDpwcm9qZWN0LWlkPVwicHJvamVjdElkXCJcclxuICAgICAgICAgICAgICAgIEBtb3VudGVkPVwib25Db21tZW50TW91bnRlZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEzMDoxNVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICB2LWlmPVwiaXNUeXBpbmdNZXNzYWdlXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBweC0zIG1kOnB4LTQgcGItMyBjYXB0aW9uIG10LTEgdGV4dC1ib2R5LTJ4c1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjEzODoxM1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICB7eyBpc1R5cGluZ01lc3NhZ2UgfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxWaWV3ZXJBbmNob3JlZFBvaW50VGhyZWFkTmV3UmVwbHlcclxuICAgICAgICAgICAgdi1pZj1cInNob3dOZXdSZXBseUNvbXBvbmVudFwiXHJcbiAgICAgICAgICAgIDptb2RlbC12YWx1ZT1cIm1vZGVsVmFsdWVcIlxyXG4gICAgICAgICAgICBAc3VibWl0PVwib25OZXdSZXBseVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjE0NToxMVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICB2LWlmPVwiaXNFbWJlZEVuYWJsZWRcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBwLTIgYm9yZGVyLXQgYm9yZGVyLW91dGxpbmUtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjE1MDoxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uXHJcbiAgICAgICAgICAgICAgZnVsbC13aWR0aFxyXG4gICAgICAgICAgICAgIDp0bz1cImdldExpbmtUb1RocmVhZChwcm9qZWN0SWQsIHByb3BzLm1vZGVsVmFsdWUpXCJcclxuICAgICAgICAgICAgICBleHRlcm5hbFxyXG4gICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcclxuICAgICAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxNTQ6MTNcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgUmVwbHkgaW4gU3BlY2tsZVxyXG4gICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgdi1pZj1cIiFjYW5SZXBseSAmJiAhaXNFbWJlZEVuYWJsZWQgJiYgIWlzTG9nZ2VkSW5cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBwLTIgYm9yZGVyLXQgYm9yZGVyLW91dGxpbmUtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlOjE2NToxMVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxGb3JtQnV0dG9uIGZ1bGwtd2lkdGggY29sb3I9XCJvdXRsaW5lXCIgc2l6ZT1cInNtXCIgQGNsaWNrPVwiJGVtaXQoJ2xvZ2luJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvYW5jaG9yZWQtcG9pbnQvVGhyZWFkLnZ1ZToxNjk6MTNcIj5cclxuICAgICAgICAgICAgICBSZXBseVxyXG4gICAgICAgICAgICA8L0Zvcm1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9WaWV3ZXJDb21tZW50c1BvcnRhbE9yRGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvdGVtcGxhdGU+XHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7XHJcbiAgTW92ZUxlZnQsXHJcbiAgTW92ZVJpZ2h0LFxyXG4gIENpcmNsZUNoZWNrLFxyXG4gIFgsXHJcbiAgQ2hldnJvbkxlZnQsXHJcbiAgQ2hldnJvblJpZ2h0LFxyXG4gIEVsbGlwc2lzXHJcbn0gZnJvbSAnbHVjaWRlLXZ1ZS1uZXh0J1xyXG5pbXBvcnQgeyBlbnN1cmVFcnJvciB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgb25LZXlEb3duLCB1c2VDbGlwYm9hcmQsIHVzZURyYWdnYWJsZSwgb25DbGlja091dHNpZGUgfSBmcm9tICdAdnVldXNlL2NvcmUnXHJcbmltcG9ydCB7IHNjcm9sbFRvQm90dG9tIH0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL2RvbSdcclxuaW1wb3J0IHsgdXNlVmlld2VyVGhyZWFkVHlwaW5nVHJhY2tpbmcgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL2FjdGl2aXR5J1xyXG5pbXBvcnQgeyB1c2VBbmltYXRpbmdFbGxpcHNpcyB9IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvY29tbWVudEJ1YmJsZXMnXHJcbmltcG9ydCB0eXBlIHsgQ29tbWVudEJ1YmJsZU1vZGVsIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9jb21tZW50QnViYmxlcydcclxuaW1wb3J0IHtcclxuICB1c2VBcmNoaXZlQ29tbWVudCxcclxuICB1c2VDaGVja1ZpZXdlckNvbW1lbnRpbmdBY2Nlc3MsXHJcbiAgdXNlTWFya1RocmVhZFZpZXdlZCxcclxuICB1c2VDb21tZW50Q29udGV4dFxyXG59IGZyb20gJ35+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvY29tbWVudE1hbmFnZW1lbnQnXHJcbmltcG9ydCB7IHVzZUluamVjdGVkVmlld2VyU3RhdGUgfSBmcm9tICd+fi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3NldHVwJ1xyXG5pbXBvcnQgeyB1c2VBY3RpdmVVc2VyIH0gZnJvbSAnfn4vbGliL2F1dGgvY29tcG9zYWJsZXMvYWN0aXZlVXNlcidcclxuaW1wb3J0IHsgVG9hc3ROb3RpZmljYXRpb25UeXBlLCB1c2VHbG9iYWxUb2FzdCB9IGZyb20gJ35+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvdG9hc3QnXHJcbmltcG9ydCB7IGdldExpbmtUb1RocmVhZCB9IGZyb20gJ35+L2xpYi92aWV3ZXIvaGVscGVycy9jb21tZW50cydcclxuaW1wb3J0IHsgdXNlRGlzYWJsZUdsb2JhbFRleHRTZWxlY3Rpb24gfSBmcm9tICd+fi9saWIvY29tbW9uL2NvbXBvc2FibGVzL3dpbmRvdydcclxuaW1wb3J0IHsgdXNlTWl4cGFuZWwgfSBmcm9tICd+fi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlVGhyZWFkVXRpbGl0aWVzIH0gZnJvbSAnfn4vbGliL3ZpZXdlci9jb21wb3NhYmxlcy91aSdcclxuaW1wb3J0IHsgdXNlRW1iZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZW1iZWQnXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBMYXlvdXRNZW51SXRlbSB9IGZyb20gJ35+L2xpYi9sYXlvdXQvaGVscGVycy9jb21wb25lbnRzJ1xyXG5cclxuZW51bSBBY3Rpb25UeXBlcyB7XHJcbiAgQ29weUxpbmsgPSAnY29weS1saW5rJyxcclxuICBQb3BJbiA9ICdwb3AtaW4nXHJcbn1cclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFZpZXdlckNvbW1lbnRUaHJlYWREYXRhIG9uIENvbW1lbnQge1xyXG4gICAgaWRcclxuICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgY2FuQXJjaGl2ZSB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHtcclxuICAoZTogJ3VwZGF0ZTptb2RlbFZhbHVlJywgdjogQ29tbWVudEJ1YmJsZU1vZGVsKTogdm9pZFxyXG4gIChlOiAndXBkYXRlOmV4cGFuZGVkJywgdjogYm9vbGVhbik6IHZvaWRcclxuICAoZTogJ25leHQnLCB2OiBDb21tZW50QnViYmxlTW9kZWwpOiB2b2lkXHJcbiAgKGU6ICdwcmV2JywgdjogQ29tbWVudEJ1YmJsZU1vZGVsKTogdm9pZFxyXG4gIChlOiAnbG9naW4nKTogdm9pZFxyXG59PigpXHJcblxyXG5jb25zdCBwcm9wcyA9IGRlZmluZVByb3BzPHtcclxuICBtb2RlbFZhbHVlOiBDb21tZW50QnViYmxlTW9kZWxcclxuICBoYXNQcmV2aW91cz86IGJvb2xlYW5cclxuICBoYXNOZXh0PzogYm9vbGVhblxyXG59PigpXHJcblxyXG5jb25zdCB7IGlzRW1iZWRFbmFibGVkIH0gPSB1c2VFbWJlZCgpXHJcblxyXG5jb25zdCB0aHJlYWRJZCA9IGNvbXB1dGVkKCgpID0+IHByb3BzLm1vZGVsVmFsdWUuaWQpXHJcbmNvbnN0IHsgY29weSB9ID0gdXNlQ2xpcGJvYXJkKClcclxuY29uc3QgeyBpc0xvZ2dlZEluIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuY29uc3QgYXJjaGl2ZUNvbW1lbnQgPSB1c2VBcmNoaXZlQ29tbWVudCgpXHJcbmNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG5jb25zdCB7IHByb2plY3RJZCB9ID0gdXNlSW5qZWN0ZWRWaWV3ZXJTdGF0ZSgpXHJcbmNvbnN0IGNhblJlcGx5ID0gdXNlQ2hlY2tWaWV3ZXJDb21tZW50aW5nQWNjZXNzKClcclxuY29uc3QgeyBkaXNhYmxlVGV4dFNlbGVjdGlvbiB9ID0gdXNlRGlzYWJsZUdsb2JhbFRleHRTZWxlY3Rpb24oKVxyXG5jb25zdCBtYXJrVGhyZWFkVmlld2VkID0gdXNlTWFya1RocmVhZFZpZXdlZCgpXHJcbmNvbnN0IHsgdXNlcnNUeXBpbmcgfSA9IHVzZVZpZXdlclRocmVhZFR5cGluZ1RyYWNraW5nKHRocmVhZElkKVxyXG5jb25zdCB7IGVsbGlwc2lzLCBjb250cm9scyB9ID0gdXNlQW5pbWF0aW5nRWxsaXBzaXMoKVxyXG5jb25zdCB7IHRocmVhZFJlc291cmNlU3RhdHVzLCBoYXNDbGlja2VkRnVsbENvbnRleHQsIGdvQmFjaywgaGFuZGxlQ29udGV4dENsaWNrIH0gPVxyXG4gIHVzZUNvbW1lbnRDb250ZXh0KClcclxuY29uc3QgeyBpc09wZW5UaHJlYWQsIG9wZW4sIGNsb3NlQWxsVGhyZWFkcyB9ID0gdXNlVGhyZWFkVXRpbGl0aWVzKClcclxuY29uc3Qgcm91dGVyID0gdXNlU2FmZVJvdXRlcigpXHJcbmNvbnN0IG1lbnVJZCA9IHVzZUlkKClcclxuXHJcbmNvbnN0IHNob3dNZW51ID0gcmVmKGZhbHNlKVxyXG5jb25zdCBjb21tZW50c0NvbnRhaW5lciA9IHJlZihudWxsIGFzIE51bGxhYmxlPEhUTUxFbGVtZW50PilcclxuY29uc3QgdGhyZWFkQ29udGFpbmVyID0gcmVmKG51bGwgYXMgTnVsbGFibGU8SFRNTEVsZW1lbnQ+KVxyXG5jb25zdCB0aHJlYWRBY3RpdmF0b3IgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcblxyXG5vbkNsaWNrT3V0c2lkZSh0aHJlYWRDb250YWluZXIsIChldmVudCkgPT4ge1xyXG4gIGNvbnN0IHZpZXdlckVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlld2VyJylcclxuXHJcbiAgaWYgKFxyXG4gICAgaXNFeHBhbmRlZC52YWx1ZSAmJlxyXG4gICAgdmlld2VyRWxlbWVudCAmJlxyXG4gICAgKGV2ZW50LnRhcmdldCA9PT0gdmlld2VyRWxlbWVudCB8fCB2aWV3ZXJFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkgJiZcclxuICAgICEodGhyZWFkQWN0aXZhdG9yLnZhbHVlICYmIHRocmVhZEFjdGl2YXRvci52YWx1ZS5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkpXHJcbiAgKSB7XHJcbiAgICBjaGFuZ2VFeHBhbmRlZChmYWxzZSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBoYW5kbGUgPSByZWYobnVsbCBhcyBOdWxsYWJsZTxIVE1MRWxlbWVudD4pXHJcbmNvbnN0IGp1c3RDcmVhdGVkUmVwbHkgPSByZWYoZmFsc2UpXHJcblxyXG5jb25zdCBjb21tZW50cyA9IGNvbXB1dGVkKCgpID0+IFtcclxuICBwcm9wcy5tb2RlbFZhbHVlLFxyXG4gIC4uLnByb3BzLm1vZGVsVmFsdWUucmVwbGllcy5pdGVtcy5zbGljZSgpLnJldmVyc2UoKVxyXG5dKVxyXG5cclxuY29uc3Qgc2hvd05ld1JlcGx5Q29tcG9uZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIHJldHVybiAhcHJvcHMubW9kZWxWYWx1ZS5hcmNoaXZlZCAmJiBjYW5SZXBseS52YWx1ZSAmJiAhaXNFbWJlZEVuYWJsZWQudmFsdWVcclxufSlcclxuXHJcbmNvbnN0IGlzRXhwYW5kZWQgPSBjb21wdXRlZCgoKSA9PiBpc09wZW5UaHJlYWQocHJvcHMubW9kZWxWYWx1ZS5pZCkpXHJcblxyXG5jb25zdCBpc1R5cGluZ01lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKCF1c2Vyc1R5cGluZy52YWx1ZS5sZW5ndGgpIHJldHVybiBudWxsXHJcbiAgcmV0dXJuIHVzZXJzVHlwaW5nLnZhbHVlLmxlbmd0aCA+IDFcclxuICAgID8gYCR7dXNlcnNUeXBpbmcudmFsdWUubWFwKCh1KSA9PiB1LnVzZXJOYW1lKS5qb2luKCcsICcpfSBhcmUgdHlwaW5nJHtcclxuICAgICAgICBlbGxpcHNpcy52YWx1ZVxyXG4gICAgICB9YFxyXG4gICAgOiBgJHt1c2Vyc1R5cGluZy52YWx1ZVswXS51c2VyTmFtZX0gaXMgdHlwaW5nJHtlbGxpcHNpcy52YWx1ZX1gXHJcbn0pXHJcblxyXG5jb25zdCBpc1ZpZXdlZCA9IGNvbXB1dGVkKCgpID0+ICEhcHJvcHMubW9kZWxWYWx1ZS52aWV3ZWRBdClcclxuXHJcbmNvbnN0IGluaXRpYWxEcmFnUG9zaXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHg6IHByb3BzLm1vZGVsVmFsdWUuc3R5bGUueCBhcyBudW1iZXIsXHJcbiAgICB5OiBwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnkgYXMgbnVtYmVyXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbXAgPSB1c2VNaXhwYW5lbCgpXHJcblxyXG5jb25zdCBpc0RyYWdnZWQgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHsgeCwgeSwgaXNEcmFnZ2luZywgcG9zaXRpb24gfSA9IHVzZURyYWdnYWJsZSh0aHJlYWRDb250YWluZXIsIHtcclxuICBzdG9wUHJvcGFnYXRpb246IHRydWUsXHJcbiAgaGFuZGxlLFxyXG4gIGluaXRpYWxWYWx1ZTogaW5pdGlhbERyYWdQb3NpdGlvbixcclxuICBvblN0YXJ0KF9wb3MsIGV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IGFsbG93IGRyYWdnaW5nIGZyb20gaGVhZGVyLCBidXQgbm90IGZyb20gaW50ZXJhY3RpdmUgZWxlbWVudHNcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudFxyXG5cclxuICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyB0aGUgaGFuZGxlIG9yIGNvbnRhaW5lZCB3aXRoaW4gaXRcclxuICAgIGNvbnN0IGlzV2l0aGluSGFuZGxlID0gdGFyZ2V0ID09PSBoYW5kbGUudmFsdWUgfHwgaGFuZGxlLnZhbHVlPy5jb250YWlucyh0YXJnZXQpXHJcbiAgICBpZiAoIWlzV2l0aGluSGFuZGxlKSByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAvLyBQcmV2ZW50IGRyYWdnaW5nIHdoZW4gY2xpY2tpbmcgb24gYnV0dG9ucyBvciBvdGhlciBpbnRlcmFjdGl2ZSBlbGVtZW50c1xyXG4gICAgY29uc3QgaXNJbnRlcmFjdGl2ZUVsZW1lbnQgPVxyXG4gICAgICB0YXJnZXQuY2xvc2VzdCgnYnV0dG9uJykgfHxcclxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoJ2EnKSB8fFxyXG4gICAgICB0YXJnZXQuY2xvc2VzdCgnW3JvbGU9XCJidXR0b25cIl0nKVxyXG4gICAgaWYgKGlzSW50ZXJhY3RpdmVFbGVtZW50KSByZXR1cm4gZmFsc2VcclxuXHJcbiAgICAvLyBSZXNldCBwb3MsIGlmIHN0YXJ0aW5nIGRyYWdnaW5nIGZyb20gc2NyYXRjaFxyXG4gICAgaWYgKCFpc0RyYWdnZWQudmFsdWUpIHBvc2l0aW9uLnZhbHVlID0geyB4OiAwLCB5OiAwIH1cclxuXHJcbiAgICBpc0RyYWdnZWQudmFsdWUgPSB0cnVlXHJcbiAgICBtcC50cmFjaygnQ29tbWVudCBBY3Rpb24nLCB7IHR5cGU6ICdhY3Rpb24nLCBuYW1lOiAnZHJhZycgfSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB0aHJlYWRTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIXRocmVhZEFjdGl2YXRvci52YWx1ZSkgcmV0dXJuIHByb3BzLm1vZGVsVmFsdWUuc3R5bGVcclxuXHJcbiAgY29uc3QgYWN0aXZhdG9yUmVjdCA9IHRocmVhZEFjdGl2YXRvci52YWx1ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuICBjb25zdCBhcmVEcmFnZ2FibGVDb29yZHNJbml0aWFsaXplZCA9IHgudmFsdWUgJiYgeS52YWx1ZVxyXG4gIGNvbnN0IHhPZmZzZXQgPVxyXG4gICAgaXNEcmFnZ2VkLnZhbHVlICYmIGFyZURyYWdnYWJsZUNvb3Jkc0luaXRpYWxpemVkXHJcbiAgICAgID8geC52YWx1ZVxyXG4gICAgICA6IChwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnggYXMgbnVtYmVyKSArIGFjdGl2YXRvclJlY3Qud2lkdGggKyAyMFxyXG4gIGNvbnN0IHRocmVhZEhlaWdodCA9IHRocmVhZENvbnRhaW5lci52YWx1ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0IHx8IDBcclxuICBjb25zdCB0aHJlYWRXaWR0aCA9IHRocmVhZENvbnRhaW5lci52YWx1ZT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgMFxyXG4gIGNvbnN0IHlPZmZzZXQgPVxyXG4gICAgaXNEcmFnZ2VkLnZhbHVlICYmIGFyZURyYWdnYWJsZUNvb3Jkc0luaXRpYWxpemVkXHJcbiAgICAgID8geS52YWx1ZVxyXG4gICAgICA6IChwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnkgYXMgbnVtYmVyKSAtIHRocmVhZEhlaWdodCAvIDJcclxuXHJcbiAgLy8gQ29uc3RyYWluIHRvIHZpZXdwb3J0IGJvdW5kYXJpZXMgd2l0aCAxMHB4IHBhZGRpbmdcclxuICBjb25zdCBwYWRkaW5nID0gaXNFbWJlZEVuYWJsZWQudmFsdWUgPyA1IDogMTBcclxuICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGhcclxuICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxyXG5cclxuICAvLyBVc2UgNThweCB0b3AgcGFkZGluZyB3aGVuIG5vdCBpbiBlbWJlZCBtb2RlICh0byBhY2NvdW50IGZvciB0aGUgdG9wIGJhcilcclxuICBjb25zdCB0b3BQYWRkaW5nID0gaXNFbWJlZEVuYWJsZWQudmFsdWUgPyBwYWRkaW5nIDogNThcclxuXHJcbiAgLy8gVXNlIDYycHggYm90dG9tIHBhZGRpbmcgd2hlbiBpbiBlbWJlZCBtb2RlICh0byBhY2NvdW50IGZvciB0aGUgYm90dG9tIGNvbnRyb2xzKVxyXG4gIGNvbnN0IGJvdHRvbVBhZGRpbmcgPSBpc0VtYmVkRW5hYmxlZC52YWx1ZSA/IDYyIDogcGFkZGluZ1xyXG5cclxuICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgc3RheXMgd2l0aGluIHRoZSB2aWV3cG9ydFxyXG4gIGNvbnN0IGNvbnN0cmFpbmVkWCA9IE1hdGgubWluKFxyXG4gICAgTWF0aC5tYXgocGFkZGluZywgeE9mZnNldCksXHJcbiAgICB2aWV3cG9ydFdpZHRoIC0gdGhyZWFkV2lkdGggLSBwYWRkaW5nXHJcbiAgKVxyXG4gIGNvbnN0IGNvbnN0cmFpbmVkWSA9IE1hdGgubWluKFxyXG4gICAgTWF0aC5tYXgodG9wUGFkZGluZywgeU9mZnNldCksXHJcbiAgICB2aWV3cG9ydEhlaWdodCAtIHRocmVhZEhlaWdodCAtIGJvdHRvbVBhZGRpbmdcclxuICApXHJcblxyXG4gIGNvbnN0IHRyYW5zaXRpb24gPSBpc0RyYWdnZWQudmFsdWUgPyAnbm9uZScgOiBwcm9wcy5tb2RlbFZhbHVlLnN0eWxlLnRyYW5zaXRpb25cclxuICByZXR1cm4ge1xyXG4gICAgLi4ucHJvcHMubW9kZWxWYWx1ZS5zdHlsZSxcclxuICAgIG9wYWNpdHk6IDEsXHJcbiAgICB0cmFuc2l0aW9uLFxyXG4gICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7Y29uc3RyYWluZWRYfXB4LCR7Y29uc3RyYWluZWRZfXB4KWBcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCB0aHJlYWRBdXRob3JzID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGNvbnN0IGF1dGhvcnMgPSBbcHJvcHMubW9kZWxWYWx1ZS5hdXRob3JdXHJcbiAgZm9yIChjb25zdCBhdXRob3Igb2YgcHJvcHMubW9kZWxWYWx1ZS5yZXBseUF1dGhvcnMuaXRlbXMpIHtcclxuICAgIGlmICghYXV0aG9ycy5maW5kKCh1KSA9PiB1LmlkID09PSBhdXRob3IuaWQpKSBhdXRob3JzLnB1c2goYXV0aG9yKVxyXG4gIH1cclxuICByZXR1cm4gYXV0aG9yc1xyXG59KVxyXG5cclxuY29uc3QgYWN0aW9uc0l0ZW1zID0gY29tcHV0ZWQ8TGF5b3V0TWVudUl0ZW1bXVtdPigoKSA9PiBbXHJcbiAgW1xyXG4gICAge1xyXG4gICAgICB0aXRsZTogJ0NvcHkgbGluaycsXHJcbiAgICAgIGlkOiBBY3Rpb25UeXBlcy5Db3B5TGlua1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdGl0bGU6ICdQb3AgaW4nLFxyXG4gICAgICBpZDogQWN0aW9uVHlwZXMuUG9wSW4sXHJcbiAgICAgIGRpc2FibGVkOiAhaXNEcmFnZ2VkLnZhbHVlXHJcbiAgICB9XHJcbiAgXVxyXG5dKVxyXG5cclxuY29uc3QgY2FuQXJjaGl2ZU9yVW5hcmNoaXZlID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcHJvcHMubW9kZWxWYWx1ZS5wZXJtaXNzaW9ucy5jYW5BcmNoaXZlLmF1dGhvcml6ZWRcclxuKVxyXG5cclxuY29uc3Qgb25BY3Rpb25DaG9zZW4gPSAocGFyYW1zOiB7IGl0ZW06IExheW91dE1lbnVJdGVtOyBldmVudDogTW91c2VFdmVudCB9KSA9PiB7XHJcbiAgY29uc3QgeyBpdGVtIH0gPSBwYXJhbXNcclxuXHJcbiAgc3dpdGNoIChpdGVtLmlkKSB7XHJcbiAgICBjYXNlIEFjdGlvblR5cGVzLkNvcHlMaW5rOlxyXG4gICAgICBzaG93TWVudS52YWx1ZSA9IGZhbHNlXHJcbiAgICAgIG9uQ29weUxpbmsoKVxyXG4gICAgICBicmVha1xyXG4gICAgY2FzZSBBY3Rpb25UeXBlcy5Qb3BJbjpcclxuICAgICAgc2hvd01lbnUudmFsdWUgPSBmYWxzZVxyXG4gICAgICBpc0RyYWdnZWQudmFsdWUgPSBmYWxzZVxyXG4gICAgICBicmVha1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY2hhbmdlRXhwYW5kZWQgPSBhc3luYyAobmV3VmFsOiBib29sZWFuKSA9PiB7XHJcbiAgaWYgKG5ld1ZhbCkge1xyXG4gICAgYXdhaXQgb3Blbihwcm9wcy5tb2RlbFZhbHVlLmlkKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBhd2FpdCBjbG9zZUFsbFRocmVhZHMoKVxyXG4gIH1cclxuXHJcbiAgZW1pdCgndXBkYXRlOmV4cGFuZGVkJywgbmV3VmFsKVxyXG4gIG1wLnRyYWNrKCdDb21tZW50IEFjdGlvbicsIHtcclxuICAgIHR5cGU6ICdhY3Rpb24nLFxyXG4gICAgbmFtZTogJ3RvZ2dsZScsXHJcbiAgICBzdGF0dXM6IG5ld1ZhbCxcclxuICAgIHNvdXJjZTogJ2J1YmJsZSdcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCB0b2dnbGVDb21tZW50UmVzb2x2ZWRTdGF0dXMgPSBhc3luYyAoKSA9PiB7XHJcbiAgLy8gUmVtb3ZlIHRocmVhZCBJRCBmcm9tIFVSTCB3aGVuIHJlc29sdmluZ1xyXG4gIGlmICghcHJvcHMubW9kZWxWYWx1ZS5hcmNoaXZlZCkge1xyXG4gICAgYXdhaXQgcm91dGVyLnJlcGxhY2UoKCkgPT4ge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHsgLi4ucm91dGVyLmN1cnJlbnRSb3V0ZS52YWx1ZS5xdWVyeSB9XHJcbiAgICAgIGRlbGV0ZSBxdWVyeS50aHJlYWRcclxuICAgICAgcmV0dXJuIHsgcXVlcnkgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGF3YWl0IGFyY2hpdmVDb21tZW50KHtcclxuICAgIGNvbW1lbnRJZDogcHJvcHMubW9kZWxWYWx1ZS5pZCxcclxuICAgIHByb2plY3RJZDogcHJvamVjdElkLnZhbHVlLFxyXG4gICAgYXJjaGl2ZWQ6ICFwcm9wcy5tb2RlbFZhbHVlLmFyY2hpdmVkXHJcbiAgfSlcclxuXHJcbiAgbXAudHJhY2soJ0NvbW1lbnQgQWN0aW9uJywge1xyXG4gICAgdHlwZTogJ2FjdGlvbicsXHJcbiAgICBuYW1lOiAnYXJjaGl2ZScsXHJcbiAgICBzdGF0dXM6IHByb3BzLm1vZGVsVmFsdWUuYXJjaGl2ZWRcclxuICB9KVxyXG4gIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgdGl0bGU6IGBUaHJlYWQgJHtwcm9wcy5tb2RlbFZhbHVlLmFyY2hpdmVkID8gJ3Jlb3BlbmVkLicgOiAncmVzb2x2ZWQuJ31gLFxyXG4gICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkluZm9cclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBvbk5ld1JlcGx5ID0gKCkgPT4ge1xyXG4gIGp1c3RDcmVhdGVkUmVwbHkudmFsdWUgPSB0cnVlXHJcbiAgbXAudHJhY2soJ0NvbW1lbnQgQWN0aW9uJywgeyB0eXBlOiAnYWN0aW9uJywgbmFtZTogJ3JlcGx5JyB9KVxyXG59XHJcblxyXG5jb25zdCBvbkNvbW1lbnRNb3VudGVkID0gKCkgPT4ge1xyXG4gIGlmICghanVzdENyZWF0ZWRSZXBseS52YWx1ZSkgcmV0dXJuXHJcblxyXG4gIGNvbnN0IGVsID0gY29tbWVudHNDb250YWluZXIudmFsdWVcclxuICBpZiAoIWVsKSByZXR1cm5cclxuXHJcbiAgc2Nyb2xsVG9Cb3R0b20oZWwpXHJcbiAganVzdENyZWF0ZWRSZXBseS52YWx1ZSA9IGZhbHNlXHJcbn1cclxuXHJcbmNvbnN0IG9uVGhyZWFkQ2xpY2sgPSAoKSA9PiB7XHJcbiAgY2hhbmdlRXhwYW5kZWQoIWlzRXhwYW5kZWQudmFsdWUpXHJcbn1cclxuXHJcbmNvbnN0IG9uQ29weUxpbmsgPSBhc3luYyAoKSA9PiB7XHJcbiAgaWYgKGltcG9ydC5tZXRhLnNlcnZlcikgcmV0dXJuXHJcbiAgY29uc3QgdXJsID0gZ2V0TGlua1RvVGhyZWFkKHByb2plY3RJZC52YWx1ZSwgcHJvcHMubW9kZWxWYWx1ZSlcclxuICBpZiAoIXVybCkgcmV0dXJuXHJcblxyXG4gIHRyeSB7XHJcbiAgICBhd2FpdCBjb3B5KG5ldyBVUkwodXJsLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKS50b1N0cmluZygpKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICB0aXRsZTogJ1RocmVhZCBsaW5rIGNvcHkgZmFpbGVkJyxcclxuICAgICAgZGVzY3JpcHRpb246IGVuc3VyZUVycm9yKGUpLm1lc3NhZ2VcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlXHJcbiAgfVxyXG5cclxuICBtcC50cmFjaygnQ29tbWVudCBBY3Rpb24nLCB7IHR5cGU6ICdhY3Rpb24nLCBuYW1lOiAnc2hhcmUnIH0pXHJcblxyXG4gIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkluZm8sXHJcbiAgICB0aXRsZTogJ0xpbmsgY29waWVkJ1xyXG4gIH0pXHJcbn1cclxuXHJcbm9uS2V5RG93bignRXNjYXBlJywgKCkgPT4ge1xyXG4gIGlmIChpc0V4cGFuZGVkLnZhbHVlKSB7XHJcbiAgICBjaGFuZ2VFeHBhbmRlZChmYWxzZSlcclxuICB9XHJcbn0pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiBbaXNFeHBhbmRlZC52YWx1ZSwgaXNWaWV3ZWQudmFsdWVdIGFzIGNvbnN0LFxyXG4gIChuZXdWYWxzLCBvbGRWYWxzKSA9PiB7XHJcbiAgICBjb25zdCBbbmV3SXNFeHBhbmRlZCwgbmV3SXNWaWV3ZWRdID0gbmV3VmFsc1xyXG4gICAgY29uc3QgW29sZElzRXhwYW5kZWRdID0gb2xkVmFscyB8fCBbZmFsc2VdXHJcblxyXG4gICAgaWYgKG5ld0lzRXhwYW5kZWQgJiYgbmV3SXNFeHBhbmRlZCAhPT0gb2xkSXNFeHBhbmRlZCAmJiAhbmV3SXNWaWV3ZWQpIHtcclxuICAgICAgbWFya1RocmVhZFZpZXdlZChwcm9qZWN0SWQudmFsdWUsIHByb3BzLm1vZGVsVmFsdWUuaWQpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFuZXdJc0V4cGFuZGVkKSB7XHJcbiAgICAgIGlzRHJhZ2dlZC52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICB7IGltbWVkaWF0ZTogdHJ1ZSB9IC8vIGZvciB0cmlnZ2VyaW5nIGFsc28gd2hlbiBhIGNvbW1lbnQgaXMgb3BlbmVkIGJlY2F1c2Ugb2YgYSB0aHJlYWQgbGlua1xyXG4pXHJcblxyXG53YXRjaChcclxuICAoKSA9PiB1c2Vyc1R5cGluZy52YWx1ZS5sZW5ndGggPiAxLFxyXG4gIChhcmVVc2Vyc1R5cGluZykgPT4ge1xyXG4gICAgaWYgKGFyZVVzZXJzVHlwaW5nKSB7XHJcbiAgICAgIGNvbnRyb2xzLnJlc3VtZSgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb250cm9scy5wYXVzZSgpXHJcbiAgICB9XHJcbiAgfVxyXG4pXHJcblxyXG53YXRjaChpc0RyYWdnaW5nLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICBpZiAoISFuZXdWYWwgPT09ICEhb2xkVmFsKSByZXR1cm5cclxuXHJcbiAgLy8gRGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiB3aGlsZSBkcmFnZ2luZyBhcm91bmRcclxuICBkaXNhYmxlVGV4dFNlbGVjdGlvbi52YWx1ZSA9IG5ld1ZhbFxyXG59KVxyXG5cclxub25Nb3VudGVkKCgpID0+IHtcclxuICBpZiAoaXNFeHBhbmRlZC52YWx1ZSkge1xyXG4gICAgLy8gdXBkYXRlIHdvbid0IGVtaXQgaWYgdGhyZWFkIHdhcyBtb3VudGVkIGFscmVhZHkgZXhwYW5kZWQsIHNvIHdlIGVtaXQgdGhpcyB0byBjbG9zZSBhbnkgb3BlbiB0aHJlYWQgZWRpdG9yc1xyXG4gICAgZW1pdCgndXBkYXRlOmV4cGFuZGVkJywgdHJ1ZSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBzaG93QmFubmVyID0gY29tcHV0ZWQoXHJcbiAgKCkgPT5cclxuICAgIHRocmVhZFJlc291cmNlU3RhdHVzLnZhbHVlLmlzRGlmZmVyZW50VmVyc2lvbiB8fFxyXG4gICAgdGhyZWFkUmVzb3VyY2VTdGF0dXMudmFsdWUuaXNGZWRlcmF0ZWRNb2RlbCB8fFxyXG4gICAgaGFzQ2xpY2tlZEZ1bGxDb250ZXh0LnZhbHVlXHJcbilcclxuXHJcbmNvbnN0IGJhbm5lclRleHQgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgaWYgKGhhc0NsaWNrZWRGdWxsQ29udGV4dC52YWx1ZSkgcmV0dXJuICdWaWV3aW5nIGZ1bGwgY29udGV4dCdcclxuICBpZiAoXHJcbiAgICB0aHJlYWRSZXNvdXJjZVN0YXR1cy52YWx1ZS5pc0RpZmZlcmVudFZlcnNpb24gJiZcclxuICAgIHRocmVhZFJlc291cmNlU3RhdHVzLnZhbHVlLmlzRmVkZXJhdGVkTW9kZWxcclxuICApXHJcbiAgICByZXR1cm4gJ1JlZmVyZW5jZXMgbXVsdGlwbGUgbW9kZWxzIHdpdGggZGlmZmVyZW50IHZlcnNpb25zJ1xyXG4gIGlmICh0aHJlYWRSZXNvdXJjZVN0YXR1cy52YWx1ZS5pc0RpZmZlcmVudFZlcnNpb24pXHJcbiAgICByZXR1cm4gJ0NvbnZlcnNhdGlvbiBzdGFydGVkIGluIGEgZGlmZmVyZW50IHZlcnNpb24nXHJcbiAgaWYgKHRocmVhZFJlc291cmNlU3RhdHVzLnZhbHVlLmlzRmVkZXJhdGVkTW9kZWwpXHJcbiAgICByZXR1cm4gJ1JlZmVyZW5jZXMgbW9kZWxzIG5vdCBjdXJyZW50bHkgbG9hZGVkJ1xyXG4gIHJldHVybiAnJ1xyXG59KVxyXG5cclxuY29uc3QgYmFubmVyQnV0dG9uID0gY29tcHV0ZWQoKCkgPT4ge1xyXG4gIGlmIChoYXNDbGlja2VkRnVsbENvbnRleHQudmFsdWUpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHRleHQ6ICdCYWNrJyxcclxuICAgICAgaWNvbjogTW92ZUxlZnQsXHJcbiAgICAgIGFjdGlvbjogZ29CYWNrXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICB0ZXh0OiAnRnVsbCBjb250ZXh0JyxcclxuICAgIGljb246IE1vdmVSaWdodCxcclxuICAgIGFjdGlvbjogaGFuZGxlQ29udGV4dENsaWNrXHJcbiAgfVxyXG59KVxyXG48L3NjcmlwdD5cclxuPHN0eWxlIHNjb3BlZD5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7XHJcbiAgLnRocmVhZC1jb250YWluZXIge1xyXG4gICAgdHJhbnNmb3JtOiBub25lICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG59XHJcbjwvc3R5bGU+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9hbmNob3JlZC1wb2ludC9UaHJlYWQudnVlIn0=