用vue-cli3从0开始搭建一个多入口,国际化的前端项目__Vue.js
发布于 4 年前 作者 banyungong 1337 次浏览 来自 分享
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

前言

大家好,我是Frank。最近公司准备开发一个功能,由于功能复杂,且需要多端协同开发,所以,单拎出来新建了一个git项目。项目中用到的技术也是大家耳熟能详的,比如,vue-cli3、vie-router、vue-i18n、element-ui、dayjs、eslint、stylelint等等。下面带大家一起看一下整个过程。

项目简介

该项目是一个大项目单拎出来的一个大的模块功能,因为涉及多端协作同步开发。

项目目录

![项目目录][directory]

遇到的问题

多入口

因为项目需要多端协同开发,所以设置了多入口,这样大家就可以在一个项目上共同开发了。根据 vue-cli3 官方文档进行配置,项目最外层添加 vue.config.js 文件,并作如下配置

// 配置文件信息
var pageData = {
  publicPath: '/client', // 项目文件部署的目录,例 https:www.baidu.com/saas
  assetsDir: `assets`, // 项目中静态资源目录,若不需要可以不配置
  outputDir: `./dist`, // 项目文件打包后输出的问卷目录
  buildVersion: new Date().valueOf(),
  entry: `./src/pages/main.js`, // 项目入口文件
  template: `./src/pages/index.html`, // 项目默认html模板
  filename: 'index.html',
  title: `...`,
}
// 根据不同入口配置
switch (pageName){
  case 'pc':
  case 'mb':
    pageData.publicPath = `/client/team/${pageName}`;
    pageData.outputDir = `./dist/client/team/${pageName}`;
    pageData.entry = `./src/main_${pageName}.js`;
    pageData.template = `./src/index_${pageName}.html`;
    break;
  case 'www':
    pageData.publicPath = `/saas/team/${pageName}`;
    pageData.outputDir = `./dist/client/team/${pageName}`;
    pageData.entry = `./src/main_${pageName}.js`;
    pageData.template = `./src/index_${pageName}.html`;
    break;
  default:
    pageData.publicPath = `/saas/team/${pageName}`;
    pageData.outputDir = `./dist/client/team/${pageName}`;
    pageData.entry = `./src/main_${pageName}.js`;
    pageData.template = `./src/index_${pageName}.html`;
    break;
}
module.exports = {
  publicPath: pageData.publicPath,
  assetsDir: pageData.assetsDir,
  outputDir: pageData.outputDir,
  productionSourceMap: false, // 是否开启生产模式下的sourceMap压缩
  lintOnSave: true, // 是否开始eslint校验的控制台打印错误信息
  css: {
    loaderOptions: {
      css: {},
      postcss: {
        plugins: (loader)=>[
          // Add the plugin
          new IconfontWebpackPlugin(loader), // 一个插件,用于将icon转为svg,兼容低版本浏览器,可以忽略
        ]
      }
    }
  },
  chainWebpack: (config)=>{
    config.resolve.alias
      .set('@', resolve('src'))
      .set('_assets', resolve('src/assets')); // 路径别名
    fs.remove(pageData.outputDir + '/' + pageData.assetsDir); // 打包文件路径,每次打包之前删除旧的文件
  },
  // devServer的相关配置可以查看vue-cli官网
  devServer: {
    disableHostCheck: true,
    host: hosts.local,
    openPage: pageData.filename,
    progress: false,
    port: port,
    proxy: {
      '^/assets': {
        target: 'http://localhost:8501',
        changeOrigin: true,
        pathRwrite: {
          '/config/': '/server/' + hosts.base + '/config/',
          '/': '/'
        }
      }
    },
  },
  // 真正启动的项目对应的入口文件
  pages: {[pageName]: {
    buildVersion: pageData.buildVersion,
    entry: pageData.entry,
    template: pageData.template,
    filename: pageData.filename,
    title: pageData.title,
  }}
}

以上是主要内容,作用在注释中说明。仔细看过后就会发现其实就是多个入口的参数按照规则匹配到正确的入口,最终还是输出的单个入口,最后在添加好对应的入口文件即可。详细内容建议查看vue-cli官方文档

国际化

因为项目需要做海外版。同样使用官方推荐的插件 vue-i18n。由于有些插件还需要单独配置国际化,所以下面单独来说每一部分的具体配置:

  • 项目本身多语言抽取

我们在 lang 文件目录下抽取项目中的语言文件包,然后抛出来,在 index.js 中配置,最后在 main.js 中引入即可。先来看下 lang 文件目录

lang文件目录

下面看一下 index.js 文件的配置信息

import Vue from 'vue';
import VueI18n from 'vue-i18n';
import messages from '@/lang/en';
import axios from 'axios';
Vue.use(VueI18n);
// 初始化i18n实例
export const i18n = new VueI18n({
  locale: 'en', // 设置语言环境
  fallbackLocale: 'en',
  messages: {en: messages} // 设置语言环境信息,注意这里的书写方法
})
const loadedLanguages = ['en'] // 我们的预装默认语言
// 设置浏览器的语言
function setI18nLanguage(lang){
  i18n.locale = lang;
  axios.defaults.headers.common['Accept-Language'] = lang;
  document.querySelector('html').setAttribute('lang', lang);
  return lang;
}
// 按需加载语言包
export function loadLanguageAsync(lang){
  if (i18n.locale !== lang){
    if (!loadedLanguages.includes(lang)){
      return import(/* webpackChunkName: "lang-[request]" */ '@/lang/' + lang).then(msgs=>{
        i18n.setLocaleMessage(lang, msgs.default);
        loadedLanguages.push(lang);
        return setI18nLanguage(lang);
      })
    }
    return Promise.resolve(setI18nLanguage(lang));
  }
  return Promise.resolve(lang);
}

以上是主要内容,依然是在注释中解释代码作用,希望大家仔细阅读。需要注意的是默认加载的语言包最终引入的就是你语言包里抛出的内容,如果语言包没有配置语言类型,需要自己加上语言类型 en。这也是官网推荐的示例。下面来看下 main.js 配置

import Vue from 'vue';
import App from './app_saas.vue';
import {i18n, loadLanguageAsync} from '@/lang/index.js';
import VueCookie from 'vue-cookie';

Vue.config.productionTip = false;
// 判断需要加载的语言包
let routeQueryLang = router.resolve(window.location.hash.substr(1)).route.query.lang;
if (routeQueryLang){
  VueCookie.set('locationArgumentLang', routeQueryLang === 'zh-CN' ? 'zh-CN' : 'en');
}               
let siteLanguage = VueCookie.get('locationArgumentLang') || navigator.language || 'zh-CN';
loadLanguageAsync(siteLanguage);
// 生成Vue实例,并将初始化好的 i18n 实例挂载到Vue上即可
new Vue({
  router,
  i18n,
  render: h=>h(App),
}).$mount('#app')

因为项目中判断给用户加载的语言的逻辑是这样的:如果用户选择了某种语言,那么会存到 cookie 中,下次会默认加载该语言;若没有设置,那就会取浏览器的语言;若还没有,会默认加载英文。

  • element-ui 多语言配置

在上面基础上再添加 element-ui 的语言包,然后 main.js 中添加如下代码

Vue.use(ElementUI, {
  i18n: (key, value)=>i18n.t(key, value)
})

同样是官网推荐配置

  • dayjs 多语言配置

index.js 中添加如下代码

// 按需加载dayjs语言包
function loadLanguageDayjs(lang){
  lang = lang.toLowerCase();
  return import('dayjs/locale/' + lang).then(()=>{
    return dayjs.locale(lang);
  })
}

需要注意的是 dayjs 中参数都是小写的,比如中文 element-uizh-CNdayjszh-cn。详细内容见官网推荐配置

eslint 配置

因为要规范代码风格,所以引入了 eslint 来校验。

首先,项目中需要引入以下插件

yarn add --dev @vue/cli-plugin-babel @vue/cli-plugin-babel babel-eslint eslint eslint-plugin-vue

其次,项目最外层添加文件 .eslintrc.js ,下面是我项目中的配置

