From c93ef1ca9b9b9dad6fa1766d364d7e22e911de1e Mon Sep 17 00:00:00 2001 From: purovps Date: Mon, 16 Feb 2026 23:22:55 +0800 Subject: [PATCH] docs: add design documents and requirements --- iShare_Design/iShare_设计文档.html | 895 +++++++++++++++++++++++++++++ iShare_Design/page_structure.json | 112 ++++ iShare_需求与设计文档.docx | Bin 0 -> 11646 bytes 3 files changed, 1007 insertions(+) create mode 100644 iShare_Design/iShare_设计文档.html create mode 100644 iShare_Design/page_structure.json create mode 100644 iShare_需求与设计文档.docx diff --git a/iShare_Design/iShare_设计文档.html b/iShare_Design/iShare_设计文档.html new file mode 100644 index 0000000..f4cc85c --- /dev/null +++ b/iShare_Design/iShare_设计文档.html @@ -0,0 +1,895 @@ + + + + + + iShare 设计文档 - 页面结构与交互流程 + + + + +
+
+

🎬 iShare 设计文档

+

流媒体订阅合租分享平台 - 页面结构与交互流程

+
+ + + + +
+

🎨 Figma 设计预览

+

以下是嵌入的Figma设计文件,你可以直接在这里浏览和交互查看所有设计页面。点击下方标签切换不同页面。

+ +
+
+

📐 iShare 完整设计稿

+ ↗ 在Figma中打开 +
+
+ + + + + + + +
+ +
+ +
+ 💡 使用提示
+
    +
  • 点击上方标签可快速切换到不同设计页面
  • +
  • 在嵌入的预览中可以缩放、平移查看设计细节
  • +
  • 点击"在Figma中打开"可进入完整的Figma编辑器
  • +
+
+
+ + +
+

📋 项目概述

+

+ iShare (AiShare) 是一个流媒体订阅服务合租分享平台。用户可以在平台上购买、分享和合租各种流媒体服务账号(如 Netflix、Spotify、Apple TV 等),通过"拼车"模式降低订阅成本。 +

+ +
+ 💡 核心价值主张
+ 通过合租模式,让用户以 10%-30% 的价格享受正版流媒体服务 +
+ +

支持的平台

+
+
+
🖥️
+ Web端
+ 响应式桌面网站 +
+
+
📱
+ Wap端
+ 移动端H5页面 +
+
+
+ + +
+

🗺️ 整体页面架构

+ +
+graph TD + subgraph 入口 + A[首页/欢迎页] --> B{用户状态} + end + + subgraph 认证模块 + B -->|未登录| C[登录页面] + B -->|未注册| D[注册页面] + C --> E[忘记密码] + E --> F[获取验证码] + F --> G[设置新密码] + D --> H[验证码验证] + end + + subgraph 主功能区 + B -->|已登录| I[主页/服务列表] + I --> J[服务详情页] + J --> K[支付页面] + I --> L[广场/拼车] + L --> M[车票详情] + M --> K + I --> N[推广中心] + I --> O[个人中心] + end + + subgraph 底部导航 + P[首页] --- Q[广场] --- R[推广] --- S[我的] + end + + style A fill:#370CE2,color:#fff + style I fill:#E94C89,color:#fff + style K fill:#C22F6C,color:#fff + style L fill:#E94C89,color:#fff +
+ +

页面层级关系

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
层级页面功能说明入口查看设计
L0首页/欢迎页品牌展示、引导登录直接访问
L1主页(服务列表)浏览所有可购买的服务登录后默认页、底部导航
L1广场查看他人发起的合租底部导航
L1推广中心邀请好友、获取返现底部导航
L1登录/注册用户认证首页点击登录
+
+ + +
+

🔐 登录注册流程

+ +

完整认证流程图

