import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/project/page/models/UploadsDialog.vue");import { CommonBadge 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/common/CopyButton.vue"; import { FormButton as __nuxt_component_2 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { InfiniteLoading as __nuxt_component_3 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutTable as __nuxt_component_4 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; import { LayoutDialog as __nuxt_component_5 } from "/_nuxt/@fs/D:/speckle-server/packages/ui-components/dist/lib.js"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementVNode as __createElementVNode,createElementBlock as __createElementBlock,createBlock as __createBlock,createVNode as __createVNode } 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 _createElementBlock(...args) { return _interopVNode(__createElementBlock(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } function _createVNode(...args) { return _interopVNode(__createVNode(...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 { ArrowDownTrayIcon, ArrowRightIcon } from "/_nuxt/node_modules/.cache/vite/client/deps/@heroicons_vue_24_outline.js?v=e4f18c29"; import { FileUploadConvertedStatus, fileUploadConvertedStatusLabels } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/blobs/index.js"; import { resourceBuilder } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/viewer/helpers/route.js"; import { usePaginatedQuery } from "/_nuxt/lib/common/composables/graphql.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { viewerRoute } from "/_nuxt/lib/common/helpers/route.ts"; import { useFailedFileImportJobUtils } from "/_nuxt/lib/core/composables/fileImport.ts"; import { useFileDownload } from "/_nuxt/lib/core/composables/fileUpload.ts"; import { prettyFileSize } from "/_nuxt/lib/core/helpers/file.ts"; import { useClipboard } from "/_nuxt/composables/browser.ts"; import { useDateFormatters } from "/_nuxt/composables/dates.ts"; import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ProjectPageModelsUploadsDialog", props: /* @__PURE__ */ _mergeModels({ projectId: { type: String, required: true }, modelId: { type: String, required: true } }, { "open": { type: Boolean, ...{ required: true } }, "openModifiers": {} }), emits: ["update:open"], setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ProjectPageModelsUploadsDialog_FileUpload on FileUpload { id convertedStatus convertedMessage fileName fileSize convertedLastUpdate convertedVersionId uploadDate uploadComplete branchName ...UseFailedFileImportJobUtils_FileUpload } `); const getModelUploadsQuery = graphql(` query GetModelUploads( $projectId: String! $modelId: String! $input: GetModelUploadsInput! ) { project(id: $projectId) { id model(id: $modelId) { id uploads(input: $input) { totalCount cursor items { id ...ProjectPageModelsUploadsDialog_FileUpload } } } } } `); const props = __props; const open = _useModel(__props, "open"); const { copy } = useClipboard(); const { formattedRelativeDate, formattedFullDate } = useDateFormatters(); const { getErrorMessage, convertUploadToFailedJob } = useFailedFileImportJobUtils(); const { identifier, onInfiniteLoad, query: { result }, isVeryFirstLoading } = usePaginatedQuery({ query: getModelUploadsQuery, baseVariables: computed(() => ({ projectId: props.projectId, modelId: props.modelId, input: { cursor: null } })), options: { enabled: open, // reload query when dialog opens fetchPolicy: "cache-and-network" }, resolveKey: (vars) => [vars.projectId, vars.modelId], resolveCurrentResult: (res) => res?.project.model.uploads, resolveNextPageVariables: (baseVars, cursor) => ({ ...baseVars, input: { ...baseVars.input, cursor } }), resolveCursorFromVariables: (vars) => vars.input.cursor }); const { download } = useFileDownload(); const items = computed(() => result.value?.project.model.uploads.items); const buttons = computed(() => [ { text: "Close", onClick: () => { open.value = false; } } ]); const getStatusOptions = (item) => { let colorClasses = void 0; switch (item.convertedStatus) { case FileUploadConvertedStatus.Error: colorClasses = "bg-danger text-foundation"; break; case FileUploadConvertedStatus.Converting: colorClasses = "bg-primary text-foundation"; break; case FileUploadConvertedStatus.Completed: colorClasses = "bg-success text-foundation"; break; case FileUploadConvertedStatus.Queued: colorClasses = "bg-info text-foundation"; break; } return { label: fileUploadConvertedStatusLabels[item.convertedStatus], tooltip: item.convertedStatus === FileUploadConvertedStatus.Error ? { content: getErrorMessage(convertUploadToFailedJob(item)) + ` Error: ${item.convertedMessage}` } : void 0, colorClasses, isErrorStatus: item.convertedStatus === FileUploadConvertedStatus.Error }; }; const onDownload = async (item) => { await download({ blobId: item.id, fileName: item.fileName, projectId: props.projectId }); }; const buildUploadedVersionUrl = (item) => { if (!item.convertedVersionId || !item.modelId) return void 0; return viewerRoute( props.projectId, resourceBuilder().addModel(item.modelId, item.convertedVersionId).toString() ); }; const onErrorBadgeClick = async (item) => { if (getStatusOptions(item).isErrorStatus) { await copy(getStatusOptions(item).tooltip?.content || "", { successMessage: "Error message copied" }); } }; const __returned__ = { getModelUploadsQuery, props, open, copy, formattedRelativeDate, formattedFullDate, getErrorMessage, convertUploadToFailedJob, identifier, onInfiniteLoad, result, isVeryFirstLoading, download, items, buttons, getStatusOptions, onDownload, buildUploadedVersionUrl, onErrorBadgeClick, get ArrowDownTrayIcon() { return ArrowDownTrayIcon; }, get ArrowRightIcon() { return ArrowRightIcon; }, get prettyFileSize() { return prettyFileSize; } }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveDirective as _resolveDirective, openBlock as _openBlock, withDirectives as _withDirectives, resolveComponent as _resolveComponent, withCtx as _withCtx, createCommentVNode as _createCommentVNode, normalizeClass as _normalizeClass, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "text-foreground-2", "data-v-inspector": "components/project/page/models/UploadsDialog.vue:24:9" }; const _hoisted_2 = { class: "truncate text-foreground", "data-v-inspector": "components/project/page/models/UploadsDialog.vue:27:9" }; const _hoisted_3 = { class: "text-foreground-2", "data-v-inspector": "components/project/page/models/UploadsDialog.vue:39:9" }; const _hoisted_4 = ["onClick"]; const _hoisted_5 = { class: "text-foreground-2", "data-v-inspector": "components/project/page/models/UploadsDialog.vue:63:9" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_CommonBadge = __nuxt_component_0; const _component_CommonCopyButton = __nuxt_component_1; const _component_FormButton = __nuxt_component_2; const _component_InfiniteLoading = __nuxt_component_3; const _component_LayoutTable = __nuxt_component_4; const _component_LayoutDialog = __nuxt_component_5; const _directive_tippy = _resolveDirective("tippy"); const _directive_keyboard_clickable = _resolveDirective("keyboard-clickable"); return _openBlock(), _createBlock(_component_LayoutDialog, { open: $setup.open, "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.open = $event), title: "Model upload history", buttons: $setup.buttons, "data-v-inspector": "components/project/page/models/UploadsDialog.vue:4:3" }, { default: _withCtx(() => [ _createVNode(_component_LayoutTable, { columns: [ { id: "job", header: "Job #", classes: "col-span-1" }, { id: "file", header: "File", classes: "col-span-4" }, { id: "status", header: "Status", classes: "col-span-2" }, { id: "size", header: "Size", classes: "col-span-2" }, { id: "date", header: "Date", classes: "col-span-2" }, { id: "actions", header: "", classes: "col-span-1 flex items-center justify-end gap-0.5" } ], items: $setup.items, loading: $setup.isVeryFirstLoading, "empty-message": "This model has no uploads", style: { "max-height": "300px" }, "data-v-inspector": "components/project/page/models/UploadsDialog.vue:5:5" }, { job: _withCtx(({ item }) => [ _createElementVNode( "span", _hoisted_1, _toDisplayString(item.id), 1 /* TEXT */ ) ]), file: _withCtx(({ item }) => [ _withDirectives((_openBlock(), _createElementBlock("div", _hoisted_2, [ _createTextVNode( _toDisplayString(item.fileName), 1 /* TEXT */ ) ])), [ [_directive_tippy, { content: item.fileName.length > 35 ? item.fileName : void 0, placement: "top-start", delay: 300 }] ]) ]), size: _withCtx(({ item }) => [ _createElementVNode( "span", _hoisted_3, _toDisplayString($setup.prettyFileSize(item.fileSize)), 1 /* TEXT */ ) ]), status: _withCtx(({ item }) => [ _withDirectives((_openBlock(), _createElementBlock("div", { class: _normalizeClass([ "flex items-center gap-2", $setup.getStatusOptions(item).isErrorStatus ? "group hover:cursor-pointer" : "" ]), onClick: ($event) => $setup.onErrorBadgeClick(item), "data-v-inspector": "components/project/page/models/UploadsDialog.vue:42:9" }, [ _withDirectives((_openBlock(), _createBlock(_component_CommonBadge, { "color-classes": $setup.getStatusOptions(item).colorClasses, "data-v-inspector": "components/project/page/models/UploadsDialog.vue:50:11" }, { default: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.getStatusOptions(item).label), 1 /* TEXT */ ) ]), _: 2 /* DYNAMIC */ }, 1032, ["color-classes"])), [ [_directive_tippy, $setup.getStatusOptions(item).tooltip] ]), $setup.getStatusOptions(item).isErrorStatus ? (_openBlock(), _createBlock(_component_CommonCopyButton, { key: 0, class: "group-hover:text-foreground", "data-v-inspector": "components/project/page/models/UploadsDialog.vue:56:11" })) : _createCommentVNode("v-if", true) ], 10, _hoisted_4)), [ [_directive_keyboard_clickable] ]) ]), date: _withCtx(({ item }) => [ _withDirectives((_openBlock(), _createElementBlock("span", _hoisted_5, [ _createTextVNode( _toDisplayString($setup.formattedRelativeDate(item.convertedLastUpdate || item.uploadDate)), 1 /* TEXT */ ) ])), [ [_directive_tippy, $setup.formattedFullDate(item.convertedLastUpdate || item.uploadDate)] ]) ]), actions: _withCtx(({ item }) => [ item.convertedVersionId && item.modelId ? (_openBlock(), _createBlock(_component_FormButton, { key: 0, "icon-left": $setup.ArrowRightIcon, "hide-text": "", size: "sm", color: "outline", class: "shrink-0", to: $setup.buildUploadedVersionUrl(item), "data-v-inspector": "components/project/page/models/UploadsDialog.vue:71:9" }, null, 8, ["icon-left", "to"])) : _createCommentVNode("v-if", true), _createVNode(_component_FormButton, { "icon-left": $setup.ArrowDownTrayIcon, "hide-text": "", size: "sm", color: "outline", class: "shrink-0", onClick: ($event) => $setup.onDownload(item), "data-v-inspector": "components/project/page/models/UploadsDialog.vue:80:9" }, null, 8, ["icon-left", "onClick"]) ]), loader: _withCtx(() => [ $setup.items?.length ? (_openBlock(), _createBlock(_component_InfiniteLoading, { key: 0, settings: { identifier: $setup.identifier }, "hide-when-complete": "", onInfinite: $setup.onInfiniteLoad, "data-v-inspector": "components/project/page/models/UploadsDialog.vue:90:9" }, null, 8, ["settings", "onInfinite"])) : _createCommentVNode("v-if", true) ]), _: 1 /* STABLE */ }, 8, ["items", "loading"]) ]), _: 1 /* STABLE */ }, 8, ["open", "buttons"]); } _sfc_main.__hmrId = "b371045e"; 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/UploadsDialog.vue"]]); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9HQSxTQUFTLG1CQUFtQixzQkFBc0I7QUFDbEQ7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHVCQUF1QjtBQUVoQyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGVBQWU7QUFFeEIsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9CLFlBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBY1A7QUFFRCxVQUFNLHVCQUF1QixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLENBcUJwQztBQUVELFVBQU0sUUFBUTtBQUtkLFVBQU0sT0FBTyxVQUFvQixTQUFDLE1BQTBCO0FBQzVELFVBQU0sRUFBRSxLQUFLLElBQUksYUFBYTtBQUM5QixVQUFNLEVBQUUsdUJBQXVCLGtCQUFrQixJQUFJLGtCQUFrQjtBQUV2RSxVQUFNLEVBQUUsaUJBQWlCLHlCQUF5QixJQUFJLDRCQUE0QjtBQUNsRixVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBLE9BQU8sRUFBRSxPQUFPO0FBQUEsTUFDaEI7QUFBQSxJQUNGLElBQUksa0JBQWtCO0FBQUEsTUFDcEIsT0FBTztBQUFBLE1BQ1AsZUFBZSxTQUFTLE9BQU87QUFBQSxRQUM3QixXQUFXLE1BQU07QUFBQSxRQUNqQixTQUFTLE1BQU07QUFBQSxRQUNmLE9BQU87QUFBQSxVQUNMLFFBQVE7QUFBQSxRQUNWO0FBQUEsTUFDRixFQUFFO0FBQUEsTUFDRixTQUFTO0FBQUEsUUFDUCxTQUFTO0FBQUE7QUFBQSxRQUVULGFBQWE7QUFBQSxNQUNmO0FBQUEsTUFDQSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssV0FBVyxLQUFLLE9BQU87QUFBQSxNQUNuRCxzQkFBc0IsQ0FBQyxRQUFRLEtBQUssUUFBUSxNQUFNO0FBQUEsTUFDbEQsMEJBQTBCLENBQUMsVUFBVSxZQUFZO0FBQUEsUUFDL0MsR0FBRztBQUFBLFFBQ0gsT0FBTztBQUFBLFVBQ0wsR0FBRyxTQUFTO0FBQUEsVUFDWjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFDQSw0QkFBNEIsQ0FBQyxTQUFTLEtBQUssTUFBTTtBQUFBLElBQ25ELENBQUM7QUFFRCxVQUFNLEVBQUUsU0FBUyxJQUFJLGdCQUFnQjtBQUVyQyxVQUFNLFFBQVEsU0FBUyxNQUFNLE9BQU8sT0FBTyxRQUFRLE1BQU0sUUFBUSxLQUFLO0FBRXRFLFVBQU0sVUFBVSxTQUFTLE1BQTRCO0FBQUEsTUFDbkQ7QUFBQSxRQUNFLE1BQU07QUFBQSxRQUNOLFNBQVMsTUFBTTtBQUNiLGVBQUssUUFBUTtBQUFBLFFBQ2Y7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBRUQsVUFBTSxtQkFBbUIsQ0FBQyxTQUE0RDtBQUNwRixVQUFJLGVBQW1DO0FBQ3ZDLGNBQVEsS0FBSyxpQkFBaUI7QUFBQSxRQUM1QixLQUFLLDBCQUEwQjtBQUM3Qix5QkFBZTtBQUNmO0FBQUEsUUFDRixLQUFLLDBCQUEwQjtBQUM3Qix5QkFBZTtBQUNmO0FBQUEsUUFDRixLQUFLLDBCQUEwQjtBQUM3Qix5QkFBZTtBQUNmO0FBQUEsUUFDRixLQUFLLDBCQUEwQjtBQUM3Qix5QkFBZTtBQUNmO0FBQUEsTUFDSjtBQUVBLGFBQU87QUFBQSxRQUNMLE9BQ0UsZ0NBQ0UsS0FBSyxlQUNQO0FBQUEsUUFDRixTQUNFLEtBQUssb0JBQW9CLDBCQUEwQixRQUMvQztBQUFBLFVBQ0UsU0FDRSxnQkFBZ0IseUJBQXlCLElBQUksQ0FBQyxJQUM5QyxXQUFXLEtBQUssZ0JBQWdCO0FBQUEsUUFDcEMsSUFDQTtBQUFBLFFBQ047QUFBQSxRQUNBLGVBQWUsS0FBSyxvQkFBb0IsMEJBQTBCO0FBQUEsTUFDcEU7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhLE9BQU8sU0FBNEQ7QUFDcEYsWUFBTSxTQUFTO0FBQUEsUUFDYixRQUFRLEtBQUs7QUFBQSxRQUNiLFVBQVUsS0FBSztBQUFBLFFBQ2YsV0FBVyxNQUFNO0FBQUEsTUFDbkIsQ0FBQztBQUFBLElBQ0g7QUFFQSxVQUFNLDBCQUEwQixDQUM5QixTQUNHO0FBQ0gsVUFBSSxDQUFDLEtBQUssc0JBQXNCLENBQUMsS0FBSyxRQUFTLFFBQU87QUFDdEQsYUFBTztBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sZ0JBQWdCLEVBQUUsU0FBUyxLQUFLLFNBQVMsS0FBSyxrQkFBa0IsRUFBRSxTQUFTO0FBQUEsTUFDN0U7QUFBQSxJQUNGO0FBRUEsVUFBTSxvQkFBb0IsT0FDeEIsU0FDRztBQUNILFVBQUksaUJBQWlCLElBQUksRUFBRSxlQUFlO0FBQ3hDLGNBQU0sS0FBSyxpQkFBaUIsSUFBSSxFQUFFLFNBQVMsV0FBVyxJQUFJO0FBQUEsVUFDeEQsZ0JBQWdCO0FBQUEsUUFDbEIsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGOzs7Ozs7Ozs7Ozs7OztFQXRQYyxPQUFNO0FBQUEsRUFBb0Isb0JBQWlCOzs7RUFTL0MsT0FBTTtBQUFBLEVBQTJCLG9CQUFpQjs7O0VBTTlDLE9BQU07QUFBQSxFQUFvQixvQkFBaUI7Ozs7RUEwQi9DLE9BQU07QUFBQSxFQUFvQixvQkFBaUI7Ozs7Ozs7Ozs7O3VCQTdEbkQsYUE4RmU7QUFBQSxJQTlGTyxNQUFNO0FBQUEseUVBQUk7QUFBQSxJQUFFLE9BQU07QUFBQSxJQUF3QixTQUFTO0FBQUEsSUFBUyxvQkFBaUI7QUFBQTtzQkFDakcsTUE0RmM7QUFBQSxNQTVGZCxhQTRGYztBQUFBLFFBM0ZYLFNBQVM7QUFBQTs7Ozs7Ozs7Ozs7UUFZVCxPQUFPO0FBQUEsUUFDUCxTQUFTO0FBQUEsUUFDVixpQkFBYztBQUFBLFFBQ2Q7QUFBQSxRQUEwQixvQkFBaUI7QUFBQTtRQUVoQyxLQUFHLFNBQ1osQ0FBNkgsRUFEN0csS0FBSTtBQUFBLFVBQ3BCO0FBQUEsWUFBNkg7QUFBQSxZQUE3SDtBQUFBLFlBQTZILGlCQUFqQixLQUFLLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtRQUUxRyxNQUFJLFNBQ2IsQ0FTTSxFQVZXLEtBQUk7QUFBQSx5Q0FDckIsb0JBU00sT0FUTixZQVNNO0FBQUE7K0JBREQsS0FBSyxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7O3VCQVBpQixLQUFLLFNBQVMsU0FBTSxLQUFRLEtBQUssV0FBVztBQUFBOzs7OztRQVV0RSxNQUFJLFNBQ2IsQ0FBbUosRUFEbEksS0FBSTtBQUFBLFVBQ3JCO0FBQUEsWUFBbUo7QUFBQSxZQUFuSjtBQUFBLFlBQW1KLGlCQUF2QyxzQkFBZSxLQUFLLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtRQUUvSCxRQUFNLFNBQ2YsQ0FrQk0sRUFuQmEsS0FBSTtBQUFBLHlDQUN2QixvQkFrQk07QUFBQSxZQWhCSCxPQUFLO0FBQUE7Y0FBeUQsd0JBQWlCLElBQUksRUFBRSxnQkFBYTtBQUFBO1lBSWxHLFNBQUssWUFBRSx5QkFBa0IsSUFBSTtBQUFBLFlBQUcsb0JBQWlCO0FBQUE7MkNBRWxELGFBS2M7QUFBQSxjQUhYLGlCQUFlLHdCQUFpQixJQUFJLEVBQUU7QUFBQSxjQUFjLG9CQUFpQjtBQUFBO2dDQUV0RSxNQUFrQztBQUFBO21DQUEvQix3QkFBaUIsSUFBSSxFQUFFLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTs7OztpQ0FIdEIsd0JBQWlCLElBQUksRUFBRSxPQUFPO0FBQUE7WUFNakMsd0JBQWlCLElBQUksRUFBRSwrQkFEL0IsYUFHRTtBQUFBO2NBREEsT0FBTTtBQUFBLGNBQThCLG9CQUFpQjtBQUFBOzs7OztRQUloRCxNQUFJLFNBQ2IsQ0FLTyxFQU5VLEtBQUk7QUFBQSx5Q0FDckIsb0JBS08sUUFMUCxZQUtPO0FBQUE7K0JBREYsNkJBQXNCLEtBQUssdUJBQXVCLEtBQUssVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBOytCQUgzRCx5QkFBa0IsS0FBSyx1QkFBdUIsS0FBSyxVQUFVO0FBQUE7O1FBTS9ELFNBQU8sU0F3QmIsQ0FZSSxFQXBDYSxLQUFJO0FBQUEsVUFFaEIsS0FBSyxzQkFBc0IsS0FBSyx5QkFEeEMsYUFRRTtBQUFBO1lBTkMsYUFBVztBQUFBLFlBQ1o7QUFBQSxZQUNBLE1BQUs7QUFBQSxZQUNMLE9BQU07QUFBQSxZQUNOLE9BQU07QUFBQSxZQUNMLElBQUksK0JBQXdCLElBQUk7QUFBQSxZQUFHLG9CQUFpQjtBQUFBO1VBRXZELGFBT0U7QUFBQSxZQU5DLGFBQVc7QUFBQSxZQUNaO0FBQUEsWUFDQSxNQUFLO0FBQUEsWUFDTCxPQUFNO0FBQUEsWUFDTixPQUFNO0FBQUEsWUFDTCxTQUFLLFlBQUUsa0JBQVcsSUFBSTtBQUFBLFlBQUcsb0JBQWlCO0FBQUE7O1FBR3BDLFFBQU0sU0FxQjJFLE1BSTlFO0FBQUEsVUF2QkosY0FBTyx3QkFEZixhQUtFO0FBQUE7WUFIQyxVQUFRLGNBQUksa0JBQVU7QUFBQSxZQUN2QjtBQUFBLFlBQ0MsWUFBVTtBQUFBLFlBQWdCLG9CQUFpQjtBQUFBIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJVcGxvYWRzRGlhbG9nLnZ1ZSJdLCJzb3VyY2VzQ29udGVudCI6WyI8IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zIC0tPlxyXG48IS0tIGVzbGludC1kaXNhYmxlIHZ1ZWpzLWFjY2Vzc2liaWxpdHkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAtLT5cclxuPHRlbXBsYXRlPlxyXG4gIDxMYXlvdXREaWFsb2cgdi1tb2RlbDpvcGVuPVwib3BlblwiIHRpdGxlPVwiTW9kZWwgdXBsb2FkIGhpc3RvcnlcIiA6YnV0dG9ucz1cImJ1dHRvbnNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjQ6M1wiPlxyXG4gICAgPExheW91dFRhYmxlXHJcbiAgICAgIDpjb2x1bW5zPVwiW1xyXG4gICAgICAgIHsgaWQ6ICdqb2InLCBoZWFkZXI6ICdKb2IgIycsIGNsYXNzZXM6ICdjb2wtc3Bhbi0xJyB9LFxyXG4gICAgICAgIHsgaWQ6ICdmaWxlJywgaGVhZGVyOiAnRmlsZScsIGNsYXNzZXM6ICdjb2wtc3Bhbi00JyB9LFxyXG4gICAgICAgIHsgaWQ6ICdzdGF0dXMnLCBoZWFkZXI6ICdTdGF0dXMnLCBjbGFzc2VzOiAnY29sLXNwYW4tMicgfSxcclxuICAgICAgICB7IGlkOiAnc2l6ZScsIGhlYWRlcjogJ1NpemUnLCBjbGFzc2VzOiAnY29sLXNwYW4tMicgfSxcclxuICAgICAgICB7IGlkOiAnZGF0ZScsIGhlYWRlcjogJ0RhdGUnLCBjbGFzc2VzOiAnY29sLXNwYW4tMicgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBpZDogJ2FjdGlvbnMnLFxyXG4gICAgICAgICAgaGVhZGVyOiAnJyxcclxuICAgICAgICAgIGNsYXNzZXM6ICdjb2wtc3Bhbi0xIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0wLjUnXHJcbiAgICAgICAgfVxyXG4gICAgICBdXCJcclxuICAgICAgOml0ZW1zPVwiaXRlbXNcIlxyXG4gICAgICA6bG9hZGluZz1cImlzVmVyeUZpcnN0TG9hZGluZ1wiXHJcbiAgICAgIGVtcHR5LW1lc3NhZ2U9XCJUaGlzIG1vZGVsIGhhcyBubyB1cGxvYWRzXCJcclxuICAgICAgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMDBweFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvVXBsb2Fkc0RpYWxvZy52dWU6NTo1XCJcclxuICAgID5cclxuICAgICAgPHRlbXBsYXRlICNqb2I9XCJ7IGl0ZW0gfVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjI0OjlcIj57eyBpdGVtLmlkIH19PC9zcGFuPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI2ZpbGU9XCJ7IGl0ZW0gfVwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIHYtdGlwcHk9XCJ7XHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0uZmlsZU5hbWUubGVuZ3RoID4gMzUgPyBpdGVtLmZpbGVOYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBwbGFjZW1lbnQ6ICd0b3Atc3RhcnQnLFxyXG4gICAgICAgICAgICBkZWxheTogMzAwXHJcbiAgICAgICAgICB9XCJcclxuICAgICAgICAgIGNsYXNzPVwidHJ1bmNhdGUgdGV4dC1mb3JlZ3JvdW5kXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZToyNzo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBpdGVtLmZpbGVOYW1lIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvdGVtcGxhdGU+XHJcbiAgICAgIDx0ZW1wbGF0ZSAjc2l6ZT1cInsgaXRlbSB9XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWZvcmVncm91bmQtMlwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvVXBsb2Fkc0RpYWxvZy52dWU6Mzk6OVwiPnt7IHByZXR0eUZpbGVTaXplKGl0ZW0uZmlsZVNpemUpIH19PC9zcGFuPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI3N0YXR1cz1cInsgaXRlbSB9XCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgdi1rZXlib2FyZC1jbGlja2FibGVcclxuICAgICAgICAgIDpjbGFzcz1cIltcclxuICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yJyxcclxuICAgICAgICAgICAgZ2V0U3RhdHVzT3B0aW9ucyhpdGVtKS5pc0Vycm9yU3RhdHVzID8gJ2dyb3VwIGhvdmVyOmN1cnNvci1wb2ludGVyJyA6ICcnXHJcbiAgICAgICAgICBdXCJcclxuICAgICAgICAgIEBjbGljaz1cIm9uRXJyb3JCYWRnZUNsaWNrKGl0ZW0pXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZTo0Mjo5XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8Q29tbW9uQmFkZ2VcclxuICAgICAgICAgICAgdi10aXBweT1cImdldFN0YXR1c09wdGlvbnMoaXRlbSkudG9vbHRpcFwiXHJcbiAgICAgICAgICAgIDpjb2xvci1jbGFzc2VzPVwiZ2V0U3RhdHVzT3B0aW9ucyhpdGVtKS5jb2xvckNsYXNzZXNcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjUwOjExXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgZ2V0U3RhdHVzT3B0aW9ucyhpdGVtKS5sYWJlbCB9fVxyXG4gICAgICAgICAgPC9Db21tb25CYWRnZT5cclxuICAgICAgICAgIDxDb21tb25Db3B5QnV0dG9uXHJcbiAgICAgICAgICAgIHYtaWY9XCJnZXRTdGF0dXNPcHRpb25zKGl0ZW0pLmlzRXJyb3JTdGF0dXNcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImdyb3VwLWhvdmVyOnRleHQtZm9yZWdyb3VuZFwiIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3Byb2plY3QvcGFnZS9tb2RlbHMvVXBsb2Fkc0RpYWxvZy52dWU6NTY6MTFcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPHRlbXBsYXRlICNkYXRlPVwieyBpdGVtIH1cIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgdi10aXBweT1cImZvcm1hdHRlZEZ1bGxEYXRlKGl0ZW0uY29udmVydGVkTGFzdFVwZGF0ZSB8fCBpdGVtLnVwbG9hZERhdGUpXCJcclxuICAgICAgICAgIGNsYXNzPVwidGV4dC1mb3JlZ3JvdW5kLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjYzOjlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGZvcm1hdHRlZFJlbGF0aXZlRGF0ZShpdGVtLmNvbnZlcnRlZExhc3RVcGRhdGUgfHwgaXRlbS51cGxvYWREYXRlKSB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC90ZW1wbGF0ZT5cclxuICAgICAgPHRlbXBsYXRlICNhY3Rpb25zPVwieyBpdGVtIH1cIj5cclxuICAgICAgICA8Rm9ybUJ1dHRvblxyXG4gICAgICAgICAgdi1pZj1cIml0ZW0uY29udmVydGVkVmVyc2lvbklkICYmIGl0ZW0ubW9kZWxJZFwiXHJcbiAgICAgICAgICA6aWNvbi1sZWZ0PVwiQXJyb3dSaWdodEljb25cIlxyXG4gICAgICAgICAgaGlkZS10ZXh0XHJcbiAgICAgICAgICBzaXplPVwic21cIlxyXG4gICAgICAgICAgY29sb3I9XCJvdXRsaW5lXCJcclxuICAgICAgICAgIGNsYXNzPVwic2hyaW5rLTBcIlxyXG4gICAgICAgICAgOnRvPVwiYnVpbGRVcGxvYWRlZFZlcnNpb25VcmwoaXRlbSlcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlOjcxOjlcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgPEZvcm1CdXR0b25cclxuICAgICAgICAgIDppY29uLWxlZnQ9XCJBcnJvd0Rvd25UcmF5SWNvblwiXHJcbiAgICAgICAgICBoaWRlLXRleHRcclxuICAgICAgICAgIHNpemU9XCJzbVwiXHJcbiAgICAgICAgICBjb2xvcj1cIm91dGxpbmVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzaHJpbmstMFwiXHJcbiAgICAgICAgICBAY2xpY2s9XCJvbkRvd25sb2FkKGl0ZW0pXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZTo4MDo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgICA8dGVtcGxhdGUgI2xvYWRlcj5cclxuICAgICAgICA8SW5maW5pdGVMb2FkaW5nXHJcbiAgICAgICAgICB2LWlmPVwiaXRlbXM/Lmxlbmd0aFwiXHJcbiAgICAgICAgICA6c2V0dGluZ3M9XCJ7IGlkZW50aWZpZXIgfVwiXHJcbiAgICAgICAgICBoaWRlLXdoZW4tY29tcGxldGVcclxuICAgICAgICAgIEBpbmZpbml0ZT1cIm9uSW5maW5pdGVMb2FkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvcHJvamVjdC9wYWdlL21vZGVscy9VcGxvYWRzRGlhbG9nLnZ1ZTo5MDo5XCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3RlbXBsYXRlPlxyXG4gICAgPC9MYXlvdXRUYWJsZT5cclxuICA8L0xheW91dERpYWxvZz5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgQXJyb3dEb3duVHJheUljb24sIEFycm93UmlnaHRJY29uIH0gZnJvbSAnQGhlcm9pY29ucy92dWUvMjQvb3V0bGluZSdcclxuaW1wb3J0IHtcclxuICBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzLFxyXG4gIGZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXNMYWJlbHNcclxufSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvYmxvYnMnXHJcbmltcG9ydCB7IHJlc291cmNlQnVpbGRlciB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZC92aWV3ZXIvcm91dGUnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0RGlhbG9nQnV0dG9uIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgdXNlUGFnaW5hdGVkUXVlcnkgfSBmcm9tICd+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvZ3JhcGhxbCdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQgdHlwZSB7IFByb2plY3RQYWdlTW9kZWxzVXBsb2Fkc0RpYWxvZ19GaWxlVXBsb2FkRnJhZ21lbnQgfSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZSB9IGZyb20gJ34vbGliL2NvbW1vbi9oZWxwZXJzL3JvdXRlJ1xyXG5pbXBvcnQgeyB1c2VGYWlsZWRGaWxlSW1wb3J0Sm9iVXRpbHMgfSBmcm9tICd+L2xpYi9jb3JlL2NvbXBvc2FibGVzL2ZpbGVJbXBvcnQnXHJcbmltcG9ydCB7IHVzZUZpbGVEb3dubG9hZCB9IGZyb20gJ34vbGliL2NvcmUvY29tcG9zYWJsZXMvZmlsZVVwbG9hZCdcclxuaW1wb3J0IHsgcHJldHR5RmlsZVNpemUgfSBmcm9tICd+fi9saWIvY29yZS9oZWxwZXJzL2ZpbGUnXHJcblxyXG5ncmFwaHFsKGBcclxuICBmcmFnbWVudCBQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dfRmlsZVVwbG9hZCBvbiBGaWxlVXBsb2FkIHtcclxuICAgIGlkXHJcbiAgICBjb252ZXJ0ZWRTdGF0dXNcclxuICAgIGNvbnZlcnRlZE1lc3NhZ2VcclxuICAgIGZpbGVOYW1lXHJcbiAgICBmaWxlU2l6ZVxyXG4gICAgY29udmVydGVkTGFzdFVwZGF0ZVxyXG4gICAgY29udmVydGVkVmVyc2lvbklkXHJcbiAgICB1cGxvYWREYXRlXHJcbiAgICB1cGxvYWRDb21wbGV0ZVxyXG4gICAgYnJhbmNoTmFtZVxyXG4gICAgLi4uVXNlRmFpbGVkRmlsZUltcG9ydEpvYlV0aWxzX0ZpbGVVcGxvYWRcclxuICB9XHJcbmApXHJcblxyXG5jb25zdCBnZXRNb2RlbFVwbG9hZHNRdWVyeSA9IGdyYXBocWwoYFxyXG4gIHF1ZXJ5IEdldE1vZGVsVXBsb2FkcyhcclxuICAgICRwcm9qZWN0SWQ6IFN0cmluZyFcclxuICAgICRtb2RlbElkOiBTdHJpbmchXHJcbiAgICAkaW5wdXQ6IEdldE1vZGVsVXBsb2Fkc0lucHV0IVxyXG4gICkge1xyXG4gICAgcHJvamVjdChpZDogJHByb2plY3RJZCkge1xyXG4gICAgICBpZFxyXG4gICAgICBtb2RlbChpZDogJG1vZGVsSWQpIHtcclxuICAgICAgICBpZFxyXG4gICAgICAgIHVwbG9hZHMoaW5wdXQ6ICRpbnB1dCkge1xyXG4gICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgICAgY3Vyc29yXHJcbiAgICAgICAgICBpdGVtcyB7XHJcbiAgICAgICAgICAgIGlkXHJcbiAgICAgICAgICAgIC4uLlByb2plY3RQYWdlTW9kZWxzVXBsb2Fkc0RpYWxvZ19GaWxlVXBsb2FkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gKVxyXG5cclxuY29uc3QgcHJvcHMgPSBkZWZpbmVQcm9wczx7XHJcbiAgcHJvamVjdElkOiBzdHJpbmdcclxuICBtb2RlbElkOiBzdHJpbmdcclxufT4oKVxyXG5cclxuY29uc3Qgb3BlbiA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywgeyByZXF1aXJlZDogdHJ1ZSB9KVxyXG5jb25zdCB7IGNvcHkgfSA9IHVzZUNsaXBib2FyZCgpXHJcbmNvbnN0IHsgZm9ybWF0dGVkUmVsYXRpdmVEYXRlLCBmb3JtYXR0ZWRGdWxsRGF0ZSB9ID0gdXNlRGF0ZUZvcm1hdHRlcnMoKVxyXG5cclxuY29uc3QgeyBnZXRFcnJvck1lc3NhZ2UsIGNvbnZlcnRVcGxvYWRUb0ZhaWxlZEpvYiB9ID0gdXNlRmFpbGVkRmlsZUltcG9ydEpvYlV0aWxzKClcclxuY29uc3Qge1xyXG4gIGlkZW50aWZpZXIsXHJcbiAgb25JbmZpbml0ZUxvYWQsXHJcbiAgcXVlcnk6IHsgcmVzdWx0IH0sXHJcbiAgaXNWZXJ5Rmlyc3RMb2FkaW5nXHJcbn0gPSB1c2VQYWdpbmF0ZWRRdWVyeSh7XHJcbiAgcXVlcnk6IGdldE1vZGVsVXBsb2Fkc1F1ZXJ5LFxyXG4gIGJhc2VWYXJpYWJsZXM6IGNvbXB1dGVkKCgpID0+ICh7XHJcbiAgICBwcm9qZWN0SWQ6IHByb3BzLnByb2plY3RJZCxcclxuICAgIG1vZGVsSWQ6IHByb3BzLm1vZGVsSWQsXHJcbiAgICBpbnB1dDoge1xyXG4gICAgICBjdXJzb3I6IG51bGwgYXMgc3RyaW5nIHwgbnVsbFxyXG4gICAgfVxyXG4gIH0pKSxcclxuICBvcHRpb25zOiB7XHJcbiAgICBlbmFibGVkOiBvcGVuLFxyXG4gICAgLy8gcmVsb2FkIHF1ZXJ5IHdoZW4gZGlhbG9nIG9wZW5zXHJcbiAgICBmZXRjaFBvbGljeTogJ2NhY2hlLWFuZC1uZXR3b3JrJ1xyXG4gIH0sXHJcbiAgcmVzb2x2ZUtleTogKHZhcnMpID0+IFt2YXJzLnByb2plY3RJZCwgdmFycy5tb2RlbElkXSxcclxuICByZXNvbHZlQ3VycmVudFJlc3VsdDogKHJlcykgPT4gcmVzPy5wcm9qZWN0Lm1vZGVsLnVwbG9hZHMsXHJcbiAgcmVzb2x2ZU5leHRQYWdlVmFyaWFibGVzOiAoYmFzZVZhcnMsIGN1cnNvcikgPT4gKHtcclxuICAgIC4uLmJhc2VWYXJzLFxyXG4gICAgaW5wdXQ6IHtcclxuICAgICAgLi4uYmFzZVZhcnMuaW5wdXQsXHJcbiAgICAgIGN1cnNvclxyXG4gICAgfVxyXG4gIH0pLFxyXG4gIHJlc29sdmVDdXJzb3JGcm9tVmFyaWFibGVzOiAodmFycykgPT4gdmFycy5pbnB1dC5jdXJzb3JcclxufSlcclxuXHJcbmNvbnN0IHsgZG93bmxvYWQgfSA9IHVzZUZpbGVEb3dubG9hZCgpXHJcblxyXG5jb25zdCBpdGVtcyA9IGNvbXB1dGVkKCgpID0+IHJlc3VsdC52YWx1ZT8ucHJvamVjdC5tb2RlbC51cGxvYWRzLml0ZW1zKVxyXG5cclxuY29uc3QgYnV0dG9ucyA9IGNvbXB1dGVkKCgpOiBMYXlvdXREaWFsb2dCdXR0b25bXSA9PiBbXHJcbiAge1xyXG4gICAgdGV4dDogJ0Nsb3NlJyxcclxuICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgb3Blbi52YWx1ZSA9IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5dKVxyXG5cclxuY29uc3QgZ2V0U3RhdHVzT3B0aW9ucyA9IChpdGVtOiBQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dfRmlsZVVwbG9hZEZyYWdtZW50KSA9PiB7XHJcbiAgbGV0IGNvbG9yQ2xhc3Nlczogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXHJcbiAgc3dpdGNoIChpdGVtLmNvbnZlcnRlZFN0YXR1cykge1xyXG4gICAgY2FzZSBGaWxlVXBsb2FkQ29udmVydGVkU3RhdHVzLkVycm9yOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctZGFuZ2VyIHRleHQtZm91bmRhdGlvbidcclxuICAgICAgYnJlYWtcclxuICAgIGNhc2UgRmlsZVVwbG9hZENvbnZlcnRlZFN0YXR1cy5Db252ZXJ0aW5nOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctcHJpbWFyeSB0ZXh0LWZvdW5kYXRpb24nXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuQ29tcGxldGVkOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctc3VjY2VzcyB0ZXh0LWZvdW5kYXRpb24nXHJcbiAgICAgIGJyZWFrXHJcbiAgICBjYXNlIEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuUXVldWVkOlxyXG4gICAgICBjb2xvckNsYXNzZXMgPSAnYmctaW5mbyB0ZXh0LWZvdW5kYXRpb24nXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgbGFiZWw6XHJcbiAgICAgIGZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXNMYWJlbHNbXHJcbiAgICAgICAgaXRlbS5jb252ZXJ0ZWRTdGF0dXMgYXMgRmlsZVVwbG9hZENvbnZlcnRlZFN0YXR1c1xyXG4gICAgICBdLFxyXG4gICAgdG9vbHRpcDpcclxuICAgICAgaXRlbS5jb252ZXJ0ZWRTdGF0dXMgPT09IEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuRXJyb3JcclxuICAgICAgICA/IHtcclxuICAgICAgICAgICAgY29udGVudDpcclxuICAgICAgICAgICAgICBnZXRFcnJvck1lc3NhZ2UoY29udmVydFVwbG9hZFRvRmFpbGVkSm9iKGl0ZW0pKSArXHJcbiAgICAgICAgICAgICAgYCBFcnJvcjogJHtpdGVtLmNvbnZlcnRlZE1lc3NhZ2V9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgY29sb3JDbGFzc2VzLFxyXG4gICAgaXNFcnJvclN0YXR1czogaXRlbS5jb252ZXJ0ZWRTdGF0dXMgPT09IEZpbGVVcGxvYWRDb252ZXJ0ZWRTdGF0dXMuRXJyb3JcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IG9uRG93bmxvYWQgPSBhc3luYyAoaXRlbTogUHJvamVjdFBhZ2VNb2RlbHNVcGxvYWRzRGlhbG9nX0ZpbGVVcGxvYWRGcmFnbWVudCkgPT4ge1xyXG4gIGF3YWl0IGRvd25sb2FkKHtcclxuICAgIGJsb2JJZDogaXRlbS5pZCxcclxuICAgIGZpbGVOYW1lOiBpdGVtLmZpbGVOYW1lLFxyXG4gICAgcHJvamVjdElkOiBwcm9wcy5wcm9qZWN0SWRcclxuICB9KVxyXG59XHJcblxyXG5jb25zdCBidWlsZFVwbG9hZGVkVmVyc2lvblVybCA9IChcclxuICBpdGVtOiBQcm9qZWN0UGFnZU1vZGVsc1VwbG9hZHNEaWFsb2dfRmlsZVVwbG9hZEZyYWdtZW50XHJcbikgPT4ge1xyXG4gIGlmICghaXRlbS5jb252ZXJ0ZWRWZXJzaW9uSWQgfHwgIWl0ZW0ubW9kZWxJZCkgcmV0dXJuIHVuZGVmaW5lZFxyXG4gIHJldHVybiB2aWV3ZXJSb3V0ZShcclxuICAgIHByb3BzLnByb2plY3RJZCxcclxuICAgIHJlc291cmNlQnVpbGRlcigpLmFkZE1vZGVsKGl0ZW0ubW9kZWxJZCwgaXRlbS5jb252ZXJ0ZWRWZXJzaW9uSWQpLnRvU3RyaW5nKClcclxuICApXHJcbn1cclxuXHJcbmNvbnN0IG9uRXJyb3JCYWRnZUNsaWNrID0gYXN5bmMgKFxyXG4gIGl0ZW06IFByb2plY3RQYWdlTW9kZWxzVXBsb2Fkc0RpYWxvZ19GaWxlVXBsb2FkRnJhZ21lbnRcclxuKSA9PiB7XHJcbiAgaWYgKGdldFN0YXR1c09wdGlvbnMoaXRlbSkuaXNFcnJvclN0YXR1cykge1xyXG4gICAgYXdhaXQgY29weShnZXRTdGF0dXNPcHRpb25zKGl0ZW0pLnRvb2x0aXA/LmNvbnRlbnQgfHwgJycsIHtcclxuICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdFcnJvciBtZXNzYWdlIGNvcGllZCdcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbjwvc2NyaXB0PlxyXG4iXSwiZmlsZSI6IkQ6L3NwZWNrbGUtc2VydmVyL3BhY2thZ2VzL2Zyb250ZW5kLTIvY29tcG9uZW50cy9wcm9qZWN0L3BhZ2UvbW9kZWxzL1VwbG9hZHNEaWFsb2cudnVlIn0=