module.exports = {
  root: true, // 检测到最近一级.eslintrc*
  env: {
    es6: true, // 支持并启用es6语法
    node: true, // 支持node语法及变量
    browser: true, // 支持浏览器全局变量
  },
  extends: ['plugin:vue/recommended', 'eslint:recommended'], // 第三方插件
  plugins: ['vue'],
  parserOptions: {
    parser: 'babel-eslint', // 解析器,默认使用Espree
    ecmaVersion: 2018,
    sourceType: 'module', // 指定文件来源类型,"script" (默认) 或 "module"(如果你的代码是 ECMAScript 模块)
  },
  // 全局变量不做校验
  globals: {
    moment: 'writable',
    Vue: 'writable',
    VueRouter: 'writable',
    VueI18n: 'writable',
    ELEMENT: 'writable',
    TWEEN: 'writable',
    _: 'writable',
  },
  rules: {
    indent: ['error', 2, {SwitchCase: 1}],
    'no-debugger': 0,
    'no-console': 1,
    'no-unused-vars': 1,
    eqeqeq: 2,
    quotes: ['error', 'single', {'allowTemplateLiterals': true}],
    'no-irregular-whitespace': 2, // 禁止不规则的空格
    'no-multi-spaces': 'error', // 禁止多个空格
    'space-infix-ops': 2, // 运算符前后禁止多个空格
    'array-bracket-spacing': ['error', 'never'], // 数组统一空格
    'block-spacing': ['error', 'always'],
    'comma-spacing': ['error'],
    'comma-style': ['error', 'last'],
    'computed-property-spacing': ['error', 'never'],
    'func-call-spacing': ['error', 'never'],
    'key-spacing': ['error', {'beforeColon': false, 'afterColon': true}], // 冒号空格
    'keyword-spacing': ['error', {'before': true}], //if () {}空格else
    'no-whitespace-before-property': 'error',
    'semi-spacing': 'error', //分号空格
    'space-before-blocks': ['error', 'never'], //function name()空格{}
    'space-before-function-paren': ['error', 'never'], //function name空格(){}
    'space-in-parens': ['error', 'never'],
    'arrow-spacing': ['error', {'before': false, 'after': false}], //()空格=>空格{}
    'rest-spread-spacing': ['error', 'never'], // 空格...空格{}
    'no-unreachable': 1,
    'no-trailing-spaces': 2,
    'object-curly-spacing': ['error', 'never'],
    // 'vetur.validation.template': false,
    // 'vue/valid-template-root': 'off',
    'vue/no-v-html': 0,
    'vue/component-tags-order': ['error', {'order': ['style', 'template', 'script']}],
    'vue/html-quotes': ['error', 'double'],
    'vue/require-v-for-key': 1, // v-for要有key
    'vue/html-self-closing': 'off', // 标签闭合
    'vue/html-closing-bracket-newline': ['error', {
      'singleline': 'never',
      'multiline': 'never'
    }],
    'vue/html-closing-bracket-spacing': 'error', // 标签后是否允许空格
    'vue/html-end-tags': 'error', // 标签自我关闭
    'vue/mustache-interpolation-spacing': 'error', // 标签插值中前后固定一个空格
    'vue/no-reserved-component-names': 'error', // 禁止保留名称
    'vue/no-unsupported-features': 1, // 未支持的语法
    'vue/no-unused-components': 1, // 未注册的组件
    'vue/padding-line-between-blocks': 1, //
    'vue/no-use-v-if-with-v-for': 1,
    // "vue/static-class-names-order": 1, // name属性
    'vue/max-attributes-per-line': ['error', { // 单行和多行属性数量
      'singleline': 10,
      'multiline': {
        'max': 1,
        'allowFirstLine': false
      }
    }],
  },
};

大家可以按照自己需要的规范来配置,具体配置规则见eslint官网eslint-plugin-vue官网

最后,我们需要忽略一部分文件的校验。那么我们需要在 .eslintrc.js 同级添加 .eslintignore ,以下是我们项目忽略内容,大家可以根据实际情况配置

node_modules
dist

stylelint 配置

可能大多数开发人员不会去规范css书写,因为我们leader要求,所以添加了。

首先,需要加载以下插件

yarn add --dev stylelint stylelint-config-standard stylelint-order

其次,同eslint,添加 .stylelintrc.js 文件,并作如下配置

module.exports = {
  extends: ['stylelint-config-standard'],
  plugins: ["stylelint-order"],
  rules:{
    'no-descending-specificity':null,
    'function-url-quotes': 'always',
    'string-quotes': 'double', 
    'indentation': 2,
    'color-hex-case': 'upper',
    'color-hex-length': 'long',
    'rule-empty-line-before': 'never',
    'font-family-no-missing-generic-family-keyword': null,
    'block-opening-brace-space-before':'always',
    'property-no-unknown':null,
    'no-empty-source':null,
  } 
}

这里直接使用了插件规则 stylelint-config-standardstylelint-orderstylelint官网

最后,同样忽略的文件需要在 stylelintignore 中配置

  dist
  node_modules

后记

好了,这次的分享到这里,希望对大家有所帮助,如果可以的话,给点个赞哦。嘻嘻~~