+
+flowchart LR + subgraph 登录流程 + A1[登录页面] --> A2{选择方式} + A2 -->|社交登录| A3[微信/谷歌/FB/Twitter] + A2 -->|账号登录| A4[输入手机/邮箱+密码] + A3 --> A5[授权回调] + A4 --> A6[验证账号] + A5 --> A7[登录成功] + A6 --> A7 + A4 -->|忘记密码| B1 + end + + subgraph 忘记密码 + B1[选择验证方式] --> B2{手机/邮箱} + B2 -->|手机| B3[输入手机号] + B2 -->|邮箱| B4[输入邮箱] + B3 --> B5[获取验证码] + B4 --> B5 + B5 --> B6[输入验证码] + B6 --> B7[设置新密码] + B7 --> A1 + end + + subgraph 注册流程 + C1[注册页面] --> C2[输入手机/邮箱] + C2 --> C3[获取验证码] + C3 --> C4[输入验证码] + C4 --> C5[设置密码] + C5 --> C6[注册成功] + C6 --> A7 + end + + style A7 fill:#370CE2,color:#fff + style C6 fill:#370CE2,color:#fff +
+ +
+ +
+ +

登录页面状态

+
+
+

登录_默认 入口

+
    +
  • iShare Logo 展示
  • +
  • 社交登录按钮 (微信/谷歌/FB/Twitter)
  • +
  • 分隔线 "Or"
  • +
  • 手机号/邮箱输入框
  • +
  • 密码输入框
  • +
  • 记住账号复选框
  • +
  • 忘记密码链接
  • +
  • 登录按钮 (主色)
  • +
  • 创建账户链接
  • +
+
+
+

登录_输入 交互

+
    +
  • 输入框获得焦点样式
  • +
  • 实时格式验证
  • +
  • 密码显示/隐藏切换
  • +
  • 按钮激活状态
  • +
+
+
+

忘记密码_手机验证

+
    +
  • 标题:找回密码
  • +
  • 手机号输入框
  • +
  • 获取验证码按钮
  • +
  • 验证码输入框
  • +
  • 下一步按钮
  • +
+
+
+

注册_默认

+
    +
  • 创建账户标题
  • +
  • 手机号/邮箱输入框
  • +
  • 验证码输入框
  • +
  • 密码输入框
  • +
  • 用户协议勾选
  • +
  • 注册按钮
  • +
+
+
+
+ + +
+

💳 服务购买流程

+ +

购买流程图

+
+flowchart LR + A[主页/服务列表] -->|点击服务卡片| B[服务详情页] + B -->|查看| C[服务介绍] + B -->|查看| D[价格套餐] + B -->|查看| E[会员权益] + B -->|查看| F[常见问题] + B -->|点击购买| G[确认订单] + G --> H[选择支付方式] + H --> I[完成支付] + I -->|成功| J[获取账号信息] + I -->|失败| K[重新支付] + K --> H + + style A fill:#370CE2,color:#fff + style I fill:#E94C89,color:#fff + style J fill:#C22F6C,color:#fff +
+ +
+ +
+ +

操作步骤

+
+
+
1
+ 浏览服务
+ 在主页查看服务列表 +
+
+
2
+ 选择服务
+ 点击感兴趣的服务 +
+
+
3
+ 查看详情
+ 了解价格和权益 +
+
+
4
+ 确认购买
+ 选择套餐,确认订单 +
+
+
5
+ 完成支付
+ 支付并获取账号 +
+
+
+ + +
+

🚗 广场/拼车流程

+ +

拼车流程图

+
+flowchart LR + A[进入广场] --> B[浏览车票列表] + B --> C{筛选} + C -->|按服务类型| D[Netflix/Spotify等] + C -->|按价格| E[价格区间] + C -->|按状态| F[可上车/已满员] + D --> G[查看车票详情] + E --> G + F --> G + G --> H{决定} + H -->|上车| I[确认加入] + H -->|返回| B + I --> J[支付车费] + J --> K[上车成功] + K --> L[获取账号信息] + + style A fill:#370CE2,color:#fff + style K fill:#E94C89,color:#fff + style L fill:#C22F6C,color:#fff +
+ +
+ +
+ +
+ ⚠️ 拼车规则说明
+
    +
  • 每个车票有固定的座位数量(通常4-6人)
  • +
  • 上车后不支持退款,请确认后再操作
  • +
  • 账号信息会在支付成功后自动显示
  • +
