diff --git a/eslint.config.js b/eslint.config.js index 1f45368..376efef 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -29,7 +29,7 @@ export default [ dictionary: true, sensor: true, station: true, - material: true, + material: true, }, ecmaVersion: 2020, parser: parserVue, diff --git a/src/api/auth/mods/auth/login.ts b/src/api/auth/mods/auth/login.ts index efc7abd..2a18a7d 100644 --- a/src/api/auth/mods/auth/login.ts +++ b/src/api/auth/mods/auth/login.ts @@ -1,22 +1,22 @@ /** * @desc 登录 */ -import { defaultSuccess, defaultError, http } from '@/plugins/axios'; -import type { AxiosResponse } from 'axios'; +import { defaultSuccess, defaultError, http } from '@/plugins/axios' +import type { AxiosResponse } from 'axios' export default async function ( - /** 请求体 */ - requestBody: auth.LoginDTO, + /** 请求体 */ + requestBody: auth.LoginDTO, - success: (data: auth.AuthUser) => void = defaultSuccess, - fail: (error: { code: string; error?: string }) => void = defaultError, + success: (data: auth.AuthUser) => void = defaultSuccess, + fail: (error: { code: string; error?: string }) => void = defaultError, ): Promise { - return http({ - method: 'post', - url: `/auth/login`, - data: requestBody, - }) - .then((data: AxiosResponse) => { - success(data.data); - }) - .catch((error: { code: string; error?: string }) => fail(error)); + return http({ + method: 'post', + url: `/auth/login`, + data: requestBody, + }) + .then((data: AxiosResponse) => { + success(data.data) + }) + .catch((error: { code: string; error?: string }) => fail(error)) } diff --git a/src/api/material/mods/material/saveOrUpdateMaterial.ts b/src/api/material/mods/material/saveOrUpdateMaterial.ts index e6766d0..3ea477c 100644 --- a/src/api/material/mods/material/saveOrUpdateMaterial.ts +++ b/src/api/material/mods/material/saveOrUpdateMaterial.ts @@ -1,22 +1,22 @@ /** * @desc 增加/编辑物料 */ -import { defaultSuccess, defaultError, http } from '@/plugins/axios'; -import type { AxiosResponse } from 'axios'; +import { defaultSuccess, defaultError, http } from '@/plugins/axios' +import type { AxiosResponse } from 'axios' export default async function ( - /** 请求体 */ - requestBody: material.Material, + /** 请求体 */ + requestBody: material.Material, - success: (data: material.Material) => void = defaultSuccess, - fail: (error: { code: string; error?: string }) => void = defaultError, + success: (data: material.Material) => void = defaultSuccess, + fail: (error: { code: string; error?: string }) => void = defaultError, ): Promise { - return http({ - method: 'put', - url: `/material`, - data: requestBody, - }) - .then((data: AxiosResponse) => { - success(data.data); - }) - .catch((error: { code: string; error?: string }) => fail(error)); + return http({ + method: 'put', + url: `/material`, + data: requestBody, + }) + .then((data: AxiosResponse) => { + success(data.data) + }) + .catch((error: { code: string; error?: string }) => fail(error)) } diff --git a/src/plugins/axios.ts b/src/plugins/axios.ts index 1fea08e..da4ab7a 100644 --- a/src/plugins/axios.ts +++ b/src/plugins/axios.ts @@ -2,7 +2,7 @@ import { http } from '@/settings/http' import { useUserStore } from '@/stores/user' import axios, { InternalAxiosRequestConfig, type AxiosError, type AxiosResponse } from 'axios' import type { App } from 'vue' -import router from '@/router' +import { notification } from 'ant-design-vue' export interface GlobalError { /** 错误码 */ @@ -24,9 +24,13 @@ export function defaultSuccess(data: unknown): void { console.log(data) } export function defaultError(error: { code: string; error?: string }): void { - if (error) { - router.push({ path: '/message', query: { status: error.code, message: error.error } }) - } + window.console.log(error) + notification.error({ + message: '操作异常: ', + placement: 'top', + description: error.error + '(' + error.code + ')', + duration: null, + }) } const config = { baseURL: http.prefix, diff --git a/vite.config.ts b/vite.config.ts index b95741e..3b82e6b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -59,7 +59,7 @@ export default defineConfig(({ mode }) => { open: true, proxy: { '/api': { - // target: 'https://iot.riemann.tech/api/', + // target: 'https://ims.riemann.tech/api/', target: 'http://127.0.0.1:8888', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, ''), diff --git a/vite.config.ts.timestamp-1735107646682-da78b7e5d1808.mjs b/vite.config.ts.timestamp-1735107646682-da78b7e5d1808.mjs new file mode 100644 index 0000000..bcb8345 --- /dev/null +++ b/vite.config.ts.timestamp-1735107646682-da78b7e5d1808.mjs @@ -0,0 +1,93 @@ +// vite.config.ts +import { defineConfig } from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/vite@5.4.8_@types+node@22.5.3_less@4.2.1/node_modules/vite/dist/node/index.js"; +import vue from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/@vitejs+plugin-vue@5.1.4_vite@5.4.8_@types+node@22.5.3_less@4.2.1__vue@3.5.11_typescript@5.6.3_/node_modules/@vitejs/plugin-vue/dist/index.mjs"; +import { fileURLToPath, URL } from "url"; +import AutoImport from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/unplugin-auto-import@0.18.3_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-sources@3.2.3__@vueuse+cor_ct7nfw7obvg6oaanky5netyf4u/node_modules/unplugin-auto-import/dist/vite.js"; +import { visualizer } from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/rollup-plugin-visualizer@5.12.0_rollup@4.21.2/node_modules/rollup-plugin-visualizer/dist/plugin/index.js"; +import Components from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.25.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-so_yuxkh365t2exwvukyuvotdxtdq/node_modules/unplugin-vue-components/dist/vite.js"; +import { AntDesignVueResolver } from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/unplugin-vue-components@0.27.4_@babel+parser@7.25.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-so_yuxkh365t2exwvukyuvotdxtdq/node_modules/unplugin-vue-components/dist/resolvers.js"; +import viteCompression from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/vite-plugin-compression@0.5.1_vite@5.4.8_@types+node@22.5.3_less@4.2.1_/node_modules/vite-plugin-compression/dist/index.mjs"; +import vueJsx from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/@vitejs+plugin-vue-jsx@4.0.1_vite@5.4.8_@types+node@22.5.3_less@4.2.1__vue@3.5.11_typescript@5.6.3_/node_modules/@vitejs/plugin-vue-jsx/dist/index.mjs"; +import vueDevTools from "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/node_modules/.pnpm/vite-plugin-vue-devtools@7.4.6_@nuxt+kit@3.13.2_rollup@4.21.2_webpack-sources@3.2.3__rollup@4_ryihblh2z2o3v2ncveuo4sj7xy/node_modules/vite-plugin-vue-devtools/dist/vite.mjs"; +var __vite_injected_original_import_meta_url = "file:///E:/work_space/java-workspace/coding_hobby/ims/ims-front/vite.config.ts"; +var vite_config_default = defineConfig(({ mode }) => { + console.log(mode); + return { + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", __vite_injected_original_import_meta_url)) + } + }, + optimizeDeps: { + include: ["@ant-design/icons-vue", "ant-design-vue"] + }, + plugins: [ + vue(), + vueJsx(), + vueDevTools(), + process.env.npm_lifecycle_event === "report" ? visualizer({ open: true, brotliSize: true, filename: "report.html" }) : null, + viteCompression({ + threshold: 1024e3 + // 对大于 1mb 的文件进行压缩 + }), + AutoImport({ + dts: "src/auto-imports.d.ts", + imports: ["vue", "vue-router", "@vueuse/core"], + eslintrc: { + enabled: true, + filepath: "./.eslintrc-auto-import.json", + globalsPropValue: true + } + }), + Components({ + dts: "src/components.d.ts", + deep: true, + dirs: ["src/components"], + extensions: ["vue", "tsx"], + resolvers: [ + AntDesignVueResolver({ + importStyle: false + }) + ] + }) + ], + server: { + open: true, + proxy: { + "/api": { + // target: 'https://iot.riemann.tech/api/', + target: "http://127.0.0.1:8888", + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, "") + } + } + }, + esbuild: { + drop: ["console", "debugger"] + // 删除 所有的console 和 debugger + }, + build: { + chunkSizeWarningLimit: 1500, + rollupOptions: { + output: { + //每个node_modules模块分成一个js文件 + manualChunks(id) { + if (id.includes("node_modules")) { + return id.toString().split("node_modules/")[1].split("/")[1].toString(); + } + }, + // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值 + entryFileNames: "assets/js/[name].[hash].js", + // 用于命名代码拆分时创建的共享块的输出命名 + chunkFileNames: "assets/js/[name].[hash].js", + // 用于输出静态资源的命名,[ext]表示文件扩展名 + assetFileNames: "assets/[ext]/[name].[hash].[ext]" + } + } + } + }; +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFx3b3JrX3NwYWNlXFxcXGphdmEtd29ya3NwYWNlXFxcXGNvZGluZ19ob2JieVxcXFxpbXNcXFxcaW1zLWZyb250XCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCJFOlxcXFx3b3JrX3NwYWNlXFxcXGphdmEtd29ya3NwYWNlXFxcXGNvZGluZ19ob2JieVxcXFxpbXNcXFxcaW1zLWZyb250XFxcXHZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9FOi93b3JrX3NwYWNlL2phdmEtd29ya3NwYWNlL2NvZGluZ19ob2JieS9pbXMvaW1zLWZyb250L3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSdcclxuXHJcbmltcG9ydCB2dWUgZnJvbSAnQHZpdGVqcy9wbHVnaW4tdnVlJ1xyXG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBVUkwgfSBmcm9tICd1cmwnXHJcblxyXG5pbXBvcnQgQXV0b0ltcG9ydCBmcm9tICd1bnBsdWdpbi1hdXRvLWltcG9ydC92aXRlJ1xyXG5pbXBvcnQgeyB2aXN1YWxpemVyIH0gZnJvbSAncm9sbHVwLXBsdWdpbi12aXN1YWxpemVyJ1xyXG5pbXBvcnQgQ29tcG9uZW50cyBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy92aXRlJ1xyXG5pbXBvcnQgeyBBbnREZXNpZ25WdWVSZXNvbHZlciB9IGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3Jlc29sdmVycydcclxuaW1wb3J0IHZpdGVDb21wcmVzc2lvbiBmcm9tICd2aXRlLXBsdWdpbi1jb21wcmVzc2lvbidcclxuaW1wb3J0IHZ1ZUpzeCBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUtanN4J1xyXG5pbXBvcnQgdnVlRGV2VG9vbHMgZnJvbSAndml0ZS1wbHVnaW4tdnVlLWRldnRvb2xzJ1xyXG5cclxuLy8gaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy9cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKCh7IG1vZGUgfSkgPT4ge1xyXG5cdGNvbnNvbGUubG9nKG1vZGUpXHJcblx0cmV0dXJuIHtcclxuXHRcdHJlc29sdmU6IHtcclxuXHRcdFx0YWxpYXM6IHtcclxuXHRcdFx0XHQnQCc6IGZpbGVVUkxUb1BhdGgobmV3IFVSTCgnLi9zcmMnLCBpbXBvcnQubWV0YS51cmwpKSxcclxuXHRcdFx0fSxcclxuXHRcdH0sXHJcblx0XHRvcHRpbWl6ZURlcHM6IHtcclxuXHRcdFx0aW5jbHVkZTogWydAYW50LWRlc2lnbi9pY29ucy12dWUnLCAnYW50LWRlc2lnbi12dWUnXSxcclxuXHRcdH0sXHJcblx0XHRwbHVnaW5zOiBbXHJcblx0XHRcdHZ1ZSgpLFxyXG5cdFx0XHR2dWVKc3goKSxcclxuXHRcdFx0dnVlRGV2VG9vbHMoKSxcclxuXHRcdFx0cHJvY2Vzcy5lbnYubnBtX2xpZmVjeWNsZV9ldmVudCA9PT0gJ3JlcG9ydCdcclxuXHRcdFx0XHQ/IHZpc3VhbGl6ZXIoeyBvcGVuOiB0cnVlLCBicm90bGlTaXplOiB0cnVlLCBmaWxlbmFtZTogJ3JlcG9ydC5odG1sJyB9KVxyXG5cdFx0XHRcdDogbnVsbCxcclxuXHRcdFx0dml0ZUNvbXByZXNzaW9uKHtcclxuXHRcdFx0XHR0aHJlc2hvbGQ6IDEwMjQwMDAsIC8vIFx1NUJGOVx1NTkyN1x1NEU4RSAxbWIgXHU3Njg0XHU2NTg3XHU0RUY2XHU4RkRCXHU4ODRDXHU1MzhCXHU3RjI5XHJcblx0XHRcdH0pLFxyXG5cdFx0XHRBdXRvSW1wb3J0KHtcclxuXHRcdFx0XHRkdHM6ICdzcmMvYXV0by1pbXBvcnRzLmQudHMnLFxyXG5cdFx0XHRcdGltcG9ydHM6IFsndnVlJywgJ3Z1ZS1yb3V0ZXInLCAnQHZ1ZXVzZS9jb3JlJ10sXHJcblxyXG5cdFx0XHRcdGVzbGludHJjOiB7XHJcblx0XHRcdFx0XHRlbmFibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0ZmlsZXBhdGg6ICcuLy5lc2xpbnRyYy1hdXRvLWltcG9ydC5qc29uJyxcclxuXHRcdFx0XHRcdGdsb2JhbHNQcm9wVmFsdWU6IHRydWUsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0fSksXHJcblx0XHRcdENvbXBvbmVudHMoe1xyXG5cdFx0XHRcdGR0czogJ3NyYy9jb21wb25lbnRzLmQudHMnLFxyXG5cdFx0XHRcdGRlZXA6IHRydWUsXHJcblx0XHRcdFx0ZGlyczogWydzcmMvY29tcG9uZW50cyddLFxyXG5cdFx0XHRcdGV4dGVuc2lvbnM6IFsndnVlJywgJ3RzeCddLFxyXG5cdFx0XHRcdHJlc29sdmVyczogW1xyXG5cdFx0XHRcdFx0QW50RGVzaWduVnVlUmVzb2x2ZXIoe1xyXG5cdFx0XHRcdFx0XHRpbXBvcnRTdHlsZTogZmFsc2UsXHJcblx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRdLFxyXG5cdFx0XHR9KSxcclxuXHRcdF0sXHJcblx0XHRzZXJ2ZXI6IHtcclxuXHRcdFx0b3BlbjogdHJ1ZSxcclxuXHRcdFx0cHJveHk6IHtcclxuXHRcdFx0XHQnL2FwaSc6IHtcclxuXHRcdFx0XHRcdC8vIHRhcmdldDogJ2h0dHBzOi8vaW90LnJpZW1hbm4udGVjaC9hcGkvJyxcclxuXHRcdFx0XHRcdHRhcmdldDogJ2h0dHA6Ly8xMjcuMC4wLjE6ODg4OCcsXHJcblx0XHRcdFx0XHRjaGFuZ2VPcmlnaW46IHRydWUsXHJcblx0XHRcdFx0XHRyZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKC9eXFwvYXBpLywgJycpLFxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0ZXNidWlsZDoge1xyXG5cdFx0XHRkcm9wOiBbJ2NvbnNvbGUnLCAnZGVidWdnZXInXSwgLy8gXHU1MjIwXHU5NjY0IFx1NjI0MFx1NjcwOVx1NzY4NGNvbnNvbGUgXHU1NDhDIGRlYnVnZ2VyXHJcblx0XHR9LFxyXG5cdFx0YnVpbGQ6IHtcclxuXHRcdFx0Y2h1bmtTaXplV2FybmluZ0xpbWl0OiAxNTAwLFxyXG5cdFx0XHRyb2xsdXBPcHRpb25zOiB7XHJcblx0XHRcdFx0b3V0cHV0OiB7XHJcblx0XHRcdFx0XHQvL1x1NkJDRlx1NEUyQW5vZGVfbW9kdWxlc1x1NkEyMVx1NTc1N1x1NTIwNlx1NjIxMFx1NEUwMFx1NEUyQWpzXHU2NTg3XHU0RUY2XHJcblx0XHRcdFx0XHRtYW51YWxDaHVua3MoaWQpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGlkLmluY2x1ZGVzKCdub2RlX21vZHVsZXMnKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBpZC50b1N0cmluZygpLnNwbGl0KCdub2RlX21vZHVsZXMvJylbMV0uc3BsaXQoJy8nKVsxXS50b1N0cmluZygpXHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHQvLyBcdTc1MjhcdTRFOEVcdTRFQ0VcdTUxNjVcdTUzRTNcdTcwQjlcdTUyMUJcdTVFRkFcdTc2ODRcdTU3NTdcdTc2ODRcdTYyNTNcdTUzMDVcdThGOTNcdTUxRkFcdTY4M0NcdTVGMEZbbmFtZV1cdTg4NjhcdTc5M0FcdTY1ODdcdTRFRjZcdTU0MEQsW2hhc2hdXHU4ODY4XHU3OTNBXHU4QkU1XHU2NTg3XHU0RUY2XHU1MTg1XHU1QkI5aGFzaFx1NTAzQ1xyXG5cdFx0XHRcdFx0ZW50cnlGaWxlTmFtZXM6ICdhc3NldHMvanMvW25hbWVdLltoYXNoXS5qcycsIC8vIFx1NzUyOFx1NEU4RVx1NTQ3RFx1NTQwRFx1NEVFM1x1NzgwMVx1NjJDNlx1NTIwNlx1NjVGNlx1NTIxQlx1NUVGQVx1NzY4NFx1NTE3MVx1NEVBQlx1NTc1N1x1NzY4NFx1OEY5M1x1NTFGQVx1NTQ3RFx1NTQwRFxyXG5cdFx0XHRcdFx0Y2h1bmtGaWxlTmFtZXM6ICdhc3NldHMvanMvW25hbWVdLltoYXNoXS5qcycsIC8vIFx1NzUyOFx1NEU4RVx1OEY5M1x1NTFGQVx1OTc1OVx1NjAwMVx1OEQ0NFx1NkU5MFx1NzY4NFx1NTQ3RFx1NTQwRFx1RkYwQ1tleHRdXHU4ODY4XHU3OTNBXHU2NTg3XHU0RUY2XHU2MjY5XHU1QzU1XHU1NDBEXHJcblx0XHRcdFx0XHRhc3NldEZpbGVOYW1lczogJ2Fzc2V0cy9bZXh0XS9bbmFtZV0uW2hhc2hdLltleHRdJyxcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHR9LFxyXG5cdFx0fSxcclxuXHR9XHJcbn0pXHJcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBbVcsU0FBUyxvQkFBb0I7QUFFaFksT0FBTyxTQUFTO0FBQ2hCLFNBQVMsZUFBZSxXQUFXO0FBRW5DLE9BQU8sZ0JBQWdCO0FBQ3ZCLFNBQVMsa0JBQWtCO0FBQzNCLE9BQU8sZ0JBQWdCO0FBQ3ZCLFNBQVMsNEJBQTRCO0FBQ3JDLE9BQU8scUJBQXFCO0FBQzVCLE9BQU8sWUFBWTtBQUNuQixPQUFPLGlCQUFpQjtBQVh5TSxJQUFNLDJDQUEyQztBQWNsUixJQUFPLHNCQUFRLGFBQWEsQ0FBQyxFQUFFLEtBQUssTUFBTTtBQUN6QyxVQUFRLElBQUksSUFBSTtBQUNoQixTQUFPO0FBQUEsSUFDTixTQUFTO0FBQUEsTUFDUixPQUFPO0FBQUEsUUFDTixLQUFLLGNBQWMsSUFBSSxJQUFJLFNBQVMsd0NBQWUsQ0FBQztBQUFBLE1BQ3JEO0FBQUEsSUFDRDtBQUFBLElBQ0EsY0FBYztBQUFBLE1BQ2IsU0FBUyxDQUFDLHlCQUF5QixnQkFBZ0I7QUFBQSxJQUNwRDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1IsSUFBSTtBQUFBLE1BQ0osT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLE1BQ1osUUFBUSxJQUFJLHdCQUF3QixXQUNqQyxXQUFXLEVBQUUsTUFBTSxNQUFNLFlBQVksTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUNwRTtBQUFBLE1BQ0gsZ0JBQWdCO0FBQUEsUUFDZixXQUFXO0FBQUE7QUFBQSxNQUNaLENBQUM7QUFBQSxNQUNELFdBQVc7QUFBQSxRQUNWLEtBQUs7QUFBQSxRQUNMLFNBQVMsQ0FBQyxPQUFPLGNBQWMsY0FBYztBQUFBLFFBRTdDLFVBQVU7QUFBQSxVQUNULFNBQVM7QUFBQSxVQUNULFVBQVU7QUFBQSxVQUNWLGtCQUFrQjtBQUFBLFFBQ25CO0FBQUEsTUFDRCxDQUFDO0FBQUEsTUFDRCxXQUFXO0FBQUEsUUFDVixLQUFLO0FBQUEsUUFDTCxNQUFNO0FBQUEsUUFDTixNQUFNLENBQUMsZ0JBQWdCO0FBQUEsUUFDdkIsWUFBWSxDQUFDLE9BQU8sS0FBSztBQUFBLFFBQ3pCLFdBQVc7QUFBQSxVQUNWLHFCQUFxQjtBQUFBLFlBQ3BCLGFBQWE7QUFBQSxVQUNkLENBQUM7QUFBQSxRQUNGO0FBQUEsTUFDRCxDQUFDO0FBQUEsSUFDRjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ1AsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLFFBQ04sUUFBUTtBQUFBO0FBQUEsVUFFUCxRQUFRO0FBQUEsVUFDUixjQUFjO0FBQUEsVUFDZCxTQUFTLENBQUMsU0FBUyxLQUFLLFFBQVEsVUFBVSxFQUFFO0FBQUEsUUFDN0M7QUFBQSxNQUNEO0FBQUEsSUFDRDtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1IsTUFBTSxDQUFDLFdBQVcsVUFBVTtBQUFBO0FBQUEsSUFDN0I7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNOLHVCQUF1QjtBQUFBLE1BQ3ZCLGVBQWU7QUFBQSxRQUNkLFFBQVE7QUFBQTtBQUFBLFVBRVAsYUFBYSxJQUFJO0FBQ2hCLGdCQUFJLEdBQUcsU0FBUyxjQUFjLEdBQUc7QUFDaEMscUJBQU8sR0FBRyxTQUFTLEVBQUUsTUFBTSxlQUFlLEVBQUUsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxTQUFTO0FBQUEsWUFDdkU7QUFBQSxVQUNEO0FBQUE7QUFBQSxVQUVBLGdCQUFnQjtBQUFBO0FBQUEsVUFDaEIsZ0JBQWdCO0FBQUE7QUFBQSxVQUNoQixnQkFBZ0I7QUFBQSxRQUNqQjtBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUNELENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==