[directory]:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARoAAALaCAYAAADus5yTAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAEWLSURBVHhe7Z1rk1zFmaD3l8zXllqtS7dutO6yEJKg1QjMnQ6wZGMPhhluizzDJTCSLcYg1ithAxYdMLAsmkUtM1oLsLUaEQhWdgREOIiY2Pm0n/aHvJuXc8nMk6e6qrqy65zq58MTrpO3c4rw+ygzq8+b/+nIkSMCADAo/uZv/qYCogGAgRIVzdjYmAAADApEAwDJQTQAkBxEAwDJQTQAkBxEAwDJQTQAkBxEAwDJSSqayemtMhkpL5mUrdOTkXIAGCUSimZO3rryZ7n02lyNbCblJ2c/l+ufn5W5aL3l6Lnr8u2331ounijLLs7L/Be6fEFOmLZHs2vL9XNHvXEAYHgkFI1i8icyfzUmm0wyV96Sn0y65QEnF+TbL+blaFBu5XNd5n+Yl1nJlHI5IfOIBqAxpBWNpiKbcibTUTKaH87L9WLGUmJnNHZ2U7SLCAkAmkF60Wgy2Xx+9nF5/O2r3UkmR89qzHKoFE5FNLqNew0AjWJ5RKMxsvlW/tyLZFycZVRUNMxoABrL8olmqTjLqIpoxk7IgrcBzB4NQJNotmiKZZOm3PytikZjZZO3Xzjp1gHAMGm2aABgJEA0AJAcRAMAyUE0AJAcRAMAyUE0AJCcZRHNfffdFy0HgJUBogGA5CAaAEgOogGA5CAaAEgOogGA5DRDNPeflkufLpJtb8CcuPgtOWwAlolmiKbb1J4A0EoaIhpNDyk+AaBVNEg0mt5lY3LTFHloquk+zRIpkqNGl3NSAsDy0DDRaJRssrzCi6fmPCrzF8sUnu6+Sy6gQi4mQ1+ZPAvRACwfzRSNmtX8+epbvecAdpKUx7LwuXJBNADLR8NEMylzr11Skpnvfp/GS/cZzGgC0egyRAOw/DRINH1Kxj39oIsZTb6UQjQAy0dDRNOHZBShTLQ8PNG4p1mamU+5WYxoAJaPZojmwbPy+ZXeJGPxz9teuBjOaPLzuTXuEbqIBmA5aYZoEhBbOgHAcEA0AJAcRAMAyRlZ0QBAc0A0AJAcRAMAyUE0AJAcRAMAyUE0AJAcRAMAyUE0AJAcRAMAyWmGaIZwCgIALB/NEE2WVa+RpyCYFKBlegkA6J2GiEbT0FMQEA3AkmmQaDSDOwVhbOyELBTlTi4aI45I+1h5kCbUTQMalgFAPQ0TjWYQpyDYhFju8SoWLR8/AVa03E0RGsxoeCscoHeaKZoBnIIQz6AXF1BVHlo8mVzCpZMrIQDoioaJZnCnILhpPn3hlEuqXDj+8isnm+FE9miK9ggHoCsaJJrBnoJQsvgySoujdq8lIpocllEA3dEQ0Qz+FASXRZdRRiaxvZu8Li4allEA3dEM0Qz8FAS/vJRPuWzSePKpXYKVvzLp9v4yq0ZAAODRDNEAwEiDaAAgOYgGAJKDaAAgOYgGAJKDaAAgOYgGAJKDaAAgOYgGAJKDaAAgOYgGAJKDaAAgOc0QDacgAIw0zRBNllWvkacgNJFOqSsAGkhDRKNp6CkITQTRQMtokGg0/cjGzz1T5pjxc8+4+WVswqz5sp9JXuWM4yazyoPazVcTJNfyc9S4CbSyLH4n9Rhd9A1y4Fw/d8L5bplYgrw5+fetGwegCTRMNJoeT0FQgejKZd58Dsv9LHs2KHMh5ILxr4u+RjRu8Ab1JvCd2YU328hkV4jLXhdpRYMMfe4z2mRbpbTMdf4M4YwmGAegaTRTNN2egqADLhZgscBz2toZTfmvfsfrMKg1xfhWOmE+Yi0FW5bNaJwUoaVMIn31uNl9XekUdfl3Cp8p9owADaJhoukxd7ATmIuX66C3wbhk0RTS0rLwRaLR/a0kqqIp66xo3GWQIZNJRTTFPbPPMfmZMRAONI8GiWYApyB0KncCdcmiKUTW+4zGF01VUjk9iyan7r8JwBBpiGj6OwUh3/MoAzLfownL/cDtXTT+Pdx9FtPWDXpPAp1Ek/WtkULfoulUBzAkmiGavk9B0NjAz5ce5ezCL3eDtqNYwusscOd1WWSson1xLzfIO4tGo4VS9i2fv6NonH6mTbFs0tTPkgCGRTNE02SYIQAsGUSzGIgGYMkgmsVANABLBtEAQHIQDQAkB9EAQHIQDQAkB9EAQHIQDQAkB9EAQHIQDQAkB9EAQHKaIZolnYJQvjy5cNJ+rn0xEQCGQjNEk2XV6+cUhPDNaxdPNORpARgaDRGNpr9TEMK0Cy6IBqAZNEg0mt5kk+dksegXH/38L7lo/HwxTs4a88Kk29+W21lSfkoCL1QCLJWGiUbTyykI4YwmLhpTV5nRBEmpnHorJhJIAQyKZoqm21MQFP2Kxs5a3L0d3dfOXqp1ALAUGiaa3nMHL0k0znLKYvsiGoDB0iDR9JegfCmiKfv5IBqAwdIQ0fR7CkL/orEbwWVbF0QDMFiaIZolnILQtWicA9uKX520fNylUyYXRAMwWJohGgAYaRANACQH0QBAchANACQH0QBAchANACQH0QBAchANACQH0QBAchANACQH0QBAchANACSnGaLp+xQE/yVKAGgmzRBNllWv91MQEA1AG2iIaDT9nIKAaADaQINEo+lVNoFovFMNwtMOFuSEk3/Gz66nx8n7Ze3IRwMwMBomGk0vpyD4ojl6bqGUjpFKdlRKLqBcHl52PZsQq5BSLh1EAzAwmimark9B6LR00nWuaLLPBkcuYYpPDTMagIHSMNH0mjs4FE02G3GXQbq8Ihqb5rMQTSgVRAMwUBokmn4SlLuiiUmnS9EEMxpyBgMMloaIpt9TEBy5hDLRAulGNNksiD0agHQ0QzR9n4Lgz2LMTCRfNl1c6G5GU9Q7yy2WTgADpRmiaRj+ES4AsFQQTYiZ3bh7PQCwVBBNvifjUO7XAMAgQDQAkBxEAwDJQTQAkBxEAwDJQTQAkBxEAwDJQTQAkBxEAwDJQTQAkJxmiKbvUxAAoA00QzRZVr3eT0EYMJG3vAFg6TRENJp+TkEYMIgGIAkNEo2mz1MQzukkV+XJBl5emuBNbC8PjSbPPWMSZZUvVpZpItyXLp2xMinNZ/fiRUyAehomGk2vpyAoAbhJqtzMeppgllIrmkjbygkJbr35HB7bAgAxmimavk9BCI9Osbhy6Uk0us7LJ6zHz+5XkRIA1NEw0Sz1FARHBE47N2Nez6Iplk0lpj+iAeiaBolmqacgaBLMaNxlmQuiAeiahohmAKcgZGV2I9gRQCAEU1/II9jjqcjD1ofiircFgDqaIZoBnYKQ4//qFMogk0teF8xa9IxH1xWbvEYoeXtFvmeDaAC6phmiAYCRBtEAQHIQDQAkB9EAQHIQDQAkB9EAQHIQDQAkB9EAQHIQDQAkB9EAQHIQDQAkB9EAQHIQTV/EX+YEgDitF41+23r502l2K5p4fhyAlcZQRTM5vVUmI+Ulk7J1ejJSXoJoAJrPEEUzJ29d+bNcem2uRjbliQhz0foxE8RFnhgnN4yXjybINXP93HyZj8bUOflpnLZ5gqw8P42mFEYgmiBnjW3njKtxcg+7Y7qSrHtugLYzRNEoJn8i81djsskk08WBcpUZjU5kFQR1Xm8DPBdSLgL/OpdJHvSFXIxMcrn4ojl6bqGUjskznI9ZndHkArPXTn3w3ACjxHBFo6nIpreznXzRRJYqTga9UEqdrn0hhPXBjMZD19WJptpP38eMScY+GGGGLxpNJpvPzz4uj2dnOnWb1jMmmmL5kZPNFJYqmkIKFWHoa/eenUTjtsvI72NmQ7oM4cBo0QzRaIxsvpU/9yAZTVU0dTONpYtG11tpuKKJSaeTaLqQCMsoGDGaI5o+CWVhBFETpD2LxhWIt/fiyCVc8njtQtHYe4QCq8AyCkaM1oum/MWnDEwTzM7SJA/0nkVzcd5ZioWzlvLaSilrd3HBn7Xky6FCfuHyLhunWDY5ZfkYAC2n/aJJRGzpBAD9gWhqQDQAgwPR1IBoAAYHogGA5CAaAEgOogGA5DRCNNu2bYuWA8BogGgAIDmIBgCSg2gAIDmIBgCSg2gAIDkrVDT+S5FdvVENAH2DaKL1fUBqB4BaGi2aQZySEAfRACwnDRbN0k9JsPj5X2y+merSKcxL47fX5Vmfk3n+G0W+3PJyyfhjAUDTl05LPiXBSsaVxfwiovHf2nYz5Ok+SiRFAit7XWTPY0YDUEuzRaNZyikJOvijaT3rROOXa7R46uq8mRCiAail+aLR9HtKgl7SRH9N6iSacglUYMboJCF1jWgAammHaDT9nJKgRdPzjKZOFogGoF/aI5q+sDOUQgbqerE9Gv25m1mQBtEAdMeIi0ZjZZMvg8qN3bhoak8pWEw02Ti6j1sGACtCNAAwbBANACQH0QBAchANACQH0QBAchANACSnFaJBRADtBtEAQHIQDQAkB9EAQHIQDQAkp7WiGX9skzz+wXZ54oNpufvH62Tuve3y6Kk1Rf2uU9PyxHubZP+Pp+RR026bzD22yhsDAJaH1opmbGyNHPv0kLz+peL3m+TOczerz7tl7h5Vd89GeVGVnzw3KXO/P2jbfLpZtlfGsC9cFlnyekK/fOm/ZAkAcVosGsVjW+WklsiXB+SZX0zJE1fV5wub5OELSi5Xt8vdv9gur5r6m+WRxyL9lwSiAeiWdotmbJXc/uEBO2P5fKvcdmqn/fzlQTl+aoM88rn+fEhe/XCDrI32XwqIBqBbWi4aRbZM0kL5+dkNdjmllkm3n92bSSdbTsX6RvPSnHDy0fiJrHT+mTxPjW3niybPR+PmpDF9nCx/1cRabgL0jCLXsX4+/xl0f7dt7J4ATaP9olFsL6SyU+57bpPM/cNGOV7Ip9wgrlIVTZnoKpBCkBbUSqdsa64LgbjycD7XZOHz+9prK43Ooqm/J0CzGAnRjE2ul8f1/owSyysfTMndH9xixXN1mxzsmF84NqNxZgWFXGJBrMvyvv44mlIW6jqbocw7kvAoZjD6Ohy3TjSL3BOgQYyGaBSTL+3INn5zDsgzL62Oti1ZRDSFANzgzwmFUC5hCpxZijc7quCM5Z3csJhogvsF9wRoCiMjmrGx8fKnbM3vN8rWaDuXXkQTzkbcvlUheJhxFmShw9Imn42UItEsJpoO9wRoECMkGkXxc3e3P2d3K5psP6RY3mTXQd/4bMKRlLvPo8d2RVHIyJVHIDjdX81a8uv6ewI0i9ESjeLge7fIK++tj9ZV6V40eX2+RKn+6mSlUCxhsnFDGRTXoWjy/qE4MrkYVJ3uX8544vf0+gM0gJETzdg9E7L3UKQcAIbG6IkGABoHogGA5CAaAEgOogGA5CAaAEhOK0QDAO0G0QBAchANACQH0QBAchANACQH0QBActohmvtPy6VP35KfdExitXQqL1UCwEBoh2jGJuUnZz+X61fSygbRAKShJaLRZLL5/Gwy2SAagDS0SDSaXmWT5Zs5V+Z0KRJQuddZeysa9xQE8rsADIKWiUajZPP2VSObPCFVPVo0Shh5MqlcMN51mXxKi8aTS1APAP3RTtGoWc2fr77VpWjcWUnn6+rSKUilCQB90TLRTMrca5eUZOZ7Wzr1LRpbhmgAlkaLRNOrZDRLFY2e0bjtAaAfWiKafiSj6V007p5MePIBAPRHO0Tz4Fn5/EqvktH0Lprr5+ZVmRaOLx0A6J92iAYAWg2iAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDktEM0y3QKAgCkoR2iybLqpT4FAQDS0BLRaNKfggAAaWiRaDR9noJwcl6u5zlmKomsdJs8/wxpOwFS0DLRaPo4BcGRi8mil5+CkNUXcvnhvJJS9hkABkY7RdP3KQgKJZPreeY8fZxKIR0ASEXLRLPUUxDyMisanROYkykB0tMi0QziFASFntFkSymTfJwZDUByWiKapZyC4O7J2APhilmMWUaxRwOQmnaIZqmnIDhnb1dmMJlsbH24zAKAQdAO0fRNbI8GAJYbRAMAyUE0AJCcERcNADQBRAMAyUE0AJCcqGhmZ2dlkGjRxMoBYGWAaAAgOYgGAJKDaAAgOYgGAJIzNNEceXlG/vHj2+R5xU9fPCxP/Mtt8rPfHi7q536r6v5lRn7w4oz8LGv3xMv+GADQDoYmmtnZw/LMHw/J618q/jAjf/vhrerzrfLEU6ruqRk5qcpf+VAJ6A9Zmz/OyAOVMZrBG5e/la8/es58fu6jr+Xb6+fluaANwEpmiKJRqFnNK1oiihffmJHn/019vjQjT11S//tvaqbzxm3ymqm/VZ5t8GzGFc1geE7OX/9WLv8mVgfQPoYrGsWPL1jRvH5lRn6klkvms+IltYx69or9/NqFw3JnpG9TQDQAnRm6aPJlkhbKL9/NllNqmfTjd/VSSpdny6lYX4VZqhT5ZC7LG2755TeMBPJ6N3CtHN4wAW3rv5bzL5T1dXj3y5ZIlaWTum+0fVjuPV9+/zfkct5eEyzDqlLT7e331nWenH5zuatnAUjN8EWjeKCQym3y+OkZeeLVGXnJkU+sj0X9y3+5DEQTtFkA5UFVBN4L5+VrRyY2wB256KB0RBXDjOkE/hsfLSIaPabbPmznPJ8/docZTTCmK5OOounwLACpaYRoZu8+LP+o92eUWH718Yz89GP7We/THLs70r4OJ7C8gM9wg6saaIstV3R9fNZTEYi5b2S8Ts9nRJiLrtOzlDMYfe3Kxf1sKO7X+VkAUtMM0Sju+q/5xm/Ji/813tZDB0y+HHCWBDHR6LJ60UQC1cMPcJdOovGeTZPNKqrP547fSTTOc2o5BbOUTqKpe5aiPUAiGiMaTfFTtuYPM3JfpI2HDqSaZURMNG4gunKw6GDstE+jRdDrjKZ+vKWIJv+eegz3O3QWTafvBpCWRomm/Lm7u5+zw2DVgZZfm7oOezCmrXNt2i/yL7zp484gFtmj6TRm+OydRRNe27aXL/vy8MfUbYL/HsxgYEg0SzSKY/9ySH71L502gF1sAOZLgcuXwxnNeafeD0orh/M2GA2ldDphBZWR3atONJX2ilwWnUWjMGJUfYwcqjMcM25FHJlcDGosZ4ZX9Cnq/fEAUtI40cw+dVge+kmkvEeqgezjygEA0tI80QyI/kXjzgr41x9gECCaSB0ADJaRFQ0ANAdEAwDJQTQAkJyoaGLHJSwFLZpYOQCsDBANACQH0QBAchANACQH0QBAcoYmmvHHNsnjH2yXJz6Ylrt/vE7m3tsuj55aU9TvOjUtT7y3Sfb/eEoeNe22ydxjq7wxAKAdDE00Y2Nr5NinWUqI32+SO8/drD7vlrl7VN09G+VFVX7y3KTM/f6gbfPpZtleGaO5HD13Xb69eCJaB7DSGKJoFI9tzfIFH5BnfjElT1xVny9skocvKLlc3S53/2K7vGrqb5ZHHov0bzCIBqBkuKIZWyW3f3jAzlg+3yq3ndppP395UI6f2iCPfK4/H5JXP9wga6P9mwuiASgZsmgU2TJJC+XnZzfY5ZRaJt1+dm8mnWw5FeurMAFdvGW9ICfcchXoJy6Wb2AvnCz76fLr507I/Bd5/XWZ/2FZH8P2mZeF/H5GJCeCa9t2sfvn2DGPOmV6PPs9dJ3X5+RC9R6RewM0jeGLRrG9kMpOue+5TTL3DxvleCGfcoO4ylGZvzgvR7NrE9RZwOVBWATqD+fluiMTKwBHLjqIHVHFsH3yNrlg/Ov8fovdv0Df94vyO7gy6SiaoJ9u6wsLoDk0QjRjk+vlcb0/o8TyygdTcvcHt1jxXN0mBycj7etwAjGfUbj1bjBWA1NJS81uvMAOCPt0ul7s/iXlDCZvkz+D+9lQfL/Is7oSAmgYzRCNYvKlHdnGb84Beeal1dG2HjrAzMwio4NodFke6LGgrwR2QNin0/Vi93cp7qtnPcEspZNovO+tcWdGAA2iMaIZGxsvf8rW/H6jbI22c9CBV7PsqJtR5IEbSsIGb+d9mrBPp+vF7u+RPXcookp7TzSL7ykBNIUGiUZR/Nzd3c/ZYTDrwMyvTV2HPRjT1rk27ReZEbgiWey68/3DpY9dPi1c9OXhf79sT8j9fsxgoCU0SzSKg+/dIq+8tz5aV8VfQixcDGc08069H8RWCs4vSI506uhZNLX3D0Vj+1bFkW84Z8/nzNiKPkV9zWwJoAE0TjRj90zI3kOR8h7xZwNVQkkAQDqaJ5oB0b9o3FkEswWAQYBoInUAMFhGVjQA0BwQDQAkB9EAQHIQDQAkB9EAQHIQDQAkB9EAQHIQDQAkZ2ii4RQEgJXD0EQz6qcgAEDJEEWjGOFTEACgZLiiGeFTEACgZMiiUbTuFIROffz8OP5Lm9UcNGXqTj9vsEbfq5KvJjouQPMZvmgU7ToFoa6PFUkpASWkQAjhG+X62rbvLBq/X0RYAA2nEaJp6ykIXp8gsXgUr43um0urk2h0nT9zKgVVlgE0mWaIRtHGUxDyMtMnSLMZx5GL134x0TjfL/ieAG2gMaJp4ykIFXEsNqNR5LJzn2Vx0fh1AG2jQaJRtOAUhPo+duZRiijbozF7Q44ozPJpQRYUpTycJZi+Ns/qS5EZDLSZZolG0fxTEDr18Zc5RhShaPJnDsWRycWg6vS9yhmP/z2rv3YBNJvGiabJpyD00wcAmiiaAdG/aOKbr3p2gWgA+gPRROrqQDQA/TGyogGA5oBoACA5iAYAkoNoACA5iAYAkoNoACA5iAYAkoNoACA5iAYAktMM0awak93Z593qc6W+Fvu6QPnyYS84KR6i9YPF/ati/63vFOj/Lqm+W8qxYVQZvmgmVsufHlwjL2TX5+5eK++vD9okYXiiGQz2je64ZBeRQZe5c+IgGuid4YpmYlz+91Mb5f8+PC6PZmX/5d5J+X/PrJPzvaTw7AtEg2hguRiaaHZPjss3z2yU/7hfSSZYLv3m/g3y/46vl/+52S+v4v+f3gaze0qBny/GLFmyt7FtOz9gdP+yPr7MMW06vKypce+T93VFE77w6bUPy9V1+Vz58+rvnZcpKtLI/ruc1Llw/DbevRRGVFnOnPmizt6nbOv+d0I00DtDEo2ayRyfku9uXy23eeUlL9y6Tv7vP6yVc5G6kqpo3KDwpBD8K26DqGybB7Vp680WnM+VJFZVzDiumM4tIprguSrtchnk10XbxWY06rsXbe110Tac0ZjvVb1vXLaIBnpn5ESTB4ehCKhYUOqyvG81eHRwFWOZ9JvzMq/Gjwd2jjumT1w0kefSz5xJqGyX1XmiW0w0/nN4/22ionEE2vEa0UDvDEk0KZdOjmgyQVjRhMERikbPhgKcINdje0EfRY8Tn/F0Ek3lvpkEKqLxxu9NNJ44EQ0sM0MTjWHJm8H+/+k7iyYMSrevG8ARzDg6ofhiM5r6IKwXTX3QIhoYFYYrGs2Sft72/09fL5osaJ3gMtdB3/iMxQnoMEAjmHGcNovt0YTP5eK2s3QSjXuNaKBZDF80miX9wV53osnr8+VJ9VcnG6jlEsbWhQIKr2O498nbus8WCsRrr8jl0Vk0Ci0M3cd8xx5E43xX0x7RQGKaIRoAGGkQTV/of9X9WUgxO4i2B1jZIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkNEM0S3qpst8//dcvFg735cDqS5N1pHyRkZckIT3DF80KOQUhxsBE00X6inoQDaRnuKJZQacgxEA0sFIYmmhG9RQE+wzz6rmysUxb/ZzutW2bi8a9b3wZmH1PTjWAljIk0YzuKQj2GdwkUdXrXCZ54BdyMePHgj4bp3h+f5x4xrxAluG1NxaigbSMnGjKLHKKIgBdceS4S6dqsOlgLMbSgavGWfwUhOozdLr25RZvb6k+n9cuKhpHiB2vEQ2kZ0iiSbl0coI0E8TynYJQfYZO1zHReIIrWESEiAYaztBEYxi5UxCWLhpdX70HooF2M1zRaEbwFISeROMGuR6/EIArR0QD7Wb4otEs6Q/2uhNNXp8vi1KdghA+Q6drI5qL8859q8/TlWicZzftEQ00jGaIBgBGGkTTF3oWkM9CSqp7KwCgQTQAkBxEAwDJQTQAkBxEAwDJQTQAkBxEAwDJQTQAkBxEAwDJQTQAkBxEAwDJaYZolvRSZb9/+q9fRGzgy4ThC5CDJOXYAB0YvmhW8CkIURaTQRepKmpBNDAkhiuaFX4KQhREAyPI0EQz2qcguM8QyqzMHePepyCXgUmClbXL7uc+v0YvGSs5bcyzOvdwpYRoYEgMSTSjfgqCIxcjjLyPHauUixJSVDTOc5vrYLza75ELxr8u7odoYEiMnGi8GUIRlK44cnRZ3tcfR6MD2AtQNU4/pyBUROXOMGJUZBA8e0w0zgyr4zWigSExJNGkXDo5QV4EtiuVnFA0eiYQ4ASsNzvqQFU0tsyIQktisTEiMij662tEAy1kaKIxrIBTEDyhBZKIgmhgBBmuaDQjeAqCuwnt39fOnMpnzPZoXAEgGhhBhi8azZL+YK870eT1+bIo7SkIztnblcC2ssnvYwTSi2ic59RliAbaQDNEM0JY0bhLJwBANH3hz0rc2QmiAaiCaAYMogGogmgAIDmIBgCSg2gAIDmIBgCSg2gAIDmIBgCSg2gAIDmIBgCSg2gAIDmIRmNeNnRfsBwQlZclE9zDwbxAucjb5QDDYMiiWS1nLu+SG5cnZU5f3zYhb36yTW58pcoUV8+vkzsqfVpEirelu8lpA9AwhiyacXnn2l755tqUChwlnc/2yDff7Jarn2yRCx/fJJ+9NxHp0yIQDYChQaJZKx/dUJ+/2iTHp2NtY2T5aM6p4HPeoDbB6F7n7U3g+29bl+W5ELIxTzptO+SfKek1z4zb3llS5e2c75C/pGmWRkWf4Lvl9cWz1owPMAQaJJoxOf7hLjWjUdd/2Smffbheji4qnCyY8uDKg9O7LoP7qBJSEXBuXUU0aoxi1mCvw6D2Cdqo8eY7iiZILVpp53wHc+2IQj93zYymFE0wPsCQaZRodNnRn0/Jpau7rXCuluVxdIC7/1ovdu2i6+pE4/dZNPWDDv5iJuFQEUj2uSILLYbsnt6z5HWONLoSDekqoFkMWTRr5P2vrFDMZrDDqU9U+Tfb5c2H/HKfXkWjr/VSIqc70egA7hS0tfWdROM9h8XIpCIaK41eReOm/EQ4MGyGJJo1cubjLXLh8g4zc/nyvTWqbFze/NN2uaTLP75JvvyLEs2NTXLc6xfSi2hidYMTTc8zmlh7zcBEk8MyCobPcEQzu14u5T9hf7xe5szRKko+l5yftj+ZlON3OH2idBJLcB0GsJlVRCTQh2hsfyeY1XXnPRp9j5rg99pZOonGXSLVCY9lFAyb4YhmYPQgGnVtAjFbpnx7cUHVDUg0GjNGvgzK+teKJmyvyOURtlN4onGWRLosLpqyjaFu9gSwTLRcNODSlRABhgCi6QE9eyhmCY2bLbAXA80F0bQeZ5nEEgkaCqIBgOQgGgBIDqIBgOQgGgBIDqIBgOQgGgBIDqIBgOQgGgBIDqIBgOQgGo15kdF/kTId1Zc26zCvPPDXvjACDFk0I34KQpTuRQMwKgxZNCN+CkIURAMrjwaJpsWnIGT954t8N1YkZf4bVyyR8Wsy5vkJq3S/rL03HkDzaZBoWnwKQiYwLwFVeB2MF2bJi8msFA0pIKDdNEo0uqyVpyB4/Re7jjxT2D7Dve+izwDQYIYsmtE4BWHJojFlTvsMXy5l3hmEA21jSKIZrVMQliwaXR/Zp4nPYlhGQfsYjmhG8hSEOrGE13p8d0/GiiMfv5vlEssoaBvDEc3A6EE06jrfpDUM8hSEnkWjxnd+KXM3guOicdJ1Bu0B2kDLRTPaaNGwRIJRANH0gA78YlaRfHZRnVkBtBVE0zi0YKzE2IeBUQHRAEByEA0AJAfRAEByEA0AJAfRAEByEA0AJAfRAEByEA0AJAfRAEByEI3GvPQ43D/3N6838LIkjChDFs1KPAUBYOUxZNGsxFMQAFYeDRJN+09BOOHcN+zj5cJZLJue95xOXhuAltIg0bT/FIRSLn7WPCMZ99SDc51Ek4mO9BAwQjRKNLpsJE5B0GiRGblo6SwujvIe5ASG0WPIohnRUxDyMiMaPV5QF8GXWfmcCAdGgSGJZsRPQdDoGY1ZSlXHixGfNXXXF6DpDEc0I3kKQnVGks9GtESqezT+EikuGpZRMBoMRzQDowfRqGvvl58EpyCUZ29XpWFkU9xbz3TqRGMlVTcOQBtpuWgaQjhb6gMtGmYuMKogmh7wZiU5enayZNFUZ1EAowSiGQR9i6ZcJrFEglEG0QBAchANACQH0QBAcpZFNACwskE0AJAcRAMAyUE0AJAcRAMAyUkqmomt+2TnzQfi7NgoqyJ9AGD0SCea8WnZc99DcvgBy6Fb98n2W+8vrg8/cLdMb4j0GyDuG9Hm9YEiA15vLKUvACQTzWqZvDmTyn3flx1b1hV1E1v2yy2ZgGYOTstqr99gcUXTPaRmABg0aUSz4Xty4IE5uWXfVplYpa7XTMlNM3MyM7NH1q1R16vWydS+78vMA/fLjimn34BBNADNIIFoJmTTbXNqxnJAJtX1xPSMHHSWUIfvu1f2TusZzmbZqWc1t22TNZUxajAvL2ZvTXsvMbo5XMq3oMOlU/7Z5KVRSyGzJPL6+Llg8mRVobDKflpIuk+Qy6bDCQpu3+p3UH2zEx28Z60ZC6AtDFw0qzYfkNuMVKxoJvc7ksnZv1m1taI5/MCDsmNjfCyfLBDzVApe8u/4DMQVhPs5D968j7kuMuBVx6v0dQLeisMVjbouxrLX8fsoiu/g9HVl4tX7zwHQJgYumtVbDiURTRjgNjBtgNcFoFveSRZ+modOoglkZyifI1bfua++V14W1kcEWuQhdsoAWsDARRMundbu1Hsxrmjm5JadG1S73pZORg76X3yPPDBtUOoyVzhdi8aTxWKiydvluGVVmeh71fe1Y9t7hX3L7+ThzogAWkIC0SjMZvDdsnPLOlmlN4PXbpUdR+Zk5sh+mVqrrletloktB1Sb7jeDy4CN11t8SaQRjS8Sfza0mGiCvuZeeVlMNGF7gHaSRjTOz9szd83I1snxom715C7Ze5ee8XTx87YbxObz4oFXJ5fBiMZ+dvua665Ek7XtuEdT7csMBkaBRKJReH+wNycHD+2T7YfudZZRXfzBnjdbUOjAdJcRJuCtGPwy2z4URHeice6TBbnbN7xf9FenGtForJgyPIlU+1bam/v59QBtIJ1oFCviFQQtQ2YdAB1JKprRx85u3BkLAFRBND0SLmX8JRgAxEA0AJAcRAMAyUE0AJAcRAMAyUE0AJAcRAMAyUE0AJAcRAMAyUkqmlv2vS8v3/dRnJlnZCrSBwBGj3SimXhFXn/ma/nn/2yZ/8H78uIPviiu//k/X5F/vGky3ndAuC9Dmr/oXca/4uXNa4CSRKLZIw/dl0nl6Svy8r6HZL0p36JmOR/Jb5/OZPPQK7K10ndwuKLpnmqaCABYGklEs+amd+RtJZLf3ntCblmtrtc9I//4IyWWH70j96xTs5jVD8mP772iZPOFvLwj3awG0QA0gwSiuVv+7piesXxklg23HPhXedtZQv3zM1/I6wceUu1elF/q62Ovy67KGDWY/DT5C41O/hiTyyUvL3O6hEun/HOej8Ysp7w+7jgKLx/NvK0rlkN+21BMYc6b8l79yA+g3QxcNFO7P5J5IxUrmqMPOJLJeeBF1TYTjZ7V7OxmVhMkhiqy09XPQDqKxpGDv59SHc9Koiq2oo0S4HwH0YTSAVhpDFw0W793IYloqsGqg90GvysRl46iccfyMvnFReON38VpBN49vJSdACuPgYsmXDrNzuq9GEcyit/OPqra9bZ0MoGbLT1K8hmOlYMuc4XQtWgcaXUjGt3fE0+E8B7F8yMcWIEkEE2+GXxFfrnvRzK1akzWT52Ql/9WSeVvP5IfT22RsVV75NZ9H6k23W8GdxPcoSRSiqanGU0X5QCjTBLReD9v/92/yrPbj2RnN03Ktu1vyut/l81uFvt5213SmM/V5N0hdXIZpGjyTemiTb5H4yyRaoXCMgpWIIlEowj+YO/th9+XFx/u8Q/2vL0ThQ7SYtmkMIFcLpvKMtu+P9E498mEUBGNJpONvW8mwBrRmM9FW+c+ACuEdKJRrORXELRcKnICWKEkFc3Kpbr8AljJIJqB4izjYvszACsURAMAyUE0AJAcRAMAyUE0AJAcRAMAyUE0AJAcRAMAyUE0AJCcZRPN+JY9MrlhPFoHAKPNsohm9eZDsuf7D8reO++QzZNpZGNeXKx9K1q/NMkrAQDDIrloxrcekE0b18m6PXfI7jvSyqYgfOsbAIZKUtGMb71VdpuZzKxMTqiy9XtkV+KZjQHRADSKZKIpJGO4X7ZPr5PV43pmc1f/yyg3B4xaJp1wUjEU+V+CnDW2Xi+d/KRZOsdM3mbhpJOPJpeUM06Y7sHt6+WXyfrOZ/ln8qWa257UEbASSSKa1Rv3O5LJ2LvJLJ82KbmsWnuTbD2iZXO7TK2Nj1ElkEUmnYpoijp3RuP39doqrAhc0ahrb6ygr7sX5CS7Cp+paF/ci/QRsDJJI5qtM3bWEopm74Oya88WGe9DNKEc8rLeRVOd3dgyVzRuX1cOsb66PivreF+L+8wAK4UkotGMb7vdk83unZMysfOeUjw9Lp1iAdq/aNy6oKzS1854StGEfZ366H3LZVNBIEyAUSeZaDSlbO6QjXrmsoTNYE8kGTrABzKjcdsvKpqg76IzGn8sgJVIUtFoctnsOXKX7Dpyf2+SqQjACXJz3d8ejdmTcaRlrr37+HIoRZO17bhHU+3LDAZWOslFoylmNr3OZMLAdX9RqvvVKWtr5ZGLKJyJOCk3FdFfnbJx8rFy0bhj589RSCfSN7yXezY4wEphWUSjSfEKQiiAvtGCcIUBAANl2UQzcMzsJpw99IOdceQzIwAYPO0RjVmWDGYJ4i19NOyhACSlPaIBgNaCaAAgOYgGAJKDaAAgOYgGAJKDaAAgOYgGAJKDaAAgOclEM3HTPpneMiFjqyL1qyZk3Zatsq7rpFcA0GYSiGZc1u25U2YeeEgOz+yQLTffK3t3TMmaNeOyet1muenQvbJzz/fkoK6/a0Y2rYuNkYJYiocYnd/07h49zoDexQJoOYMXjZqtbDxwvxzWInngkOw6oP53dlb2fl8J59CsEdD+2Ttt/X1KOluW+KKlm6ahI/2JpnvsO1OIBaDK4EWjmNiZzWgeuFP27JyWCbV8Wr1+g6zR/zu5S7bfmonmrgMyOR4fo2sQDUDjSSyaOZm5ebMpW71+SiZWq/rV07LH1OkZzaxs6WGfxn0ZUr9tbXLQ5C9GmmVKJNiLHDFVgYTj2XK/nW6T19nPJ5z8Mvnb47pPOZYVX+f7cfICrCSSiGZsbJ1snZ2zMrlnv6x36zYfKCS056bul02xVJ6GYEYTttPXNtD8wPfbuYLqLBr3rXFzHR2jOk74XHYsVzTOWOY66OvO2tzvnPV1ZVL/3QCGQyLRKNbukv33aaHcK9MbxmTdrv2yUS2T1u970Aho5uC0rI71q6NuiRSW68ArrnWQ5QHrBr4vAU2dkELRuAHt37uTaKr3s2XBjKaoqxdfWZ+VVfpW25ffrSwDWE7SiUaxZlu2+btjIivbINPf17OcQzLVx96M+Zda/8vviqUioCAIi7ow8PWMIsDMAvxA7SiaitQ6icaVQVBWkYW9VymasK9THxVN3Xcr+wMsJ0lFo3/q3nhQLaHU7GWN3gzWs5wHHpRdS/ylyVsaxGY6qkwLwf+XfLHAz3HbDVI05ZhF365FE/RddEZT990AhkNi0SjGp2XPfQdk04YNsnb6Njm0f3P3S6ZIABpcucREo4PtiwWDH4C+QOL/ylfbLV001fuZ665Ek7V1v6P7nWv6MoOBJpFeNIrVW/bL9NSYTO7t8edsJ4iKZZPBDSwb4Lq8DPJYsPmB7/az5HX9ikahBaDHMmWd78fJC7CSWBbRmL8WnpyW9VODPQWhE2GgNo5QUgAjzDKJZplpfBDbGYc3OwIYYUZMNPmSoXlLBW/po2EPBVYQIyYaAGgiiAYAkoNoACA5iAYAkoNoACA5iAYAkoNoACA5iAYAkpNINFPy0998Iud/9YBMTU1V6qamHpBnT78uzz0c1gHAKJJANLPy7Mc35N//4//Iv3/9rsz/4Tu59t7z8vC9d8nsT0/I+WvfyR8+/h/yV13/3Rfy1k+XSzbhS451VF+qXM6/4jUvj/IOFIwYgxfN1MNy5n99Z0XzH1fkj39S/3vjhlz7qxLONSugr9W1rVfSOX2XTMXG6ZZomogY/Ymme+zrD41+kRNgSAxeNHrZ9EEukhvyxw/Oyo+2jcnsE0/Kw2oZddfz/00ufvmNrf/uspyajY3RA4gGoPEkFo3iD6+YGcvsE8/LT/er+v1n5Vpe9x9fyPyx7pdO7ouJ+s1nP0eNDvJIsBf5WqoCCcez5X473cbPR9PjKQjnbI6aYvw8Z40hzCMTZA/0xu1HfgDNIIFoNI/I/I1MJt99Is85dVO/ulxI6NqZWadPZ/wAdAhmNGE7fW2D3BeI384VVGfR9HYKgluvMJIp5XL03HwH0TBDgtEhkWgUP3lXvjZC+U7OPzsmz/73T+TMkTF57l+z/ZtrZ2U21q+OuiVSWO7lotHBmovBFYgvE02dkKozmmxmovHuHRONfw/dfzFxuAKs3A+gpaQTjeL+c18YqXz93sNZ2XE5/1c9y7kir/WxN2OCUM8SXLFUBOTIxZNOKBo9OwkwAd6DaCpS6yQaV3r1xGZa+tkQDrSZpKLRP3WfuWZnLw/rzWAzy/lO/ni6+yVTDC8YYzMdVaYDs5yl6PJQNNX9kWq7QYumtxlNSXd9AZpKYtEoZs/KtX+/LGeeflKe/M0X8tfPXul+yVRs5AblrlxiotFB3rBTEDR2Rlbdo3HHjYsmcm+AFpFeNIrZ05/I+Ren5NTve/w52xGNDdJ8meMKpFxeuP/iV0USn2GUY+Z1/YpGoaWnxzJlVdFovO+R9Y2LJni+qBQB2sGyiMb8tfDzr8vLLy5tydQLOnjbuNTQomHmAqPGMolmmQlnGq2BvRgYTUZMNPlyo7pkaTbOMoklEowgIyYaAGgiiAYAkoNoACA5iAYAkoNoACA5iAYAkoNoACA5yyaae59cL+98eJNc/WqX3NBcvUnef2VctkTaAsBokVw0dzw7JZ99tUe++WavYod89vEWuaC49Kdd6nqPXH1rPNoPAEaHpKLZ++SUXFIzl3de3SRXlWi+fG9NWX/bOrnw1V65cX6t18cn/mJiN1RegOyWujfGU2Hul/0186/0596/r/6u/EUxNJl0orl/rbz85GrZO6mWTb/ZpmYv2+TN+7O6ydXy2qXdqmyXfPQzp0+F0RdN388J0CLSiaZgjbz/pVo2LayTSXU9eceEvP8ntZT6yzZ5/+nVkfYuK0M0vEQJo05y0Uw+v1luqGXT1Q8n5cJVPYvRezVqGfXhhMxE2vtkojmZLy8UwVvZZtkQqbOicU8sCIWlx47UdRSN28cRRLH8sbiCqz5HPnaQb0Y/e3hvd1xVf6ImhYQv1ZrvBTBEEotmlZy6lG8E75EvP9skZ345KR8Z4eyWj56N9XHJgiYQSLkfoeqLzzZw84CzAnICzSSl8oPcF0VWVysa+yxun3nzOSgPxg6fw39+ex19DjNuKEBfYjl6DFsefC+AhpBWNPdPylUllEuv2r0aW75KXl5QormxRV7e57SNEgSbplYEftKoMvjyeicIK+k/dV12n7rxdZ/IhmuZEc8pd9pWniO4d51oYuPWJcVy71H93gDDJ6loHn9vp3xzbaoM6MnV8sL5HWo2s0M+en6x/RlNRDSmrBSBCUizTLB0CrgiqM3spuyTY+pqRFMX5NFyPUYmk8pzOHX6unimvM4RTThuN6LJhaq/T6wtwDBIJ5p96+WSms1cOLHKXG/5wXq5cE0to77aKq89GGkfpWZGkwWqkYzzr74biFXROLOWmtmJoYNoYn2i5Z1mND2IJhy3+p06lbOMguaQTDRHf7fdzGYev2etvHNJzWy+2SM3Plkvc8USqhu0aNS/zkXA2eCJy6Ra5584oAK3CHA7bjQIXdG4yxxT7kvB7NGE5UGAVySg23chGvvZkWx2n9h3r9wjo64cYLlJI5p96+TCDbsB/M1fdspnn2yS1x7rZqkUks1osvOrDd6/8pmIDNdl4WI4o5l36oNZSha4xbieUCKiqfSpSiAfyxVYJdh1225Eo3GXeKqP+6uTO2752Uqu6BPOtACGRBLRHH11i1z90xY587NxKTeBYal4UuqiHKApJBGN+avgRyLl0D9mdhPMygyRfSyAhpFGNLB0guVY9Y/vymWjtzQDaCCIBgCSg2gAIDmIBgCSg2gAIDmIBgCSg2gAIDmIBgCSg2gAIDlJRbPlB2vl1OtTcuoxp/z76+TM2fVy/AdOGQCMNOlE89hG+VJn1vtyWt70RLNeLpnjV3bK+255lA5vWaem+Mvc65xOALBE0onmxBaT4Oqd2DtPj1gJXTgRqWsI7tvRALA0Eotmj1z4eaTuyU0mYXnTRcMb0QCDIZ1osqVTVCZGQrvl/acjdR7Bm8nei4bum8xuXpowv0tZ7s5Q7IylCacT+M/uLrXyLHtmCVbpB9Ae0ojmsQ1ySaftrEtAnifGunaTnOm4T+OKJpCO18aXS3tOJ7DlVQHaayMa5zv4WQIB2kMa0fxwvRXNtU1yPCqatfK+qr/xp609iKYmWJ38vC6xnLtuWzegi7ouMt/FxtVlnUUTuZ8muKdB3ysrq9zLEx5Ae0gjGk2nDV+zdOpmjyacxdhZSvivfCzIo+VOEFcC36nT151EE47bjWjcJVlRFpWk/o51Uivr/D4AzSadaMyGb80hcV1vBoeiqZZXg9ESLe80o+lBNOG4lbE6ljszs15nNIgGWko60Qzk5+060TjBaiTgS6E9pxPo7+e3cfsgGhgV0onmh1P2D/bCDd/vr5OP9P7NN9vlnYpAQlzR2KC0v74EAZwFu62rSiDvU0onIgHdthvRaPRMJB9X9Vna6QT13wvRwKiQTjSKO/5ug7z/8RZfNPvG5YVfdvsKQjsCy5NSF+UAK42kolkysT2MpmFmNzEZurMxgJVNo0XTyD9QC5Zj1Wcsl0Le0gxgBdNo0QDAaIBoACA5iAYAkoNoACA5iAYAkoNoACA5iAYAkoNoACA5SUXDKQgAoEknmoGcgjB43JcelxPzgmTTX6cASEQ60TT0FIRhiQZgJZNYNM07BQHRACw/6UQzyFMQTjovMgbLDy2O4gXHoM4sV4I6TzRZXpk8lUOnsdy6hZNh+oryRcq6F0HD3DLueK74vGeo3CP4b+HlqgFoLmlEM9BTEFRAOUFvArEIMFVffLbJpfKgDfdETpwLRGPewnalsMhYFUnkEvAz91WSZGW4Y4TjeW1cwXlpMsL/FvaafDfQBtKIJskpCBk1gazRgWrloIM/PrOwoplfNEjLsSLPYMqyZ6jkzInf25NLNM9O7D7uWNX6QppFe4BmkkY0miSnIORlpWhMAOt/6TNKOcRlZGcjiroZRVdjOWXZ8isklJgnmvxat/VmKNVn1s9rx9L1/n8LPQaigTaQTjSpTkHQM5osOGPBWz8LsdhZgD2h0g3SnsZyZ1VaNBFphYTjV8tjz9x5RlM+Y1kG0ETSiWZgpyCof/WLALX7IXlw+UuHap27PKns0WRjdz2WIwlzXcw+7DjRZZizRKoTjdsmfGZ/iYVooL2kE80gT0E45yxPvGDNRGS4LgsX/cCzQvD7eUIxM5O8rtNYVjz5WJVfnfJxcnI51IjGfC7a+8sl75ld6SAaaDHpRKMYzCkIfnA1Amf5Fq2PgBRgJZNUNEuniaLxl1XdYfvwUzSsVBBNF3jLGU1sryWKs+Tqug/A6NFw0QDAKIBoACA5iAYAkoNoACA5iAYAkoNoACA5iAYAkrM8olm9WcY371PsllWrI/UAMNKkFc3OZ2TnLy7Jkbc/lZl/ele+90+XZObNT+XWX/xaNu7cEO8DACNHMtGM3/07JZUF2XXf4aBuQsZnTsm+X1+S3ffsDupgUbpMSwHQJNKIZs8pOfjGB7Jl+4S9Xn2nTKuZzS1PPiKr8jZTfy+731iQbXuyNlH8t6YNlTeag/owCLM3q6vvGUX6Vl53yNrUBXY4tpaAN16C95sQDbSQBKLZJ1tOXZHvzW0ry7a/LAfPXZE7fv2arHPbHv6NzJx6Qda4ZR5aNH7we2kejAiqWelcdPuFi7HgjPTNxOGPf12ud0gL6slkOSSAaKCFDF40m1+Q/W//Tqa8Td8JWbXnHplYF85eDsv06fOyZbNb5lIVjR9oi4kmr4+1q+lrZJOX2zbzsRQPWaqIeS2ynkSjx1TfycmxY/rrvu611z6fIannQjTQQgYvml1q2XT6lEwUZXfKxifflYNnPpVZLSC3rWLq+U9l54xfVhKKxi6lykCskUWOE5T+TEhT19e9R96m2jYfz8yYehaNkkbeLheMd53fK/Z9nbYALWEZRKP5e9mtl07nYqK5Irvv8MtKbKDl/9LX7qE4lEEZBKkO4Mr+TlxSpTzKNr6o/HLvHt7zxMbXfd3v0eG68sxZGaKBljF40USXTnWieVC2n1mQ6e1umYuWRRmEOqj9ICsDvizL8JZAGn+s+r5uO6dNtlTSQe9my+tvRlMjlvA6Nh6igRYyeNGM7ZOt/xRsBteIZtXdv5PZf3q5h83gWFDGRePn5XUogrSmrzeL8NtYqcTKnL6DFk0wozHfC9FAy0ggGsUtr8mtb/xONm7Wm7+7Zf2x38n+M5dk5sx52fvID2RctzE/b38quw4v9vO2G4SKDiIoCYM3I7LR6/XVY3cSmal3ZdWlaCr3rRFL5Vp/dsbPrhENtI00ohmbkIljH8jhNz6Q6cP7groNsubwKdmnJLPv2J1BXUhENKYsD7Ys8Fy0hCIzAbevXfbU9PXa6zaujKrPUxFNMKa5V9+iUZi++XhqjDqZATSYRKKxjN/6sux99VM58qb7CsIVOfLrd2V6hr8KBlgpJBVNwbrdMnHwUdn4/QdlYtPmeBsAGFmWRzQAsKJBNACQHEQDAMlBNACQHEQDAMlBNACQHEQDAMlBNACQHEQDAMlBNACQHESTAP2ipXkJ8uIJ+7nXlyDNi5Thy6QA7SWxaFbLmcu75MblSZnT17dNyJufbJMbX6kyxdXz6+SOSp+W472pDQCaxKIZl3eu7ZVvrk3JUS2dz/bIN9/slqufbJELH98kn73XKRdNS9GiiaaoAFi5LKNo1spHN9TnrzbJ8elY2yp62VHm6dWU+WG8PDCaIE+Ll2Gvw9LFa+cIolj+GJwZSj5jcXLPFM8Y5KPRzxd+B/d+18+diOTbUQSzom6/C0BTWUbRjMnxD3epGY26/stO+ezD9XJ0MeHowHVnB45MOoom6FcVlsUEsNvunP0clnvjGQk4AW+ug0RVdfcOnssKZBHRBH0A2siyikaXHf35lFy6utsK52pZHsfPcOfKpV40Notep9mOJZa9TxNmvNM4bYPZRuV+taKJPFfdM7j3qNwPoH0kFs0aef8rKxSzGexw6hNV/s12efMhvzykEEokgDuJplhq5FRmBb7EFiv3niOo956lo2g6CKwoU4T30N/NfA+EA+0kkWjWyJmPt8iFyzvMzOXL99aosnF580/b5ZIu//gm+fIvSjQ3NsnxaH+HTCB6meEufzqLJhK8FWIzl7pyZ8wliSZ45rpniNzDoL9jRZgAzSeNaGbXy6X8J+yP18vcpC5X8rnk/LT9yaQcrz04zsXOMBYu+gFp9jeK5ZBuo/7Fz64reywOZeDbz267fI8mLPcCvG/RVJ/L26Nxx60TTV05QMNJI5oBUwl8QyaXfElRzGicPkV9KQI38Cvt6vq7916CaPLrfFzvV6c60ejvlT9HdAYG0HxaIZrRxc7WojOXilgB2guiGSJmduPMonL8ZSFA+0E0y4jdkymXTuFysKyPzHIAWgyiAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkIBoASA6iAYDkLJto1hw7L/t/uC9a1xQG8af/4UuUALAcorn5Zfne65fk8NtX5I5zV+TgI4fj7RoAogFIQ1LRrLrnXTmi5KIFk3Pr4/dE2zYBRAOQhqSiGVfLJVcyml5mNNWgdTLSmZwt5QuKZea6rM05m8dF988FYt6WNu3jeV0qognuEQrEtM/rsxckvWfOcsn4WfUAVh5pRTPzaznkiubt87Kly6NWDGHqSie51VElkkIWJqDzN579bHu2rRVCHvDmOpLvxReNHaeUhJ+KMxzDzc5nRGMkRaIqAE060Uy/IPuzfZmcw88+Em9bi58YSgdxfHbgtstmNE6A+wJRuBnsHNx2lT6aQnT1eYmtaOYDSQGsbJKJZs0jC55kLJdk+y29nU5ZysWXTj7jKJYuvYimMla1nf4cLpXKzHfx/hr9vOZ5QkkBrGASiWZCNjz7aUQ0V+TIzx6NtO+ADm4dtM6yqSoTN/AHJ5qKLIpnqN4jx85odC7g6p4OwEoljWi2vywHI5IxPP/3MrZ6t6x/9F05dOa8bN0T6e+hlynBKQjh0qeyR9ODaHTfbK/Fa2fuUb9HY2YunfZozD2QDYAmuWiOBPs0d7z9qfmbmkM/e0YmJiJ9IxgBBJu3pixfNl1UIhq0aDSZbPL7hHsuxTLJPIPtV4rG6e/dG2DlkUY0Yxtk4/NKMq9/IPt/7Urmkuz/2SmZ2rkh0qceLQBmBgDtJZFoHNbtlvHN+2R8qje5lDizDwBoJelFswTypQk/EwO0m0aLBgBGA0QDAMlBNACQHEQDAMlBNACQHEQDAMlBNACQHEQDAMlBNACQnPSi2f+YvHz6dXmtlhPy0/2RfiuVHcfkpdNPy2ysDqClpBfNva/IB3+4LH+o5b/JqXsj/VYqiAZGkPSigd5ANDCCpBfNsbfl2l+/k786XDv3cLxtwOxTp+Wlo9ucsll5+vRLcmyH+mwC8rScznj69qDN0adNue6/7ehLcvqpWTOebZ+NUYwbQ48TaZ+J4JgeM7uvfc5jtv1Lx2Rb0S7v738P+zzH5NhLui6QSkU07nMo1Pco2irMWMU9ZtWY3Xw3gOUlvWim9snsvXfJXQ6z+6bibUNuV7LIAze/zgJtmxJJEVC6vAjOLDCdgMyDMZeRuXbHrbDNSKCQlxv8mUBccViBVeVQys8fzz5PjRA80dh+4b2K6+C/T8dxAYbIUETjMyv7poI+BTpgywDWQVYGr4vbTn/2g80EoDsTiIjDzgqyfqHgTMBndZ4ILF7wKyr303iSjNTnuONXniOrN2WBDA3Oc7p9AIZMetFElk4+X8hbxyL9Mkq5+NLJZw35ssGf0SwimspYAWaG5I5tMc/RpWjca0MhiB5FU2mXP3tMKogGmkl60SwVHXg62LygC2XiimNAoulGBBnNmdFUvztAE0gvmtqft9+WJ2PtK+iAelqefsoJoDDYdUAOUjSmvmaZ1oVobBu3vy+FyvO4Y3rj2+dwx3bvZcZxRGSuEQ00kPSiqf2DveNyf6x9hDCgirJsSXP6KSWigYpGkcmiuEd+/25Eown6u9KqPE+taDRWNvk44X30vcs6fnWCZpJeNANAB2YlkCFCFwIFGAItEA3B0y1mdlO39wMwRBotmnxZEN0rAX/5qAk3jgEaQqNFAwCjAaIBgOQgGgBIDqIBgOQgGgBITlU0fyP/Hxn29DBuvnSjAAAAAElFTkSuQmCC

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者: Frank。 原文链接:https://juejin.im/post/6857432749172031502

回到顶部