+
+
+ + +
+

📱 所有页面清单

+ +

Figma 设计文件结构

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Page包含的Frame说明查看
原型分析奈飞小镇、银河录像局、Sharesub竞品分析与参考
全局样式颜色系统、字体规范设计系统基础
登录/注册登录_默认、登录_输入、注册、忘记密码、流程图用户认证完整流程
首页登录欢迎页(Web/Mobile)品牌落地页
主页服务列表、详情页、支付页、FAQ、导航核心功能页面
广场车票_全部、车票_已上车、车票详情拼车社区功能
推广推广页面、邀请规则说明用户增长功能
+ +

底部导航结构

+
+graph LR + A[首页] --- B[广场] --- C[推广] --- D[我的] + + A --> A1[服务列表] + B --> B1[车票列表] + C --> C1[邀请返现] + D --> D1[个人中心] + + style A fill:#370CE2,color:#fff + style B fill:#E94C89,color:#fff + style C fill:#E94C89,color:#fff + style D fill:#E94C89,color:#fff +
+
+ + +
+

🎨 设计规范

+ +
+ +
+ +

主题色 (Theme Colors)

+
+
+
+ #370CE2 + Pink 700 · 主色 +
+
+
+ #C22F6C + Pink 600 · 点击 +
+
+
+ #E94C89 + Pink 500 · 常规 +
+
+
+ #ED6997 + Pink 400 · 悬停 +
+
+
+ #FBC7D4 + Pink 100 +
+
+
+ #FFE8ED + Pink 50 +
+
+ +

中性色 (Neutral Colors)

+
+
+
+ #1D222A + Neutral 700 · 主文字 +
+
+
+ #4E596A + Neutral 600 +
+
+
+ #838C99 + Neutral 500 +
+
+
+ #B8BBBF + Neutral 400 · 占位符 +
+
+
+ #F5F5F5 + Neutral 100 +
+
+
+ #FFFFFF + Neutral 50 · 背景 +
+
+ +

字体规范

+ + + + + + + + + + + + + +
样式字号字重用途
Header24px700 (Bold)页面标题
Subtitle20px700 (Bold)副标题、区块标题
Body Bold16px700 (Bold)强调文字、按钮
Body Regular16px400 (Regular)正文内容
Caption Bold14px700 (Bold)标签、小标题
Caption Regular14px400 (Regular)辅助说明
+
+ + +
+

📎 Figma 设计源文件:点击查看

+

生成日期:2026年2月1日

