import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/ListView.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/project/page/models/StructureItem.vue"; import { default as __nuxt_component_1 } from "/_nuxt/components/form/ButtonSecondaryViewAll.vue"; import { default as __nuxt_component_2 } from "/_nuxt/components/common/EmptySearchState.vue"; import { default as __nuxt_component_3 } from "/_nuxt/components/project/CardImportFileArea.vue"; import { InfiniteLoading as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { default as __nuxt_component_5 } from "/_nuxt/components/project/models/Add.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementBlock as __createElementBlock,createVNode as __createVNode,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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...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 { projectModelsTreeTopLevelQuery, projectModelsTreeTopLevelPaginationQuery } from "/_nuxt/lib/projects/graphql/queries.ts"; import { useEvictProjectModelFields } from "/_nuxt/lib/projects/composables/modelManagement.ts"; import { allProjectModelsRoute } from "/_nuxt/lib/common/helpers/route.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"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ProjectPageModelsListView", props: { projectId: { type: String, required: true }, project: { type: Object, required: false }, search: { type: String, required: false }, disablePagination: { type: Boolean, required: false }, sourceApps: { type: Array, required: false }, contributors: { type: Array, required: false } }, emits: ["update:loading", "clear-search"], setup(__props, { expose: __expose, emit: __emit }) { __expose(); const emit = __emit; const props = __props; const logger = useLogger(); const infiniteLoadCacheBuster = ref(0); const newSubmodelParent = ref(""); const showNewDialog = computed({ get: () => !!newSubmodelParent.value, set: (newVal) => { if (!newVal) { newSubmodelParent.value = ""; } } }); const evictModelFields = useEvictProjectModelFields(); const areQueriesLoading = useQueryLoading(); const baseQueryVariables = computed( () => ({ projectId: props.projectId, filter: { search: props.search || null, sourceApps: props.sourceApps?.length ? props.sourceApps.map((a) => a.searchKey) : null, contributors: props.contributors?.length ? props.contributors.map((c) => c.id) : null } }) ); const infiniteLoaderId = ref(""); const isModelUploading = ref(false); const { result: baseResult, variables: resultVariables, onResult: onBaseResult } = useQuery(projectModelsTreeTopLevelQuery, () => baseQueryVariables.value); const isFiltering = computed(() => { const filter = resultVariables.value?.filter; if (filter?.contributors?.length) return true; if (filter?.search?.length) return true; if (filter?.sourceApps?.length) return true; return false; }); const { result: extraPagesResult, fetchMore: fetchMorePages, onResult: onExtraPagesResult } = useQuery( projectModelsTreeTopLevelPaginationQuery, () => ({ ...baseQueryVariables.value, cursor: null }), () => ({ enabled: !props.disablePagination }) ); const pendingModels = computed( () => isFiltering.value ? [] : baseResult.value?.project?.pendingImportedModels || [] ); const modelTreeItems = computed( () => extraPagesResult.value ? extraPagesResult.value?.project?.modelsTree.items || [] : baseResult.value?.project?.modelsTree.items || [] ); const topLevelItems = computed( () => [...pendingModels.value, ...modelTreeItems.value].slice( 0, props.disablePagination ? 8 : void 0 ) ); const isUsingSearch = computed(() => !!resultVariables.value?.filter?.search); const moreToLoad = computed( () => !extraPagesResult.value?.project || extraPagesResult.value.project.modelsTree.items.length < extraPagesResult.value.project.modelsTree.totalCount ); const showViewAll = computed(() => moreToLoad.value && props.disablePagination); const onModelUpdated = () => { evictModelFields(props.projectId); infiniteLoadCacheBuster.value++; calculateLoaderId(); }; const onCreateSubmodel = (parentModelName) => { newSubmodelParent.value = parentModelName; }; const infiniteLoad = async (state) => { const cursor = extraPagesResult.value?.project?.modelsTree.cursor || baseResult.value?.project?.modelsTree.cursor || null; if (!moreToLoad.value || !cursor) return state.complete(); try { await fetchMorePages({ variables: { cursor } }); } catch (e) { logger.error(e); state.error(); return; } state.loaded(); if (!moreToLoad.value) { state.complete(); } }; const calculateLoaderId = () => { const vars = baseQueryVariables.value; const id = JSON.stringify(vars.filter) + `${infiniteLoadCacheBuster.value}`; infiniteLoaderId.value = id; }; const onModelUploading = (payload) => { isModelUploading.value = payload.isUploading; }; watch(areQueriesLoading, (newVal) => { emit("update:loading", newVal); }); onBaseResult(calculateLoaderId); onExtraPagesResult(calculateLoaderId); const __returned__ = { emit, props, logger, infiniteLoadCacheBuster, newSubmodelParent, showNewDialog, evictModelFields, areQueriesLoading, baseQueryVariables, infiniteLoaderId, isModelUploading, baseResult, resultVariables, onBaseResult, isFiltering, extraPagesResult, fetchMorePages, onExtraPagesResult, pendingModels, modelTreeItems, topLevelItems, isUsingSearch, moreToLoad, showViewAll, onModelUpdated, onCreateSubmodel, infiniteLoad, calculateLoaderId, onModelUploading, get allProjectModelsRoute() { return allProjectModelsRoute; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { renderList as _renderList, Fragment as _Fragment, openBlock as _openBlock, resolveComponent as _resolveComponent, createCommentVNode as _createCommentVNode } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { "data-v-inspector": "components/project/page/models/ListView.vue:2:3" }; const _hoisted_2 = { key: 0, class: "space-y-2 max-w-full", "data-v-inspector": "components/project/page/models/ListView.vue:3:5" }; const _hoisted_3 = { key: 1, "data-v-inspector": "components/project/page/models/ListView.vue:30:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_ProjectPageModelsStructureItem = __nuxt_component_0; const _component_FormButtonSecondaryViewAll = __nuxt_component_1; const _component_CommonEmptySearchState = __nuxt_component_2; const _component_ProjectCardImportFileArea = __nuxt_component_3; const _component_InfiniteLoading = __nuxt_component_4; const _component_ProjectModelsAdd = __nuxt_component_5; return _openBlock(), _createElementBlock("div", _hoisted_1, [ $setup.topLevelItems.length && $props.project && !$setup.isModelUploading ? (_openBlock(), _createElementBlock("div", _hoisted_2, [ (_openBlock(true), _createElementBlock( _Fragment, null, _renderList($setup.topLevelItems, (item) => { return _openBlock(), _createElementBlock("div", { key: item.id, "data-v-inspector": "components/project/page/models/ListView.vue:7:7" }, [ _createVNode(_component_ProjectPageModelsStructureItem, { item, project: $props.project, "is-search-result": $setup.isUsingSearch, onModelUpdated: $setup.onModelUpdated, onCreateSubmodel: $setup.onCreateSubmodel, "data-v-inspector": "components/project/page/models/ListView.vue:8:9" }, null, 8, ["item", "project", "is-search-result"]) ]); }), 128 /* KEYED_FRAGMENT */ )), $setup.showViewAll ? (_openBlock(), _createBlock(_component_FormButtonSecondaryViewAll, { key: 0, to: $setup.allProjectModelsRoute($props.projectId), "data-v-inspector": "components/project/page/models/ListView.vue:16:7" }, null, 8, ["to"])) : _createCommentVNode("v-if", true) ])) : !$setup.areQueriesLoading ? (_openBlock(), _createElementBlock( _Fragment, { key: 1 }, [ !$setup.topLevelItems.length && $setup.isFiltering && ($setup.baseResult?.project?.modelsTree.items || []).length === 0 ? (_openBlock(), _createBlock(_component_CommonEmptySearchState, { key: 0, onClearSearch: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("clear-search")), "data-v-inspector": "components/project/page/models/ListView.vue:22:7" })) : (_openBlock(), _createElementBlock("div", _hoisted_3, [ $props.project ? (_openBlock(), _createBlock(_component_ProjectCardImportFileArea, { key: 0, project: $props.project, class: "h-36 col-span-4", onUploading: $setup.onModelUploading, "data-v-inspector": "components/project/page/models/ListView.vue:31:9" }, null, 8, ["project"])) : _createCommentVNode("v-if", true) ])) ], 64 /* STABLE_FRAGMENT */ )) : _createCommentVNode("v-if", true), $setup.topLevelItems?.length && !$props.disablePagination ? (_openBlock(), _createBlock(_component_InfiniteLoading, { key: 2, settings: { identifier: $setup.infiniteLoaderId }, onInfinite: $setup.infiniteLoad, "data-v-inspector": "components/project/page/models/ListView.vue:39:5" }, null, 8, ["settings"])) : _createCommentVNode("v-if", true), _createVNode(_component_ProjectModelsAdd, { open: $setup.showNewDialog, "onUpdate:open": _cache[1] || (_cache[1] = ($event) => $setup.showNewDialog = $event), project: $props.project, "parent-model-name": $setup.newSubmodelParent || void 0, "data-v-inspector": "components/project/page/models/ListView.vue:44:5" }, null, 8, ["open", "project", "parent-model-name"]) ]); } _sfc_main.__hmrId = "7d741a8c"; typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main); import.meta.hot.on("file-changed", ({ file }) => { __VUE_HMR_RUNTIME__.CHANGED_FILE = file; }); import.meta.hot.accept((mod) => { if (!mod) return; const { default: updated, _rerender_only } = mod; if (_rerender_only) { __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render); } else { __VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated); } }); import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper"; export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/project/page/models/ListView.vue"]]); //# sourceMappingURL=data:application/json;base64,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Z25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJMaXN0Vmlldy52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxkaXYgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9MaXN0Vmlldy52dWU6MjozXCI+XHJcbiAgICA8ZGl2XHJcbiAgICAgIHYtaWY9XCJ0b3BMZXZlbEl0ZW1zLmxlbmd0aCAmJiBwcm9qZWN0ICYmICFpc01vZGVsVXBsb2FkaW5nXCJcclxuICAgICAgY2xhc3M9XCJzcGFjZS15LTIgbWF4LXctZnVsbFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvTGlzdFZpZXcudnVlOjM6NVwiXHJcbiAgICA+XHJcbiAgICAgIDxkaXYgdi1mb3I9XCJpdGVtIGluIHRvcExldmVsSXRlbXNcIiA6a2V5PVwiaXRlbS5pZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvTGlzdFZpZXcudnVlOjc6N1wiPlxyXG4gICAgICAgIDxQcm9qZWN0UGFnZU1vZGVsc1N0cnVjdHVyZUl0ZW1cclxuICAgICAgICAgIDppdGVtPVwiaXRlbVwiXHJcbiAgICAgICAgICA6cHJvamVjdD1cInByb2plY3RcIlxyXG4gICAgICAgICAgOmlzLXNlYXJjaC1yZXN1bHQ9XCJpc1VzaW5nU2VhcmNoXCJcclxuICAgICAgICAgIEBtb2RlbC11cGRhdGVkPVwib25Nb2RlbFVwZGF0ZWRcIlxyXG4gICAgICAgICAgQGNyZWF0ZS1zdWJtb2RlbD1cIm9uQ3JlYXRlU3VibW9kZWxcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0xpc3RWaWV3LnZ1ZTo4OjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8Rm9ybUJ1dHRvblNlY29uZGFyeVZpZXdBbGxcclxuICAgICAgICB2LWlmPVwic2hvd1ZpZXdBbGxcIlxyXG4gICAgICAgIDp0bz1cImFsbFByb2plY3RNb2RlbHNSb3V0ZShwcm9qZWN0SWQpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9MaXN0Vmlldy52dWU6MTY6N1wiXHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDx0ZW1wbGF0ZSB2LWVsc2UtaWY9XCIhYXJlUXVlcmllc0xvYWRpbmdcIj5cclxuICAgICAgPENvbW1vbkVtcHR5U2VhcmNoU3RhdGVcclxuICAgICAgICB2LWlmPVwiXHJcbiAgICAgICAgICAhdG9wTGV2ZWxJdGVtcy5sZW5ndGggJiZcclxuICAgICAgICAgIGlzRmlsdGVyaW5nICYmXHJcbiAgICAgICAgICAoYmFzZVJlc3VsdD8ucHJvamVjdD8ubW9kZWxzVHJlZS5pdGVtcyB8fCBbXSkubGVuZ3RoID09PSAwXHJcbiAgICAgICAgXCJcclxuICAgICAgICBAY2xlYXItc2VhcmNoPVwiJGVtaXQoJ2NsZWFyLXNlYXJjaCcpXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9MaXN0Vmlldy52dWU6MjI6N1wiXHJcbiAgICAgIC8+XHJcbiAgICAgIDxkaXYgdi1lbHNlIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvTGlzdFZpZXcudnVlOjMwOjdcIj5cclxuICAgICAgICA8UHJvamVjdENhcmRJbXBvcnRGaWxlQXJlYVxyXG4gICAgICAgICAgdi1pZj1cInByb2plY3RcIlxyXG4gICAgICAgICAgOnByb2plY3Q9XCJwcm9qZWN0XCJcclxuICAgICAgICAgIGNsYXNzPVwiaC0zNiBjb2wtc3Bhbi00XCJcclxuICAgICAgICAgIEB1cGxvYWRpbmc9XCJvbk1vZGVsVXBsb2FkaW5nXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9MaXN0Vmlldy52dWU6MzE6OVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L3RlbXBsYXRlPlxyXG4gICAgPEluZmluaXRlTG9hZGluZ1xyXG4gICAgICB2LWlmPVwidG9wTGV2ZWxJdGVtcz8ubGVuZ3RoICYmICFkaXNhYmxlUGFnaW5hdGlvblwiXHJcbiAgICAgIDpzZXR0aW5ncz1cInsgaWRlbnRpZmllcjogaW5maW5pdGVMb2FkZXJJZCB9XCJcclxuICAgICAgQGluZmluaXRlPVwiaW5maW5pdGVMb2FkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9MaXN0Vmlldy52dWU6Mzk6NVwiXHJcbiAgICAvPlxyXG4gICAgPFByb2plY3RNb2RlbHNBZGRcclxuICAgICAgdi1tb2RlbDpvcGVuPVwic2hvd05ld0RpYWxvZ1wiXHJcbiAgICAgIDpwcm9qZWN0PVwicHJvamVjdFwiXHJcbiAgICAgIDpwYXJlbnQtbW9kZWwtbmFtZT1cIm5ld1N1Ym1vZGVsUGFyZW50IHx8IHVuZGVmaW5lZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvTGlzdFZpZXcudnVlOjQ0OjVcIlxyXG4gICAgLz5cclxuICA8L2Rpdj5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHR5cGUge1xyXG4gIFBlbmRpbmdGaWxlVXBsb2FkRnJhZ21lbnQsXHJcbiAgUHJvamVjdFBhZ2VMYXRlc3RJdGVtc01vZGVsc0ZyYWdtZW50LFxyXG4gIFNpbmdsZUxldmVsTW9kZWxUcmVlSXRlbUZyYWdtZW50LFxyXG4gIEZvcm1Vc2Vyc1NlbGVjdEl0ZW1GcmFnbWVudCxcclxuICBQcm9qZWN0TW9kZWxzVHJlZVRvcExldmVsUXVlcnlWYXJpYWJsZXNcclxufSBmcm9tICd+fi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgdXNlUXVlcnksIHVzZVF1ZXJ5TG9hZGluZyB9IGZyb20gJ0B2dWUvYXBvbGxvLWNvbXBvc2FibGUnXHJcbmltcG9ydCB7XHJcbiAgcHJvamVjdE1vZGVsc1RyZWVUb3BMZXZlbFF1ZXJ5LFxyXG4gIHByb2plY3RNb2RlbHNUcmVlVG9wTGV2ZWxQYWdpbmF0aW9uUXVlcnlcclxufSBmcm9tICd+fi9saWIvcHJvamVjdHMvZ3JhcGhxbC9xdWVyaWVzJ1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlLCBTb3VyY2VBcHBEZWZpbml0aW9uIH0gZnJvbSAnQHNwZWNrbGUvc2hhcmVkJ1xyXG5pbXBvcnQgdHlwZSB7IEluZmluaXRlTG9hZGVyU3RhdGUgfSBmcm9tICd+fi9saWIvZ2xvYmFsL2hlbHBlcnMvY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlRXZpY3RQcm9qZWN0TW9kZWxGaWVsZHMgfSBmcm9tICd+fi9saWIvcHJvamVjdHMvY29tcG9zYWJsZXMvbW9kZWxNYW5hZ2VtZW50J1xyXG5pbXBvcnQgeyBhbGxQcm9qZWN0TW9kZWxzUm91dGUgfSBmcm9tICd+fi9saWIvY29tbW9uL2hlbHBlcnMvcm91dGUnXHJcbmltcG9ydCB0eXBlIHsgRmlsZUFyZWFVcGxvYWRpbmdQYXlsb2FkIH0gZnJvbSAnfi9saWIvZm9ybS9oZWxwZXJzL2ZpbGVVcGxvYWQnXHJcblxyXG5jb25zdCBlbWl0ID0gZGVmaW5lRW1pdHM8e1xyXG4gIChlOiAndXBkYXRlOmxvYWRpbmcnLCB2OiBib29sZWFuKTogdm9pZFxyXG4gIChlOiAnY2xlYXItc2VhcmNoJyk6IHZvaWRcclxufT4oKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgcHJvamVjdElkOiBzdHJpbmdcclxuICBwcm9qZWN0PzogUHJvamVjdFBhZ2VMYXRlc3RJdGVtc01vZGVsc0ZyYWdtZW50XHJcbiAgc2VhcmNoPzogc3RyaW5nXHJcbiAgZGlzYWJsZVBhZ2luYXRpb24/OiBib29sZWFuXHJcbiAgc291cmNlQXBwcz86IFNvdXJjZUFwcERlZmluaXRpb25bXVxyXG4gIGNvbnRyaWJ1dG9ycz86IEZvcm1Vc2Vyc1NlbGVjdEl0ZW1GcmFnbWVudFtdXHJcbn0+KClcclxuXHJcbmNvbnN0IGxvZ2dlciA9IHVzZUxvZ2dlcigpXHJcblxyXG5jb25zdCBpbmZpbml0ZUxvYWRDYWNoZUJ1c3RlciA9IHJlZigwKVxyXG5jb25zdCBuZXdTdWJtb2RlbFBhcmVudCA9IHJlZignJylcclxuXHJcbmNvbnN0IHNob3dOZXdEaWFsb2cgPSBjb21wdXRlZCh7XHJcbiAgZ2V0OiAoKSA9PiAhIW5ld1N1Ym1vZGVsUGFyZW50LnZhbHVlLFxyXG4gIHNldDogKG5ld1ZhbCkgPT4ge1xyXG4gICAgaWYgKCFuZXdWYWwpIHtcclxuICAgICAgbmV3U3VibW9kZWxQYXJlbnQudmFsdWUgPSAnJ1xyXG4gICAgfVxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGV2aWN0TW9kZWxGaWVsZHMgPSB1c2VFdmljdFByb2plY3RNb2RlbEZpZWxkcygpXHJcbmNvbnN0IGFyZVF1ZXJpZXNMb2FkaW5nID0gdXNlUXVlcnlMb2FkaW5nKClcclxuXHJcbmNvbnN0IGJhc2VRdWVyeVZhcmlhYmxlcyA9IGNvbXB1dGVkKFxyXG4gICgpOiBQcm9qZWN0TW9kZWxzVHJlZVRvcExldmVsUXVlcnlWYXJpYWJsZXMgPT4gKHtcclxuICAgIHByb2plY3RJZDogcHJvcHMucHJvamVjdElkLFxyXG4gICAgZmlsdGVyOiB7XHJcbiAgICAgIHNlYXJjaDogcHJvcHMuc2VhcmNoIHx8IG51bGwsXHJcbiAgICAgIHNvdXJjZUFwcHM6IHByb3BzLnNvdXJjZUFwcHM/Lmxlbmd0aFxyXG4gICAgICAgID8gcHJvcHMuc291cmNlQXBwcy5tYXAoKGEpID0+IGEuc2VhcmNoS2V5KVxyXG4gICAgICAgIDogbnVsbCxcclxuICAgICAgY29udHJpYnV0b3JzOiBwcm9wcy5jb250cmlidXRvcnM/Lmxlbmd0aFxyXG4gICAgICAgID8gcHJvcHMuY29udHJpYnV0b3JzLm1hcCgoYykgPT4gYy5pZClcclxuICAgICAgICA6IG51bGxcclxuICAgIH1cclxuICB9KVxyXG4pXHJcblxyXG5jb25zdCBpbmZpbml0ZUxvYWRlcklkID0gcmVmKCcnKVxyXG5jb25zdCBpc01vZGVsVXBsb2FkaW5nID0gcmVmKGZhbHNlKVxyXG5cclxuLy8gQmFzZSBxdWVyeSAoYWxsIHBlbmRpbmcgdXBsb2FkcyArIGZpcnN0IHBhZ2Ugb2YgbW9kZWxzKVxyXG5jb25zdCB7XHJcbiAgcmVzdWx0OiBiYXNlUmVzdWx0LFxyXG4gIHZhcmlhYmxlczogcmVzdWx0VmFyaWFibGVzLFxyXG4gIG9uUmVzdWx0OiBvbkJhc2VSZXN1bHRcclxufSA9IHVzZVF1ZXJ5KHByb2plY3RNb2RlbHNUcmVlVG9wTGV2ZWxRdWVyeSwgKCkgPT4gYmFzZVF1ZXJ5VmFyaWFibGVzLnZhbHVlKVxyXG5cclxuY29uc3QgaXNGaWx0ZXJpbmcgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgY29uc3QgZmlsdGVyID0gcmVzdWx0VmFyaWFibGVzLnZhbHVlPy5maWx0ZXJcclxuICBpZiAoZmlsdGVyPy5jb250cmlidXRvcnM/Lmxlbmd0aCkgcmV0dXJuIHRydWVcclxuICBpZiAoZmlsdGVyPy5zZWFyY2g/Lmxlbmd0aCkgcmV0dXJuIHRydWVcclxuICBpZiAoZmlsdGVyPy5zb3VyY2VBcHBzPy5sZW5ndGgpIHJldHVybiB0cnVlXHJcbiAgcmV0dXJuIGZhbHNlXHJcbn0pXHJcblxyXG4vLyBQYWdpbmF0aW9uIHF1ZXJ5XHJcbmNvbnN0IHtcclxuICByZXN1bHQ6IGV4dHJhUGFnZXNSZXN1bHQsXHJcbiAgZmV0Y2hNb3JlOiBmZXRjaE1vcmVQYWdlcyxcclxuICBvblJlc3VsdDogb25FeHRyYVBhZ2VzUmVzdWx0XHJcbn0gPSB1c2VRdWVyeShcclxuICBwcm9qZWN0TW9kZWxzVHJlZVRvcExldmVsUGFnaW5hdGlvblF1ZXJ5LFxyXG4gICgpID0+ICh7XHJcbiAgICAuLi5iYXNlUXVlcnlWYXJpYWJsZXMudmFsdWUsXHJcbiAgICBjdXJzb3I6IG51bGwgYXMgTnVsbGFibGU8c3RyaW5nPlxyXG4gIH0pLFxyXG4gICgpID0+ICh7IGVuYWJsZWQ6ICFwcm9wcy5kaXNhYmxlUGFnaW5hdGlvbiB9KVxyXG4pXHJcblxyXG5jb25zdCBwZW5kaW5nTW9kZWxzID0gY29tcHV0ZWQoKCkgPT5cclxuICBpc0ZpbHRlcmluZy52YWx1ZSA/IFtdIDogYmFzZVJlc3VsdC52YWx1ZT8ucHJvamVjdD8ucGVuZGluZ0ltcG9ydGVkTW9kZWxzIHx8IFtdXHJcbilcclxuY29uc3QgbW9kZWxUcmVlSXRlbXMgPSBjb21wdXRlZCgoKSA9PlxyXG4gIGV4dHJhUGFnZXNSZXN1bHQudmFsdWVcclxuICAgID8gZXh0cmFQYWdlc1Jlc3VsdC52YWx1ZT8ucHJvamVjdD8ubW9kZWxzVHJlZS5pdGVtcyB8fCBbXVxyXG4gICAgOiBiYXNlUmVzdWx0LnZhbHVlPy5wcm9qZWN0Py5tb2RlbHNUcmVlLml0ZW1zIHx8IFtdXHJcbilcclxuXHJcbmNvbnN0IHRvcExldmVsSXRlbXMgPSBjb21wdXRlZChcclxuICAoKTogQXJyYXk8U2luZ2xlTGV2ZWxNb2RlbFRyZWVJdGVtRnJhZ21lbnQgfCBQZW5kaW5nRmlsZVVwbG9hZEZyYWdtZW50PiA9PlxyXG4gICAgWy4uLnBlbmRpbmdNb2RlbHMudmFsdWUsIC4uLm1vZGVsVHJlZUl0ZW1zLnZhbHVlXS5zbGljZShcclxuICAgICAgMCxcclxuICAgICAgcHJvcHMuZGlzYWJsZVBhZ2luYXRpb24gPyA4IDogdW5kZWZpbmVkXHJcbiAgICApXHJcbilcclxuXHJcbmNvbnN0IGlzVXNpbmdTZWFyY2ggPSBjb21wdXRlZCgoKSA9PiAhIXJlc3VsdFZhcmlhYmxlcy52YWx1ZT8uZmlsdGVyPy5zZWFyY2gpXHJcbmNvbnN0IG1vcmVUb0xvYWQgPSBjb21wdXRlZChcclxuICAoKSA9PlxyXG4gICAgIWV4dHJhUGFnZXNSZXN1bHQudmFsdWU/LnByb2plY3QgfHxcclxuICAgIGV4dHJhUGFnZXNSZXN1bHQudmFsdWUucHJvamVjdC5tb2RlbHNUcmVlLml0ZW1zLmxlbmd0aCA8XHJcbiAgICAgIGV4dHJhUGFnZXNSZXN1bHQudmFsdWUucHJvamVjdC5tb2RlbHNUcmVlLnRvdGFsQ291bnRcclxuKVxyXG5jb25zdCBzaG93Vmlld0FsbCA9IGNvbXB1dGVkKCgpID0+IG1vcmVUb0xvYWQudmFsdWUgJiYgcHJvcHMuZGlzYWJsZVBhZ2luYXRpb24pXHJcblxyXG5jb25zdCBvbk1vZGVsVXBkYXRlZCA9ICgpID0+IHtcclxuICAvLyBFdmljdCBtb2RlbCBkYXRhXHJcbiAgZXZpY3RNb2RlbEZpZWxkcyhwcm9wcy5wcm9qZWN0SWQpXHJcblxyXG4gIC8vIFJlc2V0IHBhZ2luYXRpb25cclxuICBpbmZpbml0ZUxvYWRDYWNoZUJ1c3Rlci52YWx1ZSsrXHJcbiAgY2FsY3VsYXRlTG9hZGVySWQoKVxyXG59XHJcblxyXG5jb25zdCBvbkNyZWF0ZVN1Ym1vZGVsID0gKHBhcmVudE1vZGVsTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgbmV3U3VibW9kZWxQYXJlbnQudmFsdWUgPSBwYXJlbnRNb2RlbE5hbWVcclxufVxyXG5cclxuY29uc3QgaW5maW5pdGVMb2FkID0gYXN5bmMgKHN0YXRlOiBJbmZpbml0ZUxvYWRlclN0YXRlKSA9PiB7XHJcbiAgY29uc3QgY3Vyc29yID1cclxuICAgIGV4dHJhUGFnZXNSZXN1bHQudmFsdWU/LnByb2plY3Q/Lm1vZGVsc1RyZWUuY3Vyc29yIHx8XHJcbiAgICBiYXNlUmVzdWx0LnZhbHVlPy5wcm9qZWN0Py5tb2RlbHNUcmVlLmN1cnNvciB8fFxyXG4gICAgbnVsbFxyXG4gIGlmICghbW9yZVRvTG9hZC52YWx1ZSB8fCAhY3Vyc29yKSByZXR1cm4gc3RhdGUuY29tcGxldGUoKVxyXG5cclxuICB0cnkge1xyXG4gICAgYXdhaXQgZmV0Y2hNb3JlUGFnZXMoe1xyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBjdXJzb3JcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGNhdGNoIChlKSB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZSlcclxuICAgIHN0YXRlLmVycm9yKClcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgc3RhdGUubG9hZGVkKClcclxuICBpZiAoIW1vcmVUb0xvYWQudmFsdWUpIHtcclxuICAgIHN0YXRlLmNvbXBsZXRlKClcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNhbGN1bGF0ZUxvYWRlcklkID0gKCkgPT4ge1xyXG4gIGNvbnN0IHZhcnMgPSBiYXNlUXVlcnlWYXJpYWJsZXMudmFsdWVcclxuICBjb25zdCBpZCA9IEpTT04uc3RyaW5naWZ5KHZhcnMuZmlsdGVyKSArIGAke2luZmluaXRlTG9hZENhY2hlQnVzdGVyLnZhbHVlfWBcclxuICBpbmZpbml0ZUxvYWRlcklkLnZhbHVlID0gaWRcclxufVxyXG5cclxuY29uc3Qgb25Nb2RlbFVwbG9hZGluZyA9IChwYXlsb2FkOiBGaWxlQXJlYVVwbG9hZGluZ1BheWxvYWQpID0+IHtcclxuICBpc01vZGVsVXBsb2FkaW5nLnZhbHVlID0gcGF5bG9hZC5pc1VwbG9hZGluZ1xyXG59XHJcblxyXG53YXRjaChhcmVRdWVyaWVzTG9hZGluZywgKG5ld1ZhbCkgPT4ge1xyXG4gIGVtaXQoJ3VwZGF0ZTpsb2FkaW5nJywgbmV3VmFsKVxyXG59KVxyXG5cclxub25CYXNlUmVzdWx0KGNhbGN1bGF0ZUxvYWRlcklkKVxyXG5vbkV4dHJhUGFnZXNSZXN1bHQoY2FsY3VsYXRlTG9hZGVySWQpXHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL0xpc3RWaWV3LnZ1ZSJ9