diff --git a/dist.zip b/dist.zip index d37d1b4..73d278b 100644 Binary files a/dist.zip and b/dist.zip differ diff --git a/package-lock.json b/package-lock.json index 23c977a..c98248d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@vueuse/core": "^10.1.2", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", + "@zhj-target/vue3-kind-editor": "^0.1.3", "async-validator": "^4.2.5", "axios": "^1.4.0", "bwip-js": "^4.3.2", @@ -3896,6 +3897,11 @@ "snabbdom": "^3.1.0" } }, + "node_modules/@zhj-target/vue3-kind-editor": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@zhj-target/vue3-kind-editor/-/vue3-kind-editor-0.1.3.tgz", + "integrity": "sha512-tzSutZUBmGBRFBW8UMu2w5qmFMzp0RbaER8YQnMytq3COc04BHETiQkMOQ2PCHkrUXitzjBOWNSquW/AibizQA==" + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz", @@ -17949,6 +17955,11 @@ "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==", "requires": {} }, + "@zhj-target/vue3-kind-editor": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@zhj-target/vue3-kind-editor/-/vue3-kind-editor-0.1.3.tgz", + "integrity": "sha512-tzSutZUBmGBRFBW8UMu2w5qmFMzp0RbaER8YQnMytq3COc04BHETiQkMOQ2PCHkrUXitzjBOWNSquW/AibizQA==" + }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz", diff --git a/package.json b/package.json index a30a6f9..16a0148 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@vueuse/core": "^10.1.2", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", + "@zhj-target/vue3-kind-editor": "^0.1.3", "async-validator": "^4.2.5", "axios": "^1.4.0", "bwip-js": "^4.3.2", diff --git a/src/components/Editor/index.scss b/src/components/Editor/index.scss index 2a275d7..b6e7b29 100644 --- a/src/components/Editor/index.scss +++ b/src/components/Editor/index.scss @@ -24,7 +24,7 @@ } .ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-item::before { - content: "14px"; + content: "12px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { @@ -78,3 +78,149 @@ .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { content: "等宽字体"; } +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="SimSun"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="SimSun"]::before { + font-family: SimSun, sans-serif; + content: "宋体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="SimHei"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="SimHei"]::before { + font-family: SimHei, sans-serif; + content: "黑体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Microsoft-YaHei"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Microsoft-YaHei"]::before { + font-family: "Microsoft YaHei", sans-serif; + content: "微软雅黑"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="KaiTi"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="KaiTi"]::before { + font-family: KaiTi, sans-serif; + content: "楷体"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="FangSong"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="FangSong"]::before { + font-family: FangSong, sans-serif; + content: "仿宋"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Arial"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Arial"]::before { + font-family: Arial, sans-serif; + content: "Arial"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="Times-New-Roman"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="Times-New-Roman"]::before { + font-family: "Times New Roman", sans-serif; + content: "Times New Roman"; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="sans-serif"]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="sans-serif"]::before { + font-family: sans-serif; + content: "sans-serif"; +} +.ql-font-SimSun { + font-family: SimSun, sans-serif; +} +.ql-font-SimHei { + font-family: SimHei, sans-serif; +} +.ql-font-Microsoft-YaHei { + font-family: "Microsoft YaHei", sans-serif; +} +.ql-font-KaiTi { + font-family: KaiTi, sans-serif; +} +.ql-font-FangSong { + font-family: FangSong, sans-serif; +} +.ql-font-Arial { + font-family: Arial, sans-serif; +} +.ql-font-Times-New-Roman { + font-family: "Times New Roman", sans-serif; +} +.ql-font-sans-serif { + font-family: sans-serif; +} + +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="10px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="10px"]::before { +// content: "10px"; +// } +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="12px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="12px"]::before { + content: "12px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="14px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="14px"]::before { + content: "14px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="16px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="16px"]::before { + content: "16px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="18px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="18px"]::before { + content: "18px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="20px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="20px"]::before { + content: "20px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="22px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="22px"]::before { + content: "22px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="24px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="24px"]::before { + content: "24px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="26px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="26px"]::before { + content: "26px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="28px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="28px"]::before { + content: "28px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="30px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="30px"]::before { + content: "30px"; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32px"]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32px"]::before { + content: "32px"; +} + +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="32px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="32px"]::before { +// content: "32px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="36px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="36px"]::before { +// content: "36px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="38px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="38px"]::before { +// content: "38px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="40px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="40px"]::before { +// content: "40px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="42px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="42px"]::before { +// content: "44px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="44px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="44px"]::before { +// content: "44px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="45px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="45px"]::before { +// content: "45px"; +// } +// .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="50px"]::before, +// .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="50px"]::before { +// content: "50px"; +// } diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue index 143d842..e5cfb28 100644 --- a/src/components/Editor/index.vue +++ b/src/components/Editor/index.vue @@ -4,15 +4,14 @@ action="#" :multiple="true" :show-file-list="false" - :http-request="handleHttpUpload" - :before-upload="handleBeforeUpload" + :http-request="() => {}" + :before-upload="() => false" + @change="handleFileChange" class="editor-img-uploader" accept=".jpeg,.jpg,.png,.gif" > - - props.content, - set: val => { - emit("update:content", val); - } + set: val => emit("update:content", val) }); -//富文本ref -const myQuillEditor = ref(null); -//富文本值 -const oldContent = ref(""); -//富文本配置项 + +// 编辑器配置 const options = reactive({ theme: "snow", - debug: "warn", modules: { - // 工具栏配置 toolbar: { container: [ - ["bold", "italic", "underline", "strike"], // 加粗 斜体 下划线 删除线 - ["blockquote", "code-block"], // 引用 代码块 - [{ list: "ordered" }, { list: "bullet" }], // 有序、无序列表 - [{ indent: "-1" }, { indent: "+1" }], // 缩进 - [{ size: ["small", false, "large", "huge"] }], // 字体大小 - [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题 - [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色 - [{ align: [] }], // 对齐方式 - ["clean"], // 清除文本格式 - ["link", "image", "video"] // 链接、图片、视频 + ["bold", "italic", "underline", "strike"], + ["blockquote", "code-block"], + [{ list: "ordered" }, { list: "bullet" }], + [{ indent: "-1" }, { indent: "+1" }], + [{ size: fontSizeStyle.whitelist }], + [{ header: [1, 2, 3, 4, 5, 6, false] }], + [{ color: [] }, { background: [] }], + [{ align: [] }], + ["clean"], + ["link", "image", "video"] ], handlers: { - // 重写图片上传事件 - image: function (value) { - if (value) { - //调用图片上传 - proxy.$refs.uploadRef.click(); - } else { - Quill.format("image", true); - } - }, - video: function (value) { - if (value) { - // 劫持原来的视频点击按钮事件 - document.querySelector("#uploadFileVideo")?.click(); - } else { - Quill.format("video", true); - } - } + image: () => proxy.$refs.uploadRef.click(), + video: () => document.querySelector("#uploadFileVideo")?.click() } } }, placeholder: "请输入内容...", - readOnly: props.readOnly, - clipboard: { - matchers: [ - [ - "img", - (node, delta) => { - const src = node.getAttribute("src"); - const id = node.getAttribute("id"); - delta.insert({ image: { src, id: id } }); - } - ] - ] - } + readOnly: props.readOnly }); -//上传前的钩子 -const handleBeforeUpload = file => { - const fileType = file.type; - // 图片 - if ( - fileType == "image/jpeg" || - fileType == "image/png" || - fileType == "image/gif" || - fileType == "image/jpg" || - fileType == "image/bmp" || - fileType == "image/webp" || - fileType == "video/mov" || - fileType == "video/ts" || - fileType == "video/mp4" || - fileType == "video/avi" - ) { - const fileSizeLimit = file.size; - // 校检文件大小 - const isLt = fileSizeLimit / 1024 / 1024 < props.fileSizeLimit; - if (!isLt) { - console.log(`上传文件大小不能超过 ${props.fileSizeLimit} MB!`); - alert(`上传文件大小不能超过 ${props.fileSizeLimit} MB!`); +// 处理文件选择(临时去重,仅当前批次有效) +const handleFileChange = (file, fileList) => { + if (!fileList.length) return; + + const rawEditor = toRaw(myQuillEditor.value); + const quill = rawEditor?.getQuill(); + if (!quill) return; + + // 获取初始光标位置 + let baseCursorIndex = quill.selection.savedRange?.index || 0; + + // 生成文件唯一标识(用于临时去重) + const getFileKey = file => `${file.name}-${file.size}-${file.lastModified}`; + + // 过滤当前批次中已选择的重复文件(但允许和历史批次重复) + const newFiles = fileList.filter(item => { + const file = item.raw; + const key = getFileKey(file); + // 仅在当前批次内去重(避免单次选择中重复添加) + if (tempProcessedFiles.value.has(key)) { + console.log(`当前批次中已包含文件: ${file.name}`); return false; - } else { - console.log(`RIch MB!`); - return true; } - } else { - alert(`文件格式不正确!`); - return false; - } -}; -//图片上传 -const handleHttpUpload = async options => { - let formData = new FormData(); - //这里要根据后端设置的name设置key值,如果name是file就传file是image就传image - formData.append("image", options.file); - try { - const result = await uploadImg(formData, routerName.value); - if (result?.code === 0) { - const { data } = result; - let rawMyQuillEditor = toRaw(myQuillEditor.value); - // 获取富文本实例 - let quill = rawMyQuillEditor.getQuill(); - // 获取光标位置 - let length = quill.selection.savedRange.index; - quill.insertEmbed(length, "image", { - url: h + data.path, - id: generateUUID() - }); - quill.setSelection(length + 1); - } - } catch (error) {} -}; + // 校验文件合法性 + if (!validateFile(file)) return false; + // 添加到临时去重集合 + tempProcessedFiles.value.add(key); + return true; + }); -//视频上传 -const handleVideoUpload = async evt => { - if (evt.target.files.length === 0) { + if (!newFiles.length) { + alert("所选文件已在当前上传批次中或不合法"); return; } - const formData = new FormData(); - formData.append("video", evt.target.files[0]); - try { - let quill = toRaw(myQuillEditor.value).getQuill(); - // 获取光标位置 - let length = quill.selection.savedRange.index; - const { data } = await uploadVideo(formData); - quill.insertEmbed(length, "video", { - url: h + data.path, //h + data.fileUrl, // - id: generateUUID() + + // 按选择顺序添加到队列 + newFiles.forEach((item, index) => { + uploadQueue.value.push({ + file: item.raw, + cursorIndex: baseCursorIndex + index }); - uploadFileVideo.value.value = ""; - } catch (error) { - console.log(error); + }); + + // 启动队列处理 + if (!isProcessing.value) { + processQueue(); } }; -// 监听富文本内容变化,删除被服务器中被用户回车删除的图片 +// 文件校验 +const validateFile = file => { + const isImage = file.type.startsWith("image/"); + if (!isImage) { + alert("请上传图片文件"); + return false; + } + + const fileSizeMB = file.size / 1024 / 1024; + if (fileSizeMB > props.fileSizeLimit) { + alert(`文件 ${file.name} 大小超过 ${props.fileSizeLimit} MB`); + return false; + } + + return true; +}; + +// 处理上传队列(全部完成后清空临时去重集合) +const processQueue = async () => { + if (isProcessing.value || uploadQueue.value.length === 0) return; + + isProcessing.value = true; + const { file, cursorIndex } = uploadQueue.value[0]; + + try { + // 上传文件 + const formData = new FormData(); + formData.append("image", file); + const result = await uploadImg(formData, routerName.value); + + if (result?.code === 0) { + const rawEditor = toRaw(myQuillEditor.value); + const quill = rawEditor.getQuill(); + // 插入图片 + quill.insertEmbed(cursorIndex, "image", { + url: h + result.data.path, + id: generateUUID() + }); + quill.setSelection(cursorIndex + 1); + } + } catch (error) { + console.error(`文件 ${file.name} 上传失败:`, error); + } finally { + uploadQueue.value.shift(); + // 若队列已空,清空临时去重集合(允许下次上传相同文件) + if (uploadQueue.value.length === 0) { + tempProcessedFiles.value.clear(); + } + isProcessing.value = false; + // 继续处理下一个 + processQueue(); + } +}; + +// 视频上传(保持不变) +const handleVideoUpload = async evt => { + if (evt.target.files.length === 0) return; + + const file = evt.target.files[0]; + const formData = new FormData(); + formData.append("video", file); + + try { + const rawEditor = toRaw(myQuillEditor.value); + const quill = rawEditor.getQuill(); + const cursorIndex = quill.selection.savedRange?.index || 0; + + const { data } = await uploadVideo(formData); + quill.insertEmbed(cursorIndex, "video", { + url: h + data.path, + id: generateUUID() + }); + quill.setSelection(cursorIndex + 1); + } catch (error) { + console.error("视频上传失败:", error); + } finally { + evt.target.value = ""; + } +}; + +// 内容变化监听 const onContentChange = content => { emit("handleRichTextContentChange", content); }; -// 增加hover工具栏有中文提示 + +// 初始化标题提示 const initTitle = () => { - document.getElementsByClassName("ql-editor")[0].dataset.placeholder = ""; - for (let item of titleConfig.value) { - let tip = document.querySelector(".ql-toolbar " + item.Choice); - if (!tip) continue; - tip.setAttribute("title", item.title); + for (const item of titleConfig.value) { + const tip = document.querySelector(`.ql-toolbar ${item.Choice}`); + if (tip) tip.setAttribute("title", item.title); } }; + onMounted(() => { initTitle(); oldContent.value = props.content; diff --git a/src/components/Editor/lineHeight.js b/src/components/Editor/lineHeight.js new file mode 100644 index 0000000..10b5744 --- /dev/null +++ b/src/components/Editor/lineHeight.js @@ -0,0 +1,10 @@ +//lineHeight.js +import Quill from "quill"; +const Parchment = Quill.import("parchment"); +class lineHeightAttributor extends Parchment.Attributor.Style {} +const lineHeightStyle = new lineHeightAttributor("lineHeight", "line-height", { + scope: Parchment.Scope.INLINE, + whitelist: ["1", "2", "3", "4", "5"] +}); + +export { lineHeightStyle }; diff --git a/src/components/Editor/quill-custom-fontsize.js b/src/components/Editor/quill-custom-fontsize.js new file mode 100644 index 0000000..ce67a76 --- /dev/null +++ b/src/components/Editor/quill-custom-fontsize.js @@ -0,0 +1,124 @@ +// 自定义字体大小模块,支持预设选项和输入框 +export class CustomFontSize { + constructor(quill, options) { + this.quill = quill; + this.options = options; + + // 创建工具栏容器 + const container = quill.getModule("toolbar").container; + + // 创建字体大小选择器 + this.selector = document.createElement("select"); + this.selector.classList.add("ql-size"); + + // 添加预设选项 + options.presets.forEach(size => { + if (size === false) { + // 添加分隔线 + const option = document.createElement("option"); + option.disabled = true; + option.innerHTML = "──────────"; + this.selector.appendChild(option); + } else { + // 添加预设大小选项 + const option = document.createElement("option"); + option.value = size; + option.innerHTML = this.getSizeLabel(size); + this.selector.appendChild(option); + } + }); + + // 添加自定义输入选项 + const inputOption = document.createElement("option"); + inputOption.value = "custom"; + inputOption.innerHTML = "自定义"; + this.selector.appendChild(inputOption); + + // 创建自定义输入框 + this.input = document.createElement("input"); + this.input.type = "number"; + this.input.placeholder = "输入字号"; + this.input.min = 1; + this.input.style.width = "50px"; + this.input.style.display = "none"; // 默认隐藏 + + // 将选择器和输入框添加到工具栏 + container.appendChild(this.selector); + container.appendChild(this.input); + + // 绑定事件 + this.selector.addEventListener("change", this.onSelectChange.bind(this)); + this.input.addEventListener("change", this.onInputChange.bind(this)); + this.quill.on("text-change", this.update.bind(this)); + + // 初始化 + this.update(); + } + + // 获取大小标签 + getSizeLabel(size) { + const labels = { + small: "小", + normal: "正常", + large: "大", + huge: "超大" + }; + return labels[size] || size; + } + + // 选择器变更事件 + onSelectChange() { + const value = this.selector.value; + + if (value === "custom") { + // 显示输入框 + this.input.style.display = "inline-block"; + this.input.focus(); + } else { + // 隐藏输入框并应用选择的大小 + this.input.style.display = "none"; + this.quill.format("size", value); + } + } + + // 输入框变更事件 + onInputChange() { + const value = this.input.value; + if (value) { + this.quill.format("size", `${value}px`); + } + // 选择"自定义"选项,保持输入框显示 + this.selector.value = "custom"; + } + + // 更新当前选中状态 + update() { + const selection = this.quill.getSelection(); + if (selection) { + const [format] = this.quill.getFormat(selection.index, 1); + const size = format.size; + + if (size && size.endsWith("px")) { + const sizeValue = size.replace("px", ""); + this.input.value = sizeValue; + + // 如果是预设值,选中对应的选项 + if (this.options.presets.includes(size)) { + this.selector.value = size; + this.input.style.display = "none"; + } else { + // 否则选中"自定义"并显示输入框 + this.selector.value = "custom"; + this.input.style.display = "inline-block"; + } + } else { + // 没有选中的大小,重置为默认 + this.selector.value = "normal"; + this.input.style.display = "none"; + } + } + } +} + +// // 注册自定义模块 +// Quill.register("modules/customFontSize", CustomFontSize); diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 5318e11..4a12823 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -36,25 +36,25 @@ autocomplete="off" /> + style=" + width: 350px; + font-size: 12px; + line-height: 1; + color: #4178d5; + text-align: right; + cursor: pointer; + " + @click="handleTabClick(2)" + > + 忘记密码? + --> + 验证码 + + + 刷新 + --> +
+
+
+
+
+ +
+
+
+
登录
+ +
+
+ +
+ + + + + + + + + + + 登录 + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + 提交 + + +
+
+
+
+ + + diff --git a/vite.config.ts.timestamp-1752636911283-0a4ac4d78e007.mjs b/vite.config.ts.timestamp-1752636911283-0a4ac4d78e007.mjs new file mode 100644 index 0000000..b263de0 --- /dev/null +++ b/vite.config.ts.timestamp-1752636911283-0a4ac4d78e007.mjs @@ -0,0 +1,371 @@ +// vite.config.ts +import { defineConfig, loadEnv } from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/vite/dist/node/index.js"; +import { resolve as resolve2 } from "path"; + +// build/getEnv.ts +function wrapperEnv(envConf) { + const ret = {}; + for (const envName of Object.keys(envConf)) { + let realName = envConf[envName].replace(/\\n/g, "\n"); + realName = realName === "true" ? true : realName === "false" ? false : realName; + if (envName === "VITE_PORT") + realName = Number(realName); + if (envName === "VITE_PROXY") { + try { + realName = JSON.parse(realName); + } catch (error) { + } + } + ret[envName] = realName; + } + return ret; +} + +// build/proxy.ts +function createProxy(list = []) { + const ret = {}; + for (const [prefix, target] of list) { + const httpsRE = /^https:\/\//; + const isHttps = httpsRE.test(target); + ret[prefix] = { + target, + changeOrigin: true, + ws: true, + rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ""), + // https is require secure=false + ...isHttps ? { secure: false } : {} + }; + } + return ret; +} + +// build/plugins.ts +import { resolve } from "path"; +import { VitePWA } from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/vite-plugin-pwa/dist/index.js"; +import { visualizer } from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/rollup-plugin-visualizer/dist/plugin/index.js"; +import { createHtmlPlugin } from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/vite-plugin-html/dist/index.mjs"; +import { createSvgIconsPlugin } from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/vite-plugin-svg-icons/dist/index.mjs"; +import vue from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +import vueJsx from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs"; +import eslintPlugin from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/vite-plugin-eslint/dist/index.mjs"; +import viteCompression from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/vite-plugin-compression/dist/index.mjs"; +import vueSetupExtend from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/unplugin-vue-setup-extend-plus/dist/vite.js"; +import AutoImport from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/unplugin-auto-import/dist/vite.js"; +import Components from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/unplugin-vue-components/dist/vite.mjs"; +import { ElementPlusResolver } from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/unplugin-vue-components/dist/resolvers.mjs"; +import Icons from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/unplugin-icons/dist/vite.mjs"; +import IconsResolver from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/unplugin-icons/dist/resolver.mjs"; +var createVitePlugins = (viteEnv) => { + const { VITE_GLOB_APP_TITLE, VITE_REPORT, VITE_PWA } = viteEnv; + return [ + vue(), + // vue 可以使用 jsx/tsx 语法 + vueJsx(), + // esLint 报错信息显示在浏览器界面上 + eslintPlugin(), + // name 可以写在 script 标签上 + vueSetupExtend({}), + // 创建打包压缩配置 + createCompression(viteEnv), + // 注入变量到 html 文件 + createHtmlPlugin({ + inject: { + data: { title: VITE_GLOB_APP_TITLE } + } + }), + // 使用 svg 图标 + createSvgIconsPlugin({ + iconDirs: [resolve(process.cwd(), "src/assets/icons")], + symbolId: "icon-[dir]-[name]" + }), + // element按需导入 + AutoImport({ + // 安装两行后你会发现在组件中不用再导入ref,reactive等 + imports: ["vue", "vue-router"], + dts: "src/auto-import.d.ts", + // element + resolvers: [ + ElementPlusResolver({ importStyle: "sass" }), + IconsResolver({ + prefix: "Icon" + }) + ] + }), + Components({ + // element + resolvers: [ + ElementPlusResolver({ importStyle: "sass" }), + IconsResolver({ + enabledCollections: ["ep"] + }) + ], + // 默认存放位置 + dts: "src/components.d.ts" + }), + Icons({ + autoInstall: true + }), + // vitePWA + VITE_PWA && createVitePwa(viteEnv), + // 是否生成包预览,分析依赖包大小做优化处理 + VITE_REPORT && visualizer({ filename: "stats.html", gzipSize: true, brotliSize: true }) + ]; +}; +var createCompression = (viteEnv) => { + const { VITE_BUILD_COMPRESS = "none", VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv; + const compressList = VITE_BUILD_COMPRESS.split(","); + const plugins = []; + if (compressList.includes("gzip")) { + plugins.push( + viteCompression({ + ext: ".gz", + algorithm: "gzip", + deleteOriginFile: VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE + }) + ); + } + if (compressList.includes("brotli")) { + plugins.push( + viteCompression({ + ext: ".br", + algorithm: "brotliCompress", + deleteOriginFile: VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE + }) + ); + } + return plugins; +}; +var createVitePwa = (viteEnv) => { + const { VITE_GLOB_APP_TITLE } = viteEnv; + return VitePWA({ + registerType: "autoUpdate", + manifest: { + name: VITE_GLOB_APP_TITLE, + short_name: VITE_GLOB_APP_TITLE, + theme_color: "#ffffff", + icons: [ + { + src: "/logo.png", + sizes: "192x192", + type: "image/png" + }, + { + src: "/logo.png", + sizes: "512x512", + type: "image/png" + }, + { + src: "/logo.png", + sizes: "512x512", + type: "image/png", + purpose: "any maskable" + } + ] + } + }); +}; + +// package.json +var package_default = { + name: "yc_ops_admin_ts", + private: true, + version: "1.0.0", + type: "module", + scripts: { + dev: "vite", + serve: "vite", + "build:dev": "vue-tsc && vite build --mode development", + "build:test": "vue-tsc && vite build --mode test", + "build:pro": "vue-tsc && vite build --mode production", + "type:check": "vue-tsc --noEmit --skipLibCheck", + preview: "npm run build:dev && vite preview", + "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", + "lint:prettier": 'prettier --write "src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}"', + "lint:stylelint": 'stylelint --cache --fix "**/*.{vue,less,postcss,css,scss}" --cache --cache-location node_modules/.cache/stylelint/', + "lint:lint-staged": "lint-staged", + prepare: "husky install", + release: "standard-version", + commit: "git add -A && czg && git push" + }, + dependencies: { + "@element-plus/icons-vue": "^2.1.0", + "@types/decimal.js": "^7.4.0", + "@vueup/vue-quill": "^1.2.0", + "@vueuse/core": "^10.1.2", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "async-validator": "^4.2.5", + axios: "^1.4.0", + "bwip-js": "^4.3.2", + "crypto-js": "^4.2.0", + dayjs: "^1.11.9", + decimal: "^0.0.2", + "default-passive-events": "^2.0.0", + "driver.js": "^0.9.8", + "element-plus": "^2.3.4", + "file-saver": "^2.0.5", + "js-md5": "^0.7.3", + jsbarcode: "^3.11.6", + jsonpack: "^1.1.5", + "lodash-es": "^4.17.21", + "mavon-editor": "^3.0.2", + mitt: "^3.0.0", + nprogress: "^0.2.0", + pinia: "^2.1.3", + "pinia-plugin-persistedstate": "^3.1.0", + "print-js": "^1.6.0", + qs: "^6.13.1", + quill: "^2.0.3", + sortablejs: "^1.15.0", + vue: "^3.3.4", + "vue-router": "^4.2.2", + vuedraggable: "^4.1.0", + "vxe-table": "^4.5.0-beta.10", + "xe-utils": "^3.5.11", + xlsx: "^0.18.5" + }, + devDependencies: { + "@commitlint/cli": "^17.6.3", + "@commitlint/config-conventional": "^17.6.3", + "@iconify-json/ep": "^1.1.10", + "@types/crypto-js": "^4.2.2", + "@types/file-saver": "^2.0.5", + "@types/js-md5": "^0.7.0", + "@types/nprogress": "^0.2.0", + "@types/qs": "^6.9.7", + "@types/sortablejs": "^1.15.1", + "@typescript-eslint/eslint-plugin": "^5.59.7", + "@typescript-eslint/parser": "^5.59.7", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + autoprefixer: "^10.4.14", + "cz-git": "^1.6.1", + czg: "^1.6.1", + eslint: "^8.41.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.14.0", + husky: "^8.0.3", + "lint-staged": "^13.2.2", + postcss: "^8.4.23", + "postcss-html": "^1.5.0", + prettier: "^2.8.8", + qrcode: "^1.5.3", + "rollup-plugin-visualizer": "^5.9.0", + sass: "^1.62.1", + "standard-version": "^9.5.0", + stylelint: "^15.6.2", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^4.0.0", + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-recommended-vue": "^1.4.0", + "stylelint-config-standard": "^33.0.0", + "stylelint-config-standard-scss": "^9.0.0", + typescript: "^5.0.2", + "unplugin-auto-import": "^0.16.4", + "unplugin-icons": "^0.16.3", + "unplugin-vue-components": "^0.25.1", + "unplugin-vue-setup-extend-plus": "^1.0.0", + vite: "^4.3.9", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-html": "^3.2.0", + "vite-plugin-pwa": "^0.15.0", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^1.6.5" + }, + engines: { + node: ">=16.0.0" + }, + browserslist: { + production: [ + "> 1%", + "not dead", + "not op_mini all" + ], + development: [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + config: { + commitizen: { + path: "node_modules/cz-git" + } + } +}; + +// vite.config.ts +import dayjs from "file:///D:/new_ops/orico-officialWebsite-ts-admin(%E5%AE%98%E7%BD%91%E5%90%8E%E5%8F%B0-git)/node_modules/dayjs/dayjs.min.js"; +var __vite_injected_original_dirname = "D:\\new_ops\\orico-officialWebsite-ts-admin(\u5B98\u7F51\u540E\u53F0-git)"; +var { dependencies, devDependencies, name, version } = package_default; +var __APP_INFO__ = { + pkg: { dependencies, devDependencies, name, version }, + lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss") +}; +var vite_config_default = defineConfig(({ mode }) => { + const root = process.cwd(); + const env = loadEnv(mode, root); + const viteEnv = wrapperEnv(env); + return { + base: viteEnv.VITE_PUBLIC_PATH, + root, + resolve: { + alias: { + "@": resolve2(__vite_injected_original_dirname, "./src") + } + }, + define: { + __APP_INFO__: JSON.stringify(__APP_INFO__) + }, + css: { + preprocessorOptions: { + scss: { + additionalData: `@use "@/styles/var.scss" as *;` + } + } + }, + server: { + host: "0.0.0.0", + port: viteEnv.VITE_PORT, + open: viteEnv.VITE_OPEN, + cors: true, + // Load proxy configuration from .env.development + proxy: createProxy(viteEnv.VITE_PROXY) + }, + plugins: createVitePlugins(viteEnv), + esbuild: { + //"console.log","console.log", + pure: viteEnv.VITE_DROP_CONSOLE ? ["debugger"] : [] + }, + build: { + outDir: "dist", + minify: "esbuild", + // esbuild 打包更快,但是不能去除 console.log,terser打包慢,但能去除 console.log + // minify: "terser", + // terserOptions: { + // compress: { + // drop_console: viteEnv.VITE_DROP_CONSOLE, + // drop_debugger: true + // } + // }, + // 禁用 gzip 压缩大小报告,可略微减少打包时间 + reportCompressedSize: false, + // 规定触发警告的 chunk 大小 + chunkSizeWarningLimit: 2e3, + rollupOptions: { + output: { + // Static resource classification and packaging + chunkFileNames: "assets/js/[name]-[hash].js", + entryFileNames: "assets/js/[name]-[hash].js", + assetFileNames: "assets/[ext]/[name]-[hash].[ext]" + } + } + } + }; +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAiYnVpbGQvZ2V0RW52LnRzIiwgImJ1aWxkL3Byb3h5LnRzIiwgImJ1aWxkL3BsdWdpbnMudHMiLCAicGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRDpcXFxcbmV3X29wc1xcXFxvcmljby1vZmZpY2lhbFdlYnNpdGUtdHMtYWRtaW4oXHU1Qjk4XHU3RjUxXHU1NDBFXHU1M0YwLWdpdClcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXG5ld19vcHNcXFxcb3JpY28tb2ZmaWNpYWxXZWJzaXRlLXRzLWFkbWluKFx1NUI5OFx1N0Y1MVx1NTQwRVx1NTNGMC1naXQpXFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9EOi9uZXdfb3BzL29yaWNvLW9mZmljaWFsV2Vic2l0ZS10cy1hZG1pbiglRTUlQUUlOTglRTclQkQlOTElRTUlOTAlOEUlRTUlOEYlQjAtZ2l0KS92aXRlLmNvbmZpZy50c1wiO2ltcG9ydCB7IGRlZmluZUNvbmZpZywgbG9hZEVudiwgQ29uZmlnRW52LCBVc2VyQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcclxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJwYXRoXCI7XHJcbmltcG9ydCB7IHdyYXBwZXJFbnYgfSBmcm9tIFwiLi9idWlsZC9nZXRFbnZcIjtcclxuaW1wb3J0IHsgY3JlYXRlUHJveHkgfSBmcm9tIFwiLi9idWlsZC9wcm94eVwiO1xyXG5pbXBvcnQgeyBjcmVhdGVWaXRlUGx1Z2lucyB9IGZyb20gXCIuL2J1aWxkL3BsdWdpbnNcIjtcclxuXHJcbmltcG9ydCBwa2cgZnJvbSBcIi4vcGFja2FnZS5qc29uXCI7XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuXHJcbmNvbnN0IHsgZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIG5hbWUsIHZlcnNpb24gfSA9IHBrZztcclxuY29uc3QgX19BUFBfSU5GT19fID0ge1xyXG4gICAgcGtnOiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCBuYW1lLCB2ZXJzaW9uIH0sXHJcbiAgICBsYXN0QnVpbGRUaW1lOiBkYXlqcygpLmZvcm1hdChcIllZWVktTU0tREQgSEg6bW06c3NcIilcclxufTtcclxuXHJcbi8vIEBzZWU6IGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvXHJcbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZygoeyBtb2RlIH06IENvbmZpZ0Vudik6IFVzZXJDb25maWcgPT4ge1xyXG4gICAgY29uc3Qgcm9vdCA9IHByb2Nlc3MuY3dkKCk7XHJcbiAgICBjb25zdCBlbnYgPSBsb2FkRW52KG1vZGUsIHJvb3QpO1xyXG4gICAgY29uc3Qgdml0ZUVudiA9IHdyYXBwZXJFbnYoZW52KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGJhc2U6IHZpdGVFbnYuVklURV9QVUJMSUNfUEFUSCxcclxuICAgICAgICByb290LFxyXG4gICAgICAgIHJlc29sdmU6IHtcclxuICAgICAgICAgICAgYWxpYXM6IHtcclxuICAgICAgICAgICAgICAgIFwiQFwiOiByZXNvbHZlKF9fZGlybmFtZSwgXCIuL3NyY1wiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBkZWZpbmU6IHtcclxuICAgICAgICAgICAgX19BUFBfSU5GT19fOiBKU09OLnN0cmluZ2lmeShfX0FQUF9JTkZPX18pXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjc3M6IHtcclxuICAgICAgICAgICAgcHJlcHJvY2Vzc29yT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgc2Nzczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiBgQHVzZSBcIkAvc3R5bGVzL3Zhci5zY3NzXCIgYXMgKjtgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHNlcnZlcjoge1xyXG4gICAgICAgICAgICBob3N0OiBcIjAuMC4wLjBcIixcclxuICAgICAgICAgICAgcG9ydDogdml0ZUVudi5WSVRFX1BPUlQsXHJcbiAgICAgICAgICAgIG9wZW46IHZpdGVFbnYuVklURV9PUEVOLFxyXG4gICAgICAgICAgICBjb3JzOiB0cnVlLFxyXG4gICAgICAgICAgICAvLyBMb2FkIHByb3h5IGNvbmZpZ3VyYXRpb24gZnJvbSAuZW52LmRldmVsb3BtZW50XHJcbiAgICAgICAgICAgIHByb3h5OiBjcmVhdGVQcm94eSh2aXRlRW52LlZJVEVfUFJPWFkpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwbHVnaW5zOiBjcmVhdGVWaXRlUGx1Z2lucyh2aXRlRW52KSxcclxuICAgICAgICBlc2J1aWxkOiB7XHJcbiAgICAgICAgICAgIC8vXCJjb25zb2xlLmxvZ1wiLFwiY29uc29sZS5sb2dcIixcclxuICAgICAgICAgICAgcHVyZTogdml0ZUVudi5WSVRFX0RST1BfQ09OU09MRSA/IFtcImRlYnVnZ2VyXCJdIDogW11cclxuICAgICAgICB9LFxyXG4gICAgICAgIGJ1aWxkOiB7XHJcbiAgICAgICAgICAgIG91dERpcjogXCJkaXN0XCIsXHJcbiAgICAgICAgICAgIG1pbmlmeTogXCJlc2J1aWxkXCIsXHJcbiAgICAgICAgICAgIC8vIGVzYnVpbGQgXHU2MjUzXHU1MzA1XHU2NkY0XHU1RkVCXHVGRjBDXHU0RjQ2XHU2NjJGXHU0RTBEXHU4MEZEXHU1M0JCXHU5NjY0IGNvbnNvbGUubG9nXHVGRjBDdGVyc2VyXHU2MjUzXHU1MzA1XHU2MTYyXHVGRjBDXHU0RjQ2XHU4MEZEXHU1M0JCXHU5NjY0IGNvbnNvbGUubG9nXHJcbiAgICAgICAgICAgIC8vIG1pbmlmeTogXCJ0ZXJzZXJcIixcclxuICAgICAgICAgICAgLy8gdGVyc2VyT3B0aW9uczoge1xyXG4gICAgICAgICAgICAvLyBcdGNvbXByZXNzOiB7XHJcbiAgICAgICAgICAgIC8vIFx0XHRkcm9wX2NvbnNvbGU6IHZpdGVFbnYuVklURV9EUk9QX0NPTlNPTEUsXHJcbiAgICAgICAgICAgIC8vIFx0XHRkcm9wX2RlYnVnZ2VyOiB0cnVlXHJcbiAgICAgICAgICAgIC8vIFx0fVxyXG4gICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAvLyBcdTc5ODFcdTc1MjggZ3ppcCBcdTUzOEJcdTdGMjlcdTU5MjdcdTVDMEZcdTYyQTVcdTU0NEFcdUZGMENcdTUzRUZcdTc1NjVcdTVGQUVcdTUxQ0ZcdTVDMTFcdTYyNTNcdTUzMDVcdTY1RjZcdTk1RjRcclxuICAgICAgICAgICAgcmVwb3J0Q29tcHJlc3NlZFNpemU6IGZhbHNlLFxyXG4gICAgICAgICAgICAvLyBcdTg5QzRcdTVCOUFcdTg5RTZcdTUzRDFcdThCNjZcdTU0NEFcdTc2ODQgY2h1bmsgXHU1OTI3XHU1QzBGXHJcbiAgICAgICAgICAgIGNodW5rU2l6ZVdhcm5pbmdMaW1pdDogMjAwMCxcclxuICAgICAgICAgICAgcm9sbHVwT3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgb3V0cHV0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhdGljIHJlc291cmNlIGNsYXNzaWZpY2F0aW9uIGFuZCBwYWNrYWdpbmdcclxuICAgICAgICAgICAgICAgICAgICBjaHVua0ZpbGVOYW1lczogXCJhc3NldHMvanMvW25hbWVdLVtoYXNoXS5qc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5RmlsZU5hbWVzOiBcImFzc2V0cy9qcy9bbmFtZV0tW2hhc2hdLmpzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXRGaWxlTmFtZXM6IFwiYXNzZXRzL1tleHRdL1tuYW1lXS1baGFzaF0uW2V4dF1cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufSk7XHJcbiIsICJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiRDpcXFxcbmV3X29wc1xcXFxvcmljby1vZmZpY2lhbFdlYnNpdGUtdHMtYWRtaW4oXHU1Qjk4XHU3RjUxXHU1NDBFXHU1M0YwLWdpdClcXFxcYnVpbGRcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkQ6XFxcXG5ld19vcHNcXFxcb3JpY28tb2ZmaWNpYWxXZWJzaXRlLXRzLWFkbWluKFx1NUI5OFx1N0Y1MVx1NTQwRVx1NTNGMC1naXQpXFxcXGJ1aWxkXFxcXGdldEVudi50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovbmV3X29wcy9vcmljby1vZmZpY2lhbFdlYnNpdGUtdHMtYWRtaW4oJUU1JUFFJTk4JUU3JUJEJTkxJUU1JTkwJThFJUU1JThGJUIwLWdpdCkvYnVpbGQvZ2V0RW52LnRzXCI7aW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RldkZuKG1vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG1vZGUgPT09IFwiZGV2ZWxvcG1lbnRcIjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvZEZuKG1vZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG1vZGUgPT09IFwicHJvZHVjdGlvblwiO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNUZXN0Rm4obW9kZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gbW9kZSA9PT0gXCJ0ZXN0XCI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHBhY2thZ2UgcHJldmlld1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVwb3J0TW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBwcm9jZXNzLmVudi5WSVRFX1JFUE9SVCA9PT0gXCJ0cnVlXCI7XHJcbn1cclxuXHJcbi8vIFJlYWQgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gcHJvY2Vzcy5lbnZcclxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBwZXJFbnYoZW52Q29uZjogUmVjb3JkYWJsZSk6IFZpdGVFbnYge1xyXG4gICAgY29uc3QgcmV0OiBhbnkgPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGVudk5hbWUgb2YgT2JqZWN0LmtleXMoZW52Q29uZikpIHtcclxuICAgICAgICBsZXQgcmVhbE5hbWUgPSBlbnZDb25mW2Vudk5hbWVdLnJlcGxhY2UoL1xcXFxuL2csIFwiXFxuXCIpO1xyXG4gICAgICAgIHJlYWxOYW1lID0gcmVhbE5hbWUgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6IHJlYWxOYW1lID09PSBcImZhbHNlXCIgPyBmYWxzZSA6IHJlYWxOYW1lO1xyXG4gICAgICAgIGlmIChlbnZOYW1lID09PSBcIlZJVEVfUE9SVFwiKSByZWFsTmFtZSA9IE51bWJlcihyZWFsTmFtZSk7XHJcbiAgICAgICAgaWYgKGVudk5hbWUgPT09IFwiVklURV9QUk9YWVwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZWFsTmFtZSA9IEpTT04ucGFyc2UocmVhbE5hbWUpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge31cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0W2Vudk5hbWVdID0gcmVhbE5hbWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0O1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHVzZXIgcm9vdCBkaXJlY3RvcnlcclxuICogQHBhcmFtIGRpciBmaWxlIHBhdGhcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRSb290UGF0aCguLi5kaXI6IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIC4uLmRpcik7XHJcbn1cclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxuZXdfb3BzXFxcXG9yaWNvLW9mZmljaWFsV2Vic2l0ZS10cy1hZG1pbihcdTVCOThcdTdGNTFcdTU0MEVcdTUzRjAtZ2l0KVxcXFxidWlsZFwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRDpcXFxcbmV3X29wc1xcXFxvcmljby1vZmZpY2lhbFdlYnNpdGUtdHMtYWRtaW4oXHU1Qjk4XHU3RjUxXHU1NDBFXHU1M0YwLWdpdClcXFxcYnVpbGRcXFxccHJveHkudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0Q6L25ld19vcHMvb3JpY28tb2ZmaWNpYWxXZWJzaXRlLXRzLWFkbWluKCVFNSVBRSU5OCVFNyVCRCU5MSVFNSU5MCU4RSVFNSU4RiVCMC1naXQpL2J1aWxkL3Byb3h5LnRzXCI7aW1wb3J0IHR5cGUgeyBQcm94eU9wdGlvbnMgfSBmcm9tIFwidml0ZVwiO1xyXG5cclxudHlwZSBQcm94eUl0ZW0gPSBbc3RyaW5nLCBzdHJpbmddO1xyXG5cclxudHlwZSBQcm94eUxpc3QgPSBQcm94eUl0ZW1bXTtcclxuXHJcbnR5cGUgUHJveHlUYXJnZXRMaXN0ID0gUmVjb3JkPHN0cmluZywgUHJveHlPcHRpb25zPjtcclxuXHJcbi8qKlxyXG4gKiBcdTUyMUJcdTVFRkFcdTRFRTNcdTc0MDZcdUZGMENcdTc1MjhcdTRFOEVcdTg5RTNcdTY3OTAgLmVudi5kZXZlbG9wbWVudCBcdTRFRTNcdTc0MDZcdTkxNERcdTdGNkVcclxuICogQHBhcmFtIGxpc3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm94eShsaXN0OiBQcm94eUxpc3QgPSBbXSkge1xyXG4gICAgY29uc3QgcmV0OiBQcm94eVRhcmdldExpc3QgPSB7fTtcclxuICAgIGZvciAoY29uc3QgW3ByZWZpeCwgdGFyZ2V0XSBvZiBsaXN0KSB7XHJcbiAgICAgICAgY29uc3QgaHR0cHNSRSA9IC9eaHR0cHM6XFwvXFwvLztcclxuICAgICAgICBjb25zdCBpc0h0dHBzID0gaHR0cHNSRS50ZXN0KHRhcmdldCk7XHJcblxyXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9odHRwLXBhcnR5L25vZGUtaHR0cC1wcm94eSNvcHRpb25zXHJcbiAgICAgICAgcmV0W3ByZWZpeF0gPSB7XHJcbiAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxyXG4gICAgICAgICAgICBjaGFuZ2VPcmlnaW46IHRydWUsXHJcbiAgICAgICAgICAgIHdzOiB0cnVlLFxyXG4gICAgICAgICAgICByZXdyaXRlOiBwYXRoID0+IHBhdGgucmVwbGFjZShuZXcgUmVnRXhwKGBeJHtwcmVmaXh9YCksIFwiXCIpLFxyXG4gICAgICAgICAgICAvLyBodHRwcyBpcyByZXF1aXJlIHNlY3VyZT1mYWxzZVxyXG4gICAgICAgICAgICAuLi4oaXNIdHRwcyA/IHsgc2VjdXJlOiBmYWxzZSB9IDoge30pXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXQ7XHJcbn1cclxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFxuZXdfb3BzXFxcXG9yaWNvLW9mZmljaWFsV2Vic2l0ZS10cy1hZG1pbihcdTVCOThcdTdGNTFcdTU0MEVcdTUzRjAtZ2l0KVxcXFxidWlsZFwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRDpcXFxcbmV3X29wc1xcXFxvcmljby1vZmZpY2lhbFdlYnNpdGUtdHMtYWRtaW4oXHU1Qjk4XHU3RjUxXHU1NDBFXHU1M0YwLWdpdClcXFxcYnVpbGRcXFxccGx1Z2lucy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRDovbmV3X29wcy9vcmljby1vZmZpY2lhbFdlYnNpdGUtdHMtYWRtaW4oJUU1JUFFJTk4JUU3JUJEJTkxJUU1JTkwJThFJUU1JThGJUIwLWdpdCkvYnVpbGQvcGx1Z2lucy50c1wiO2ltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5pbXBvcnQgeyBQbHVnaW5PcHRpb24gfSBmcm9tIFwidml0ZVwiO1xyXG5pbXBvcnQgeyBWaXRlUFdBIH0gZnJvbSBcInZpdGUtcGx1Z2luLXB3YVwiO1xyXG5pbXBvcnQgeyB2aXN1YWxpemVyIH0gZnJvbSBcInJvbGx1cC1wbHVnaW4tdmlzdWFsaXplclwiO1xyXG5pbXBvcnQgeyBjcmVhdGVIdG1sUGx1Z2luIH0gZnJvbSBcInZpdGUtcGx1Z2luLWh0bWxcIjtcclxuaW1wb3J0IHsgY3JlYXRlU3ZnSWNvbnNQbHVnaW4gfSBmcm9tIFwidml0ZS1wbHVnaW4tc3ZnLWljb25zXCI7XHJcbmltcG9ydCB2dWUgZnJvbSBcIkB2aXRlanMvcGx1Z2luLXZ1ZVwiO1xyXG5pbXBvcnQgdnVlSnN4IGZyb20gXCJAdml0ZWpzL3BsdWdpbi12dWUtanN4XCI7XHJcbmltcG9ydCBlc2xpbnRQbHVnaW4gZnJvbSBcInZpdGUtcGx1Z2luLWVzbGludFwiO1xyXG5pbXBvcnQgdml0ZUNvbXByZXNzaW9uIGZyb20gXCJ2aXRlLXBsdWdpbi1jb21wcmVzc2lvblwiO1xyXG5pbXBvcnQgdnVlU2V0dXBFeHRlbmQgZnJvbSBcInVucGx1Z2luLXZ1ZS1zZXR1cC1leHRlbmQtcGx1cy92aXRlXCI7XHJcbi8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NXZ1ZVx1NEUyRGhvb2sgcmVhY3RpdmUgcmVmXHU3QjQ5XHJcbmltcG9ydCBBdXRvSW1wb3J0IGZyb20gXCJ1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlXCI7XHJcbi8vIFx1ODFFQVx1NTJBOFx1NUJGQ1x1NTE2NXVpLVx1N0VDNFx1NEVGNiBcdTZCRDRcdTU5ODJcdThCRjRhbnQtZGVzaWduLXZ1ZSAgZWxlbWVudC1wbHVzXHU3QjQ5XHJcbmltcG9ydCBDb21wb25lbnRzIGZyb20gXCJ1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlXCI7XHJcbi8vIGVsZW1lbnRcclxuaW1wb3J0IHsgRWxlbWVudFBsdXNSZXNvbHZlciB9IGZyb20gXCJ1bnBsdWdpbi12dWUtY29tcG9uZW50cy9yZXNvbHZlcnNcIjtcclxuLy8gXHU1QkZDXHU1MTY1XHU1NkZFXHU2ODA3XHJcbmltcG9ydCBJY29ucyBmcm9tIFwidW5wbHVnaW4taWNvbnMvdml0ZVwiO1xyXG5pbXBvcnQgSWNvbnNSZXNvbHZlciBmcm9tIFwidW5wbHVnaW4taWNvbnMvcmVzb2x2ZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBcdTUyMUJcdTVFRkEgdml0ZSBcdTYzRDJcdTRFRjZcclxuICogQHBhcmFtIHZpdGVFbnZcclxuICovXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVWaXRlUGx1Z2lucyA9ICh2aXRlRW52OiBWaXRlRW52KTogKFBsdWdpbk9wdGlvbiB8IFBsdWdpbk9wdGlvbltdKVtdID0+IHtcclxuICAgIGNvbnN0IHsgVklURV9HTE9CX0FQUF9USVRMRSwgVklURV9SRVBPUlQsIFZJVEVfUFdBIH0gPSB2aXRlRW52O1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICB2dWUoKSxcclxuICAgICAgICAvLyB2dWUgXHU1M0VGXHU0RUU1XHU0RjdGXHU3NTI4IGpzeC90c3ggXHU4QkVEXHU2Q0Q1XHJcbiAgICAgICAgdnVlSnN4KCksXHJcbiAgICAgICAgLy8gZXNMaW50IFx1NjJBNVx1OTUxOVx1NEZFMVx1NjA2Rlx1NjYzRVx1NzkzQVx1NTcyOFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzU0Q1x1OTc2Mlx1NEUwQVxyXG4gICAgICAgIGVzbGludFBsdWdpbigpLFxyXG4gICAgICAgIC8vIG5hbWUgXHU1M0VGXHU0RUU1XHU1MTk5XHU1NzI4IHNjcmlwdCBcdTY4MDdcdTdCN0VcdTRFMEFcclxuICAgICAgICB2dWVTZXR1cEV4dGVuZCh7fSksXHJcbiAgICAgICAgLy8gXHU1MjFCXHU1RUZBXHU2MjUzXHU1MzA1XHU1MzhCXHU3RjI5XHU5MTREXHU3RjZFXHJcbiAgICAgICAgY3JlYXRlQ29tcHJlc3Npb24odml0ZUVudiksXHJcbiAgICAgICAgLy8gXHU2Q0U4XHU1MTY1XHU1M0Q4XHU5MUNGXHU1MjMwIGh0bWwgXHU2NTg3XHU0RUY2XHJcbiAgICAgICAgY3JlYXRlSHRtbFBsdWdpbih7XHJcbiAgICAgICAgICAgIGluamVjdDoge1xyXG4gICAgICAgICAgICAgICAgZGF0YTogeyB0aXRsZTogVklURV9HTE9CX0FQUF9USVRMRSB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICAvLyBcdTRGN0ZcdTc1Mjggc3ZnIFx1NTZGRVx1NjgwN1xyXG4gICAgICAgIGNyZWF0ZVN2Z0ljb25zUGx1Z2luKHtcclxuICAgICAgICAgICAgaWNvbkRpcnM6IFtyZXNvbHZlKHByb2Nlc3MuY3dkKCksIFwic3JjL2Fzc2V0cy9pY29uc1wiKV0sXHJcbiAgICAgICAgICAgIHN5bWJvbElkOiBcImljb24tW2Rpcl0tW25hbWVdXCJcclxuICAgICAgICB9KSxcclxuICAgICAgICAvLyBlbGVtZW50XHU2MzA5XHU5NzAwXHU1QkZDXHU1MTY1XHJcbiAgICAgICAgQXV0b0ltcG9ydCh7XHJcbiAgICAgICAgICAgIC8vIFx1NUI4OVx1ODhDNVx1NEUyNFx1ODg0Q1x1NTQwRVx1NEY2MFx1NEYxQVx1NTNEMVx1NzNCMFx1NTcyOFx1N0VDNFx1NEVGNlx1NEUyRFx1NEUwRFx1NzUyOFx1NTE4RFx1NUJGQ1x1NTE2NXJlZlx1RkYwQ3JlYWN0aXZlXHU3QjQ5XHJcbiAgICAgICAgICAgIGltcG9ydHM6IFtcInZ1ZVwiLCBcInZ1ZS1yb3V0ZXJcIl0sXHJcbiAgICAgICAgICAgIGR0czogXCJzcmMvYXV0by1pbXBvcnQuZC50c1wiLFxyXG4gICAgICAgICAgICAvLyBlbGVtZW50XHJcbiAgICAgICAgICAgIHJlc29sdmVyczogW1xyXG4gICAgICAgICAgICAgICAgRWxlbWVudFBsdXNSZXNvbHZlcih7IGltcG9ydFN0eWxlOiBcInNhc3NcIiB9KSxcclxuICAgICAgICAgICAgICAgIEljb25zUmVzb2x2ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeDogXCJJY29uXCJcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9KSxcclxuICAgICAgICBDb21wb25lbnRzKHtcclxuICAgICAgICAgICAgLy8gZWxlbWVudFxyXG4gICAgICAgICAgICByZXNvbHZlcnM6IFtcclxuICAgICAgICAgICAgICAgIEVsZW1lbnRQbHVzUmVzb2x2ZXIoeyBpbXBvcnRTdHlsZTogXCJzYXNzXCIgfSksXHJcbiAgICAgICAgICAgICAgICBJY29uc1Jlc29sdmVyKHtcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVkQ29sbGVjdGlvbnM6IFtcImVwXCJdXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAvLyBcdTlFRDhcdThCQTRcdTVCNThcdTY1M0VcdTRGNERcdTdGNkVcclxuICAgICAgICAgICAgZHRzOiBcInNyYy9jb21wb25lbnRzLmQudHNcIlxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIEljb25zKHtcclxuICAgICAgICAgICAgYXV0b0luc3RhbGw6IHRydWVcclxuICAgICAgICB9KSxcclxuICAgICAgICAvLyB2aXRlUFdBXHJcbiAgICAgICAgVklURV9QV0EgJiYgY3JlYXRlVml0ZVB3YSh2aXRlRW52KSxcclxuICAgICAgICAvLyBcdTY2MkZcdTU0MjZcdTc1MUZcdTYyMTBcdTUzMDVcdTk4ODRcdTg5QzhcdUZGMENcdTUyMDZcdTY3OTBcdTRGOURcdThENTZcdTUzMDVcdTU5MjdcdTVDMEZcdTUwNUFcdTRGMThcdTUzMTZcdTU5MDRcdTc0MDZcclxuICAgICAgICBWSVRFX1JFUE9SVCAmJiAodmlzdWFsaXplcih7IGZpbGVuYW1lOiBcInN0YXRzLmh0bWxcIiwgZ3ppcFNpemU6IHRydWUsIGJyb3RsaVNpemU6IHRydWUgfSkgYXMgUGx1Z2luT3B0aW9uKVxyXG4gICAgXTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBAZGVzY3JpcHRpb24gXHU2ODM5XHU2MzZFIGNvbXByZXNzIFx1OTE0RFx1N0Y2RVx1RkYwQ1x1NzUxRlx1NjIxMFx1NEUwRFx1NTQwQ1x1NzY4NFx1NTM4Qlx1N0YyOVx1ODlDNFx1NTIxOVxyXG4gKiBAcGFyYW0gdml0ZUVudlxyXG4gKi9cclxuY29uc3QgY3JlYXRlQ29tcHJlc3Npb24gPSAodml0ZUVudjogVml0ZUVudik6IFBsdWdpbk9wdGlvbiB8IFBsdWdpbk9wdGlvbltdID0+IHtcclxuICAgIGNvbnN0IHsgVklURV9CVUlMRF9DT01QUkVTUyA9IFwibm9uZVwiLCBWSVRFX0JVSUxEX0NPTVBSRVNTX0RFTEVURV9PUklHSU5fRklMRSB9ID0gdml0ZUVudjtcclxuICAgIGNvbnN0IGNvbXByZXNzTGlzdCA9IFZJVEVfQlVJTERfQ09NUFJFU1Muc3BsaXQoXCIsXCIpO1xyXG4gICAgY29uc3QgcGx1Z2luczogUGx1Z2luT3B0aW9uW10gPSBbXTtcclxuICAgIGlmIChjb21wcmVzc0xpc3QuaW5jbHVkZXMoXCJnemlwXCIpKSB7XHJcbiAgICAgICAgcGx1Z2lucy5wdXNoKFxyXG4gICAgICAgICAgICB2aXRlQ29tcHJlc3Npb24oe1xyXG4gICAgICAgICAgICAgICAgZXh0OiBcIi5nelwiLFxyXG4gICAgICAgICAgICAgICAgYWxnb3JpdGhtOiBcImd6aXBcIixcclxuICAgICAgICAgICAgICAgIGRlbGV0ZU9yaWdpbkZpbGU6IFZJVEVfQlVJTERfQ09NUFJFU1NfREVMRVRFX09SSUdJTl9GSUxFXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIGlmIChjb21wcmVzc0xpc3QuaW5jbHVkZXMoXCJicm90bGlcIikpIHtcclxuICAgICAgICBwbHVnaW5zLnB1c2goXHJcbiAgICAgICAgICAgIHZpdGVDb21wcmVzc2lvbih7XHJcbiAgICAgICAgICAgICAgICBleHQ6IFwiLmJyXCIsXHJcbiAgICAgICAgICAgICAgICBhbGdvcml0aG06IFwiYnJvdGxpQ29tcHJlc3NcIixcclxuICAgICAgICAgICAgICAgIGRlbGV0ZU9yaWdpbkZpbGU6IFZJVEVfQlVJTERfQ09NUFJFU1NfREVMRVRFX09SSUdJTl9GSUxFXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwbHVnaW5zO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBkZXNjcmlwdGlvbiBWaXRlUHdhXHJcbiAqIEBwYXJhbSB2aXRlRW52XHJcbiAqL1xyXG5jb25zdCBjcmVhdGVWaXRlUHdhID0gKHZpdGVFbnY6IFZpdGVFbnYpOiBQbHVnaW5PcHRpb24gfCBQbHVnaW5PcHRpb25bXSA9PiB7XHJcbiAgICBjb25zdCB7IFZJVEVfR0xPQl9BUFBfVElUTEUgfSA9IHZpdGVFbnY7XHJcbiAgICByZXR1cm4gVml0ZVBXQSh7XHJcbiAgICAgICAgcmVnaXN0ZXJUeXBlOiBcImF1dG9VcGRhdGVcIixcclxuICAgICAgICBtYW5pZmVzdDoge1xyXG4gICAgICAgICAgICBuYW1lOiBWSVRFX0dMT0JfQVBQX1RJVExFLFxyXG4gICAgICAgICAgICBzaG9ydF9uYW1lOiBWSVRFX0dMT0JfQVBQX1RJVExFLFxyXG4gICAgICAgICAgICB0aGVtZV9jb2xvcjogXCIjZmZmZmZmXCIsXHJcbiAgICAgICAgICAgIGljb25zOiBbXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBcIi9sb2dvLnBuZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemVzOiBcIjE5MngxOTJcIixcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImltYWdlL3BuZ1wiXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHNyYzogXCIvbG9nby5wbmdcIixcclxuICAgICAgICAgICAgICAgICAgICBzaXplczogXCI1MTJ4NTEyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbWFnZS9wbmdcIlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBzcmM6IFwiL2xvZ28ucG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFwiNTEyeDUxMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiaW1hZ2UvcG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcHVycG9zZTogXCJhbnkgbWFza2FibGVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn07XHJcbiIsICJ7XHJcbiAgICBcIm5hbWVcIjogXCJ5Y19vcHNfYWRtaW5fdHNcIixcclxuICAgIFwicHJpdmF0ZVwiOiB0cnVlLFxyXG4gICAgXCJ2ZXJzaW9uXCI6IFwiMS4wLjBcIixcclxuICAgIFwidHlwZVwiOiBcIm1vZHVsZVwiLFxyXG4gICAgXCJzY3JpcHRzXCI6IHtcclxuICAgICAgICBcImRldlwiOiBcInZpdGVcIixcclxuICAgICAgICBcInNlcnZlXCI6IFwidml0ZVwiLFxyXG4gICAgICAgIFwiYnVpbGQ6ZGV2XCI6IFwidnVlLXRzYyAmJiB2aXRlIGJ1aWxkIC0tbW9kZSBkZXZlbG9wbWVudFwiLFxyXG4gICAgICAgIFwiYnVpbGQ6dGVzdFwiOiBcInZ1ZS10c2MgJiYgdml0ZSBidWlsZCAtLW1vZGUgdGVzdFwiLFxyXG4gICAgICAgIFwiYnVpbGQ6cHJvXCI6IFwidnVlLXRzYyAmJiB2aXRlIGJ1aWxkIC0tbW9kZSBwcm9kdWN0aW9uXCIsXHJcbiAgICAgICAgXCJ0eXBlOmNoZWNrXCI6IFwidnVlLXRzYyAtLW5vRW1pdCAtLXNraXBMaWJDaGVja1wiLFxyXG4gICAgICAgIFwicHJldmlld1wiOiBcIm5wbSBydW4gYnVpbGQ6ZGV2ICYmIHZpdGUgcHJldmlld1wiLFxyXG4gICAgICAgIFwibGludDplc2xpbnRcIjogXCJlc2xpbnQgLS1maXggLS1leHQgLmpzLC50cywudnVlIC4vc3JjXCIsXHJcbiAgICAgICAgXCJsaW50OnByZXR0aWVyXCI6IFwicHJldHRpZXIgLS13cml0ZSBcXFwic3JjLyoqLyoue2pzLHRzLGpzb24sdHN4LGNzcyxsZXNzLHNjc3MsdnVlLGh0bWwsbWR9XFxcIlwiLFxyXG4gICAgICAgIFwibGludDpzdHlsZWxpbnRcIjogXCJzdHlsZWxpbnQgLS1jYWNoZSAtLWZpeCBcXFwiKiovKi57dnVlLGxlc3MscG9zdGNzcyxjc3Msc2Nzc31cXFwiIC0tY2FjaGUgLS1jYWNoZS1sb2NhdGlvbiBub2RlX21vZHVsZXMvLmNhY2hlL3N0eWxlbGludC9cIixcclxuICAgICAgICBcImxpbnQ6bGludC1zdGFnZWRcIjogXCJsaW50LXN0YWdlZFwiLFxyXG4gICAgICAgIFwicHJlcGFyZVwiOiBcImh1c2t5IGluc3RhbGxcIixcclxuICAgICAgICBcInJlbGVhc2VcIjogXCJzdGFuZGFyZC12ZXJzaW9uXCIsXHJcbiAgICAgICAgXCJjb21taXRcIjogXCJnaXQgYWRkIC1BICYmIGN6ZyAmJiBnaXQgcHVzaFwiXHJcbiAgICB9LFxyXG4gICAgXCJkZXBlbmRlbmNpZXNcIjoge1xyXG4gICAgICAgIFwiQGVsZW1lbnQtcGx1cy9pY29ucy12dWVcIjogXCJeMi4xLjBcIixcclxuICAgICAgICBcIkB0eXBlcy9kZWNpbWFsLmpzXCI6IFwiXjcuNC4wXCIsXHJcbiAgICAgICAgXCJAdnVldXAvdnVlLXF1aWxsXCI6IFwiXjEuMi4wXCIsXHJcbiAgICAgICAgXCJAdnVldXNlL2NvcmVcIjogXCJeMTAuMS4yXCIsXHJcbiAgICAgICAgXCJAd2FuZ2VkaXRvci9lZGl0b3JcIjogXCJeNS4xLjIzXCIsXHJcbiAgICAgICAgXCJAd2FuZ2VkaXRvci9lZGl0b3ItZm9yLXZ1ZVwiOiBcIl41LjEuMTJcIixcclxuICAgICAgICBcImFzeW5jLXZhbGlkYXRvclwiOiBcIl40LjIuNVwiLFxyXG4gICAgICAgIFwiYXhpb3NcIjogXCJeMS40LjBcIixcclxuICAgICAgICBcImJ3aXAtanNcIjogXCJeNC4zLjJcIixcclxuICAgICAgICBcImNyeXB0by1qc1wiOiBcIl40LjIuMFwiLFxyXG4gICAgICAgIFwiZGF5anNcIjogXCJeMS4xMS45XCIsXHJcbiAgICAgICAgXCJkZWNpbWFsXCI6IFwiXjAuMC4yXCIsXHJcbiAgICAgICAgXCJkZWZhdWx0LXBhc3NpdmUtZXZlbnRzXCI6IFwiXjIuMC4wXCIsXHJcbiAgICAgICAgXCJkcml2ZXIuanNcIjogXCJeMC45LjhcIixcclxuICAgICAgICBcImVsZW1lbnQtcGx1c1wiOiBcIl4yLjMuNFwiLFxyXG4gICAgICAgIFwiZmlsZS1zYXZlclwiOiBcIl4yLjAuNVwiLFxyXG4gICAgICAgIFwianMtbWQ1XCI6IFwiXjAuNy4zXCIsXHJcbiAgICAgICAgXCJqc2JhcmNvZGVcIjogXCJeMy4xMS42XCIsXHJcbiAgICAgICAgXCJqc29ucGFja1wiOiBcIl4xLjEuNVwiLFxyXG4gICAgICAgIFwibG9kYXNoLWVzXCI6IFwiXjQuMTcuMjFcIixcclxuICAgICAgICBcIm1hdm9uLWVkaXRvclwiOiBcIl4zLjAuMlwiLFxyXG4gICAgICAgIFwibWl0dFwiOiBcIl4zLjAuMFwiLFxyXG4gICAgICAgIFwibnByb2dyZXNzXCI6IFwiXjAuMi4wXCIsXHJcbiAgICAgICAgXCJwaW5pYVwiOiBcIl4yLjEuM1wiLFxyXG4gICAgICAgIFwicGluaWEtcGx1Z2luLXBlcnNpc3RlZHN0YXRlXCI6IFwiXjMuMS4wXCIsXHJcbiAgICAgICAgXCJwcmludC1qc1wiOiBcIl4xLjYuMFwiLFxyXG4gICAgICAgIFwicXNcIjogXCJeNi4xMy4xXCIsXHJcbiAgICAgICAgXCJxdWlsbFwiOiBcIl4yLjAuM1wiLFxyXG4gICAgICAgIFwic29ydGFibGVqc1wiOiBcIl4xLjE1LjBcIixcclxuICAgICAgICBcInZ1ZVwiOiBcIl4zLjMuNFwiLFxyXG4gICAgICAgIFwidnVlLXJvdXRlclwiOiBcIl40LjIuMlwiLFxyXG4gICAgICAgIFwidnVlZHJhZ2dhYmxlXCI6IFwiXjQuMS4wXCIsXHJcbiAgICAgICAgXCJ2eGUtdGFibGVcIjogXCJeNC41LjAtYmV0YS4xMFwiLFxyXG4gICAgICAgIFwieGUtdXRpbHNcIjogXCJeMy41LjExXCIsXHJcbiAgICAgICAgXCJ4bHN4XCI6IFwiXjAuMTguNVwiXHJcbiAgICB9LFxyXG4gICAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xyXG4gICAgICAgIFwiQGNvbW1pdGxpbnQvY2xpXCI6IFwiXjE3LjYuM1wiLFxyXG4gICAgICAgIFwiQGNvbW1pdGxpbnQvY29uZmlnLWNvbnZlbnRpb25hbFwiOiBcIl4xNy42LjNcIixcclxuICAgICAgICBcIkBpY29uaWZ5LWpzb24vZXBcIjogXCJeMS4xLjEwXCIsXHJcbiAgICAgICAgXCJAdHlwZXMvY3J5cHRvLWpzXCI6IFwiXjQuMi4yXCIsXHJcbiAgICAgICAgXCJAdHlwZXMvZmlsZS1zYXZlclwiOiBcIl4yLjAuNVwiLFxyXG4gICAgICAgIFwiQHR5cGVzL2pzLW1kNVwiOiBcIl4wLjcuMFwiLFxyXG4gICAgICAgIFwiQHR5cGVzL25wcm9ncmVzc1wiOiBcIl4wLjIuMFwiLFxyXG4gICAgICAgIFwiQHR5cGVzL3FzXCI6IFwiXjYuOS43XCIsXHJcbiAgICAgICAgXCJAdHlwZXMvc29ydGFibGVqc1wiOiBcIl4xLjE1LjFcIixcclxuICAgICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9lc2xpbnQtcGx1Z2luXCI6IFwiXjUuNTkuN1wiLFxyXG4gICAgICAgIFwiQHR5cGVzY3JpcHQtZXNsaW50L3BhcnNlclwiOiBcIl41LjU5LjdcIixcclxuICAgICAgICBcIkB2aXRlanMvcGx1Z2luLXZ1ZVwiOiBcIl40LjIuM1wiLFxyXG4gICAgICAgIFwiQHZpdGVqcy9wbHVnaW4tdnVlLWpzeFwiOiBcIl4zLjAuMVwiLFxyXG4gICAgICAgIFwiYXV0b3ByZWZpeGVyXCI6IFwiXjEwLjQuMTRcIixcclxuICAgICAgICBcImN6LWdpdFwiOiBcIl4xLjYuMVwiLFxyXG4gICAgICAgIFwiY3pnXCI6IFwiXjEuNi4xXCIsXHJcbiAgICAgICAgXCJlc2xpbnRcIjogXCJeOC40MS4wXCIsXHJcbiAgICAgICAgXCJlc2xpbnQtY29uZmlnLXByZXR0aWVyXCI6IFwiXjguOC4wXCIsXHJcbiAgICAgICAgXCJlc2xpbnQtcGx1Z2luLXByZXR0aWVyXCI6IFwiXjQuMi4xXCIsXHJcbiAgICAgICAgXCJlc2xpbnQtcGx1Z2luLXZ1ZVwiOiBcIl45LjE0LjBcIixcclxuICAgICAgICBcImh1c2t5XCI6IFwiXjguMC4zXCIsXHJcbiAgICAgICAgXCJsaW50LXN0YWdlZFwiOiBcIl4xMy4yLjJcIixcclxuICAgICAgICBcInBvc3Rjc3NcIjogXCJeOC40LjIzXCIsXHJcbiAgICAgICAgXCJwb3N0Y3NzLWh0bWxcIjogXCJeMS41LjBcIixcclxuICAgICAgICBcInByZXR0aWVyXCI6IFwiXjIuOC44XCIsXHJcbiAgICAgICAgXCJxcmNvZGVcIjogXCJeMS41LjNcIixcclxuICAgICAgICBcInJvbGx1cC1wbHVnaW4tdmlzdWFsaXplclwiOiBcIl41LjkuMFwiLFxyXG4gICAgICAgIFwic2Fzc1wiOiBcIl4xLjYyLjFcIixcclxuICAgICAgICBcInN0YW5kYXJkLXZlcnNpb25cIjogXCJeOS41LjBcIixcclxuICAgICAgICBcInN0eWxlbGludFwiOiBcIl4xNS42LjJcIixcclxuICAgICAgICBcInN0eWxlbGludC1jb25maWctaHRtbFwiOiBcIl4xLjEuMFwiLFxyXG4gICAgICAgIFwic3R5bGVsaW50LWNvbmZpZy1yZWNlc3Mtb3JkZXJcIjogXCJeNC4wLjBcIixcclxuICAgICAgICBcInN0eWxlbGludC1jb25maWctcmVjb21tZW5kZWQtc2Nzc1wiOiBcIl4xMi4wLjBcIixcclxuICAgICAgICBcInN0eWxlbGludC1jb25maWctcmVjb21tZW5kZWQtdnVlXCI6IFwiXjEuNC4wXCIsXHJcbiAgICAgICAgXCJzdHlsZWxpbnQtY29uZmlnLXN0YW5kYXJkXCI6IFwiXjMzLjAuMFwiLFxyXG4gICAgICAgIFwic3R5bGVsaW50LWNvbmZpZy1zdGFuZGFyZC1zY3NzXCI6IFwiXjkuMC4wXCIsXHJcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCI6IFwiXjUuMC4yXCIsXHJcbiAgICAgICAgXCJ1bnBsdWdpbi1hdXRvLWltcG9ydFwiOiBcIl4wLjE2LjRcIixcclxuICAgICAgICBcInVucGx1Z2luLWljb25zXCI6IFwiXjAuMTYuM1wiLFxyXG4gICAgICAgIFwidW5wbHVnaW4tdnVlLWNvbXBvbmVudHNcIjogXCJeMC4yNS4xXCIsXHJcbiAgICAgICAgXCJ1bnBsdWdpbi12dWUtc2V0dXAtZXh0ZW5kLXBsdXNcIjogXCJeMS4wLjBcIixcclxuICAgICAgICBcInZpdGVcIjogXCJeNC4zLjlcIixcclxuICAgICAgICBcInZpdGUtcGx1Z2luLWNvbXByZXNzaW9uXCI6IFwiXjAuNS4xXCIsXHJcbiAgICAgICAgXCJ2aXRlLXBsdWdpbi1lc2xpbnRcIjogXCJeMS44LjFcIixcclxuICAgICAgICBcInZpdGUtcGx1Z2luLWh0bWxcIjogXCJeMy4yLjBcIixcclxuICAgICAgICBcInZpdGUtcGx1Z2luLXB3YVwiOiBcIl4wLjE1LjBcIixcclxuICAgICAgICBcInZpdGUtcGx1Z2luLXN2Zy1pY29uc1wiOiBcIl4yLjAuMVwiLFxyXG4gICAgICAgIFwidnVlLXRzY1wiOiBcIl4xLjYuNVwiXHJcbiAgICB9LFxyXG4gICAgXCJlbmdpbmVzXCI6IHtcclxuICAgICAgICBcIm5vZGVcIjogXCI+PTE2LjAuMFwiXHJcbiAgICB9LFxyXG4gICAgXCJicm93c2Vyc2xpc3RcIjoge1xyXG4gICAgICAgIFwicHJvZHVjdGlvblwiOiBbXHJcbiAgICAgICAgICAgIFwiPiAxJVwiLFxyXG4gICAgICAgICAgICBcIm5vdCBkZWFkXCIsXHJcbiAgICAgICAgICAgIFwibm90IG9wX21pbmkgYWxsXCJcclxuICAgICAgICBdLFxyXG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIjogW1xyXG4gICAgICAgICAgICBcImxhc3QgMSBjaHJvbWUgdmVyc2lvblwiLFxyXG4gICAgICAgICAgICBcImxhc3QgMSBmaXJlZm94IHZlcnNpb25cIixcclxuICAgICAgICAgICAgXCJsYXN0IDEgc2FmYXJpIHZlcnNpb25cIlxyXG4gICAgICAgIF1cclxuICAgIH0sXHJcbiAgICBcImNvbmZpZ1wiOiB7XHJcbiAgICAgICAgXCJjb21taXRpemVuXCI6IHtcclxuICAgICAgICAgICAgXCJwYXRoXCI6IFwibm9kZV9tb2R1bGVzL2N6LWdpdFwiXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBaVgsU0FBUyxjQUFjLGVBQXNDO0FBQzlhLFNBQVMsV0FBQUEsZ0JBQWU7OztBQ3FCakIsU0FBUyxXQUFXLFNBQThCO0FBQ3JELFFBQU0sTUFBVyxDQUFDO0FBRWxCLGFBQVcsV0FBVyxPQUFPLEtBQUssT0FBTyxHQUFHO0FBQ3hDLFFBQUksV0FBVyxRQUFRLE9BQU8sRUFBRSxRQUFRLFFBQVEsSUFBSTtBQUNwRCxlQUFXLGFBQWEsU0FBUyxPQUFPLGFBQWEsVUFBVSxRQUFRO0FBQ3ZFLFFBQUksWUFBWTtBQUFhLGlCQUFXLE9BQU8sUUFBUTtBQUN2RCxRQUFJLFlBQVksY0FBYztBQUMxQixVQUFJO0FBQ0EsbUJBQVcsS0FBSyxNQUFNLFFBQVE7QUFBQSxNQUNsQyxTQUFTLE9BQVA7QUFBQSxNQUFlO0FBQUEsSUFDckI7QUFDQSxRQUFJLE9BQU8sSUFBSTtBQUFBLEVBQ25CO0FBQ0EsU0FBTztBQUNYOzs7QUN6Qk8sU0FBUyxZQUFZLE9BQWtCLENBQUMsR0FBRztBQUM5QyxRQUFNLE1BQXVCLENBQUM7QUFDOUIsYUFBVyxDQUFDLFFBQVEsTUFBTSxLQUFLLE1BQU07QUFDakMsVUFBTSxVQUFVO0FBQ2hCLFVBQU0sVUFBVSxRQUFRLEtBQUssTUFBTTtBQUduQyxRQUFJLE1BQU0sSUFBSTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLGNB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