+
+
+ + + + diff --git a/iShare_Design/page_structure.json b/iShare_Design/page_structure.json new file mode 100644 index 0000000..475076a --- /dev/null +++ b/iShare_Design/page_structure.json @@ -0,0 +1,112 @@ +{ + "login_register": { + "name": "登录/注册模块", + "frames": [ + { + "id": "login_default", + "name": "登录_默认", + "desc": "默认登录页面,包含社交登录和账号密码登录" + }, + { + "id": "login_input", + "name": "登录_输入", + "desc": "输入状态的登录页面" + }, + { + "id": "register_default", + "name": "注册_默认", + "desc": "默认注册页面" + }, + { + "id": "register_input", + "name": "注册_输入", + "desc": "输入状态的注册页面" + }, + { + "id": "forgot_phone", + "name": "忘记密码_手机验证", + "desc": "通过手机验证找回密码" + }, + { + "id": "forgot_email", + "name": "忘记密码_邮箱验证", + "desc": "通过邮箱验证找回密码" + }, + { + "id": "set_password", + "name": "设置新密码", + "desc": "设置新密码页面" + } + ] + }, + "homepage": { + "name": "首页", + "frames": [ + { + "id": "home_login", + "name": "登录欢迎页", + "desc": "品牌落地页,引导用户登录" + } + ] + }, + "main": { + "name": "主页/服务列表", + "frames": [ + { + "id": "service_list", + "name": "服务列表", + "desc": "展示所有可购买的流媒体服务" + }, + { + "id": "service_detail", + "name": "服务详情", + "desc": "服务介绍、价格、权益" + }, + { + "id": "payment", + "name": "支付页面", + "desc": "订单确认和支付" + }, + { + "id": "faq", + "name": "常见问题", + "desc": "FAQ页面" + } + ] + }, + "plaza": { + "name": "广场/拼车", + "frames": [ + { + "id": "ticket_all", + "name": "车票_全部", + "desc": "所有可加入的合租车票" + }, + { + "id": "ticket_joined", + "name": "车票_已上车", + "desc": "已加入的合租列表" + } + ] + }, + "promotion": { + "name": "推广中心", + "frames": [ + { + "id": "invite", + "name": "邀请返现", + "desc": "推荐好友获得10%返现" + } + ] + }, + "style": { + "name": "设计规范", + "frames": [ + { + "id": "colors", + "name": "颜色系统", + "desc": "主题色和中性色规范" + } + ] + } +} \ No newline at end of file diff --git a/iShare_需求与设计文档.docx b/iShare_需求与设计文档.docx new file mode 100644 index 0000000000000000000000000000000000000000..d4da5b6cca4c79974f4c07483cb7e17d0e731df0 GIT binary patch literal 11646 zcmc(FWl&wq67I%>ySux)69}#$1PHEyjk^U2?ixI3aQEPD!C~WWL4v!>BPZva$i4Sf zy%RX#sqzUbQzwpkd-0jrvdlLi5?2`!>-=WvLq5 zS0bBzTBj19a&v5wN)SV!u{6C5Hr zMUw6xN3M_!Jzq%h+YXvR-7>F}vPVG{_Z8VZ+ZG7W#eVvMB!nhUNs zd`U4;(l%xoGebCzlvyId;itE>eQneheN}7 zD%TgT9@1HPXS8Gse#KhF8;Zu%dm0NcD~kd8P?Vd#CVT@HSU(h!rq&vc01676F#WfW zu_dKCLL0g+2b0kj5YPoJLLnt#OIyd^sP8>9_5e9C58V%Yt5n2y-uhy`Jo^A&i|{ zzqy%_o-@xYB=SznD!~b3gI5?oR9^uv>5CZE+bDSAydLq{XAhN0>z!fm6|b@Q29J>E zKB=*s(~v`c^vTQ^^#(S&L*pJu$m0{&mwu>=F$r3*Bg6p-hw)$8&G~D#fNHX8q)siK zowkV^l(d^ZM<|*&N+^Mj4$Ol+W+9+UY}*%1M{HS3a=Lp-qK36 zPrTJvgE50G!%ZD}^r1_U$E=f}Z*}BnP1UV&t56p&y#wYsqTO!r7Hv|ZdcjE$g!CQ_anvWECaO|RX~>PG@OR!%l1!ua@R4~dqGNB9q`%xxZxpx=62}$hLYVYS z1!AcaP`hZC;w8JEW)bVUfAO=LxH^VN+30)C=S6%6(JMc9_z}-=E-xM4w#n9f@wM8z zB{E9by^+>A7mga9VPM&q>nCtjZ9`;uqK#Rc0bwKa76gN`{;Jrz#t;eq$!~RM4YGp> z^xr%v1)0MyWlux>0syh^SJ}lclCZC%qJ;Jj^P|$xMBVz)mEER;JzeQGCF0I}_{Ksd z&`x$3WX^&ccTKk#Wh~QZ4bRd>Q4PZ1w!Xzh!)lcMVh;{;pdpjG9GwRO$t2j>IKAt2 z*a1t8pH8-#7_sVTC#D4&hz)ji4>C(~kjf)xwqLK`T$Lxp_D*GYamiQ)%^GtwLr-@P zW>lWbEX>|9E)_gJ0F_%kvL$s0`^RDW`={V!EWKuAGvZ1Q)iZf9-2D!lus8hl>|ul& zaKjBsmL3D|%vL&y9)t^esN;M+za6K=Xhu(Mj_JsFuu^OWI69$|gU-rYyBmvV2Ml|3 zteO=w&axBn*=AR2+Y@aPR+F&Of>kX!0s8MBh)+E=vn0=rHy}1d}%un_+%3@i2G` zQu3xP2Qo?E4F=bX@7T-ihtT8C_qQhsSd0mO+&LtY(Mc!07aXG=3X8Q+GKKp_+yI>{ zD!fAFA3>A3fo*mKOBCFoU8?we@(QNbX0+{ubw4Z=4w zJ%Tm2$?du|f{}qp0dUWOLR0V+2-f*))(E;voi9`C!$n?V-^^T|my(mENwuSFL!vpP zVK?Y~$q#P3jkr)#t%mi?_JhfUm$Ezhx>BGe5d03^^r)@FEvNq_DWy-cyH$` zcU8ifm_{ds0F2bg>=c(mj+R0wUTS?k-b|+9jG@?@;^kuor^==?D}2WAqR>vz!jko| z0?*MA>T$#uR@fbCQE+SVGg(T%LCjUh0JN&Ui6v1tF`u~iTccoywL*$4Gl{8 zpaNJ|7xWFRQ5`r@C>T^H(HFM)`FqY;L)17JJKHTBO<{_YeW=C^TO=I{K}uYz*#|m~ z4}?3r;@?uMQhd-^wCn^-XXz_GQ}x2n^zE=D0J6Ht+2Kxh8IoPY;;B-lq3|Ifp<{R? zqMZ3QqEXRgS~O6dH%SD;x{!9!k;p9kgXGH23|^(}jiKYAd(6B_!Q~Mt>|KRUz7nv0 znd{GqB_d};nDhnid_p-2SX6vL(|3S|;I+U&tyuC=G%NK)L^*j^jq65^OI<(sZ8C|e zk(ACNM}lc?UN0y%jrbkxM23Zv?D1=Rvo>FA*2bV_YR?H7&D5`Y=fNB}32twTG{~3j z7zrHcKiqsFqJgj;oe(-8nAnPqKm#@rH@jICw5os0Ad=Be?6LS_U1c{_On3&p+i$Hj zXf){$yFhe4d#}nhs2u(^8uiw&FCg_!lKOEBHZfw$cfpF}aT4b%lcdm>B&+zV{;M=} z6aI2m>@riZj}Z7UT)BGWktGGktT0?i7K80?focoRc1U~t>}RkPyL=Iy3KFgOVFDSY z4O$VC`$mqeAG!_EjH@OD3Jsk;HqYsu8wWI6x^t+QNzB0F?5&Cm0nc0xuJ8zn4XCrs z!F)%a{%Gu2Zw_;AveAC2yx^)m?=}cP8t-B4Tu#K|B4be))zefw>DxD7>IpE9K(F{P zR+Evr1dI2CitVE*5>yzqS=x9uq(8@FO0u**7z7r>da|FEbT+P2ZEJ)+KX_c%$H&eu zDf$`xD?~-4->Y%&LQ3L2^h-6O$gSLZqw>QUE^iZ2Bdnwb(cmNt9rno*_{04hbD_|N zBVa?6XKI48+H=CmlF)#LfFASd;%}dH#{DaoL!rG|5E|+xZFZ+h_@^9JCmp;4HoF$0 z?sh{c9o75dinDC^jhHp*XUF4mynv;;+KDWAo{`))&vsK?@<*&}GesQV0XfR`rD014 zvLU}sk{t-1;QN@_yV=|_r4x}%e9nehixIjN{+z?ubu?K5SDn*C~)rpF1xrfYg5jM;2%?{5vue6&0&D1hfk~A zA@k}ZM@1Phc48hZM9Dbh=CZQ!Vh8&wt7Xaqwi-(FO-8sN<#DLAB_+%mNUj_hAtB|- znbR|5))it{oOK4L*AuUUY3Toozc$f>!6Z-$swtciXix`Anv#_^4j4PJcLYLyRCT+v z?`AJ~-GauRwSA5-@j0WrS^CUK)NPhg5mA-zb`C=&??#}6Np7M3+9Rh5e%@%z)CTFC zY4^M@24ZLY42lPg*}wO#fl~(vVcd(fHhKbnN z%jaMZR~Fj|nbn(xL)fLQwts(=fwv>mFMCTm)?n2e@>Ns&<^L{gAnWl2(F>Dn;bMTGg@+&yK?6SzcCKv(WGEL{a z>0^DOrpj%)7PwMo4(Y;1Mt^ONiJy~~s|ff3lik>&EL`OWoX4(03gT(bcYU84KQqCN zR!r=<0+gNUL==`BC1ufhNIJDGKWU0JJglWqA$hFATTW4oB|?2L~*HtYAZ=_78y#`)~;AF}zpB;|)b*!2GKAfBDv5aKSDPrAIRCsw9f8xp7 z3d@0WuLlS5wUrgtatOL=;N)z5tzdi2cH4g>QX>XTi(XC&TaYn>UWM*D~dZIx)h>&<0n7n?a{4-@!J7Q1s<9a8k-H?KqCRg0h@13WwwP{W5uH z4ZF_H`sdjvZNr+ebAA@hg+#cIZCri3_*7eql7XWKIG*k}{NvQ;)!nWoB0D$GZppD~ zeOgdL(9V83TG^-9gcDsaRhDoeP@9+8>((Upug)t<>wSfFJFQ$=a`g zk-e$F%fHI0;ct&;fe?^gzc;uLln$Epgor4J0qH3yEDflMwu4KZhN=T-0y17-kutYM zO(s}GQfYP%KwMEC&3b4M&Qh?%0a&S$=W3_=|kNjgC(G^Q=@oSGHtrh5S% zLAoCG05&#gXoMuaPAz2}dCxnfsuGJZ(56pb5v_n@op|Tr})8Z@R1NK*Ix_5@>GXw5g_Y7)v&77>!f=|_Fop6U4lOC!+t@@+SYdO zWu3vMn0t2{VfgfwP;MZ}s_0lF=xg=%s=7|X zrxze+rCSfBfhnGtLKpelace=r@O9y1RydGb-+?f*39WmkpGx30b9x{84A~58Dc%yx z#Vfk{9qew@Lmii36 z36IFXw`-cwx6YNHdRn$<008no?HYRrR|{kN@BOT9wRz=v7LFXR++2_chdX!i>(Ep83(CDEiLN^;3r9cNQa~9)8@aGH$DO~>``=nrs;dM&D2fDEJNpMOWwtgVZ zFl7>WG!mt*v&B7guo~FiBm7D{n92NQIdY3ZTMr$#o7VKR_PZGN^U)ZKsv!r# zv<--K4chrL<~cLB93jJ9jg55zrou#`W9B*Aj?$>RU_|!2#K}a`-PSp4=@}%EkjvIk z%finK2;m;`^kN6iN8#-Q>r7l3w1oqGJUX=G=tsETZg8p|XwRtO%3WwsJEeLbElch= zq2jwGrwt}TWg4BbcCKN)F^4D_zbG#FdZM;ULxE)i!7whhd7yxCEEQ9e``a~Ws!ElK zo#IdhEzV?@jJ8lxC+EZ&NTsqU(A+z@m0MxQ*VJ2_j-{F2u;ee;Ql_!iKR5dPqG6jv zxKY{)Gpm*~V7)eE)jbF2rr^9G0g-<_pKIgAzIzeQK`zezQ%_2i_2!0mbM58BI=9!q z-O~STQNuoMzo$m2lAX29pWWxOCXsnAFaW?8{6|yu-)V-{cE;cLX-gF6ArpQF{z#+@-a9?K=hB}gV>ai@3ZcAS-(iu3z5$=q{ z5wc9fIyQw0lt`;^#&ux}#JVr1X!OtI%G+$1<@QZqNan0$fgT#1P@Y9(LP7Dl$g%m1 zSOD_w7GcEfp3~u8U>$tQv&nYWiO`#Ne8Y`9I+MOqc0J$AVn*lKN{bXU<)gL$2H!K5 zqrmx!#LV4xmbu(mXmCAO4Xx|+!KZP^ZJ}NDLN_?Z8z=JIcH0;K1=@gW;Fv<+*4GV3 zRq6%v{j!-mOX0dd*2jBP(Bz7N^g(e-SlR9{q71alZ`^Mp9K67 z1ps*RhCe#jR*sei#&$p}lkZaAS09L&W5KwO`=Xo>#RCZ~{sFg!P+oj8LFERFidAnl zfq)v?l$*jZlQFjIMU&E|q0KVg9Hd#vg0f;N4Cm&v; zWYKRZl8YX`4^a=|TSI|uOo>Aac(#nfEi?ZG0Nl<~o5ig2lk|4=VH+yUw`wPH(fis+siW74pl!srECKHjJMZ^z8U| zn4*G}z0k*<{E9ftO2|yfCBpkjV%6@G)XCIbeht|44JZW<#sC^$8_m=naY%c(BBxr2 zQWpwB%{G^JsnX3h=4FUuI8Tpr&9~{xvh$nWI*lBc2B!q#Si)zDVM9!kD;>2m9lUE* zmC~2cY3Gj9!&bpH%tUFDcL|2wog}6iOTwWy*1{354?CYjoHxf45P0!eWC)q|^|2b@ z=O5O7{R-JkRqHew^I`lld0{T}bAGF-op~VROW|iojWq|up;x_IphxcXff3%iw=JLism zUa$8HUMUO0{H}+#CriuJ&b1G!bvKCr*z|w;7w9LO{%=QH#91-%n@|56ezN`VXJ9|( z{5Z*q8To#a75M!mi+^7AMK+LGd0RePNJQ$bv+ocw)vFR~Ynl+%ojI|{q`S=lZZWJP zv6%w3wY66hES4Hd7?yTI7kFv4yM2Vk@uAdnxCOy%S6V8T!Q!1HF^8z3gfxkuY`Kah zhhX1mx35H170kKRDK-0yCyLN1Y?D2}mGF-~b1fzfeyI(^nr>1~#5Da$)Si@dvo?yK zRv9bAF5g(uVI4IM?b&^7rS29nNI~`GVwGo`w!%`}(9CZTn6l%g>has0)O?>J+8P)D0R2fEnqt;g4o}B> zx+<mWrgiF$B1v=kWwu-ECpKfr=$-qJx?+VZLVh}--Ph8G=2;Z1 zFBwuF*aFAgpvB)eY;^e_AAbbPIwlD$>ri=Q#f{H-nemb{o)T(!fQk+OjF9_VVg{92 z`o1?e2M*%nv1@0BhX@qwiQRm|44Eokty_{L?zWD`0VA5W1?}!GQVcmr64BQAJ>~`T z?GPCa0*iqmviBg8Fw)f*Q;cAjLHHsnw7Je=%^lVuQp*p}9#Mj|L=K?R3j1ew&F^M3 zT}DwT$#}C{!sk0W4+Kz-)t0Bq#-5YYRKsoump_Lgg5r)j#k-NH2;e4taZ8-$0sgxN z)m`VwVxBbj_38Pp!JpC6(cZz@^1B98ho8fBu%P&_7RAoat6-Dm0J+!Z#2tx2Kz!4; zqEw6*7ZQ-jD<{XDz2*%Gx*>>JJXDCil|JBoCo86)qiyRzc#IeX#JBpQi2QI4miCbZ zEL4HYM(VOyY@&Q^YDeLeJ+xe*-?3IVyq^;hrHU`K3!CM z#>`uO-}J$xHE^%s;@^Gy!wA>zQs+KAvHpEuK82&7OVGEm`JI2iJ*>~^AePC>^uU6M z7;a0OsY9YFVX&Y?rtF4!xnwF*NpVVLdXyz(+P|`mXPXi<`_s>=0S0$ercIzUp&eF` zj$!)CW{R(MC!+7~*0;)g*9s2)Sis2YR!7IvE=qawI{yaKx7OAUR@M$bN{h+ZcB^#~ zlmOlCwKP4+eKX_kZ~8^0Zbiw9Fd2}&`E4X^7n}Re7U(JasxRkK+*o@CABTj)^gS*m zi;B^QWmzz3<9Yl1R?9!U)s0?mCBj?gUz3v zyd4I7+@oazASzF-B@tAz9dpBi#MwBc`umg!BH)~*m!$2Gn0M59Zsqw-4Rg2>?vFK5#iJ4%bW^3rZH419mx5v*7C_z-#tBqPtRYsEq=t3 z-}L@hV37}djs#AMAYLZg;2gpf#@ab(g`{@|KvX3`@>entXkpNPXu5o8@;tQ?THwI6 zwMk*X!O~5W_VMlY;MdaA-o!tg2+U-C%}I{xi1MyX?ZtUC`!^N30g^Hh+c~Rdo6Li} z_p#AF?))Rn$_d2pe9}b3uVg$~rv1~Ekbf^I*c&@IJSBO5)x0@RhPm*=Fk3N=hfM$MsQw#_)!3%0uS>zhbaJmGh+;{RkqnFO-NG+H zG&4+54<)i^Q{{&6A;<~mD?)7|18@S}Eh*wtgTu>ISl6(GxTuodv{*WuS}E$IbyS{e zz%GCAQx+*a%97T4k5FBunHm`>M(zj&I;$qJt=V^(A|Q@|fJ&HG6?k$g7JTfA z!H$6C+Cu|)ySks$+4JldbsAb* ze!r3PL!A?gc55U!&?}m@JZdrOueisnsZ;mQT;}03-gj`^A!Lj->MB!8C!{L)NbXQ9 ze@K{a>l~Nn2qou?r+?$?9_I}er;f^W$?4*C+q~f8?fK_hK$lZz!FC{&H9DysBt zuLA<4dZhxfnNmtpo%qswPsYX~_BDU)$)#w`ysaE5YyLSGL**TkK|oj*^(g+eg%N~T zyCni9tWsJ#S!BVvMWLT|;j;!=ANNA3xoqjjH(E(lm=zA`R3(PMk5uAiAKFl}IpQAH z6mY#$9)TB1B&V*UvdHFNuVAd}_}{V9L-^L+$w__9b9-LgXR%5ICvI9r_539#56&Cy zt%Q4b?B<3+UEvPDq{@eZFI63ZR{UNi1bA~-OtIBr=JV4@h1a1BB)#cawixntWs}!k z`ye{8hL*}Q>p2>^l5;{K-9myk+T*hO(9M`T6V?%`J95G?MY-Uk`y|rfBkR?pm25MK zjZJjqC;$ekk^$dw8*0~qi_ z9dz>LM^d}<$(vg($(wK-M}2#&$8`b?OX5zk65}2}m+o8YKd@xezK{G_HUEf?zq*<~ zE@S;zgs(5TrB=%-wH_S>K0!!;Jtp;z^zN z7d17mhS{}f3KkfEd(i8khnuQ-y-7HU8y4xI1Gyd(l!iAC%FxysW5RL3SHk@?!CKb{ z1G@2IdwAUN}-tIhWtE z&5VL$H~znbmtREs|3m3u;241aeeLim7Cw#dS={&W_a(&t4f$Sz{TSaNh*`M$~`#nG5%s79u{9E_u zC;mUV{$5-E7~i>u!2hR;{)zd)@}IT#KPUiz`d`d{RnMPQ=}#cnlL!1SHR_*V{