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

325 lines
28 KiB
Plaintext

import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/presentation/ShareDialog.vue");import { FormSwitch as __nuxt_component_0 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { FormClipboardInput as __nuxt_component_1 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
import { default as __nuxt_component_2 } from "/_nuxt/node_modules/nuxt/dist/app/components/nuxt-link.js?v=e4f18c29";
import { LayoutDialog as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js";
/* Injection by vite-plugin-vue-inspector Start */
import { createElementVNode as __createElementVNode,createVNode as __createVNode,createElementBlock as __createElementBlock,createBlock as __createBlock } 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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) }
function _createBlock(...args) { return _interopVNode(__createBlock(...args)) }
/* Injection by vite-plugin-vue-inspector End */
import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
import { presentationRoute } from "/_nuxt/lib/common/helpers/route.ts";
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
import { useQuery, useMutation } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
import { ToastNotificationType, useGlobalToast } from "/_nuxt/lib/common/composables/toast.ts";
import {
convertThrowIntoFetchResult,
getFirstErrorMessage
} from "/_nuxt/lib/common/helpers/graphql.ts";
import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts";
import { projectRoute } from "/_nuxt/lib/common/helpers/route.ts";
import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _sfc_main = /* @__PURE__ */ _defineComponent({
__name: "PresentationShareDialog",
props: /* @__PURE__ */ _mergeModels({
projectId: { type: String, required: true },
presentationId: { type: String, required: true }
}, {
"open": { type: Boolean, ...{ required: true } },
"openModifiers": {}
}),
emits: ["update:open"],
setup(__props, { expose: __expose }) {
__expose();
const presentationDialogSharePermissionsQuery = graphql(`
query PresentationShareDialogPermissions(
$projectId: String!
$savedViewGroupId: ID!
) {
project(id: $projectId) {
id
role
savedViewGroup(id: $savedViewGroupId) {
id
groupId
shareLink {
id
content
revoked
}
permissions {
canCreateToken {
...FullPermissionCheckResult
}
}
}
}
}
`);
const presentationDialogShareTokenMutation = graphql(`
mutation PresentationShareToken($input: SavedViewGroupShareInput!) {
projectMutations {
savedViewMutations {
share(input: $input) {
id
revoked
content
}
}
}
}
`);
const presentationDialogShareEnableTokenMutation = graphql(`
mutation PresentationShareEnableToken($input: SavedViewGroupShareUpdateInput!) {
projectMutations {
savedViewMutations {
enableShare(input: $input) {
id
revoked
content
}
}
}
}
`);
const presentationDialogShareDisableTokenMutation = graphql(`
mutation PresentationShareDisableToken($input: SavedViewGroupShareUpdateInput!) {
projectMutations {
savedViewMutations {
disableShare(input: $input) {
id
revoked
content
}
}
}
}
`);
const props = __props;
const open = _useModel(__props, "open");
const { result, refetch } = useQuery(presentationDialogSharePermissionsQuery, () => ({
projectId: props.projectId,
savedViewGroupId: props.presentationId
}));
const { mutate: createToken } = useMutation(presentationDialogShareTokenMutation);
const { mutate: disableToken } = useMutation(
presentationDialogShareDisableTokenMutation
);
const { mutate: enableToken } = useMutation(presentationDialogShareEnableTokenMutation);
const { triggerNotification } = useGlobalToast();
const mixpanel = useMixpanel();
const isProjectOwner = computed(
() => result.value?.project?.role === Roles.Stream.Owner
);
const createTokenPermission = computed(
() => result.value?.project?.savedViewGroup?.permissions?.canCreateToken
);
const isRevoked = computed(
() => result.value?.project?.savedViewGroup?.shareLink?.revoked
);
const shareLink = computed(() => result.value?.project?.savedViewGroup?.shareLink);
const shareUrl = computed(() => {
if (!shareLink.value?.id || !props.projectId || !props.presentationId) return "";
const url = new URL(
presentationRoute(props.projectId, props.presentationId),
window.location.toString()
);
url.searchParams.set("presentationToken", shareLink.value.content);
return url.toString();
});
const enablePublicUrl = computed({
get: () => !isRevoked.value && !!shareLink.value?.id,
set: (value) => {
onEnablePublicUrl(value);
}
});
const onEnablePublicUrl = async (value) => {
if (!props.projectId || !props.presentationId) return;
if (value) {
if (!shareLink.value?.id) {
const result2 = await createToken({
input: { projectId: props.projectId, groupId: props.presentationId }
}).catch(convertThrowIntoFetchResult);
if (!result2?.data?.projectMutations.savedViewMutations.share.id) {
const errMsg = getFirstErrorMessage(result2?.errors);
triggerNotification({
type: ToastNotificationType.Danger,
title: "Failed to enable public access",
description: errMsg
});
return;
}
}
if (shareLink.value?.id) {
await enableToken({
input: {
projectId: props.projectId,
groupId: props.presentationId,
shareId: shareLink.value.id
}
});
}
} else {
if (shareLink.value?.id) {
await disableToken({
input: {
projectId: props.projectId,
groupId: props.presentationId,
shareId: shareLink.value.id
}
});
}
}
mixpanel.track("Presentation Sharing Toggled", {
public: value,
projectId: props.projectId,
savedViewGroupId: props.presentationId
});
await refetch();
};
const __returned__ = { presentationDialogSharePermissionsQuery, presentationDialogShareTokenMutation, presentationDialogShareEnableTokenMutation, presentationDialogShareDisableTokenMutation, props, open, result, refetch, createToken, disableToken, enableToken, triggerNotification, mixpanel, isProjectOwner, createTokenPermission, isRevoked, shareLink, shareUrl, enablePublicUrl, onEnablePublicUrl, get projectRoute() {
return projectRoute;
} };
Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
return __returned__;
}
});
import { createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, resolveDirective as _resolveDirective, openBlock as _openBlock, withDirectives as _withDirectives, createCommentVNode as _createCommentVNode, withCtx as _withCtx } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
const _hoisted_1 = {
class: "flex items-center justify-between mt-2 mb-6",
"data-v-inspector": "components/presentation/ShareDialog.vue:4:5"
};
const _hoisted_2 = { "data-v-inspector": "components/presentation/ShareDialog.vue:11:7" };
const _hoisted_3 = {
class: "text-body-2xs text-foreground-2 mb-3",
"data-v-inspector": "components/presentation/ShareDialog.vue:34:5"
};
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_FormSwitch = __nuxt_component_0;
const _component_FormClipboardInput = __nuxt_component_1;
const _component_NuxtLink = __nuxt_component_2;
const _component_LayoutDialog = __nuxt_component_3;
const _directive_tippy = _resolveDirective("tippy");
return _openBlock(), _createBlock(_component_LayoutDialog, {
open: $setup.open,
"onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.open = $event),
"max-width": "sm",
"data-v-inspector": "components/presentation/ShareDialog.vue:2:3"
}, {
header: _withCtx(() => [..._cache[2] || (_cache[2] = [
_createTextVNode(
"Share presentation",
-1
/* CACHED */
)
])]),
default: _withCtx(() => [
_createElementVNode("div", _hoisted_1, [
_cache[3] || (_cache[3] = _createElementVNode(
"div",
{ "data-v-inspector": "components/presentation/ShareDialog.vue:5:7" },
[
_createElementVNode("p", {
class: "text-body-xs font-medium text-foreground",
"data-v-inspector": "components/presentation/ShareDialog.vue:6:9"
}, "Enable public access"),
_createElementVNode("p", {
class: "text-body-2xs text-foreground-2",
"data-v-inspector": "components/presentation/ShareDialog.vue:7:9"
}, " Let anyone view the presentation. No sign-in required. ")
],
-1
/* CACHED */
)),
_withDirectives((_openBlock(), _createElementBlock("div", _hoisted_2, [
_createVNode(_component_FormSwitch, {
modelValue: $setup.enablePublicUrl,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.enablePublicUrl = $event),
name: "isPublic",
"show-label": false,
disabled: !$setup.createTokenPermission?.authorized,
"data-v-inspector": "components/presentation/ShareDialog.vue:16:9"
}, null, 8, ["modelValue", "disabled"])
])), [
[
_directive_tippy,
$setup.createTokenPermission?.authorized ? void 0 : $setup.createTokenPermission?.message
]
])
]),
$setup.enablePublicUrl ? (_openBlock(), _createBlock(_component_FormClipboardInput, {
key: 0,
class: "mb-6",
value: $setup.shareUrl,
"cta-color": "primary",
"cta-text": "Copy link",
"data-v-inspector": "components/presentation/ShareDialog.vue:24:5"
}, null, 8, ["value"])) : _createCommentVNode("v-if", true),
_cache[6] || (_cache[6] = _createElementVNode(
"hr",
{
class: "mb-6 border-outline-3",
"data-v-inspector": "components/presentation/ShareDialog.vue:32:5"
},
null,
-1
/* CACHED */
)),
_createElementVNode("p", _hoisted_3, [
_cache[5] || (_cache[5] = _createTextVNode(
" Permissions for who can view and edit the presentation is based on the project roles. ",
-1
/* CACHED */
)),
$setup.isProjectOwner ? (_openBlock(), _createBlock(_component_NuxtLink, {
key: 0,
to: $setup.projectRoute($props.projectId, "collaborators"),
class: "text-primary",
"data-v-inspector": "components/presentation/ShareDialog.vue:37:7"
}, {
default: _withCtx(() => [..._cache[4] || (_cache[4] = [
_createTextVNode(
" Manage project roles. ",
-1
/* CACHED */
)
])]),
_: 1
/* STABLE */
}, 8, ["to"])) : _createCommentVNode("v-if", true)
])
]),
_: 1
/* STABLE */
}, 8, ["open"]);
}
_sfc_main.__hmrId = "83e514c7";
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/presentation/ShareDialog.vue"]]);
//# sourceMappingURL=data:application/json;base64,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LCJzb3VyY2VzIjpbIlNoYXJlRGlhbG9nLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPExheW91dERpYWxvZyB2LW1vZGVsOm9wZW49XCJvcGVuXCIgbWF4LXdpZHRoPVwic21cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcmVzZW50YXRpb24vU2hhcmVEaWFsb2cudnVlOjI6M1wiPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXI+U2hhcmUgcHJlc2VudGF0aW9uPC90ZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gbXQtMiBtYi02XCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJlc2VudGF0aW9uL1NoYXJlRGlhbG9nLnZ1ZTo0OjVcIj5cclxuICAgICAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcmVzZW50YXRpb24vU2hhcmVEaWFsb2cudnVlOjU6N1wiPlxyXG4gICAgICAgIDxwIGNsYXNzPVwidGV4dC1ib2R5LXhzIGZvbnQtbWVkaXVtIHRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ByZXNlbnRhdGlvbi9TaGFyZURpYWxvZy52dWU6Njo5XCI+RW5hYmxlIHB1YmxpYyBhY2Nlc3M8L3A+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWJvZHktMnhzIHRleHQtZm9yZWdyb3VuZC0yXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJlc2VudGF0aW9uL1NoYXJlRGlhbG9nLnZ1ZTo3OjlcIj5cclxuICAgICAgICAgIExldCBhbnlvbmUgdmlldyB0aGUgcHJlc2VudGF0aW9uLiBObyBzaWduLWluIHJlcXVpcmVkLlxyXG4gICAgICAgIDwvcD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICB2LXRpcHB5PVwiXHJcbiAgICAgICAgICBjcmVhdGVUb2tlblBlcm1pc3Npb24/LmF1dGhvcml6ZWQgPyB1bmRlZmluZWQgOiBjcmVhdGVUb2tlblBlcm1pc3Npb24/Lm1lc3NhZ2VcclxuICAgICAgICBcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcmVzZW50YXRpb24vU2hhcmVEaWFsb2cudnVlOjExOjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPEZvcm1Td2l0Y2hcclxuICAgICAgICAgIHYtbW9kZWw9XCJlbmFibGVQdWJsaWNVcmxcIlxyXG4gICAgICAgICAgbmFtZT1cImlzUHVibGljXCJcclxuICAgICAgICAgIDpzaG93LWxhYmVsPVwiZmFsc2VcIlxyXG4gICAgICAgICAgOmRpc2FibGVkPVwiIWNyZWF0ZVRva2VuUGVybWlzc2lvbj8uYXV0aG9yaXplZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ByZXNlbnRhdGlvbi9TaGFyZURpYWxvZy52dWU6MTY6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxGb3JtQ2xpcGJvYXJkSW5wdXRcclxuICAgICAgdi1pZj1cImVuYWJsZVB1YmxpY1VybFwiXHJcbiAgICAgIGNsYXNzPVwibWItNlwiXHJcbiAgICAgIDp2YWx1ZT1cInNoYXJlVXJsXCJcclxuICAgICAgY3RhLWNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIGN0YS10ZXh0PVwiQ29weSBsaW5rXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJlc2VudGF0aW9uL1NoYXJlRGlhbG9nLnZ1ZToyNDo1XCJcclxuICAgIC8+XHJcblxyXG4gICAgPGhyIGNsYXNzPVwibWItNiBib3JkZXItb3V0bGluZS0zXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJlc2VudGF0aW9uL1NoYXJlRGlhbG9nLnZ1ZTozMjo1XCIgLz5cclxuXHJcbiAgICA8cCBjbGFzcz1cInRleHQtYm9keS0yeHMgdGV4dC1mb3JlZ3JvdW5kLTIgbWItM1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ByZXNlbnRhdGlvbi9TaGFyZURpYWxvZy52dWU6MzQ6NVwiPlxyXG4gICAgICBQZXJtaXNzaW9ucyBmb3Igd2hvIGNhbiB2aWV3IGFuZCBlZGl0IHRoZSBwcmVzZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIHByb2plY3RcclxuICAgICAgcm9sZXMuXHJcbiAgICAgIDxOdXh0TGlua1xyXG4gICAgICAgIHYtaWY9XCJpc1Byb2plY3RPd25lclwiXHJcbiAgICAgICAgOnRvPVwicHJvamVjdFJvdXRlKHByb2plY3RJZCwgJ2NvbGxhYm9yYXRvcnMnKVwiXHJcbiAgICAgICAgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcmVzZW50YXRpb24vU2hhcmVEaWFsb2cudnVlOjM3OjdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgTWFuYWdlIHByb2plY3Qgcm9sZXMuXHJcbiAgICAgIDwvTnV4dExpbms+XHJcbiAgICA8L3A+XHJcbiAgPC9MYXlvdXREaWFsb2c+XHJcbjwvdGVtcGxhdGU+XHJcblxyXG48c2NyaXB0IHNldHVwIGxhbmc9XCJ0c1wiPlxyXG5pbXBvcnQgeyBwcmVzZW50YXRpb25Sb3V0ZSB9IGZyb20gJ35+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHsgdXNlUXVlcnksIHVzZU11dGF0aW9uIH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHsgVG9hc3ROb3RpZmljYXRpb25UeXBlLCB1c2VHbG9iYWxUb2FzdCB9IGZyb20gJ35+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvdG9hc3QnXHJcbmltcG9ydCB7XHJcbiAgY29udmVydFRocm93SW50b0ZldGNoUmVzdWx0LFxyXG4gIGdldEZpcnN0RXJyb3JNZXNzYWdlXHJcbn0gZnJvbSAnfn4vbGliL2NvbW1vbi9oZWxwZXJzL2dyYXBocWwnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfn4vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IHByb2plY3RSb3V0ZSB9IGZyb20gJ34vbGliL2NvbW1vbi9oZWxwZXJzL3JvdXRlJ1xyXG5pbXBvcnQgeyBSb2xlcyB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuXHJcbmNvbnN0IHByZXNlbnRhdGlvbkRpYWxvZ1NoYXJlUGVybWlzc2lvbnNRdWVyeSA9IGdyYXBocWwoYFxyXG4gIHF1ZXJ5IFByZXNlbnRhdGlvblNoYXJlRGlhbG9nUGVybWlzc2lvbnMoXHJcbiAgICAkcHJvamVjdElkOiBTdHJpbmchXHJcbiAgICAkc2F2ZWRWaWV3R3JvdXBJZDogSUQhXHJcbiAgKSB7XHJcbiAgICBwcm9qZWN0KGlkOiAkcHJvamVjdElkKSB7XHJcbiAgICAgIGlkXHJcbiAgICAgIHJvbGVcclxuICAgICAgc2F2ZWRWaWV3R3JvdXAoaWQ6ICRzYXZlZFZpZXdHcm91cElkKSB7XHJcbiAgICAgICAgaWRcclxuICAgICAgICBncm91cElkXHJcbiAgICAgICAgc2hhcmVMaW5rIHtcclxuICAgICAgICAgIGlkXHJcbiAgICAgICAgICBjb250ZW50XHJcbiAgICAgICAgICByZXZva2VkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBlcm1pc3Npb25zIHtcclxuICAgICAgICAgIGNhbkNyZWF0ZVRva2VuIHtcclxuICAgICAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmNvbnN0IHByZXNlbnRhdGlvbkRpYWxvZ1NoYXJlVG9rZW5NdXRhdGlvbiA9IGdyYXBocWwoYFxyXG4gIG11dGF0aW9uIFByZXNlbnRhdGlvblNoYXJlVG9rZW4oJGlucHV0OiBTYXZlZFZpZXdHcm91cFNoYXJlSW5wdXQhKSB7XHJcbiAgICBwcm9qZWN0TXV0YXRpb25zIHtcclxuICAgICAgc2F2ZWRWaWV3TXV0YXRpb25zIHtcclxuICAgICAgICBzaGFyZShpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgICAgICBpZFxyXG4gICAgICAgICAgcmV2b2tlZFxyXG4gICAgICAgICAgY29udGVudFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmNvbnN0IHByZXNlbnRhdGlvbkRpYWxvZ1NoYXJlRW5hYmxlVG9rZW5NdXRhdGlvbiA9IGdyYXBocWwoYFxyXG4gIG11dGF0aW9uIFByZXNlbnRhdGlvblNoYXJlRW5hYmxlVG9rZW4oJGlucHV0OiBTYXZlZFZpZXdHcm91cFNoYXJlVXBkYXRlSW5wdXQhKSB7XHJcbiAgICBwcm9qZWN0TXV0YXRpb25zIHtcclxuICAgICAgc2F2ZWRWaWV3TXV0YXRpb25zIHtcclxuICAgICAgICBlbmFibGVTaGFyZShpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgICAgICBpZFxyXG4gICAgICAgICAgcmV2b2tlZFxyXG4gICAgICAgICAgY29udGVudFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmNvbnN0IHByZXNlbnRhdGlvbkRpYWxvZ1NoYXJlRGlzYWJsZVRva2VuTXV0YXRpb24gPSBncmFwaHFsKGBcclxuICBtdXRhdGlvbiBQcmVzZW50YXRpb25TaGFyZURpc2FibGVUb2tlbigkaW5wdXQ6IFNhdmVkVmlld0dyb3VwU2hhcmVVcGRhdGVJbnB1dCEpIHtcclxuICAgIHByb2plY3RNdXRhdGlvbnMge1xyXG4gICAgICBzYXZlZFZpZXdNdXRhdGlvbnMge1xyXG4gICAgICAgIGRpc2FibGVTaGFyZShpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgICAgICBpZFxyXG4gICAgICAgICAgcmV2b2tlZFxyXG4gICAgICAgICAgY29udGVudFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuYClcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIHByb2plY3RJZDogc3RyaW5nXHJcbiAgcHJlc2VudGF0aW9uSWQ6IHN0cmluZ1xyXG59PigpXHJcblxyXG5jb25zdCBvcGVuID0gZGVmaW5lTW9kZWw8Ym9vbGVhbj4oJ29wZW4nLCB7IHJlcXVpcmVkOiB0cnVlIH0pXHJcblxyXG5jb25zdCB7IHJlc3VsdCwgcmVmZXRjaCB9ID0gdXNlUXVlcnkocHJlc2VudGF0aW9uRGlhbG9nU2hhcmVQZXJtaXNzaW9uc1F1ZXJ5LCAoKSA9PiAoe1xyXG4gIHByb2plY3RJZDogcHJvcHMucHJvamVjdElkLFxyXG4gIHNhdmVkVmlld0dyb3VwSWQ6IHByb3BzLnByZXNlbnRhdGlvbklkXHJcbn0pKVxyXG5jb25zdCB7IG11dGF0ZTogY3JlYXRlVG9rZW4gfSA9IHVzZU11dGF0aW9uKHByZXNlbnRhdGlvbkRpYWxvZ1NoYXJlVG9rZW5NdXRhdGlvbilcclxuY29uc3QgeyBtdXRhdGU6IGRpc2FibGVUb2tlbiB9ID0gdXNlTXV0YXRpb24oXHJcbiAgcHJlc2VudGF0aW9uRGlhbG9nU2hhcmVEaXNhYmxlVG9rZW5NdXRhdGlvblxyXG4pXHJcbmNvbnN0IHsgbXV0YXRlOiBlbmFibGVUb2tlbiB9ID0gdXNlTXV0YXRpb24ocHJlc2VudGF0aW9uRGlhbG9nU2hhcmVFbmFibGVUb2tlbk11dGF0aW9uKVxyXG5jb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuY29uc3QgbWl4cGFuZWwgPSB1c2VNaXhwYW5lbCgpXHJcblxyXG5jb25zdCBpc1Byb2plY3RPd25lciA9IGNvbXB1dGVkKFxyXG4gICgpID0+IHJlc3VsdC52YWx1ZT8ucHJvamVjdD8ucm9sZSA9PT0gUm9sZXMuU3RyZWFtLk93bmVyXHJcbilcclxuY29uc3QgY3JlYXRlVG9rZW5QZXJtaXNzaW9uID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcmVzdWx0LnZhbHVlPy5wcm9qZWN0Py5zYXZlZFZpZXdHcm91cD8ucGVybWlzc2lvbnM/LmNhbkNyZWF0ZVRva2VuXHJcbilcclxuY29uc3QgaXNSZXZva2VkID0gY29tcHV0ZWQoXHJcbiAgKCkgPT4gcmVzdWx0LnZhbHVlPy5wcm9qZWN0Py5zYXZlZFZpZXdHcm91cD8uc2hhcmVMaW5rPy5yZXZva2VkXHJcbilcclxuY29uc3Qgc2hhcmVMaW5rID0gY29tcHV0ZWQoKCkgPT4gcmVzdWx0LnZhbHVlPy5wcm9qZWN0Py5zYXZlZFZpZXdHcm91cD8uc2hhcmVMaW5rKVxyXG5jb25zdCBzaGFyZVVybCA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBpZiAoIXNoYXJlTGluay52YWx1ZT8uaWQgfHwgIXByb3BzLnByb2plY3RJZCB8fCAhcHJvcHMucHJlc2VudGF0aW9uSWQpIHJldHVybiAnJ1xyXG5cclxuICBjb25zdCB1cmwgPSBuZXcgVVJMKFxyXG4gICAgcHJlc2VudGF0aW9uUm91dGUocHJvcHMucHJvamVjdElkLCBwcm9wcy5wcmVzZW50YXRpb25JZCksXHJcbiAgICB3aW5kb3cubG9jYXRpb24udG9TdHJpbmcoKVxyXG4gIClcclxuICB1cmwuc2VhcmNoUGFyYW1zLnNldCgncHJlc2VudGF0aW9uVG9rZW4nLCBzaGFyZUxpbmsudmFsdWUuY29udGVudClcclxuXHJcbiAgcmV0dXJuIHVybC50b1N0cmluZygpXHJcbn0pXHJcbmNvbnN0IGVuYWJsZVB1YmxpY1VybCA9IGNvbXB1dGVkKHtcclxuICBnZXQ6ICgpID0+ICFpc1Jldm9rZWQudmFsdWUgJiYgISFzaGFyZUxpbmsudmFsdWU/LmlkLFxyXG4gIHNldDogKHZhbHVlOiBib29sZWFuKSA9PiB7XHJcbiAgICBvbkVuYWJsZVB1YmxpY1VybCh2YWx1ZSlcclxuICB9XHJcbn0pXHJcblxyXG5jb25zdCBvbkVuYWJsZVB1YmxpY1VybCA9IGFzeW5jICh2YWx1ZTogYm9vbGVhbikgPT4ge1xyXG4gIGlmICghcHJvcHMucHJvamVjdElkIHx8ICFwcm9wcy5wcmVzZW50YXRpb25JZCkgcmV0dXJuXHJcblxyXG4gIGlmICh2YWx1ZSkge1xyXG4gICAgLy8gSWYgZW5hYmxpbmcgYW5kIG5vIHNoYXJlIGxpbmsgZXhpc3RzLCBjcmVhdGUgb25lIGZpcnN0XHJcbiAgICBpZiAoIXNoYXJlTGluay52YWx1ZT8uaWQpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVG9rZW4oe1xyXG4gICAgICAgIGlucHV0OiB7IHByb2plY3RJZDogcHJvcHMucHJvamVjdElkLCBncm91cElkOiBwcm9wcy5wcmVzZW50YXRpb25JZCB9XHJcbiAgICAgIH0pLmNhdGNoKGNvbnZlcnRUaHJvd0ludG9GZXRjaFJlc3VsdClcclxuXHJcbiAgICAgIGlmICghcmVzdWx0Py5kYXRhPy5wcm9qZWN0TXV0YXRpb25zLnNhdmVkVmlld011dGF0aW9ucy5zaGFyZS5pZCkge1xyXG4gICAgICAgIGNvbnN0IGVyck1zZyA9IGdldEZpcnN0RXJyb3JNZXNzYWdlKHJlc3VsdD8uZXJyb3JzKVxyXG4gICAgICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICAgIHRpdGxlOiAnRmFpbGVkIHRvIGVuYWJsZSBwdWJsaWMgYWNjZXNzJyxcclxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBlcnJNc2dcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRW5hYmxlIHRoZSBzaGFyZSBsaW5rXHJcbiAgICBpZiAoc2hhcmVMaW5rLnZhbHVlPy5pZCkge1xyXG4gICAgICBhd2FpdCBlbmFibGVUb2tlbih7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIHByb2plY3RJZDogcHJvcHMucHJvamVjdElkLFxyXG4gICAgICAgICAgZ3JvdXBJZDogcHJvcHMucHJlc2VudGF0aW9uSWQsXHJcbiAgICAgICAgICBzaGFyZUlkOiBzaGFyZUxpbmsudmFsdWUuaWRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGlmIChzaGFyZUxpbmsudmFsdWU/LmlkKSB7XHJcbiAgICAgIGF3YWl0IGRpc2FibGVUb2tlbih7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIHByb2plY3RJZDogcHJvcHMucHJvamVjdElkLFxyXG4gICAgICAgICAgZ3JvdXBJZDogcHJvcHMucHJlc2VudGF0aW9uSWQsXHJcbiAgICAgICAgICBzaGFyZUlkOiBzaGFyZUxpbmsudmFsdWUuaWRcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUcmFjayB0aGUgc2hhcmluZyB0b2dnbGUgZXZlbnRcclxuICBtaXhwYW5lbC50cmFjaygnUHJlc2VudGF0aW9uIFNoYXJpbmcgVG9nZ2xlZCcsIHtcclxuICAgIHB1YmxpYzogdmFsdWUsXHJcbiAgICBwcm9qZWN0SWQ6IHByb3BzLnByb2plY3RJZCxcclxuICAgIHNhdmVkVmlld0dyb3VwSWQ6IHByb3BzLnByZXNlbnRhdGlvbklkXHJcbiAgfSlcclxuXHJcbiAgYXdhaXQgcmVmZXRjaCgpXHJcbn1cclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ByZXNlbnRhdGlvbi9TaGFyZURpYWxvZy52dWUifQ==