import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/projects/Dashboard.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/projects/MoveToWorkspaceAlert.vue"; import { FormTextInput 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/form/select/ProjectRoles.vue"; import { FormCheckbox as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { FormButton as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { CommonLoadingBar as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_6 } from "/_nuxt/components/projects/HiddenProjectWarning.vue"; import { default as __nuxt_component_7 } from "/_nuxt/components/projects/DashboardEmptyState.vue"; import { default as __nuxt_component_8 } from "/_nuxt/components/projects/DashboardFilled.vue"; import { InfiniteLoading as __nuxt_component_9 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_10 } from "/_nuxt/components/common/EmptySearchState.vue"; import { default as __nuxt_component_11 } from "/_nuxt/components/projects/Add.vue"; import { default as __nuxt_component_12 } from "/_nuxt/components/workspace/moveProject/index.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 { useQuery, useQueryLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29"; import { projectsDashboardQuery } from "/_nuxt/lib/projects/graphql/queries.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useDebouncedTextInput } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { MagnifyingGlassIcon, Squares2X2Icon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29"; import { useUserProjectsUpdatedTracking } from "/_nuxt/lib/user/composables/projectUpdates.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { useCanCreatePersonalProject } from "/_nuxt/lib/projects/composables/permissions.ts"; import { useLogger } from "/_nuxt/composables/logging.ts"; import { ref, computed, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { useIsWorkspacesEnabled } from "/_nuxt/composables/globals.ts"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ProjectsDashboard", setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ProjectsDashboard_UserProjectCollection on UserProjectCollection { numberOfHidden } `); graphql(` fragment ProjectsDashboard_User on User { ...ProjectsAdd_User permissions { canCreatePersonalProject { ...FullPermissionCheckResult } } } `); const logger = useLogger(); const infiniteLoaderId = ref(""); const cursor = ref(null); const selectedRoles = ref(void 0); const filterProjectsToMove = ref(false); const showLoadingBar = ref(false); const showMoveProjectDialog = ref(false); const emittedProject = ref(); const areQueriesLoading = useQueryLoading(); const isWorkspacesEnabled = useIsWorkspacesEnabled(); const showCreateNewProjectDialog = ref(false); useUserProjectsUpdatedTracking(); const { on, bind, value: search } = useDebouncedTextInput({ debouncedBy: 800 }); const { result: projectsPanelResult, fetchMore: fetchMoreProjects, onResult: onProjectsResult, variables: projectsVariables } = useQuery(projectsDashboardQuery, () => ({ filter: { search: (search.value || "").trim() || null, onlyWithRoles: filterProjectsToMove.value ? ["stream:owner"] : selectedRoles.value?.length ? selectedRoles.value : null, personalOnly: isWorkspacesEnabled.value }, cursor: null })); const { canClickCreate } = useCanCreatePersonalProject({ activeUser: computed(() => projectsPanelResult.value?.activeUser) }); onProjectsResult((res) => { cursor.value = res.data?.activeUser?.projects.cursor || null; infiniteLoaderId.value = JSON.stringify(projectsVariables.value?.filter || {}); }); const projects = computed(() => projectsPanelResult.value?.activeUser?.projects); const showEmptyState = computed(() => { const isFiltering = projectsVariables.value?.filter?.onlyWithRoles?.length || projectsVariables.value?.filter?.search?.length; if (isFiltering) return false; return projects.value && !projects.value.items.length; }); const moreToLoad = computed( () => (!projects.value || projects.value.items.length < projects.value.totalCount) && cursor.value ); const infiniteLoad = async (state) => { if (!moreToLoad.value) return state.complete(); try { await fetchMoreProjects({ variables: { cursor: cursor.value } }); } catch (e) { logger.error(e); state.error(); return; } state.loaded(); if (!moreToLoad.value) { state.complete(); } }; const mixpanel = useMixpanel(); const onMoveProject = (projectId, location) => { const project = projectId ? projects.value?.items.find((p) => p.id === projectId) : void 0; emittedProject.value = project || void 0; mixpanel.track("Move Project CTA Clicked", { location, // eslint-disable-next-line camelcase workspace_id: project?.workspace?.id || void 0 }); showMoveProjectDialog.value = true; }; watch(search, (newVal) => { if (newVal) showLoadingBar.value = true; else showLoadingBar.value = false; }); watch(areQueriesLoading, (newVal) => showLoadingBar.value = newVal); const clearSearch = () => { search.value = ""; selectedRoles.value = []; }; const onClickCreate = () => { showCreateNewProjectDialog.value = true; }; const __returned__ = { logger, infiniteLoaderId, cursor, selectedRoles, filterProjectsToMove, showLoadingBar, showMoveProjectDialog, emittedProject, areQueriesLoading, isWorkspacesEnabled, showCreateNewProjectDialog, on, bind, search, projectsPanelResult, fetchMoreProjects, onProjectsResult, projectsVariables, canClickCreate, projects, showEmptyState, moreToLoad, infiniteLoad, mixpanel, onMoveProject, clearSearch, onClickCreate, get MagnifyingGlassIcon() { return MagnifyingGlassIcon; }, get Squares2X2Icon() { return Squares2X2Icon; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { resolveComponent as _resolveComponent, openBlock as _openBlock, createCommentVNode as _createCommentVNode, toHandlers as _toHandlers, mergeProps as _mergeProps, createTextVNode as _createTextVNode, withCtx as _withCtx, Fragment as _Fragment } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/projects/Dashboard.vue:2:3" }; const _hoisted_2 = { key: 0, class: "flex flex-col gap-4", "data-v-inspector": "components/projects/Dashboard.vue:4:5" }; const _hoisted_3 = { class: "flex items-center gap-2 mb-2", "data-v-inspector": "components/projects/Dashboard.vue:9:7" }; const _hoisted_4 = { class: "flex flex-col lg:flex-row gap-2 lg:items-center justify-between", "data-v-inspector": "components/projects/Dashboard.vue:14:7" }; const _hoisted_5 = { class: "flex flex-col md:flex-row gap-2", "data-v-inspector": "components/projects/Dashboard.vue:15:9" }; const _hoisted_6 = { key: 1, class: "md:mt-1", "data-v-inspector": "components/projects/Dashboard.vue:35:11" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_Portal = _resolveComponent("Portal"); const _component_ProjectsMoveToWorkspaceAlert = __nuxt_component_0; const _component_FormTextInput = __nuxt_component_1; const _component_FormSelectProjectRoles = __nuxt_component_2; const _component_FormCheckbox = __nuxt_component_3; const _component_FormButton = __nuxt_component_4; const _component_CommonLoadingBar = __nuxt_component_5; const _component_ProjectsHiddenProjectWarning = __nuxt_component_6; const _component_ProjectsDashboardEmptyState = __nuxt_component_7; const _component_ProjectsDashboardFilled = __nuxt_component_8; const _component_InfiniteLoading = __nuxt_component_9; const _component_CommonEmptySearchState = __nuxt_component_10; const _component_ProjectsAdd = __nuxt_component_11; const _component_WorkspaceMoveProject = __nuxt_component_12; return _openBlock(), _createElementBlock("div", _hoisted_1, [ _createVNode(_component_Portal, { to: "primary-actions", "data-v-inspector": "components/projects/Dashboard.vue:3:5" }), !$setup.showEmptyState ? (_openBlock(), _createElementBlock("div", _hoisted_2, [ $setup.isWorkspacesEnabled ? (_openBlock(), _createBlock(_component_ProjectsMoveToWorkspaceAlert, { key: 0, onMoveProject: _cache[0] || (_cache[0] = (id) => $setup.onMoveProject(id, "projects")), "data-v-inspector": "components/projects/Dashboard.vue:5:7" })) : _createCommentVNode("v-if", true), _createElementVNode("div", _hoisted_3, [ _createVNode($setup["Squares2X2Icon"], { class: "h-5 w-5", "data-v-inspector": "components/projects/Dashboard.vue:10:9" }), _cache[6] || (_cache[6] = _createElementVNode( "h1", { class: "text-heading-lg", "data-v-inspector": "components/projects/Dashboard.vue:11:9" }, "Projects", -1 /* CACHED */ )) ]), _createElementVNode("div", _hoisted_4, [ _createElementVNode("div", _hoisted_5, [ _createVNode(_component_FormTextInput, _mergeProps({ name: "modelsearch", "show-label": false, placeholder: "Search...", "custom-icon": $setup.MagnifyingGlassIcon, color: "foundation", "wrapper-classes": "grow md:grow-0 md:w-60", "show-clear": !!$setup.search }, $setup.bind, _toHandlers($setup.on), { "data-v-inspector": "components/projects/Dashboard.vue:16:11" }), null, 16, ["custom-icon", "show-clear"]), !$setup.showEmptyState ? (_openBlock(), _createBlock(_component_FormSelectProjectRoles, { key: 0, modelValue: $setup.selectedRoles, "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.selectedRoles = $event), class: "md:w-56 grow md:grow-0", "allow-unset": "", "fixed-height": "", clearable: "", "data-v-inspector": "components/projects/Dashboard.vue:27:11" }, null, 8, ["modelValue"])) : _createCommentVNode("v-if", true), !$setup.showEmptyState && $setup.isWorkspacesEnabled ? (_openBlock(), _createElementBlock("div", _hoisted_6, [ _createVNode(_component_FormCheckbox, { id: "projects-to-move", modelValue: $setup.filterProjectsToMove, "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => $setup.filterProjectsToMove = $event), "label-classes": "!font-normal select-none", name: "Projects to move", "data-v-inspector": "components/projects/Dashboard.vue:36:13" }, null, 8, ["modelValue"]) ])) : _createCommentVNode("v-if", true) ]), $setup.canClickCreate ? (_openBlock(), _createBlock(_component_FormButton, { key: 0, onClick: $setup.onClickCreate, "data-v-inspector": "components/projects/Dashboard.vue:44:9" }, { default: _withCtx(() => [..._cache[7] || (_cache[7] = [ _createTextVNode( " New project ", -1 /* CACHED */ ) ])]), _: 1 /* STABLE */ })) : _createCommentVNode("v-if", true) ]) ])) : _createCommentVNode("v-if", true), _createVNode(_component_CommonLoadingBar, { loading: $setup.showLoadingBar, class: "my-2", "data-v-inspector": "components/projects/Dashboard.vue:49:5" }, null, 8, ["loading"]), $setup.projectsPanelResult?.activeUser && $setup.projects?.numberOfHidden ? (_openBlock(), _createBlock(_component_ProjectsHiddenProjectWarning, { key: 1, "hidden-item-count": $setup.projectsPanelResult.activeUser.projects.numberOfHidden, user: $setup.projectsPanelResult.activeUser, "data-v-inspector": "components/projects/Dashboard.vue:51:5" }, null, 8, ["hidden-item-count", "user"])) : _createCommentVNode("v-if", true), $setup.showEmptyState ? (_openBlock(), _createBlock(_component_ProjectsDashboardEmptyState, { key: 2, "can-create-project": $setup.canClickCreate, onCreateProject: $setup.onClickCreate, "data-v-inspector": "components/projects/Dashboard.vue:57:5" }, null, 8, ["can-create-project"])) : $setup.projects?.items?.length ? (_openBlock(), _createElementBlock( _Fragment, { key: 3 }, [ _createVNode(_component_ProjectsDashboardFilled, { projects: $setup.projects, "show-workspace-link": "", onMoveProject: _cache[3] || (_cache[3] = (id) => $setup.onMoveProject(id, "project_card")), "data-v-inspector": "components/projects/Dashboard.vue:63:7" }, null, 8, ["projects"]), _createVNode(_component_InfiniteLoading, { settings: { identifier: $setup.infiniteLoaderId }, onInfinite: $setup.infiniteLoad, "data-v-inspector": "components/projects/Dashboard.vue:68:7" }, null, 8, ["settings"]) ], 64 /* STABLE_FRAGMENT */ )) : !$setup.showLoadingBar ? (_openBlock(), _createBlock(_component_CommonEmptySearchState, { key: 4, onClearSearch: $setup.clearSearch, "data-v-inspector": "components/projects/Dashboard.vue:73:5" })) : _createCommentVNode("v-if", true), $setup.projectsPanelResult?.activeUser ? (_openBlock(), _createBlock(_component_ProjectsAdd, { key: 5, open: $setup.showCreateNewProjectDialog, "onUpdate:open": _cache[4] || (_cache[4] = ($event) => $setup.showCreateNewProjectDialog = $event), "data-v-inspector": "components/projects/Dashboard.vue:74:5" }, null, 8, ["open"])) : _createCommentVNode("v-if", true), $setup.showMoveProjectDialog ? (_openBlock(), _createBlock(_component_WorkspaceMoveProject, { key: 6, open: $setup.showMoveProjectDialog, "onUpdate:open": _cache[5] || (_cache[5] = ($event) => $setup.showMoveProjectDialog = $event), project: $setup.emittedProject, "data-v-inspector": "components/projects/Dashboard.vue:78:5" }, null, 8, ["open", "project"])) : _createCommentVNode("v-if", true) ]); } _sfc_main.__hmrId = "fbbf1a1a"; 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/projects/Dashboard.vue"]]); //# sourceMappingURL=data:application/json;base64,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QUFBQTtJQUdsRSw0QkFBcUIsY0FBYyxpQkFBVSxnQ0FEckQsYUFJRTtBQUFBO01BRkMscUJBQW1CLDJCQUFvQixXQUFXLFNBQVM7QUFBQSxNQUMzRCxNQUFNLDJCQUFvQjtBQUFBLE1BQVksb0JBQWlCO0FBQUE7SUFJbEQsdUNBRFIsYUFJRTtBQUFBO01BRkMsc0JBQW9CO0FBQUEsTUFDcEIsaUJBQWdCO0FBQUEsTUFBZSxvQkFBaUI7QUFBQSwyQ0FFOUIsaUJBQVUsT0FBTyx3QkFBdEM7QUFBQSxNQVVXO0FBQUE7QUFBQTtBQUFBLFFBVFQsYUFJRTtBQUFBLFVBSEMsVUFBVTtBQUFBLFVBQ1g7QUFBQSxVQUNDLGVBQVksMkJBQUcsT0FBTyxxQkFBYyxJQUFFO0FBQUEsVUFBbUIsb0JBQWlCO0FBQUE7UUFFN0UsYUFHRTtBQUFBLFVBRkMsVUFBUSxjQUFnQix3QkFBZ0I7QUFBQSxVQUN4QyxZQUFVO0FBQUEsVUFBYyxvQkFBaUI7QUFBQTs7OztVQUdWLHVDQUFwQyxhQUE0STtBQUFBO01BQXZGLGVBQWM7QUFBQSxNQUFhLG9CQUFpQjtBQUFBO0lBRXpGLDRCQUFxQiw0QkFEN0IsYUFHRTtBQUFBO01BRFEsTUFBTTtBQUFBLGlHQUEwQjtBQUFBLE1BQUUsb0JBQWlCO0FBQUE7SUFHckQsOENBRFIsYUFJRTtBQUFBO01BRlEsTUFBTTtBQUFBLDRGQUFxQjtBQUFBLE1BQ2xDLFNBQVM7QUFBQSxNQUFnQixvQkFBaUI7QUFBQSIsIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZXMiOlsiRGFzaGJvYXJkLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8dGVtcGxhdGU+XHJcbiAgPGRpdiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjI6M1wiPlxyXG4gICAgPFBvcnRhbCB0bz1cInByaW1hcnktYWN0aW9uc1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Mzo1XCI+PC9Qb3J0YWw+XHJcbiAgICA8ZGl2IHYtaWY9XCIhc2hvd0VtcHR5U3RhdGVcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjQ6NVwiPlxyXG4gICAgICA8UHJvamVjdHNNb3ZlVG9Xb3Jrc3BhY2VBbGVydFxyXG4gICAgICAgIHYtaWY9XCJpc1dvcmtzcGFjZXNFbmFibGVkXCJcclxuICAgICAgICBAbW92ZS1wcm9qZWN0PVwiKGlkKSA9PiBvbk1vdmVQcm9qZWN0KGlkLCAncHJvamVjdHMnKVwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6NTo3XCJcclxuICAgICAgLz5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yIG1iLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjk6N1wiPlxyXG4gICAgICAgIDxTcXVhcmVzMlgySWNvbiBjbGFzcz1cImgtNSB3LTVcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjEwOjlcIiAvPlxyXG4gICAgICAgIDxoMSBjbGFzcz1cInRleHQtaGVhZGluZy1sZ1wiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6MTE6OVwiPlByb2plY3RzPC9oMT5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBsZzpmbGV4LXJvdyBnYXAtMiBsZzppdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZToxNDo3XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgZ2FwLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjE1OjlcIj5cclxuICAgICAgICAgIDxGb3JtVGV4dElucHV0XHJcbiAgICAgICAgICAgIG5hbWU9XCJtb2RlbHNlYXJjaFwiXHJcbiAgICAgICAgICAgIDpzaG93LWxhYmVsPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiXHJcbiAgICAgICAgICAgIDpjdXN0b20taWNvbj1cIk1hZ25pZnlpbmdHbGFzc0ljb25cIlxyXG4gICAgICAgICAgICBjb2xvcj1cImZvdW5kYXRpb25cIlxyXG4gICAgICAgICAgICB3cmFwcGVyLWNsYXNzZXM9XCJncm93IG1kOmdyb3ctMCBtZDp3LTYwXCJcclxuICAgICAgICAgICAgOnNob3ctY2xlYXI9XCIhIXNlYXJjaFwiXHJcbiAgICAgICAgICAgIHYtYmluZD1cImJpbmRcIlxyXG4gICAgICAgICAgICB2LW9uPVwib25cIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjE2OjExXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8Rm9ybVNlbGVjdFByb2plY3RSb2xlc1xyXG4gICAgICAgICAgICB2LWlmPVwiIXNob3dFbXB0eVN0YXRlXCJcclxuICAgICAgICAgICAgdi1tb2RlbD1cInNlbGVjdGVkUm9sZXNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm1kOnctNTYgZ3JvdyBtZDpncm93LTBcIlxyXG4gICAgICAgICAgICBhbGxvdy11bnNldFxyXG4gICAgICAgICAgICBmaXhlZC1oZWlnaHRcclxuICAgICAgICAgICAgY2xlYXJhYmxlIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Mjc6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxkaXYgdi1pZj1cIiFzaG93RW1wdHlTdGF0ZSAmJiBpc1dvcmtzcGFjZXNFbmFibGVkXCIgY2xhc3M9XCJtZDptdC0xXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTozNToxMVwiPlxyXG4gICAgICAgICAgICA8Rm9ybUNoZWNrYm94XHJcbiAgICAgICAgICAgICAgaWQ9XCJwcm9qZWN0cy10by1tb3ZlXCJcclxuICAgICAgICAgICAgICB2LW1vZGVsPVwiZmlsdGVyUHJvamVjdHNUb01vdmVcIlxyXG4gICAgICAgICAgICAgIGxhYmVsLWNsYXNzZXM9XCIhZm9udC1ub3JtYWwgc2VsZWN0LW5vbmVcIlxyXG4gICAgICAgICAgICAgIG5hbWU9XCJQcm9qZWN0cyB0byBtb3ZlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTozNjoxM1wiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8Rm9ybUJ1dHRvbiB2LWlmPVwiY2FuQ2xpY2tDcmVhdGVcIiBAY2xpY2s9XCJvbkNsaWNrQ3JlYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo0NDo5XCI+XHJcbiAgICAgICAgICBOZXcgcHJvamVjdFxyXG4gICAgICAgIDwvRm9ybUJ1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxDb21tb25Mb2FkaW5nQmFyIDpsb2FkaW5nPVwic2hvd0xvYWRpbmdCYXJcIiBjbGFzcz1cIm15LTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjQ5OjVcIiAvPlxyXG5cclxuICAgIDxQcm9qZWN0c0hpZGRlblByb2plY3RXYXJuaW5nXHJcbiAgICAgIHYtaWY9XCJwcm9qZWN0c1BhbmVsUmVzdWx0Py5hY3RpdmVVc2VyICYmIHByb2plY3RzPy5udW1iZXJPZkhpZGRlblwiXHJcbiAgICAgIDpoaWRkZW4taXRlbS1jb3VudD1cInByb2plY3RzUGFuZWxSZXN1bHQuYWN0aXZlVXNlci5wcm9qZWN0cy5udW1iZXJPZkhpZGRlblwiXHJcbiAgICAgIDp1c2VyPVwicHJvamVjdHNQYW5lbFJlc3VsdC5hY3RpdmVVc2VyXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo1MTo1XCJcclxuICAgIC8+XHJcblxyXG4gICAgPFByb2plY3RzRGFzaGJvYXJkRW1wdHlTdGF0ZVxyXG4gICAgICB2LWlmPVwic2hvd0VtcHR5U3RhdGVcIlxyXG4gICAgICA6Y2FuLWNyZWF0ZS1wcm9qZWN0PVwiY2FuQ2xpY2tDcmVhdGVcIlxyXG4gICAgICBAY3JlYXRlLXByb2plY3Q9XCJvbkNsaWNrQ3JlYXRlXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo1Nzo1XCJcclxuICAgIC8+XHJcbiAgICA8dGVtcGxhdGUgdi1lbHNlLWlmPVwicHJvamVjdHM/Lml0ZW1zPy5sZW5ndGhcIj5cclxuICAgICAgPFByb2plY3RzRGFzaGJvYXJkRmlsbGVkXHJcbiAgICAgICAgOnByb2plY3RzPVwicHJvamVjdHNcIlxyXG4gICAgICAgIHNob3ctd29ya3NwYWNlLWxpbmtcclxuICAgICAgICBAbW92ZS1wcm9qZWN0PVwiKGlkKSA9PiBvbk1vdmVQcm9qZWN0KGlkLCAncHJvamVjdF9jYXJkJylcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjYzOjdcIlxyXG4gICAgICAvPlxyXG4gICAgICA8SW5maW5pdGVMb2FkaW5nXHJcbiAgICAgICAgOnNldHRpbmdzPVwieyBpZGVudGlmaWVyOiBpbmZpbml0ZUxvYWRlcklkIH1cIlxyXG4gICAgICAgIEBpbmZpbml0ZT1cImluZmluaXRlTG9hZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3RzL0Rhc2hib2FyZC52dWU6Njg6N1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPENvbW1vbkVtcHR5U2VhcmNoU3RhdGUgdi1lbHNlLWlmPVwiIXNob3dMb2FkaW5nQmFyXCIgQGNsZWFyLXNlYXJjaD1cImNsZWFyU2VhcmNoXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo3Mzo1XCIgLz5cclxuICAgIDxQcm9qZWN0c0FkZFxyXG4gICAgICB2LWlmPVwicHJvamVjdHNQYW5lbFJlc3VsdD8uYWN0aXZlVXNlclwiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dDcmVhdGVOZXdQcm9qZWN0RGlhbG9nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdHMvRGFzaGJvYXJkLnZ1ZTo3NDo1XCJcclxuICAgIC8+XHJcbiAgICA8V29ya3NwYWNlTW92ZVByb2plY3RcclxuICAgICAgdi1pZj1cInNob3dNb3ZlUHJvamVjdERpYWxvZ1wiXHJcbiAgICAgIHYtbW9kZWw6b3Blbj1cInNob3dNb3ZlUHJvamVjdERpYWxvZ1wiXHJcbiAgICAgIDpwcm9qZWN0PVwiZW1pdHRlZFByb2plY3RcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlOjc4OjVcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuXHJcbjxzY3JpcHQgc2V0dXAgbGFuZz1cInRzXCI+XHJcbmltcG9ydCB7IHVzZVF1ZXJ5LCB1c2VRdWVyeUxvYWRpbmcgfSBmcm9tICdAdnVlL2Fwb2xsby1jb21wb3NhYmxlJ1xyXG5pbXBvcnQgeyBwcm9qZWN0c0Rhc2hib2FyZFF1ZXJ5IH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2dyYXBocWwvcXVlcmllcydcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ35+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSwgT3B0aW9uYWwsIFN0cmVhbVJvbGVzIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgeyB1c2VEZWJvdW5jZWRUZXh0SW5wdXQsIHR5cGUgSW5maW5pdGVMb2FkZXJTdGF0ZSB9IGZyb20gJ0BzcGVja2xlL3VpLWNvbXBvbmVudHMnXHJcbmltcG9ydCB7IE1hZ25pZnlpbmdHbGFzc0ljb24sIFNxdWFyZXMyWDJJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHsgdXNlVXNlclByb2plY3RzVXBkYXRlZFRyYWNraW5nIH0gZnJvbSAnfn4vbGliL3VzZXIvY29tcG9zYWJsZXMvcHJvamVjdFVwZGF0ZXMnXHJcbmltcG9ydCB7IHVzZU1peHBhbmVsIH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9tcCdcclxuaW1wb3J0IHsgdXNlQ2FuQ3JlYXRlUGVyc29uYWxQcm9qZWN0IH0gZnJvbSAnfn4vbGliL3Byb2plY3RzL2NvbXBvc2FibGVzL3Blcm1pc3Npb25zJ1xyXG5pbXBvcnQgdHlwZSB7IFByb2plY3RzRGFzaGJvYXJkUXVlcnlRdWVyeSB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsL2dyYXBocWwnXHJcbmltcG9ydCB0eXBlIHsgR2V0IH0gZnJvbSAndHlwZS1mZXN0J1xyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgUHJvamVjdHNEYXNoYm9hcmRfVXNlclByb2plY3RDb2xsZWN0aW9uIG9uIFVzZXJQcm9qZWN0Q29sbGVjdGlvbiB7XHJcbiAgICBudW1iZXJPZkhpZGRlblxyXG4gIH1cclxuYClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFByb2plY3RzRGFzaGJvYXJkX1VzZXIgb24gVXNlciB7XHJcbiAgICAuLi5Qcm9qZWN0c0FkZF9Vc2VyXHJcbiAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgIGNhbkNyZWF0ZVBlcnNvbmFsUHJvamVjdCB7XHJcbiAgICAgICAgLi4uRnVsbFBlcm1pc3Npb25DaGVja1Jlc3VsdFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgbG9nZ2VyID0gdXNlTG9nZ2VyKClcclxuXHJcbmNvbnN0IGluZmluaXRlTG9hZGVySWQgPSByZWYoJycpXHJcbmNvbnN0IGN1cnNvciA9IHJlZihudWxsIGFzIE51bGxhYmxlPHN0cmluZz4pXHJcbmNvbnN0IHNlbGVjdGVkUm9sZXMgPSByZWYodW5kZWZpbmVkIGFzIE9wdGlvbmFsPFN0cmVhbVJvbGVzW10+KVxyXG5jb25zdCBmaWx0ZXJQcm9qZWN0c1RvTW92ZSA9IHJlZihmYWxzZSlcclxuY29uc3Qgc2hvd0xvYWRpbmdCYXIgPSByZWYoZmFsc2UpXHJcbmNvbnN0IHNob3dNb3ZlUHJvamVjdERpYWxvZyA9IHJlZihmYWxzZSlcclxuY29uc3QgZW1pdHRlZFByb2plY3QgPVxyXG4gIHJlZjxHZXQ8UHJvamVjdHNEYXNoYm9hcmRRdWVyeVF1ZXJ5LCAnYWN0aXZlVXNlci5wcm9qZWN0cy5pdGVtc1swXSc+PigpXHJcbmNvbnN0IGFyZVF1ZXJpZXNMb2FkaW5nID0gdXNlUXVlcnlMb2FkaW5nKClcclxuY29uc3QgaXNXb3Jrc3BhY2VzRW5hYmxlZCA9IHVzZUlzV29ya3NwYWNlc0VuYWJsZWQoKVxyXG5jb25zdCBzaG93Q3JlYXRlTmV3UHJvamVjdERpYWxvZyA9IHJlZihmYWxzZSlcclxudXNlVXNlclByb2plY3RzVXBkYXRlZFRyYWNraW5nKClcclxuXHJcbmNvbnN0IHtcclxuICBvbixcclxuICBiaW5kLFxyXG4gIHZhbHVlOiBzZWFyY2hcclxufSA9IHVzZURlYm91bmNlZFRleHRJbnB1dCh7XHJcbiAgZGVib3VuY2VkQnk6IDgwMFxyXG59KVxyXG5cclxuY29uc3Qge1xyXG4gIHJlc3VsdDogcHJvamVjdHNQYW5lbFJlc3VsdCxcclxuICBmZXRjaE1vcmU6IGZldGNoTW9yZVByb2plY3RzLFxyXG4gIG9uUmVzdWx0OiBvblByb2plY3RzUmVzdWx0LFxyXG4gIHZhcmlhYmxlczogcHJvamVjdHNWYXJpYWJsZXNcclxufSA9IHVzZVF1ZXJ5KHByb2plY3RzRGFzaGJvYXJkUXVlcnksICgpID0+ICh7XHJcbiAgZmlsdGVyOiB7XHJcbiAgICBzZWFyY2g6IChzZWFyY2gudmFsdWUgfHwgJycpLnRyaW0oKSB8fCBudWxsLFxyXG4gICAgb25seVdpdGhSb2xlczogZmlsdGVyUHJvamVjdHNUb01vdmUudmFsdWVcclxuICAgICAgPyBbJ3N0cmVhbTpvd25lciddXHJcbiAgICAgIDogc2VsZWN0ZWRSb2xlcy52YWx1ZT8ubGVuZ3RoXHJcbiAgICAgID8gc2VsZWN0ZWRSb2xlcy52YWx1ZVxyXG4gICAgICA6IG51bGwsXHJcbiAgICBwZXJzb25hbE9ubHk6IGlzV29ya3NwYWNlc0VuYWJsZWQudmFsdWVcclxuICB9LFxyXG4gIGN1cnNvcjogbnVsbCBhcyBOdWxsYWJsZTxzdHJpbmc+XHJcbn0pKVxyXG5cclxuY29uc3QgeyBjYW5DbGlja0NyZWF0ZSB9ID0gdXNlQ2FuQ3JlYXRlUGVyc29uYWxQcm9qZWN0KHtcclxuICBhY3RpdmVVc2VyOiBjb21wdXRlZCgoKSA9PiBwcm9qZWN0c1BhbmVsUmVzdWx0LnZhbHVlPy5hY3RpdmVVc2VyKVxyXG59KVxyXG5cclxub25Qcm9qZWN0c1Jlc3VsdCgocmVzKSA9PiB7XHJcbiAgY3Vyc29yLnZhbHVlID0gcmVzLmRhdGE/LmFjdGl2ZVVzZXI/LnByb2plY3RzLmN1cnNvciB8fCBudWxsXHJcbiAgaW5maW5pdGVMb2FkZXJJZC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHByb2plY3RzVmFyaWFibGVzLnZhbHVlPy5maWx0ZXIgfHwge30pXHJcbn0pXHJcblxyXG5jb25zdCBwcm9qZWN0cyA9IGNvbXB1dGVkKCgpID0+IHByb2plY3RzUGFuZWxSZXN1bHQudmFsdWU/LmFjdGl2ZVVzZXI/LnByb2plY3RzKVxyXG5jb25zdCBzaG93RW1wdHlTdGF0ZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBjb25zdCBpc0ZpbHRlcmluZyA9XHJcbiAgICBwcm9qZWN0c1ZhcmlhYmxlcy52YWx1ZT8uZmlsdGVyPy5vbmx5V2l0aFJvbGVzPy5sZW5ndGggfHxcclxuICAgIHByb2plY3RzVmFyaWFibGVzLnZhbHVlPy5maWx0ZXI/LnNlYXJjaD8ubGVuZ3RoXHJcbiAgaWYgKGlzRmlsdGVyaW5nKSByZXR1cm4gZmFsc2VcclxuXHJcbiAgcmV0dXJuIHByb2plY3RzLnZhbHVlICYmICFwcm9qZWN0cy52YWx1ZS5pdGVtcy5sZW5ndGhcclxufSlcclxuXHJcbmNvbnN0IG1vcmVUb0xvYWQgPSBjb21wdXRlZChcclxuICAoKSA9PlxyXG4gICAgKCFwcm9qZWN0cy52YWx1ZSB8fCBwcm9qZWN0cy52YWx1ZS5pdGVtcy5sZW5ndGggPCBwcm9qZWN0cy52YWx1ZS50b3RhbENvdW50KSAmJlxyXG4gICAgY3Vyc29yLnZhbHVlXHJcbilcclxuXHJcbmNvbnN0IGluZmluaXRlTG9hZCA9IGFzeW5jIChzdGF0ZTogSW5maW5pdGVMb2FkZXJTdGF0ZSkgPT4ge1xyXG4gIGlmICghbW9yZVRvTG9hZC52YWx1ZSkgcmV0dXJuIHN0YXRlLmNvbXBsZXRlKClcclxuXHJcbiAgdHJ5IHtcclxuICAgIGF3YWl0IGZldGNoTW9yZVByb2plY3RzKHtcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgY3Vyc29yOiBjdXJzb3IudmFsdWVcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZSlcclxuICAgIHN0YXRlLmVycm9yKClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgc3RhdGUubG9hZGVkKClcclxuICBpZiAoIW1vcmVUb0xvYWQudmFsdWUpIHtcclxuICAgIHN0YXRlLmNvbXBsZXRlKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG1peHBhbmVsID0gdXNlTWl4cGFuZWwoKVxyXG5cclxuY29uc3Qgb25Nb3ZlUHJvamVjdCA9IChwcm9qZWN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgbG9jYXRpb246IHN0cmluZykgPT4ge1xyXG4gIGNvbnN0IHByb2plY3QgPSBwcm9qZWN0SWRcclxuICAgID8gcHJvamVjdHMudmFsdWU/Lml0ZW1zLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZClcclxuICAgIDogdW5kZWZpbmVkXHJcbiAgZW1pdHRlZFByb2plY3QudmFsdWUgPSBwcm9qZWN0IHx8IHVuZGVmaW5lZFxyXG5cclxuICBtaXhwYW5lbC50cmFjaygnTW92ZSBQcm9qZWN0IENUQSBDbGlja2VkJywge1xyXG4gICAgbG9jYXRpb24sXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXHJcbiAgICB3b3Jrc3BhY2VfaWQ6IHByb2plY3Q/LndvcmtzcGFjZT8uaWQgfHwgdW5kZWZpbmVkXHJcbiAgfSlcclxuICBzaG93TW92ZVByb2plY3REaWFsb2cudmFsdWUgPSB0cnVlXHJcbn1cclxuXHJcbndhdGNoKHNlYXJjaCwgKG5ld1ZhbCkgPT4ge1xyXG4gIGlmIChuZXdWYWwpIHNob3dMb2FkaW5nQmFyLnZhbHVlID0gdHJ1ZVxyXG4gIGVsc2Ugc2hvd0xvYWRpbmdCYXIudmFsdWUgPSBmYWxzZVxyXG59KVxyXG5cclxud2F0Y2goYXJlUXVlcmllc0xvYWRpbmcsIChuZXdWYWwpID0+IChzaG93TG9hZGluZ0Jhci52YWx1ZSA9IG5ld1ZhbCkpXHJcblxyXG5jb25zdCBjbGVhclNlYXJjaCA9ICgpID0+IHtcclxuICBzZWFyY2gudmFsdWUgPSAnJ1xyXG4gIHNlbGVjdGVkUm9sZXMudmFsdWUgPSBbXVxyXG59XHJcblxyXG5jb25zdCBvbkNsaWNrQ3JlYXRlID0gKCkgPT4ge1xyXG4gIHNob3dDcmVhdGVOZXdQcm9qZWN0RGlhbG9nLnZhbHVlID0gdHJ1ZVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0cy9EYXNoYm9hcmQudnVlIn0=