From d7ddf3ab8d452ec926e9d856e3f8ca1c1a3b8284 Mon Sep 17 00:00:00 2001 From: nikogu <644506165@qq.com> Date: Mon, 28 Aug 2017 14:35:45 +0800 Subject: [PATCH] Extract scaffold to independent git repo --- .editorconfig | 16 + .eslintrc | 40 ++ .gitignore | 11 + .roadhogrc | 26 ++ .roadhogrc.mock.js | 79 ++++ mock/.gitkeep | 0 mock/api.js | 205 +++++++++ mock/chart.js | 184 +++++++++ mock/notices.js | 85 ++++ mock/profile.js | 74 ++++ mock/rule.js | 128 ++++++ mock/utils.js | 45 ++ package.json | 47 +++ public/index.html | 13 + src/assets/yay.jpg | Bin 0 -> 180902 bytes src/common/nav.js | 202 +++++++++ src/components/ActivitiesItem/index.js | 31 ++ src/components/ActivitiesItem/index.less | 41 ++ src/components/AvatarList/index.js | 43 ++ src/components/AvatarList/index.less | 29 ++ src/components/Charts/Bar/index.js | 86 ++++ src/components/Charts/ChartCard/index.js | 34 ++ src/components/Charts/ChartCard/index.less | 45 ++ src/components/Charts/Field/index.js | 12 + src/components/Charts/Field/index.less | 17 + src/components/Charts/Gauge/index.js | 195 +++++++++ src/components/Charts/Icon/index.js | 29 ++ src/components/Charts/MiniArea/index.js | 95 +++++ src/components/Charts/MiniBar/index.js | 78 ++++ src/components/Charts/MiniProgress/index.js | 27 ++ src/components/Charts/MiniProgress/index.less | 37 ++ src/components/Charts/NumberInfo/index.js | 32 ++ src/components/Charts/NumberInfo/index.less | 46 +++ src/components/Charts/Pie/index.js | 224 ++++++++++ src/components/Charts/Pie/index.less | 70 ++++ src/components/Charts/Radar/index.js | 155 +++++++ src/components/Charts/Radar/index.less | 38 ++ src/components/Charts/Trend/index.js | 22 + src/components/Charts/Trend/index.less | 49 +++ src/components/Charts/WaterWave/index.js | 189 +++++++++ src/components/Charts/WaterWave/index.less | 25 ++ src/components/Charts/index.js | 34 ++ src/components/Charts/index.less | 9 + src/components/Countdown/index.js | 108 +++++ src/components/DescriptionList/Description.js | 17 + .../DescriptionList/DescriptionList.js | 18 + src/components/DescriptionList/demo/basic.md | 35 ++ .../DescriptionList/demo/vertical.md | 35 ++ src/components/DescriptionList/index.js | 5 + src/components/DescriptionList/index.less | 50 +++ src/components/DescriptionList/index.md | 29 ++ src/components/DescriptionList/responsive.js | 6 + src/components/EditableLinkGroup/index.js | 46 +++ src/components/EditableLinkGroup/index.less | 29 ++ src/components/Exception/demo/403.md | 21 + src/components/Exception/demo/404.md | 14 + src/components/Exception/demo/500.md | 14 + src/components/Exception/index.js | 26 ++ src/components/Exception/index.less | 37 ++ src/components/Exception/index.md | 19 + src/components/Exception/typeConfig.js | 19 + src/components/FooterToolbar/index.js | 44 ++ src/components/FooterToolbar/index.less | 32 ++ src/components/FooterToolbar/index.md | 9 + src/components/GlobalFooter/demo/basic.md | 29 ++ src/components/GlobalFooter/index.js | 18 + src/components/GlobalFooter/index.less | 23 ++ src/components/GlobalFooter/index.md | 16 + src/components/HeaderSearch/index.js | 65 +++ src/components/HeaderSearch/index.less | 27 ++ src/components/MapChart/index.js | 32 ++ src/components/MapChart/index.less | 10 + src/components/NoticeIcon/NoticeList.js | 44 ++ src/components/NoticeIcon/NoticeList.less | 89 ++++ src/components/NoticeIcon/demo/basic.md | 12 + src/components/NoticeIcon/demo/popover.md | 41 ++ src/components/NoticeIcon/index.js | 93 +++++ src/components/NoticeIcon/index.less | 36 ++ src/components/NoticeIcon/index.md | 39 ++ src/components/PageHeader/demo/image.md | 71 ++++ src/components/PageHeader/demo/simple.md | 26 ++ src/components/PageHeader/demo/standard.md | 81 ++++ src/components/PageHeader/demo/structure.md | 67 +++ src/components/PageHeader/index.js | 98 +++++ src/components/PageHeader/index.less | 95 +++++ src/components/PageHeader/index.md | 26 ++ src/components/RadioText/index.js | 10 + src/components/RadioText/index.less | 12 + src/components/Result/demo/classic.md | 64 +++ src/components/Result/demo/error.md | 39 ++ src/components/Result/demo/structure.md | 20 + src/components/Result/index.js | 21 + src/components/Result/index.less | 45 ++ src/components/Result/index.md | 19 + src/components/SearchInput/index.js | 15 + src/components/SearchInput/index.less | 45 ++ src/components/StandardFormRow/index.js | 24 ++ src/components/StandardFormRow/index.less | 68 +++ src/components/StandardTable/index.js | 149 +++++++ src/components/StandardTable/index.less | 22 + src/components/TagCloud/index.js | 134 ++++++ src/components/TagSelect/index.js | 164 ++++++++ src/components/TagSelect/index.less | 26 ++ src/components/TimelineChart/index.js | 104 +++++ src/components/TimelineChart/index.less | 3 + src/index.js | 25 ++ src/index.less | 14 + src/layouts/BasicLayout.js | 260 ++++++++++++ src/layouts/BasicLayout.less | 95 +++++ src/layouts/BlankLayout.js | 3 + src/layouts/PageHeaderLayout.js | 9 + src/layouts/UserLayout.js | 60 +++ src/layouts/UserLayout.less | 46 +++ src/models/activities.js | 43 ++ src/models/chart.js | 64 +++ src/models/form.js | 88 ++++ src/models/global.js | 53 +++ src/models/index.js | 11 + src/models/list.js | 46 +++ src/models/login.js | 58 +++ src/models/monitor.js | 28 ++ src/models/profile.js | 45 ++ src/models/project.js | 43 ++ src/models/register.js | 42 ++ src/models/rule.js | 80 ++++ src/models/user.js | 57 +++ src/router.js | 47 +++ src/routes/Dashboard.css | 5 + src/routes/Dashboard.js | 100 +++++ src/routes/Dashboard/Analysis.js | 388 ++++++++++++++++++ src/routes/Dashboard/Analysis.less | 100 +++++ src/routes/Dashboard/Monitor.js | 191 +++++++++ src/routes/Dashboard/Monitor.less | 45 ++ src/routes/Dashboard/Workplace.js | 263 ++++++++++++ src/routes/Dashboard/Workplace.less | 191 +++++++++ src/routes/Exception/403.js | 4 + src/routes/Exception/404.js | 4 + src/routes/Exception/500.js | 4 + src/routes/Forms/AdvancedForm.js | 267 ++++++++++++ src/routes/Forms/BasicForm.js | 145 +++++++ src/routes/Forms/StepForm/Step1.js | 101 +++++ src/routes/Forms/StepForm/Step2.js | 89 ++++ src/routes/Forms/StepForm/Step3.js | 51 +++ src/routes/Forms/StepForm/index.js | 63 +++ src/routes/Forms/StepForm/style.less | 59 +++ src/routes/Forms/TableForm.js | 200 +++++++++ src/routes/Forms/style.less | 78 ++++ src/routes/List/BasicList.js | 145 +++++++ src/routes/List/BasicList.less | 103 +++++ src/routes/List/CardList.js | 91 ++++ src/routes/List/CardList.less | 71 ++++ src/routes/List/CoverCardList.js | 206 ++++++++++ src/routes/List/CoverCardList.less | 24 ++ src/routes/List/FilterCardList.js | 211 ++++++++++ src/routes/List/FilterCardList.less | 54 +++ src/routes/List/SearchList.js | 274 +++++++++++++ src/routes/List/SearchList.less | 45 ++ src/routes/List/TableList.js | 265 ++++++++++++ src/routes/List/TableList.less | 23 ++ src/routes/Profile.js | 255 ++++++++++++ src/routes/Profile.less | 27 ++ src/routes/Result/Error.js | 37 ++ src/routes/Result/Success.js | 69 ++++ src/routes/User/Login.js | 172 ++++++++ src/routes/User/Login.less | 79 ++++ src/routes/User/Register.js | 261 ++++++++++++ src/routes/User/Register.less | 84 ++++ src/routes/User/RegisterResult.js | 23 ++ src/services/api.js | 82 ++++ src/services/user.js | 9 + src/utils/request.js | 38 ++ src/utils/utils.js | 55 +++ src/utils/utils.less | 48 +++ 173 files changed, 11798 insertions(+) create mode 100755 .editorconfig create mode 100755 .eslintrc create mode 100755 .gitignore create mode 100755 .roadhogrc create mode 100644 .roadhogrc.mock.js create mode 100644 mock/.gitkeep create mode 100644 mock/api.js create mode 100644 mock/chart.js create mode 100644 mock/notices.js create mode 100644 mock/profile.js create mode 100644 mock/rule.js create mode 100644 mock/utils.js create mode 100755 package.json create mode 100755 public/index.html create mode 100644 src/assets/yay.jpg create mode 100644 src/common/nav.js create mode 100644 src/components/ActivitiesItem/index.js create mode 100644 src/components/ActivitiesItem/index.less create mode 100644 src/components/AvatarList/index.js create mode 100644 src/components/AvatarList/index.less create mode 100644 src/components/Charts/Bar/index.js create mode 100644 src/components/Charts/ChartCard/index.js create mode 100644 src/components/Charts/ChartCard/index.less create mode 100644 src/components/Charts/Field/index.js create mode 100644 src/components/Charts/Field/index.less create mode 100644 src/components/Charts/Gauge/index.js create mode 100644 src/components/Charts/Icon/index.js create mode 100644 src/components/Charts/MiniArea/index.js create mode 100644 src/components/Charts/MiniBar/index.js create mode 100644 src/components/Charts/MiniProgress/index.js create mode 100644 src/components/Charts/MiniProgress/index.less create mode 100644 src/components/Charts/NumberInfo/index.js create mode 100644 src/components/Charts/NumberInfo/index.less create mode 100644 src/components/Charts/Pie/index.js create mode 100644 src/components/Charts/Pie/index.less create mode 100644 src/components/Charts/Radar/index.js create mode 100644 src/components/Charts/Radar/index.less create mode 100644 src/components/Charts/Trend/index.js create mode 100644 src/components/Charts/Trend/index.less create mode 100644 src/components/Charts/WaterWave/index.js create mode 100644 src/components/Charts/WaterWave/index.less create mode 100644 src/components/Charts/index.js create mode 100644 src/components/Charts/index.less create mode 100644 src/components/Countdown/index.js create mode 100644 src/components/DescriptionList/Description.js create mode 100644 src/components/DescriptionList/DescriptionList.js create mode 100644 src/components/DescriptionList/demo/basic.md create mode 100644 src/components/DescriptionList/demo/vertical.md create mode 100644 src/components/DescriptionList/index.js create mode 100644 src/components/DescriptionList/index.less create mode 100644 src/components/DescriptionList/index.md create mode 100644 src/components/DescriptionList/responsive.js create mode 100644 src/components/EditableLinkGroup/index.js create mode 100644 src/components/EditableLinkGroup/index.less create mode 100644 src/components/Exception/demo/403.md create mode 100644 src/components/Exception/demo/404.md create mode 100644 src/components/Exception/demo/500.md create mode 100644 src/components/Exception/index.js create mode 100644 src/components/Exception/index.less create mode 100644 src/components/Exception/index.md create mode 100644 src/components/Exception/typeConfig.js create mode 100644 src/components/FooterToolbar/index.js create mode 100644 src/components/FooterToolbar/index.less create mode 100644 src/components/FooterToolbar/index.md create mode 100644 src/components/GlobalFooter/demo/basic.md create mode 100644 src/components/GlobalFooter/index.js create mode 100644 src/components/GlobalFooter/index.less create mode 100644 src/components/GlobalFooter/index.md create mode 100644 src/components/HeaderSearch/index.js create mode 100644 src/components/HeaderSearch/index.less create mode 100644 src/components/MapChart/index.js create mode 100644 src/components/MapChart/index.less create mode 100644 src/components/NoticeIcon/NoticeList.js create mode 100644 src/components/NoticeIcon/NoticeList.less create mode 100644 src/components/NoticeIcon/demo/basic.md create mode 100644 src/components/NoticeIcon/demo/popover.md create mode 100644 src/components/NoticeIcon/index.js create mode 100644 src/components/NoticeIcon/index.less create mode 100644 src/components/NoticeIcon/index.md create mode 100644 src/components/PageHeader/demo/image.md create mode 100644 src/components/PageHeader/demo/simple.md create mode 100644 src/components/PageHeader/demo/standard.md create mode 100644 src/components/PageHeader/demo/structure.md create mode 100644 src/components/PageHeader/index.js create mode 100644 src/components/PageHeader/index.less create mode 100644 src/components/PageHeader/index.md create mode 100644 src/components/RadioText/index.js create mode 100644 src/components/RadioText/index.less create mode 100644 src/components/Result/demo/classic.md create mode 100644 src/components/Result/demo/error.md create mode 100644 src/components/Result/demo/structure.md create mode 100644 src/components/Result/index.js create mode 100644 src/components/Result/index.less create mode 100644 src/components/Result/index.md create mode 100644 src/components/SearchInput/index.js create mode 100644 src/components/SearchInput/index.less create mode 100644 src/components/StandardFormRow/index.js create mode 100644 src/components/StandardFormRow/index.less create mode 100644 src/components/StandardTable/index.js create mode 100644 src/components/StandardTable/index.less create mode 100644 src/components/TagCloud/index.js create mode 100644 src/components/TagSelect/index.js create mode 100644 src/components/TagSelect/index.less create mode 100644 src/components/TimelineChart/index.js create mode 100644 src/components/TimelineChart/index.less create mode 100644 src/index.js create mode 100644 src/index.less create mode 100644 src/layouts/BasicLayout.js create mode 100644 src/layouts/BasicLayout.less create mode 100644 src/layouts/BlankLayout.js create mode 100644 src/layouts/PageHeaderLayout.js create mode 100644 src/layouts/UserLayout.js create mode 100644 src/layouts/UserLayout.less create mode 100644 src/models/activities.js create mode 100644 src/models/chart.js create mode 100644 src/models/form.js create mode 100644 src/models/global.js create mode 100644 src/models/index.js create mode 100644 src/models/list.js create mode 100644 src/models/login.js create mode 100644 src/models/monitor.js create mode 100644 src/models/profile.js create mode 100644 src/models/project.js create mode 100644 src/models/register.js create mode 100644 src/models/rule.js create mode 100644 src/models/user.js create mode 100644 src/router.js create mode 100644 src/routes/Dashboard.css create mode 100644 src/routes/Dashboard.js create mode 100644 src/routes/Dashboard/Analysis.js create mode 100644 src/routes/Dashboard/Analysis.less create mode 100644 src/routes/Dashboard/Monitor.js create mode 100644 src/routes/Dashboard/Monitor.less create mode 100644 src/routes/Dashboard/Workplace.js create mode 100644 src/routes/Dashboard/Workplace.less create mode 100644 src/routes/Exception/403.js create mode 100644 src/routes/Exception/404.js create mode 100644 src/routes/Exception/500.js create mode 100644 src/routes/Forms/AdvancedForm.js create mode 100644 src/routes/Forms/BasicForm.js create mode 100644 src/routes/Forms/StepForm/Step1.js create mode 100644 src/routes/Forms/StepForm/Step2.js create mode 100644 src/routes/Forms/StepForm/Step3.js create mode 100644 src/routes/Forms/StepForm/index.js create mode 100644 src/routes/Forms/StepForm/style.less create mode 100644 src/routes/Forms/TableForm.js create mode 100644 src/routes/Forms/style.less create mode 100644 src/routes/List/BasicList.js create mode 100644 src/routes/List/BasicList.less create mode 100644 src/routes/List/CardList.js create mode 100644 src/routes/List/CardList.less create mode 100644 src/routes/List/CoverCardList.js create mode 100644 src/routes/List/CoverCardList.less create mode 100644 src/routes/List/FilterCardList.js create mode 100644 src/routes/List/FilterCardList.less create mode 100644 src/routes/List/SearchList.js create mode 100644 src/routes/List/SearchList.less create mode 100644 src/routes/List/TableList.js create mode 100644 src/routes/List/TableList.less create mode 100644 src/routes/Profile.js create mode 100644 src/routes/Profile.less create mode 100644 src/routes/Result/Error.js create mode 100644 src/routes/Result/Success.js create mode 100644 src/routes/User/Login.js create mode 100644 src/routes/User/Login.less create mode 100644 src/routes/User/Register.js create mode 100644 src/routes/User/Register.less create mode 100644 src/routes/User/RegisterResult.js create mode 100644 src/services/api.js create mode 100644 src/services/user.js create mode 100644 src/utils/request.js create mode 100644 src/utils/utils.js create mode 100644 src/utils/utils.less diff --git a/.editorconfig b/.editorconfig new file mode 100755 index 00000000..7e3649ac --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.eslintrc b/.eslintrc new file mode 100755 index 00000000..a655538f --- /dev/null +++ b/.eslintrc @@ -0,0 +1,40 @@ +{ + "parser": "babel-eslint", + "extends": "airbnb", + "rules": { + "generator-star-spacing": [0], + "consistent-return": [0], + "react/forbid-prop-types": [0], + "react/jsx-filename-extension": [1, { "extensions": [".js"] }], + "global-require": [1], + "import/prefer-default-export": [0], + "react/jsx-no-bind": [0], + "react/prop-types": [0], + "react/prefer-stateless-function": [0], + "no-else-return": [0], + "no-restricted-syntax": [0], + "import/no-extraneous-dependencies": [0], + "no-use-before-define": [0], + "jsx-a11y/no-static-element-interactions": [0], + "jsx-a11y/no-noninteractive-element-interactions": [0], + "no-nested-ternary": [0], + "arrow-body-style": [0], + "import/extensions": [0], + "no-bitwise": [0], + "no-cond-assign": [0], + "import/no-unresolved": [0], + "comma-dangle": ["error", { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "ignore" + }], + "require-yield": [1] + }, + "parserOptions": { + "ecmaFeatures": { + "experimentalObjectRestSpread": true + } + } +} diff --git a/.gitignore b/.gitignore new file mode 100755 index 00000000..aa6e4c4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# production +/dist + +# misc +.DS_Store +npm-debug.log* diff --git a/.roadhogrc b/.roadhogrc new file mode 100755 index 00000000..b693be04 --- /dev/null +++ b/.roadhogrc @@ -0,0 +1,26 @@ +{ + "entry": "src/index.js", + "env": { + "development": { + "extraBabelPlugins": [ + "dva-hmr", + "transform-runtime", + "transform-decorators-legacy", + ["import", { "libraryName": "antd", "style": true }] + ] + }, + "production": { + "extraBabelPlugins": [ + "transform-runtime", + "transform-decorators-legacy", + ["import", { "libraryName": "antd", "style": true }] + ] + } + }, + "theme": { + "font-size-base": "14px", + "badge-font-size": "12px", + "btn-font-size-lg": "@font-size-base", + "layout-body-background": "#f5f5f5" + } +} diff --git a/.roadhogrc.mock.js b/.roadhogrc.mock.js new file mode 100644 index 00000000..d086fa8d --- /dev/null +++ b/.roadhogrc.mock.js @@ -0,0 +1,79 @@ +import mockjs from 'mockjs'; +import { getRule, postRule } from './mock/rule'; +import { getActivities, getNotice, getFakeList } from './mock/api'; +import { getFakeChartData } from './mock/chart'; +import { imgMap } from './mock/utils'; +import { getProfileData } from './mock/profile'; +import { getNotices } from './mock/notices'; +import { format, delay } from 'roadhog-api-doc'; + +// 代码中会兼容本地 service mock 以及部署站点的静态数据 + +const proxy = { + // 支持值为 Object 和 Array + 'GET /api/currentUser': { + $desc: "获取当前用户接口", + $params: { + pageSize: { + desc: '分页', + exp: 2, + }, + }, + $body: { + name: 'momo.zxy', + avatar: imgMap.user, + userid: '00000001', + notifyCount: 12, + }, + }, + // GET POST 可省略 + 'GET /api/users': [{ + key: '1', + name: 'John Brown', + age: 32, + address: 'New York No. 1 Lake Park', + }, { + key: '2', + name: 'Jim Green', + age: 42, + address: 'London No. 1 Lake Park', + }, { + key: '3', + name: 'Joe Black', + age: 32, + address: 'Sidney No. 1 Lake Park', + }], + 'GET /api/project/notice': getNotice, + 'GET /api/activities': getActivities, + 'GET /api/rule': getRule, + 'POST /api/rule': { + $params: { + pageSize: { + desc: '分页', + exp: 2, + }, + }, + $body: postRule, + }, + 'POST /api/forms': (req, res) => { + res.send('Ok'); + }, + 'GET /api/tags': mockjs.mock({ + 'list|100': [{ name: '@city', 'value|1-100': 50, 'type|0-2': 1 }] + }), + 'GET /api/fake_list': getFakeList, + 'GET /api/fake_chart_data': getFakeChartData, + 'GET /api/profile': getProfileData, + 'POST /api/login/account': (req, res) => { + res.send({ status: 'error', type: 'account' }); + }, + 'POST /api/login/mobile': (req, res) => { + res.send({ status: 'ok', type: 'mobile' }); + }, + 'POST /api/register': (req, res) => { + res.send({ status: 'ok' }); + }, + 'GET /api/notices': getNotices, +}; + +export default delay(proxy, 1000); diff --git a/mock/.gitkeep b/mock/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/mock/api.js b/mock/api.js new file mode 100644 index 00000000..d652f5bd --- /dev/null +++ b/mock/api.js @@ -0,0 +1,205 @@ +import { imgMap, getUrlParams } from './utils'; + +export function fakeList(count) { + const titles = [ + '凤蝶', + 'AntDesignPro', + 'DesignLab', + 'Basement', + 'AntDesign', + '云雀', + '体验云', + 'AntDesignMobile', + ]; + const avatars = [ + 'https://gw.alipayobjects.com/zos/rmsportal/hYjIZrUoBfNxOAYBVDfc.png', // 凤蝶 + 'https://gw.alipayobjects.com/zos/rmsportal/HHWPIzPLCLYmVuPivyiA.png', // 云雀 + 'https://gw.alipayobjects.com/zos/rmsportal/irqByKtOdKfDojxIWTXF.png', // Basement + 'https://gw.alipayobjects.com/zos/rmsportal/VcmdbCBcwPTGYgbYeMzX.png', // DesignLab + ]; + const covers = [ + 'https://gw.alipayobjects.com/zos/rmsportal/JiqGstEfoWAOHiTxclqi.png', + 'https://gw.alipayobjects.com/zos/rmsportal/xMPpMvGSIXusgtgUPAdw.png', + 'https://gw.alipayobjects.com/zos/rmsportal/hQReiajgtqzIVFjLXjHp.png', + 'https://gw.alipayobjects.com/zos/rmsportal/nczfTaXEzhSpvgZZjBev.png', + ]; + + const list = []; + for (let i = 0; i < count; i += 1) { + list.push({ + id: `fake-list-${i}`, + owner: '曲丽丽', + title: titles[i % 8], + avatar: avatars[i % 4], + cover: covers[i % 4], + status: ['active', 'exception', 'normal'][i % 3], + percent: Math.ceil(Math.random() * 50) + 50, + logo: ['https://gw.alipayobjects.com/zos/rmsportal/KoJjkdbuTFxzJmmjuDVR.png', 'https://gw.alipayobjects.com/zos/rmsportal/UxGORCvEXJEsxOfEKZiA.png'][i % 2], + href: 'https://ant.design', + updatedAt: new Date(new Date().getTime() - (1000 * 60 * 60 * 2 * i)), + createdAt: new Date(new Date().getTime() - (1000 * 60 * 60 * 2 * i)), + subDescription: '一句话描述一句话描述', + description: '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。', + activeUser: Math.ceil(Math.random() * 100000) + 100000, + newUser: Math.ceil(Math.random() * 1000) + 1000, + star: Math.ceil(Math.random() * 100) + 100, + like: Math.ceil(Math.random() * 100) + 100, + message: Math.ceil(Math.random() * 10) + 10, + content: '段落示意:蚂蚁金服设计平台 design.alipay.com,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 design.alipay.com,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。', + members: [ + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WPOxPBHGyqsgKPsFtVlJ.png', + name: '王昭君', + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WPOxPBHGyqsgKPsFtVlJ.png', + name: '王昭君', + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WPOxPBHGyqsgKPsFtVlJ.png', + name: '王昭君', + }, + { + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WPOxPBHGyqsgKPsFtVlJ.png', + name: '王昭君', + }, + ], + }); + } + + return list; +} + +export function getFakeList(req, res, u) { + let url = u; + if (!url || Object.prototype.toString.call(url) !== '[object String]') { + url = req.url; + } + + const params = getUrlParams(url); + + const count = (params.count * 1) || 20; + + const result = fakeList(count); + + if (res && res.json) { + res.json(result); + } else { + return result; + } +} + +export const getNotice = [ + { + id: 'xxx1', + title: '消息列表体验优化', + logo: imgMap.b, + description: '这是一条描述信息这是一条描述信息', + updatedAt: new Date(), + member: '蜂鸟项目组', + }, + { + id: 'xxx2', + title: 'XX 平台', + logo: imgMap.c, + description: '这是一条描述信息', + updatedAt: new Date('2017-07-24 11:00:00'), + member: '凤蝶精英小分队', + }, + { + id: 'xxx3', + title: '消息列表体验优化', + logo: imgMap.a, + description: '这是一条描述信息这是一条描述信息', + updatedAt: new Date(), + member: '蜂鸟项目组', + }, + { + id: 'xxx4', + title: '文档中心1', + logo: imgMap.a, + description: '这是一条描述信息这是一条描述信息', + updatedAt: new Date('2017-07-23 06:23:00'), + member: '成都超级小分队', + }, + { + id: 'xxx5', + title: '文档中心2', + logo: imgMap.b, + description: '这是一条描述信息这是一条描述信息', + updatedAt: new Date('2017-07-23 06:23:00'), + member: '成都超级小分队', + }, + { + id: 'xxx6', + title: '智能运营中心', + logo: imgMap.c, + description: '这是一条描述信息这是一条描述信息', + updatedAt: new Date('2017-07-23 06:23:00'), + member: '成都超级小分队', + }, +]; + +export const getActivities = [ + { + id: 'trend-1', + updatedAt: new Date(), + user: { + name: '林东东', + avatar: imgMap.a, + }, + action: '在 [凤蝶精英小分队](http://github.com/) 新建项目 [六月迭代](http://github.com/)', + }, + { + id: 'trend-2', + updatedAt: new Date(), + user: { + name: '林嘻嘻', + avatar: imgMap.c, + }, + action: '在 [凤蝶精英小分队](http://github.com/) 新建项目 [六月迭代](http://github.com/)', + }, + { + id: 'trend-3', + updatedAt: new Date(), + user: { + name: '林囡囡', + avatar: imgMap.b, + }, + action: '在 [凤蝶精英小分队](http://github.com/) 新建项目 [六月迭代](http://github.com/)', + }, + { + id: 'trend-4', + updatedAt: new Date(), + user: { + name: '林贝贝', + avatar: imgMap.c, + }, + action: '在 [5 月日常迭代](http://github.com/) 更新至已发布状态', + }, + { + id: 'trend-5', + updatedAt: new Date(), + user: { + name: '林忠忠', + avatar: imgMap.a, + }, + action: '在 [工程效能](http://github.com/) 发布了 [留言](http://github.com/)', + }, + { + id: 'trend-6', + updatedAt: new Date(), + user: { + name: '林呜呜', + avatar: imgMap.d, + }, + action: '在 [云雀](http://github.com/) 新建项目 [品牌迭代](http://github.com/)', + }, +]; + + +export default { + getNotice, + getActivities, + getFakeList, +}; diff --git a/mock/chart.js b/mock/chart.js new file mode 100644 index 00000000..d28c5521 --- /dev/null +++ b/mock/chart.js @@ -0,0 +1,184 @@ +import moment from 'moment'; + +// mock data +const visitData = []; +const beginDay = new Date().getTime(); +for (let i = 0; i < 20; i += 1) { + visitData.push({ + x: moment(new Date(beginDay + (1000 * 60 * 60 * 24 * i))).format('YYYY-MM-DD'), + y: Math.floor(Math.random() * 100) + 10, + }); +} +const salesData = []; +for (let i = 0; i < 12; i += 1) { + salesData.push({ + x: `${i + 1}月`, + y: Math.floor(Math.random() * 1000) + 200, + }); +} +const searchData = []; +for (let i = 0; i < 50; i += 1) { + searchData.push({ + index: i + 1, + keyword: `搜索关键词-${i}`, + count: Math.floor(Math.random() * 1000), + range: Math.floor(Math.random() * 100), + status: Math.floor((Math.random() * 10) % 2), + }); +} +const salesTypeData = [ + { + x: '家用电器', + y: 4544, + }, + { + x: '食用酒水', + y: 3321, + }, + { + x: '个护健康', + y: 3113, + }, + { + x: '服饰箱包', + y: 2341, + }, + { + x: '母婴产品', + y: 1231, + }, + { + x: '其他', + y: 1231, + }, +]; + +const salesTypeDataOnline = [ + { + x: '家用电器', + y: 244, + }, + { + x: '食用酒水', + y: 321, + }, + { + x: '个护健康', + y: 311, + }, + { + x: '服饰箱包', + y: 41, + }, + { + x: '母婴产品', + y: 121, + }, + { + x: '其他', + y: 111, + }, +]; + +const salesTypeDataOffline = [ + { + x: '家用电器', + y: 99, + }, + { + x: '个护健康', + y: 188, + }, + { + x: '服饰箱包', + y: 344, + }, + { + x: '母婴产品', + y: 255, + }, + { + x: '其他', + y: 65, + }, +]; + +const offlineData = []; +for (let i = 0; i < 10; i += 1) { + offlineData.push({ + name: `门店${i}`, + cvr: Math.ceil(Math.random() * 9) / 10, + }); +} +const offlineChartData = []; +for (let i = 0; i < 20; i += 1) { + offlineChartData.push({ + x: (new Date().getTime()) + (1000 * 60 * 30 * i), + y1: Math.floor(Math.random() * 100) + 10, + y2: Math.floor(Math.random() * 100) + 10, + }); +} + +const radarOriginData = [ + { + name: '个人', + ref: 10, + koubei: 8, + output: 4, + contribute: 5, + hot: 7, + }, + { + name: '团队', + ref: 3, + koubei: 9, + output: 6, + contribute: 3, + hot: 1, + }, + { + name: '部门', + ref: 4, + koubei: 1, + output: 6, + contribute: 5, + hot: 7, + }, +]; + +// +const radarData = []; +const radarTitleMap = { + ref: '引用', + koubei: '口碑', + output: '产量', + contribute: '贡献', + hot: '热度', +}; +radarOriginData.forEach((item) => { + Object.keys(item).forEach((key) => { + if (key !== 'name') { + radarData.push({ + name: item.name, + label: radarTitleMap[key], + value: item[key], + }); + } + }); +}); + +export const getFakeChartData = { + visitData, + salesData, + searchData, + offlineData, + offlineChartData, + salesTypeData, + salesTypeDataOnline, + salesTypeDataOffline, + radarData, +}; + +export default { + getFakeChartData, +}; diff --git a/mock/notices.js b/mock/notices.js new file mode 100644 index 00000000..782fac4f --- /dev/null +++ b/mock/notices.js @@ -0,0 +1,85 @@ +export default { + getNotices(req, res) { + res.json([{ + id: '000000001', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png', + title: '你收到了 14 份新周报', + datetime: '2017-08-09', + type: '通知', + }, { + id: '000000002', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png', + title: '你推荐的 曲妮妮 已通过第三轮面试', + datetime: '2017-08-08', + type: '通知', + }, { + id: '000000003', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png', + title: '这种模板可以区分多种通知类型', + datetime: '2017-08-07', + read: true, + type: '通知', + }, { + id: '000000004', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png', + title: '左侧图标用于区分不同的类型', + datetime: '2017-08-07', + type: '通知', + }, { + id: '000000005', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png', + title: '内容不要超过两行字,超出时自动截断', + datetime: '2017-08-07', + type: '通知', + }, { + id: '000000006', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '曲丽丽 评论了你', + description: '描述信息描述信息描述信息', + datetime: '2017-08-07', + type: '消息', + }, { + id: '000000007', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '朱偏右 回复了你', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: '消息', + }, { + id: '000000008', + avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg', + title: '标题', + description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像', + datetime: '2017-08-07', + type: '消息', + }, { + id: '000000009', + title: '任务名称', + description: '任务需要在 2017-01-12 20:00 前启动', + extra: '马上到期', + status: 'urgent', + type: '待办', + }, { + id: '000000010', + title: '第三方紧急代码变更', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '马上到期', + status: 'urgent', + type: '待办', + }, { + id: '000000011', + title: '信息安全考试', + description: '指派竹尔于 2017-01-09 前完成更新并发布', + extra: '已耗时 8 天', + status: 'doing', + type: '待办', + }, { + id: '000000012', + title: 'ABCD 版本发布', + description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务', + extra: '进行中', + status: 'processing', + type: '待办', + }]); + }, +}; diff --git a/mock/profile.js b/mock/profile.js new file mode 100644 index 00000000..d2e6083d --- /dev/null +++ b/mock/profile.js @@ -0,0 +1,74 @@ +const operation1 = [ + { + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, + { + key: 'op2', + type: '财务复审', + name: '付小小', + status: 'reject', + updatedAt: '2017-10-03 19:23:12', + memo: '不通过原因', + }, + { + key: 'op3', + type: '部门初审', + name: '周毛毛', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, + { + key: 'op4', + type: '提交订单', + name: '林东东', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '很棒', + }, + { + key: 'op5', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, +]; + +const operation2 = [ + { + key: 'op1', + type: '订购关系生效', + name: '曲丽丽', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, +]; + +const operation3 = [ + { + key: 'op1', + type: '创建订单', + name: '汗牙牙', + status: 'agree', + updatedAt: '2017-10-03 19:23:12', + memo: '-', + }, +]; + +export const getProfileData = { + operation1, + operation2, + operation3, +}; + +export default { + getProfileData, +}; diff --git a/mock/rule.js b/mock/rule.js new file mode 100644 index 00000000..13a4f353 --- /dev/null +++ b/mock/rule.js @@ -0,0 +1,128 @@ +import { getUrlParams } from './utils'; + +// mock tableListDataSource +let tableListDataSource = []; +for (let i = 0; i < 46; i += 1) { + tableListDataSource.push({ + key: i, + href: 'https://ant.design', + avatar: ['https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'][i % 2], + no: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + description: '这是一段描述', + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 2, + updatedAt: new Date(`2017-07-${Math.floor(i / 2) + 1} ${Math.floor(i / 2) + 1}:00:00`), + createdAt: new Date(`2017-07-${Math.floor(i / 2) + 1} ${Math.floor(i / 2) + 1}:00:00`), + progress: Math.ceil(Math.random() * 100), + }); +} + +export function getRule(req, res, u) { + let url = u; + if (!url || Object.prototype.toString.call(url) !== '[object String]') { + url = req.url; + } + + const params = getUrlParams(url); + + let dataSource = [...tableListDataSource]; + + if (params.sorter) { + const s = params.sorter.split('_'); + dataSource = dataSource.sort((prev, next) => { + if (s[1] === 'descend') { + return next[s[0]] - prev[s[0]]; + } + return prev[s[0]] - next[s[0]]; + }); + } + + if (params.status) { + const s = params.status.split(','); + if (s.length === 1) { + dataSource = dataSource.filter(data => parseInt(data.status, 10) === parseInt(s[0], 10)); + } + } + + if (params.no) { + dataSource = dataSource.filter(data => data.no.indexOf(params.no) > -1); + } + + let pageSize = 10; + if (params.pageSize) { + pageSize = params.pageSize * 1; + } + + const result = { + list: dataSource, + pagination: { + total: dataSource.length, + pageSize, + current: parseInt(params.currentPage, 10) || 1, + }, + }; + + if (res && res.json) { + res.json(result); + } else { + return result; + } +} + +export function postRule(req, res, u, b) { + let url = u; + if (!url || Object.prototype.toString.call(url) !== '[object String]') { + url = req.url; + } + + const body = (b && b.body) || req.body; + const method = body.method; + + switch (method) { + /* eslint no-case-declarations:0 */ + case 'delete': + const no = body.no; + tableListDataSource = tableListDataSource.filter(item => no.indexOf(item.no) === -1); + break; + case 'post': + const description = body.description; + const i = Math.ceil(Math.random() * 10000); + tableListDataSource.unshift({ + key: i, + href: 'https://ant.design', + avatar: ['https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'][i % 2], + no: `TradeCode ${i}`, + title: `一个任务名称 ${i}`, + owner: '曲丽丽', + description, + callNo: Math.floor(Math.random() * 1000), + status: Math.floor(Math.random() * 10) % 2, + updatedAt: new Date(), + createdAt: new Date(), + progress: Math.ceil(Math.random() * 100), + }); + break; + default: + break; + } + + const result = { + list: tableListDataSource, + pagination: { + total: tableListDataSource.length, + }, + }; + + if (res && res.json) { + res.json(result); + } else { + return result; + } +} + +export default { + getRule, + postRule, +}; diff --git a/mock/utils.js b/mock/utils.js new file mode 100644 index 00000000..6e1c72fe --- /dev/null +++ b/mock/utils.js @@ -0,0 +1,45 @@ +export const imgMap = { + user: 'https://gw.alipayobjects.com/zos/rmsportal/YdMCpIJULitXfqHCFPbF.png', + a: 'https://gw.alipayobjects.com/zos/rmsportal/ZrkcSjizAKNWwJTwcadT.png', + b: 'https://gw.alipayobjects.com/zos/rmsportal/KYlwHMeomKQbhJDRUVvt.png', + c: 'https://gw.alipayobjects.com/zos/rmsportal/gabvleTstEvzkbQRfjxu.png', + d: 'https://gw.alipayobjects.com/zos/rmsportal/jvpNzacxUYLlNsHTtrAD.png', +}; + +// refers: https://www.sitepoint.com/get-url-parameters-with-javascript/ +export function getUrlParams(url) { + const d = decodeURIComponent; + let queryString = url ? url.split('?')[1] : window.location.search.slice(1); + const obj = {}; + if (queryString) { + queryString = queryString.split('#')[0]; + const arr = queryString.split('&'); + for (let i = 0; i < arr.length; i += 1) { + const a = arr[i].split('='); + let paramNum; + const paramName = a[0].replace(/\[\d*\]/, (v) => { + paramNum = v.slice(1, -1); + return ''; + }); + const paramValue = typeof (a[1]) === 'undefined' ? true : a[1]; + if (obj[paramName]) { + if (typeof obj[paramName] === 'string') { + obj[paramName] = d([obj[paramName]]); + } + if (typeof paramNum === 'undefined') { + obj[paramName].push(d(paramValue)); + } else { + obj[paramName][paramNum] = d(paramValue); + } + } else { + obj[paramName] = d(paramValue); + } + } + } + return obj; +} + +export default { + getUrlParams, + imgMap, +}; diff --git a/package.json b/package.json new file mode 100755 index 00000000..834aa128 --- /dev/null +++ b/package.json @@ -0,0 +1,47 @@ +{ + "name": "ant-design-admin", + "private": true, + "scripts": { + "start": "roadhog server", + "build": "roadhog build", + "lint": "eslint --ext .js src test", + "precommit": "npm run lint" + }, + "dependencies": { + "antd": "next", + "dva": "^1.2.1", + "g-cloud": "^1.0.2-beta", + "g2": "^2.3.8", + "g2-plugin-slider": "^1.2.1", + "lodash": "^4.17.4", + "marked": "^0.3.6", + "numeral": "^2.0.6", + "prop-types": "^15.5.10", + "qs": "^6.5.0", + "react": "^15.4.0", + "react-document-title": "^2.0.3", + "react-dom": "^15.4.0", + "react-redux": "4.x || 5.x", + "react-router": "2.x || 3.x" + }, + "devDependencies": { + "babel-eslint": "^7.1.1", + "babel-plugin-dva-hmr": "^0.3.2", + "babel-plugin-import": "^1.2.1", + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-plugin-transform-runtime": "^6.9.0", + "babel-runtime": "^6.9.2", + "eslint": "^3.0.0", + "eslint-config-airbnb": "latest", + "eslint-plugin-babel": "^4.0.0", + "eslint-plugin-import": "^2.2.0", + "eslint-plugin-jsx-a11y": "^5.0.1", + "eslint-plugin-react": "^7.0.1", + "expect": "^1.20.2", + "husky": "^0.13.4", + "mockjs": "^1.0.1-beta3", + "redbox-react": "^1.3.2", + "roadhog": "^1.0.2", + "roadhog-api-doc": "^0.1.0" + } +} diff --git a/public/index.html b/public/index.html new file mode 100755 index 00000000..60ed560f --- /dev/null +++ b/public/index.html @@ -0,0 +1,13 @@ + + +
+ + +pCR!%;z;?)j zyx=vRi%4(ZPF(NCu0RkPu-ia|>~l>KXje&;i(SLBnQAdJ*CaonXcF@M5CskXesscq4~dvXyC;O*#K zDp=b=ny6* I0eHI(e)y4CP)4Zf~K-|t{kyqmVt%X^=h5PqQ z4$8J?A}GTBaNO^TTfMx1V|Vg7z=|7IHya$bEpgiL`QYZ{;OnbmtuduFt4`5IlKdl} zc(r oAkGb)L*Gcy;4;bkQ~sOgmznIRc73p8MsR;Q=>IWx?%&+OssyzF58r0J?$ zf_Cs^K;4(bqP5Qn2`+U`Est&E=F>t`I?D m>EvteK W z>(w$27rX+aWItiS)Lr4>aOcQ8%bn$e?p^O7fuPTc<(m`ZdarZAetI7X-7f2H_o#b* z3pO7-#78?0y{1wge79kw0v>^!HFGl^IVh-GN|}<;bh@(oJt1HBzO@MDL$1)e{LYVn zbDMH>t(OyYRK Y2ext2FK>2XD4Xh!&CgxOTh_Wm|%DLB?CcsD^sweKVNHl?p2 zeWe}^a4&lInASaCtERWg-7lvrC<>SlxKC~?gUSf5uh_$vmJvgxD@u|#w$~Sa8dTCO zfS=ejg%-lByx%%yCQr`UP0Q$P$!V|W1*hjnoVv$|^^`i{1`p@XLUCP*kp??tX_jG} z;T>m%Z1pr^@!PA>ExwdYK2>*Q^aA2F{obA7J~ZIiU^+U-hE0e|M-Xy7)~tRwOnyDD z%R!K-GpPIH{^F9=QcB}Gr6!b}H!!T2XVgTBvC!e<_e%HXGr>1HboDVSC9sQi{aUjs zG&ZL*lohdq>yuOiERPZ9Dzl)`UeqVM$(+IQrsT0^Q}t~;&CIe=0zJDL_6Kb*_jv|I zT-tmVOT3%G)gR6Q`5LW$Sb|AJbn@GlhmhqF-0riz@j^11UWF+;?b&Ex_@k1H(6E22 z?}@8VMM5VAJHN<9HRB8}YL8ag<)MK uzxZg@BAQxf1US+vi!BWIW6B>GOMOVuL0IKA@BAfA_$ aC*`}17qhe zZMY?6tD0hKFoE*kED2Z4Uz(A}abTa0G4|kT5~CmNpn=R&nN^mI=H;U*;NIY(30w>8 z%_O}*eDI!A-HD0jVmR3+n9^47QC@=F?<;}Hb(mPKdbdBT3du4y88y)Gy1c~HP}Mdp zS61g#msDJLX%G!OHa?k3PeDU3#ZN0=JKW?t&(9f_bgkh|(Dj1#VL7ksH8ZIxz3ZrP zhaJbhxjj9F%m<<&^9Sh~>*8qO*}6s5V#T(1kla%82ROS6A8qkM3R%7!8~LV}SDEkp z-d-4H*_WKPcPh^~>#|f+Fd9(e%dog*J^(YxK?65xU(A=q?2b;O`keOpv~ru9p2Tl< zzzW|wS ShCRF$7-i#`FcY# zeC+j&B_4^gvHAK&X#}!{Y2(gFX^ (xO_)FRQbXcm`*5HQ{vb@1{ z?0YeqxRFL253}(vvA8C-p}G-HD5u(l2EL4 7Iu*P9Ccs3gYTWyulJEJ z83}r@ZnietSljNre=7JMYhT6m!LE!-&Sfv!3x*oG6CW;zG@RbCOkQ*uLiwlY;hb-A z=8g6^jkirxGuXlZqJ_5~&t(&wzEPd~?O8h_3d2r?&FcLdj$a`OCJ$Of7vC1tI2XT` zzp>q2HsRegvSSPnkW*Wev0AdNt=w8%d$G{CtE`i5u&+;Wuih$81zdRDUyHu%AKQBW z_716BVxw5(ZedwXPS!!$tO*+MKK(#jRPRb|9C5##=qtIGi=R;|pYQIKcIXWiR?jr! zx3snu@xG`R7c6 cR8?Y zd|g&)x-X^+D@^4%UypaehAmg#?OYt1xnhn6bYKS|9NxxGKHXn7S}3KNhXaCRy~S5& zQMKZyQ1!ygP&Cj8mP|pCv{OTIXf~%6mf2f(+3-!(!m5*;#{msE#(^DNLBnmm(I?hr z59GKPQkn-XVL_H}lvl{&I5`X}DM!x84UQU&E)0N6#QO(sCi0o!;^ZQ@a*sM%x%d7k zWVBoEMGJP}Af>3_iTx%y$Gr9h4UH)IT? MlWWB7M7Ua5iGyWbs+V&SW7P*pf2J4>W~br!FUHsr~v$reQO`Y&XAT z7oojT9y|?ZFHlzU`hfX!T<)bPg2CA(x!aqW8`Uq#$M&bVrPL2a)~BOkBHE4EWY4(E ziLab>xQSta?prr})Re=XHIwn ALz >mLb-MUP;Ehp7t|8jFZB|VUd8h zlNbOK0!Uol!Tm-ZFHcu5PcVqt_5^f2JPoXoNasTe4TL8gj_`89L}1{ 84OOlff+%W00dN4^0Tw_PygL90z!QKUhR*@o02F|M zcmseNllli+U3VnX)&TD5<*H-t2m{fihe?qD60il?7=Xz=0WZMyFbT2iF*O)Ilv~l+ z6Y)cCQfn^ ^UtzL9oJspq;4>0}|hEmDZ z6Y;aCfReMd`*A?u&O`e+pyZBF`V~NU{t9SWJ9`|*T(a}@J`Sk3I4d6qz}o)BS`p@C z_oE^Xiw6MuYKlsrG~jkM2-~o**dV>E<&j@7!NW_<9q}J 8=d*gknl?D5S2PuE$T^!N3?|@QD!{ z(1P0@vH6E=4Z+>;zsuGD=6r bLS7UoP*tnn`J0R?SR^JIsggz*f zBGS_n>Eet;*!@UC`ZES2!f$x8pLl%-JNw@wNPb3uvK`Z7dKAw5kqkd}!?Axp4|^Nu zVcdxynSu|wYd`uZ*&z
5juphg??=!$gO7@P>7$rJ(Hqa}odOx1hov(ykw3 z)d2xpTQJ5Myo3Au;Dz-AlbVoti~-FDAl?+b|D+K;#9%c42j-CH78nLFJq!J}7tRzW z`fsDq|0i*WbwP;X{j(op%Y(%Pe?RJt2?HHkC64;-8B7od(|eDk#{>b4#RCV!1qbj0 z2NpjN`q5!9vB%eMI1Kf%o#gKbj&Z++2LR#aj2Y`N<1W56(hFhZ@ejQd<_Q7g4u@=v zN+0VDi2Mh=0~C+-^GFQ+WA!^M2)>820}SqQ*;xzIfw2CP58h!Mh^7R81cw0)<=^rm zuyaRxx&8%(k92pib2uIwRSYoPbq;YL4>G8iCsGZLfV)FI;Wi)wF!Xc%IROwK5o0iz z7>%Q8;Q#IN<9N9{|CmO8v>K-J|BBJ}u=_dH9MRxIojnbqc7LHd0fU3-;J%(39_ohL zT0e&=!k_5B5EI!W-Tf7u9qfMA6!}r%)qkSF3Lvn7+d{n#hfN}HxVz`ykYE0Z{wq0& zwVe{u8R`C8 i8-6yA6V00AQa5#Ong5 zK}+8sOW+?%;2%riA4}jLOW+?%;2%riA4}jLOW+?%;2%riA4}jLOW+?%;2%riA4}jL zOW+?%;2%pMXc_$1EP;pnZfC)rHUO{yf8a+ApnVLqrP+XHFl*2RhOwvFgRm#~^EiaS zZF|s6_0K6-044B`1rP!R0SF+1VSKdXceIaA0DiA i+I< z1OH2gFn=eQqz$W_EXxI7DPI>?7q};s#n;6d;UVQK!+OYE3WPCe0alhn5>F=?*2C`z zSgvU6vM3?l;Vh#3qI@txAqb1OBtJw{R9sw$_wdUJ0YQiWM3@gEDJ3EzB`C=9<6;GK zbGNaT(pOgfkrx<}Vf|4kA0HonA7Or^yPW_;Qc_YtP)I;Xh!3RT^YBA>LVfuV9&A53 zD8oHq?hc2RKo$%~(8}fIDZ>g%dQ=1#*JHMSTUS2`ZD7ZAuHeS@Vdge40k|{V1&;9a z0P7WkDgIBU+S z&L;`6g^7!ZL*YV#$J~xgI#B1|xniWU0XagTLNH+w zF-bllL18GLh=eVK4+@i%;Dg%;N`jpWE+#A{#LDt3UoE&D6y~R)YpA5`U p912&oP?|2O*CD0^q>);GV zc!1_?77Z08F^Hs?7@rV71k>+8alvX;cklr9#P3H>Hh{bRfSesz4pm+X3d7jvWmsVt zje^^-{y;nYO>_Kf1wUfz16q~;sgfO$c_3{)eW31e1v{|m{xwY&_|Hn<0rmdp@{3AB zp*9jwQ9g*MkRYE393}=TfUPi}m>674RLE9LT+mkRXZin5eu(gIo#ekQ|BniW*+UU_ zaB#2}VEylxNEiYU5fv7L@>xSAg!x1S;bNdRLt%V^P!NPe;nw0Ju>Yh)hdmi0A_Wop z*^~djC=m>az}WhJwUaB<9X#mb33vC9VYPKfy0Ac9T|t{F6r+>^-Uyo?6X$VnV(~<> z{5E*}r&VVIcX#+r9e&T|SO%8=Co}vnwNDaiYXcP(6y+0@gh9YzL&BO5DkLt>CnO;P z6%@3!l@t_~{I_bW|FT5?+VK3h )Z)gFdP4^BA8Q_%n3WO0=L(b L}3+81S1OK` 1bDm@8zZx;jf)Kieh COsn6t^$E^sJ#6c!hA9+BM>4ztI&Ljhq@cSC*fY&q@) z&>;e;-EXk 1c37P-^xRa(U;%0Lml8SeoTcPU;ib+G39>_{FWa- zCcooN9v0=J1GFp{t%iXIV!hm1Jir}gI1ArDD)E0i;csI7CI>J0wgY#EgYOkAmq9H9 zKO6v?8)4&sd1+^HK>TGZ>NgJm&1AoEz<@`34FXgd2LQDdKX9_08o-%v0dT2E037pV zFb3 Q4ewyP01OnHAP~aZ$5Qqg5 zffOJE$N>t0VxR(e3A_R7fo9+n&;twsUx07GEU*M@0K1?E9Re&eEGjHIEM_bYEFLT& zED0=GEEOy*EPX5!tgBddSO_dHtU# `QU}( z#o;}}E5rMM*Ms*BZv!76pBA4BUmRZ@-vr+gKLGze{uBHn{MYy$_!Ic+1Ox gr l^kneKq?1)A z`%bP?P*FfAbSPXX?o;Gae59D7B%tJ^RH3w?yh)i(`Hpge3Wth~N{I?ab%QE{>I2m` zYJ6%gY7J^f>U-1$)NRyDG?X+VG?!_7X_9DaX}-|n&~nmh&^psb&=%A7((asMJf(07 ze(LV2!c(26Hc!)^mOl+Y9d^3tbkFG>Iu<$=Iw!hFx(d3HGq`8YpV2$xb0+!Bhck2Z z)b!HyF#0h1V){V_Y=-j;`V0XK=?pCl>x@i{YK*Ro35@R;=a^`j Qk8AiG**Up$ zZs*d@b#vo$OK>}JKjHp#9{arLdHeH8=i7O(dBk`ec%JZd@Z#}G@*;TCc>DNB`4srP z`SSS2_-XmI_(S+B_!k7&1xy7Z1sVhn1Vsg%1v3PPAe4}ckPt{UWJTz_5KJgZs9Ts! zSXCG$Tq(RP!Xp9~NfzlBr4rQ^y)F7ybYDzd%w4QdY+9UM{Hpk4@jeM^30;Z%5{;60 zl8TZj$(NGbQesk`QpHk>(tOfR(z()87q~9KFJxSpkYSa9%B0GCk!6v+D*IISi`-c` zs9c)dxICM@jr=qDNd;~NM}>Ta1w}zccf~TrO(iL%Af?yJILd0uVajbPlqyCli7KB} zSyk;+^Hi7AMAZV+UaRA&YpO@8_h~R{z%+6+mM)5447&JUlT_0{Gf{I~>%5k`R<$;^ z_C@Vz?cqxtmk^gKbO0R ~ z!y%({MqWm5FOy$3znpV<(^%O!%J|C_fh$2*noZ7_IG9wL5|~~#eP+6DreYRr_RU<> zJk-3`g3H3!;-lpmOJ~bkD{?ESRmoMntHxJzukJy0plQ%`YYpqi)=MxY*dy4ijl4~a z%`{vF9tEGYm9dSoowAd$i?*A#m$Q$vpL0-hNOV|sRCi2q+;q}$%5p+G8#@=d5V~A- zsX|a9oDlDkOh{j3hbxb3sOuLuDYsa+C3j8tXC7D{79N$J)Zk*O#p|5cEw3?eS??t8 zEuYIiCB78C2;UaJ^L}^zCjC|YGXrn~U;%Ff&jwx(91BtiN)5&ewhn%aVnf|TeY>W1 zE&Dq0b*JmCA%Y=MA!|2`Z&cr8ym{^B#4WX3d7&pl-9!6sOW#hpgL}u}PTO7Ky9sv> z!fe8t?g`$DySH~AcE9NXr1wN_WK<1oSa;S z+=x8vJg>azeDnNI1 h9aR^r-d0Ojm(}psWW7B5GO3oPHsTfWtDCRTb^dkhuU%iyy|H^U z@z(0?(7P+|y5H-)Z~LJ6p|M`I{#}DYLtUdx M?oHoimTJ%NiOYNBQSj)J<_|ODwV)m=Y*S&8yzmt8Bn`EBMnG%|M zIjuVVX~t~k+pO#C?p)|R#r)%ia|@-5@{27?SC+mlyDy_x?yu6VX03^=y $69&7r)QFUwxo?FpPEqzt;QZlTRL83mp06JMwt HX0&5MOrAk@F{(_>!+ euUP*D|EgPk+F zY<#BpZRhxk%?;1!oAC6KcU=?Q61J;e=Ov}oH7 DBY%SD)QoK< zj$I1=@+YW%#oqT$e0F7H|J0VGhKYmU-GrQ~j|0=&=cO*1I{Jqt=2kZi&g}fv?ceCc zX!WM$=0a^>?QW6RV({!pz#qiFOMO_OKmBQ+e`EEuLU;VnZXYkyR?21sI4Jl}?ng}S z$!vKo)S}uamKR3?icsa4QKM*k4`sDEdPsAy-}mZsEoyr4U0;#cXdOrk(iMV!e#}1K z%{t@t>Lmk{0>M54)r C5R0p0|{7D%@ZE_ZfcBo&V#S)xzq48x7Ea zP4-D|uy(PFk?s!N=ka-&TfOlOYEg+nlhu&ZbWVFVp%FAH7DhDQmTBW}&tLf#d*`{? zu7Qi4kM9RQm(QvPVbMCJOUzHCGNKwz<` f1AoG$_u%SzSNSC8NZg=I*2Lv(bO6mn;1t*dU=-P5ET6>@~XNm@dr1+zK zO0~H8gB4T8vQ&tXlNPI}YR`zUy5?Phn9Q8DPWXxhqGRE_@!bb;#dZS{jMpEehc_4( z=8Q+|UV4{e3yaxEvf4g}lxMz}#=O;=zE`cY+cu-HL#wu$g9ZRb@#cZLrL^S1(jmKo z p2 s^ ~A&6&Abi*v$PyHjfKfZp>FPk_^ 11aQNEN=_Txnz)07`gRphR>uj12IA6um?9H4?WvBltlq<~zBNa*v zkx?U#D6X{_RolBeZ51WW#8f}c|88jidg;I(jaOyDx3CH_Q&y8C`pV}Cg!Zce9_JoD z_t3V`(Gd$hL7mQXGHCuu? +SuUS3zF%A1(+#tIWU)Jg`D$nf3?X+m2qX znM^@$(7xHSsw|dKTJ9_K;a9Q?Z>YE98Yo#LEj$m?)=Mh-+ }+ z@)GqY9yXLZ^V_nq*rF%e@`OtkZ}wW{9>v*F^;^6cpeuS9#N_U2I5eYFD^6goar0S0 z_C>FJt!Eo)4TzU~ju&oSb)Z=mR&U15FV-O8?j4(N=X+_DRr ? zr;THi!|4pgZ@0`oee9CNG*SJ0$Jc?(eg4+o%a7Xtia*NSQo&`p%zO!lYd@kr7gTLq z>FruDk8oMx^;+h43pZOROM_yo&p-QMC)A(tA*wJb;M>wF!aQHUsPO!QtdMJpGaa>N zB+S;xr{A93MAeYo@bZ_){YoD9&=U>Rmg!`vUvQ~kL*2`|P4p!YbPT(FYIVwZrv2-w z9`M}TD_K*YBFDfxqkcq`MItfVrnN6_7G*>ISehq=M3bUXc6+unWjs;!B{w`Mld;Xh zJ*!B*%$MuEAso{)*u|p`zPj!?$i`*#K7a9`sC|3g@rl|JY;03SMN6t?BFkugrb&hw znUXg|9gyO!Ht`KLI#DARzK~S{^g6!to}8VN^mvJQ6uWb8;5763PpFq+ kCPxPI3 zd2C5!hV4f?ugbmkf20xlv@t6#q&%)zR<+t;JOS0vegEymkg(aXS$V=2PoyFt=-_&~ zzmVmLmx53=8c@D*fYUv?!Msen(We70(exinZ7QRIufg?AJ;wTrT7i^C9V$wU_ 9>(p_)xaJGo<-*vprEZo YH_29qx6Nu)(E0psMCGVpCd@Ni6b3#-~pJATnX< z+BnN9_9RDa{#h3yF(TE&@=Uk}(_`QD!jyWly3Spy?WBzpod*`u5dq(&SZ_b8p$Jx# zcQ3Zv>5O1gQZU9J%$%M7U?g)%%? oy(jE&dpt1BO5JSH3Fr&JFt)+My88nUI{ zl2>GW4w9?gCAZ$V#MzW^#-&TMR=CHyx>~GDkJnGjMVXJGMI@45Ib%!RM75 VkXu^08|bMW*1@02Ssp=V%Y4+TmYwephfVIu|(3xmASj& z^aw34WfQl{meUjdVs21xUU{>!+ZDslZZ8X!whwG?2i7%r7-c^mR#@xVc>vRv=xe-B z-n_joyv^5Z%f409E7+I#?D~ecLn@7R=Y20G(2J^PjZGs#2C5SOwra|yYkaSn#@gM^ zM!f6iC%fQ(F{@95C2ac>#fEWCbWDa@?JD(ol=7Ya9ml8mDHjqCEG$k{4&~q!1#DW* ze%|k^-u&@~@qY_}?*1P!=;M1S+j$!)U$(V9Yh 0XT7TM=WU9)daO-zDQz+l`Egle%vssNZ;oYnYPvtp*O~ zdAjfR=WpI^4ouu+Vr-i{#gLEsA~1dMXk(HQZ?n+4d?*bzehc`z%=I 9uyNy6ePL!RolL#u4e5I2jrE zA~8rS#Ij<@<%@d#bzMPxU>9i6!=G&FtC*XmihqjKda-L3@s-<3wg@)Ck2-60uN|6q z9-edK6d!fBrLmo$+U028hYi_LFG90$$)DCSjn}#J^35;s@{ir;X*w+m(JxIs2qKrM zs!I+Cn3c@neG$uJ-dUDS(8VAn61Pd`#j$3-yI7njmPx}o^7fKL@wUCCe^}}BsC!KG z^{<$7OmZ{ulu$NjD`dZ(Q2EyHqmem`G&aiDqUQe6=I*qD6EP?Sc(g;b%ihu4igu`u z)ucV3IlZ5;H1$BoK+k}u-9V&_N?lWfx2>~r4prLr^#yXduBwVHT-5LZcJ>#1V6W1P zOwx}oS&g^ht|Zs$L{}k!yKQ-Epd Sp)r^F@3;<4~<|X6T9xcX4gaP?qLB=}-;BJ_3TTYVo`NC5(}kmu3blwN}q(R1u3r zd0sL)PaQvLRL6mv-Mbl1-}~9SwsYle8ATPa_cCvF|A~!kYi01-5T8Jf5-YY^d;9iU z{)TZ!mN}D1Bptg- 3(|}$A>_3ohM}ZNI5)n_ww20XH4MvPkRlQuVea$W zDKAJmxkf`NmV>(0&Os_v@u|e%!!D5W(MTU9zQOZi((>wyJBk(1Pp-Y96x)vv2G?j` zeQgcdfk~U%KV1Igd1K>x#K0%*;r*fIh%fC{M#xtk!<7#r9%P%OedwU0=dP{D3=-l& z5e)V#uzg#NeH4jv=WS;f0i~e^seB`4vrh{{pZklZdCruL?DXy~oO#I$1e*EfwJDFr zJe;r_EV=H9e|Hal6P_*Y<0IEzG%5MGaeY$W<>jLWxlrc!?DdEz^G~AE9*C>T(!KO@ zMHIYKn#lg_M|(>{+6uougpNbGv0FXld>O?DhvJnCCpSNq6wjyU(;IiLzfoIDym>!+ zWu}0y_xnZVOuoR6V5eyR3YqbLg$xCq?EBk|$r+)6bi|7WO{<43iT zN1b;pgo?62VO)o5V_g*u$Ocme-knL_Y7Km_g-j@XgP8xwpjj(+i_uaj{E@Fg*Lglp z$EbU =Ey=-VkKx9`uss zYKXOtk6!LIkGDw`p_>;;=i~YI?M8T*Q=rcQOiuJt`v4kXaldjcOr3qml9j0p;YDStRwKA$?TxGwyeQwXn$xZgLRJ0`0&Ly|?^Z0Go zC(TWxopQHV#yY|_n5R_!ecn8J{;y9$#+Xed@_~_|@BvY>TOYcf8B67!Nez6e|B3cY zqs=-AKP);X^C#37uN?O}N?Z6?xlg z-K}z5J>%5cM|y0+iDAvkE9Uc$+y_QDIF*zRP$fB5$hz|3dFz@o|M%}!nVv@I^_p*d zdE??N6FfFNkgq!YdOT;ah&!p>CVOcs(B=FUnM+Ds4-=Ea!k=iI@?$i#nw>w-);JTH zYIgykk!#Mpc? GpVygkj<6b@Mh4DX{e>+k;#i7@d`&D8&cz2yB2+s zDag6=>kmV)vYIavboZZB5ABN;&wF@!i16WdRo7neXqmqf|D*%c1#RsqJXA8l>eQ_T z@-02@?xKQd=I#`VU6KGp2vn=)Mlj5K-HBr^>J^Xkyv*JlLZ!oQXSry4ZcLKN$ii4U zie;OdZ6hi@ E>6-toDnvm=jsJ+a5=yhxgHyNoU3 zi9}$|^-qyypd)-W3%twAWYf!&mEL={pX~;>3leGuWFIZ_o7TYY%GZ6(L<8@JDBby{ zn9~EOnB(DS;OtCut ;HgT=$iy!ypuN3P91ETc LAQ^Lj`a02ZAN+?~i&Yz;=~?^SeMJWwL7=&A77e@rch^CKo#`$b z5Vnf7i1_^E8R`+&2j{K{A<;DrgOwYl*-S9)67SfH1|JPxq&DiShezls7^c)ya;fDw z#zR6>R{B^QA15@Y7%ne}bB7(oUx0*s^~YJ-Te%RSaLHzrb%-w$ujF;tU3SBB2S&0= zb6FP=x29yPx2B(Gi;-K5>&L~h#M0&WTvXxo@%(-P%GGM;6iMCP)1*LA4}>O4t5LE7 zY4%~%x3JX?z*)_B&qyj{ag%71 DX_}nrNY$F_o>rj`IdjpGBi^r3toS4EeAdo& zlxsz0O^mpBZ=B$B7;#j?0}=yfd%$=;%YeBez^1p?*r$t_C?2mU-t>VLl)Y jHAI)Jm+U_#O) zsEKSIa@Wex$Vg<8WRLjjPc0L=L+RDiegUQ9KRcqo*qZWvq(UmiORhoZ&Mx$odSGUY z@y818WoblIjoUm~?348d4t}kx{k=%CcKNBm_-Z1`^ZHRi-weq~v1FY>Lc&d{Y0OZpn7g>0NOA># zwE5GWf`*AqqN2n;QMvac4WF12Zy^0_PMs>q)j2zTQ1r-n{pK5}cP}%2MfrEOQ`cTY zv!|E)134)}qG|4YfK9Vq$+3r24xYZ6o|=|*SFwRwJv)pSV0wdSXDbc=+NiC;nUNwD zJ=^gdOCGrDIVCT*SO@+$koN%vQlr`l=A3NeIvZ7iUYx2a2a-mwqt9{87+;an+4;PY zk)CnKe#VhJUXHEHK#AtP3-$8t`^yAu&t9rF4f+ykZ3W^BGfScYAA>H|CV_o+ad5!6 z>bp@KRKGK=Xl~IsBjL!725x7R4_S`bekgFBP?fz(eDFDDV +c z=ZLLs5kYnT@e&OVZe-SVo1!hcy*FY7RLJ?N6-1G%HzVugTdF4_ifiztTJASqC{oZ) z7^YANYt|Hw3O&E}EaM?1W5FBefzRi9xj1z$CZd6)ZO fw#f&A?TSd?e}8wIJQrMajV#F9eY_J*OdOoy_DZIpx>Pgg=A~j?^q{ z%VQ6|il5y{9^WmoOhY3>vET72MW8M|IrvfOE8C4=t9<|QXIWd%K2DK6Ejm3U5f;*_ z#=I2PxfOWAB>S6%*Y>&Mgaqx0Y<27md+`B3+b)-Dyl%IUVl1be{SvSG1LvfO7tN 0CU)7a@^<7 zUYE10hBZRZou9DM7iHuS)Bvtx)s@IJ+gDT;Cy%iEemj4$xP<3&d=9~_z;Nze{}U#w zs#A|XY4YT~Jμ^DH!WoX3<&w8(h5eB<-LkVOAEvBJ-9=JV~s#qKd)d;bZVt>+0` zcYt)SE%C>S(dt1L>23Yas8Uwh;eL(sZzNos($580JfCii8qemT8uzD&iM )F?dulTt|aKh2cjVVi@LK6Yr<{+K8T1Sp^{Qlx $n8a=uPqZtgg`RsQ;$N$Oq&wW4dIC#Uc9T(Sip5OEH{hn6a6Up_R!dXG3 zE@JVT#2E!X$=8;`Z*5akV0?<^ x&6E2w&eq`27I@OAccJy&F@|Q$R zVHOl5d8$ZRQ4nsAr2kH(MUZV-eirdJRvJ7(_BV<60C;NXs2^;11R``mvrhVg;gRyT z0{T0gxn-N_T~k8;hlkN?Wp@EJ&~QOXnxNIqG3)Y@QFl;0t+h`U1Em-1looSP$`)H} z!|P|tLS^q(m7aMXvW?;<)8wC!!Oz*|wTE8gIwKVxt5M*{Ph|lwh81p$W1suQ1wu*T z(@c~o67-F@%6B?e$Dfa>bRNGV1{Vy2@oMnMWO_kq??zSMIcrtx4wq_!3!({$w9ib` z{b(4i(nseeHax|_+!bkhJW1fluZ(d6+TCmhuA!l>`iXivlRDFHrqp=jYx|>3zTLs1 ze`ZD&B=t_ V<67)YmB`Elgn07Hx#A^VRNzy4Jx;M+`A`UQj^Jz=Yx**4Qj^uYZw z^6|kuy_4$E2_G$y(YYy+j+{5PxKUyG$n@OyOkoHI*0O`}#NRoZsl6vWppAw{fl>Ah zff!NK5Iuppse3^uCsNN88=FS-^Bqr9KCm=+HY&`h=Xx v!oOnI@!`W~%RM$K}7^qW_rE>i;V7{?7f|Yb}R>wZC}n*;Z0f zq(x`O@GM8*n);wR2j&x4Cga0ZR~tl%XZp8<0dN6#i1}k6E^;gMc9#j)ptz5>PQcyS z`Yt9O-11V(kRepjj1*LF?bh8BNlg)8qoiFV;s&1|hZL3#Y@XDOUR7a_h-U-e#il*f zHqo!py*`ud-*~X7%Ixtb#g1i6rL?4ad>g4(DiGM%s?p|Rudx2QBL3y#dRuv{e!QGO z?gt{i^ge6P#)Tg{YJe|2n_QsE!ELX`l 0SxkoI+=8pq}n? zkp|7~geyVYr&oPTpNRnVxbmEQ96UZRqueTsdjWesBj@CQ)z}IySrv=QY1nTSMkhrz z+-jBhyU8`eb2cl#NJ 3^RWSf3#n;;!g>dJC>UW_mEV3kfb_;NMSFz0iZ(^qZ(D#@l0e*Y?n zU>=p0Su>|Yka{ZnZ0T?SoK)SQwpEn7qF6I$rf^a`c2s%RC~=&`AgL0hjS?FLNMfyc zed*n$2>+}KPxU-@c|B9Q5jEL {=U#r-;p&(^ny5%hO2d6l?sUC#F7t(NST#mvO1nFm=7y%k;+ zvUlOm1c#v?_^|<{iNWg#%$*qWD`3E)Dr<7@W#Sqk9vMNE<>l-R9DAuV*V=8Ms%4>} zqipnKT*H7Q<-F$^G)a-0GLaTgY9|YeR{o-lgc|^9;x=?gOh;7WPu)j-uzf8x%EA z@Ngc((Ja~+a+x8?{o~JS>Y_1S5_>NAvl=z!rS>x?3)>kR=E(aDOEAO;Y!`Cmp-g%) zLbgWzNhm)&LpI!|WC{9olp&|t)mu7ENO+dSnK(KX`<(#IlCNv-8^WvW%-#Hho-!@h zaUM|A&`NOl4)UlOT2}^OCcl2L$2tk)7$6`xzZ?F^r)o*Yvt7(WU3=rCF_OlbskQ2X zlcUXR7;e2JnB}8H9o!{MCe_WnuK}S`4_jfc?WX+Vjl{QFbehav9=UDWfu}Vk-97gr z&PR` yFRVSY&DS*PLS5B{jVDZN-%T{$x zPZ-Ew3Cc-&!b2CDCL0h ?$QoWg00$#R=ziJjlBl`DV$;*5OEI>e7G zN<{7M=x0JZ0z(DX>(SU}E8JNQ(FN@Ii8CK%CzqDZ7gg9Ab2gJ_Q~`;X0G9aJ_wf=& z>ffG*g}$$bhcyjfB00cb!2$${2eFJy69XGfcD}?0)|`7yq+#?N^-j89LLDz|gSy;x z)HJJ0?-i@9!1l~xyyIT=f;llyR(!1$0HYLhv5wkGMi&_A+Mb`pJ^MKH>@OZ*ped-! z;`aZTyjE4nt%l -ew}QUpQbp#Wh}^P5Dk6RlH(1(`$in*=`R`8J~sv?4;7Dv z5I6PLuhI{}>t&~_`=xKTVz6>di>)=Cb<>w=UdonqDbbizf)YOW!)gV3snTtN_%tFk z6+A*#9VzA%E_|HOvib=pD6rW>ughkhzO^|kX+Nb&O80%gckrIb)^#{zUeB&{z3OKY zon)vbLu#n>j2F?*!nj>3#EIG2c1m!^h0PV0{E4l!zTSqrR^}Nc0muCke;9{ojR@b| zCd>G?)uquP93jc^v$cNH!31#x+DB9>Hj3IWf4uLMf5#MErKA{Z $Ur@U;Kyg>IQP7$|$o#@*f(Jt4ra&8c>VN2FIzWhx3%iSA(10^WdQG zE~OsX)c_5n_$m%YGhU!#LQ$r( cfY+ z6AE4Vzpb0L^=nDFv~34@@2>W6(y3$} iWgES@ |%jt~9 zC<(CmvjaI4lNNTTUFCid%}e$bpxcL>5|xulT@+n$XJ=ipQQ6SWxyb{(JdW&<*}-%D zKS(H|=#Elp4AY7Q%*tHV*XyPThg4D$ ctbWc|*qoV9MDs*P%FCKHJpss;} zyuxxewO;efYzI0!W3Kn~ok6%|kZZ4cmE)EtwGD=mZ=JV3QyDAxx;LC_pMG#34F;Y_ zNZe8v=YA@Bb %UM%~BD#caU{BnraPO> s=>Y4 vK_CnETLrfFRz*K4C6ODm~3!1M;x|R7~>5d)v|!{QXfV lk)3J;K3Cg)0|<9pR2ra3Blz-rvRamk8(^^ttI zr1Y9RIdBiWX)*MDU{5x^5^&)yaANb*N_InDC_fu*B5c)tg(~b=rg!c*xj#^yUW% z(GegMPY*G!UwcJ|va?zdP3&lq;Q9ivW}Q16SeoqW-W6(#p;6B0)i1Ij{P5b?POBRF zC0>#Jbc8;#q9oPE_K2;szGbPZsJ<;0wCCu8295#*bTo^Cd6ry%FY>gh68zrC2kyvD z{<`rwc6SQznd+>ibM_N+d~S;|W#z!MnB6ufz2anb4lMzvC?rL8IhasUDW<*#?&WiC z?*Ag#KLX+Eh8n!}xoS)}%`V1vy!B?2(H#_KTjOVcPw$?Q=SG=>C0!0!R~7mfuTg;} zNfB}lv`1!>orXjpnouS(J_&M8C5kj=$np1m{1Dny3=fXC3sTj;f*4QBMm2{FU<^d% zo=b)g=}bR9T##VNd{0G97e4(0cmh$>^@i~EFNSrNY*mC0P35^Em4=r!Yu3Fl3`F=s zg_G*146@1IP8;yPXeI)x$c~7SS+0oIf{}f*aym+YOx;&|e|j=RUB? |x_iHDxj zqgy=QAc8&=Qg+MDJj%a03wh~l`uf#Fv_}8eEv`H(%a7)#qk68QrzWP1ViW|1fX|+Z z=W=;(-Uekwmw`&lvP{2kd$ZPSu#E7=_8(d*^B!tl=XpmeGdL#pN9Y9LaS|QEX+m{h zO2>~q-%u^XhEl9%bc`=BhSrJh8eP~~>hfQs=v%mMVk&?Bp4CuHEXGPs=o~SieIM0{ z@EU`OuQ#Y9(+^83qVsbE>+j?o?8PN#? a#|V zaviugk^p(>nMWGNa~S^Bg0NoF%3l6%Bkk~;VfVP W)$_|Nrrw{f9VyW;zZK>o^1sR~}S{BLN2(nd5H<%eG{_^JRBo)jMmUfp CtMEi}T)X3tB2))=+cl0A4-1XhS@1}((V70t;Sh6d`t#+^35IP~)K4&@H%d4+X`qP(@ zgd<&&!a&L6vfKH0KGNU?`BK%vs|qxNHjhIC@|nM4a_d;@6q!dT+I0(gK#BD%g f#|Y3SkFozv81?6-FA;8@!lQFB*@?o3noeii&R}`z*ejdR37aPl;t?(my8vGWc?y zg^Lfdes4Ugn{8Glr$g}oBvBMS5qrz4F)_i>JZEr&gRbEJ=}euZKndDm(Y6X!y@HgT z0(%e2E6>b;Wt*^NM6*I2%(iX78P}6k%8fv|j=0=cwF!EDnTB_Wgb$&7%sU1{@q-9E z*$?5CdsusmoX)zFB0rk-IdxaY@+Ph#{QW&Cf%d{7duIr#Z28YhpsnuAM6=a&*@LN( zQL`h_wbO3GBmjaee5RAd}}-G7ZyF`_O*w!;4X^Lohy0IJZSzh5+QTzXuYpcMk^U zVDgq6BV{~{0TdXy`G~)G^#7RV1aOWz-|(wB+(9^AO}9M2{SbQj7cV+^QqE5D%HnqQ zKLc?6ud4ok18x69ym8$
)}E-^LP_WX{2%n1V82JDza+Z1zQe z*Qwb-BQ??Rso1>HlY1E)5&QRcgR(>8#$aEfqqPpH_7c#9D8e)OTicKjCzNN0D8%-- zrRhE6z)Waj(}_O4Juh~~92)E%e7Jb%_L3rUAPbS2RsAz9rBb3aExsdHm6jPy+%l4u zzpx3(9V7nTAB)d=M^S!EWz8kaW8jT+?dXFJ)@2Zt^nEG@GL`&6mXU8PGzCAJGkKYuIvllKv$cn+-Ar0| m-c;HWNQqMum{PqdGn%QX;CF{ zosr%Ew?4?=V!C2_XQ*xIC~Z=e0xCFA83F~e1IEAMz(D0pl%GbE2|r?UnyhM@fiPs? zLW?{Rei|mY&K(!F22+nsaZw}VCbD~OpR+|pahDbEH{~0myz=m`HOejiwckF7p125k zZ3W>81M5oU9F#kkOhz5Ly6j}{zluUg$hk^mSK{TGfo0zR+@)~Fke%G PD#Jic*gupi+QjVBb5zW{X|Vp0JfBOF;}ay3TaAC=&&x;k)GQOvl3p743w6O--K zMb!tkLv3QW I&M-YI&v04~+(OL=3vH2?*DRJ)&4-dbst2?Uz z8Gj+lzMaHRDYqj}PrvC(H#8tNNJ;1!FXw>sL2uh^H(bDMFXpCMY`sWeZTeGT^Qq%g z=Y2)v7ktMIsCpNA%`0DGzGv?kWjI&z?3K4?Uwakr`CDYo`aAzgRlWq@U =wu4rqiJh-R`#cQrCW=D7Me`VvZPpHX|F&bR2|4d|t%t z`^UCFDZObBc?|zz@E7k<_ 3uhu+4l%U zH<@y)#~EmF%d2XEP0H*PSp7&38OO|o>3hFTS==AhNb9Dw79mMg&=$`H9qDvtkv7fe zL$ioee-deXE8IS)UYZyTPDkCKOYfCew JHjiT4OX#I4TiwMKP?mBQ;71vuB_fSyI;j1Dxl;mz(J4&V31&MnHn98sgHgdze zs8%Ek-O3c!rjgcL&mo!S;}QSa(3GA_{fi&`a^&?*m(stoA8VC~Q{%9>j236&Z=!-) zV=RC_ARLw3@Ij1dG(E328{JbDgHDt6?hV@j?5MUssaLt=w{2#*1TPyM>4l+u%7tpD zJtQETt6i1Bau{0Oym#RfGVWJ) 8UF2;WZPmUgp( zv{kT`O`AFO?Ve`m-TxR#n3=94jS)D!vbD(0#F jVBAK*b<3y@us+gSXQpYwzndV zsz5f+^QZORdUEJ6$cXQP`d@B^pHJ;OsPdF7$!tdz(wK&%k(Wd0hRghfT9)!)Zaq~_ ze3t?&SbQR&OBD*>!fm#fBkS2BH;6NU$6tJz&T+Lz& l{&VM|OLK~5O7fzyo?wz?FV3SIsWbAz z>g%@?xFK-R6SL#V;hzmW9N-!jGzVJ7Om3ih=j%!ORz-^V7;sr!rmgLu-HE#Qu+Ob? zS-^k`U+DUBTv}YF&vNy2oWdeOlqi=pa<09r&3FdXz( I<$ry$yZ(b*iH3kb8oe(t`=@&4x{7Hec5+@< z#kvVXvQLp=tG|5R7D`KF=_OSKytYV8tEi0$!iscR$6YI8RxDQqe{<@fvLJ`~aJj2{ z=RJ!_Gn(&xs}ZbW%d9@yQuPuh)3@m*od)m9oSnC?Pun@FSA`oqWfTpSL1Noa5VFf9 zB}L!9l$Uj{7nl6`75jm$2ROvE3#N)4TR(8}3i#148^aSbq&=D{Y(nDqI#&|Ry(sxDbEC8f zT%7to4x0MjTK?H>KZ>f*U&(UY`SJdCZpoH4yh8l(bb9Nh+kda}XC$u-BG41E6l!PL zrDguRCa>p#$vIDsJ0)$sHVwtSP$nm51L+m>FZC&z3wU8Ek>-x+lN#wNX1WS|DhaA1 zX443 nv@_YT4+OAw9#(}vB;bj-Io+kRWV066xJsc9J`L>)Wn>b}3_Zhn~a=2l}=$U>oY zxd=AKV)!#-7OZH5p6`=C2!8K(YSNoFaetG5TN;>WE~|w`UzeW}=M)^pPxRYf=}lK^ zkXyLUulo2=zm|BUienv?D|C`R$ncpa*?@;SNExzJD9p{4q{2p8+}_ih*{=V^dyLS* z&YzZKP|5M< Lq)slv&WL(&0Eu$PmfVIc?1oydJ1fv)y-jcL5Y?tmTig< z*Qw#nYl94IFA-XXeHX=pMh7dsG=j8dSGDGTsi0P1BC0q!R;tDxh*wRmw6)28mcLQe zL_#>`UwU4N&F91xz|JGhRRRKJdC}rCm7AP$q5$p-SND ztQO;9zLTm#s)Bl{0>oCy&?q17Y}h$rBWK>T=I-*o#L&IKiJx_2r+KJ};toc{ER|?2 z23(mXvH}yxE8G8wLz3Jb3vXv{&AD!trZA-g*jcT&R*Q_Ir?pFe@%UJ {Iub;RAPb zsA0iUEfiL;2_bAOxa<7vV!&hp@JFrcF=!dUAha|q=^gl)Y@+vQfnA$7MEjEcLV)Md zgL}f#See+Su6B;bw)jN%@utA_&94wZX0G@v^!OXG+$lG~D2w=YA~aXjU%ZIC;-K)I z+Jz2(i+dbfVtpFZ_2Bo(10ovIZBdR!N`~9Bq}3hBy`(BNf_(|vhJCTF4fQ37F6Wh> zr%2a7f6fFpBJC2L4!|!q@*w%C$IM!eefEKC;i|UJFqzX>vdWT;^z$#*_-Wl!t|47E zZdJvwr^HRAr7=ySsY*QbB0j%4Etp}!y4C)OXkwKqp#syz;a9`_i>gz23`-FA>_$`v zb@T*yUpub!;{$23BvsZEqKTjj;q44wQ8Rpp%e#YrjFY%@9XUC*@Q5 WD zv@8?c?$>m)B+_F*y}qy%Mb+Yws_?c8C2K@#WTqfQyq3cs*13s#mqsKsPQe;A6hVY! z`V1b1Kc%I*e9Fi@#Da0hA<=Zmx$7WE`o9{(@_(-Qs2<9KsR4%kFjhrR>_P<7;nVc> zcd~!L!*LpK$ F9s7&734u-!wjQ@^HM1MMyPo?KMBM}PtE+(u-v@h~c zap}s}&*Y`Dp+=oM3vDruh8@)2Pjyt_1AW>o0?LxGMHOys+GQ278#v7txi@mD-SxJe zIhZHaT}P)hH2(yX^XfKjvKc`^TV0u{vIf&fcdsdLTh)WuZQX4knzA35*19*vsM#9= z;I&UM-ar2}*FI%?Xyy-x3K-i2nUuoS(=D;bv?+(cbOa zZGMz?&&KA6c}LdyhIFm3sljWJ8}HZ2OxC_l&j>W6HCw{UwY_DLCE0hDUo8oQHWhjc zTslWx7~AZH?_8nlUsdlRjsc_9z TO}*mcC*hyv=Qo6 zuXD^%+|PaQ2J_$iF^YFy+LymI# zYdiFEm;}1Ay5L}W)LD|gV=@2T?g3MG G0@Hz%0q8q2t9HoK8#JrV+emoqiT2^sGI?&BCN)gYBi^c|#nhqHY zHgz%*Z#`%?3rqQ(r>aCiFHgKvM#W)a!S}3!MfcB2N;LCE@*v=#W4;zFu^+pV!|0{& z-KDn8{$LL6WB!}#b1Tz*U^kn7FJ@;GPK+XB2TK(;i8z7cUsCF-9+B_nd_Jr;^Na|8 zt*3+%S_|vPs*{&8YNCreink#JogDH?0HFbFBw$jGWd^c>Q;|d6v6t8m%mC)$&GCOl z#~JSY#XHryF2QLOjj_j7P!!-aW@~py>)Yx* L^7c-+OGw00i>U-x(bs})*dsT_ z!sWoL;?nOY*Ao8h-mViydUFQ&T5-i0tU7AC7e%J?E$3-h@p@gmnhxyKP777L^`Qp# zIR!!umb7=OOC@w;456ed7H{0n?O=TVoT52RN#@JF$$W%&?m+=M?2(^c^yIa4mDL1* za>MkcqM;5quTesoLm`O>bf2C*giv#L(2jjU$btI@)KFiB^gXVJ5Np&M exBX?cure)!) zMuELiI<#^QIJwtNMees`lSM}pa%ZAf*IKlA^|xy*)t&o$HEqEZ@}GJqm3Z&y+IrUL zPENC>cqEo?o*&b>U(sWx_K*Fg_TAjAVg?V7!t9nf5FBN99tQ9g8oRC=Z!l23G5}cP zk>wr<;0CQ|)7ACxtK87S{PB{T_OWoui#?)gIXI@{UR!d@O|XOd$ M~?=y zHWH1{tUineA^q1t6|4kS2OS_#@n(eF`*KY4i`*CC+js*trU$He0n)dRh7cSrlOKB$ z#G))I8!~Xud(f-)@sY}iPSfx|`hfE*E!w=4yr !*}KTUX(zO`;#)P({JV&PFA&S%(BhORYQ2%0+};B$to&jCw}Q6 zee4)&M_UVgeX-w(P_e%0EO7%noVx>dwHGFDi9tdJ+V7pLD+|hi@X2vCJ%$AJuQ!6v z{^Du*MsBzS+UBnK#~Z8-_o>L{M**9<#;YZjnd?+(IYZ(|!zTA9SrK{LwI^N8w%}xm zsbF{K9d424@k?-*)%*OMOQLe&whvR*ULyClYH@$SQ0(19?<14#@z4(Fwx43-PFqZj zUH-{YS3h;`>pJ*9n)~O$y!!mv^`Re-<}asyy>a6kz>BfaU`G%p|I)lI2Bqx3`pN+; z^>8h3m~pPrI{}{?vD}wcwXgubb}}h`OB}b{pexhWVq3~uz4*RXxIxQ{Em@8JJ&+r7 z7#QxS@ RDK?C#f%t`u(ByB(V2(TUWVH$P&{I+ zxiqe&gXQtWvHLDDZ !@+3SZhxa=DQb|SW<-7K{Wxpv{4XRBf zPh?KLCI8*CLvD8Wf@ml=4y924ZZ-7jd^0I3>JHVAJTRy1e95oM#{tOLD!T2Z=OB6{ zpC-z~X#P0Rz_;Jx{yU9en?T50n|8>1ckWm~&50ZYQKH72#RV1C#3iE`r9YlH4tKoq zufp6``=l?owUO7=OxxFc)9!EDPzv@FKxg&E*(IGFM@YRozTYh9Klvb&fiN@JISoiN zbbR }|9ds9e!@lmfL zmAUR5w2r{qK7CA!)*k&?Q?Bfa&otP*QSp%&2Jc${AZE# z=NZXE$c{7786&4?`cPJXd31KbyM022Dyll;qAUrns8A+n)%O`{v^O~ KHqpTJo(-@*X@B|LL_a}(<38Nri}CJv_Rl?Ue&@&E zWdbc>t}f8QC7Ql;#qmjXFG($gsdU6J{Y#tzfkBEa9DD@5A{7V)I_^ai2*|yHt%Ltnkd0Jr9k!Jk5r4 z3kdJTi4k-2%LUm!e{UeT^+dJs+ly%}^|9)O*|{z^DV>KTS(UhJsjf>huzJfeq a}3NqYmo6 zkPpQ-YTpf@fl<0G=vPl(-M%`oUM_D%u3Rq#Xsp-QH|LBu`tyq>3w?x%OTt6a07B7K z-|a!w19MYDd@>rsr-IK@zx~B~M_$94I79-ZEHzXVeij?G7bI tJD4vCpH=@cQE(}!IlMsuf zv>#9SIIg6coI#Zn{0|;6o@#lCW4e#bkW*TdUEctGR*N*~0Y)XJt$vNhPoHdir_mV~ z<3|Q??mdFz+$vbxRFsQ*XXRM&_;F|UpYSkAmjFmHo%w|huL)myZe!=UgZmHXERq~4 zc(h86>6=8ILNCO)`&X~Vq*)&lke(d;^5^X 7#a81zl-N}#VRFz>9JU~Ge z_$Zb(q;Uzr8}#SH7VXYLM^2r~m+2$7lEI-858vWj&=WBC_iBOx z19jpj+|P5xPd7srITi)z9w=%j7qw>uVG41xp2SGWLB3Wb&w)?YQvxmm6bkco F3ph>%m+O)|7!ie9Qgx zcI_#uIz!R5V?KGN@58JR*a;9EY|ekSFZtt(p=&+U*y5viJWVO6#~%mR5B!!5w{Np{ zD?p``&ZDd^w5*>I9b4ftBzDQPwlPVJ801w$dq ;(%32V7G5V)8pvpi7-L%tN^oLOWwww>?(;>K2) g@5ubKlYG_@$8>*VytXg>yKY`H6~;^d>v$olfl`oa&u0o zA=~bM9@Ih`3rBRCJWNOt3qH`(VG*_0LR2mMU5nynwDf|Y=mJ9bl7vvZxUxWsG#>$8 zFTR{Mfg6s`PgKI}eh(goxw3_Y-gDEuYzAD}whtfdmqlaMv 1TxeKFKk=s796j%(Z7-OCF^ 1 z8@^$y=RONR{^EVYpjn3B48;y#i7q8ZnVK7-`t?)nsR@l_8oizN(H3UQ(?72CH);h@ zWq +dj-u{$FJwtM)zuL$<{cQ6u2D=+%etEZ|36CZLCI;EX?P0V|eK(4~mpKpjj%+ kFvRxa8AM-9IYh L038)c)YgR1IFk(V2buAfZ(#ReT#g1e@OmVP{B|BbElIEg z?C(kzR0QbxxlwR6hpmq5)zvduv~@aBX%ER(HfB)HWYRhbFTTwZXa(si7KzdHGkGI% z5G5h-5|~~TKdyaeT~7C2S)bi&1Jw;`jVAyRqB0t%9gXbZzRzb3un ^Gi$FMR$HHV@|Q=P$+cQGupTj6H!Wc;V(c@4t6A4$sPV zFBzV<9*RvInelInRIPn&Qu)!phKjBvCBH*Pen+}hq@}T`{d48fn#pr%1w6%2M^BxD zUSBmC2)bH|=O?5*Bm!%0k=-0L9rli7#-YN+yU4Llzje0Y1OF;aB0V>TB?j!MV@29R zXhEggl2m4(`!b^whS}4-Hak0RO;hFNQ>3Y_yw8DO#jK+#@j@O{eY>~)$*3#X$3`G@ zL^svL*@gqf!jPBLA&(W{2g-E=cGjbgLZ`_G1X6E3C5g6~_?u)}kS1W$j;@9)q^Ixz zBk5g<$VM|||Jj$MwBQydx>+A#y}_wU;Xn%idb1I`dzT|u--ByMBW6{Go2L&9gze5s z*Arg-l)>9*^G!tvyc1k`{?m|hyf^@mxVaV7I)V#tM((1?YY?I0K3xS0XYPD@vim*j z4 2w6zAvXgjjad`TqeGATXgY3a79;uWd;L;N>leHk#RtH!)s{@QccqQg`y4sP+ z0b`lNxEd!FU(W(Lo98YwH9kqDM7%NG8qhGVgM1W&g1mmu0zSGPQC|VvqF1nsH*EOD zy7W6ExY>aav=1?Zo}M?KAD%Hbrb6);0Y(^~c6koyiv25~{Ykgt0&cj?iYGUp9eh%@ zCVBcS@UojdTJ76*+~8k4ZTKvXomUmTs*7)cf{eB`!B0&atewse*ie7*5^<4{7@55j z_%bVGHb|qkp?+adU;09rLRAxRf$0G<5PscyU=Fa)X8Q=c`p1*bnsDzgp4u+Dm3!ql zeyMR~rMf>cNp@9WcSh^joQb~n D&AJjD6lH=lIp zW8k*jqA>=NJGARxeRhkm7(=d@&VomFI>nC;p=(vIMdR#pL#vIr`1HSZZF>@>8Xa%i zBmhxuskR+JcqL`1F|F(eqBZv%SqhZLxNZs8xk~H3*{v!0 #ZEW`4<1cn1_o-fR)Y z^P+At;wRC!62Jm9h4a-jsIMqGytAtn7yW%4eESc@^naK|{vQ>jfB)?v2mfS4`8)_o zT3N7!Tw|6kA|eAe#tu7cR&LYDd27GxG8EIh&lzc}Pl|JKM1v_^9w`pgYoyHxh`G?4 z@T|9eblT6li1KcBaiRZSSX@KM16Ls!4Z5t@)eVV3NJvSokDH^vEMI0X1;uwR>m0^U zj>)`fsrn7iOOWDmLh`c!TFSxja+epu*;T =2JVx*I#m+M`%UFqYX z2})0RK5I_?dPEB)=Z>}x#5BhQ#$O-Pzr<5@aiSGlte`=a@rv6XmKataT0#Bi{Qu$^ zhj;$Pi@TjOASNQ1e1FInF~97;DBhKt_mmZse}rgx)m(W{=K_}PaY9EPT$5-S)Ix0e z@{3`D3hE`~sn(`h1>$LX1>#vx_^xc5R$MKgrgu?_m$Ho7#t9*9w s}G~l&QD}62`QBN4*ADVRK*z8yomj&P;AVT*BmJOmJA7mejNd@oeDki@9 zWSA8(P%7&j5+}Xq=q$+}&KI7UryCM5R-$*=&++_>V=MlxDwmMO%h?$<3t1)*nX?pu z$7D|uXyGDd_)Svp>4<6KW1im$6p|T-Kgxq!Q`27AHc3Bt>Rw|Dm|`V|$gsm8Z7z4; zS$Os)D_S+&pue7#R_b1ni8V+?;akA|;*E~C?%}X5!}XFVuGs78xj<)33p9hP`{kyi z7;AG@W_?F$n+QzdiI$Oe{TI`q%;(|v)0%Qk7Lkr XgayqUD$f<+cd#he3@z{>P@Ee zwpHD~W^~^>lo-rJ|N0JZRO#yFdGes@`&E^F{Su2%T45kFekuCIk!VqQ$8$1md>F_R zlfC;AmdiWCNzOo!wz(tJOD vHYJy>!sy~ zOsakZR;p}%OTRfY-_&Xtp|#lVeoQH+fi#zU?{rL|hTrVm52YYF{{UD31w}!l+#47B zLE=w@FqtS1Oe4zIRi}?qB~g)1nT~mY!4nMf9H84*nbarLk5f#+x0d k9X+d77_ffUSZtyjI3jhC|ZKD;#(Eykpc8YLKuXE9H&z!NY$5% zQX_kf)*zzuJv%~A#Z5`#1=xU~!Ht9UcMlaTVyeEB0L&gf_DXs)99{w`Y|f%4XZR$( zCjS#)^AsNYZS9M;@=X_inb9`jOl;5MicRxk&ly&t;NI#K|2DeNp<;$!?K)PIBQnr0 z#^BerElF+u_mjqei<0f$CpC~-#XJ%7J<+yU7jMU3k=3tNm_I%7_;vC;qFS*I;W^g} zd6yI$9dv^R7IB^J#cg2q(I;37laR0}RARlC%;}^(n8A{#x#?2P?wnGa+W6 m9@&U)<@P_Z z7ko+t9Gs6E`jn@n{4n{O7fY_l6E@Jd_7CwM-r0dKGXrUS)9rU$D-muVOWD6jP+Cjt zlFeCV{a_FzyHCNi(B^tOR@1sv^(K)?xQ7c%tp_XFR*#LPySRfMzGi`12_kz)yWeK( zHF#3GQ;#9kMHs9GgmjfGO+)P6gaec|m*l+Wf>c2!&!GqnUb4ep8-zo<^cdpH2HmiN zca6$r?&MN!{p-me*Sb?F9`~K`;J@&QTY#y4*moble^i@cOe#HMisVn?l&$b T1{#|$9P#3$0UmWqF@}*E{U&y{Z zbO5ok z%*sTK5c_JaAK@P2GDY%%pmma%i zH|hmEu~x2s*wOU+hJ|#dKr-alz CURmgi~yVc2O6>t+w?gtJlM= z=3u4Fc9l>1LyxAZ?4-MUaV=tjD) Ed@lQcdgvGNxT|T?Xx7mZK$PZ=xR}^C*)hI zsWQCB$AqSP6~U;3v8yuO7(RWDLH);iNQz0Ii0OD>&Cw&X=n)WI(EhVTRK$$q{!P3a zX=h$GRvG%w^=P)De4{6RhRc9Pg<06P*q`G$jH8Kmr>uewmmBA^)jSSE*Q1NaTyv&l z%6fJ@Q`G|Cobbey2G>vz{prq3>rCRIyL)xdjkJF!Db=yCY-` r=a_4s>VJ z92}YL!!vMr3_6>BbC;4>{rR{V$Ha16zX-^SPVC0*dDjxY!a3DOP@aTYfW=h*%kE$6 zdx|0g=cSiK+f&NBM(26J!ZxFqr_&o(hViFIq!1&19=~mPx{y_)-_BYwV7txg>BlAR zm$yA)F)jlMLi&^P3X&PV8r;J*`HK>wyFL)L%p*G5t>T3Ir}r ^Lba%O!0~xB&3evm%XzT_Bf@1Q zL=urJR0b`MCubwvpv?O&Pn{m#OA>e-$RZK5WJde_iF@|Pl-Q@z_q4T0-_|Ip+|q`p z7tmKZz?fJ(n|hptoze{EN`ZnEtTyFS<+%(2hvBmw$#I7t-lR6v&~e{z#Ph}x46>a{ zgH0u@69`{Sk5cZ7-hCvGBw0baEJt1}SbmhJQnvb{hzb(yFJj#<9lHC(zt+7e`|@W? z6Sy@?67XFMB|k= d+l*qGM#syBK8LN*P>TsAU%Oz>U(0pR zHg!}_nB_HxaiVn&!$8Gf!r=Qd>C 3NmR9GT=0`o#Z)+-qwTp$&tp4%`D)H@w=Tu~99htK)L6A*~HI7k6Wx z;4@# zShdwXV%#74!9G<#NV{EZQL`L~y_A21c1ZA}MA$yh?e(M{0R_Abn_N z V D2Z&8At1ExxL~{A@@4 zfY;p}vAXEL(^9IBK*px5=TBp0X1aWfRByif20_EK%Nv%A{g>Lj-4Q6S7U``FUUnXG zc6Sk-tH2*4o1E4KAyuZ;Z!v$go #5$sVvP zg>#-SdGje~B=$NuIzOs35HXZ&k|>2IIbH{Vl;U-|X>LltY^Y??swfEDA-#Wle{jDf z_C=z6ZsW{x_4dMI-c$cZt0Ca_SoRR2vKvTYaD@GwRAByv!($_HOi7uhsmx_N;JkUi zfkvEeYN~L#cINS)6e!%c4X3-wxRQ>TpF&uXAA;G|PP_1#n@8Q`;ye@$Uk#g<@fCF~ zRDH&dd)Q`#sPzhBpNK!+RWP53eso{b>Ool02l8}d?sh5z+JmF>MM3G{+wvFHtW*gj zirkZP4x$4q6$Y6k#D;Mc|Bbu142rY;)_l>B5G28!puq_Q3DylEI0Schch^P&1PJaB z+EMLU4C$pmCRA4NW&>`rS4EU9- SYcKR(qTTAurU*1gts{jLG}=q`(X zNwpRmt31>|Fw{H%+6Qw&=ZCP3--I4Xvk#bOxWvi305QVaaU~0t0_rEy0*0Q2igFI1 zERh3@9P;{`5%Zfc0+xV|`}8Ga?v94ey1VKZ@sravpCwH%vg~a3$B}GXMmmP7GNvNC zE-~*|hT-Y=)t(6~`$9#bHetCd@Z=tU>+yFN`U>d{ew-8Sd~r6B!~pq|WTIe#FS%@n zWJu@oOD@wN_96vx(&ivOKUb<3Sj05u`>2>FFvozJ4M}(F-n6NS5&~~!1N8}|1^-5V zb;e6*?$E$&RtHA_xnCl#v@w6ouYtR^QOGrnO3~@<3vC&myrMM!7D(5bzccVkY2^{@ z)@+AOw!D=jRWU26$*8VErYWa|RSoI_XIggbok7?5qC$*tK7^LdW@3%I7L*^aSlutw zTV$5R^@?FA_D6eEmRgAGBvj7Mie|~&Cl58=+|l|!C*BOnyDzs#nj{X{Hr5@g2hw~O zloROlChQRp8YUeKwSU})G O--rL${3XV zAh9n|97rc*vcU}p3JZ2&wD2D24swR{d?Tqh3=rmLKIigwmF0HYj^-|TuEbW6WTS?- zeC=$}m0?fHsIjjV8WV_7m?4?z;FXrKz)ElXud{!~J?%_zdCKC`X+G4c9JG #pO*}^x8zxNvhQ>QPaYBA zqlkR)d-LKA%JjEsrGu7gqTdLfvmPEH)Q=NO()j6W9rmd^-G2C(wiB!g$z#@_XfbAe zx1ey{QFJ}LPH&-IJKrD>9$5Qa_~JwUCKi6 VE0 zw&(I+XBBVYp<$qNMI~v1%1U)62cnGqAzx9R0&Jdno404N<@yj z&E7;F$U6#qP3Jhxn2F Cw6+d<)#4n@5#l>U;s;5jR1s7F8ZC3@1zG&hJ zLBCbRu(UPL$;eT1OM1HhuK dKeDOI%YU5sl8Ci>s^6UTt&QP2~(=;@8WM6hf|yuY75)k|z4o zTF%QbWpw7c2F=#JF+>%2pVspJ+yLO3vt0lBy^r|2?jlxC&Z_b@z`xm*!@!j0q?#EM zmTXa%YBOrm7H;Js#kqxAO|Ft;wpN*GAAXClaE`o*B8Q-0=iP$1YMiN-)Fm-qRLbz7 z?*|65_9H^Xh`1wZ$?vqUS y)S*{1OhXFpE8 z7XN%Cq1!ABQ6H41GWd%kU3_FrCpGcHeErHA7J5^s1ZC_NnWe;0P7vpz z`1RZ2EbTFEym+h5Xy!lLl8jGbV`l*4<2tGPJFM%U8zt{`Xo~Mk=5)S19^+=V@v0xV zyUiYR6ANfF#IB1($5yUC$20qI#fAFGe#Ln9>Wf&srz^W}0t@hsI5I;-$)~dj`|FO> zjnH2d*2BpFQy658__6HE{laxvNqNWHj#fubk4MukXtVF=4a8L;I^_6D$FV&nAkD$V z+focWDw$T`W6i!o1l%?k+c&|9Qmg?i_B7{Z)%1}+l;y~n7n4o25>xbwT_(RXVfal) z%%`%DD`!0rGDkA0rN|zRchmcixbEMBr45ZA@8IWwCu3s%bw)c^z-9Lf6Xe9`bKoyT z*OQ#% dL5q5-OX!gz3iC>0pyHWUfm{XYns#j;=?C_^pEf%4Lg#l z C5@SeB`xhHyNi+RaMs!E9ndw} zDGQt{a))%nsHN f+YjIg zWVM{4QmaeYcF?Z`l+%lLO}Qhed{wqxqtP9BRc11t9ZreL_+d0?+Q7r8Qhvdt3AAxg zsE(ojxkf1^B$n8%$(bsFMiKyScU&@P9Z!q$9J^ytof-HTmh})#@k;C47p#wD9^py; zzT0aYOgxYR95UZInD#tH=sO9FxESjp;DH>j!!6i(&soz7s`>d@A(g=9sZv V)1cu2mFG`fLB^C*KS2g)@C-t*5t>KNZ`DXpHkF0410gm`CS3s+Z15~ zYZZ#aLV+^7=8uF*8U>6>P5wFUGHv(zTjA9f3|ne-G`zOuCu9{w^H|vP9+m*dn+Vdq zAytQq6k1|$FG0=?LmoyEaQWSZ@ovTO@f{}(TD?2Jz8JgBstoxk_93p8aIWiK=_tb- z?;u+lJq^@9SCHGLeKttxfKs={*Xyy*;P(giP5Jc-7t~*p;fYJl+r?qp5y9Vtimb!3 zyuPfrR1hc}5;ZxK*EW;$WLXGi)xBD8s}R!z{^U;o;G6}d6!3QJOUZcLleb(ID{Ezq z(gb%$g+^pp<;Uf$l!Q@dL=@trV)J;(3oq|@@fN3z1s*sA);=ltCFA!;-Y5J4+H4}H zGhXRv`>$@!H)S5W;$^f~wB`MrNB8P8I2?nl1rzgsZ(VA5l2euHv+63x51RAbAl-|W zULSjEWh-pTkKV-Q%2{}Rl4AOb0$;7_#E{}Z@?DeR!ZUBs k?%zwXCd&cp4-T zt<<8e**KSKZvC? *J9JZ5R-Ne)OS&spN +=IcFkq_NFj>Emf|ilO7KSixj#n@P*U)Xf zdV7$!_Z#ME26nbRGtB-L^Rh``5whB5=Yl~N+Zr)sa+!dsk}oL{Q(96IJ&JOZzv)k( zxSQIn!0_HLSsm_kQ?IF^s)0Hiw(i%8^gm7g4;z;)t>nbTBM_Or5CpqDZ?=Ku;d}i> z;V@1J3|oP#n<=l*;`K;eux<3Eg_7IZ6r2F2){=d_y+}CL#W({2;AEbZ1#Kx@CBfyz z*$(wSEj!)ayZ3G&o*}UmFSieZs=?Ub39z0S8(<6O*!C5bA7lxcu^)ZfY695Imygt@ zZ5<>g!fsUHA_qh60qsMoH 4^#Gtx+n<5jNgp`Vs?54+@ z`fCKkwU|TdAFS WrbG4YUaNre06k;E+~U6dF|Mc^ zK3m^d^|L#Y>%8~+#`?b-mjP|6mFFMcV{ZjY`@nLEcc#bEyx5!8xLO|v#R%nDz6LR= zE4CKQvS7W=3RwvEj~Ax-_s7G(={o+AZT^=6q5iXD+h_1#+1I^R0V?qh4goX^lite1 z=M$Vt^N%m;7xlWQ+Dfd_h$gI!; t~mQ$%k{kcTpWG^pCvvMErU(U~|gLqUG@B9_lVgYx)!5 za$lm2w_HA8Udh+`r+aSMbt+LYT*HfA=dI%iDkHCkw9Gg1o}&iGyt1aVD!!Pfn0Gax z*}4Q6^f8B-WT};UNj=4QOZh4fINAN22r}}1iwc{~D!$Xc^%cfnlmNTVGH *T8Q zr|mdBMej8`q^-xX6mbNd*`HY6^!W(fnr21jp;qD6&f^bNEveSYAr3ww=I`lVLP-a6 zw@-oT>(s%|TKy0v7Xg({Mw4L f5sx zw`|!6jWe#^z(RTP3#hrHKV|VH;@c7*>O%9%g#X3J`1kJEf4ER|YYYWm7$E~F3*)lF z?!~aIPN5XWrU4N!%BI({b7hn=>)->1R_U0a)t2Q^l~mee*#|ta-CnM-9fxdlScXR4 zIQpWfy9cuv(p`b#mGm4D8uo-2{ujmC@YU@<_r16C(d|>-)jJ{JCC#ldI3DU(+Sr%* z7X?cb-T`HHhD8K4^&=#IYH7~~_#MJ7MXvWg?+r{azDyft98|>8nOXX|rOlvE&qpVD z99ndKjN{0~sSyHe%^-DX0=z_L6;|>4u^n*CaDBxoabQ$DDZh7SymR+*ZHK0^41sz1 zv=m7o3^3eUrM&C*&hh>Q3Mc0~HmW=JQ?wd~5no~1s!1s;E#4msli9L7kQP7956C?w zg1+?A)l~$Cga54XGs(`Jb2YYvPSSNbjcpr@D#(x{f*M8+n>T^4r|^o~EqrroIO8(r zz299ueT6;bam9fK ;=I;|zKURkxK?W6*utlZrB zz6ClleBqH*BMTiY(T3+NAWC)jI07P*;-zRL5de#uQc9l!LzZArB=p9CuBfC;N|tpi zipUm~L30P;zy(@{b1_9#m>aj2(58Q?gN57%(m?O)S1FT;m6YX{b2uZ?dpn9;em_@C zgPg`?$Ur*%>L^vRjL6+&UUCT-NmuHvs3cZyE?KtQw6gmwCu7uXwOz5lwZ(!iouR-y z($2+HglJc}U4Z;k(r~+jBX6T+aCTvoyz03k9s^Le+LO3s-2CY36|1RzYIK1U2r#-U zNt7hLrjY=mmw^eZm8nHgJxB6(*Zm-d#t7~U-BQ0h&84d`Si-H$;QEN%ya>?A$vB~x zsZl;E^f0a}sv&b!*XoOg`c!wrd`dfuSNO}hA1M`~m0jXvf~$|6z9Hw}dILy7dy-V> zPuIjhz}5JEkjYhz>#Ru3@)k26=Kj;`C-ps~B0fq zMB6Bnd&q_9T z_>N2S2uVqqB;GQZG-`-({lxysg4B;=ozA+=hMp$RYSdS&-&VobY0cG2SmQB__HrXB zu|v^*n?vCcQ(0Ae2mjjfWZz(N;K}U%@hIu*$%oGiCu}y*v%qS-B)_b2r@tt Y4acPl2jay%V =Ml%>$@p; B3M=m`&y!`>Fc#lQwhq%r21M*m~p>3#10x>Go;v!qPyVmdn_xlTmBFeiX7 zdyH25Q}d%gc)9JlDh+#m%SKkHY`jtczwOSqH&TXOdLL_W7xMq25M+=jALimj?iUC3 z3ERzTv(3moR#MPj(KcirkBBAQG!~PZi!*^Y^!+NTSa-1=u$EqeTCeb(`fMIG?>*3v zL}A*qc&d1N);V!hJx>|Pc-W4Bc}1%S5Fkv5DXE?bE}w_cKU`L*8DN<^ux(M3m P*6LjFyZuOr(TP`1Iw5F%&|j zh~q2)Rw>4W>F3?`D6i#ioU55@VXrn+i#Fr){H((MP%Bq)WcWvY_d@^n;u_=Xl !SEItDNJ*0Zo?K1 `JI>QQ~_gb4heobaWO|QWaC$ zh~{w0O-ce|DzPR3hij1t>M6UuquA~xSbtE@nhyo^ Q2 zL+R9d+wpsOi1|y`p4Vz149}}N7?vxQN2oB%oNLEB#*_xEQ_iP4;Y~l9y0<&61GQi8 zD;l}R)(jB5iRoOImC%H z`&$qH+8%h=mwQA873O+fC!O$%xZ@}arH)n|n)?kmvPt9m`slp#pT5?=%05>{q{(s! zejb#I_%K)JiPrcwe&}bjknpIY1wJ3&h``6n+$84m3RhyjmyC_{d nCV1?Q{<-94HA5L?K znPrfouDL}OZFLE48Es`2cBIFO^OKu|C;=;7;(P^G;)O}7$*8Pzx=}v;7xVJA06cuB zouf+;5N`A@vkG) $5*3E3+i3K*h!Lu5Y(z8yBb}9@H z-}&^@b*%(IKMhF9QAZ_JdPs~w3m4bV&rO@-cf8O~>j;9xEgo=g){;0>yJCOh-v(_^ z6LE(FNqFHDfn!%;yTtrlTd+V#+8WXbz@w4pk)z&nvJ+w0J1at7W;@B?eA=bxqPoz; zq1RD~UaM;s{gV6~9IeOzu8zxTpyC9QZ(2C34Kd7}iM?$JuCU#o7`p_7O$X-aXd>rA z(f$l&3c?o~4|j(82<2`S6=eL=*9&n+JDPl$%vEQF*OiP!!(B7JCZhPK$x&Yo9=?ZH zv$E+a&2&jYWSD|N+L|FU`O9YBr{{!INTnk>%>M{?a=m4(ompe)HK2g6fgoTQPy1AL zR#rpG)s+B&@eF;oI1DaZClkM-EdPI>yZ(=r W(E%W@&c-4%cFj8e1MdkG4iYuCxxjeCP4 zS0X_>R($8q_ezcpMMpgzPfQikAB1Fg_K2YGeb)WK-zmeYxdL|%I;T!giSP?39bTuL zGB P7g2O!iR$YU0jiVe(F6mnYOW>EG(njR(`qja;c3Z zcz&c^gcPtt+3czyo94G_r#GS$Xu)os6cOzySzR+GD6|&=zKNxt%rWl6m2++hK7xI} zvH#(Cc}^KE1u&7Qi7Yq3gukHg&D%X{Xu*59fBC1gwnN=iKDAdg$lmE8emgs !}zxUTAXoRCG`EYC<#kP$}Vj@?<|+@rQ1g<6RQ^3nf>QyUsNu<-aJ5*`IzsF{w+b zUL(B$Y3$LrVvJU!vn&kx?a46TWGKt=L=Q)R$BHqHU!C3U(`;#KeFlYhnn9`b?0&1! z?y#&~D+zQh^_!kN;%R48G?id@_lV;)Uw>j@ WEtPSrENSrZ6nvpgZ8puPVlW#)7c~X6Z&+~f{$=){i2v_OVz6(?N%?E>0k4M zl4z-9IlXa1i(vf)Z@+X_)@0UW0wTQMV^Qa<&5)F-_3R^;;di&707%5(G# zs)X#xDC-mcZ3{-KOhz(9Gd9TYNn-dw{o#Pw$lheSu;XYb8-(DQr~ zi>}1+F?h-tOPC$FrXRP{DfNMvPh->4bQf5NPl$MYWvEQ&+0p{6_Q~6#1-2qNh?Lv3 zzv3G1r&^As*FzhHx?3f`$D2c+PJsg=3=P-K>J+PpIQ{n;x5OH4D^=?y(Xov020yo6 zf1aIU5XrrCZ37;g5%)>ID+f&722JL)G|Qqg@X|0|0&NfPRZK7M7tqpjRD A5m?aSMSGe=Cr`UNLhH* Bn&%f>m z4Zt2?H}i>%Ux&vu0ft1%A??&t3+*&>_qILmE1YB8pJLnFJB&T7ncnYv3l2FxxXptF zVi;78YZAsiYe7!C0*?mA<*_(K7W5~(L%yHd^aE!ZU+!oc;Jsv xdbyl&k~0VbZzs)=M2(|#oeUT!_1FQiV7 zS{D{)#E{$OC&V8bF_{530u#Oy2 vc)b0SnDT6djd ;}?q~+T_&akK^=P4D_yxyNe(&w~ddLHsAiV@`X4RhDPIG%A z?mO#_a;cjo6=m8YW!7`bbb(e$(Q(RhZet_>R{cA6+=JLi_txHU8d6Lutz5gl@D$k2 zSC|Uy7WZ0uh4*9Y`?~uz3 8-9OY{!A8rNXbPyihImLHww_Bo{Y=+%3qdgb> zY#XOGMGX)CNQUN RE^@7rm>754X(eF7qnCn^vNUJ+*}wYf*DuQNYa zoha2L)tzk2oi10Fl*apA*s{GJ%g(d;i-OxRr>=ri@nSDr??Yu}K;n+uDOjv~*6}%@ zMN;Xrf2!E4IXR%?``kBbI<4zxcM>=k?|h!we9(T-t$g|o^#oA|BIbM3rMCyn%LRr; z@Y=vW4-~?F*f`Q4%67l~Y*INn0(Eusqr*F^WpGnUN{Wkg1;vm}8b7Mo8-J9kvFv## zg%#QUtR$8NxXrlzbd=!Bk66d$MAzj=^(ZwSQnD=kM69V6-2qBN5{{Xom!`YHi+@o( z-R 7@pJxC5Akm_%{<}W-u~@x~;$epP`x+A#1qCvKSq=2Y&!+Cl z1cFr`GGRT27y2>uG!Ys!SDyCM;3y*REk`YAGyhTM-q7r-1p&E4iEmB-g?Gq$Pc*q^ z_Ok2(H$R6NEL|Hu8D(JjvOlSuvTBK>k=YqewXcN)sc|+2k4?N~I3&vR7A@=b)meJ% z08JYj3dX!(`}7TKf(#iHWaMppy>w5FgqCw=CZ26T>fE$)V`?87d2po^o=8|)A3qPK zK%QQLZXe5AcPGxBV;SPlkeKNqeo$oPSl3EF|1+jQAN*C@X-jRy3gENXN7+0YP&&v~ zOHBj+j=Dpn$V0_5?oHT(6(5WvkXfLE zBkLBuL{T~!iZ ;{DmBH hBXvTt%q9T4ChF;`xnqitI3`3@A_uQYbZwMDa z+% )y|c zXiJ&x@c&W6SJd`NBK^oeiirR5|LxIs(jjbO9@}`4A %WbKGj6!rmZ Ke-O7QuH20k2pJt1bm0 zo0tDoo=N^?0?VTwWu<}qse*I^QK7GIlhz(G{`8*EIt^yU>TjKVnmarEiV)do^e!8w zO%J@3dcW%>K*+R2OWFbFFVA>iH7n`wRQr3}d|f=clTrY2mKDvyR%lCKuIRbYW`ZZE z6P}Z{WZ^1=`yP+zlCKi|8aox}EXSEQn6|BA7aWeYq-3w0s(f`k*q!Ln`2XB*-T3bx zHpX~dDOG>Dm-y-9={EysE^F7D1GAk!?6~7qZIpJFR=?z)(-f(aXnio`;I5EqR7x_% zJF;fadXu1i${cw$CEJS0Y0p+Sp!~ +%aa0lfS5E>wGh!$q#=HY_0a) z2r8s(cc4b91X#)P0rEHeh=J!fSBEN4%Ngf?CK@x+t6=^hEfB9! ln?#yNGpA}vudS~j-<+6e_97m3;US=J+ZtQJk&`F7q>4zV zrC&Z)M7lNX7q*RMdtd*8u@1rKw0A$=cnhz# Qbh@sCNSxb(WF;<0B6$-D+Pk)Aa}M?O5)TbejffEp>E4Ss z&A?)OH8om-ZQZH9Ncjg}ySH<(fS<||#tz869#GzQE}AxY-#q&me>KM*oKp|u9BDL$ zS1owlzC$H1Erw|71pZPrN^H1P$(WJgCARa6N(_PacWTzI<9JgIbnBfR!qBu;c3t^C zYV1sFJcN9X@{V&|7LZbJb5i+)Yg;QNZi^6()qgA(V-kqJPCTX3)TxG{|50f1+cEta zQTD#);lxYj4oBaZBA>ibBpp?<#cM(O{R{C(Ln-BT5qbm0&s(bC=GMK5m2pZ^fmMSI zUujus=bQX`P8hb|PO%8EjjFwS;s#2YLNFme!-z9~E&Oht#sUpX8@Lo0+aO|Z;aEF- z5;zvK4yX0rc{A=fF% zPqbp`7h3MCfcx3pKwQ;DDQ!s&`l7 yBcphdgVKCQN;%E0IpWn9`zP!(GRE G zcXz5sRbl-#{%$OAkS2BPA{s~guBu+}nF9F_VSAH)xf;lNV;A#>iR_k&Edoi71b$n) z%D!*aDSUHC 0mudYc0lp!Eo)$dUL?S=XiC6EIUx-lZG z`|sP*KeC}h@~*>(DWnp4TDOB3J11-!MCTP`iLz}Mz Ec9^E3(TN@kmOJh@|l>rf~GXR*xwSDOmx0Gba zl!iqs#L $QZwJp4gD^g!J(;fQmmn|vabnhi7x%b0~Z1dh&)cr z^?j+v*c%=Y6W<=14x0UN6MFnKyDF5kry@QH>hs~A?464IMCSz=GftyUobO(Nyl4ml zI6h@fS-j6NT+r7irrC$M%{UR4DI)Z*eHJxY%gDcZyq4g2<&zo=kZ1EXSF@~%Ob5B6 zZ*>ye@l+6Vu*;)hvK!22`Q{dGnC{1j92U36ipsE;78cm*Z6?`C3~zooh?m)Z8t6vx zi08_D@9*s7WCv EJg`Y$R1GHv;Ap;u7`d2HhvLH)crzA;ukV?<=(I3{h&S7 zx3XPXV3T#ej4MLs{&&Z(C;sVfZN_kqW@! XVw zbGTwW)(Y;q_YliS4I1&nKXGB<&2bjl#Wt^Fe-U*~HLws2{i&b6pzxUnRb#bG#8&K( zUNa!DN*F-vKl8hR7wmsg#1E>QKx1WFu`i?Oj&SrFvO{z`;OO*uaX7lTE1Hztv>!Py z%tq&3zJP$&x22G~h@AjP60$Xq7Wbu#v>zDL={l=uEa54eCPKD9d^*nM (mMdNt6asMeIgcQDPME?}Km6^T9J4@;V1Lky)(Q@+)y+$d z4_WryM>N>aS+^UWKJ0)iD|?@pJ@gndB<5-@ur~^hCqL2T_Lkky#zS|W-flbw3ftuK zjg%Q7(F{ZIi~G7>-=(QKAA50O{7!e*zbNh nP@0=uUKg>uRVU45hfNH1S#0P4&f0l%A=F1tH-00I9lesas>u|2;M_>aeV%1E zM;RfqGgR|$lTQDC@go1#`~5$20ra0p3PmD7sOAF}@7v?89|JXE;xLCN&8uYi1w}+3Jf*m>d1kI z<8`qdvd2r?(v1t4^EmjQ3p`wWW+h7Id9Qz?$h@i8jB|SNPe4vzRVtsDO|Z|cteAc* zB`I~UFu@NFa^pDanr^>2YQ;?%b)eRM<<9A3(#U;efz48lU^5A?fU$BiG26=&z`>Jp z*F%-Gi@${iD6J5C7`QQ$eGR*Pe!ZR^;)^j~Ae?@NmIc~j#2+hQSRTt)HegC4qf0CF zRU>;7yPs>TtHx3or7*$~*N+*;rzVF$JueBZdhbGfTxqzjs?9hZ*o~ey=FO?J1jOqx z40u>4`qqwjyphuhZfewsh{(S+R-HR=fwN;-)0<=*j|Z93?VnK%WBx@^mk3yLWj-1w zX<>8Ys{xkLVLbgR4l=X=4A^Bm%@<~9mhHA7kNtkEkCDpljs9;d0ocFON6o!*hfW^b zS3vI@eJZ1P+6}K)x+|EJO*K4eFDXE{mc%sP!1S7l0}9}JTBx5+KtfZbj(Rq%mPVs7 z&p(|_U@b6N>T8h8pD)(` lPm;#*jLMA*#CcHs(6+&JNlffFnSg3!> z`OwEoNJvHG3~>S0&Xz}2Z`>vnQh)E#SA?H>@RZdQq|P)w;-xdJ%0wRzx+E1Rtkosr z#Nnq(p<>NNj_qf}taofuC}6Hqz>316sirH+u!D>YDQNd1b%Dmv_+h8Gq58 5odfO=wEWy6vZ+_fAv;qmzQH6bjkCS-fXyF2v+=0BePC z#@!Ug`6Rg*u&?SB`$3vFFwV2~_#zB$%=5z)_FUGEqi!U3Ex%agh}Di^3D+RUc){g& zOvT4fDGQwuh3`k(pxho0)H$!S(n&3NXcFm!gC>*{kBL0FSubms<3s6`p+oVfWQd0! z5Q}b( h7vXBPF}T>W z-{xW1t5FOlBd7ADcV0783Nf8M2LLnvd#ovSw4r&_S?v2euAR*o^hcg;5S;|{))wqe zivSX%$#z&}`0n@OB4_XN$W6&c0pD~5uS}>;Avm8J2rtwB51RTy(+>JD&w%^m?~XBV z)dLLAx>t-C1ZI-XCZ~>Ldz)6>ClU`IibTz+NLV1@fC&a>v8=tS$C^=Yc%Kk(VySpy z-7D vB$X;*^#&6oNfrgwO%520^3So#W}Q4NYkWZyO-a a~Mq!BCtY20xwTNZtqe&+Ma z8QevwnV2MJBa1jXEE-RGCmPJS>G28?bl=!0EQh>Z-WnUO7%p_u=&e7lWp_0PolNak zIo!^eA5 `rXs#NDNV zpk)(^G<{?`Yr%49G!CbYAFiEGK*+L@cIV7cm~&S6Wa9xTQ$z-e{ZF5t;=O@elYf?* zsLe?$i`qr7syiZwZm!Hlu!7DIcqgep+ih$FEMOEB!5A6&rp}hx-J>gx-sxDO(#of_ zmw^;lXN`szB(LLl>Q;7vre)gA7z#wT6etx09I{b;h2>isfoPS>sQ2g_Je{Ow{kvI@ z-4<>vnkd*PDCoPwQ~&=UQ7$|l_qNt~AeSxJ-Ch+$um(eLtqq-AK0f)gOMWfFFYd|f z7* P*$Z1j75Rxq(?Fg$x2J8y3>3Y)DT_4+V#xAT2f>%oL_yxb3eN;7AJ4bq|~ z6=YNrT+++r4hbH3nYETjd16{VCJ|m!>-XG_*WZmPyzDZH+(4$hD%kFa!LMdxpFhHM zS!{M{ycj)QK6!hyW`}q04qarm$VA!85bHGYmeg$jwhWnR`GTZPpFZ3QY@c$(;=oQL zcvxJ(+}0{50l5#SjuRgS9nOlrg%YO~>U}Gf_qfVPl6zCETl&0DgwU{Z;G$Ly(+)k& znMpMXL j&khR~eHd_t0^_(xdgmSj#m0Lyj|t{&Wa;ye(Iu*fT>(uS z1gFa1)(_hAQ|1