From 4f00b1bd824508a2eed620788998149db49e246e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B8=85?= <6581896+oncream@user.noreply.gitee.com> Date: Thu, 3 Apr 2025 17:54:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(1.0.2):=E4=BF=AE=E5=A4=8D=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=82=B9=E5=87=BB=E9=94=99=E4=B9=B1=EF=BC=9B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=A6=81=E6=AD=A2=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/application/article/service.go | 57 ++++++++++-------- internal/application/auth/captcha_service.go | 12 ++++ internal/application/column/service.go | 18 ------ internal/application/user/service.go | 32 +++++++++- internal/domain/user/repository.go | 2 +- .../persistence/auth/auth_repo.go | 7 +++ .../persistence/user/user_repo.go | 8 +-- internal/interfaces/auth/auth_handler.go | 57 ------------------ internal/interfaces/user/user_handler.go | 2 +- ui/src/app/app.component.ts | 2 +- .../app/home/article-buy/article-buy.page.ts | 14 +++-- .../article-detail/article-detail.page.html | 14 ++++- .../article-detail/article-detail.page.scss | 13 ++++ .../article-detail/article-detail.page.ts | 38 +++++++++++- .../article-content.component.html | 18 +++--- .../article-content.component.ts | 57 ++++++++++++------ .../home-icons/home-icons.component.html | 6 +- ui/src/app/mine/mine.page.html | 6 ++ ui/src/app/mine/mine.page.scss | 32 ++++++++-- ui/src/app/mine/mine.page.ts | 1 - ui/src/assets/ewm.png | Bin 18827 -> 11563 bytes 21 files changed, 244 insertions(+), 152 deletions(-) diff --git a/internal/application/article/service.go b/internal/application/article/service.go index 34199b6..6d71535 100644 --- a/internal/application/article/service.go +++ b/internal/application/article/service.go @@ -84,35 +84,37 @@ func (a *ArticleService) Find(ePhone string, page *page.Page, searchParams map[s if err != nil { a.log.Error(err) } - columnData, err := a.purchaseRepo.FindColumnsByUserId(user.Id) - columnMap := make(map[uint64]struct{}) - if len(columnData) != 0 { - for _, v := range columnData { - columnMap[v.ContentId] = struct{}{} + if user != nil { + columnData, err := a.purchaseRepo.FindColumnsByUserId(user.Id) + columnMap := make(map[uint64]struct{}) + if len(columnData) != 0 { + for _, v := range columnData { + columnMap[v.ContentId] = struct{}{} + } } - } - articleIds := make([]uint64, 0, len(articles)) - for _, v := range articles { - _, has := columnMap[v.Type] - if has { - purchaseId[v.Id] = struct{}{} - } else { - articleIds = append(articleIds, v.Id) + articleIds := make([]uint64, 0, len(articles)) + for _, v := range articles { + _, has := columnMap[v.Type] + if has { + purchaseId[v.Id] = struct{}{} + } else { + articleIds = append(articleIds, v.Id) + } } - } - purchaseData, err := a.purchaseRepo.FindArticleById(user.Id, articleIds...) - articleIds = nil - if err != nil { - a.log.Error(err.Error()) - } - if purchaseData != nil { - for _, v := range purchaseData { - purchaseId[v.ContentId] = struct{}{} + purchaseData, err := a.purchaseRepo.FindArticleById(user.Id, articleIds...) + articleIds = nil + if err != nil { + a.log.Error(err.Error()) + } + if purchaseData != nil { + for _, v := range purchaseData { + purchaseId[v.ContentId] = struct{}{} + } } - } - articleIds = nil + articleIds = nil + } } @@ -152,6 +154,9 @@ func (a *ArticleService) FindUnLock(ePhone string, page *page.Page, searchParams a.log.Error(err) return err } + if user == nil { + return errors.New("未找到用户") + } conds := make([]builder.Cond, 0) class := searchParams["search_eq_class"] if class != "" { @@ -251,6 +256,10 @@ func (a *ArticleService) Detail(userPhone string, id uint64) (*ArticleDto, error return nil, err } + if user == nil { + return nil, errors.New("未找到用户") + } + p, err := a.purchaseRepo.FindByUserIdAndContent(user.Id, id, purchase.ContentTypeArticle) if err != nil { a.log.Error(err) diff --git a/internal/application/auth/captcha_service.go b/internal/application/auth/captcha_service.go index 59d3446..addadda 100644 --- a/internal/application/auth/captcha_service.go +++ b/internal/application/auth/captcha_service.go @@ -234,6 +234,18 @@ func (c *CaptchaService) GenerateSmsCaptcha(username string, phone string) (*Sms return nil, errors.New("手机号不能为空") } + user, err := c.userService.GetUserInfoByPhone(phone) + if err != nil { + c.log.Error(err) + return nil, err + } + + if user != nil { + if user.Status == 0 { + return nil, errors.New("您当前暂时不能登录,请联系管理员!") + } + } + // 1. 验证手机号格式 if err := c.VerifyPhoneValid(phone); err != nil { return nil, err diff --git a/internal/application/column/service.go b/internal/application/column/service.go index 1ed63d7..9ec8897 100644 --- a/internal/application/column/service.go +++ b/internal/application/column/service.go @@ -80,24 +80,6 @@ func (s *Service) GetColumn(ePhone string, name string) (*ColumnDto, error) { Unlock: unlock, CreatedAt: time.Time{}, } - if ePhone == "" { - return columnDto, nil - } - userData, err := s.userRepo.FindByPhone(ePhone) - if err != nil { - s.log.Error(err.Error()) - return columnDto, nil - } - purchaseData, err := s.purchaseRepo.FindColumnById(userData.Id, col.ID) - if err != nil { - s.log.Error(err) - return columnDto, nil - } - if len(purchaseData) != 0 { - if purchaseData[0].ContentId == col.ID { - columnDto.Unlock = true - } - } return columnDto, nil } diff --git a/internal/application/user/service.go b/internal/application/user/service.go index a7f9612..685e01a 100644 --- a/internal/application/user/service.go +++ b/internal/application/user/service.go @@ -102,16 +102,46 @@ func (u *UserService) FindLoginUser(username string) (*UserDto, error) { }, nil } -func (u *UserService) GetUserProfileByPhone(ePhone string) (*UserDto, error) { +func (u *UserService) GetUserProfileByePhone(ePhone string) (*UserDto, error) { user, err := u.repo.FindByPhone(ePhone) if err != nil { u.log.Error(err) return nil, err } + if user == nil { + return nil, errors.New("未找到用户") + } p, err := u.phoneEncryption.StringPhone(user.Phone) if err != nil { u.log.Error(err) + return nil, err + } + return &UserDto{ + Uid: user.Id, + Username: user.Username, + Phone: p, + Password: user.Password != "", + Status: user.Status, + GiftCount: user.GiftCount, + }, nil +} + +func (u *UserService) GetUserInfoByPhone(phone string) (*UserDto, error) { + ePhone, err := u.phoneEncryption.Encrypt(phone) + if err != nil { + u.log.Error(err) + return nil, err + } + p, _ := u.phoneEncryption.StringPhone(ePhone) + user, err := u.repo.FindByPhone(ePhone) + if err != nil { + u.log.Error(err) + return nil, err + } + if user == nil { + return nil, nil } + return &UserDto{ Uid: user.Id, Username: user.Username, diff --git a/internal/domain/user/repository.go b/internal/domain/user/repository.go index 9de983f..d57097f 100644 --- a/internal/domain/user/repository.go +++ b/internal/domain/user/repository.go @@ -26,7 +26,7 @@ type UserRepository interface { FindByID(id uint64) (*User, error) // FindByPhone 根据手机号查找用户 - FindByPhone(phone string) (*User, error) + FindByPhone(ePhone string) (*User, error) // FindAll 查询用户列表 FindAll(page *page.Page, conds []builder.Cond) error diff --git a/internal/infrastructure/persistence/auth/auth_repo.go b/internal/infrastructure/persistence/auth/auth_repo.go index 4861acc..7ed8b71 100644 --- a/internal/infrastructure/persistence/auth/auth_repo.go +++ b/internal/infrastructure/persistence/auth/auth_repo.go @@ -7,6 +7,7 @@ import ( "cls/pkg/logger" "cls/pkg/xorm_engine" "errors" + "fmt" "xorm.io/builder" ) @@ -63,11 +64,17 @@ func (a AuthRepositoryORM) LoginByCaptcha(phone string) (string, error) { //注册用户 u.Phone = phone u.GiftCount = 2 + u.Status = 1 _, err = a.engine.Insert(u) if err != nil { a.log.Error(err) } } + + if u.Status == 0 { + return "", errors.New(fmt.Sprintf("用户【%d】禁止登录", u.Id)) + } + token, err := a.auth.GenerateUserToken(phone) if err != nil { a.log.Error(err) diff --git a/internal/infrastructure/persistence/user/user_repo.go b/internal/infrastructure/persistence/user/user_repo.go index 8893458..e396231 100644 --- a/internal/infrastructure/persistence/user/user_repo.go +++ b/internal/infrastructure/persistence/user/user_repo.go @@ -10,7 +10,7 @@ import ( "xorm.io/builder" ) -//UserRepositoryORM ORM 实现UserRepository 持久化数据 +// UserRepositoryORM ORM 实现UserRepository 持久化数据 type UserRepositoryORM struct { engine *xorm_engine.Engine log logger.Logger @@ -68,14 +68,14 @@ func (u *UserRepositoryORM) FindByID(id uint64) (*domainUser.User, error) { return user, nil } -func (u *UserRepositoryORM) FindByPhone(phone string) (*domainUser.User, error) { +func (u *UserRepositoryORM) FindByPhone(ePhone string) (*domainUser.User, error) { user := &domainUser.User{} - exist, err := u.engine.Where(builder.Eq{"phone": phone}).Get(user) + exist, err := u.engine.Where(builder.Eq{"phone": ePhone}).Get(user) if err != nil { return nil, err } if !exist { - return nil, errors.New("用户不存在") + return nil, nil } return user, nil diff --git a/internal/interfaces/auth/auth_handler.go b/internal/interfaces/auth/auth_handler.go index 0861e0e..a6ae788 100644 --- a/internal/interfaces/auth/auth_handler.go +++ b/internal/interfaces/auth/auth_handler.go @@ -9,8 +9,6 @@ import ( jwt "github.com/appleboy/gin-jwt/v2" "github.com/gin-gonic/gin" "net/http" - - auth_middleware "cls/internal/infrastructure/middleware/auth" ) type AuthHandler struct { @@ -97,32 +95,6 @@ func (h *AuthHandler) GetImageCaptcha(c *gin.Context) { c.JSON(http.StatusOK, captcha) } -// VerifySmsCaptcha 验证短信验证码 -func (h *AuthHandler) VerifySmsCaptcha(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"message": "验证成功"}) -} - -func (h *AuthHandler) VerifyImageCaptcha(c *gin.Context) { - var req struct { - Token string `json:"token" binding:"required"` - X int `json:"x" binding:"required"` - } - - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "参数不完整"}) - return - } - - // 1. 先验证图片验证码 - if b, err := h.captchaService.VerifySlide(req.Token, req.X); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "图片验证码错误"}) - return - } else { - c.JSON(http.StatusOK, b) - } - -} - func (h *AuthHandler) LoginCaptcha(c *gin.Context) { var req struct { Phone string `json:"phone" binding:"required"` @@ -194,34 +166,5 @@ func (h *AuthHandler) RegisterRouters(app gin.IRouter) { auth.POST("/login-password", h.LoginPassword) auth.POST("/image-captcha", h.GetImageCaptcha) auth.POST("/sms-captcha", h.GetSmsCaptcha) - auth.POST("/verify-image", h.VerifyImageCaptcha) - auth.POST("/verify-sms", h.VerifySmsCaptcha) - auth.POST("/decode-token", h.DecodeToken) } } - -// DecodeToken 解析 token 并返回原始的加密手机号 -func (h *AuthHandler) DecodeToken(c *gin.Context) { - var req struct { - Token string `json:"token" binding:"required"` - } - - if err := c.ShouldBindJSON(&req); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": "参数不完整"}) - return - } - - // 通过 auth 模块获取密钥 - secretKey := h.service.GetJWTSecretKey() - - // 调用 DecodeTokenStatic 方法解析 token - encryptedPhone, err := auth_middleware.DecodeTokenStatic(req.Token, []byte(secretKey)) - if err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - c.JSON(http.StatusOK, gin.H{ - "encryptedPhone": encryptedPhone, - }) -} diff --git a/internal/interfaces/user/user_handler.go b/internal/interfaces/user/user_handler.go index c20937f..17fa93e 100644 --- a/internal/interfaces/user/user_handler.go +++ b/internal/interfaces/user/user_handler.go @@ -105,7 +105,7 @@ func (u *UserHandler) getProfile(c *gin.Context) { c.AbortWithStatus(http.StatusInternalServerError) return } - userInfo, err := u.service.GetUserProfileByPhone(ePhone) + userInfo, err := u.service.GetUserProfileByePhone(ePhone) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 816fcfb..622bea3 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -23,6 +23,6 @@ export class AppComponent implements OnInit { private shouldShowTabs(url: string): boolean { // 在首页和我的页面显示底部导航栏 - return url === '/home' || url === '/mine' || url === '/mine/login'; + return url=== '/' || url === '/home' || url === '/mine' || url === '/mine/login'; } } diff --git a/ui/src/app/home/article-buy/article-buy.page.ts b/ui/src/app/home/article-buy/article-buy.page.ts index 187bd5c..aab97a1 100644 --- a/ui/src/app/home/article-buy/article-buy.page.ts +++ b/ui/src/app/home/article-buy/article-buy.page.ts @@ -45,12 +45,14 @@ export class ArticleBuyPage implements OnInit { } loadCoupons(){ this.homeService.getCouponList().subscribe(res=>{ - res.forEach(res=>{ - if(this.getDiscountPrice(this.price.amount,this.price.discount) > res.minAmount){ - res.canUse = true - } - }) - this.coupons = res; + if(res) { + res.forEach(res=>{ + if(this.getDiscountPrice(this.price.amount,this.price.discount) > res.minAmount){ + res.canUse = true + } + }) + this.coupons = res; + } }) } getDiscountPrice(originalPrice: number,discount:number): number { diff --git a/ui/src/app/home/article-detail/article-detail.page.html b/ui/src/app/home/article-detail/article-detail.page.html index 0dc85b2..3d30e26 100644 --- a/ui/src/app/home/article-detail/article-detail.page.html +++ b/ui/src/app/home/article-detail/article-detail.page.html @@ -29,7 +29,19 @@
相关个股: - {{ article?.stocks != '' ? article?.stocks : '暂无' }} + + + + {{stock.trim()}} + + {{formatChange(stockChanges[stock.trim()])}} + + , + + + 暂无 +
路诚声明: diff --git a/ui/src/app/home/article-detail/article-detail.page.scss b/ui/src/app/home/article-detail/article-detail.page.scss index 0cc7e49..3d897b8 100644 --- a/ui/src/app/home/article-detail/article-detail.page.scss +++ b/ui/src/app/home/article-detail/article-detail.page.scss @@ -76,6 +76,19 @@ ion-back-button { font-size: 12px; color: #1D1E22; font-weight: 500; + + .change { + margin-left: 4px; + font-weight: 500; + + &.up { + color: #F93034; + } + + &.down { + color: #07A50B; + } + } } } diff --git a/ui/src/app/home/article-detail/article-detail.page.ts b/ui/src/app/home/article-detail/article-detail.page.ts index efef111..e0cb48b 100644 --- a/ui/src/app/home/article-detail/article-detail.page.ts +++ b/ui/src/app/home/article-detail/article-detail.page.ts @@ -4,7 +4,7 @@ import { Router } from '@angular/router'; import { ModalController } from '@ionic/angular'; import { Article } from "../../shared/model/article"; import {ImagePreviewComponent} from "./image-preview/image-preview.component"; - +import { HttpClient } from '@angular/common/http'; @Component({ selector: 'app-article-detail', @@ -15,11 +15,13 @@ import {ImagePreviewComponent} from "./image-preview/image-preview.component"; export class ArticleDetailPage implements OnInit, AfterViewInit { article?: Article; weekday = ""; + stockChanges: { [key: string]: number } = {}; constructor( private navCtrl: NavController, private router: Router, - private modalCtrl: ModalController + private modalCtrl: ModalController, + private http: HttpClient ) { // 获取导航传递的数据 const navigation = this.router.getCurrentNavigation(); @@ -27,6 +29,7 @@ export class ArticleDetailPage implements OnInit, AfterViewInit { if (article) { this.article = article; this.addWeekday(); + this.getStockChanges(); } } @@ -85,4 +88,35 @@ export class ArticleDetailPage implements OnInit, AfterViewInit { modal.present(); }); } + + private getStockChanges() { + if (!this.article?.stocks) return; + + const stockCodes = this.article.stocks.split(',').map(code => code.trim()); + + stockCodes.forEach(code => { + if (code) { + // 调用接口时使用纯数字代码 + const numericCode = code.replace(/^(sz|sh)/, ''); + this.http.get(`http://api.mairui.club/hsrl/ssjy/${numericCode}/13988152-0AB6-41A9-B2CC-DC9B50250113`) + .subscribe((data: any) => { + if (data && data.pc) { + this.stockChanges[code] = data.pc; + } + }); + } + }); + } + + getStockChangeClass(code: string): string { + const change = this.stockChanges[code]; + if (change > 0) return 'up'; + if (change < 0) return 'down'; + return ''; + } + + formatChange(change: number): string { + if (change > 0) return `+${change}%`; + return `${change}%`; + } } diff --git a/ui/src/app/home/component/article-content/article-content.component.html b/ui/src/app/home/component/article-content/article-content.component.html index db1fb49..7668a8d 100644 --- a/ui/src/app/home/component/article-content/article-content.component.html +++ b/ui/src/app/home/component/article-content/article-content.component.html @@ -1,12 +1,12 @@ - + 最新 - - 已解锁 + + 已解锁 - - 免费试读 + + 免费试读 @@ -22,9 +22,13 @@

请登录后查看

- - + + +
+ +

暂无已解锁文章

+
diff --git a/ui/src/app/home/component/article-content/article-content.component.ts b/ui/src/app/home/component/article-content/article-content.component.ts index 540bd10..706e7a5 100644 --- a/ui/src/app/home/component/article-content/article-content.component.ts +++ b/ui/src/app/home/component/article-content/article-content.component.ts @@ -5,6 +5,7 @@ import {HomeService} from "../../home.service"; import {getGiftCount, getUser} from "../../../mine/mine.service"; import {Subject, Subscription} from "rxjs"; import {NavigationEnd, Router} from "@angular/router"; +import {takeUntil} from "rxjs/operators"; @Component({ selector: 'app-article-content', @@ -18,11 +19,13 @@ export class ArticleContentComponent implements OnInit { size: 10, search_eq_class:"" }; - hasMore: boolean = true; + hasMore: boolean = false; @Input() className:string = "" username:string = "" data:Article[] = [] currentSelect = "new" + selectBtn:string = "new" + private destroy$ = new Subject(); constructor(private homeService:HomeService, private cdr:ChangeDetectorRef) { } @@ -32,13 +35,21 @@ export class ArticleContentComponent implements OnInit { this.getUsername(); } ionChange(e:any){ + } + select(v:string) { + if(v==this.selectBtn){ + return + } + this.hasMore = false; + this.selectBtn = v this.searchParams['page'] = 0 this.data = [] - this.currentSelect = e.detail.value + this.destroy$.next() this.getData() } getData() { + switch (this.currentSelect){ case "new": return this.getNewData() @@ -60,12 +71,14 @@ export class ArticleContentComponent implements OnInit { } getNewData() { - this.homeService.list(this.searchParams).subscribe(res=>{ - if(res.items.length > 0) { - this.data = this.data.concat(res.items) - this.searchParams['page'] = this.searchParams['page']+1; - this.hasMore = res.items.length === this.searchParams['size']; - this.cdr.detectChanges(); + this.homeService.list(this.searchParams).pipe(takeUntil(this.destroy$)).subscribe(res=>{ + if(res.items){ + if(res.items.length > 0) { + this.data = this.data.concat(res.items) + this.searchParams['page'] = this.searchParams['page']+1; + this.hasMore = res.items.length === this.searchParams['size']; + this.cdr.detectChanges(); + } } }) } @@ -75,24 +88,28 @@ export class ArticleContentComponent implements OnInit { if(this.className != "") { this.searchParams['search_eq_class'] = this.className } - this.homeService.unlockList(this.searchParams).subscribe(res=>{ - if(res.items.length > 0) { - this.data = this.data.concat(res.items) - this.searchParams['page'] = this.searchParams['page']+1; - this.hasMore = res.items.length === this.searchParams['size']; - this.cdr.detectChanges(); + this.homeService.unlockList(this.searchParams).pipe(takeUntil(this.destroy$)).subscribe(res=>{ + if(res.items) { + if(res.items.length > 0) { + this.data = this.data.concat(res.items) + this.searchParams['page'] = this.searchParams['page']+1; + this.hasMore = res.items.length === this.searchParams['size']; + this.cdr.detectChanges(); + } } }) } } getFreeData() { - this.homeService.freeList(this.searchParams).subscribe(res=>{ - if(res.items.length > 0) { - this.data = this.data.concat(res.items) - this.searchParams['page'] = this.searchParams['page']+1; - this.hasMore = res.items.length === this.searchParams['size']; - this.cdr.detectChanges(); + this.homeService.freeList(this.searchParams).pipe(takeUntil(this.destroy$)).subscribe(res=>{ + if(res.items) { + if(res.items.length > 0) { + this.data = this.data.concat(res.items) + this.searchParams['page'] = this.searchParams['page']+1; + this.hasMore = res.items.length === this.searchParams['size']; + this.cdr.detectChanges(); + } } }) } diff --git a/ui/src/app/home/component/home-icons/home-icons.component.html b/ui/src/app/home/component/home-icons/home-icons.component.html index 9162816..d29fc25 100644 --- a/ui/src/app/home/component/home-icons/home-icons.component.html +++ b/ui/src/app/home/component/home-icons/home-icons.component.html @@ -4,13 +4,13 @@
- +
- +
- {{icon.name}} + {{icon.name}}
diff --git a/ui/src/app/mine/mine.page.html b/ui/src/app/mine/mine.page.html index 4b2d89f..6b66e70 100644 --- a/ui/src/app/mine/mine.page.html +++ b/ui/src/app/mine/mine.page.html @@ -17,6 +17,12 @@ 我的优惠券 +
+ +

暂无优惠券

+
+ +
diff --git a/ui/src/app/mine/mine.page.scss b/ui/src/app/mine/mine.page.scss index 6429eef..fc21237 100644 --- a/ui/src/app/mine/mine.page.scss +++ b/ui/src/app/mine/mine.page.scss @@ -111,7 +111,7 @@ ion-segment { --padding-start: 16px; --inner-padding-end: 16px; --background: transparent; - + ion-label { h2 { font-size: 16px; @@ -192,7 +192,7 @@ ion-item.image-captcha-item { color: #ff4d4f; display: flex; align-items: baseline; - + .symbol { font-size: 14px; } @@ -241,14 +241,36 @@ ion-footer { --padding-bottom: 8px; --border-top:none; // --background: #fff; - + } - + .logout-button { padding: 0 16px; - + ion-button { margin: 0; } } } + + +.empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + text-align: center; + + ion-icon { + font-size: 48px; + color: #999; + margin-bottom: 16px; + } + + p { + color: #999; + font-size: 14px; + margin: 0; + } +} diff --git a/ui/src/app/mine/mine.page.ts b/ui/src/app/mine/mine.page.ts index c3bbe2f..a0682be 100644 --- a/ui/src/app/mine/mine.page.ts +++ b/ui/src/app/mine/mine.page.ts @@ -60,7 +60,6 @@ export class MinePage implements OnInit, OnDestroy { checkLoginStatus() { getUser().subscribe(res=>{ - console.log(res) if(res.username == "") { this.isLoggedIn = false; this.navCtrl.navigateForward("/mine/login") diff --git a/ui/src/assets/ewm.png b/ui/src/assets/ewm.png index c193e932e2d45c8003fe74068017c4a1090e0637..39c8e870033e2eb2fc5e3763fdefc184bfdb2fce 100644 GIT binary patch literal 11563 zcma)iXH*kiw006gmm)}!js=w7qz6J#T1b#02vQWKNmE)VfzU+h3P^`2V2DUliqeaK zfItYLOOqZzLhtb9y}!O+cimZQX4cG_HT#@hpY!bV#ssd%#K6M<005W_^mR=scQoaE zO-DnyN_)(IqTGN!rh3|dvVOi*$^+P0%UBBls7zu!eN0VxruWu==mP*SxBqtnyS$2@ z0ss;%2D)12NV|ST$oK3eY>90)G$Gt$Zk&rxciJ|^5WPye>t1#eV8J3Q>t4854R;5t8$6(2wTj00#m?e1Z{LVnTmNkGP zd-;wX`$>7&+4IQIgZi1q!Tggy%bs`#k?pGk$WHJ5Z~2Wy_7}&awGB|D{r=bV>W~o4 zvsJ{w07NK?%i8LcCGeNd#9t%c_P~ChygBa}wLj#)T+K-3j@xkAoE2SBw}{&pyI9RL z^3-N%z{SL;Ift8o7**njSMz+!${v`KzxR`Zhzan0Q1Y7^eAwx{U`+GrqICPR#=(y{ zEtViWxj&%E=Wuf7d}M_()tQ)p=98&}bBZp`0X(xzUdVRx_b!O%Aw}jGr`56A%n`ho zG3wyC{fTvN*8xSYYvg%S*l7W3G;b4kvEdaK{CuZf@SIG3U)%5ux$Y=9S=GyEM~+aO zvp?TXw>efB2<#_QKByQr_Bs0((ENNaQ)e$;3p~pjqx`dCK;tC7e~Ry42j4I3U_yi)#^an+*77Ue+}MrN%8K_lN@#ZlbB z(b+cE)-AwDX3b;Lx?R?3q)i_7J>o^TpX_O#bPD z=*AAk!@aVfy4kC(XxMMXT2`HZ-NR*j|56h05Idm!qRut4Dn%nw7AQmGk=W--md`(e z%~J>K0wm%$U6Gf(0_rF4*x?z`Zz3o&;L74@{O4Cb$vJA~x2!hvBk-JKTUX<#8{yeM znLWMxDM1y#`7*s;p|1PKV1g%+ARRKtI0?32xW+X;c6nCx`}TjcU>OKmlDDxwS~#hy zSXS;*u?|iO{O!n-G={kV72POjJCik@cO{e70OL!I8{e!nvL(^*{;=bF5|Ba)IVnzte%ivStm!>y#ShCsZ!n}7cGpF@h7 z9CEEhg_w8CxvKbbztZP->h6A>)l-`ov{u8aO|8CS&m%{*(`p{JCUh*C{laD$XH;!> zAGm%P#zLHElS)NCybYZg%2Rx_{Vv`8Y_V93%Jtr2d<@i4KYv(2zDvkt#^(8GCD*iQD0dleoB+x0@N*(7xN|7KrVtvV!1vz&Elp1+X4 zi45F5OdI~xaY9L8Gslug+5^x)=1TfQYDNB~FC7@$!!3t&;p~unS2JvH6}t@q+e;l(<+j{~WnG zCm1E_dlHIboL;j#aPymd8#VgZjuMlCaEeGJ-T_~nO|k)hXFK+7)5LID%{%t*r7!?c zd2+megy`zxnB0LpY!{ps$))1Vl2iK8ZOn6KyBRbJBqc8)@ZjIAKPVYi@$s?ewkw9n zUY8s5@`F6p%0TG;HzgPFteEAGo{G(;6GiNvHdmcVNj4Quuu}(+TEAaiKDG4XQcWYx ztg+b%=PxsD;~mV}HPFllYW80r%5)-++kX_0{)>m|pk2sO^Z8!6O-6ot6Q6H%Y$qqfWXw)rk+xUX_llvkqiYB`QHLl-0X1Qc`Z% zb`tftiK0?k4u#7wsHPX>h9J%UYnrhyDJvYUsWcVbHQxVK)5#A#l#Dz)*UA#=y|Xm_ ztY##oO6uuXbyNhzpONn;!`x+>5vOA%T4ZX0q-S8SO--E-h@QUe_z!}W^Sxq?^+Bs4 zKs^@=*>KI4w27@j;x$xrzknQG7{e2Wc^|E4h))$J4njQ4gNt^qo7VawpJz86`1&0Q zz_K;WlvFi#Cq%yZS>iRHk->E60tfxL_`W$O7ta#u8XIbdk_shYR3tqeQ_!}tp;S~< z-VpTY!|ml&ZD&CptSyXrGoPMrs+G;IpYKF42nI;Fl2zv;{4<4FUo8slxCBz3f^<5z8$h%l1;nrY_~66FeUbF8l5=ptA$NpWcT9xlibltzq#VMY0%pv=SZU_feQyY?XRE(t zR~Hg;zgxyPuTI18WIZ4d%jq{0nwli6Nc$1mHVz(@Wfjy_e)3@`W2 z`f%?s6V%HwysX zVZFjm#>Z&v0s=rC5*dIPZIr#xTw6AyFro8(6HP5>1m~4Rj~>97HLCrYWA?bOzNqf1 zl~Kiro93M+zmojd0@hDCoWK${Z~+ccUF_+q8GyVx=p_qjK?-`ne7k_5+eOqTe0C)~ zvPs`W^>CHP>KtFE^!(^)kASjgkKdtM)}up+1LqCW>GBXmD=S@YsZ$ps(adnBsd zN^hO@**L4w7cAZf7s=f&K^w%FiC{pg)1h249r<;Rpg;6ECE4B`V5`(0P}XG=Ya#t3 zXxZDzj;DF999cS9opJ*)>I=e?i{`BozVqW285{uqJFHk2B9_?+6mpy>Wgma~ptjB; zSS~leATBvDPOF0AxWzv#H=2At*->u`59M(ozilTR{iVpslfd62YHeA#Rs~<|Y&e{N?%;*WKg> zsx{YIo-ob23=O@-O0B5Xg&ZsuLiW0q=xLJjHt{zvMKbV9MO)W)-;d$fT~SEr{;~`0 z8E5*{wQTT?lQ)@*PP#B+%L*{sT?kq27QKWBBBW$Nxtl{6H{2b>(Z>g5)+$wj4XErJ zKZi=dPsV&X;PzB~oZGwfZk6$F_{d6{(`5RJ1<9IWF2=lCmG50tr($gKhapavaPke- zr~$B{S?e)pOZxeeH4-KNnk=g64D5V*y1n6c48_+u%dzZa&yL%+~rFyt$uio``%XS6-KS9=r2GZl4GXq!j@`z+3?LzxpAC$II? zpYYPv2dwA_)&;iiNwnZTsxDxqLHf89dgaj{{lh&P+i#Qj;1pXi>uDYj+BBQSm}wpz zk{$xoN;LM^m|Zt6!&lemmH{jahqssaWUQ~vw$avMl0yybR}C$#%>$?xg-TPZUPwe& zgV8-9$3ywk8j#Bb^UrI81a0hGvSS#H+R~#;ZUis3mlLi6dPg165aye8 z9d%!7@5QeS8hAzv+wecv8vOQf>&^pa!E>TyCnhJTI!-S*0=}{r(d(4lgnvX58jDi) zbz+!O?o0QTiZs6j8%&EN4QZ}sY0`?*L#Y!oDoX6nNE_W;Dr(Cr1LFh{DgF+haK=ZN zK^?{$GZvD1S?P7eB1NQ-O$nb5D-$};rgeKz8%r9*y>JTGQS{g0W_xsWSUgW`eN`~2 z=w^xfh+3DfdognSfZ9(cO)BPd_9xul4{#)W&0Mu>=Z2_?LGZ6n6PEC^l3lNKYP1_W z-5g+Rzi5h_CMa+~i>C<9Z&^_nE?yk7TLg!Grk@SK^se8wb-+aL89KQm%)vCc2OQ8%Vl6wG_9 zucu1*g!umQ_&J}^V@YyE|u5(ij znf8_lvY18XsqaX{d%DkU+*c|7ZE9r%$VpX++j?x6YLC+TisjDVvJDdkLmJkD{(+q~?WLn;>1`Wb!gmMSJoXudNpP3ZXjZ*u z#}?<-_Vv~Ds&nTYrN&ibrOuI=Yn&tZ5GuvFh0mLp9c}`D-Kcy_vtbs0QV|1jpHv)% z8#)uv!*|U@AQIH&P?!S=$UG)Kv4jw4^d2sor7Vs6R)WUM>JY*Mxjelz=g`dz&RIVJ~ z?2EdJt=f3GlzICzN|t6fHDv@&NDE+gq86em*GHMgJ(<3d^x1dkSv*(WtAv>dL$g)K zkYpusL#xK1TZB(J1BRote&X2pDpVsQ_lKC#4tA`EKg)jK_SSH4=m*g}L46J3?!&!k z!x4L09b#==_4OHedp|Z}+XMzk(um17$Ruv0_~RWGb0a%Iti!1$ z-qbTpVxs6bRPkEKQF?0U?e{q}0_IxHKEh8g{WK$w4N6?)wfiM#O4>d=1M?le{ay4h7|)e=}vjX=EGtE?231qTyW6fNvHv>4)1*LfuWHq>oH$qt5cv^ z#e1690i8dd9rE4%)x*RDC_PEP9kt*pI74 zI=Re?=4y7}TR2(V zGal>ozmT0^w7t9t;OxJ*g2l!2D!=Gkt~_N!*8M1JG;D|H0$`tyk)sXndS&WQrUT2K zNDl&5?ePmcUpHD{N@z5t(wp8ww zEhpfe0ZIR#7}G&=H$upz2aE@l(4kTFkh*yX+1KrSOESEOScmudUYD6UK{YpROb@QO zAOf9tNP_jO5uWa5K6i?MpAN-mqm7VMv{!-pC^Hcu%_~2M;MuJk47YI7De}>Y_mct| z=Brbh{e&II+<-FYHyt|})5$cPCjgMhzu!r=>HE10aYt%)MV;^V!LeILHmq150xp1= z$XH#@x2Lj~`U!rN17md1=KFYfCh);V%v3`I(U70Y9?ovt3y!@}*P=QMkFL@i=EYvO zb&^0`J|%c9UtzB5gpz4l=6aR)hHm401^;}wIcUb5wOlB^$@gUuyw7y#$wsOslfa3& z)P>V3CepBz>`e5o&H_wx%f?C?xj@T9@I-#Nm8Fx}V0>c)&Td?7ChRw&7GBwIGDV7K zSEhNvv-S|cWKteoA}-_4$%^}eHqL&DOKx5ykpf@tm-iCyepiMxNXAUHgJ?CGahH${s%F0$3_;PPHVd*%&GdgP(ndems+D6A2@M|Y<9>Z+`t z??L4^>c zwc?N)!TB#yaL_`-lt<2=pMBKbvc9QrX3il>;a!Kb#L`&_I@k%Pa&1IcS#Tf;_Bz^| z?YlXEz+M_JBRom>0XB8y*WNu9|H%nO!87R1NYlRquogGc7r}Hj8YisO`^2FTMdp0p7-s=>&sH&NBiHbmy#ckudKQpbb z4K5xm>h{o~d#~p7?>cjMmvl-8Z~sYSqS?+}-td#jG9kOg$1InZuOs(vBgrdC$e-7l zP5RZd1i2i=Q4GZJe8Ax@%HT(fHORymnn3mRE9wC|>oM^mv{}DNN6b#c`L#U9G0_#H z`e!d?`K4~7S_Q-Rdu568d0X+k>85V{NB!W1zukW}sTLOTP#Ahf@5`baABKPhNGl8& zNZ;n76rV9QY2BB^Ke2CX(ki*<<}xrgQTUBgoWHNl9Ym6^q~+Uo(U~<{KjB0AD%#B- zTmYV~rWxJuec5uY3@8Ef{F%e*$coYgy_ti-0A^9zbo5AmK2D!XhFXFBG2IkI-?5kD z2vGWJ`hwLz3D_XB*GhpG&*=evokv>+!$!f|ZtZh-?*GHj(KFQ<{Pf@VbsP2XF|*^c zJwxK0Mf4}uthYggi6K$Y>??Pa<1IgGy!L?s)K+{)fw2kiUE|0p`|SBuo`k7o1-4Ey zW=&AA4b{%D()mhiW0CzC=&I;Ya^SvEQRj`PjSn%j(g_M_nluz}Lt}3Y1xYpRPE`0- zH1RPE%lh+OT6+ksKDnRZ$K}BI$z5pAq&x(mzW=+%1?L<;1H7EzN1;EzqF(ho3%iS) zEh#l0z3Qaz1dmZyOnn$N@eaFvWoqo@8=rt28dAF{W%-d{VgAFr0v*4SiH(-5!9cuZ znpv;eigpk21tt5eND6PBS=1d@8w@kNHB@_(%0*W$O34NaX!@;Pm!XK`OM-=}w$neC zH=GiAf(~2rk-9iCeG9kW%v&htJBv=Mc=e72rlEXvdpg8WEd zyd{T9^eys;&g6D&j?t|sZ1ndGFWN{Z@?sKxvy_^wRsri?)-%LW3w<`2ua<8K2x)tV z{8>C0Aqy07cjsblDh2Ol`tH@&Y@`4VzpNav*v@}iQgPtSeE&GqefX#Rm^-478fKr6 z&gmGyPWO3}TG`DB)F~B(To$%d3pao@hZ+5Phz>d)YN6T_eIhse$o%yLzYdU9y>Viv zCIR);;LZ47*be|7UH!))7DOZZ3{k&4-)t#Y#vj}$$q2Hs4R@vveyFt zN-&Hpo|m_voQkXe6r7bVL!XE*``XR2P*1&bq3FrHn{DQ7R~THaNxhVdn?qQH`n81C zR$k$Jj>dgMgCo8&((MO;s0bo;&FspZ?Z9^k>Jg(4X5knHoV;?)EXQ*V-i=zS!&`eD z@1RYi-_W|+%g|;B-!NF>wo)~t39b2zYK0YGOq1%<^q8D$ev^^q30-b;K@tv;VvOo> z*3+R3M3q97$y`MahNLHUY0%&t<#YZHy#l=V7lW9%R-s?KHh&P5bXlfh>372o+np{G z0j=MMgOp5urY;@*5IDy0OK2U0?5VMJ7j)LI+w?uWd%B>O^Fm;D?}Z3-_p)MGG9b%P3(=4fbX3i@$F0fU@@PU8v1g=Gd|@;PWkRig{x{ls z;Cgqdu+aQ?<0EwFhqdN*K1XuFkOF_5{oRr?Cr_#xQ{74ByR9Pm1w!SQ9no7Hh7YRmx*dt@CC zadq^0a(g2ssMgkJw1qwK-vcvJP1nF>DfSyP$oOV$ejDgS86E$~E_c|(I+yD1|DY%I z(|0m(MvI%q+NkvYb8{?)OI*Kz-iROKq*W{@>iVOPu+vgCWB-96X}|^Grobaq`ziv5 zfZ3uB`FQ6o?0BZQA%QCm6reV7!mJ+VN~?z(@|Wa6%k(Y_sWO+DoUj#F^~uQGqcYp= zqX3_Z66WiV!e6F6oWRnhSG8kcQoi`eymq12dA?`=Iuj*@%as;`o2n4QBMq^f^hsQ* zVAH}KDMu3QOzO$68L#HE38qJ`qEUnzzfPz6H}FH`GU0bzx<=vI$A_fCj$(i5f*|Tg zOay^%(bD* zu31fDdo^?i!J;}0yE%DX?Fq+S-6Veli2F4GvB^mtLQml1loXK-@L+)7uP*1Aes(2J z6wxc3pYcuCU`b_2veIKk{h&2I{{{+_7^$(6Coa3kI&Y;c z8C3Mr%r^hB5Vn0%txqylH=4Ixq{FziD0Vf=R}25a`mr?1e=R!s5hK?G2Q40sc@-fJ zk&YpCncuR~fIR|^oT_ASpkZa$NtPR`h2+L3NMu==#fx`A0xR7w7#~0~b$wHwMx2RA zV+kJCH6u*?4S6Cpk0#iA`SgR2-5^osCt$o5g8*m|IXcoy%|c1Vyt)N_wp6zVA3 zw=X~PE>DXCPKQ69sf<-X>~iPxKHaP6+SmBDl#u*9=!stntRt`oXUhI+RFwVthWswF z0T(xMkIQU1WkuQtN;VzAZi?7yG-+Vog|f@26U(vYSy@h<@m*!tu_<}bJ?(jf8bLOl zq`R3^*`8DeS9(hy#@}oP#YT)jp;^%JTM;Don_7*7P41$oGG#J4^i`~eLtWBpm4N1A z><%W|!7zSDzoT7Z2bi_6DSk8Rooc@qwPi9(7Yr?WpR6|#u{+v!;;+57;~+G%MI36e z77-C*F>T>1`tq`3X`uB9aP}wiG9hI`DVaH*iOn>SIA^XhEbQW9VC`mUMuCjOdgHPvyD|q%EcIp>jfWa3b^H9js!GYe;UsBHQrMm!G@Fv9xbqNXVTo+F?h&9?J+*weQvS{`{3*Tl)HH@qZDRvyT5|v}C zk+PWVWil~jLn^vM1nM$;^^RVtmyo)-vVa&QH#~=@CM6}MsiBbkDR@M|4G&Q*GlMu$m#!jHcrIe5Xph65!1t$#g`>+wD>1JUr-ltkrZK6_ zg@Ju7;%O*h+B)W9?bkl_2?*sWV>fv$5ys)G@{_aYy`ee2}=B3=qD;=faPrr^acUwo)h9$cT~0~CghV0CeL%Bs%0ZZEa0EdFhC1s=Df$mD7jHU5 zYj`o6*=wj6=P3ufQ62Q!{ar`ZuQFD9URz&$4r%a@yXyC_H}NrPKB*WHC~}Yg+{on% zb0zo%x+i$&Qq0`Nkx_@-BapKZd{;54Y)5(EIv@>d9yPwxe`WiZs!&BS6B2=E|7>4tHR$(lSXRYK0 zFljj!+vqEA=nu(E3{G3ARfTJa4~$r*~bx%11wZVlkr_;;m zRGcfG5kNaUbx*HtZttO%nv9=Bcp5djuse4aH({;?0JU%_TND@Ai5;|Rt@ts(uZfO{`h4xtJPvIQt zzuW{!>AU;^S3E3yc`4czH|tx>g}yY_lu7!^`a#Qvw}I4vNuTl-V-P6#85`$Fz{bbtUSF7Z-sQ(~#BvUJ2bg5H^+ai_k$RJCoKCCe zh&e}vel9i*lwN@)_BdB?{q6Xmd6MU4XmGJm%{OfI?Ns`$e_A6N( zzaz9OeHGuG83~w+2Gw}r$G^|eGus|Pk?!)*o?CMWwU3!AdB@~7>llTsX#XTUqHk>J zhwwUoOAw$#3C|Kh^O@d?njY#0nu3@+|1;I*dW`xw+SK2wr43LYE`)>$it`+t{OZKxcx;E;D7^w73G2M4NzJ{`cpHU-(RL=!@bonS~9=h zT=O&7n2T8<&CeCA6|`Rk3XqidWcf+GQ#$!QW|b>@*hLJrP;s7uf3ATkZI+E8NvII6 zd@=;xbIs?eg*5)WDK*$uM_5YpPyVF!+Y--Wj;TkA6S!wFJlPsJ-q>NjViACQ8oAk*0t!}v%drQ z_p?GD2wVf`z)bhznlG+kq^Nvc;B)&>xqbB+v~y{poIrmysFPhclEShx%ZUip0|cbX ztq;@cmN^(BO!^4w9-l2I;Vop7t@X-iEdNgqVq{Eag^+n&uJ%L~;CGBel7d}*tZLxg zogc(6k=H)wlR5?hSZ}bwwCAC6z|MklJ`)c^MhGLrYJMgCN^v`q9AAwv!W@*3S+Zk1 zUG&g26rPmt1{l)`L=N#~21zy~QR)6oGv;}k{Y=X=U^_UpEyD6vMqinFI1zZJd?%EV z&pJ#p=c>G56oZ!_E$fF=Ma9ME*?Ykl0*a*wF5#XbDg&fda2KRN^B!y9$L`rI4 zjrlnT8FLAwqRc~9b(9D?=;oszoKk>-h9DyL;t2y$Eo(Ev^tdl>)Dwo5#T8t1>@XZ- zP-n&Ju%zSa0#DZsiZ4R1mk4pQqs8V3W?b44bBq+ys5%dG_b>PTY!wKjJzl%GfQ5Ql z0naQXf~K_KgrCy88L2p4uOKK09&;0wBE^z?No#Ab%=Qvmdq56ykZ~URM6EuS{TQuP zW!S`fJow>jSsc1m$Y8#9nM6OTd4 zk5~3DP%{xE{*$tt%D~tn+wgQHnqxG!IX1t}jhBF&Gekyd?b zw;h{NGEJ~Jlsgo%#%wR7$SA`qF)$tbm`(7T0!w>fWEE{4zuqE?9I$N|Wa7_(Oy~-H zQ^i;kn1YjL?1I8{AI_Jn*L+-=kQF7sViC#~Gu-PhfN1we)0Y^S;JGwCB`H=z;d#uG z*UX@CvP>v`3SVHDMDKm4gpjhtxLXgH$JGP0O?z)JbqOs=!W|vlxRQ4%1ErLI)gSfL zEdn#1!Xz2?_BlCvm4_)y=%PQ|G@aW~L3c;#h{WKNCsY$}CYUCoF~MTu5Es3cuKTtA zWF8g^=?y0~=YTH~d{h%rg2}mhE!;$d*C=gfXTpEl{sJJv|1tkgNxoa2?-;qbYM z!O;VeR`M)3uPG$InPJzDdK;4O`2EU$F@V^*x0@xG&px!g%%AwmaGLY zO|0*9A(tJV0mm#>)@-;e!z;Hd+N{ojj}BW>&)(e0;CuNN93$haPvEn~#srZI7Ezcyf|* z`{RA{_S`8l-%sOT4-Jm^%Q-4;!5nj_{ZQ!J$dvE1$TM* zOEMLuZSLxqmz%FQu?B;a(v*8Z|K>}LeKTA)_}=qB?C1SA|03Fw?0QjI(;~4Ka)+hg zJk83oaTiwq^8e+l<}NA9UA}or2EiPg`D7;(YsXR*_`2p ze!rW2EXEW`DdFAow&(YhjPq^bo4>DrEL(BW=hte_Gv!(!h1yYhewoV_Fl*KUq|5Qo2+f4GjkHrx}>aAuUBr@@n4=TMo{e^ zL3F%dPBgl`_>5bRcmLyl{5lmAMn}A-mM_>q6-0)cQt`j1>)S7aq8_G(hWlzJE`3g~ z&Gr1*{3T-%1M&d}FnV462p50el|otm`_uH_8r%NopN88~Y5Tl%+%s572oUrM&?Y|I>_3|nSqw8E>eoy>4YsB*&8G4LV^OMRJ-TpnT z`&qClb#~6|gV(o(NCWcdZ%Dmlzd!F&Z13dFT8l`0t2@CmK9N$$`Fr+}3;)QcT-i8^ zlFKzQ+FJa3`}83(0!!ktC6g$b6Wi;UYn6&Dg>w0sJsknD@TXnk+>9=RNN#`Fe-zCU z4Wyl@Z^J+RRX;+#m(?vr$u%;W80SvUFRWQ^mgPC5*0mO~);{C!xZon*hw-6z{B`v9 z-DYV3e`HWVhaTLQE~m<-PpDkphz`ZDvpS$) zjLECe4-lp>3NeZQ9vjkg6B;0!4xq6F^iNcp{|ZgLKTBgO(yKb%s9A^gFV%kbAe#0&;+yFa04f^aRp<_p!i=t>bUW8KFFaQUsM9=a zUnPN%M_*GAWw>ul2oxD@139JGew6ca;&Kkef+Fiao&u4GeC2ii$csN|+z=cybke{> zv0?%Zx1W~rK3@hW&#d{Q1`wXTHrVPr#Ac#l%l8;@w6_DF?)YzB(D|K4dWL)TnLA(Z zYMs=g)b^37F9QTQQC75MYEis@Pndp)7BP9bPB)EESq1yX`)*i(gPMp!$^uPJ zR787h3d^$mYV^FP-ExynT6_MUJ2?ka1StOVsP#2Y#EQt!{WhOUlaMt|d;Xus4z%2p zbe+h`Zi!r$$-iU8t_#5P+d;M%$takJ-bpkFsNNVc2_1=>boMhsav`_vmLimVlZwdd3sl4b4Ki+##xBHsdCFz_EKUMEoc*bWC zT^l272@B6m4*uyCIOD5k`OVnl`)m0n@~#5-qoVqo`{lQIIcudRX0}} zd!&pFN)speF{*n3P*nS<_`KQ%s6xC}u?+B!5F0`E@1J+^vi6@1izZQ9v9{wLv#g_6 zqdHk!haE#v-OW?G)_L*Da<*=AAAqruh(yapbUXYWJ%=1lKCdEBQV8&SRYp@{AnkuR zg?w@y!Xy@`3T%ojPK?<>H}U?r_PzW5!mDSUZ7ww_s4&LwSaiD_We7P(-?RcXh7;NU zKUnR<`%H5g6(|W(Ub;xrBS-l7R%|2 z=h)V4N05M3m}0D=mDSzGXnwm`rg_Lt!lvm-;(u0Www{(-ZHub;a!ysq9$o=PgwJ*4 z$CmG}P1jqxH@_8_%g(gnWPs_?_jfFH-Dz*${8<@6!T6y|hGzEiq1nRzD@_6z<$IC; ziwmK{loz~-eQ^&ZoUmwE^i)v|(-d_Gn}ao)F{Z7qV^ZFO2`dp;e!oT}f%9I!Y%$s% zrv{}Jx_1IhI5b4!nu_!_@P;I+`Tx+|Cu=QaZ0a51uq$M;;$IFq7e&;;vb|eRTGMby zoyF|^BvEYniE(Vu(Qlt3IpXB%)o>XZK=@7f2-0a-h@hNBZVOpkTA+LmTRMNC> znBGGG4Tl;x2YP+K#Crw5aIu#sBx)6*c<&K@W#()@zyqLYG-2#$*C=*S(G;oIQ6=ln zM$y41c>*yBs@tCqR(R4qg6oX!m7n-!T4RL6N`6-uibB10eng95? z(L3JPqO6SVsz5Y@DA$` z81p@j)(uS_MadSm$X=~vb6Q`>tbVa!dzvr<)1A}$WaFpF1FcS$cE3fFa>@OUG4KrN zN<`vPIb{00M-uIHzb32v*#b}2H++FqWy2t2x5c;H`jef_)qQJ^ajIEPqs?FA26XZj zBSVkpPz!I-u((j6G&`)UYB(~fh@s)OOl=z1Ysp(%T5Eu-ay1Vea(cC6 zJ7hh++9uBW@sgI)hIGMC0iH}$TC{4;Dd}BjFcDXwpW?;Bk!(Q?Xx|;VRC6`MoRvmI zA}X()T$8hy*}I4*b8^*%QOF#dTLg*str;>Vp8fmgKgpP9MbUCtPnoX4cBUQ9g!;#; zN9_jb%Jk)NUvinMprB{M;3Og;fqN47y6@Op#i zps_sa4k-*aORE|RmK3hw-*NsF%HyRG$ET4W>$6UXlqtEpJ{fA&YUAKAMX-`rLTLMGHK6WT zCa&`h%q(D*h0Cqf=FiYx^(lbjwD}TOvd>;*q9`OI!Fa{L5MQkwq;rYhX>?aBe0-P;4O8#!4XvM7bp+Ih%vuAMC8^X{%(?OZ`eVU~t4!xM`fAQ(&IK1f@OMo-EnSVY;a zXG8pZF8(t=iy@N5k-_(GAghxw9^&1thwfH}sO!PcJvjIPL0N`68g@&IsvXoHNoyj` zvpSc}BrQ7L1C(f^w`XGb;n9m{*e*zw2AR$PESGKn2amTr?nPdT{e_}m_6(sJ1OC2T z`>cw*j%k?rP<27f;mKFDmi5A_UB+L-nF3?8u8-Nq!CfXc3GH>&bRJakcP32-g|^{o zLy5EXQTDZI0yD68Oy}HWJGOpOUU0kX>p*0fHlS~vnWa2pxJ3{_XT$>3^j9tC8x#*!#BG>L zJ0IG>Mvo<#7(~-xW^ZW&jv*gu9_hNQ9>#IVCoQlv!%d3)Zlk~KWB)z6jc!Cy-gm}4 z2=fQ4ZhO=UZG)u65dVmQEYmvX2W|duld~s#ZOOg%DhbV9LYaltXMZI5P%7nhv~Ad! zDLBcebhM|G^#Ww|xE1?M5*b43O2(Pjmwmdu!K$f?uU5_ddBQ9yxz|oMhGD}XyzfCt zE6@JxLlbsB2Wq|>FpMF$^v9eYPxrZlQ}FC=3*aQq;lYTn3)gx>tt>I);}+El`aBul zyQS`Y{#+_e#gdWF#5AyAAsRMxnS8;mS04xqb)r!4{!9;lQSOQrhU5fnn4eZ}05Mw6 z)sDV%cKNV5JpMiCTP%BU#bxiGcHgzRncX;64I0(L^Ffg}`5pbgLBB2)xw^DWa2dvt zp>#487ui4Ei#Q-(<@Yf`Zv;F620=Q#7CuNjbbx>z_`itB0}_aW#rCI3dqn1#B;F{w zwI6zto?eFzI}i%803c;7L$p?cz!3+g62W$N@p$+S<|@b5?uaOH!LxP*wP=m6(bv_T z*Y&94ke*=+iA1ao7FXf&5UA84D00IBixTQc3zz%j3Q0^To6{?)F4@y&wZSs!ANnSz zF`EAdKVk+6!F16Yj1hf$bzLYRms($!k7?Hk{hz(v6?-UAg$eOKC}Or(8&dUYx;kwS6k z5@S0)pP?&R}&0$a3Nfk8ReY zE~BzxgyEho7+NVR3ufChlwHYS%LftQHT<`3EKl$(SKkHJL+BmmXftJi4v9h5G3*X3 zJ{26w5|)P?^J;p-Me^Hq4Hg}lyw;AI#_w$vF&;FGy6U@& z*rDbILGIXEPm7)n*P^@GGvG3LJ5^rMy7;b6wp1})k+S5ijh=-fNPo%FJeQ5 ztu?=lr2>ze2nb7U^sbw^(6mF`;2*Xo1nz2SZji51;bb^bc@(;!k^+lm zWW?>6Y=-ar?#rT_si#4rPU1&KEcA|6uRly zk}x@E^HM-g95<^tj1LW8`_B)PtZs&e0}g#Ye7Fcnt~=c!32}+^2;(%U&y#41YUg@& z^RCA09YS(*`d9U_+?7KyiYkuPxRj@~Pz*3Lb3VuQa^yuz)SKi))IWGhz^X@^}ZSlS6OWH)>>H0a{I zfhETrO`P_t<18cIAT_0;n8V$AUy^xoKip z1RR?6?%{MS;Gg_UZ0$x$1gTFq|U2)FZTipclTr%fO~`&1+cNT zn7T}Sem~ZtlvWmo0wshWPDJdLOGx*UMEG%^q_?*MgFPXmK<(=6Ujrsq3MIm^MNH2T zt%J4>t(SS>sWcPy(5E?RHTj92kU%7ksNRfPUAeh}bmb__)>DFs;ZzeF{M+2upp;^G z%u08PwH(rakrE22^P0%67>Po*E}75lF2q5^7=+j^>%VIXeMq@#gLwo&_kH#XfAj=; zcJoF(4b!ZWosfPi93 zh+yU7G*U#{IcnA9{Deq(EZxq*dw^#yWg&`ZOaEAJj4=Y`RiD|+yK`-c?-ZS}#x1(i zBm=5mUYOH*zww7dte$Fqjl_`LxW{tPsdTecDkOhpO-q5$jzti{VUo_J(>x}{=^Z;I zKupv=89CYPy!IRuR>k=8HJthcHo&CjnKoe>qU+rEO&}JNxeUNeg$rW6jR5$j-ivY6 zN6J0;?7qfx<{>nyq{GKM5(6s%fVTbKh55vu0^T@b(U)3Km(mu zpKyinN+%IuHwp~>u1YIH$&k)qYm2U#9NKtBBJQ>hGb^8KYZKtS89~6*v1%J?hcm7Y z(p=KyjkW1mnPK02v!mygYN7#SI$Co2X%t%0NfiXxzpqpp0l2u1^lW;aWzc0RA&L-+ z8-5a^1tzS#;~}V0SEIR%tt8NprE|nIz%Knhte5C|(XC^-x#AI!LuE3dh`(Ire1?Ej z4aKbOUZW=$;h%3(;_gk{VN+b7S-Z_QER&+NXFqd?@-Mw8QAgaqi1RdU`J%b2}? zZ}amQmJ_7C z!e*C<-Ta%uvjZiT#O1q0{l81YN+W_NNOjoi8nE%Efa5bh*?f6 z%$>ip^)KoN(@;F^u)M+F_8a=X1n8z_rcokBn4j1IB^oG*`lg&rk+S%B!oCf8UD3}n8=Cy&vIT2f<9%7i>3re z&59&pa%E!uK`_3f#Av@nLa|Ta+YFEFxK_S3UX=reqD*?59|JZ1*)oF)3o^Jr0lHU5 zsWL$vqX$1P=m`5!r9bSC)__Ej(oE;8j0#v6a!kgIWkMsNzC8R8DQfDzKU+MvO zZ`~pbl@}FFPPOTM!u;yX+pZv=-nPoF%oMUCFRjILsOpup8j8ra#^|&jyTwa2h!-a) z>7k{yiv#YkDmFj>?@Za0taD-54b}%sb2jHvDQEM7P$KJ6`L&7NP*_na&+5CJWCN?uP8Qgb<$g80mibR zzJgYg1Tmz$d|zH(JhasShgA0A-zWBGsdI7dsXOy>3h$txw(H<9yp&p>wEdJ=6#ddl z^WBse==oURan;eAyLuH`1`zE>z_RJ1^XQoSt#7p)?I?rh$38iNn*~7<%j1Zx zk4@%g<4~8$&tm%t3B%udCYwZ|2c97g#QD%*ccS;t#cMy%*4lzjKj==s=S2uP+17Hn zMct|?jJ**1?E}ck@0IfPRB6irGwEDN@6g&_wA7*%IcCmAPlzy1v!*IGllu4%c9M|p3QCb9rk+LP_GC{7-oiGoPD5(X1Bw$9 zqV?WhF6*Q{WhK3{uMf5JRZ#~)QusliKI|%F@Vk7~!u!ZZVk=C6!aOS+>pHEcqOBU? z9T`E<3EY+nuV3pX?=3wAR79?0_cI%ejj2tFO2?n`Vy;f$OP4f8UEBV?2Y#1|2 zq7p_;4@*X)`C62G^e#paMszz{8)XJE9sH09^CWLr=~BtzjD$tM!WfQo-n(YBW`hS8j^_7Vh9wI*6cJYY5^Bof@>+o|ZpAB)a*MJ+v zaGba~yj%pWn*0k#ghfPF=Bi|O1+Uh`avlNF)HxItBllQ5@+rypp6fzC-MVU7b|FI9 zRC>A&?32E8ay7XiP0C0SV{Oh`Vyj+w)Tf_)sj~*yzd?dZ@BZ@wyY4(>GwPZ}&K51D zSxU)dYjd=!W8WEDQ;KxSP!$1mEPV0pL$`-9xC=SL3hAXs-(o%P@AxU>mtEtd9HBQCQzj8jed;gd#sn~FX-}?cZ}AM;GGM;D<=)LI4l?+`ZgsdJ^np=nYPp9Km#`Qa{!ch zvP*bF>hbCP(fB}v2)Z>aUtW&!cZ%t=gtp~~5;p5bxo&VUS;6IaOkQGAuL5E*&B<@O z!f!(F%G!2DB=^k@0@xq+FuFHO1#evlXg}-NO^oA4q-e2J_hiZpzaRDmd>Ad^gDc_X zQlPBz7H1aMze^<|V)Z_*CYza)Q_N40vlAl6IdiTARPX%FD~v@&$tD^aj8G^Rfh)A1<$hh8c@iZFh>T#n_tO=$rY4xnIJNs(O0^yoQyu-xZFG z#Lx3NOk1kj1XZ--s5)O|9Ky^}feD1H83?9<(4E`)_m1*Erq_dF01^(vSad{QM0y3D zo9lWKze8-|?faP#9&$YLhwrKnMYG$&32%7{JCUGEL{WJ;lucQ+SiJm%>_Mm2?y=Et zEVVy^qouZxq!1;L@}Zge&{>U`t!b@GDm>_oG+Bise&V^vjlR1^efhx8R}l28unyNc z(G9C`2lw(P#W7mwGa5N#QBowC-Y6r=-vS?+xW7)T-;%t;w&jc5&zc{N{EEda&lF47 zAJ;pn@8!Xjj7OEI6v(8a&zDiIVk45KZY(?c4kRtsTaXY@yzztgV;Xc6@m6*_%h`aI;(vqm3fa$ z`UNy~a#nBgx9L$2yXA11%EG#U_?N2;;8Bw7csb2jLLw|0lsFhB5<5E8NX{GxhppDb zIVkTLkGkVhIBGE{s#(fb7E>CxJwML#rbkI&GwbFC{Y53((;s_O;m@5JVk2S zdAD*+6C9Mx_OwVLvj zN5@LnviH?1YUWcxj6WjNY^WGD^y08NTkmAWr2$-2EOk2$+;5!eRIWf6K`Y4W^@r@#@e*(&9Q z)MHE{IS%11RY%tmW!$pJ)2sjhoh&J$waN@AAR~ZdNa&3lC|Vs<#cf6FdsdGwXx}Nq zbWm~=9LF!O_xDKDV^x8bAe&C+nGaVIlAGof^ec6WURKc2zl4h~k$?;1W)aF6V&x+( z6Ot#Rm6(XvG7wKs`y&cyXJ==e4Ys3@9N($h`!Tw%LN5dRXe?DcWyKJ=iNjvQ$o4o} z<7Ru4F+xcPURE^2Hu`NNrDl_J-AndwF_@!91s-rz+ewZw&6gKSZZ83k+hyhzI-3a> zAqbi297f7CI)Ir1WnGPeY{%v2~s6GBw*qIoH z^2(7jSoA{7Lxe6*qE#-eN)Jn4lN6uvQe|tLRP- zJ97Sr+-nrQawL04-bQH6=f+E-DB@XL%I${rk{fVVC~Nj>{GNuHCEZ;&RIdApd@(;n z{-IvtEiB%O{Cv# znKta)&5H&6Rb0iIwT8%mJ;mgZ6pQgmos!Xbol*UhMwm%kDe~^LTyKa1HC4~klP0Z} z^bDP|sA0{wa09@%oBn4LOnbx8Ez&ega#uY3p*m*=GCF8Ntwvj71?ksLeUVa%XLR9( zIcpKuk87!4KxQVpMvl=AU~?fNQZfsH4(<}%dvpC77M8L8%O+!ZAOT!yK4xV?9TqO2DFNGgWIt6}BLXpclMc97bupxItK*lq z3)-F8EZu!Va~S;F!FjH@l_Qh_`KajqI? zS3L!*$anreSS>9x$m3UMjam{G^psaQprmvsr*waMKH8aq&V{EwN@Ahzm1fdZ_4LrI z`i>l$5@=A%r;+=qW*8lth%Q~sJX!hVfRsA6CM2~+D)1=kbdWw5tozpT;T$k&#|D|6 z<`vi6kMNK)>LSt3ytOqBELLq!eMU^?`Y~N(u8peX2BzVnXP=O0DWOH-C!uXkU5XMtj#vTE&EWCb_I8R6v#l=Y$q|XyF9tA*A$yZEC z{`VK8an)X+Y%*74V4=wm5MtuBXZp6>h*iaCZem`W5%n*k>?vfnzRGlk%4I(Z`#I%K zHmiKcr>1ShS=|yhf!Ro<@s{x2V^rn69sw#%rM!L(*&d|Z?3Y5|?{M=F%jz7KL4GODLkG6!I(A5-K`&p*Ui`qB@tPnut-fa1HfK zV_J}I6;BHBqTB^gVGM%TFy$HsShXCBf)VnVGCA4{ec)G(#6*RGd6bG>pKW=_wP2M& zGlE-a|2!lD{LPhkSM;*t09pN>tM${#--wH%zY4))Y}m!f!}2~4WVjHI+(@&>gyeAK z>H2Bq)**_k$z$O=OD2bBnBWh>TfM3M;X|aY<%67IayBZE$P{~pHG$<(l=f!PmBeo- zPMk4{Q4J7&7X}RQiVLbJiOJ}?4mnE1r$j46wWCN=xv?Vee4up>TvE-kfjO)af4uxscgIZ&U| z5uVz03<09Ri&o5|%VI6$DOOl5IF$a4x|k4JjHsHux3tjppaV2|HPFf2wPG`+lvC)c z@6f{WEs}o(EB+J|rF4pF;-ug#D(Y`J4iPGKaU83J=YR*_W#P}K8vAK{7i6>nBB6LD zWYj>Rehgc2JWx6({A905V4j?M?4x7!@%&d+l6(mqtN!0TmK>$dRYsO|qy^L#@BmTF z3#r&=N!ut|witebY~wc@${$*qQo*~}EbFpR7wJeLjirXp)NZy5jpqoObSU;$e`4sQ z;bnWoz4HW#i(UHW9JX{5l-7%(fDAuqO1d0NRitrkU!_RKoS9VlMJ_xei3w3^Cq+#1 zM-*-+Z<8i9aWWA@Hmx$iJO+k0;QFC@Zv_Z&#p2ouaPnTJltVR)y|;iws*;sxl)zkW zh%RH10Zp(o8fdWqPfoKgUOJU#bA9h?k1(9RzvCnCuy%>{soY0mkM9)lCwnW~bGbkV zzcLDg5Yr{(q{5FB=F7@Sx^h%J^Af#8ve|f{r_+SKbBO2& z!i19&^8hrNP>aHQ69tM%I?SSEPXs^i4m%6#;Dpvdyr@4yCpstLU&|0@z72{lw9a1w za9y8ma=jCo#8T|n*$mB{YJu5fhWn(rHbPZX6uax5!Ei>E=#WJk=u@^_jz#Ft69w*+ z4B}cPNoiM43q3YxqI^j6TEuZR-X%R68bg@7&{xBcGqD_n7GyM-Fbu@f1?HCz=xI2+ zh9rs#U94+_q1SzA+V^EB5*d?Jt&299pR3vF#@G^3^K&84?9Zw zJQtx8g?sr9YTN#gI|!{M(%t8Jr#zC|pEZh36>ww|e$8WAt9`2T?+2Rj>8HLG;U%8QaC+k+HmZ*6FMwO zgnHfO-4|0t+)w@0+wCdnhGUZ&9X+;YeOS9niAs9nbWQjb$kAnMZYuq~Sf(;i#nhsNE{TM&S5`eBPlzAJ!9DfXvRTIc z$#t-PU&>p~u)E@5?OS=#Z_$SX{){Lth+A zFqD(x*+}WI@Y2HnaFQPym9W8?`(1Z*&#Yf=8|i3diS(ypEq=apV4{}UNEUBdPNqF- z(dJf?v=mk99q8qN&TU8@^`Iv{km*IzX&02CYh$go__g!=X4HNZTFpz$LMxz+Eo19tdv{XR(+%FfT3v3Fp zwP|MezDjQ};~qm9;4z}hgMX8^V=~#K^PD!m1)tNf^({n)rY-`S7O7iHhB4p&anot; zpIqUolSmq+m*Ef-H4!qERJa}>ZHP)tJd1I5c z?|A(oQj$WFh`z}}AX?_iO<7+!^Nwof8(4>PH#r|?&G2cSux1}ta0*LkgN%w$e7@Kr znS{!Y95t%`ri?K4)QC&Dap5Dv!UhVNS8<%IHXH;+rDdc8wj16zI@XPA)APK+7qdj= zLDpBrdOzCF-^I=?t)njM`8jEi7)1w3(o0TNnmfls@<{GtjgLwnUH|sV-bU@#zWu4U zS|IJxF|MD45lo|eGTNX}z)!W-U){P_T~E)~IPIq@DOs6LHaKVED%{R)gKIfgE)voY%Gm|A)2vDcq9CB=<)x)6b6EDHLUE(R>}v2MS^l6 zL+-=B=0+}Pds<7_i&KM$OXY}$IXnsEL3|CyN~VvK1{`q?6Qs*JTa*2ks=}qp`9>^0 zw+rY$%s7X&t!eC>;#pFpzDFjybyQ7T`pQAbtCcrf1uF_OI5Pud&`_^JywV*@4=l2G#G-xy(Q-{=x zhN#dNq6aR{M@SiL*f3jq?E3j>(K*;GrX!Q-Do1362K5(uJ{Vc#*vt9AUV}5;2I`^+ zUi;gLhShv)4Xr8CCIYQNs(DbM3JlT46Iahlcggu)Y}I3o>R3rDu(CLe&9=hOMD`>5 zcgM6Y1fwXaHSOLN)CdAv1Sg$Et410Yue5`CCXfSWh;`*u4PF*(ai7-g45JTR8?gFg z(U46)iy#sh}T3=zNC+OH9T1fTPvcFEj#>k1L(w2mD#4XIl$SASY+6i45`|>ZM zO~{#T;`9N>pS^o31)PtahW!?t6Ke{Lo(Hy*n0D>b@DD{_-rNa8d)$L)t15zobV6}0Z_8i^23PSU^}T-%8^oTcF7 z{pFV!E)Ve=)f% zL}Yc2J6#3D@d0oSRCPUI(;^y~?xd+QHV$sv@RmtF2=k57Mma@p?&2-rB8A9X0G_Z}RoLWy3p8XKqYUV;k!-bd zWy$tEM+a2xu4LAS*!hu@B=3bu@&ps|$dkk(De&92lyB247Ad)r<)x2;k(BArL)ow| zS$%Yg!v`WDD#P&wAKo`^PV0tH=CAMsb#r$SpB!KT;z-nW(A%6NkQ(mUQ80?dxSABX zuo9B0tV9^iYvcB6kDyV|bo?7&l- zXE~kP34IL!@2AMAbgA@Kj3OF)4YjLQgc98Jq^T9Ta^UoZh*?Fcc9!4Bw zy4#pN`-V=TEtAaM$*{` z>zn|amHTKHo2nJGF8d3i6RqBOj#DkA>X*W4y)?o%8erKe)!T{t8dCW)wHN1*k}9Ba zsOp3vZDR}r48~6pKa&0x!92&A)}MT_Ku>@&V;s4=>cJs~Ot{ecfM!($4imPl6WmUpN<=lJU3neQv2J zx!6<1>Eh+a{ZI_KBBhs|bY9c>B-yfyInbLu+EJx55E?@VIq-xu!vw&JsY54<5Cyb9 zB~Fgh#EfEKB|6XW_%(#hP52rOB*ePW+;aRh(>)wvr76vA7O5{zwzBR5m}tKJfn*m% zLy4h73r0DleTPwMAQDx9g6a#Z-gv^4$h-_?oYMxPMGM~=Qvxs%U9>H{0-ij{0`gpT zvGmQ?c$=CQqVf+*dHR)aDzH;EPI@Vac-5Rsg1%4vTOCx;fSLJcx1HNeWv0R-3qJa;_)0CLY38RB8sgd1dgR|x4nz#i}?(Jpp*QN0d{SrGJPNM;;;n-MB6VR8Apqgn+5U8Gw$ zhi$a1PaZ*3@FYyk6RRCvwDT1pm|`~vgo1k^^7^qSh|JMiCyyGJQVk9VL7%@BdTQG~ zob(!gb}|`tWdT|AXt2zP&uegDLkYw!1bLfWgh#wR?UiRfh7`@5ie3OlsnTe}2zQ0p zT&`?-BO3EL3Nf3vGIE*Or+0=eWCcAbcFPDeBZ_dTO;H66f0CBaq_3?)YNMg!E=yEU zhjp&UBYCq(Tq)J~I1E{-{#@lcbIdcvBrhX7_kauRe#3L&T(sE?Fb%wAkOk!8<-66- zBA+PkdJ?WkrI<`-E;sT)at*ko4Mdm|vQR8QDx|TJc?4SK)C-#FrLpZ|lJ5a30@!oC zNvUTuzSfeXw3dV!MrSz;=ZJ*GV`Ph4IX`87=}1lcOk*FJW-2rGo4}BMLRDF2l-A3FMS3*O~=iw1VRY?kMN9LkSfvU$92rdm1v>D`HUfqEwiP$FFw zJ$J?+dU&XR&d?)`y3f3Lemvu@l9rMslB;4e_JlcSPz2d0wx{HdYPy(HScfDI3y*>_ zrn{-K(p^DpHyJt0SF;;&#O&;>*d zMzAp#gL$$ghGX>qPzaRJO{6RWcF-*f>Tkp1Oit*Zwccl0W2u#x_4pNu_IDd3PNq9N zp=yp3D<&jG`IjBA%Xf^+AMhJCCor3aDQz@$m~G2dGzf&}5ehl|4T{oR8Z7X0UL@}x z((N4eoKE>`0zU6gC(d#W(1VHY6Ud(jxYP3$SBV5A+2>embW==U2XhjWyhGKFIdHPe zip!kE@X%2fY+ZC^M|L{kWU)@f&vr?Ur(zTkQ8t(0wfm^mdjcd)5co=*A6Fr!Il9Mg z{o31kQeq}v*o3$1uLLYa<;s)w>qdY+$MpvT`~4Dx%}4J(-H4LvjXXi)?C@f``yv;B zUz|;{cR>_5g;Yr=mi>FauFx;{gge3!cD$5KupMu8yH3w!xRr@6>d{1I^Ee%iD7LsrvDSo2r~EbWyl(xpiGKv6~Nn} zE%V8ga-Sb#D=iXu>NJ6<_@V^URu-%8w@zH}biO4-n1ec#6%!DkWQ7h0gzMg9gFabP zFmK>n#w7*gwikPcPqjFNfUJll23Qml952^cGi)ZfO1 zso+FGFyzqgB{c#N*dOy1jq$_8c{$1>&gQ-~VjnnI!jRiUa7A+|V2-m3HL^k*O^g>3 zkdQ^1j8UAlv@(t02uhCl%$WqEZ_~3v(veEsr4Rv@l!X!6N;|%P*!PYZIBjN`cfvvWjx%XlviPSc1fZkcdN#a5y@e z9+id28n^SsJf9Z5vl6hEPar4=0DgzSC?RJG`*-n>Ypmd*rV&rEL9&>?kiZ#F53=uk z7gq4v#R{+NweLUJwk@*4Bf!Q(R(7Eq@VIF`V$Q>YwrjrKEUbYrK!r3^1Y7>-n^)Ft zZ7*QStQR)?&qZx?X06d>K|-tmdUa$Ydx3>S3x@UAyYIg2XJIA97PG8oLo#c6IXf=G z1lSe6C0M!0C3k>}i~>yVtX_+#MZ^pZocjcA;o~xz<}3qIB<~qJW?#x%CO@_p#*AL> z5?dSf(&!O@H*l&!JO??wAS@$WQt zyZku;)e(ymHr4(1%B20V*MWdVGbNe4!U<9ZgovtAloQIv5bYI1!L4}U$4C;A_11WH ztm;!D;hfW}Eu}H>$`2j5lt)R?#)r9xW8iWNpINwL#(WI{5X{X{sUpwGaEwWNKD~}W zU`9Tnvn#YE+2%7CL*h6dU}I_Tz4sQfDFd&zHngkned!<06d+bb5QIf7vijLNx9dIi0VD}&<4 zl7^uO#k%Ooj4aVG!yR#D_eYYGk9`Iz*Oa$Sv}G_>1{=^mBVh95{Kr=d;i$?h3E5(T z`i0O0fN3S&%uZ*LjsnN2C0Q8s1>q`q~a{nHy8G!sw{T z^&(cqjMUwhtpmafJ}_$iAv($Aw4N}Pu>>LqJi0&s5IBI<0twjDQ5(yD8V#pBCQ>HLvk_FmkBp(ViEq&s z<@YD`;erEl{$@N^?q6I4r<4lu72FS5X)W?2e8_ z2??X4h$lh~5h%3*oE2j%3Boc>BPDMU4YL>%jH1*Q6feO*>9ZtD zVQTiD>|bC*cQMVL2+y#3qogpvcTLAD{=^C`X&}fEM4_m*d_+wqGp>y~bS%qgi)8S* zF$E8~7FO^Fyxh{iK5%TD8Ta7Z*_>?=v0M|j%YsD=IkwPV9FY)$m8s21IRJvd(zjeq z%|Zm$6+&p+eV?O|6!0KtfPG!Wkc+Sou%cky6kz{sAwnA&5SEa&%O^fFCRXo|*UlDh zZ7j({#En})+sCHyjPcJ<*wip<2;F2x=vh;15Y?H)Uw3y~_)&?Cwh%3TEz^;MhFMf`PybCdnrC4P{ z0-atWA-k~yf(<-#8uho5grF_MQL`N*thI7MQ(RT?)Av|p3ZeEds98K92QiQs70H~H z`HJ=l=4EL{Ta~iel3J0r4j3auN=jcY;uIJkidUh-r4ir4dJ(gGbtfR|xn(CCMBGI}xrR_fF#3+_E~f zM9V;iM&F$rjU|Q)B&aDURAC~pyydh#M0_+xVQhs_s&z51mvQ~*EeLj-{8$0E!lr#S zWLYO8=(&u7(Da#z{i-sy4w!i^sXKWUe_?S3Z?gwosLBNqqx|Cl!t4K)LVAzCJGRpt zR>reqB8WYjr$k)}mdv4GgQtxnK#M^z&$joMyw2SULz zxqr{e_rm#BfOn2xf0|~P>F5+H87>jP9}gDC+L!GF4gk|5!KD#U;{c=`&R7Q*UKZR+ZA2i%452Xyj0t;b zTz2nRWgDjMrUt+vpGaSUA!NO3FR$9sxUO^`#~rzieaF^A793=1>lF5X71`y%sEQDF zq(fS^_l}yXhEtEj@LEwwpcnMHJmN0Zoe$!~Lk_LL(_$?A`GuiOE?5cQB_b7L%p`>- z*>oF$84j%o?NoO_s%W}<&Eux@`TQM)`okfe=sx>Ab!6`3&|D*o4 zFcPH|cv$6UT4X+Ilf&FY)<8}Y=+B0hEWoRHg6U|I5$}( z7~j%J6zPTdOho{%FILQFE3cN3(w^?)Kt(RFVu(-}yRSgr!B^#{z>W|+5JV=Eozd2g zuySzUT_AytytNAkJ9vm4l)%B-+Cc&C((VUqYnO_92M7CK%+&xF?+ur|00000NkvXX Hu0mjfZ^8VV