From fb968194d0da201d0aa4fb0ffe2dc7ed76aa983b Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 26 Jun 2023 21:24:26 +0900 Subject: [PATCH 001/250] Fix: typo at createUser object --- src/modules/auth/auth.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 165bdaee..1e4045f3 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -120,7 +120,7 @@ export class AuthService{ last_name: lastName, date_joined: new Date(), student_id: studentId, - refreshToken: refreshToken + refresh_token: refreshToken } return await this.userRepository.createUser(user) } From ee9053d67f91c4177e23649b848d92cbba630372 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Wed, 28 Jun 2023 19:45:20 +0900 Subject: [PATCH 002/250] Add: modules --- env/.env.example | 10 - src/app.module.ts | 23 +- src/modules/auth/auth.controller.ts | 57 ++-- src/modules/auth/auth.service.ts | 258 +++++++++--------- src/modules/courses/courses.controller.ts | 4 + src/modules/courses/courses.module.ts | 9 + src/modules/courses/courses.service.ts | 4 + src/modules/lectures/lectures.controller.ts | 4 + src/modules/lectures/lectures.module.ts | 9 + src/modules/lectures/lectures.service.ts | 4 + src/modules/notices/notices.controller.ts | 4 + src/modules/notices/notices.module.ts | 9 + src/modules/notices/notices.service.ts | 4 + src/modules/planners/planners.controller.ts | 4 + src/modules/planners/planners.module.ts | 9 + src/modules/planners/planners.service.ts | 4 + src/modules/rates/rates.controller.ts | 4 + src/modules/rates/rates.module.ts | 9 + src/modules/rates/rates.service.ts | 4 + src/modules/reviews/reviews.controller.ts | 4 + src/modules/reviews/reviews.module.ts | 9 + src/modules/reviews/reviews.service.ts | 4 + src/modules/semesters/semesters.controller.ts | 4 + src/modules/semesters/semesters.module.ts | 9 + src/modules/semesters/semesters.service.ts | 4 + src/modules/share/share.controller.ts | 4 + src/modules/share/share.module.ts | 9 + src/modules/share/share.service.ts | 4 + src/modules/status/status.controller.ts | 4 + src/modules/status/status.module.ts | 9 + src/modules/status/status.service.ts | 4 + src/modules/template/template.controller.ts | 4 + src/modules/template/template.module.ts | 9 + src/modules/template/template.service.ts | 4 + .../timetables/timetables.controller.ts | 4 + src/modules/timetables/timetables.module.ts | 9 + src/modules/timetables/timetables.service.ts | 4 + src/modules/tracks/tracks.controller.ts | 4 + src/modules/tracks/tracks.module.ts | 9 + src/modules/tracks/tracks.service.ts | 4 + src/modules/wishlist/wishlist.controller.ts | 4 + src/modules/wishlist/wishlist.module.ts | 7 + src/modules/wishlist/wishlist.service.ts | 4 + 43 files changed, 390 insertions(+), 177 deletions(-) delete mode 100644 env/.env.example create mode 100644 src/modules/courses/courses.controller.ts create mode 100644 src/modules/courses/courses.module.ts create mode 100644 src/modules/courses/courses.service.ts create mode 100644 src/modules/lectures/lectures.controller.ts create mode 100644 src/modules/lectures/lectures.module.ts create mode 100644 src/modules/lectures/lectures.service.ts create mode 100644 src/modules/notices/notices.controller.ts create mode 100644 src/modules/notices/notices.module.ts create mode 100644 src/modules/notices/notices.service.ts create mode 100644 src/modules/planners/planners.controller.ts create mode 100644 src/modules/planners/planners.module.ts create mode 100644 src/modules/planners/planners.service.ts create mode 100644 src/modules/rates/rates.controller.ts create mode 100644 src/modules/rates/rates.module.ts create mode 100644 src/modules/rates/rates.service.ts create mode 100644 src/modules/reviews/reviews.controller.ts create mode 100644 src/modules/reviews/reviews.module.ts create mode 100644 src/modules/reviews/reviews.service.ts create mode 100644 src/modules/semesters/semesters.controller.ts create mode 100644 src/modules/semesters/semesters.module.ts create mode 100644 src/modules/semesters/semesters.service.ts create mode 100644 src/modules/share/share.controller.ts create mode 100644 src/modules/share/share.module.ts create mode 100644 src/modules/share/share.service.ts create mode 100644 src/modules/status/status.controller.ts create mode 100644 src/modules/status/status.module.ts create mode 100644 src/modules/status/status.service.ts create mode 100644 src/modules/template/template.controller.ts create mode 100644 src/modules/template/template.module.ts create mode 100644 src/modules/template/template.service.ts create mode 100644 src/modules/timetables/timetables.controller.ts create mode 100644 src/modules/timetables/timetables.module.ts create mode 100644 src/modules/timetables/timetables.service.ts create mode 100644 src/modules/tracks/tracks.controller.ts create mode 100644 src/modules/tracks/tracks.module.ts create mode 100644 src/modules/tracks/tracks.service.ts create mode 100644 src/modules/wishlist/wishlist.controller.ts create mode 100644 src/modules/wishlist/wishlist.module.ts create mode 100644 src/modules/wishlist/wishlist.service.ts diff --git a/env/.env.example b/env/.env.example deleted file mode 100644 index bd719b3f..00000000 --- a/env/.env.example +++ /dev/null @@ -1,10 +0,0 @@ -NODE_ENV=example -DATABASE_URL=mysql://root:password@localhost:3306/main?connection_limit=20&pool_timeout=20 -SWAGGER_USER=user -SWAGGER_PASSWORD=otl-plus -JWT_SECRET= -EXPIRES_IN=3600 -REFRESH_EXPIRES_IN=2592000 -SSO_IS_BETA = false -SSO_CLIENT_ID = "" -SSO_SECRET_KEY = "" \ No newline at end of file diff --git a/src/app.module.ts b/src/app.module.ts index 4778d0af..b248af72 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,12 +1,12 @@ -import { Module } from "@nestjs/common"; -import { AppController } from "./app.controller"; -import { AppService } from "./app.service"; -import { PrismaModule } from "./prisma/prisma.module"; -import { APP_GUARD } from "@nestjs/core"; -import { JwtCookieGuard } from "./modules/auth/guard/jwt-cookie.guard"; -import { AuthModule } from "./modules/auth/auth.module"; -import { MockAuthGuard } from "./modules/auth/guard/mock-auth-guard"; -import { JwtService } from "@nestjs/jwt"; +import { Module } from '@nestjs/common'; +import { AppController } from './app.controller'; +import { AppService } from './app.service'; +import { PrismaModule } from './prisma/prisma.module'; +import { APP_GUARD } from '@nestjs/core'; +import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; +import { AuthModule } from './modules/auth/auth.module'; +import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; +import { JwtService } from '@nestjs/jwt'; @Module({ imports: [PrismaModule, AuthModule], @@ -14,12 +14,13 @@ import { JwtService } from "@nestjs/jwt"; providers: [ { provide: APP_GUARD, - useClass: process.env.NODE_ENV === 'production' ? JwtCookieGuard : MockAuthGuard, + useClass: + process.env.NODE_ENV === 'production' ? JwtCookieGuard : MockAuthGuard, }, JwtCookieGuard, MockAuthGuard, AppService, JwtService, - ] + ], }) export class AppModule {} diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 23651edf..0ecdd92a 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,21 +1,21 @@ -import { Controller, Get, Query, Req, Res, Session } from "@nestjs/common"; -import { AuthService } from "./auth.service"; -import { Response } from "express"; -import { Client } from "./utils/sparcs-sso"; -import settings from "../../settings"; -import { UserService } from "../user/user.service"; -import { Public } from "../../common/decorators/skip-auth.decorator"; -import { GetUser } from "../../common/decorators/get-user.decorator"; -import { session_userprofile } from "@prisma/client"; -import { SSOUser } from "../../common/interfaces/dto/auth/sso.dto"; +import { Controller, Get, Query, Req, Res, Session } from '@nestjs/common'; +import { AuthService } from './auth.service'; +import { Response } from 'express'; +import { Client } from './utils/sparcs-sso'; +import settings from '../../settings'; +import { UserService } from '../user/user.service'; +import { Public } from '../../common/decorators/skip-auth.decorator'; +import { GetUser } from '../../common/decorators/get-user.decorator'; +import { session_userprofile } from '@prisma/client'; +import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; -@Controller("session") +@Controller('session') export class AuthController { private readonly ssoClient; constructor( private readonly authService: AuthService, - private readonly userService: UserService + private readonly userService: UserService, ) { const ssoConfig = settings().getSsoConfig(); const ssoClient = new Client( @@ -26,7 +26,6 @@ export class AuthController { this.ssoClient = ssoClient; } - @Public() @Get('login') user_login( @@ -36,39 +35,40 @@ export class AuthController { @Res() res, ) { if (req.user) { - return res.redirect(next ?? "/"); + return res.redirect(next ?? '/'); } - req.session["next"] = next ?? "/"; + req.session['next'] = next ?? '/'; const { url, state } = this.ssoClient.get_login_params(); console.log(url, state); - req.session["sso_state"] = state; - if (social_login === "0") { - return res.redirect(url + "&social_enabled=0&show_disabled_button=0"); + req.session['sso_state'] = state; + if (social_login === '0') { + return res.redirect(url + '&social_enabled=0&show_disabled_button=0'); } return res.redirect(url); } @Public() - @Get("login/callback") + @Get('login/callback') async loginCallback( - @Query("state") state: string, - @Query("code") code: string, + @Query('state') state: string, + @Query('code') code: string, @Session() session: Record, - @Res() response: Response) { - const stateBefore = session["sso_state"]; + @Res() response: Response, + ) { + const stateBefore = session['sso_state']; if (!stateBefore || stateBefore != state) { - response.redirect("/error/invalid-login"); + response.redirect('/error/invalid-login'); } const ssoProfile: SSOUser = await this.ssoClient.get_user_info(code); const { accessToken, accessTokenOptions, refreshToken, - refreshTokenOptions + refreshTokenOptions, } = await this.authService.ssoLogin(ssoProfile); - response.cookie("accessToken", accessToken, accessTokenOptions); - response.cookie("refreshToken", refreshToken, refreshTokenOptions); + response.cookie('accessToken', accessToken, accessTokenOptions); + response.cookie('refreshToken', refreshToken, refreshTokenOptions); /* @Todo @@ -79,11 +79,10 @@ export class AuthController { @Todo save refreshToken in session_userprofile */ - const next_url = session["next"] ?? "/"; + const next_url = session['next'] ?? '/'; response.redirect(next_url); } - @Get('info') async getUserProfile(@GetUser() user: session_userprofile) { /* diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 1e4045f3..7c97b5f6 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -1,131 +1,135 @@ -import { PrismaService } from "../../prisma/prisma.service"; -import { Injectable } from "@nestjs/common"; -import { UserRepository } from "../../prisma/repositories/user.repository"; -import { Prisma, session_userprofile } from "@prisma/client"; -import { JwtService } from "@nestjs/jwt"; -import settings from "../../settings"; -import * as bcrypt from "bcrypt"; -import session from "express-session"; -import { SSOUser } from "../../common/interfaces/dto/auth/sso.dto"; -import { import_student_lectures } from "../../common/scholarDB/scripts"; +import { PrismaService } from '../../prisma/prisma.service'; +import { Injectable } from '@nestjs/common'; +import { UserRepository } from '../../prisma/repositories/user.repository'; +import { Prisma, session_userprofile } from '@prisma/client'; +import { JwtService } from '@nestjs/jwt'; +import settings from '../../settings'; +import * as bcrypt from 'bcrypt'; +import session from 'express-session'; +import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; +import { import_student_lectures } from '../../common/scholarDB/scripts'; @Injectable() -export class AuthService{ - constructor( - private readonly userRepository: UserRepository, - private readonly jwtService: JwtService, - ){} - - public async findBySid(sid: string){ - return this.userRepository.findBySid(sid); +export class AuthService { + constructor( + private readonly userRepository: UserRepository, + private readonly jwtService: JwtService, + ) {} + + public async findBySid(sid: string) { + return this.userRepository.findBySid(sid); + } + + public async ssoLogin(ssoProfile: SSOUser) { + const sid = ssoProfile.sid; + let user = await this.findBySid(sid); + + const kaistInfo = ssoProfile.kaist_info; + const studentId = kaistInfo.ku_std_no ?? ''; + + const { accessToken, ...accessTokenOptions } = + this.getCookieWithAccessToken(sid); + const { refreshToken, ...refreshTokenOptions } = + this.getCookieWithRefreshToken(sid); + + const salt = await bcrypt.genSalt(Number(process.env.saltRounds)); + const encryptedRefreshToken = await bcrypt.hash(refreshToken, salt); + + if (!user) { + user = await this.createUser( + sid, + ssoProfile['email'], + studentId, + ssoProfile['first_name'], + ssoProfile['last_name'], + encryptedRefreshToken, + ); + } else { + if (user.student_id != studentId) { + await import_student_lectures(studentId); + } + + const updateData = { + first_name: ssoProfile['first_name'], + last_name: ssoProfile['last_name'], + student_id: studentId, + refresh_token: encryptedRefreshToken, + }; + user = await this.updateUser(user.id, updateData); } - public async ssoLogin(ssoProfile: SSOUser){ - const sid = ssoProfile.sid; - let user = await this.findBySid(sid); - - const kaistInfo = ssoProfile.kaist_info; - const studentId = kaistInfo.ku_std_no ?? ''; - - - const { accessToken, ...accessTokenOptions } = - this.getCookieWithAccessToken(sid); - const { refreshToken, ...refreshTokenOptions } = - this.getCookieWithRefreshToken(sid); - - const salt = await bcrypt.genSalt(Number(process.env.saltRounds)); - const encryptedRefreshToken = await bcrypt.hash(refreshToken, salt); - - if (!user) { - user = await this.createUser( - sid, - ssoProfile['email'], - studentId, - ssoProfile['first_name'], - ssoProfile['last_name'], - encryptedRefreshToken, - ); - } else { - if (user.student_id != studentId) { - await import_student_lectures(studentId); - } - - const updateData = { - first_name: ssoProfile['first_name'], - last_name: ssoProfile['last_name'], - student_id: studentId, - refresh_token: encryptedRefreshToken - }; - user = await this.updateUser(user.id, updateData); - } - - - return { - accessToken, - accessTokenOptions, - refreshToken, - refreshTokenOptions, - } - - } - - public getCookieWithToken(sid: string){ - - } - - public getCookieWithAccessToken(sid: string) { - const payload = { - sid: sid - }; - - const jwtConfig = settings().getJwtConfig(); - const token = this.jwtService.sign(payload, { - secret: jwtConfig.secret, - expiresIn: jwtConfig.signOptions.expiresIn + 's', - }); - return { - accessToken: token, - path: '/', - httpOnly: true, - maxAge: Number(jwtConfig.signOptions.expiresIn) * 1000, - }; - } - - public getCookieWithRefreshToken(sid: string) { - const payload = { - sid: sid - }; - - const jwtConfig = settings().getJwtConfig(); - const refreshToken = this.jwtService.sign(payload, { - secret: jwtConfig.secret, - expiresIn: jwtConfig.signOptions.refreshExpiresIn + 's', - }); - return { - refreshToken: refreshToken, - path: '/', - httpOnly: true, - maxAge: Number(jwtConfig.signOptions.refreshExpiresIn) * 1000, - }; - } - - - - - async createUser(sid:string, email:string, studentId: string, firstName: string, lastName: string, refreshToken: string): Promise { - const user = { - sid: sid, - email: email, - first_name: firstName, - last_name: lastName, - date_joined: new Date(), - student_id: studentId, - refresh_token: refreshToken - } - return await this.userRepository.createUser(user) - } - - async updateUser(userId, user: Prisma.session_userprofileUpdateInput): Promise{ - return await this.userRepository.updateUser(userId, user); - } -} \ No newline at end of file + return { + accessToken, + accessTokenOptions, + refreshToken, + refreshTokenOptions, + }; + } + + public getCookieWithToken( + sid: string, + ) {} + + public getCookieWithAccessToken(sid: string) { + const payload = { + sid: sid, + }; + + const jwtConfig = settings().getJwtConfig(); + const token = this.jwtService.sign(payload, { + secret: jwtConfig.secret, + expiresIn: jwtConfig.signOptions.expiresIn + 's', + }); + return { + accessToken: token, + path: '/', + httpOnly: true, + maxAge: Number(jwtConfig.signOptions.expiresIn) * 1000, + }; + } + + public getCookieWithRefreshToken(sid: string) { + const payload = { + sid: sid, + }; + + const jwtConfig = settings().getJwtConfig(); + const refreshToken = this.jwtService.sign(payload, { + secret: jwtConfig.secret, + expiresIn: jwtConfig.signOptions.refreshExpiresIn + 's', + }); + return { + refreshToken: refreshToken, + path: '/', + httpOnly: true, + maxAge: Number(jwtConfig.signOptions.refreshExpiresIn) * 1000, + }; + } + + async createUser( + sid: string, + email: string, + studentId: string, + firstName: string, + lastName: string, + refreshToken: string, + ): Promise { + const user = { + sid: sid, + email: email, + first_name: firstName, + last_name: lastName, + date_joined: new Date(), + student_id: studentId, + refresh_token: refreshToken, + }; + return await this.userRepository.createUser(user); + } + + async updateUser( + userId, + user: Prisma.session_userprofileUpdateInput, + ): Promise { + return await this.userRepository.updateUser(userId, user); + } +} diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts new file mode 100644 index 00000000..569fbdc4 --- /dev/null +++ b/src/modules/courses/courses.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('courses') +export class CoursesController {} diff --git a/src/modules/courses/courses.module.ts b/src/modules/courses/courses.module.ts new file mode 100644 index 00000000..367e861b --- /dev/null +++ b/src/modules/courses/courses.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { CoursesController } from './courses.controller'; +import { CoursesService } from './courses.service'; + +@Module({ + controllers: [CoursesController], + providers: [CoursesService] +}) +export class CoursesModule {} diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts new file mode 100644 index 00000000..6bd25f32 --- /dev/null +++ b/src/modules/courses/courses.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class CoursesService {} diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts new file mode 100644 index 00000000..6fbedbc7 --- /dev/null +++ b/src/modules/lectures/lectures.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('lectures') +export class LecturesController {} diff --git a/src/modules/lectures/lectures.module.ts b/src/modules/lectures/lectures.module.ts new file mode 100644 index 00000000..8708d6c8 --- /dev/null +++ b/src/modules/lectures/lectures.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { LecturesController } from './lectures.controller'; +import { LecturesService } from './lectures.service'; + +@Module({ + controllers: [LecturesController], + providers: [LecturesService] +}) +export class LecturesModule {} diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts new file mode 100644 index 00000000..9fbb3077 --- /dev/null +++ b/src/modules/lectures/lectures.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class LecturesService {} diff --git a/src/modules/notices/notices.controller.ts b/src/modules/notices/notices.controller.ts new file mode 100644 index 00000000..782412b8 --- /dev/null +++ b/src/modules/notices/notices.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('notices') +export class NoticesController {} diff --git a/src/modules/notices/notices.module.ts b/src/modules/notices/notices.module.ts new file mode 100644 index 00000000..e2a29e08 --- /dev/null +++ b/src/modules/notices/notices.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { NoticesController } from './notices.controller'; +import { NoticesService } from './notices.service'; + +@Module({ + controllers: [NoticesController], + providers: [NoticesService] +}) +export class NoticesModule {} diff --git a/src/modules/notices/notices.service.ts b/src/modules/notices/notices.service.ts new file mode 100644 index 00000000..186a3be9 --- /dev/null +++ b/src/modules/notices/notices.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class NoticesService {} diff --git a/src/modules/planners/planners.controller.ts b/src/modules/planners/planners.controller.ts new file mode 100644 index 00000000..953148c5 --- /dev/null +++ b/src/modules/planners/planners.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('planners') +export class PlannersController {} diff --git a/src/modules/planners/planners.module.ts b/src/modules/planners/planners.module.ts new file mode 100644 index 00000000..9023d523 --- /dev/null +++ b/src/modules/planners/planners.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { PlannersController } from './planners.controller'; +import { PlannersService } from './planners.service'; + +@Module({ + controllers: [PlannersController], + providers: [PlannersService] +}) +export class PlannersModule {} diff --git a/src/modules/planners/planners.service.ts b/src/modules/planners/planners.service.ts new file mode 100644 index 00000000..19a289f1 --- /dev/null +++ b/src/modules/planners/planners.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class PlannersService {} diff --git a/src/modules/rates/rates.controller.ts b/src/modules/rates/rates.controller.ts new file mode 100644 index 00000000..01d34b0c --- /dev/null +++ b/src/modules/rates/rates.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('rates') +export class RatesController {} diff --git a/src/modules/rates/rates.module.ts b/src/modules/rates/rates.module.ts new file mode 100644 index 00000000..d654e473 --- /dev/null +++ b/src/modules/rates/rates.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { RatesController } from './rates.controller'; +import { RatesService } from './rates.service'; + +@Module({ + controllers: [RatesController], + providers: [RatesService] +}) +export class RatesModule {} diff --git a/src/modules/rates/rates.service.ts b/src/modules/rates/rates.service.ts new file mode 100644 index 00000000..c908c19d --- /dev/null +++ b/src/modules/rates/rates.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class RatesService {} diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts new file mode 100644 index 00000000..74a318b1 --- /dev/null +++ b/src/modules/reviews/reviews.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('reviews') +export class ReviewsController {} diff --git a/src/modules/reviews/reviews.module.ts b/src/modules/reviews/reviews.module.ts new file mode 100644 index 00000000..9d2b2968 --- /dev/null +++ b/src/modules/reviews/reviews.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ReviewsController } from './reviews.controller'; +import { ReviewsService } from './reviews.service'; + +@Module({ + controllers: [ReviewsController], + providers: [ReviewsService] +}) +export class ReviewsModule {} diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts new file mode 100644 index 00000000..99200567 --- /dev/null +++ b/src/modules/reviews/reviews.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ReviewsService {} diff --git a/src/modules/semesters/semesters.controller.ts b/src/modules/semesters/semesters.controller.ts new file mode 100644 index 00000000..57532d86 --- /dev/null +++ b/src/modules/semesters/semesters.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('semesters') +export class SemestersController {} diff --git a/src/modules/semesters/semesters.module.ts b/src/modules/semesters/semesters.module.ts new file mode 100644 index 00000000..795827ef --- /dev/null +++ b/src/modules/semesters/semesters.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { SemestersController } from './semesters.controller'; +import { SemestersService } from './semesters.service'; + +@Module({ + controllers: [SemestersController], + providers: [SemestersService] +}) +export class SemestersModule {} diff --git a/src/modules/semesters/semesters.service.ts b/src/modules/semesters/semesters.service.ts new file mode 100644 index 00000000..b4808882 --- /dev/null +++ b/src/modules/semesters/semesters.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class SemestersService {} diff --git a/src/modules/share/share.controller.ts b/src/modules/share/share.controller.ts new file mode 100644 index 00000000..b304478b --- /dev/null +++ b/src/modules/share/share.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('share') +export class ShareController {} diff --git a/src/modules/share/share.module.ts b/src/modules/share/share.module.ts new file mode 100644 index 00000000..0b021de5 --- /dev/null +++ b/src/modules/share/share.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ShareController } from './share.controller'; +import { ShareService } from './share.service'; + +@Module({ + controllers: [ShareController], + providers: [ShareService] +}) +export class ShareModule {} diff --git a/src/modules/share/share.service.ts b/src/modules/share/share.service.ts new file mode 100644 index 00000000..e55cb2d0 --- /dev/null +++ b/src/modules/share/share.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class ShareService {} diff --git a/src/modules/status/status.controller.ts b/src/modules/status/status.controller.ts new file mode 100644 index 00000000..cea0f7d3 --- /dev/null +++ b/src/modules/status/status.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('status') +export class StatusController {} diff --git a/src/modules/status/status.module.ts b/src/modules/status/status.module.ts new file mode 100644 index 00000000..44bc91b1 --- /dev/null +++ b/src/modules/status/status.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { StatusController } from './status.controller'; +import { StatusService } from './status.service'; + +@Module({ + controllers: [StatusController], + providers: [StatusService] +}) +export class StatusModule {} diff --git a/src/modules/status/status.service.ts b/src/modules/status/status.service.ts new file mode 100644 index 00000000..aebcee14 --- /dev/null +++ b/src/modules/status/status.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class StatusService {} diff --git a/src/modules/template/template.controller.ts b/src/modules/template/template.controller.ts new file mode 100644 index 00000000..a44f4104 --- /dev/null +++ b/src/modules/template/template.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('template') +export class TemplateController {} diff --git a/src/modules/template/template.module.ts b/src/modules/template/template.module.ts new file mode 100644 index 00000000..7efd03d8 --- /dev/null +++ b/src/modules/template/template.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TemplateController } from './template.controller'; +import { TemplateService } from './template.service'; + +@Module({ + controllers: [TemplateController], + providers: [TemplateService] +}) +export class TemplateModule {} diff --git a/src/modules/template/template.service.ts b/src/modules/template/template.service.ts new file mode 100644 index 00000000..f5c2f667 --- /dev/null +++ b/src/modules/template/template.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class TemplateService {} diff --git a/src/modules/timetables/timetables.controller.ts b/src/modules/timetables/timetables.controller.ts new file mode 100644 index 00000000..d078e4e7 --- /dev/null +++ b/src/modules/timetables/timetables.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('timetables') +export class TimetablesController {} diff --git a/src/modules/timetables/timetables.module.ts b/src/modules/timetables/timetables.module.ts new file mode 100644 index 00000000..1b710fcf --- /dev/null +++ b/src/modules/timetables/timetables.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TimetablesController } from './timetables.controller'; +import { TimetablesService } from './timetables.service'; + +@Module({ + controllers: [TimetablesController], + providers: [TimetablesService] +}) +export class TimetablesModule {} diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts new file mode 100644 index 00000000..9de46396 --- /dev/null +++ b/src/modules/timetables/timetables.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class TimetablesService {} diff --git a/src/modules/tracks/tracks.controller.ts b/src/modules/tracks/tracks.controller.ts new file mode 100644 index 00000000..743df993 --- /dev/null +++ b/src/modules/tracks/tracks.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('tracks') +export class TracksController {} diff --git a/src/modules/tracks/tracks.module.ts b/src/modules/tracks/tracks.module.ts new file mode 100644 index 00000000..9bc5af05 --- /dev/null +++ b/src/modules/tracks/tracks.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TracksController } from './tracks.controller'; +import { TracksService } from './tracks.service'; + +@Module({ + controllers: [TracksController], + providers: [TracksService], +}) +export class TracksModule {} diff --git a/src/modules/tracks/tracks.service.ts b/src/modules/tracks/tracks.service.ts new file mode 100644 index 00000000..193549e3 --- /dev/null +++ b/src/modules/tracks/tracks.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class TracksService {} diff --git a/src/modules/wishlist/wishlist.controller.ts b/src/modules/wishlist/wishlist.controller.ts new file mode 100644 index 00000000..c3b52991 --- /dev/null +++ b/src/modules/wishlist/wishlist.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('wishlist') +export class WishlistController {} diff --git a/src/modules/wishlist/wishlist.module.ts b/src/modules/wishlist/wishlist.module.ts new file mode 100644 index 00000000..f2f6e1d8 --- /dev/null +++ b/src/modules/wishlist/wishlist.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; +import { WishlistController } from './wishlist.controller'; + +@Module({ + controllers: [WishlistController] +}) +export class WishlistModule {} diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts new file mode 100644 index 00000000..e44d74d3 --- /dev/null +++ b/src/modules/wishlist/wishlist.service.ts @@ -0,0 +1,4 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class WishlistService {} From 10bd0c7a0aa9e11dab3173f8be6a20ceee00b69d Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 28 Jun 2023 20:06:04 +0900 Subject: [PATCH 003/250] Add: add repositories --- src/prisma/prisma.module.ts | 17 +++++++++++++---- src/prisma/repositories/course.repository.ts | 8 ++++++++ src/prisma/repositories/lecture.repository.ts | 8 ++++++++ src/prisma/repositories/review.repository.ts | 8 ++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 src/prisma/repositories/course.repository.ts create mode 100644 src/prisma/repositories/lecture.repository.ts create mode 100644 src/prisma/repositories/review.repository.ts diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index ec0ce329..131643af 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -1,8 +1,17 @@ -import { Module } from '@nestjs/common'; -import { PrismaService } from './prisma.service'; +import { Module } from "@nestjs/common"; +import { PrismaService } from "./prisma.service"; +import { UserRepository } from "./repositories/user.repository"; +import { LectureRepository } from "./repositories/lecture.repository"; +import { ReviewRepository } from "./repositories/review.repository"; @Module({ - providers: [PrismaService], - exports: [PrismaService], + providers: [PrismaService, + UserRepository, + LectureRepository, + ReviewRepository], + exports: [PrismaService, + UserRepository, + LectureRepository, + ReviewRepository] }) export class PrismaModule {} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts new file mode 100644 index 00000000..b5afc2cb --- /dev/null +++ b/src/prisma/repositories/course.repository.ts @@ -0,0 +1,8 @@ +import { Injectable } from "@nestjs/common"; +import { PrismaService } from "../prisma.service"; + +@Injectable() +export class CourseRepository{ + constructor(private readonly prisma: PrismaService){} + +} \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts new file mode 100644 index 00000000..b2f90ee6 --- /dev/null +++ b/src/prisma/repositories/lecture.repository.ts @@ -0,0 +1,8 @@ +import { Injectable } from "@nestjs/common"; +import { PrismaService } from "../prisma.service"; + +@Injectable() +export class LectureRepository{ + constructor(private readonly prisma: PrismaService){} + +} \ No newline at end of file diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts new file mode 100644 index 00000000..a2d1e90a --- /dev/null +++ b/src/prisma/repositories/review.repository.ts @@ -0,0 +1,8 @@ +import { Injectable } from "@nestjs/common"; +import { PrismaService } from "../prisma.service"; + +@Injectable() +export class ReviewRepository{ + constructor(private readonly prisma: PrismaService){} + +} \ No newline at end of file From 79393de08a7fb65dcfbc59a12500e6a82fd1f247 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 28 Jun 2023 22:38:01 +0900 Subject: [PATCH 004/250] Add: add serializer directory --- src/common/interfaces/serializer/user.serializer.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/common/interfaces/serializer/user.serializer.ts diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts new file mode 100644 index 00000000..e69de29b From 7de1a1d70e05fb512ad011a8e0556e6d2eaea8ff Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 28 Jun 2023 23:15:04 +0900 Subject: [PATCH 005/250] Add: implementing serializer --- .../department/department.response.dto.ts | 0 .../interfaces/dto/user/user.response.dto.ts | 15 ++++++++--- .../interfaces/serializer/user.serializer.ts | 26 +++++++++++++++++++ src/common/utils/method.utils.ts | 2 ++ src/modules/auth/auth.controller.ts | 10 +++---- src/prisma/schema.prisma | 2 ++ 6 files changed, 45 insertions(+), 10 deletions(-) rename src/common/interfaces/dto/{ => user}/department/department.response.dto.ts (100%) diff --git a/src/common/interfaces/dto/department/department.response.dto.ts b/src/common/interfaces/dto/user/department/department.response.dto.ts similarity index 100% rename from src/common/interfaces/dto/department/department.response.dto.ts rename to src/common/interfaces/dto/user/department/department.response.dto.ts diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index ee593038..5621714f 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -1,3 +1,6 @@ +import { + review_review, session_userprofile_favorite_departments, + session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; export interface ProfileDto { id: string; @@ -5,7 +8,11 @@ export interface ProfileDto { student_id: string; firstName: string; lastName: string; - /* - @todo: add more fields for relations - */ -} \ No newline at end of file + department: subject_department + majors: subject_department[] + departments: subject_department[] + favorite_departments: session_userprofile_favorite_departments[] + review_writeable_lectures: session_userprofile_taken_lectures[] + my_timetable_lectures: session_userprofile_taken_lectures[] + reviews: review_review[] +} diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index e69de29b..935e28af 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -0,0 +1,26 @@ +import { Prisma, session_userprofile } from "@prisma/client"; +import { PrismaService } from "../../../prisma/prisma.service"; + +export async function loadUser(user: session_userprofile, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService) { + const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { + if(user[key] && value) { + value = false; + }else if(user[key] && !value) { + value = false + } + else if(!user[key] && value) { + value = true + }else if(!user[key] && !value) { + value = false + } + }) + const result = await prismaService.session_userprofile.findFirst({ + where: { sid: user.sid }, + include: userLoadOptions, + }) + return result; +} + +export function toProfileDto(user: session_userprofile) { + +} \ No newline at end of file diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 7c7cbf84..ca616c3f 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,3 +15,5 @@ export function normalizeArray( return normalizeObj } + + diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 0ecdd92a..ecf5d7d2 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -8,6 +8,7 @@ import { Public } from '../../common/decorators/skip-auth.decorator'; import { GetUser } from '../../common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; +import { ProfileDto } from "../../common/interfaces/dto/user/user.response.dto"; @Controller('session') export class AuthController { @@ -75,20 +76,17 @@ export class AuthController { call import_student_lectures(studentId) */ - /* - @Todo - save refreshToken in session_userprofile - */ const next_url = session['next'] ?? '/'; response.redirect(next_url); } @Get('info') - async getUserProfile(@GetUser() user: session_userprofile) { + async getUserProfile(@GetUser() user: session_userprofile): ProfileDto { /* @Todo implement userSerializer, before that, we'd like to architect the dto types */ - return user; + + const user; } } diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index c13e9c32..1216bc28 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -257,6 +257,7 @@ model session_userprofile { student_id String @db.VarChar(10) sid String @db.VarChar(30) department_id Int? + department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) email String? @db.VarChar(255) date_joined DateTime @db.DateTime(0) first_name String @db.VarChar(30) @@ -420,6 +421,7 @@ model subject_department { graduation_majortrack graduation_majortrack[] main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] planner_arbitraryplanneritem planner_arbitraryplanneritem[] + session_userprofile session_userprofile[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] From 2651da5ce46272c0f7a70d6911465776e4dd456e Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Thu, 29 Jun 2023 00:16:28 +0900 Subject: [PATCH 006/250] Add: reType the select result of user --- src/common/interfaces/serializer/user.serializer.ts | 9 +++++++-- src/common/schemaTypes/types.ts | 5 +++++ src/common/utils/method.utils.ts | 10 ++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/common/schemaTypes/types.ts diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index 935e28af..a1296dc8 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -1,7 +1,11 @@ import { Prisma, session_userprofile } from "@prisma/client"; import { PrismaService } from "../../../prisma/prisma.service"; +import { type } from "os"; +import { Union } from "../../utils/method.utils"; +import { userSelectResultType } from "../../schemaTypes/types"; + +export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { -export async function loadUser(user: session_userprofile, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService) { const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { if(user[key] && value) { value = false; @@ -14,7 +18,8 @@ export async function loadUser(user: session_userprofile, userLoadOptions: Prism value = false } }) - const result = await prismaService.session_userprofile.findFirst({ + + const result: userSelectResultType = await prismaService.session_userprofile.findFirst({ where: { sid: user.sid }, include: userLoadOptions, }) diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts new file mode 100644 index 00000000..16e0c603 --- /dev/null +++ b/src/common/schemaTypes/types.ts @@ -0,0 +1,5 @@ +import { Prisma } from "@prisma/client"; + +export type userSelectResultType = Prisma.session_userprofileGetPayload<{ + include: Prisma.session_userprofileInclude +}> diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index ca616c3f..e6d37fe1 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,5 +15,15 @@ export function normalizeArray( return normalizeObj } +type ValueType = string | number | boolean +export type Union< + T extends { [key: string]: ValueType } | ReadonlyArray, + > = T extends ReadonlyArray + ? T[number] + : T extends { [key: string]: infer U } + ? U + : never + + From b72a09d459fbbd62e3b48cffe3fed1ba7950719f Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:18:05 +0900 Subject: [PATCH 007/250] Add: add FKs to userprofile and other tables --- package.json | 2 ++ .../interfaces/serializer/user.serializer.ts | 36 ++++++++++++++++--- src/common/schemaTypes/types.ts | 4 +++ .../20230703113703_create_f_ks/migration.sql | 8 +++++ .../migration.sql | 8 +++++ src/prisma/schema.prisma | 10 ++++++ 6 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/prisma/migrations/20230703113703_create_f_ks/migration.sql create mode 100644 src/prisma/migrations/20230703135605_add_fk_writer/migration.sql diff --git a/package.json b/package.json index af073b17..8377de65 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,8 @@ "prisma-generate": "npx prisma generate --schema src/prisma/schema.prisma", "prisma-status:local": "dotenv -e env/.env.local npx prisma migrate status", "prisma-status:dev": "dotenv -e env/.env.dev npx prisma migrate status", + "prisma-resolve:local": "dotenv -e env/.env.local npx prisma migrate resolve", + "prisma-resolve:dev": "dotenv -e env/.env.dev npx prisma migrate resolve", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index a1296dc8..63083ea7 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -1,7 +1,5 @@ -import { Prisma, session_userprofile } from "@prisma/client"; +import { Prisma, review_review, session_userprofile, subject_department } from "@prisma/client"; import { PrismaService } from "../../../prisma/prisma.service"; -import { type } from "os"; -import { Union } from "../../utils/method.utils"; import { userSelectResultType } from "../../schemaTypes/types"; export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { @@ -26,6 +24,36 @@ export async function loadUser(user:session_userprofile | userSelectResultType, return result; } -export function toProfileDto(user: session_userprofile) { +export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { + + const majors: subject_department[] = await prisma.session_userprofile.findMany({ + include: { + session_userprofile_majors: { + include: { + subject_department: true + } + }, + favorite_departments: { + include:{ + department: true + } + } + } + }); + + const reviewList: review_review[] = await prisma.review_review.findMany({ + + }) + + + return { + id: user.id, + email: user.email, + student_id: user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: user.department, + majors: user.session_userprofile_majors. + }; } \ No newline at end of file diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 16e0c603..158b8b0c 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -3,3 +3,7 @@ import { Prisma } from "@prisma/client"; export type userSelectResultType = Prisma.session_userprofileGetPayload<{ include: Prisma.session_userprofileInclude }> + +export type courseSelectResultType = Prisma.subject_courseGetPayload<{ + include: Prisma.subject_courseInclude +}> diff --git a/src/prisma/migrations/20230703113703_create_f_ks/migration.sql b/src/prisma/migrations/20230703113703_create_f_ks/migration.sql new file mode 100644 index 00000000..d49cd192 --- /dev/null +++ b/src/prisma/migrations/20230703113703_create_f_ks/migration.sql @@ -0,0 +1,8 @@ +-- AddForeignKey +ALTER TABLE `session_userprofile` ADD CONSTRAINT `session_userprofile_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_favorite_departments` ADD CONSTRAINT `session_userprofile_favorite_departments_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_favorite_departments` ADD CONSTRAINT `session_userprofile_favorite_departments_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql b/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql new file mode 100644 index 00000000..1bd255dd --- /dev/null +++ b/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql @@ -0,0 +1,8 @@ +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_writer_id_fkey` FOREIGN KEY (`writer_id`) REFERENCES `session_userprofile`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_taken_lectures` ADD CONSTRAINT `session_userprofile_taken_lectures_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_taken_lectures` ADD CONSTRAINT `session_userprofile_taken_lectures_lecture_id_fkey` FOREIGN KEY (`lecture_id`) REFERENCES `subject_lecture`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 1216bc28..29cea375 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -230,6 +230,7 @@ model review_review { load Int @db.SmallInt speech Int @db.SmallInt writer_id Int? + writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) writer_label String @db.VarChar(200) updated_datetime DateTime @db.DateTime(0) like Int @@ -270,16 +271,21 @@ model session_userprofile { session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] + favorite_departments session_userprofile_favorite_departments[] subject_courseuser subject_courseuser[] + taken_lectures session_userprofile_taken_lectures[] support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? + reviews review_review[] } model session_userprofile_favorite_departments { id Int @id @default(autoincrement()) userprofile_id Int + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) department_id Int + department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, department_id], map: "userprofile_id") } @@ -320,7 +326,9 @@ model session_userprofile_specialized_major { model session_userprofile_taken_lectures { id Int @id @default(autoincrement()) userprofile_id Int + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) lecture_id Int + lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, lecture_id], map: "userprofile_id") } @@ -422,6 +430,7 @@ model subject_department { main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] planner_arbitraryplanneritem planner_arbitraryplanneritem[] session_userprofile session_userprofile[] + session_userprofile_favorite_departments session_userprofile_favorite_departments[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] @@ -475,6 +484,7 @@ model subject_lecture { planner_takenplanneritem planner_takenplanneritem[] subject_classtime subject_classtime[] subject_examtime subject_examtime[] + students session_userprofile_taken_lectures[] timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] From e41f74526b948a904b43070b43eaeac096ba6939 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:35:39 +0900 Subject: [PATCH 008/250] Add: complete implementing session/info --- src/common/interfaces/constants/lecture.ts | 8 +++ .../interfaces/dto/user/user.response.dto.ts | 2 +- .../interfaces/serializer/user.serializer.ts | 4 +- src/common/schemaTypes/types.ts | 4 ++ src/modules/auth/auth.controller.ts | 6 +- src/modules/user/user.service.ts | 45 +++++++++++- .../repositories/department.repository.ts | 57 +++++++++++++++ src/prisma/repositories/lecture.repository.ts | 69 ++++++++++++++++++- src/prisma/repositories/review.repository.ts | 8 +++ 9 files changed, 194 insertions(+), 9 deletions(-) create mode 100644 src/common/interfaces/constants/lecture.ts create mode 100644 src/prisma/repositories/department.repository.ts diff --git a/src/common/interfaces/constants/lecture.ts b/src/common/interfaces/constants/lecture.ts new file mode 100644 index 00000000..d75c12c8 --- /dev/null +++ b/src/common/interfaces/constants/lecture.ts @@ -0,0 +1,8 @@ +import { Union } from "../../utils/method.utils"; + +export const ResearchLecture = { + IndividualStudy: "Individual Study", + UnderThesisStudy: "Thesis Study(Undergraduate)", + ThesisResearch: "Thesis Research(MA/phD)" +} +export type ResearchLecture = Union \ No newline at end of file diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index 5621714f..cebedda3 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -3,7 +3,7 @@ import { session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; export interface ProfileDto { - id: string; + id: number; email: string; student_id: string; firstName: string; diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index 63083ea7..a08296ef 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -27,7 +27,7 @@ export async function loadUser(user:session_userprofile | userSelectResultType, export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - const majors: subject_department[] = await prisma.session_userprofile.findMany({ + const majors = await prisma.session_userprofile.findMany({ include: { session_userprofile_majors: { include: { @@ -38,7 +38,7 @@ export async function toProfileDto(user: userSelectResultType, prisma: PrismaSer include:{ department: true } - } + }, } }); diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 158b8b0c..e03f69af 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -7,3 +7,7 @@ export type userSelectResultType = Prisma.session_userprofileGetPayload<{ export type courseSelectResultType = Prisma.subject_courseGetPayload<{ include: Prisma.subject_courseInclude }> + +export type lectureSelectResultType = Prisma.subject_lectureGetPayload<{ + include: Prisma.subject_lectureInclude +}> diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index ecf5d7d2..6ae3d0cc 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -81,12 +81,12 @@ export class AuthController { } @Get('info') - async getUserProfile(@GetUser() user: session_userprofile): ProfileDto { + async getUserProfile(@GetUser() user: session_userprofile): Promise { /* @Todo implement userSerializer, before that, we'd like to architect the dto types */ - - const user; + const profile = await this.userService.getProfile(user); + return profile; } } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index cabf448d..5c51e0fc 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,9 +1,20 @@ import { UserRepository } from "../../prisma/repositories/user.repository"; import { Injectable, NotFoundException } from "@nestjs/common"; +import { LectureRepository } from "../../prisma/repositories/lecture.repository"; +import { session_userprofile, subject_department } from "@prisma/client"; +import { DepartmentRepository } from "../../prisma/repositories/department.repository"; +import { normalizeArray } from "../../common/utils/method.utils"; +import { ResearchLecture } from "../../common/interfaces/constants/lecture"; +import { ReviewRepository } from "../../prisma/repositories/review.repository"; @Injectable() export class UserService { - constructor(private readonly userRepository: UserRepository) { + constructor( + private readonly userRepository: UserRepository, + private readonly lectureRepository: LectureRepository, + private readonly departmentRepository: DepartmentRepository, + private readonly reviewRepository: ReviewRepository, + ) { } public async findBySid(sid: string){ @@ -12,4 +23,36 @@ export class UserService { throw new NotFoundException(`Can't find user with sid: ${sid}`); } } + + public async getProfile(user: session_userprofile){ + const promises = []; + const departmentPromise = this.departmentRepository.getDepartmentOfUser(user); + const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user); + const majorsPromise = this.departmentRepository.getMajors(user); + const minorsPromise = this.departmentRepository.getMinors(user); + const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user); + const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(new Date()); + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user); + const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) + promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); + const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); + const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; + const researchLectures = Object.values(ResearchLecture); + const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); + + return { + id: user.id, + email: user.email, + student_id : user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: department ?? null, + majors: majors, + departments: departments, + favorite_departments: favoriteDepartments, + review_writeable_lectures: reviewWritableLectures, + my_timetable_lectures: timeTableLectures, + reviews: writtenReviews + } + } } \ No newline at end of file diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts new file mode 100644 index 00000000..4a424dc6 --- /dev/null +++ b/src/prisma/repositories/department.repository.ts @@ -0,0 +1,57 @@ +import { PrismaService } from "../prisma.service"; +import { session_userprofile, subject_department } from "@prisma/client"; +import session from "express-session"; + + +export class DepartmentRepository{ + constructor(private readonly prisma: PrismaService) { + } + + async getDepartmentOfUser(user: session_userprofile): Promise { + const departmentId = user.department_id; + const department = await this.prisma.subject_department.findUnique({ + where: { id: departmentId } + }); + return department; + } + + async getFavoriteDepartments(user: session_userprofile): Promise{ + const favoriteDepartments = (await this.prisma.session_userprofile_favorite_departments.findMany({ + where: { userprofile_id: user.id }, + include:{ + department: true + } + })).map((favoriteDepartment) => favoriteDepartment.department); + return favoriteDepartments; + } + + async getMajors(user: session_userprofile): Promise{ + const majors = (await this.prisma.session_userprofile_majors.findMany({ + where: { userprofile_id: user.id }, + include:{ + subject_department: true + } + })).map((major) => major.subject_department); + return majors; + } + + async getMinors(user: session_userprofile): Promise{ + const minors = (await this.prisma.session_userprofile_minors.findMany({ + where: { userprofile_id: user.id }, + include:{ + subject_department: true + } + })).map((minor) => minor.subject_department); + return minors; + } + + async getSpecializedMajors(user: session_userprofile): Promise{ + const specializedMajors = (await this.prisma.session_userprofile_specialized_major.findMany({ + where: {userprofile_id: user.id}, + include:{ + subject_department: true + } + })).map((specializedMajor) => specializedMajor.subject_department); + return specializedMajors; + } +} \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index b2f90ee6..2c6ebb49 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,8 +1,73 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; +import { lectureSelectResultType } from "../../common/schemaTypes/types"; @Injectable() -export class LectureRepository{ - constructor(private readonly prisma: PrismaService){} +export class LectureRepository { + constructor(private readonly prisma: PrismaService) { + } + + async findReviewWritableLectures(date?: Date): Promise { + let currDate; + if (!date) { + currDate = Date.now(); + } else { + currDate = date + } + const notWritableSemesters = await this.prisma.subject_semester.findMany({ + where: { + OR: [ + { + courseAddDropPeriodEnd: { + gte: currDate + }, + }, + { + beginning: { + gte: currDate + } + } + ] + } + }); + + const notWritableYearAndSemester = notWritableSemesters.map((semester) => { + return { + semester: semester.semester, + year: semester.year + } + }) + + const lectures = await this.prisma.subject_lecture.findMany({ + where: { + AND: notWritableYearAndSemester + } + }) + + return lectures; + } + + getResearchLectureQuery(): Prisma.subject_lectureWhereInput { + return { + type_en: { + in: ["Individual Study", "Thesis Study(Undergraduate)", + "Thesis Research(MA/phD)"] + } + } + } + + async getTakenLectures(user: session_userprofile): Promise { + const lectures: subject_lecture[] = (await this.prisma.session_userprofile_taken_lectures.findMany({ + where: { + userprofile_id: user.id + }, + include: { + lecture: true + } + })).map((takenLecture) => takenLecture.lecture); + + return lectures; + } } \ No newline at end of file diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index a2d1e90a..8d761286 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,8 +1,16 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { review_review, session_userprofile, subject_department } from "@prisma/client"; @Injectable() export class ReviewRepository{ constructor(private readonly prisma: PrismaService){} + async findReviewByUser(user: session_userprofile): Promise{ + const reviews = await this.prisma.review_review.findMany({ + where: { writer_id: user.id }, + }) + return reviews; + } + } \ No newline at end of file From b8e1ba5b79be2d8eac09762045d1c30dfa5bc517 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:36:49 +0900 Subject: [PATCH 009/250] Add: remove redundant functions --- .../interfaces/serializer/user.serializer.ts | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index a08296ef..129bb629 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -26,34 +26,4 @@ export async function loadUser(user:session_userprofile | userSelectResultType, export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - - const majors = await prisma.session_userprofile.findMany({ - include: { - session_userprofile_majors: { - include: { - subject_department: true - } - }, - favorite_departments: { - include:{ - department: true - } - }, - } - }); - - const reviewList: review_review[] = await prisma.review_review.findMany({ - - }) - - - return { - id: user.id, - email: user.email, - student_id: user.student_id, - firstName: user.first_name, - lastName: user.last_name, - department: user.department, - majors: user.session_userprofile_majors. - }; } \ No newline at end of file From 9640d21e4df0718c363fa2ba50bf560db47df170 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:43:18 +0900 Subject: [PATCH 010/250] Chore: Add DepartmentRepositiory to PrismaModule --- src/prisma/prisma.module.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 131643af..3b4a5868 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -3,15 +3,20 @@ import { PrismaService } from "./prisma.service"; import { UserRepository } from "./repositories/user.repository"; import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewRepository } from "./repositories/review.repository"; +import { DepartmentRepository } from "./repositories/department.repository"; @Module({ providers: [PrismaService, UserRepository, LectureRepository, - ReviewRepository], + ReviewRepository, + DepartmentRepository, + ], exports: [PrismaService, UserRepository, LectureRepository, - ReviewRepository] + ReviewRepository, + DepartmentRepository, + ] }) export class PrismaModule {} From f90ca6003081d1958ef1ce3b88b51ad5c448a25d Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:47:08 +0900 Subject: [PATCH 011/250] Chore: remove redundant console.log --- src/modules/auth/auth.controller.ts | 1 - src/modules/auth/guard/mock-auth-guard.ts | 1 - src/modules/auth/strategy/jwt-cookie.strategy.ts | 1 - src/modules/auth/utils/sparcs-sso.ts | 2 -- 4 files changed, 5 deletions(-) diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 6ae3d0cc..4f5ae6a9 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -40,7 +40,6 @@ export class AuthController { } req.session['next'] = next ?? '/'; const { url, state } = this.ssoClient.get_login_params(); - console.log(url, state); req.session['sso_state'] = state; if (social_login === '0') { return res.redirect(url + '&social_enabled=0&show_disabled_button=0'); diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index 4a823c2c..aec54960 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -43,7 +43,6 @@ export class MockAuthGuard implements CanActivate{ secret: settings().getJwtConfig().secret } ); - console.log("payload", payload); const user = this.authService.findBySid(payload.sid); request["user"] = user; return true; diff --git a/src/modules/auth/strategy/jwt-cookie.strategy.ts b/src/modules/auth/strategy/jwt-cookie.strategy.ts index 74460201..f477a1ac 100644 --- a/src/modules/auth/strategy/jwt-cookie.strategy.ts +++ b/src/modules/auth/strategy/jwt-cookie.strategy.ts @@ -32,7 +32,6 @@ export class JwtCookieStrategy extends PassportStrategy( } async validate(payload) { - console.log(payload); return this.authService.findBySid(payload.sid); } } diff --git a/src/modules/auth/utils/sparcs-sso.ts b/src/modules/auth/utils/sparcs-sso.ts index 9da89446..af91143a 100644 --- a/src/modules/auth/utils/sparcs-sso.ts +++ b/src/modules/auth/utils/sparcs-sso.ts @@ -44,8 +44,6 @@ export class Client { :param secret_key: your secret key :param is_beta: true iff you want to use SPARCS SSO beta server :param server_addr: SPARCS SSO server addr (only for testing)*/ - console.log(is_beta) - console.log(is_beta ? true : false); this.DOMAIN = is_beta ? this.BETA_DOMAIN : this.SERVER_DOMAIN; this.DOMAIN = server_addr || this.DOMAIN; From fd1a3f7ed27a6e6b3588beec2b4820b6f6baaa99 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 22:08:27 +0900 Subject: [PATCH 012/250] Chore: make departmentRepository injectable --- src/bootstrap/bootstrap.ts | 2 +- src/modules/auth/auth.controller.ts | 1 + src/prisma/repositories/department.repository.ts | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index cb769cea..f77438de 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -65,7 +65,7 @@ async function bootstrap() { const prismaService = app.get(PrismaService); await prismaService.enableShutdownHooks(app) - return app.listen(3000); + return app.listen(8080); } bootstrap() diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 4f5ae6a9..be792e70 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -85,6 +85,7 @@ export class AuthController { @Todo implement userSerializer, before that, we'd like to architect the dto types */ + console.log(user); const profile = await this.userService.getProfile(user); return profile; } diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index 4a424dc6..fdffdcc1 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -1,8 +1,9 @@ import { PrismaService } from "../prisma.service"; import { session_userprofile, subject_department } from "@prisma/client"; import session from "express-session"; +import { Injectable } from "@nestjs/common"; - +@Injectable() export class DepartmentRepository{ constructor(private readonly prisma: PrismaService) { } From ee2a7edef246315efcbcfcc5d05741b831eea785 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 23:28:57 +0900 Subject: [PATCH 013/250] Add: complete implementing --- src/bootstrap/bootstrap.ts | 3 +- src/common/utils/method.utils.ts | 20 ++++++++ src/modules/auth/auth.controller.ts | 1 - src/modules/user/user.service.ts | 51 ++++++++++++++++--- .../repositories/department.repository.ts | 3 +- src/prisma/repositories/lecture.repository.ts | 31 +++++++---- src/settings.ts | 16 +++++- test/session/session.spec.ts | 44 ++++++++++++++++ 8 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 test/session/session.spec.ts diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index f77438de..50b2738f 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -11,6 +11,7 @@ import cookieParser from "cookie-parser"; import session from "express-session"; import { MockAuthGuard } from "../modules/auth/guard/mock-auth-guard"; import { JwtCookieGuard } from "../modules/auth/guard/jwt-cookie.guard"; +import settings from "../settings"; let cachedServer: Server; @@ -22,7 +23,7 @@ async function bootstrap() { app.enableVersioning({ type: VersioningType.URI }); - app.enableCors(); + app.enableCors(settings().getCorsConfig()); app.useGlobalPipes( new ValidationPipe({ whitelist: true, diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index e6d37fe1..5615d677 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,6 +15,26 @@ export function normalizeArray( return normalizeObj } +export function groupBy( + arr: T[], + selector: (item: T) => string | number | null = (item: any) => item.id, +) { + const map: Record = {} + + arr.forEach(data => { + const key = selector(data) + if (key !== null) { + if (map[key]) { + map[key]!.push(data) + } else { + map[key] = [data] + } + } + }) + + return map +} + type ValueType = string | number | boolean export type Union< T extends { [key: string]: ValueType } | ReadonlyArray, diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index be792e70..4f5ae6a9 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -85,7 +85,6 @@ export class AuthController { @Todo implement userSerializer, before that, we'd like to architect the dto types */ - console.log(user); const profile = await this.userService.getProfile(user); return profile; } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 5c51e0fc..5ab5e859 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -26,16 +26,51 @@ export class UserService { public async getProfile(user: session_userprofile){ const promises = []; - const departmentPromise = this.departmentRepository.getDepartmentOfUser(user); - const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user); - const majorsPromise = this.departmentRepository.getMajors(user); - const minorsPromise = this.departmentRepository.getMinors(user); - const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user); - const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(new Date()); - const takenLecturesPromise = this.lectureRepository.getTakenLectures(user); - const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) + console.time('querying') + const startTime = new Date(); + const departmentPromise = this.departmentRepository.getDepartmentOfUser(user).then((department) => { + const endTime = new Date(); + console.log('querying department took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user).then((department) => { + const endTime = new Date(); + console.log('querying favorite department took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const majorsPromise = this.departmentRepository.getMajors(user).then((department) => { + const endTime = new Date(); + console.log('querying majors took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const minorsPromise = this.departmentRepository.getMinors(user).then((department) => { + const endTime = new Date(); + console.log('querying minors took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user).then((department) => { + const endTime = new Date(); + console.log('querying specializedMajors took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()).then((department) => { + const endTime = new Date(); + console.log('querying reviewWritableLectures took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user).then((department) => { + const endTime = new Date(); + console.log('querying takenLectures took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user).then((department) => { + const endTime = new Date(); + console.log('querying writtenReview took: ', endTime.getTime() - startTime.getTime()); + return department; + }) promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); + console.timeEnd('querying') const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; const researchLectures = Object.values(ResearchLecture); const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index fdffdcc1..c11ac9a0 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -9,7 +9,8 @@ export class DepartmentRepository{ } async getDepartmentOfUser(user: session_userprofile): Promise { - const departmentId = user.department_id; + const departmentId = user.department_id + if(!departmentId) return null; const department = await this.prisma.subject_department.findUnique({ where: { id: departmentId } }); diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 2c6ebb49..33826c1a 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; import { lectureSelectResultType } from "../../common/schemaTypes/types"; +import { groupBy } from "../../common/utils/method.utils"; @Injectable() export class LectureRepository { @@ -9,7 +10,7 @@ export class LectureRepository { } - async findReviewWritableLectures(date?: Date): Promise { + async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { let currDate; if (!date) { currDate = Date.now(); @@ -32,21 +33,33 @@ export class LectureRepository { ] } }); - - const notWritableYearAndSemester = notWritableSemesters.map((semester) => { + console.log(notWritableSemesters); + const notWritableYearAndSemester = groupBy(notWritableSemesters.map((semester) => { return { semester: semester.semester, year: semester.year } - }) + }),(subject_semester) => subject_semester.year) - const lectures = await this.prisma.subject_lecture.findMany({ - where: { - AND: notWritableYearAndSemester - } + const notWritableYearAndSemesterMap: Record> = null; + for (const key in notWritableYearAndSemester) { + const objects = notWritableYearAndSemester[key]; + const mapObjects = groupBy(objects); + notWritableYearAndSemesterMap[key] = mapObjects; + } + + const takenLectures = await this.getTakenLectures(user); + const reviewWritableLectures = takenLectures.filter((lecture) => { + return notWritableYearAndSemesterMap[lecture.year][lecture.semester] ? true: false }) - return lectures; + // const lectures = await this.prisma.subject_lecture.findMany({ + // where: { + // AND: notWritableYearAndSemester + // } + // }) + + return reviewWritableLectures; } getResearchLectureQuery(): Prisma.subject_lectureWhereInput { diff --git a/src/settings.ts b/src/settings.ts index 43614f2d..8d4f1874 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -14,9 +14,23 @@ export default () => { awsconfig: () => getAWSConfig(), getJwtConfig: () => getJwtConfig(), getSsoConfig: () => getSsoConfig(), + getCorsConfig: () => getCorsConfig(), }; }; +const getCorsConfig = () => { + const { NODE_ENV } = process.env; + if(NODE_ENV === 'local'){ + return { + origin: "http://localhost:3000", + methods: "GET,HEAD,PUT,PATCH,POST,DELETE", + credentials: true, + preflightContinue: false, + optionsSuccessStatus: 204 + } + } +} + const getPrismaConfig = (): PrismaClientOptions => { return { datasources: { @@ -25,7 +39,7 @@ const getPrismaConfig = (): PrismaClientOptions => { }, }, errorFormat: 'pretty', - log: [`error`], + log: [`error`,'query'], }; }; diff --git a/test/session/session.spec.ts b/test/session/session.spec.ts new file mode 100644 index 00000000..1905d02f --- /dev/null +++ b/test/session/session.spec.ts @@ -0,0 +1,44 @@ +import { INestApplication } from "@nestjs/common"; +import { Test, TestingModule } from "@nestjs/testing"; +import { AppModule } from "../../src/app.module"; +import * as request from "supertest"; +import { PrismaService } from "../../src/prisma/prisma.service"; +import { UserService } from "../../src/modules/user/user.service"; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/session/info (GET)', async () => { + const prismaService = app.get(PrismaService); + const session_userprofileList = await prismaService.session_userprofile.findMany({}) + + const userService = app.get(UserService); + const batchSize = 50; + const batchCount = Math.ceil(session_userprofileList.length / batchSize); + + for(let i = 0; i < batchCount; i++){ + const batch = session_userprofileList.slice(i * batchSize, (i + 1) * batchSize); + batch.forEach((user) => { + const profile = userService.getProfile(user) + .then((profile) => { + + }) + }) + } + + + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); From 6ff1e4612fd3eeff26f79bebd2635ac97652abdd Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:42:19 +0900 Subject: [PATCH 014/250] Add: add prisma-class generator --- package-lock.json | 3034 +++++++++++++++-- package.json | 3 +- .../generated/prisma-class/auth_group.ts | 17 + .../prisma-class/auth_group_permissions.ts | 20 + .../generated/prisma-class/auth_permission.ts | 27 + .../generated/prisma-class/auth_user.ts | 48 + .../prisma-class/auth_user_groups.ts | 20 + .../auth_user_user_permissions.ts | 20 + .../prisma-class/django_admin_log.ts | 35 + .../prisma-class/django_content_type.ts | 20 + .../prisma-class/django_migrations.ts | 15 + .../generated/prisma-class/django_session.ts | 12 + .../graduation_additionaltrack.ts | 32 + .../prisma-class/graduation_generaltrack.ts | 49 + .../prisma-class/graduation_majortrack.ts | 32 + src/prisma/generated/prisma-class/index.ts | 177 + .../main_famoushumanityreviewdailyfeed.ts | 22 + ...n_famoushumanityreviewdailyfeed_reviews.ts | 20 + .../main_famousmajorreviewdailyfeed.ts | 29 + ...main_famousmajorreviewdailyfeed_reviews.ts | 20 + .../main_rankedreviewdailyfeed.ts | 22 + .../prisma-class/main_ratedailyuserfeed.ts | 22 + .../main_relatedcoursedailyuserfeed.ts | 29 + .../main_reviewwritedailyuserfeed.ts | 29 + .../planner_arbitraryplanneritem.ts | 41 + .../prisma-class/planner_futureplanneritem.ts | 29 + .../generated/prisma-class/planner_planner.ts | 52 + .../planner_planner_additional_tracks.ts | 20 + .../prisma-class/planner_takenplanneritem.ts | 23 + .../prisma-class/review_humanitybestreview.ts | 6 + .../prisma-class/review_majorbestreview.ts | 6 + .../generated/prisma-class/review_review.ts | 56 + .../prisma-class/review_reviewvote.ts | 15 + .../prisma-class/session_userprofile.ts | 77 + ...ession_userprofile_favorite_departments.ts | 12 + .../session_userprofile_majors.ts | 20 + .../session_userprofile_minors.ts | 20 + .../session_userprofile_specialized_major.ts | 20 + .../session_userprofile_taken_lectures.ts | 12 + .../prisma-class/subject_classtime.ts | 40 + .../generated/prisma-class/subject_course.ts | 89 + .../prisma-class/subject_course_professors.ts | 12 + ...ubject_course_related_courses_posterior.ts | 19 + .../subject_course_related_courses_prior.ts | 19 + .../prisma-class/subject_courseuser.ts | 23 + .../prisma-class/subject_department.ts | 52 + .../prisma-class/subject_examtime.ts | 22 + .../generated/prisma-class/subject_lecture.ts | 127 + .../subject_lecture_professors.ts | 12 + .../prisma-class/subject_professor.ts | 39 + .../subject_professor_course_list.ts | 12 + .../prisma-class/subject_semester.ts | 43 + .../generated/prisma-class/support_notice.ts | 18 + .../generated/prisma-class/support_rate.ts | 25 + .../prisma-class/timetable_oldtimetable.ts | 22 + .../timetable_oldtimetable_lectures.ts | 20 + .../prisma-class/timetable_timetable.ts | 26 + .../timetable_timetable_lectures.ts | 20 + .../prisma-class/timetable_wishlist.ts | 17 + .../timetable_wishlist_lectures.ts | 20 + src/prisma/schema.prisma | 6 + 61 files changed, 4555 insertions(+), 291 deletions(-) create mode 100644 src/prisma/generated/prisma-class/auth_group.ts create mode 100644 src/prisma/generated/prisma-class/auth_group_permissions.ts create mode 100644 src/prisma/generated/prisma-class/auth_permission.ts create mode 100644 src/prisma/generated/prisma-class/auth_user.ts create mode 100644 src/prisma/generated/prisma-class/auth_user_groups.ts create mode 100644 src/prisma/generated/prisma-class/auth_user_user_permissions.ts create mode 100644 src/prisma/generated/prisma-class/django_admin_log.ts create mode 100644 src/prisma/generated/prisma-class/django_content_type.ts create mode 100644 src/prisma/generated/prisma-class/django_migrations.ts create mode 100644 src/prisma/generated/prisma-class/django_session.ts create mode 100644 src/prisma/generated/prisma-class/graduation_additionaltrack.ts create mode 100644 src/prisma/generated/prisma-class/graduation_generaltrack.ts create mode 100644 src/prisma/generated/prisma-class/graduation_majortrack.ts create mode 100644 src/prisma/generated/prisma-class/index.ts create mode 100644 src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts create mode 100644 src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts create mode 100644 src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts create mode 100644 src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts create mode 100644 src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts create mode 100644 src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts create mode 100644 src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts create mode 100644 src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts create mode 100644 src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts create mode 100644 src/prisma/generated/prisma-class/planner_futureplanneritem.ts create mode 100644 src/prisma/generated/prisma-class/planner_planner.ts create mode 100644 src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts create mode 100644 src/prisma/generated/prisma-class/planner_takenplanneritem.ts create mode 100644 src/prisma/generated/prisma-class/review_humanitybestreview.ts create mode 100644 src/prisma/generated/prisma-class/review_majorbestreview.ts create mode 100644 src/prisma/generated/prisma-class/review_review.ts create mode 100644 src/prisma/generated/prisma-class/review_reviewvote.ts create mode 100644 src/prisma/generated/prisma-class/session_userprofile.ts create mode 100644 src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts create mode 100644 src/prisma/generated/prisma-class/session_userprofile_majors.ts create mode 100644 src/prisma/generated/prisma-class/session_userprofile_minors.ts create mode 100644 src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts create mode 100644 src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts create mode 100644 src/prisma/generated/prisma-class/subject_classtime.ts create mode 100644 src/prisma/generated/prisma-class/subject_course.ts create mode 100644 src/prisma/generated/prisma-class/subject_course_professors.ts create mode 100644 src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts create mode 100644 src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts create mode 100644 src/prisma/generated/prisma-class/subject_courseuser.ts create mode 100644 src/prisma/generated/prisma-class/subject_department.ts create mode 100644 src/prisma/generated/prisma-class/subject_examtime.ts create mode 100644 src/prisma/generated/prisma-class/subject_lecture.ts create mode 100644 src/prisma/generated/prisma-class/subject_lecture_professors.ts create mode 100644 src/prisma/generated/prisma-class/subject_professor.ts create mode 100644 src/prisma/generated/prisma-class/subject_professor_course_list.ts create mode 100644 src/prisma/generated/prisma-class/subject_semester.ts create mode 100644 src/prisma/generated/prisma-class/support_notice.ts create mode 100644 src/prisma/generated/prisma-class/support_rate.ts create mode 100644 src/prisma/generated/prisma-class/timetable_oldtimetable.ts create mode 100644 src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts create mode 100644 src/prisma/generated/prisma-class/timetable_timetable.ts create mode 100644 src/prisma/generated/prisma-class/timetable_timetable_lectures.ts create mode 100644 src/prisma/generated/prisma-class/timetable_wishlist.ts create mode 100644 src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts diff --git a/package-lock.json b/package-lock.json index 6a612f61..f61ee725 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "@nestjs/jwt": "^10.0.3", "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", - "@prisma/client": "^4.13.0", + "@prisma/client": "4.16.0", "@types/cookie-parser": "^1.4.3", "@types/express-session": "^1.17.7", "@types/morgan": "^1.9.4", @@ -31,7 +31,8 @@ "morgan": "^1.10.0", "passport": "^0.6.0", "passport-jwt": "^4.0.1", - "prisma": "^4.13.0", + "prisma": "4.16.0", + "prisma-class-generator": "^0.2.7", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" @@ -202,11 +203,24 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/@antfu/ni": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.4.tgz", + "integrity": "sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==", + "bin": { + "na": "bin/na.mjs", + "nci": "bin/nci.mjs", + "ni": "bin/ni.mjs", + "nlx": "bin/nlx.mjs", + "nr": "bin/nr.mjs", + "nu": "bin/nu.mjs", + "nun": "bin/nun.mjs" + } + }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -430,7 +444,6 @@ "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -462,7 +475,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -476,7 +488,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -488,7 +499,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -502,7 +512,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -510,14 +519,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -526,7 +533,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -535,7 +541,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1830,7 +1835,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1843,7 +1847,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -1852,7 +1855,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1878,13 +1880,21 @@ "npm": ">=5.0.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@prisma/client": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.0.tgz", - "integrity": "sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.0.tgz", + "integrity": "sha512-CBD+5IdZPiavhLkQokvsz1uz4r9ppixaqY/ajybWs4WXNnsDVMBKEqN3BiPzpSo79jiy22VKj/67pqt4VwIg9w==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + "@prisma/engines-version": "4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c" }, "engines": { "node": ">=14.17" @@ -1898,16 +1908,236 @@ } } }, + "node_modules/@prisma/debug": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.16.2.tgz", + "integrity": "sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==", + "dependencies": { + "@types/debug": "4.1.8", + "debug": "4.3.4", + "strip-ansi": "6.0.1" + } + }, "node_modules/@prisma/engines": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.13.0.tgz", - "integrity": "sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.0.tgz", + "integrity": "sha512-M6XoMRXnqL0rqZGQS8ZpNiHYG4G1fKBdoqW/oBtHnr1in5UYgerZqal3CXchmd6OBD/770PE9dtjQuqcilZJUA==", "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", - "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" + "version": "4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c.tgz", + "integrity": "sha512-tMWAF/qF00fbUH1HB4Yjmz6bjh7fzkb7Y3NRoUfMlHu6V+O45MGvqwYxqwBjn1BIUXkl3r04W351D4qdJjrgvA==" + }, + "node_modules/@prisma/fetch-engine": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.16.2.tgz", + "integrity": "sha512-lnCnHcOaNn0kw8qTJbVcNhyfIf5Lus2GFXbj3qpkdKEIB9xLgqkkuTP+35q1xFaqwQ0vy4HFpdRUpFP7njE15g==", + "dependencies": { + "@prisma/debug": "4.16.2", + "@prisma/get-platform": "4.16.2", + "execa": "5.1.1", + "find-cache-dir": "3.3.2", + "fs-extra": "11.1.1", + "hasha": "5.2.2", + "http-proxy-agent": "7.0.0", + "https-proxy-agent": "7.0.0", + "kleur": "4.1.5", + "node-fetch": "2.6.11", + "p-filter": "2.1.0", + "p-map": "4.0.0", + "p-retry": "4.6.2", + "progress": "2.0.3", + "rimraf": "3.0.2", + "temp-dir": "2.0.0", + "tempy": "1.0.1" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/https-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", + "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/generator-helper": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.16.2.tgz", + "integrity": "sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==", + "dependencies": { + "@prisma/debug": "4.16.2", + "@types/cross-spawn": "6.0.2", + "cross-spawn": "7.0.3", + "kleur": "4.1.5" + } + }, + "node_modules/@prisma/generator-helper/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/get-platform": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.16.2.tgz", + "integrity": "sha512-fnDey1/iSefHJRMB+w243BhWENf+paRouPMdCqIVqu8dYkR1NqhldblsSUC4Zr2sKS7Ta2sK4OLdt9IH+PZTfw==", + "dependencies": { + "@prisma/debug": "4.16.2", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "fs-jetpack": "5.1.0", + "kleur": "4.1.5", + "replace-string": "3.1.0", + "strip-ansi": "6.0.1", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "ts-pattern": "4.3.0" + } + }, + "node_modules/@prisma/get-platform/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/internals": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.16.2.tgz", + "integrity": "sha512-/3OiSADA3RRgsaeEE+MDsBgL6oAMwddSheXn6wtYGUnjERAV/BmF5bMMLnTykesQqwZ1s8HrISrJ0Vf6cjOxMg==", + "dependencies": { + "@antfu/ni": "0.21.4", + "@opentelemetry/api": "1.4.1", + "@prisma/debug": "4.16.2", + "@prisma/engines": "4.16.2", + "@prisma/fetch-engine": "4.16.2", + "@prisma/generator-helper": "4.16.2", + "@prisma/get-platform": "4.16.2", + "@prisma/prisma-fmt-wasm": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "archiver": "5.3.1", + "arg": "5.0.2", + "checkpoint-client": "1.1.24", + "cli-truncate": "2.1.0", + "dotenv": "16.0.3", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "find-up": "5.0.0", + "fp-ts": "2.16.0", + "fs-extra": "11.1.1", + "fs-jetpack": "5.1.0", + "global-dirs": "3.0.1", + "globby": "11.1.0", + "indent-string": "4.0.0", + "is-windows": "1.0.2", + "is-wsl": "2.2.0", + "kleur": "4.1.5", + "new-github-issue-url": "0.2.1", + "node-fetch": "2.6.11", + "npm-packlist": "5.1.3", + "open": "7.4.2", + "p-map": "4.0.0", + "prompts": "2.4.2", + "read-pkg-up": "7.0.1", + "replace-string": "3.1.0", + "resolve": "1.22.2", + "string-width": "4.2.3", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "temp-dir": "2.0.0", + "temp-write": "4.0.0", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "tmp": "0.2.1", + "ts-pattern": "4.3.0" + } + }, + "node_modules/@prisma/internals/node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "hasInstallScript": true + }, + "node_modules/@prisma/internals/node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/@prisma/internals/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@prisma/internals/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@prisma/internals/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@prisma/prisma-fmt-wasm": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-g090+dEH7wrdCw359+8J9+TGH84qK28V/dxwINjhhNCtju9lej99z9w/AVsJP9UhhcCPS4psYz4iu8d53uxVpA==" }, "node_modules/@sinclair/typebox": { "version": "0.24.51", @@ -2038,6 +2268,22 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "node_modules/@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -2163,11 +2409,21 @@ "@types/node": "*" } }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "node_modules/@types/node": { "version": "16.18.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==" }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -2227,6 +2483,11 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -2700,6 +2961,18 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -2746,7 +3019,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -2761,7 +3033,6 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, "engines": { "node": ">=10" }, @@ -2814,6 +3085,56 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -2860,7 +3181,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -2871,6 +3191,19 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2986,7 +3319,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -3044,7 +3376,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3055,7 +3386,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3114,7 +3444,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3175,7 +3504,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -3195,6 +3523,14 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -3245,6 +3581,15 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3274,6 +3619,16 @@ } ] }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3289,6 +3644,25 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -3304,6 +3678,25 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/checkpoint-client": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.24.tgz", + "integrity": "sha512-nIOlLhDS7MKs4tUzS3LCm+sE1NgTCVnVrXlD0RRxaoEkkLu8LIWSUNiNWai6a+LK5unLzTyZeTCYX1Smqy0YoA==", + "dependencies": { + "ci-info": "3.8.0", + "env-paths": "2.2.1", + "fast-write-atomic": "0.2.1", + "make-dir": "3.1.0", + "ms": "2.1.3", + "node-fetch": "2.6.11", + "uuid": "9.0.0" + } + }, + "node_modules/checkpoint-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3352,7 +3745,6 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, "funding": [ { "type": "github", @@ -3384,6 +3776,14 @@ "validator": "^13.7.0" } }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3423,6 +3823,21 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -3515,12 +3930,44 @@ "node": ">= 6" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3550,6 +3997,16 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3647,6 +4104,42 @@ "node": ">=10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -3666,6 +4159,14 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3715,14 +4216,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -3794,7 +4316,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -3814,6 +4335,15 @@ "node": ">=6.0.0" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -3892,7 +4422,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -3910,11 +4439,18 @@ "node": ">=10.13.0" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -3943,7 +4479,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -4233,7 +4768,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -4442,7 +4976,6 @@ "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4471,11 +5004,15 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, + "node_modules/fast-write-atomic": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz", + "integrity": "sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -4529,7 +5066,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4567,11 +5103,26 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4699,6 +5250,11 @@ "node": ">= 0.6" } }, + "node_modules/fp-ts": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz", + "integrity": "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==" + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4707,6 +5263,11 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -4721,6 +5282,33 @@ "node": ">=14.14" } }, + "node_modules/fs-jetpack": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", + "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/fs-jetpack/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/fs-jetpack/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -4841,7 +5429,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -4872,7 +5459,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4886,6 +5472,20 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -4905,7 +5505,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -4924,8 +5523,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -4968,6 +5566,38 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -4977,6 +5607,11 @@ "node": ">=8" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4998,6 +5633,29 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -5014,7 +5672,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -5034,7 +5691,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -5054,11 +5710,40 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, "engines": { "node": ">= 4" } }, + "node_modules/ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "dependencies": { + "minimatch": "^5.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5103,6 +5788,14 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5117,6 +5810,14 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -5163,8 +5864,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5182,7 +5882,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -5190,11 +5889,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5220,7 +5932,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5241,16 +5952,22 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5259,7 +5976,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -5279,6 +5995,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5968,8 +6703,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -5998,8 +6732,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -6035,7 +6768,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -6081,11 +6813,21 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6116,8 +6858,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -6132,7 +6873,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6148,6 +6888,26 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -6160,6 +6920,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -6176,6 +6941,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6274,14 +7047,12 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -6298,7 +7069,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -6341,11 +7111,18 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6506,6 +7283,23 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/new-github-issue-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", + "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -6527,9 +7321,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -6571,31 +7365,121 @@ "node": ">=6" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dependencies": { - "path-key": "^3.0.0" + "npm-normalize-package-bin": "^2.0.0" }, "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "dependencies": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-packlist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-packlist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -6650,7 +7534,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -6661,6 +7544,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -6726,11 +7624,29 @@ "node": ">=0.10.0" } }, + "node_modules/p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "dependencies": { + "p-map": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-filter/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -6745,7 +7661,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -6756,15 +7671,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6781,7 +7730,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -6803,6 +7751,15 @@ "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/passport": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", @@ -6837,11 +7794,19 @@ "node": ">= 0.4.0" } }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -6865,8 +7830,7 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.6.3", @@ -6902,7 +7866,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -6922,7 +7885,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6943,7 +7905,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -6955,7 +7916,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6968,7 +7928,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -6980,7 +7939,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -6995,7 +7953,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -7076,12 +8033,12 @@ } }, "node_modules/prisma": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.13.0.tgz", - "integrity": "sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.0.tgz", + "integrity": "sha512-kSCwbTm3LCephyGfZMJYqBXpPJXdJStg5xwfzeFmR5C05zfkOURK9pQpJF6uUQvFWm3lI9ZMSNkObmFkAPnB+g==", "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.13.0" + "@prisma/engines": "4.16.0" }, "bin": { "prisma": "build/index.js", @@ -7091,16 +8048,52 @@ "node": ">=14.17" } }, + "node_modules/prisma-class-generator": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/prisma-class-generator/-/prisma-class-generator-0.2.7.tgz", + "integrity": "sha512-zFicPSAqHSOY2DAfnCrcwxUIFLOLhrxVlOmrT8nB3SQbEP66tIaCf/Z+2y85pawIfXhacZL3QoWArqnbdJOMDg==", + "dependencies": { + "@prisma/client": "^4.12.0", + "@prisma/generator-helper": "^4.12.0", + "@prisma/internals": "^4.12.0", + "change-case": "^4.1.2", + "prettier": "2.5.1" + }, + "bin": { + "prisma-class-generator": "dist/bin.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/prisma-class-generator/node_modules/prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -7163,7 +8156,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -7224,6 +8216,100 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -7243,6 +8329,33 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7272,6 +8385,17 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/replace-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", + "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7291,12 +8415,11 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7359,11 +8482,18 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7396,7 +8526,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -7567,6 +8696,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -7657,18 +8796,38 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -7704,6 +8863,34 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7810,11 +8997,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7888,7 +9085,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -7901,7 +9097,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -7932,15 +9127,43 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 6" } }, "node_modules/tar/node_modules/minipass": { @@ -7967,11 +9190,79 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-write": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", + "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", + "dependencies": { + "graceful-fs": "^4.1.15", + "is-stream": "^2.0.0", + "make-dir": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-write/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/temp-write/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -8127,7 +9418,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -8258,6 +9548,11 @@ } } }, + "node_modules/ts-pattern": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", + "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" + }, "node_modules/tsconfig-paths": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz", @@ -8426,11 +9721,21 @@ "node": ">= 0.8" } }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -8469,6 +9774,22 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8491,6 +9812,14 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -8511,6 +9840,15 @@ "node": ">=10.12.0" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -8838,13 +10176,38 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } } }, "dependencies": { @@ -8957,11 +10320,15 @@ } } }, + "@antfu/ni": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.4.tgz", + "integrity": "sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==" + }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, "requires": { "@babel/highlight": "^7.18.6" } @@ -9132,8 +10499,7 @@ "@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { "version": "7.21.0", @@ -9156,7 +10522,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -9167,7 +10532,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -9176,7 +10540,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -9187,7 +10550,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -9195,26 +10557,22 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -10163,7 +11521,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -10172,14 +11529,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -10195,23 +11550,228 @@ "node-fetch": "^2.6.1" } }, + "@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" + }, "@prisma/client": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.0.tgz", - "integrity": "sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.0.tgz", + "integrity": "sha512-CBD+5IdZPiavhLkQokvsz1uz4r9ppixaqY/ajybWs4WXNnsDVMBKEqN3BiPzpSo79jiy22VKj/67pqt4VwIg9w==", + "requires": { + "@prisma/engines-version": "4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c" + } + }, + "@prisma/debug": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.16.2.tgz", + "integrity": "sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==", "requires": { - "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + "@types/debug": "4.1.8", + "debug": "4.3.4", + "strip-ansi": "6.0.1" } }, "@prisma/engines": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.13.0.tgz", - "integrity": "sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==" + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.0.tgz", + "integrity": "sha512-M6XoMRXnqL0rqZGQS8ZpNiHYG4G1fKBdoqW/oBtHnr1in5UYgerZqal3CXchmd6OBD/770PE9dtjQuqcilZJUA==" }, "@prisma/engines-version": { - "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", - "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" + "version": "4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c.tgz", + "integrity": "sha512-tMWAF/qF00fbUH1HB4Yjmz6bjh7fzkb7Y3NRoUfMlHu6V+O45MGvqwYxqwBjn1BIUXkl3r04W351D4qdJjrgvA==" + }, + "@prisma/fetch-engine": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.16.2.tgz", + "integrity": "sha512-lnCnHcOaNn0kw8qTJbVcNhyfIf5Lus2GFXbj3qpkdKEIB9xLgqkkuTP+35q1xFaqwQ0vy4HFpdRUpFP7njE15g==", + "requires": { + "@prisma/debug": "4.16.2", + "@prisma/get-platform": "4.16.2", + "execa": "5.1.1", + "find-cache-dir": "3.3.2", + "fs-extra": "11.1.1", + "hasha": "5.2.2", + "http-proxy-agent": "7.0.0", + "https-proxy-agent": "7.0.0", + "kleur": "4.1.5", + "node-fetch": "2.6.11", + "p-filter": "2.1.0", + "p-map": "4.0.0", + "p-retry": "4.6.2", + "progress": "2.0.3", + "rimraf": "3.0.2", + "temp-dir": "2.0.0", + "tempy": "1.0.1" + }, + "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "https-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", + "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + } + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + } + }, + "@prisma/generator-helper": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.16.2.tgz", + "integrity": "sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==", + "requires": { + "@prisma/debug": "4.16.2", + "@types/cross-spawn": "6.0.2", + "cross-spawn": "7.0.3", + "kleur": "4.1.5" + }, + "dependencies": { + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + } + }, + "@prisma/get-platform": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.16.2.tgz", + "integrity": "sha512-fnDey1/iSefHJRMB+w243BhWENf+paRouPMdCqIVqu8dYkR1NqhldblsSUC4Zr2sKS7Ta2sK4OLdt9IH+PZTfw==", + "requires": { + "@prisma/debug": "4.16.2", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "fs-jetpack": "5.1.0", + "kleur": "4.1.5", + "replace-string": "3.1.0", + "strip-ansi": "6.0.1", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "ts-pattern": "4.3.0" + }, + "dependencies": { + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + } + } + }, + "@prisma/internals": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.16.2.tgz", + "integrity": "sha512-/3OiSADA3RRgsaeEE+MDsBgL6oAMwddSheXn6wtYGUnjERAV/BmF5bMMLnTykesQqwZ1s8HrISrJ0Vf6cjOxMg==", + "requires": { + "@antfu/ni": "0.21.4", + "@opentelemetry/api": "1.4.1", + "@prisma/debug": "4.16.2", + "@prisma/engines": "4.16.2", + "@prisma/fetch-engine": "4.16.2", + "@prisma/generator-helper": "4.16.2", + "@prisma/get-platform": "4.16.2", + "@prisma/prisma-fmt-wasm": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "archiver": "5.3.1", + "arg": "5.0.2", + "checkpoint-client": "1.1.24", + "cli-truncate": "2.1.0", + "dotenv": "16.0.3", + "escape-string-regexp": "4.0.0", + "execa": "5.1.1", + "find-up": "5.0.0", + "fp-ts": "2.16.0", + "fs-extra": "11.1.1", + "fs-jetpack": "5.1.0", + "global-dirs": "3.0.1", + "globby": "11.1.0", + "indent-string": "4.0.0", + "is-windows": "1.0.2", + "is-wsl": "2.2.0", + "kleur": "4.1.5", + "new-github-issue-url": "0.2.1", + "node-fetch": "2.6.11", + "npm-packlist": "5.1.3", + "open": "7.4.2", + "p-map": "4.0.0", + "prompts": "2.4.2", + "read-pkg-up": "7.0.1", + "replace-string": "3.1.0", + "resolve": "1.22.2", + "string-width": "4.2.3", + "strip-ansi": "6.0.1", + "strip-indent": "3.0.0", + "temp-dir": "2.0.0", + "temp-write": "4.0.0", + "tempy": "1.0.1", + "terminal-link": "2.1.1", + "tmp": "0.2.1", + "ts-pattern": "4.3.0" + }, + "dependencies": { + "@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==" + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@prisma/prisma-fmt-wasm": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-g090+dEH7wrdCw359+8J9+TGH84qK28V/dxwINjhhNCtju9lej99z9w/AVsJP9UhhcCPS4psYz4iu8d53uxVpA==" }, "@sinclair/typebox": { "version": "0.24.51", @@ -10342,6 +11902,22 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, + "@types/cross-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", + "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", + "requires": { + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", + "requires": { + "@types/ms": "*" + } + }, "@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -10467,11 +12043,21 @@ "@types/node": "*" } }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "@types/node": { "version": "16.18.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==" }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -10531,6 +12117,11 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -10896,6 +12487,15 @@ "debug": "4" } }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -10927,7 +12527,6 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, "requires": { "type-fest": "^0.21.3" }, @@ -10935,8 +12534,7 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, @@ -10973,6 +12571,49 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + } + }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -11014,8 +12655,7 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "asap": { "version": "2.0.6", @@ -11023,6 +12663,16 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -11116,8 +12766,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "basic-auth": { "version": "2.0.1", @@ -11153,7 +12802,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -11164,7 +12812,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11220,7 +12867,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -11259,12 +12905,16 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -11303,6 +12953,15 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -11315,6 +12974,16 @@ "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", "dev": true }, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -11324,6 +12993,25 @@ "supports-color": "^7.1.0" } }, + "change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "requires": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -11336,6 +13024,27 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "checkpoint-client": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.24.tgz", + "integrity": "sha512-nIOlLhDS7MKs4tUzS3LCm+sE1NgTCVnVrXlD0RRxaoEkkLu8LIWSUNiNWai6a+LK5unLzTyZeTCYX1Smqy0YoA==", + "requires": { + "ci-info": "3.8.0", + "env-paths": "2.2.1", + "fast-write-atomic": "0.2.1", + "make-dir": "3.1.0", + "ms": "2.1.3", + "node-fetch": "2.6.11", + "uuid": "9.0.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -11366,8 +13075,7 @@ "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" }, "cjs-module-lexer": { "version": "1.2.2", @@ -11390,6 +13098,11 @@ "validator": "^13.7.0" } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -11411,7 +13124,16 @@ "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", "dev": true, "requires": { - "@colors/colors": "1.5.0", + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "requires": { + "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, @@ -11482,12 +13204,40 @@ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11514,6 +13264,16 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -11592,6 +13352,32 @@ "yaml": "^1.10.0" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -11608,6 +13394,11 @@ "which": "^2.0.1" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -11643,6 +13434,21 @@ "clone": "^1.0.2" } }, + "del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -11700,7 +13506,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "requires": { "path-type": "^4.0.0" } @@ -11714,6 +13519,15 @@ "esutils": "^2.0.2" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -11774,7 +13588,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -11789,11 +13602,15 @@ "tapable": "^2.2.0" } }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -11818,8 +13635,7 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { "version": "8.37.0", @@ -12024,7 +13840,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -12206,7 +14021,6 @@ "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -12232,11 +14046,15 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, + "fast-write-atomic": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz", + "integrity": "sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==" + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -12280,7 +14098,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -12314,11 +14131,20 @@ } } }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -12405,11 +14231,21 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "fp-ts": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz", + "integrity": "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==" + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -12421,6 +14257,32 @@ "universalify": "^2.0.0" } }, + "fs-jetpack": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", + "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -12514,8 +14376,7 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "glob": { "version": "7.2.3", @@ -12534,7 +14395,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -12545,6 +14405,14 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "requires": { + "ini": "2.0.0" + } + }, "globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -12558,7 +14426,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -12571,8 +14438,7 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "grapheme-splitter": { "version": "1.0.4", @@ -12603,12 +14469,42 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, + "header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "requires": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -12627,6 +14523,25 @@ "toidentifier": "1.0.1" } }, + "http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "dependencies": { + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + } + } + } + }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -12639,8 +14554,7 @@ "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { "version": "0.4.24", @@ -12653,14 +14567,38 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } }, "import-fresh": { "version": "3.3.0", @@ -12688,6 +14626,11 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -12702,6 +14645,11 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + }, "inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -12739,8 +14687,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-binary-path": { "version": "2.1.0", @@ -12755,16 +14702,19 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, "requires": { "has": "^1.0.3" } }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -12781,7 +14731,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -12795,20 +14744,22 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-unicode-supported": { "version": "0.1.0", @@ -12816,6 +14767,19 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -13351,8 +15315,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.1.0", @@ -13372,8 +15335,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-traverse": { "version": "1.0.0", @@ -13403,7 +15365,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -13442,8 +15403,15 @@ "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } }, "leven": { "version": "3.1.0", @@ -13469,8 +15437,7 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { "version": "4.3.0", @@ -13482,7 +15449,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -13492,6 +15458,26 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -13504,6 +15490,11 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -13514,6 +15505,14 @@ "is-unicode-supported": "^0.1.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -13590,14 +15589,12 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -13608,7 +15605,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -13635,8 +15631,12 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, "minimatch": { "version": "3.1.2", @@ -13772,6 +15772,20 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "new-github-issue-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", + "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -13793,9 +15807,9 @@ } }, "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "requires": { "whatwg-url": "^5.0.0" } @@ -13820,17 +15834,87 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "requires": { + "npm-normalize-package-bin": "^2.0.0" + } + }, + "npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==" + }, + "npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "requires": { + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "requires": { "path-key": "^3.0.0" } @@ -13881,11 +15965,19 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -13933,11 +16025,25 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, + "p-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", + "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", + "requires": { + "p-map": "^2.0.0" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + } + } + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -13946,16 +16052,40 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "requires": { "p-limit": "^3.0.2" } }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "parent-module": { "version": "1.0.1", @@ -13970,7 +16100,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -13983,6 +16112,15 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "passport": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", @@ -14007,11 +16145,19 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" }, + "path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -14026,8 +16172,7 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { "version": "1.6.3", @@ -14055,8 +16200,7 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pause": { "version": "0.0.1", @@ -14072,8 +16216,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pirates": { "version": "4.0.5", @@ -14085,7 +16228,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "requires": { "find-up": "^4.0.0" }, @@ -14094,7 +16236,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -14104,7 +16245,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -14113,7 +16253,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -14122,7 +16261,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -14177,11 +16315,30 @@ } }, "prisma": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.13.0.tgz", - "integrity": "sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.0.tgz", + "integrity": "sha512-kSCwbTm3LCephyGfZMJYqBXpPJXdJStg5xwfzeFmR5C05zfkOURK9pQpJF6uUQvFWm3lI9ZMSNkObmFkAPnB+g==", + "requires": { + "@prisma/engines": "4.16.0" + } + }, + "prisma-class-generator": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/prisma-class-generator/-/prisma-class-generator-0.2.7.tgz", + "integrity": "sha512-zFicPSAqHSOY2DAfnCrcwxUIFLOLhrxVlOmrT8nB3SQbEP66tIaCf/Z+2y85pawIfXhacZL3QoWArqnbdJOMDg==", "requires": { - "@prisma/engines": "4.13.0" + "@prisma/client": "^4.12.0", + "@prisma/generator-helper": "^4.12.0", + "@prisma/internals": "^4.12.0", + "change-case": "^4.1.2", + "prettier": "2.5.1" + }, + "dependencies": { + "prettier": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", + "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==" + } } }, "process-nextick-args": { @@ -14189,11 +16346,15 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -14240,8 +16401,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "random-bytes": { "version": "1.0.0", @@ -14279,6 +16439,74 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -14300,6 +16528,32 @@ } } }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -14323,6 +16577,11 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "replace-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", + "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -14336,12 +16595,11 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -14385,11 +16643,15 @@ "signal-exit": "^3.0.2" } }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -14409,7 +16671,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -14535,6 +16796,16 @@ } } }, + "sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -14607,14 +16878,31 @@ "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } }, "source-map": { "version": "0.7.4", @@ -14646,6 +16934,34 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -14731,8 +17047,15 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } }, "strip-json-comments": { "version": "3.1.1", @@ -14788,7 +17111,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -14797,8 +17119,7 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "symbol-observable": { "version": "4.0.0", @@ -14842,11 +17163,82 @@ } } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" + }, + "temp-write": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", + "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", + "requires": { + "graceful-fs": "^4.1.15", + "is-stream": "^2.0.0", + "make-dir": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "requires": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "dependencies": { + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" + } + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -14955,7 +17347,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -15025,6 +17416,11 @@ "yn": "3.1.1" } }, + "ts-pattern": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", + "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" + }, "tsconfig-paths": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz", @@ -15153,11 +17549,18 @@ "random-bytes": "~1.0.0" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" }, "unpipe": { "version": "1.0.0", @@ -15174,6 +17577,22 @@ "picocolors": "^1.0.0" } }, + "upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "requires": { + "tslib": "^2.0.3" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15193,6 +17612,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -15210,6 +17634,15 @@ "convert-source-map": "^1.6.0" } }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -15451,8 +17884,29 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } } } } diff --git a/package.json b/package.json index af073b17..37e719b7 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "passport": "^0.6.0", "passport-jwt": "^4.0.1", "prisma": "4.16.0", + "prisma-class-generator": "^0.2.7", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" @@ -91,7 +92,7 @@ "json", "ts" ], - "rootDir": "src", + "rootDir": "./", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" diff --git a/src/prisma/generated/prisma-class/auth_group.ts b/src/prisma/generated/prisma-class/auth_group.ts new file mode 100644 index 00000000..6fa20277 --- /dev/null +++ b/src/prisma/generated/prisma-class/auth_group.ts @@ -0,0 +1,17 @@ +import { auth_group_permissions } from './auth_group_permissions'; +import { auth_user_groups } from './auth_user_groups'; +import { ApiProperty } from '@nestjs/swagger'; + +export class auth_group { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + name: string; + + @ApiProperty({ isArray: true, type: () => auth_group_permissions }) + auth_group_permissions: auth_group_permissions[]; + + @ApiProperty({ isArray: true, type: () => auth_user_groups }) + auth_user_groups: auth_user_groups[]; +} diff --git a/src/prisma/generated/prisma-class/auth_group_permissions.ts b/src/prisma/generated/prisma-class/auth_group_permissions.ts new file mode 100644 index 00000000..2463ed35 --- /dev/null +++ b/src/prisma/generated/prisma-class/auth_group_permissions.ts @@ -0,0 +1,20 @@ +import { auth_permission } from './auth_permission'; +import { auth_group } from './auth_group'; +import { ApiProperty } from '@nestjs/swagger'; + +export class auth_group_permissions { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + group_id: number; + + @ApiProperty({ type: Number }) + permission_id: number; + + @ApiProperty({ type: () => auth_permission }) + auth_permission: auth_permission; + + @ApiProperty({ type: () => auth_group }) + auth_group: auth_group; +} diff --git a/src/prisma/generated/prisma-class/auth_permission.ts b/src/prisma/generated/prisma-class/auth_permission.ts new file mode 100644 index 00000000..5b23fe11 --- /dev/null +++ b/src/prisma/generated/prisma-class/auth_permission.ts @@ -0,0 +1,27 @@ +import { auth_group_permissions } from './auth_group_permissions'; +import { django_content_type } from './django_content_type'; +import { auth_user_user_permissions } from './auth_user_user_permissions'; +import { ApiProperty } from '@nestjs/swagger'; + +export class auth_permission { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + name: string; + + @ApiProperty({ type: Number }) + content_type_id: number; + + @ApiProperty({ type: String }) + codename: string; + + @ApiProperty({ isArray: true, type: () => auth_group_permissions }) + auth_group_permissions: auth_group_permissions[]; + + @ApiProperty({ type: () => django_content_type }) + django_content_type: django_content_type; + + @ApiProperty({ isArray: true, type: () => auth_user_user_permissions }) + auth_user_user_permissions: auth_user_user_permissions[]; +} diff --git a/src/prisma/generated/prisma-class/auth_user.ts b/src/prisma/generated/prisma-class/auth_user.ts new file mode 100644 index 00000000..4ed1990f --- /dev/null +++ b/src/prisma/generated/prisma-class/auth_user.ts @@ -0,0 +1,48 @@ +import { auth_user_groups } from './auth_user_groups'; +import { auth_user_user_permissions } from './auth_user_user_permissions'; +import { django_admin_log } from './django_admin_log'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class auth_user { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + password: string; + + @ApiPropertyOptional({ type: Date }) + last_login?: Date; + + @ApiProperty({ type: Boolean }) + is_superuser: boolean; + + @ApiProperty({ type: String }) + username: string; + + @ApiProperty({ type: String }) + first_name: string; + + @ApiProperty({ type: String }) + last_name: string; + + @ApiProperty({ type: String }) + email: string; + + @ApiProperty({ type: Boolean }) + is_staff: boolean; + + @ApiProperty({ type: Boolean }) + is_active: boolean; + + @ApiProperty({ type: Date }) + date_joined: Date; + + @ApiProperty({ isArray: true, type: () => auth_user_groups }) + auth_user_groups: auth_user_groups[]; + + @ApiProperty({ isArray: true, type: () => auth_user_user_permissions }) + auth_user_user_permissions: auth_user_user_permissions[]; + + @ApiProperty({ isArray: true, type: () => django_admin_log }) + django_admin_log: django_admin_log[]; +} diff --git a/src/prisma/generated/prisma-class/auth_user_groups.ts b/src/prisma/generated/prisma-class/auth_user_groups.ts new file mode 100644 index 00000000..b03c0664 --- /dev/null +++ b/src/prisma/generated/prisma-class/auth_user_groups.ts @@ -0,0 +1,20 @@ +import { auth_group } from './auth_group'; +import { auth_user } from './auth_user'; +import { ApiProperty } from '@nestjs/swagger'; + +export class auth_user_groups { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: Number }) + group_id: number; + + @ApiProperty({ type: () => auth_group }) + auth_group: auth_group; + + @ApiProperty({ type: () => auth_user }) + auth_user: auth_user; +} diff --git a/src/prisma/generated/prisma-class/auth_user_user_permissions.ts b/src/prisma/generated/prisma-class/auth_user_user_permissions.ts new file mode 100644 index 00000000..7b2e0140 --- /dev/null +++ b/src/prisma/generated/prisma-class/auth_user_user_permissions.ts @@ -0,0 +1,20 @@ +import { auth_permission } from './auth_permission'; +import { auth_user } from './auth_user'; +import { ApiProperty } from '@nestjs/swagger'; + +export class auth_user_user_permissions { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: Number }) + permission_id: number; + + @ApiProperty({ type: () => auth_permission }) + auth_permission: auth_permission; + + @ApiProperty({ type: () => auth_user }) + auth_user: auth_user; +} diff --git a/src/prisma/generated/prisma-class/django_admin_log.ts b/src/prisma/generated/prisma-class/django_admin_log.ts new file mode 100644 index 00000000..e2f1a337 --- /dev/null +++ b/src/prisma/generated/prisma-class/django_admin_log.ts @@ -0,0 +1,35 @@ +import { django_content_type } from './django_content_type'; +import { auth_user } from './auth_user'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class django_admin_log { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + action_time: Date; + + @ApiPropertyOptional({ type: String }) + object_id?: string; + + @ApiProperty({ type: String }) + object_repr: string; + + @ApiProperty({ type: Number }) + action_flag: number; + + @ApiProperty({ type: String }) + change_message: string; + + @ApiPropertyOptional({ type: Number }) + content_type_id?: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiPropertyOptional({ type: () => django_content_type }) + django_content_type?: django_content_type; + + @ApiProperty({ type: () => auth_user }) + auth_user: auth_user; +} diff --git a/src/prisma/generated/prisma-class/django_content_type.ts b/src/prisma/generated/prisma-class/django_content_type.ts new file mode 100644 index 00000000..bb56dd55 --- /dev/null +++ b/src/prisma/generated/prisma-class/django_content_type.ts @@ -0,0 +1,20 @@ +import { auth_permission } from './auth_permission'; +import { django_admin_log } from './django_admin_log'; +import { ApiProperty } from '@nestjs/swagger'; + +export class django_content_type { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + app_label: string; + + @ApiProperty({ type: String }) + model: string; + + @ApiProperty({ isArray: true, type: () => auth_permission }) + auth_permission: auth_permission[]; + + @ApiProperty({ isArray: true, type: () => django_admin_log }) + django_admin_log: django_admin_log[]; +} diff --git a/src/prisma/generated/prisma-class/django_migrations.ts b/src/prisma/generated/prisma-class/django_migrations.ts new file mode 100644 index 00000000..062571b7 --- /dev/null +++ b/src/prisma/generated/prisma-class/django_migrations.ts @@ -0,0 +1,15 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class django_migrations { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + app: string; + + @ApiProperty({ type: String }) + name: string; + + @ApiProperty({ type: Date }) + applied: Date; +} diff --git a/src/prisma/generated/prisma-class/django_session.ts b/src/prisma/generated/prisma-class/django_session.ts new file mode 100644 index 00000000..6370af81 --- /dev/null +++ b/src/prisma/generated/prisma-class/django_session.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class django_session { + @ApiProperty({ type: String }) + session_key: string; + + @ApiProperty({ type: String }) + session_data: string; + + @ApiProperty({ type: Date }) + expire_date: Date; +} diff --git a/src/prisma/generated/prisma-class/graduation_additionaltrack.ts b/src/prisma/generated/prisma-class/graduation_additionaltrack.ts new file mode 100644 index 00000000..fe880689 --- /dev/null +++ b/src/prisma/generated/prisma-class/graduation_additionaltrack.ts @@ -0,0 +1,32 @@ +import { subject_department } from './subject_department'; +import { planner_planner_additional_tracks } from './planner_planner_additional_tracks'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class graduation_additionaltrack { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + start_year: number; + + @ApiProperty({ type: Number }) + end_year: number; + + @ApiProperty({ type: String }) + type: string; + + @ApiProperty({ type: Number }) + major_required: number; + + @ApiProperty({ type: Number }) + major_elective: number; + + @ApiPropertyOptional({ type: Number }) + department_id?: number; + + @ApiPropertyOptional({ type: () => subject_department }) + subject_department?: subject_department; + + @ApiProperty({ isArray: true, type: () => planner_planner_additional_tracks }) + planner_planner_additional_tracks: planner_planner_additional_tracks[]; +} diff --git a/src/prisma/generated/prisma-class/graduation_generaltrack.ts b/src/prisma/generated/prisma-class/graduation_generaltrack.ts new file mode 100644 index 00000000..d0f9691a --- /dev/null +++ b/src/prisma/generated/prisma-class/graduation_generaltrack.ts @@ -0,0 +1,49 @@ +import { planner_planner } from './planner_planner'; +import { ApiProperty } from '@nestjs/swagger'; + +export class graduation_generaltrack { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + start_year: number; + + @ApiProperty({ type: Number }) + end_year: number; + + @ApiProperty({ type: Boolean }) + is_foreign: boolean; + + @ApiProperty({ type: Number }) + total_credit: number; + + @ApiProperty({ type: Number }) + total_au: number; + + @ApiProperty({ type: Number }) + basic_required: number; + + @ApiProperty({ type: Number }) + basic_elective: number; + + @ApiProperty({ type: Number }) + thesis_study: number; + + @ApiProperty({ type: Number }) + thesis_study_doublemajor: number; + + @ApiProperty({ type: Number }) + general_required_credit: number; + + @ApiProperty({ type: Number }) + general_required_au: number; + + @ApiProperty({ type: Number }) + humanities: number; + + @ApiProperty({ type: Number }) + humanities_doublemajor: number; + + @ApiProperty({ isArray: true, type: () => planner_planner }) + planner_planner: planner_planner[]; +} diff --git a/src/prisma/generated/prisma-class/graduation_majortrack.ts b/src/prisma/generated/prisma-class/graduation_majortrack.ts new file mode 100644 index 00000000..414c96ca --- /dev/null +++ b/src/prisma/generated/prisma-class/graduation_majortrack.ts @@ -0,0 +1,32 @@ +import { subject_department } from './subject_department'; +import { planner_planner } from './planner_planner'; +import { ApiProperty } from '@nestjs/swagger'; + +export class graduation_majortrack { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + start_year: number; + + @ApiProperty({ type: Number }) + end_year: number; + + @ApiProperty({ type: Number }) + basic_elective_doublemajor: number; + + @ApiProperty({ type: Number }) + major_required: number; + + @ApiProperty({ type: Number }) + major_elective: number; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; + + @ApiProperty({ isArray: true, type: () => planner_planner }) + planner_planner: planner_planner[]; +} diff --git a/src/prisma/generated/prisma-class/index.ts b/src/prisma/generated/prisma-class/index.ts new file mode 100644 index 00000000..56d76b67 --- /dev/null +++ b/src/prisma/generated/prisma-class/index.ts @@ -0,0 +1,177 @@ +import { auth_group as _auth_group } from './auth_group'; +import { auth_group_permissions as _auth_group_permissions } from './auth_group_permissions'; +import { auth_permission as _auth_permission } from './auth_permission'; +import { auth_user as _auth_user } from './auth_user'; +import { auth_user_groups as _auth_user_groups } from './auth_user_groups'; +import { auth_user_user_permissions as _auth_user_user_permissions } from './auth_user_user_permissions'; +import { django_admin_log as _django_admin_log } from './django_admin_log'; +import { django_content_type as _django_content_type } from './django_content_type'; +import { django_migrations as _django_migrations } from './django_migrations'; +import { django_session as _django_session } from './django_session'; +import { main_famoushumanityreviewdailyfeed as _main_famoushumanityreviewdailyfeed } from './main_famoushumanityreviewdailyfeed'; +import { main_famoushumanityreviewdailyfeed_reviews as _main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; +import { main_famousmajorreviewdailyfeed as _main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; +import { main_famousmajorreviewdailyfeed_reviews as _main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; +import { main_rankedreviewdailyfeed as _main_rankedreviewdailyfeed } from './main_rankedreviewdailyfeed'; +import { main_ratedailyuserfeed as _main_ratedailyuserfeed } from './main_ratedailyuserfeed'; +import { main_relatedcoursedailyuserfeed as _main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; +import { main_reviewwritedailyuserfeed as _main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; +import { review_humanitybestreview as _review_humanitybestreview } from './review_humanitybestreview'; +import { review_majorbestreview as _review_majorbestreview } from './review_majorbestreview'; +import { review_review as _review_review } from './review_review'; +import { review_reviewvote as _review_reviewvote } from './review_reviewvote'; +import { session_userprofile as _session_userprofile } from './session_userprofile'; +import { session_userprofile_favorite_departments as _session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; +import { session_userprofile_majors as _session_userprofile_majors } from './session_userprofile_majors'; +import { session_userprofile_minors as _session_userprofile_minors } from './session_userprofile_minors'; +import { session_userprofile_specialized_major as _session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { session_userprofile_taken_lectures as _session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; +import { subject_classtime as _subject_classtime } from './subject_classtime'; +import { subject_course as _subject_course } from './subject_course'; +import { subject_course_professors as _subject_course_professors } from './subject_course_professors'; +import { subject_course_related_courses_posterior as _subject_course_related_courses_posterior } from './subject_course_related_courses_posterior'; +import { subject_course_related_courses_prior as _subject_course_related_courses_prior } from './subject_course_related_courses_prior'; +import { subject_courseuser as _subject_courseuser } from './subject_courseuser'; +import { subject_department as _subject_department } from './subject_department'; +import { subject_examtime as _subject_examtime } from './subject_examtime'; +import { subject_lecture as _subject_lecture } from './subject_lecture'; +import { subject_lecture_professors as _subject_lecture_professors } from './subject_lecture_professors'; +import { subject_professor as _subject_professor } from './subject_professor'; +import { subject_professor_course_list as _subject_professor_course_list } from './subject_professor_course_list'; +import { subject_semester as _subject_semester } from './subject_semester'; +import { support_notice as _support_notice } from './support_notice'; +import { support_rate as _support_rate } from './support_rate'; +import { timetable_oldtimetable as _timetable_oldtimetable } from './timetable_oldtimetable'; +import { timetable_oldtimetable_lectures as _timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; +import { timetable_timetable as _timetable_timetable } from './timetable_timetable'; +import { timetable_timetable_lectures as _timetable_timetable_lectures } from './timetable_timetable_lectures'; +import { timetable_wishlist as _timetable_wishlist } from './timetable_wishlist'; +import { timetable_wishlist_lectures as _timetable_wishlist_lectures } from './timetable_wishlist_lectures'; +import { graduation_additionaltrack as _graduation_additionaltrack } from './graduation_additionaltrack'; +import { graduation_generaltrack as _graduation_generaltrack } from './graduation_generaltrack'; +import { graduation_majortrack as _graduation_majortrack } from './graduation_majortrack'; +import { planner_arbitraryplanneritem as _planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; +import { planner_futureplanneritem as _planner_futureplanneritem } from './planner_futureplanneritem'; +import { planner_planner as _planner_planner } from './planner_planner'; +import { planner_planner_additional_tracks as _planner_planner_additional_tracks } from './planner_planner_additional_tracks'; +import { planner_takenplanneritem as _planner_takenplanneritem } from './planner_takenplanneritem'; + +export namespace PrismaModel { + export class auth_group extends _auth_group {} + export class auth_group_permissions extends _auth_group_permissions {} + export class auth_permission extends _auth_permission {} + export class auth_user extends _auth_user {} + export class auth_user_groups extends _auth_user_groups {} + export class auth_user_user_permissions extends _auth_user_user_permissions {} + export class django_admin_log extends _django_admin_log {} + export class django_content_type extends _django_content_type {} + export class django_migrations extends _django_migrations {} + export class django_session extends _django_session {} + export class main_famoushumanityreviewdailyfeed extends _main_famoushumanityreviewdailyfeed {} + export class main_famoushumanityreviewdailyfeed_reviews extends _main_famoushumanityreviewdailyfeed_reviews {} + export class main_famousmajorreviewdailyfeed extends _main_famousmajorreviewdailyfeed {} + export class main_famousmajorreviewdailyfeed_reviews extends _main_famousmajorreviewdailyfeed_reviews {} + export class main_rankedreviewdailyfeed extends _main_rankedreviewdailyfeed {} + export class main_ratedailyuserfeed extends _main_ratedailyuserfeed {} + export class main_relatedcoursedailyuserfeed extends _main_relatedcoursedailyuserfeed {} + export class main_reviewwritedailyuserfeed extends _main_reviewwritedailyuserfeed {} + export class review_humanitybestreview extends _review_humanitybestreview {} + export class review_majorbestreview extends _review_majorbestreview {} + export class review_review extends _review_review {} + export class review_reviewvote extends _review_reviewvote {} + export class session_userprofile extends _session_userprofile {} + export class session_userprofile_favorite_departments extends _session_userprofile_favorite_departments {} + export class session_userprofile_majors extends _session_userprofile_majors {} + export class session_userprofile_minors extends _session_userprofile_minors {} + export class session_userprofile_specialized_major extends _session_userprofile_specialized_major {} + export class session_userprofile_taken_lectures extends _session_userprofile_taken_lectures {} + export class subject_classtime extends _subject_classtime {} + export class subject_course extends _subject_course {} + export class subject_course_professors extends _subject_course_professors {} + export class subject_course_related_courses_posterior extends _subject_course_related_courses_posterior {} + export class subject_course_related_courses_prior extends _subject_course_related_courses_prior {} + export class subject_courseuser extends _subject_courseuser {} + export class subject_department extends _subject_department {} + export class subject_examtime extends _subject_examtime {} + export class subject_lecture extends _subject_lecture {} + export class subject_lecture_professors extends _subject_lecture_professors {} + export class subject_professor extends _subject_professor {} + export class subject_professor_course_list extends _subject_professor_course_list {} + export class subject_semester extends _subject_semester {} + export class support_notice extends _support_notice {} + export class support_rate extends _support_rate {} + export class timetable_oldtimetable extends _timetable_oldtimetable {} + export class timetable_oldtimetable_lectures extends _timetable_oldtimetable_lectures {} + export class timetable_timetable extends _timetable_timetable {} + export class timetable_timetable_lectures extends _timetable_timetable_lectures {} + export class timetable_wishlist extends _timetable_wishlist {} + export class timetable_wishlist_lectures extends _timetable_wishlist_lectures {} + export class graduation_additionaltrack extends _graduation_additionaltrack {} + export class graduation_generaltrack extends _graduation_generaltrack {} + export class graduation_majortrack extends _graduation_majortrack {} + export class planner_arbitraryplanneritem extends _planner_arbitraryplanneritem {} + export class planner_futureplanneritem extends _planner_futureplanneritem {} + export class planner_planner extends _planner_planner {} + export class planner_planner_additional_tracks extends _planner_planner_additional_tracks {} + export class planner_takenplanneritem extends _planner_takenplanneritem {} + + export const extraModels = [ + auth_group, + auth_group_permissions, + auth_permission, + auth_user, + auth_user_groups, + auth_user_user_permissions, + django_admin_log, + django_content_type, + django_migrations, + django_session, + main_famoushumanityreviewdailyfeed, + main_famoushumanityreviewdailyfeed_reviews, + main_famousmajorreviewdailyfeed, + main_famousmajorreviewdailyfeed_reviews, + main_rankedreviewdailyfeed, + main_ratedailyuserfeed, + main_relatedcoursedailyuserfeed, + main_reviewwritedailyuserfeed, + review_humanitybestreview, + review_majorbestreview, + review_review, + review_reviewvote, + session_userprofile, + session_userprofile_favorite_departments, + session_userprofile_majors, + session_userprofile_minors, + session_userprofile_specialized_major, + session_userprofile_taken_lectures, + subject_classtime, + subject_course, + subject_course_professors, + subject_course_related_courses_posterior, + subject_course_related_courses_prior, + subject_courseuser, + subject_department, + subject_examtime, + subject_lecture, + subject_lecture_professors, + subject_professor, + subject_professor_course_list, + subject_semester, + support_notice, + support_rate, + timetable_oldtimetable, + timetable_oldtimetable_lectures, + timetable_timetable, + timetable_timetable_lectures, + timetable_wishlist, + timetable_wishlist_lectures, + graduation_additionaltrack, + graduation_generaltrack, + graduation_majortrack, + planner_arbitraryplanneritem, + planner_futureplanneritem, + planner_planner, + planner_planner_additional_tracks, + planner_takenplanneritem, + ]; +} diff --git a/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts b/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts new file mode 100644 index 00000000..c5acce69 --- /dev/null +++ b/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts @@ -0,0 +1,22 @@ +import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_famoushumanityreviewdailyfeed { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + date: Date; + + @ApiProperty({ type: Number }) + priority: number; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiProperty({ + isArray: true, + type: () => main_famoushumanityreviewdailyfeed_reviews, + }) + main_famoushumanityreviewdailyfeed_reviews: main_famoushumanityreviewdailyfeed_reviews[]; +} diff --git a/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts b/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts new file mode 100644 index 00000000..24092f28 --- /dev/null +++ b/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts @@ -0,0 +1,20 @@ +import { main_famoushumanityreviewdailyfeed } from './main_famoushumanityreviewdailyfeed'; +import { review_review } from './review_review'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_famoushumanityreviewdailyfeed_reviews { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + famoushumanityreviewdailyfeed_id: number; + + @ApiProperty({ type: Number }) + review_id: number; + + @ApiProperty({ type: () => main_famoushumanityreviewdailyfeed }) + main_famoushumanityreviewdailyfeed: main_famoushumanityreviewdailyfeed; + + @ApiProperty({ type: () => review_review }) + review_review: review_review; +} diff --git a/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts b/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts new file mode 100644 index 00000000..ce5fae90 --- /dev/null +++ b/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts @@ -0,0 +1,29 @@ +import { subject_department } from './subject_department'; +import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_famousmajorreviewdailyfeed { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + date: Date; + + @ApiProperty({ type: Number }) + priority: number; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; + + @ApiProperty({ + isArray: true, + type: () => main_famousmajorreviewdailyfeed_reviews, + }) + main_famousmajorreviewdailyfeed_reviews: main_famousmajorreviewdailyfeed_reviews[]; +} diff --git a/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts b/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts new file mode 100644 index 00000000..5060570e --- /dev/null +++ b/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts @@ -0,0 +1,20 @@ +import { main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; +import { review_review } from './review_review'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_famousmajorreviewdailyfeed_reviews { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + famousmajorreviewdailyfeed_id: number; + + @ApiProperty({ type: Number }) + review_id: number; + + @ApiProperty({ type: () => main_famousmajorreviewdailyfeed }) + main_famousmajorreviewdailyfeed: main_famousmajorreviewdailyfeed; + + @ApiProperty({ type: () => review_review }) + review_review: review_review; +} diff --git a/src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts b/src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts new file mode 100644 index 00000000..4d612214 --- /dev/null +++ b/src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts @@ -0,0 +1,22 @@ +import { subject_semester } from './subject_semester'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class main_rankedreviewdailyfeed { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + date: Date; + + @ApiProperty({ type: Number }) + priority: number; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiPropertyOptional({ type: Number }) + semester_id?: number; + + @ApiPropertyOptional({ type: () => subject_semester }) + subject_semester?: subject_semester; +} diff --git a/src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts b/src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts new file mode 100644 index 00000000..ebb9dcab --- /dev/null +++ b/src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts @@ -0,0 +1,22 @@ +import { session_userprofile } from './session_userprofile'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_ratedailyuserfeed { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + date: Date; + + @ApiProperty({ type: Number }) + priority: number; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; +} diff --git a/src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts b/src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts new file mode 100644 index 00000000..6ea53167 --- /dev/null +++ b/src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts @@ -0,0 +1,29 @@ +import { subject_course } from './subject_course'; +import { session_userprofile } from './session_userprofile'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_relatedcoursedailyuserfeed { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + date: Date; + + @ApiProperty({ type: Number }) + priority: number; + + @ApiProperty({ type: Number }) + course_id: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiProperty({ type: () => subject_course }) + subject_course: subject_course; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; +} diff --git a/src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts b/src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts new file mode 100644 index 00000000..8b4eaeb7 --- /dev/null +++ b/src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts @@ -0,0 +1,29 @@ +import { subject_lecture } from './subject_lecture'; +import { session_userprofile } from './session_userprofile'; +import { ApiProperty } from '@nestjs/swagger'; + +export class main_reviewwritedailyuserfeed { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + date: Date; + + @ApiProperty({ type: Number }) + priority: number; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiProperty({ type: () => subject_lecture }) + subject_lecture: subject_lecture; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; +} diff --git a/src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts b/src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts new file mode 100644 index 00000000..d4583a91 --- /dev/null +++ b/src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts @@ -0,0 +1,41 @@ +import { subject_department } from './subject_department'; +import { planner_planner } from './planner_planner'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class planner_arbitraryplanneritem { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Boolean }) + is_excluded: boolean; + + @ApiProperty({ type: Number }) + year: number; + + @ApiProperty({ type: Number }) + semester: number; + + @ApiProperty({ type: String }) + type: string; + + @ApiProperty({ type: String }) + type_en: string; + + @ApiProperty({ type: Number }) + credit: number; + + @ApiProperty({ type: Number }) + credit_au: number; + + @ApiPropertyOptional({ type: Number }) + department_id?: number; + + @ApiProperty({ type: Number }) + planner_id: number; + + @ApiPropertyOptional({ type: () => subject_department }) + subject_department?: subject_department; + + @ApiProperty({ type: () => planner_planner }) + planner_planner: planner_planner; +} diff --git a/src/prisma/generated/prisma-class/planner_futureplanneritem.ts b/src/prisma/generated/prisma-class/planner_futureplanneritem.ts new file mode 100644 index 00000000..9ff492d0 --- /dev/null +++ b/src/prisma/generated/prisma-class/planner_futureplanneritem.ts @@ -0,0 +1,29 @@ +import { subject_course } from './subject_course'; +import { planner_planner } from './planner_planner'; +import { ApiProperty } from '@nestjs/swagger'; + +export class planner_futureplanneritem { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Boolean }) + is_excluded: boolean; + + @ApiProperty({ type: Number }) + year: number; + + @ApiProperty({ type: Number }) + semester: number; + + @ApiProperty({ type: Number }) + course_id: number; + + @ApiProperty({ type: Number }) + planner_id: number; + + @ApiProperty({ type: () => subject_course }) + subject_course: subject_course; + + @ApiProperty({ type: () => planner_planner }) + planner_planner: planner_planner; +} diff --git a/src/prisma/generated/prisma-class/planner_planner.ts b/src/prisma/generated/prisma-class/planner_planner.ts new file mode 100644 index 00000000..b6704453 --- /dev/null +++ b/src/prisma/generated/prisma-class/planner_planner.ts @@ -0,0 +1,52 @@ +import { planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; +import { planner_futureplanneritem } from './planner_futureplanneritem'; +import { graduation_generaltrack } from './graduation_generaltrack'; +import { graduation_majortrack } from './graduation_majortrack'; +import { session_userprofile } from './session_userprofile'; +import { planner_planner_additional_tracks } from './planner_planner_additional_tracks'; +import { planner_takenplanneritem } from './planner_takenplanneritem'; +import { ApiProperty } from '@nestjs/swagger'; + +export class planner_planner { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + start_year: number; + + @ApiProperty({ type: Number }) + end_year: number; + + @ApiProperty({ type: Number }) + arrange_order: number; + + @ApiProperty({ type: Number }) + general_track_id: number; + + @ApiProperty({ type: Number }) + major_track_id: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ isArray: true, type: () => planner_arbitraryplanneritem }) + planner_arbitraryplanneritem: planner_arbitraryplanneritem[]; + + @ApiProperty({ isArray: true, type: () => planner_futureplanneritem }) + planner_futureplanneritem: planner_futureplanneritem[]; + + @ApiProperty({ type: () => graduation_generaltrack }) + graduation_generaltrack: graduation_generaltrack; + + @ApiProperty({ type: () => graduation_majortrack }) + graduation_majortrack: graduation_majortrack; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; + + @ApiProperty({ isArray: true, type: () => planner_planner_additional_tracks }) + planner_planner_additional_tracks: planner_planner_additional_tracks[]; + + @ApiProperty({ isArray: true, type: () => planner_takenplanneritem }) + planner_takenplanneritem: planner_takenplanneritem[]; +} diff --git a/src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts b/src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts new file mode 100644 index 00000000..dfa927b3 --- /dev/null +++ b/src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts @@ -0,0 +1,20 @@ +import { graduation_additionaltrack } from './graduation_additionaltrack'; +import { planner_planner } from './planner_planner'; +import { ApiProperty } from '@nestjs/swagger'; + +export class planner_planner_additional_tracks { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + planner_id: number; + + @ApiProperty({ type: Number }) + additionaltrack_id: number; + + @ApiProperty({ type: () => graduation_additionaltrack }) + graduation_additionaltrack: graduation_additionaltrack; + + @ApiProperty({ type: () => planner_planner }) + planner_planner: planner_planner; +} diff --git a/src/prisma/generated/prisma-class/planner_takenplanneritem.ts b/src/prisma/generated/prisma-class/planner_takenplanneritem.ts new file mode 100644 index 00000000..4c0d81c8 --- /dev/null +++ b/src/prisma/generated/prisma-class/planner_takenplanneritem.ts @@ -0,0 +1,23 @@ +import { subject_lecture } from './subject_lecture'; +import { planner_planner } from './planner_planner'; +import { ApiProperty } from '@nestjs/swagger'; + +export class planner_takenplanneritem { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Boolean }) + is_excluded: boolean; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: Number }) + planner_id: number; + + @ApiProperty({ type: () => subject_lecture }) + subject_lecture: subject_lecture; + + @ApiProperty({ type: () => planner_planner }) + planner_planner: planner_planner; +} diff --git a/src/prisma/generated/prisma-class/review_humanitybestreview.ts b/src/prisma/generated/prisma-class/review_humanitybestreview.ts new file mode 100644 index 00000000..d289e054 --- /dev/null +++ b/src/prisma/generated/prisma-class/review_humanitybestreview.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class review_humanitybestreview { + @ApiProperty({ type: Number }) + review_id: number; +} diff --git a/src/prisma/generated/prisma-class/review_majorbestreview.ts b/src/prisma/generated/prisma-class/review_majorbestreview.ts new file mode 100644 index 00000000..53f8495f --- /dev/null +++ b/src/prisma/generated/prisma-class/review_majorbestreview.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class review_majorbestreview { + @ApiProperty({ type: Number }) + review_id: number; +} diff --git a/src/prisma/generated/prisma-class/review_review.ts b/src/prisma/generated/prisma-class/review_review.ts new file mode 100644 index 00000000..a3fa0ef5 --- /dev/null +++ b/src/prisma/generated/prisma-class/review_review.ts @@ -0,0 +1,56 @@ +import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; +import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class review_review { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + course_id: number; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: String }) + content: string; + + @ApiProperty({ type: Number }) + grade: number; + + @ApiProperty({ type: Number }) + load: number; + + @ApiProperty({ type: Number }) + speech: number; + + @ApiPropertyOptional({ type: Number }) + writer_id?: number; + + @ApiProperty({ type: String }) + writer_label: string; + + @ApiProperty({ type: Date }) + updated_datetime: Date; + + @ApiProperty({ type: Number }) + like: number; + + @ApiProperty({ type: Number }) + is_deleted: number; + + @ApiPropertyOptional({ type: Date }) + written_datetime?: Date; + + @ApiProperty({ + isArray: true, + type: () => main_famoushumanityreviewdailyfeed_reviews, + }) + main_famoushumanityreviewdailyfeed_reviews: main_famoushumanityreviewdailyfeed_reviews[]; + + @ApiProperty({ + isArray: true, + type: () => main_famousmajorreviewdailyfeed_reviews, + }) + main_famousmajorreviewdailyfeed_reviews: main_famousmajorreviewdailyfeed_reviews[]; +} diff --git a/src/prisma/generated/prisma-class/review_reviewvote.ts b/src/prisma/generated/prisma-class/review_reviewvote.ts new file mode 100644 index 00000000..3b57c7ae --- /dev/null +++ b/src/prisma/generated/prisma-class/review_reviewvote.ts @@ -0,0 +1,15 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class review_reviewvote { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + review_id: number; + + @ApiPropertyOptional({ type: Number }) + userprofile_id?: number; + + @ApiPropertyOptional({ type: Date }) + created_datetime?: Date; +} diff --git a/src/prisma/generated/prisma-class/session_userprofile.ts b/src/prisma/generated/prisma-class/session_userprofile.ts new file mode 100644 index 00000000..f7afb252 --- /dev/null +++ b/src/prisma/generated/prisma-class/session_userprofile.ts @@ -0,0 +1,77 @@ +import { main_ratedailyuserfeed } from './main_ratedailyuserfeed'; +import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; +import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; +import { planner_planner } from './planner_planner'; +import { session_userprofile_majors } from './session_userprofile_majors'; +import { session_userprofile_minors } from './session_userprofile_minors'; +import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { subject_courseuser } from './subject_courseuser'; +import { support_rate } from './support_rate'; +import { timetable_timetable } from './timetable_timetable'; +import { timetable_wishlist } from './timetable_wishlist'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class session_userprofile { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + student_id: string; + + @ApiProperty({ type: String }) + sid: string; + + @ApiPropertyOptional({ type: Number }) + department_id?: number; + + @ApiPropertyOptional({ type: String }) + email?: string; + + @ApiProperty({ type: Date }) + date_joined: Date; + + @ApiProperty({ type: String }) + first_name: string; + + @ApiProperty({ type: String }) + last_name: string; + + @ApiPropertyOptional({ type: String }) + refresh_token?: string; + + @ApiProperty({ isArray: true, type: () => main_ratedailyuserfeed }) + main_ratedailyuserfeed: main_ratedailyuserfeed[]; + + @ApiProperty({ isArray: true, type: () => main_relatedcoursedailyuserfeed }) + main_relatedcoursedailyuserfeed: main_relatedcoursedailyuserfeed[]; + + @ApiProperty({ isArray: true, type: () => main_reviewwritedailyuserfeed }) + main_reviewwritedailyuserfeed: main_reviewwritedailyuserfeed[]; + + @ApiProperty({ isArray: true, type: () => planner_planner }) + planner_planner: planner_planner[]; + + @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) + session_userprofile_majors: session_userprofile_majors[]; + + @ApiProperty({ isArray: true, type: () => session_userprofile_minors }) + session_userprofile_minors: session_userprofile_minors[]; + + @ApiProperty({ + isArray: true, + type: () => session_userprofile_specialized_major, + }) + session_userprofile_specialized_major: session_userprofile_specialized_major[]; + + @ApiProperty({ isArray: true, type: () => subject_courseuser }) + subject_courseuser: subject_courseuser[]; + + @ApiProperty({ isArray: true, type: () => support_rate }) + support_rate: support_rate[]; + + @ApiProperty({ isArray: true, type: () => timetable_timetable }) + timetable_timetable: timetable_timetable[]; + + @ApiPropertyOptional({ type: () => timetable_wishlist }) + timetable_wishlist?: timetable_wishlist; +} diff --git a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts new file mode 100644 index 00000000..3d442c2f --- /dev/null +++ b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class session_userprofile_favorite_departments { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + userprofile_id: number; + + @ApiProperty({ type: Number }) + department_id: number; +} diff --git a/src/prisma/generated/prisma-class/session_userprofile_majors.ts b/src/prisma/generated/prisma-class/session_userprofile_majors.ts new file mode 100644 index 00000000..c7bbc44c --- /dev/null +++ b/src/prisma/generated/prisma-class/session_userprofile_majors.ts @@ -0,0 +1,20 @@ +import { session_userprofile } from './session_userprofile'; +import { subject_department } from './subject_department'; +import { ApiProperty } from '@nestjs/swagger'; + +export class session_userprofile_majors { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + userprofile_id: number; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; + + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; +} diff --git a/src/prisma/generated/prisma-class/session_userprofile_minors.ts b/src/prisma/generated/prisma-class/session_userprofile_minors.ts new file mode 100644 index 00000000..5f19f446 --- /dev/null +++ b/src/prisma/generated/prisma-class/session_userprofile_minors.ts @@ -0,0 +1,20 @@ +import { session_userprofile } from './session_userprofile'; +import { subject_department } from './subject_department'; +import { ApiProperty } from '@nestjs/swagger'; + +export class session_userprofile_minors { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + userprofile_id: number; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; + + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; +} diff --git a/src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts b/src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts new file mode 100644 index 00000000..a241f200 --- /dev/null +++ b/src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts @@ -0,0 +1,20 @@ +import { session_userprofile } from './session_userprofile'; +import { subject_department } from './subject_department'; +import { ApiProperty } from '@nestjs/swagger'; + +export class session_userprofile_specialized_major { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + userprofile_id: number; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; + + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; +} diff --git a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts new file mode 100644 index 00000000..ab8e964a --- /dev/null +++ b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class session_userprofile_taken_lectures { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + userprofile_id: number; + + @ApiProperty({ type: Number }) + lecture_id: number; +} diff --git a/src/prisma/generated/prisma-class/subject_classtime.ts b/src/prisma/generated/prisma-class/subject_classtime.ts new file mode 100644 index 00000000..5fdc8de1 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_classtime.ts @@ -0,0 +1,40 @@ +import { subject_lecture } from './subject_lecture'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class subject_classtime { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + day: number; + + @ApiProperty({ type: Date }) + begin: Date; + + @ApiProperty({ type: Date }) + end: Date; + + @ApiProperty({ type: String }) + type: string; + + @ApiPropertyOptional({ type: String }) + building_id?: string; + + @ApiPropertyOptional({ type: String }) + building_full_name?: string; + + @ApiPropertyOptional({ type: String }) + building_full_name_en?: string; + + @ApiPropertyOptional({ type: String }) + room_name?: string; + + @ApiPropertyOptional({ type: Number }) + unit_time?: number; + + @ApiPropertyOptional({ type: Number }) + lecture_id?: number; + + @ApiPropertyOptional({ type: () => subject_lecture }) + subject_lecture?: subject_lecture; +} diff --git a/src/prisma/generated/prisma-class/subject_course.ts b/src/prisma/generated/prisma-class/subject_course.ts new file mode 100644 index 00000000..6ccf4d76 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_course.ts @@ -0,0 +1,89 @@ +import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; +import { planner_futureplanneritem } from './planner_futureplanneritem'; +import { subject_course_related_courses_posterior } from './subject_course_related_courses_posterior'; +import { subject_course_related_courses_prior } from './subject_course_related_courses_prior'; +import { subject_courseuser } from './subject_courseuser'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class subject_course { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + old_code: string; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: String }) + type: string; + + @ApiProperty({ type: String }) + type_en: string; + + @ApiProperty({ type: String }) + title: string; + + @ApiProperty({ type: String }) + title_en: string; + + @ApiProperty({ type: String }) + summury: string; + + @ApiProperty({ type: Number }) + grade_sum: number; + + @ApiProperty({ type: Number }) + load_sum: number; + + @ApiProperty({ type: Number }) + speech_sum: number; + + @ApiProperty({ type: Number }) + review_total_weight: number; + + @ApiProperty({ type: Number }) + grade: number; + + @ApiProperty({ type: Number }) + load: number; + + @ApiProperty({ type: Number }) + speech: number; + + @ApiPropertyOptional({ type: Date }) + latest_written_datetime?: Date; + + @ApiProperty({ isArray: true, type: () => main_relatedcoursedailyuserfeed }) + main_relatedcoursedailyuserfeed: main_relatedcoursedailyuserfeed[]; + + @ApiProperty({ isArray: true, type: () => planner_futureplanneritem }) + planner_futureplanneritem: planner_futureplanneritem[]; + + @ApiProperty({ + isArray: true, + type: () => subject_course_related_courses_posterior, + }) + subject_course_related_courses_posterior_subject_course_related_courses_posterior_from_course_idTosubject_course: subject_course_related_courses_posterior[]; + + @ApiProperty({ + isArray: true, + type: () => subject_course_related_courses_posterior, + }) + subject_course_related_courses_posterior_subject_course_related_courses_posterior_to_course_idTosubject_course: subject_course_related_courses_posterior[]; + + @ApiProperty({ + isArray: true, + type: () => subject_course_related_courses_prior, + }) + subject_course_related_courses_prior_subject_course_related_courses_prior_from_course_idTosubject_course: subject_course_related_courses_prior[]; + + @ApiProperty({ + isArray: true, + type: () => subject_course_related_courses_prior, + }) + subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course: subject_course_related_courses_prior[]; + + @ApiProperty({ isArray: true, type: () => subject_courseuser }) + subject_courseuser: subject_courseuser[]; +} diff --git a/src/prisma/generated/prisma-class/subject_course_professors.ts b/src/prisma/generated/prisma-class/subject_course_professors.ts new file mode 100644 index 00000000..5c14d9a9 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_course_professors.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_course_professors { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + course_id: number; + + @ApiProperty({ type: Number }) + professor_id: number; +} diff --git a/src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts b/src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts new file mode 100644 index 00000000..77008bdb --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts @@ -0,0 +1,19 @@ +import { subject_course } from './subject_course'; +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_course_related_courses_posterior { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + from_course_id: number; + + @ApiProperty({ type: Number }) + to_course_id: number; + + @ApiProperty({ type: () => subject_course }) + subject_course_subject_course_related_courses_posterior_from_course_idTosubject_course: subject_course; + + @ApiProperty({ type: () => subject_course }) + subject_course_subject_course_related_courses_posterior_to_course_idTosubject_course: subject_course; +} diff --git a/src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts b/src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts new file mode 100644 index 00000000..faef4fb5 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts @@ -0,0 +1,19 @@ +import { subject_course } from './subject_course'; +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_course_related_courses_prior { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + from_course_id: number; + + @ApiProperty({ type: Number }) + to_course_id: number; + + @ApiProperty({ type: () => subject_course }) + subject_course_subject_course_related_courses_prior_from_course_idTosubject_course: subject_course; + + @ApiProperty({ type: () => subject_course }) + subject_course_subject_course_related_courses_prior_to_course_idTosubject_course: subject_course; +} diff --git a/src/prisma/generated/prisma-class/subject_courseuser.ts b/src/prisma/generated/prisma-class/subject_courseuser.ts new file mode 100644 index 00000000..a54b4e71 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_courseuser.ts @@ -0,0 +1,23 @@ +import { subject_course } from './subject_course'; +import { session_userprofile } from './session_userprofile'; +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_courseuser { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + latest_read_datetime: Date; + + @ApiProperty({ type: Number }) + course_id: number; + + @ApiProperty({ type: Number }) + user_profile_id: number; + + @ApiProperty({ type: () => subject_course }) + subject_course: subject_course; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; +} diff --git a/src/prisma/generated/prisma-class/subject_department.ts b/src/prisma/generated/prisma-class/subject_department.ts new file mode 100644 index 00000000..416d1708 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_department.ts @@ -0,0 +1,52 @@ +import { graduation_additionaltrack } from './graduation_additionaltrack'; +import { graduation_majortrack } from './graduation_majortrack'; +import { main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; +import { planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; +import { session_userprofile_majors } from './session_userprofile_majors'; +import { session_userprofile_minors } from './session_userprofile_minors'; +import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class subject_department { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + num_id: string; + + @ApiProperty({ type: String }) + code: string; + + @ApiProperty({ type: String }) + name: string; + + @ApiPropertyOptional({ type: String }) + name_en?: string; + + @ApiProperty({ type: Boolean }) + visible: boolean; + + @ApiProperty({ isArray: true, type: () => graduation_additionaltrack }) + graduation_additionaltrack: graduation_additionaltrack[]; + + @ApiProperty({ isArray: true, type: () => graduation_majortrack }) + graduation_majortrack: graduation_majortrack[]; + + @ApiProperty({ isArray: true, type: () => main_famousmajorreviewdailyfeed }) + main_famousmajorreviewdailyfeed: main_famousmajorreviewdailyfeed[]; + + @ApiProperty({ isArray: true, type: () => planner_arbitraryplanneritem }) + planner_arbitraryplanneritem: planner_arbitraryplanneritem[]; + + @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) + session_userprofile_majors: session_userprofile_majors[]; + + @ApiProperty({ isArray: true, type: () => session_userprofile_minors }) + session_userprofile_minors: session_userprofile_minors[]; + + @ApiProperty({ + isArray: true, + type: () => session_userprofile_specialized_major, + }) + session_userprofile_specialized_major: session_userprofile_specialized_major[]; +} diff --git a/src/prisma/generated/prisma-class/subject_examtime.ts b/src/prisma/generated/prisma-class/subject_examtime.ts new file mode 100644 index 00000000..7fa39b9b --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_examtime.ts @@ -0,0 +1,22 @@ +import { subject_lecture } from './subject_lecture'; +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_examtime { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + day: number; + + @ApiProperty({ type: Date }) + begin: Date; + + @ApiProperty({ type: Date }) + end: Date; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: () => subject_lecture }) + subject_lecture: subject_lecture; +} diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts new file mode 100644 index 00000000..dcd98f7d --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -0,0 +1,127 @@ +import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; +import { planner_takenplanneritem } from './planner_takenplanneritem'; +import { subject_classtime } from './subject_classtime'; +import { subject_examtime } from './subject_examtime'; +import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; +import { timetable_timetable_lectures } from './timetable_timetable_lectures'; +import { timetable_wishlist_lectures } from './timetable_wishlist_lectures'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class subject_lecture { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + code: string; + + @ApiProperty({ type: String }) + old_code: string; + + @ApiProperty({ type: Number }) + year: number; + + @ApiProperty({ type: Number }) + semester: number; + + @ApiProperty({ type: Number }) + department_id: number; + + @ApiProperty({ type: String }) + class_no: string; + + @ApiProperty({ type: String }) + title: string; + + @ApiProperty({ type: String }) + title_en: string; + + @ApiProperty({ type: String }) + type: string; + + @ApiProperty({ type: String }) + type_en: string; + + @ApiProperty({ type: Number }) + audience: number; + + @ApiProperty({ type: Number }) + credit: number; + + @ApiProperty({ type: Number }) + num_classes: number; + + @ApiProperty({ type: Number }) + num_labs: number; + + @ApiProperty({ type: Number }) + credit_au: number; + + @ApiProperty({ type: Number }) + limit: number; + + @ApiPropertyOptional({ type: Number }) + num_people?: number; + + @ApiProperty({ type: Boolean }) + is_english: boolean; + + @ApiProperty({ type: Boolean }) + deleted: boolean; + + @ApiProperty({ type: Number }) + course_id: number; + + @ApiProperty({ type: Number }) + grade_sum: number; + + @ApiProperty({ type: Number }) + load_sum: number; + + @ApiProperty({ type: Number }) + speech_sum: number; + + @ApiProperty({ type: Number }) + grade: number; + + @ApiProperty({ type: Number }) + load: number; + + @ApiProperty({ type: Number }) + speech: number; + + @ApiProperty({ type: Number }) + review_total_weight: number; + + @ApiPropertyOptional({ type: String }) + class_title?: string; + + @ApiPropertyOptional({ type: String }) + class_title_en?: string; + + @ApiPropertyOptional({ type: String }) + common_title?: string; + + @ApiPropertyOptional({ type: String }) + common_title_en?: string; + + @ApiProperty({ isArray: true, type: () => main_reviewwritedailyuserfeed }) + main_reviewwritedailyuserfeed: main_reviewwritedailyuserfeed[]; + + @ApiProperty({ isArray: true, type: () => planner_takenplanneritem }) + planner_takenplanneritem: planner_takenplanneritem[]; + + @ApiProperty({ isArray: true, type: () => subject_classtime }) + subject_classtime: subject_classtime[]; + + @ApiProperty({ isArray: true, type: () => subject_examtime }) + subject_examtime: subject_examtime[]; + + @ApiProperty({ isArray: true, type: () => timetable_oldtimetable_lectures }) + timetable_oldtimetable_lectures: timetable_oldtimetable_lectures[]; + + @ApiProperty({ isArray: true, type: () => timetable_timetable_lectures }) + timetable_timetable_lectures: timetable_timetable_lectures[]; + + @ApiProperty({ isArray: true, type: () => timetable_wishlist_lectures }) + timetable_wishlist_lectures: timetable_wishlist_lectures[]; +} diff --git a/src/prisma/generated/prisma-class/subject_lecture_professors.ts b/src/prisma/generated/prisma-class/subject_lecture_professors.ts new file mode 100644 index 00000000..76d7a03a --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_lecture_professors.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_lecture_professors { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: Number }) + professor_id: number; +} diff --git a/src/prisma/generated/prisma-class/subject_professor.ts b/src/prisma/generated/prisma-class/subject_professor.ts new file mode 100644 index 00000000..ca4f3a1f --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_professor.ts @@ -0,0 +1,39 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class subject_professor { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + professor_name: string; + + @ApiPropertyOptional({ type: String }) + professor_name_en?: string; + + @ApiProperty({ type: Number }) + professor_id: number; + + @ApiProperty({ type: String }) + major: string; + + @ApiProperty({ type: Number }) + grade_sum: number; + + @ApiProperty({ type: Number }) + load_sum: number; + + @ApiProperty({ type: Number }) + speech_sum: number; + + @ApiProperty({ type: Number }) + review_total_weight: number; + + @ApiProperty({ type: Number }) + grade: number; + + @ApiProperty({ type: Number }) + load: number; + + @ApiProperty({ type: Number }) + speech: number; +} diff --git a/src/prisma/generated/prisma-class/subject_professor_course_list.ts b/src/prisma/generated/prisma-class/subject_professor_course_list.ts new file mode 100644 index 00000000..aaa69a00 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_professor_course_list.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class subject_professor_course_list { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + professor_id: number; + + @ApiProperty({ type: Number }) + course_id: number; +} diff --git a/src/prisma/generated/prisma-class/subject_semester.ts b/src/prisma/generated/prisma-class/subject_semester.ts new file mode 100644 index 00000000..60aa70d0 --- /dev/null +++ b/src/prisma/generated/prisma-class/subject_semester.ts @@ -0,0 +1,43 @@ +import { main_rankedreviewdailyfeed } from './main_rankedreviewdailyfeed'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class subject_semester { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + year: number; + + @ApiProperty({ type: Number }) + semester: number; + + @ApiProperty({ type: Date }) + beginning: Date; + + @ApiProperty({ type: Date }) + end: Date; + + @ApiPropertyOptional({ type: Date }) + courseRegistrationPeriodStart?: Date; + + @ApiPropertyOptional({ type: Date }) + courseRegistrationPeriodEnd?: Date; + + @ApiPropertyOptional({ type: Date }) + courseAddDropPeriodEnd?: Date; + + @ApiPropertyOptional({ type: Date }) + courseDropDeadline?: Date; + + @ApiPropertyOptional({ type: Date }) + courseEvaluationDeadline?: Date; + + @ApiPropertyOptional({ type: Date }) + gradePosting?: Date; + + @ApiPropertyOptional({ type: Date }) + courseDesciptionSubmission?: Date; + + @ApiProperty({ isArray: true, type: () => main_rankedreviewdailyfeed }) + main_rankedreviewdailyfeed: main_rankedreviewdailyfeed[]; +} diff --git a/src/prisma/generated/prisma-class/support_notice.ts b/src/prisma/generated/prisma-class/support_notice.ts new file mode 100644 index 00000000..844220d0 --- /dev/null +++ b/src/prisma/generated/prisma-class/support_notice.ts @@ -0,0 +1,18 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class support_notice { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Date }) + start_time: Date; + + @ApiProperty({ type: Date }) + end_time: Date; + + @ApiProperty({ type: String }) + title: string; + + @ApiProperty({ type: String }) + content: string; +} diff --git a/src/prisma/generated/prisma-class/support_rate.ts b/src/prisma/generated/prisma-class/support_rate.ts new file mode 100644 index 00000000..72b2977a --- /dev/null +++ b/src/prisma/generated/prisma-class/support_rate.ts @@ -0,0 +1,25 @@ +import { session_userprofile } from './session_userprofile'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class support_rate { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + score: number; + + @ApiProperty({ type: Number }) + year: number; + + @ApiPropertyOptional({ type: Date }) + created_datetime?: Date; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: String }) + version: string; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; +} diff --git a/src/prisma/generated/prisma-class/timetable_oldtimetable.ts b/src/prisma/generated/prisma-class/timetable_oldtimetable.ts new file mode 100644 index 00000000..5d12a8be --- /dev/null +++ b/src/prisma/generated/prisma-class/timetable_oldtimetable.ts @@ -0,0 +1,22 @@ +import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class timetable_oldtimetable { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: String }) + student_id: string; + + @ApiPropertyOptional({ type: Number }) + year?: number; + + @ApiPropertyOptional({ type: Number }) + semester?: number; + + @ApiPropertyOptional({ type: Number }) + table_no?: number; + + @ApiProperty({ isArray: true, type: () => timetable_oldtimetable_lectures }) + timetable_oldtimetable_lectures: timetable_oldtimetable_lectures[]; +} diff --git a/src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts b/src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts new file mode 100644 index 00000000..422c374d --- /dev/null +++ b/src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts @@ -0,0 +1,20 @@ +import { subject_lecture } from './subject_lecture'; +import { timetable_oldtimetable } from './timetable_oldtimetable'; +import { ApiProperty } from '@nestjs/swagger'; + +export class timetable_oldtimetable_lectures { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + oldtimetable_id: number; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: () => subject_lecture }) + subject_lecture: subject_lecture; + + @ApiProperty({ type: () => timetable_oldtimetable }) + timetable_oldtimetable: timetable_oldtimetable; +} diff --git a/src/prisma/generated/prisma-class/timetable_timetable.ts b/src/prisma/generated/prisma-class/timetable_timetable.ts new file mode 100644 index 00000000..9c2f15ce --- /dev/null +++ b/src/prisma/generated/prisma-class/timetable_timetable.ts @@ -0,0 +1,26 @@ +import { session_userprofile } from './session_userprofile'; +import { timetable_timetable_lectures } from './timetable_timetable_lectures'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class timetable_timetable { + @ApiProperty({ type: Number }) + id: number; + + @ApiPropertyOptional({ type: Number }) + year?: number; + + @ApiPropertyOptional({ type: Number }) + semester?: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: Number }) + arrange_order: number; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; + + @ApiProperty({ isArray: true, type: () => timetable_timetable_lectures }) + timetable_timetable_lectures: timetable_timetable_lectures[]; +} diff --git a/src/prisma/generated/prisma-class/timetable_timetable_lectures.ts b/src/prisma/generated/prisma-class/timetable_timetable_lectures.ts new file mode 100644 index 00000000..582cdf2a --- /dev/null +++ b/src/prisma/generated/prisma-class/timetable_timetable_lectures.ts @@ -0,0 +1,20 @@ +import { subject_lecture } from './subject_lecture'; +import { timetable_timetable } from './timetable_timetable'; +import { ApiProperty } from '@nestjs/swagger'; + +export class timetable_timetable_lectures { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + timetable_id: number; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: () => subject_lecture }) + subject_lecture: subject_lecture; + + @ApiProperty({ type: () => timetable_timetable }) + timetable_timetable: timetable_timetable; +} diff --git a/src/prisma/generated/prisma-class/timetable_wishlist.ts b/src/prisma/generated/prisma-class/timetable_wishlist.ts new file mode 100644 index 00000000..2e3e42b9 --- /dev/null +++ b/src/prisma/generated/prisma-class/timetable_wishlist.ts @@ -0,0 +1,17 @@ +import { session_userprofile } from './session_userprofile'; +import { timetable_wishlist_lectures } from './timetable_wishlist_lectures'; +import { ApiProperty } from '@nestjs/swagger'; + +export class timetable_wishlist { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + user_id: number; + + @ApiProperty({ type: () => session_userprofile }) + session_userprofile: session_userprofile; + + @ApiProperty({ isArray: true, type: () => timetable_wishlist_lectures }) + timetable_wishlist_lectures: timetable_wishlist_lectures[]; +} diff --git a/src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts b/src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts new file mode 100644 index 00000000..b09da8e5 --- /dev/null +++ b/src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts @@ -0,0 +1,20 @@ +import { subject_lecture } from './subject_lecture'; +import { timetable_wishlist } from './timetable_wishlist'; +import { ApiProperty } from '@nestjs/swagger'; + +export class timetable_wishlist_lectures { + @ApiProperty({ type: Number }) + id: number; + + @ApiProperty({ type: Number }) + wishlist_id: number; + + @ApiProperty({ type: Number }) + lecture_id: number; + + @ApiProperty({ type: () => subject_lecture }) + subject_lecture: subject_lecture; + + @ApiProperty({ type: () => timetable_wishlist }) + timetable_wishlist: timetable_wishlist; +} diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index c13e9c32..e4698f49 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -2,6 +2,12 @@ generator client { provider = "prisma-client-js" } +generator prismaClassGenerator { + provider = "prisma-class-generator" + dryRun = false + output = "./generated/prisma-class" +} + datasource db { provider = "mysql" url = env("DATABASE_URL") From 8814ff023113a42c087114cc143740b6d0b1603c Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:45:24 +0900 Subject: [PATCH 015/250] Add: add nestjs/swagger --- package-lock.json | 87 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 1 + 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f61ee725..5468ff9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@nestjs/jwt": "^10.0.3", "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", + "@nestjs/swagger": "^7.1.1", "@prisma/client": "4.16.0", "@types/cookie-parser": "^1.4.3", "@types/express-session": "^1.17.7", @@ -1669,6 +1670,25 @@ "@types/node": "*" } }, + "node_modules/@nestjs/mapped-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/passport": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.3.tgz", @@ -1804,6 +1824,37 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/@nestjs/swagger": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.1.tgz", + "integrity": "sha512-gIG1aVCegZlIppXZizKHqWkqZvQkvptTBR1C5CzZoDwGoVVKJBmJ2i9FAcsnzzb0j7hncFKhcBuWYOBJOsCvug==", + "dependencies": { + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.1.0" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/testing": { "version": "9.3.12", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.12.tgz", @@ -3169,8 +3220,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -6709,7 +6759,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -9104,6 +9153,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-ui-dist": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -11413,6 +11467,12 @@ } } }, + "@nestjs/mapped-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "requires": {} + }, "@nestjs/passport": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.3.tgz", @@ -11508,6 +11568,18 @@ } } }, + "@nestjs/swagger": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.1.tgz", + "integrity": "sha512-gIG1aVCegZlIppXZizKHqWkqZvQkvptTBR1C5CzZoDwGoVVKJBmJ2i9FAcsnzzb0j7hncFKhcBuWYOBJOsCvug==", + "requires": { + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.1.0" + } + }, "@nestjs/testing": { "version": "9.3.12", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-9.3.12.tgz", @@ -12644,8 +12716,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "1.1.1", @@ -15321,7 +15392,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -17121,6 +17191,11 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "swagger-ui-dist": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" + }, "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", diff --git a/package.json b/package.json index 37e719b7..623c126a 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@nestjs/jwt": "^10.0.3", "@nestjs/passport": "^9.0.3", "@nestjs/platform-express": "^9.0.0", + "@nestjs/swagger": "^7.1.1", "@prisma/client": "4.16.0", "@types/cookie-parser": "^1.4.3", "@types/express-session": "^1.17.7", From eadb00352501085629060214c33c5044b663ad44 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 28 Jun 2023 23:15:04 +0900 Subject: [PATCH 016/250] Add: implementing serializer --- .../department/department.response.dto.ts | 0 .../interfaces/dto/user/user.response.dto.ts | 15 ++++++++--- .../interfaces/serializer/user.serializer.ts | 26 +++++++++++++++++++ src/common/utils/method.utils.ts | 2 ++ src/modules/auth/auth.controller.ts | 10 +++---- src/prisma/schema.prisma | 2 ++ 6 files changed, 45 insertions(+), 10 deletions(-) rename src/common/interfaces/dto/{ => user}/department/department.response.dto.ts (100%) diff --git a/src/common/interfaces/dto/department/department.response.dto.ts b/src/common/interfaces/dto/user/department/department.response.dto.ts similarity index 100% rename from src/common/interfaces/dto/department/department.response.dto.ts rename to src/common/interfaces/dto/user/department/department.response.dto.ts diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index ee593038..5621714f 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -1,3 +1,6 @@ +import { + review_review, session_userprofile_favorite_departments, + session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; export interface ProfileDto { id: string; @@ -5,7 +8,11 @@ export interface ProfileDto { student_id: string; firstName: string; lastName: string; - /* - @todo: add more fields for relations - */ -} \ No newline at end of file + department: subject_department + majors: subject_department[] + departments: subject_department[] + favorite_departments: session_userprofile_favorite_departments[] + review_writeable_lectures: session_userprofile_taken_lectures[] + my_timetable_lectures: session_userprofile_taken_lectures[] + reviews: review_review[] +} diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index e69de29b..935e28af 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -0,0 +1,26 @@ +import { Prisma, session_userprofile } from "@prisma/client"; +import { PrismaService } from "../../../prisma/prisma.service"; + +export async function loadUser(user: session_userprofile, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService) { + const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { + if(user[key] && value) { + value = false; + }else if(user[key] && !value) { + value = false + } + else if(!user[key] && value) { + value = true + }else if(!user[key] && !value) { + value = false + } + }) + const result = await prismaService.session_userprofile.findFirst({ + where: { sid: user.sid }, + include: userLoadOptions, + }) + return result; +} + +export function toProfileDto(user: session_userprofile) { + +} \ No newline at end of file diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 7c7cbf84..ca616c3f 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,3 +15,5 @@ export function normalizeArray( return normalizeObj } + + diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 0ecdd92a..ecf5d7d2 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -8,6 +8,7 @@ import { Public } from '../../common/decorators/skip-auth.decorator'; import { GetUser } from '../../common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; +import { ProfileDto } from "../../common/interfaces/dto/user/user.response.dto"; @Controller('session') export class AuthController { @@ -75,20 +76,17 @@ export class AuthController { call import_student_lectures(studentId) */ - /* - @Todo - save refreshToken in session_userprofile - */ const next_url = session['next'] ?? '/'; response.redirect(next_url); } @Get('info') - async getUserProfile(@GetUser() user: session_userprofile) { + async getUserProfile(@GetUser() user: session_userprofile): ProfileDto { /* @Todo implement userSerializer, before that, we'd like to architect the dto types */ - return user; + + const user; } } diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index e4698f49..ce68d34f 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -263,6 +263,7 @@ model session_userprofile { student_id String @db.VarChar(10) sid String @db.VarChar(30) department_id Int? + department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) email String? @db.VarChar(255) date_joined DateTime @db.DateTime(0) first_name String @db.VarChar(30) @@ -426,6 +427,7 @@ model subject_department { graduation_majortrack graduation_majortrack[] main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] planner_arbitraryplanneritem planner_arbitraryplanneritem[] + session_userprofile session_userprofile[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] From 6833847ae21955212807f6b73f1e53b905f04a81 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Thu, 29 Jun 2023 00:16:28 +0900 Subject: [PATCH 017/250] Add: reType the select result of user --- src/common/interfaces/serializer/user.serializer.ts | 9 +++++++-- src/common/schemaTypes/types.ts | 5 +++++ src/common/utils/method.utils.ts | 10 ++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/common/schemaTypes/types.ts diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index 935e28af..a1296dc8 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -1,7 +1,11 @@ import { Prisma, session_userprofile } from "@prisma/client"; import { PrismaService } from "../../../prisma/prisma.service"; +import { type } from "os"; +import { Union } from "../../utils/method.utils"; +import { userSelectResultType } from "../../schemaTypes/types"; + +export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { -export async function loadUser(user: session_userprofile, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService) { const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { if(user[key] && value) { value = false; @@ -14,7 +18,8 @@ export async function loadUser(user: session_userprofile, userLoadOptions: Prism value = false } }) - const result = await prismaService.session_userprofile.findFirst({ + + const result: userSelectResultType = await prismaService.session_userprofile.findFirst({ where: { sid: user.sid }, include: userLoadOptions, }) diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts new file mode 100644 index 00000000..16e0c603 --- /dev/null +++ b/src/common/schemaTypes/types.ts @@ -0,0 +1,5 @@ +import { Prisma } from "@prisma/client"; + +export type userSelectResultType = Prisma.session_userprofileGetPayload<{ + include: Prisma.session_userprofileInclude +}> diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index ca616c3f..e6d37fe1 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,5 +15,15 @@ export function normalizeArray( return normalizeObj } +type ValueType = string | number | boolean +export type Union< + T extends { [key: string]: ValueType } | ReadonlyArray, + > = T extends ReadonlyArray + ? T[number] + : T extends { [key: string]: infer U } + ? U + : never + + From 7821c3f30a53a8c793fd0b9ad0a9b794bfa7a081 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:18:05 +0900 Subject: [PATCH 018/250] Add: add FKs to userprofile and other tables --- package.json | 2 ++ .../interfaces/serializer/user.serializer.ts | 36 ++++++++++++++++--- src/common/schemaTypes/types.ts | 4 +++ .../20230703113703_create_f_ks/migration.sql | 8 +++++ .../migration.sql | 8 +++++ src/prisma/schema.prisma | 10 ++++++ 6 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/prisma/migrations/20230703113703_create_f_ks/migration.sql create mode 100644 src/prisma/migrations/20230703135605_add_fk_writer/migration.sql diff --git a/package.json b/package.json index 623c126a..2fe0e599 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,8 @@ "prisma-generate": "npx prisma generate --schema src/prisma/schema.prisma", "prisma-status:local": "dotenv -e env/.env.local npx prisma migrate status", "prisma-status:dev": "dotenv -e env/.env.dev npx prisma migrate status", + "prisma-resolve:local": "dotenv -e env/.env.local npx prisma migrate resolve", + "prisma-resolve:dev": "dotenv -e env/.env.dev npx prisma migrate resolve", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index a1296dc8..63083ea7 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -1,7 +1,5 @@ -import { Prisma, session_userprofile } from "@prisma/client"; +import { Prisma, review_review, session_userprofile, subject_department } from "@prisma/client"; import { PrismaService } from "../../../prisma/prisma.service"; -import { type } from "os"; -import { Union } from "../../utils/method.utils"; import { userSelectResultType } from "../../schemaTypes/types"; export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { @@ -26,6 +24,36 @@ export async function loadUser(user:session_userprofile | userSelectResultType, return result; } -export function toProfileDto(user: session_userprofile) { +export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { + + const majors: subject_department[] = await prisma.session_userprofile.findMany({ + include: { + session_userprofile_majors: { + include: { + subject_department: true + } + }, + favorite_departments: { + include:{ + department: true + } + } + } + }); + + const reviewList: review_review[] = await prisma.review_review.findMany({ + + }) + + + return { + id: user.id, + email: user.email, + student_id: user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: user.department, + majors: user.session_userprofile_majors. + }; } \ No newline at end of file diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 16e0c603..158b8b0c 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -3,3 +3,7 @@ import { Prisma } from "@prisma/client"; export type userSelectResultType = Prisma.session_userprofileGetPayload<{ include: Prisma.session_userprofileInclude }> + +export type courseSelectResultType = Prisma.subject_courseGetPayload<{ + include: Prisma.subject_courseInclude +}> diff --git a/src/prisma/migrations/20230703113703_create_f_ks/migration.sql b/src/prisma/migrations/20230703113703_create_f_ks/migration.sql new file mode 100644 index 00000000..d49cd192 --- /dev/null +++ b/src/prisma/migrations/20230703113703_create_f_ks/migration.sql @@ -0,0 +1,8 @@ +-- AddForeignKey +ALTER TABLE `session_userprofile` ADD CONSTRAINT `session_userprofile_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_favorite_departments` ADD CONSTRAINT `session_userprofile_favorite_departments_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_favorite_departments` ADD CONSTRAINT `session_userprofile_favorite_departments_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql b/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql new file mode 100644 index 00000000..1bd255dd --- /dev/null +++ b/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql @@ -0,0 +1,8 @@ +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_writer_id_fkey` FOREIGN KEY (`writer_id`) REFERENCES `session_userprofile`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_taken_lectures` ADD CONSTRAINT `session_userprofile_taken_lectures_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_taken_lectures` ADD CONSTRAINT `session_userprofile_taken_lectures_lecture_id_fkey` FOREIGN KEY (`lecture_id`) REFERENCES `subject_lecture`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index ce68d34f..08e8eb30 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -236,6 +236,7 @@ model review_review { load Int @db.SmallInt speech Int @db.SmallInt writer_id Int? + writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) writer_label String @db.VarChar(200) updated_datetime DateTime @db.DateTime(0) like Int @@ -276,16 +277,21 @@ model session_userprofile { session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] + favorite_departments session_userprofile_favorite_departments[] subject_courseuser subject_courseuser[] + taken_lectures session_userprofile_taken_lectures[] support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? + reviews review_review[] } model session_userprofile_favorite_departments { id Int @id @default(autoincrement()) userprofile_id Int + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) department_id Int + department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, department_id], map: "userprofile_id") } @@ -326,7 +332,9 @@ model session_userprofile_specialized_major { model session_userprofile_taken_lectures { id Int @id @default(autoincrement()) userprofile_id Int + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) lecture_id Int + lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, lecture_id], map: "userprofile_id") } @@ -428,6 +436,7 @@ model subject_department { main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] planner_arbitraryplanneritem planner_arbitraryplanneritem[] session_userprofile session_userprofile[] + session_userprofile_favorite_departments session_userprofile_favorite_departments[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] @@ -481,6 +490,7 @@ model subject_lecture { planner_takenplanneritem planner_takenplanneritem[] subject_classtime subject_classtime[] subject_examtime subject_examtime[] + students session_userprofile_taken_lectures[] timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] From 8c68c93ed78c7735afbd3804bd34532b1caca467 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:35:39 +0900 Subject: [PATCH 019/250] Add: complete implementing session/info --- src/common/interfaces/constants/lecture.ts | 8 +++ .../interfaces/dto/user/user.response.dto.ts | 2 +- .../interfaces/serializer/user.serializer.ts | 4 +- src/common/schemaTypes/types.ts | 4 ++ src/modules/auth/auth.controller.ts | 6 +- src/modules/user/user.service.ts | 45 +++++++++++- .../repositories/department.repository.ts | 57 +++++++++++++++ src/prisma/repositories/lecture.repository.ts | 69 ++++++++++++++++++- src/prisma/repositories/review.repository.ts | 8 +++ 9 files changed, 194 insertions(+), 9 deletions(-) create mode 100644 src/common/interfaces/constants/lecture.ts create mode 100644 src/prisma/repositories/department.repository.ts diff --git a/src/common/interfaces/constants/lecture.ts b/src/common/interfaces/constants/lecture.ts new file mode 100644 index 00000000..d75c12c8 --- /dev/null +++ b/src/common/interfaces/constants/lecture.ts @@ -0,0 +1,8 @@ +import { Union } from "../../utils/method.utils"; + +export const ResearchLecture = { + IndividualStudy: "Individual Study", + UnderThesisStudy: "Thesis Study(Undergraduate)", + ThesisResearch: "Thesis Research(MA/phD)" +} +export type ResearchLecture = Union \ No newline at end of file diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index 5621714f..cebedda3 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -3,7 +3,7 @@ import { session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; export interface ProfileDto { - id: string; + id: number; email: string; student_id: string; firstName: string; diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index 63083ea7..a08296ef 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -27,7 +27,7 @@ export async function loadUser(user:session_userprofile | userSelectResultType, export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - const majors: subject_department[] = await prisma.session_userprofile.findMany({ + const majors = await prisma.session_userprofile.findMany({ include: { session_userprofile_majors: { include: { @@ -38,7 +38,7 @@ export async function toProfileDto(user: userSelectResultType, prisma: PrismaSer include:{ department: true } - } + }, } }); diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 158b8b0c..e03f69af 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -7,3 +7,7 @@ export type userSelectResultType = Prisma.session_userprofileGetPayload<{ export type courseSelectResultType = Prisma.subject_courseGetPayload<{ include: Prisma.subject_courseInclude }> + +export type lectureSelectResultType = Prisma.subject_lectureGetPayload<{ + include: Prisma.subject_lectureInclude +}> diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index ecf5d7d2..6ae3d0cc 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -81,12 +81,12 @@ export class AuthController { } @Get('info') - async getUserProfile(@GetUser() user: session_userprofile): ProfileDto { + async getUserProfile(@GetUser() user: session_userprofile): Promise { /* @Todo implement userSerializer, before that, we'd like to architect the dto types */ - - const user; + const profile = await this.userService.getProfile(user); + return profile; } } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index cabf448d..5c51e0fc 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,9 +1,20 @@ import { UserRepository } from "../../prisma/repositories/user.repository"; import { Injectable, NotFoundException } from "@nestjs/common"; +import { LectureRepository } from "../../prisma/repositories/lecture.repository"; +import { session_userprofile, subject_department } from "@prisma/client"; +import { DepartmentRepository } from "../../prisma/repositories/department.repository"; +import { normalizeArray } from "../../common/utils/method.utils"; +import { ResearchLecture } from "../../common/interfaces/constants/lecture"; +import { ReviewRepository } from "../../prisma/repositories/review.repository"; @Injectable() export class UserService { - constructor(private readonly userRepository: UserRepository) { + constructor( + private readonly userRepository: UserRepository, + private readonly lectureRepository: LectureRepository, + private readonly departmentRepository: DepartmentRepository, + private readonly reviewRepository: ReviewRepository, + ) { } public async findBySid(sid: string){ @@ -12,4 +23,36 @@ export class UserService { throw new NotFoundException(`Can't find user with sid: ${sid}`); } } + + public async getProfile(user: session_userprofile){ + const promises = []; + const departmentPromise = this.departmentRepository.getDepartmentOfUser(user); + const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user); + const majorsPromise = this.departmentRepository.getMajors(user); + const minorsPromise = this.departmentRepository.getMinors(user); + const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user); + const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(new Date()); + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user); + const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) + promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); + const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); + const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; + const researchLectures = Object.values(ResearchLecture); + const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); + + return { + id: user.id, + email: user.email, + student_id : user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: department ?? null, + majors: majors, + departments: departments, + favorite_departments: favoriteDepartments, + review_writeable_lectures: reviewWritableLectures, + my_timetable_lectures: timeTableLectures, + reviews: writtenReviews + } + } } \ No newline at end of file diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts new file mode 100644 index 00000000..4a424dc6 --- /dev/null +++ b/src/prisma/repositories/department.repository.ts @@ -0,0 +1,57 @@ +import { PrismaService } from "../prisma.service"; +import { session_userprofile, subject_department } from "@prisma/client"; +import session from "express-session"; + + +export class DepartmentRepository{ + constructor(private readonly prisma: PrismaService) { + } + + async getDepartmentOfUser(user: session_userprofile): Promise { + const departmentId = user.department_id; + const department = await this.prisma.subject_department.findUnique({ + where: { id: departmentId } + }); + return department; + } + + async getFavoriteDepartments(user: session_userprofile): Promise{ + const favoriteDepartments = (await this.prisma.session_userprofile_favorite_departments.findMany({ + where: { userprofile_id: user.id }, + include:{ + department: true + } + })).map((favoriteDepartment) => favoriteDepartment.department); + return favoriteDepartments; + } + + async getMajors(user: session_userprofile): Promise{ + const majors = (await this.prisma.session_userprofile_majors.findMany({ + where: { userprofile_id: user.id }, + include:{ + subject_department: true + } + })).map((major) => major.subject_department); + return majors; + } + + async getMinors(user: session_userprofile): Promise{ + const minors = (await this.prisma.session_userprofile_minors.findMany({ + where: { userprofile_id: user.id }, + include:{ + subject_department: true + } + })).map((minor) => minor.subject_department); + return minors; + } + + async getSpecializedMajors(user: session_userprofile): Promise{ + const specializedMajors = (await this.prisma.session_userprofile_specialized_major.findMany({ + where: {userprofile_id: user.id}, + include:{ + subject_department: true + } + })).map((specializedMajor) => specializedMajor.subject_department); + return specializedMajors; + } +} \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index b2f90ee6..2c6ebb49 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,8 +1,73 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; +import { lectureSelectResultType } from "../../common/schemaTypes/types"; @Injectable() -export class LectureRepository{ - constructor(private readonly prisma: PrismaService){} +export class LectureRepository { + constructor(private readonly prisma: PrismaService) { + } + + async findReviewWritableLectures(date?: Date): Promise { + let currDate; + if (!date) { + currDate = Date.now(); + } else { + currDate = date + } + const notWritableSemesters = await this.prisma.subject_semester.findMany({ + where: { + OR: [ + { + courseAddDropPeriodEnd: { + gte: currDate + }, + }, + { + beginning: { + gte: currDate + } + } + ] + } + }); + + const notWritableYearAndSemester = notWritableSemesters.map((semester) => { + return { + semester: semester.semester, + year: semester.year + } + }) + + const lectures = await this.prisma.subject_lecture.findMany({ + where: { + AND: notWritableYearAndSemester + } + }) + + return lectures; + } + + getResearchLectureQuery(): Prisma.subject_lectureWhereInput { + return { + type_en: { + in: ["Individual Study", "Thesis Study(Undergraduate)", + "Thesis Research(MA/phD)"] + } + } + } + + async getTakenLectures(user: session_userprofile): Promise { + const lectures: subject_lecture[] = (await this.prisma.session_userprofile_taken_lectures.findMany({ + where: { + userprofile_id: user.id + }, + include: { + lecture: true + } + })).map((takenLecture) => takenLecture.lecture); + + return lectures; + } } \ No newline at end of file diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index a2d1e90a..8d761286 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,8 +1,16 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { review_review, session_userprofile, subject_department } from "@prisma/client"; @Injectable() export class ReviewRepository{ constructor(private readonly prisma: PrismaService){} + async findReviewByUser(user: session_userprofile): Promise{ + const reviews = await this.prisma.review_review.findMany({ + where: { writer_id: user.id }, + }) + return reviews; + } + } \ No newline at end of file From f1d91cdf907fc53a81a55df021be6a43aa5fa75c Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:36:49 +0900 Subject: [PATCH 020/250] Add: remove redundant functions --- .../interfaces/serializer/user.serializer.ts | 30 ------------------- 1 file changed, 30 deletions(-) diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index a08296ef..129bb629 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -26,34 +26,4 @@ export async function loadUser(user:session_userprofile | userSelectResultType, export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - - const majors = await prisma.session_userprofile.findMany({ - include: { - session_userprofile_majors: { - include: { - subject_department: true - } - }, - favorite_departments: { - include:{ - department: true - } - }, - } - }); - - const reviewList: review_review[] = await prisma.review_review.findMany({ - - }) - - - return { - id: user.id, - email: user.email, - student_id: user.student_id, - firstName: user.first_name, - lastName: user.last_name, - department: user.department, - majors: user.session_userprofile_majors. - }; } \ No newline at end of file From 707463159a1859b03cf48e7374305b571cfcb719 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:43:18 +0900 Subject: [PATCH 021/250] Chore: Add DepartmentRepositiory to PrismaModule --- src/prisma/prisma.module.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 131643af..3b4a5868 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -3,15 +3,20 @@ import { PrismaService } from "./prisma.service"; import { UserRepository } from "./repositories/user.repository"; import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewRepository } from "./repositories/review.repository"; +import { DepartmentRepository } from "./repositories/department.repository"; @Module({ providers: [PrismaService, UserRepository, LectureRepository, - ReviewRepository], + ReviewRepository, + DepartmentRepository, + ], exports: [PrismaService, UserRepository, LectureRepository, - ReviewRepository] + ReviewRepository, + DepartmentRepository, + ] }) export class PrismaModule {} From 01acc6a6f14b013914d579db921506819dbba6e2 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 21:47:08 +0900 Subject: [PATCH 022/250] Chore: remove redundant console.log --- src/modules/auth/auth.controller.ts | 1 - src/modules/auth/guard/mock-auth-guard.ts | 1 - src/modules/auth/strategy/jwt-cookie.strategy.ts | 1 - src/modules/auth/utils/sparcs-sso.ts | 2 -- 4 files changed, 5 deletions(-) diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 6ae3d0cc..4f5ae6a9 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -40,7 +40,6 @@ export class AuthController { } req.session['next'] = next ?? '/'; const { url, state } = this.ssoClient.get_login_params(); - console.log(url, state); req.session['sso_state'] = state; if (social_login === '0') { return res.redirect(url + '&social_enabled=0&show_disabled_button=0'); diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index 4a823c2c..aec54960 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -43,7 +43,6 @@ export class MockAuthGuard implements CanActivate{ secret: settings().getJwtConfig().secret } ); - console.log("payload", payload); const user = this.authService.findBySid(payload.sid); request["user"] = user; return true; diff --git a/src/modules/auth/strategy/jwt-cookie.strategy.ts b/src/modules/auth/strategy/jwt-cookie.strategy.ts index 74460201..f477a1ac 100644 --- a/src/modules/auth/strategy/jwt-cookie.strategy.ts +++ b/src/modules/auth/strategy/jwt-cookie.strategy.ts @@ -32,7 +32,6 @@ export class JwtCookieStrategy extends PassportStrategy( } async validate(payload) { - console.log(payload); return this.authService.findBySid(payload.sid); } } diff --git a/src/modules/auth/utils/sparcs-sso.ts b/src/modules/auth/utils/sparcs-sso.ts index 9da89446..af91143a 100644 --- a/src/modules/auth/utils/sparcs-sso.ts +++ b/src/modules/auth/utils/sparcs-sso.ts @@ -44,8 +44,6 @@ export class Client { :param secret_key: your secret key :param is_beta: true iff you want to use SPARCS SSO beta server :param server_addr: SPARCS SSO server addr (only for testing)*/ - console.log(is_beta) - console.log(is_beta ? true : false); this.DOMAIN = is_beta ? this.BETA_DOMAIN : this.SERVER_DOMAIN; this.DOMAIN = server_addr || this.DOMAIN; From 62a694e03b57954f3703077c694060dfdd4dc1bb Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 22:08:27 +0900 Subject: [PATCH 023/250] Chore: make departmentRepository injectable --- src/bootstrap/bootstrap.ts | 2 +- src/modules/auth/auth.controller.ts | 1 + src/prisma/repositories/department.repository.ts | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index cb769cea..f77438de 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -65,7 +65,7 @@ async function bootstrap() { const prismaService = app.get(PrismaService); await prismaService.enableShutdownHooks(app) - return app.listen(3000); + return app.listen(8080); } bootstrap() diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 4f5ae6a9..be792e70 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -85,6 +85,7 @@ export class AuthController { @Todo implement userSerializer, before that, we'd like to architect the dto types */ + console.log(user); const profile = await this.userService.getProfile(user); return profile; } diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index 4a424dc6..fdffdcc1 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -1,8 +1,9 @@ import { PrismaService } from "../prisma.service"; import { session_userprofile, subject_department } from "@prisma/client"; import session from "express-session"; +import { Injectable } from "@nestjs/common"; - +@Injectable() export class DepartmentRepository{ constructor(private readonly prisma: PrismaService) { } From b0697f2b935da18e9d72aba45ed3d88346bc1842 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 10 Jul 2023 23:28:57 +0900 Subject: [PATCH 024/250] Add: complete implementing --- src/bootstrap/bootstrap.ts | 3 +- src/common/utils/method.utils.ts | 20 ++++++++ src/modules/auth/auth.controller.ts | 1 - src/modules/user/user.service.ts | 51 ++++++++++++++++--- .../repositories/department.repository.ts | 3 +- src/prisma/repositories/lecture.repository.ts | 31 +++++++---- src/settings.ts | 16 +++++- test/session/session.spec.ts | 44 ++++++++++++++++ 8 files changed, 148 insertions(+), 21 deletions(-) create mode 100644 test/session/session.spec.ts diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index f77438de..50b2738f 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -11,6 +11,7 @@ import cookieParser from "cookie-parser"; import session from "express-session"; import { MockAuthGuard } from "../modules/auth/guard/mock-auth-guard"; import { JwtCookieGuard } from "../modules/auth/guard/jwt-cookie.guard"; +import settings from "../settings"; let cachedServer: Server; @@ -22,7 +23,7 @@ async function bootstrap() { app.enableVersioning({ type: VersioningType.URI }); - app.enableCors(); + app.enableCors(settings().getCorsConfig()); app.useGlobalPipes( new ValidationPipe({ whitelist: true, diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index e6d37fe1..5615d677 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,6 +15,26 @@ export function normalizeArray( return normalizeObj } +export function groupBy( + arr: T[], + selector: (item: T) => string | number | null = (item: any) => item.id, +) { + const map: Record = {} + + arr.forEach(data => { + const key = selector(data) + if (key !== null) { + if (map[key]) { + map[key]!.push(data) + } else { + map[key] = [data] + } + } + }) + + return map +} + type ValueType = string | number | boolean export type Union< T extends { [key: string]: ValueType } | ReadonlyArray, diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index be792e70..4f5ae6a9 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -85,7 +85,6 @@ export class AuthController { @Todo implement userSerializer, before that, we'd like to architect the dto types */ - console.log(user); const profile = await this.userService.getProfile(user); return profile; } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 5c51e0fc..5ab5e859 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -26,16 +26,51 @@ export class UserService { public async getProfile(user: session_userprofile){ const promises = []; - const departmentPromise = this.departmentRepository.getDepartmentOfUser(user); - const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user); - const majorsPromise = this.departmentRepository.getMajors(user); - const minorsPromise = this.departmentRepository.getMinors(user); - const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user); - const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(new Date()); - const takenLecturesPromise = this.lectureRepository.getTakenLectures(user); - const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) + console.time('querying') + const startTime = new Date(); + const departmentPromise = this.departmentRepository.getDepartmentOfUser(user).then((department) => { + const endTime = new Date(); + console.log('querying department took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user).then((department) => { + const endTime = new Date(); + console.log('querying favorite department took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const majorsPromise = this.departmentRepository.getMajors(user).then((department) => { + const endTime = new Date(); + console.log('querying majors took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const minorsPromise = this.departmentRepository.getMinors(user).then((department) => { + const endTime = new Date(); + console.log('querying minors took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user).then((department) => { + const endTime = new Date(); + console.log('querying specializedMajors took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()).then((department) => { + const endTime = new Date(); + console.log('querying reviewWritableLectures took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user).then((department) => { + const endTime = new Date(); + console.log('querying takenLectures took: ', endTime.getTime() - startTime.getTime()); + return department; + }) + const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user).then((department) => { + const endTime = new Date(); + console.log('querying writtenReview took: ', endTime.getTime() - startTime.getTime()); + return department; + }) promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); + console.timeEnd('querying') const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; const researchLectures = Object.values(ResearchLecture); const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index fdffdcc1..c11ac9a0 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -9,7 +9,8 @@ export class DepartmentRepository{ } async getDepartmentOfUser(user: session_userprofile): Promise { - const departmentId = user.department_id; + const departmentId = user.department_id + if(!departmentId) return null; const department = await this.prisma.subject_department.findUnique({ where: { id: departmentId } }); diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 2c6ebb49..33826c1a 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; import { lectureSelectResultType } from "../../common/schemaTypes/types"; +import { groupBy } from "../../common/utils/method.utils"; @Injectable() export class LectureRepository { @@ -9,7 +10,7 @@ export class LectureRepository { } - async findReviewWritableLectures(date?: Date): Promise { + async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { let currDate; if (!date) { currDate = Date.now(); @@ -32,21 +33,33 @@ export class LectureRepository { ] } }); - - const notWritableYearAndSemester = notWritableSemesters.map((semester) => { + console.log(notWritableSemesters); + const notWritableYearAndSemester = groupBy(notWritableSemesters.map((semester) => { return { semester: semester.semester, year: semester.year } - }) + }),(subject_semester) => subject_semester.year) - const lectures = await this.prisma.subject_lecture.findMany({ - where: { - AND: notWritableYearAndSemester - } + const notWritableYearAndSemesterMap: Record> = null; + for (const key in notWritableYearAndSemester) { + const objects = notWritableYearAndSemester[key]; + const mapObjects = groupBy(objects); + notWritableYearAndSemesterMap[key] = mapObjects; + } + + const takenLectures = await this.getTakenLectures(user); + const reviewWritableLectures = takenLectures.filter((lecture) => { + return notWritableYearAndSemesterMap[lecture.year][lecture.semester] ? true: false }) - return lectures; + // const lectures = await this.prisma.subject_lecture.findMany({ + // where: { + // AND: notWritableYearAndSemester + // } + // }) + + return reviewWritableLectures; } getResearchLectureQuery(): Prisma.subject_lectureWhereInput { diff --git a/src/settings.ts b/src/settings.ts index 43614f2d..8d4f1874 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -14,9 +14,23 @@ export default () => { awsconfig: () => getAWSConfig(), getJwtConfig: () => getJwtConfig(), getSsoConfig: () => getSsoConfig(), + getCorsConfig: () => getCorsConfig(), }; }; +const getCorsConfig = () => { + const { NODE_ENV } = process.env; + if(NODE_ENV === 'local'){ + return { + origin: "http://localhost:3000", + methods: "GET,HEAD,PUT,PATCH,POST,DELETE", + credentials: true, + preflightContinue: false, + optionsSuccessStatus: 204 + } + } +} + const getPrismaConfig = (): PrismaClientOptions => { return { datasources: { @@ -25,7 +39,7 @@ const getPrismaConfig = (): PrismaClientOptions => { }, }, errorFormat: 'pretty', - log: [`error`], + log: [`error`,'query'], }; }; diff --git a/test/session/session.spec.ts b/test/session/session.spec.ts new file mode 100644 index 00000000..1905d02f --- /dev/null +++ b/test/session/session.spec.ts @@ -0,0 +1,44 @@ +import { INestApplication } from "@nestjs/common"; +import { Test, TestingModule } from "@nestjs/testing"; +import { AppModule } from "../../src/app.module"; +import * as request from "supertest"; +import { PrismaService } from "../../src/prisma/prisma.service"; +import { UserService } from "../../src/modules/user/user.service"; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/session/info (GET)', async () => { + const prismaService = app.get(PrismaService); + const session_userprofileList = await prismaService.session_userprofile.findMany({}) + + const userService = app.get(UserService); + const batchSize = 50; + const batchCount = Math.ceil(session_userprofileList.length / batchSize); + + for(let i = 0; i < batchCount; i++){ + const batch = session_userprofileList.slice(i * batchSize, (i + 1) * batchSize); + batch.forEach((user) => { + const profile = userService.getProfile(user) + .then((profile) => { + + }) + }) + } + + + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); From 4067ceed0578fb7386893904ce8e824894ebdf81 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 3 Jul 2023 19:34:56 +0900 Subject: [PATCH 025/250] commit for merge --- src/modules/courses/courses.controller.ts | 90 +++++++++++++++++++- src/modules/courses/courses.service.ts | 33 ++++++- src/prisma/repositories/course.repository.ts | 59 +++++++++++++ 3 files changed, 179 insertions(+), 3 deletions(-) diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 569fbdc4..6b4064b3 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,4 +1,90 @@ -import { Controller } from '@nestjs/common'; +import { CourseRepository } from './../../prisma/repositories/course.repository'; +import { Controller, Get, Post, Param, Query, UseGuards } from '@nestjs/common'; +import { CoursesService } from './courses.service'; +import { AuthGuard } from '@nestjs/passport'; +import { subject_course } from '@prisma/client'; +import { review_review } from '@prisma/client'; @Controller('courses') -export class CoursesController {} +export class CourseController { + constructor(private readonly CoursesService: CoursesService, + private readonly CourseRepository: CourseRepository) {} + + @Get() + async getCourses(@Query() query: any): Promise { + const courses = await this.CoursesService.getAllCourses(query); + + return courses.map((course) => this.CoursesService.courseToJson(course)); + } + + @Get(':id') + async getCourse(@Param('id') id: string): Promise { + return this.CoursesService.getCourseById(id); + } + + @Get('autocomplete') + async getCourseAutocomplete(@Query() query: any): Promise { + const { keyword } = query; + return this.CoursesService.getAutocompleteResults(keyword); + } + + @Get(':id/reviews') + async getCourseReviews( + @Param('id') id: string, + @Query() query: any, + ): Promise { + const MAX_LIMIT = 100; + const DEFAULT_ORDER = ['-lecture.year', '-lecture.semester', '-written_datetime', '-id']; + + const { order, offset, limit } = query; + + const course = await this.CoursesService.getCourseById(id); + const reviews = await this.CoursesService.getReviewsByCourse(course); + + let filteredReviews = await this.CoursesService.applyOrder( + reviews, + order, + DEFAULT_ORDER, + ); + filteredReviews = await this.CoursesService.applyOffsetAndLimit( + filteredReviews, + offset, + limit, + MAX_LIMIT, + ); + + return filteredReviews.map((review) => this.CoursesService.mapReviewToJSON(review)); + } + + @Get(':id/lectures') + async getCourseLectures(@Param('id') id: string, @Query() query: any): Promise { + const DEFAULT_ORDER = ['year', 'semester', 'class_no']; + + const { order } = query; + + const course = await this.CoursesService.getCourseById(id); + const lectures = await this.CoursesService.getLecturesByCourse(course); + + const filteredLectures = await this.CoursesService.applyOrder( + lectures, + order, + DEFAULT_ORDER, + ); + + return filteredLectures.map((lecture) => this.CoursesService.mapLectureToJSON(lecture)); + } + + @Post(':id/read') + @UseGuards(AuthGuard('jwt')) + async markCourseAsRead(@Param('id') id: string): Promise { + const course = await this.CoursesService.getCourseById(id); + const profile = request.user.userprofile; + + try { + const courseUser = await this.CoursesService.getCourseUser(profile, course); + await this.CoursesService.saveCourseUser(courseUser); + } catch (error) { + await this.CoursesService.createCourseUser(profile, course); + } + } +} diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 6bd25f32..1c337533 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,4 +1,35 @@ +import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable } from '@nestjs/common'; +import { review_review, subject_course } from '@prisma/client'; +import { PrismaService } from 'src/prisma/prisma.service'; @Injectable() -export class CoursesService {} +export class CoursesService { + constructor( + private readonly CourseRepository: CourseRepository, + private prisma: PrismaService + ) {} + + public async getAllCourses(query: any) { + const MAX_LIMIT = 150; + const DEFAULT_ORDER = ['old_code']; + + const { + department, + type, + level, + group, + keyword, + term, + order, + offset, + limit, + } = query; + + const query_result = await this.prisma.subject_course.findMany({ + include: { + subject_department: true, + } + }); + } +} \ No newline at end of file diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index b5afc2cb..2ec23eab 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,8 +1,67 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { subject_course, subject_lecture } from "@prisma/client"; @Injectable() export class CourseRepository{ constructor(private readonly prisma: PrismaService){} + + private TYPE_ACRONYMS = { + "GR": "General Required", + "MGC": "Mandatory General Courses", + "BE": "Basic Elective", + "BR": "Basic Required", + "EG": "Elective(Graduate)", + "HSE": "Humanities & Social Elective", + "OE": "Other Elective", + "ME": "Major Elective", + "MR": "Major Required", + } + private MAJOR_ACRONYMS = [ + "CE", + "MSB", + "ME", + "PH", + "BiS", + "IE", + "ID", + "BS", + "CBE", + "MAS", + "MS", + "NQE", + "HSS", + "EE", + "CS", + "AE", + "CH", + "TS", + ] + async filterByDepartment (querySet: T, department: string[]): Promise { + if (!department || department.length === 0) { + return querySet; + } + + if (department.includes('ALL')) { + return querySet; + } else if (department.includes('ETC')) { + const excludedDepartments = this.MAJOR_ACRONYMS.filter((code) => !department.includes(code)); + return this.prisma.subject_course.findMany({ + where: { + department_id: { notIn: excludedDepartments } + }, + }); + } else { + return this.prisma.subject_course.findMany({ + where: { + department: { + code: { + in: department, + }, + }, + }, + }); + } + } } \ No newline at end of file From 5a427e7d41ceef871453414053f8a04715f96633 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:17:59 +0900 Subject: [PATCH 026/250] temporal commit --- src/modules/courses/courses.service.ts | 8 +- src/prisma/repositories/course.repository.ts | 184 ++++++++++++++++--- src/prisma/schema.prisma | 2 + 3 files changed, 168 insertions(+), 26 deletions(-) diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 1c337533..58250624 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,6 +1,8 @@ +import { subject_department } from './../../../node_modules/.prisma/client/index.d'; import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable } from '@nestjs/common'; import { review_review, subject_course } from '@prisma/client'; +import { courseSelectResultType } from 'src/common/schemaTypes/types'; import { PrismaService } from 'src/prisma/prisma.service'; @Injectable() @@ -26,10 +28,6 @@ export class CoursesService { limit, } = query; - const query_result = await this.prisma.subject_course.findMany({ - include: { - subject_department: true, - } - }); + const query_result = CourseRepository.filterByRequest(query); } } \ No newline at end of file diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 2ec23eab..c7fc4e6a 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,6 +1,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { subject_course, subject_lecture } from "@prisma/client"; +import { courseSelectResultType } from "src/common/schemaTypes/types"; @Injectable() export class CourseRepository{ @@ -38,30 +39,171 @@ export class CourseRepository{ "TS", ] - async filterByDepartment (querySet: T, department: string[]): Promise { - if (!department || department.length === 0) { - return querySet; + public async filterByRequest (query: any) { + const { + department, + type, + level, + group, + keyword, + term, + order, + offset, + limit, + } = query; + const department_filter = this.department_filter(department); + const type_filter = this.type_filter(type); + const level_filter = this.level_filter(level); + const group_filter = this.group_filter(group); + const keyword_filter = this.keyword_filter(keyword); + const term_filter = this.term_filter(term); + return await this.prisma.subject_course.findMany({ + include: { + department: true, + }, + where: { + AND: [ + department_filter, + type_filter, + level_filter, + group_filter, + keyword_filter, + term_filter, + ] + } + }) + } + + private department_filter(department: [string]) { + if (!(department)) { + return {} } + if ("ALL" in department) { + return {} + } else if ("ETC" in department) { + return { + department: { + code: { + notIn: { department } + } + } + } + } else { + return { + department: { + code: { + in: { department } + } + } + } + } + } - if (department.includes('ALL')) { - return querySet; - } else if (department.includes('ETC')) { - const excludedDepartments = this.MAJOR_ACRONYMS.filter((code) => !department.includes(code)); - return this.prisma.subject_course.findMany({ - where: { - department_id: { notIn: excludedDepartments } - }, - }); + private type_filter(types: [string]) { + if (!(types)) { + return {} + } + + if ("ALL" in types) { + return {} + } else if ("ETC" in types) { + const unselected_types = Object.values(this.TYPE_ACRONYMS).filter((type) => !(type in types)) + return { + type_en: { + in: { unselected_types } + } + } } else { - return this.prisma.subject_course.findMany({ - where: { - department: { - code: { - in: department, - }, - }, - }, - }); + return { + type_en: { + in: { types } + } + } } } + + private level_filter(levels?: [string]) { + if (!(levels)) { + return {} + } + + const acronym_dic = ["1", "2", "3", "4"]; + if ("ALL" in levels) { + return {} + } else if ("ETC" in levels) { + const numbers = acronym_dic.filter((level) => !(level in levels)); + return { + old_code: { + contains: { + numbers + } + } + }; + } else { + const numbers = acronym_dic.filter((level) => level in levels); + return { + old_code: { + contains: { + numbers + } + } + }; + } + } + + private term_filter(term?: [string]) { + if (!(term)) { + return {} + } + + if ("ALL" in term) { + return {} + } else { + const current_year = new Date().getFullYear().toString(); + return { + lecture: { + year: current_year + } + } + } + } + + private keyword_filter(keyword?: [string]) { + if (!(keyword)) { + return {} + } + + const keyword_trimed = keyword.map((word) => word.trim()); + const keyword_space_removed = keyword.map((word) => word.replace(/\s/g, "")); + const title_filter = { + title: { + + } + } + return + } + + private group_filter(group?: [string]) { + if (!(group)) { + return {} + } + + const filter = []; + + if ("Basic" in group) { + filter.push("Basic Required", "Basic Elective"); + } + if ("Humanity" in group) { + filter.push("Humanities & Social Elective"); + } + if (group.length > 2) { + filter.push("Major Required", "Major Elective", "Elective(Graduate)"); + } + + return { + type_en: { + in: { filter } + } + }; + } } \ No newline at end of file diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 08e8eb30..65515f46 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -364,6 +364,8 @@ model subject_course { type_en String @db.VarChar(36) title String @db.VarChar(100) title_en String @db.VarChar(200) + title_no_space String @db.VarChar(100) + title_en_no_space String @db.VarChar(200) summury String @db.VarChar(400) grade_sum Float load_sum Float From 73dc128f2aea0f75f70a3179ecc548023a9f61c2 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:43:54 +0900 Subject: [PATCH 027/250] migrate: add_no_space_columns --- .../migration.sql | 10 ++++ .../noSpaceColumns.ts | 55 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql create mode 100644 src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts diff --git a/src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql b/src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql new file mode 100644 index 00000000..6b20593e --- /dev/null +++ b/src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `title_en_no_space` to the `subject_course` table without a default value. This is not possible if the table is not empty. + - Added the required column `title_no_space` to the `subject_course` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `subject_course` ADD COLUMN `title_en_no_space` VARCHAR(200) NOT NULL, + ADD COLUMN `title_no_space` VARCHAR(100) NOT NULL; diff --git a/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts b/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts new file mode 100644 index 00000000..7c8a8dc6 --- /dev/null +++ b/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts @@ -0,0 +1,55 @@ +import { PrismaService } from "../../prisma.service"; +import settings from "../../../settings"; + +async function main() { + const ormConfig = settings().ormconfig(); + console.log(ormConfig); + const prisma = new PrismaService(); + try { + await prisma.$connect(); + await prisma.$transaction(async (tx)=> { + const subject_course = await tx.subject_course.findMany(); + + const BATCH_SIZE = 1000; + console.log(subject_course.length); + for (let i = 0; i < Math.ceil(subject_course.length / BATCH_SIZE); i++) { + const sliced_subject_course = subject_course.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE + ); + const bulkPromises = sliced_subject_course.map(async (course) => { + const result = tx.subject_course.update({ + where: { + id: course.id + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + } + }); + return result; + }); + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + },{ + maxWait: 5000, + timeout: 300000 + }) + } catch (e) { + console.error(e); + } finally { + await prisma.$disconnect(); + } +} + +main() + .then(() => { + console.log("done"); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + process.exit(0); + }); From 052eb0a0edeb651f7b0f98e4768d664ad4bbff03 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 11 Jul 2023 19:41:07 +0900 Subject: [PATCH 028/250] add_fk_between_course_and_department --- .../migration.sql | 5 + src/prisma/repositories/course.repository.ts | 112 ++++++++++++------ src/prisma/schema.prisma | 104 ++++++++-------- 3 files changed, 136 insertions(+), 85 deletions(-) create mode 100644 src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql diff --git a/src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql b/src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql new file mode 100644 index 00000000..12090a5a --- /dev/null +++ b/src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql @@ -0,0 +1,5 @@ +-- CreateIndex +CREATE INDEX `subject_course_department_id_fkey` ON `subject_course`(`department_id`); + +-- AddForeignKey +ALTER TABLE `subject_course` ADD CONSTRAINT `subject_course_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index c7fc4e6a..a83c8ac1 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,7 +1,5 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { subject_course, subject_lecture } from "@prisma/client"; -import { courseSelectResultType } from "src/common/schemaTypes/types"; @Injectable() export class CourseRepository{ @@ -38,7 +36,9 @@ export class CourseRepository{ "CH", "TS", ] - + //할일 + // Foreign key subject_course_professor 새로 걸어주기 + // subject_professor_course_list drop 하기 public async filterByRequest (query: any) { const { department, @@ -57,34 +57,30 @@ export class CourseRepository{ const group_filter = this.group_filter(group); const keyword_filter = this.keyword_filter(keyword); const term_filter = this.term_filter(term); + let filter_list = [department_filter, type_filter, level_filter, group_filter, keyword_filter, term_filter] + filter_list = filter_list.filter((filter) => filter !== null) return await this.prisma.subject_course.findMany({ include: { department: true, + professor_course_list: true }, where: { - AND: [ - department_filter, - type_filter, - level_filter, - group_filter, - keyword_filter, - term_filter, - ] + AND: filter_list } }) } - private department_filter(department: [string]) { - if (!(department)) { - return {} + private department_filter(department_names: [string]): object { + if (!(department_names)) { + return null } - if ("ALL" in department) { - return {} - } else if ("ETC" in department) { + if ("ALL" in department_names) { + return null + } else if ("ETC" in department_names) { return { department: { code: { - notIn: { department } + notIn: { department_names } } } } @@ -92,20 +88,20 @@ export class CourseRepository{ return { department: { code: { - in: { department } + in: { department_names } } } } } } - private type_filter(types: [string]) { + private type_filter(types: [string]): object { if (!(types)) { - return {} + return null } if ("ALL" in types) { - return {} + return null } else if ("ETC" in types) { const unselected_types = Object.values(this.TYPE_ACRONYMS).filter((type) => !(type in types)) return { @@ -122,14 +118,14 @@ export class CourseRepository{ } } - private level_filter(levels?: [string]) { + private level_filter(levels?: [string]): object { if (!(levels)) { - return {} + return null; } const acronym_dic = ["1", "2", "3", "4"]; if ("ALL" in levels) { - return {} + return null; } else if ("ETC" in levels) { const numbers = acronym_dic.filter((level) => !(level in levels)); return { @@ -151,41 +147,83 @@ export class CourseRepository{ } } - private term_filter(term?: [string]) { + private term_filter(term?: [string]): object { if (!(term)) { - return {} + return null; } if ("ALL" in term) { - return {} + return null; } else { const current_year = new Date().getFullYear().toString(); return { lecture: { year: current_year } - } + }; } } - private keyword_filter(keyword?: [string]) { + private keyword_filter(keyword?: [string]): object { if (!(keyword)) { - return {} + return null; } const keyword_trimed = keyword.map((word) => word.trim()); - const keyword_space_removed = keyword.map((word) => word.replace(/\s/g, "")); + const keyword_space_removed = keyword_trimed.map((word) => word.replace(/\s/g, "")); const title_filter = { - title: { - + title_no_space: { + contains: { keyword_space_removed } + } + }; + const en_title_filter = { + en_title_np_space: { + contains: { keyword_space_removed } + } + }; + const department_name_filter = { + department: { + name: keyword_trimed + } + }; + const department_name_en_filter = { + department: { + name_en: keyword_trimed + } + }; + const professors_professor_name_filter = { + subject_professor_course_list: { + subject_professor: { + professor_name: { + contains: { keyword_trimed } + } + } + } + }; + const professors_professor_name_en_filter = { + subject_professor_course_list: { + subject_professor: { + professor_name_en: { + contains: { keyword_trimed } + } + } } } - return + return { + OR: [ + title_filter, + en_title_filter, + department_name_filter, + department_name_en_filter, + professors_professor_name_filter, + professors_professor_name_en_filter + ] + }; } - private group_filter(group?: [string]) { + private group_filter(group?: [string]): object { if (!(group)) { - return {} + return null; } const filter = []; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 65515f46..f3d51bd8 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -236,7 +236,6 @@ model review_review { load Int @db.SmallInt speech Int @db.SmallInt writer_id Int? - writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) writer_label String @db.VarChar(200) updated_datetime DateTime @db.DateTime(0) like Int @@ -244,6 +243,7 @@ model review_review { written_datetime DateTime? @db.DateTime(0) main_famoushumanityreviewdailyfeed_reviews main_famoushumanityreviewdailyfeed_reviews[] main_famousmajorreviewdailyfeed_reviews main_famousmajorreviewdailyfeed_reviews[] + writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) @@unique([writer_id, lecture_id], map: "review_comment_writer_id_af700a5d_uniq") @@index([written_datetime], map: "review_comment_e5e30a4a") @@ -260,40 +260,43 @@ model review_reviewvote { } model session_userprofile { - id Int @id @default(autoincrement()) - student_id String @db.VarChar(10) - sid String @db.VarChar(30) + id Int @id @default(autoincrement()) + student_id String @db.VarChar(10) + sid String @db.VarChar(30) department_id Int? - department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) - email String? @db.VarChar(255) - date_joined DateTime @db.DateTime(0) - first_name String @db.VarChar(30) - last_name String @db.VarChar(150) - refresh_token String? @db.VarChar(255) + email String? @db.VarChar(255) + date_joined DateTime @db.DateTime(0) + first_name String @db.VarChar(30) + last_name String @db.VarChar(150) + refresh_token String? @db.VarChar(255) main_ratedailyuserfeed main_ratedailyuserfeed[] main_relatedcoursedailyuserfeed main_relatedcoursedailyuserfeed[] main_reviewwritedailyuserfeed main_reviewwritedailyuserfeed[] planner_planner planner_planner[] + reviews review_review[] + department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) + favorite_departments session_userprofile_favorite_departments[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] - favorite_departments session_userprofile_favorite_departments[] - subject_courseuser subject_courseuser[] taken_lectures session_userprofile_taken_lectures[] + subject_courseuser subject_courseuser[] support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? - reviews review_review[] + + @@index([department_id], map: "session_userprofile_department_id_fkey") } model session_userprofile_favorite_departments { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) userprofile_id Int - userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) department_id Int department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, department_id], map: "userprofile_id") + @@index([department_id], map: "session_userprofile_favorite_departments_department_id_fkey") } model session_userprofile_majors { @@ -330,13 +333,14 @@ model session_userprofile_specialized_major { } model session_userprofile_taken_lectures { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) userprofile_id Int - userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, lecture_id], map: "userprofile_id") + @@index([lecture_id], map: "session_userprofile_taken_lectures_lecture_id_fkey") } model subject_classtime { @@ -364,8 +368,6 @@ model subject_course { type_en String @db.VarChar(36) title String @db.VarChar(100) title_en String @db.VarChar(200) - title_no_space String @db.VarChar(100) - title_en_no_space String @db.VarChar(200) summury String @db.VarChar(400) grade_sum Float load_sum Float @@ -375,13 +377,18 @@ model subject_course { load Float speech Float latest_written_datetime DateTime? @db.DateTime(0) + title_en_no_space String @db.VarChar(200) + title_no_space String @db.VarChar(100) main_relatedcoursedailyuserfeed main_relatedcoursedailyuserfeed[] planner_futureplanneritem planner_futureplanneritem[] + subject_department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) subject_course_related_courses_posterior_subject_course_related_courses_posterior_from_course_idTosubject_course subject_course_related_courses_posterior[] @relation("subject_course_related_courses_posterior_from_course_idTosubject_course") subject_course_related_courses_posterior_subject_course_related_courses_posterior_to_course_idTosubject_course subject_course_related_courses_posterior[] @relation("subject_course_related_courses_posterior_to_course_idTosubject_course") subject_course_related_courses_prior_subject_course_related_courses_prior_from_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_from_course_idTosubject_course") subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_to_course_idTosubject_course") subject_courseuser subject_courseuser[] + + @@index([department_id], map: "subject_course_department_id_fkey") } model subject_course_professors { @@ -427,21 +434,22 @@ model subject_courseuser { } model subject_department { - id Int @id - num_id String @db.VarChar(4) - code String @db.VarChar(5) - name String @db.VarChar(60) - name_en String? @db.VarChar(60) - visible Boolean - graduation_additionaltrack graduation_additionaltrack[] - graduation_majortrack graduation_majortrack[] - main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] - planner_arbitraryplanneritem planner_arbitraryplanneritem[] - session_userprofile session_userprofile[] - session_userprofile_favorite_departments session_userprofile_favorite_departments[] - session_userprofile_majors session_userprofile_majors[] - session_userprofile_minors session_userprofile_minors[] - session_userprofile_specialized_major session_userprofile_specialized_major[] + id Int @id + num_id String @db.VarChar(4) + code String @db.VarChar(5) + name String @db.VarChar(60) + name_en String? @db.VarChar(60) + visible Boolean + graduation_additionaltrack graduation_additionaltrack[] + graduation_majortrack graduation_majortrack[] + main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] + planner_arbitraryplanneritem planner_arbitraryplanneritem[] + session_userprofile session_userprofile[] + session_userprofile_favorite_departments session_userprofile_favorite_departments[] + session_userprofile_majors session_userprofile_majors[] + session_userprofile_minors session_userprofile_minors[] + session_userprofile_specialized_major session_userprofile_specialized_major[] + subject_course subject_course[] } model subject_examtime { @@ -456,17 +464,17 @@ model subject_examtime { } model subject_lecture { - id Int @id @default(autoincrement()) - code String @db.VarChar(10) - old_code String @db.VarChar(10) + id Int @id @default(autoincrement()) + code String @db.VarChar(10) + old_code String @db.VarChar(10) year Int - semester Int @db.SmallInt + semester Int @db.SmallInt department_id Int - class_no String @db.VarChar(4) - title String @db.VarChar(100) - title_en String @db.VarChar(200) - type String @db.VarChar(12) - type_en String @db.VarChar(36) + class_no String @db.VarChar(4) + title String @db.VarChar(100) + title_en String @db.VarChar(200) + type String @db.VarChar(12) + type_en String @db.VarChar(36) audience Int credit Int num_classes Int @@ -484,15 +492,15 @@ model subject_lecture { load Float speech Float review_total_weight Float - class_title String? @db.VarChar(100) - class_title_en String? @db.VarChar(100) - common_title String? @db.VarChar(100) - common_title_en String? @db.VarChar(100) + class_title String? @db.VarChar(100) + class_title_en String? @db.VarChar(100) + common_title String? @db.VarChar(100) + common_title_en String? @db.VarChar(100) main_reviewwritedailyuserfeed main_reviewwritedailyuserfeed[] planner_takenplanneritem planner_takenplanneritem[] + students session_userprofile_taken_lectures[] subject_classtime subject_classtime[] subject_examtime subject_examtime[] - students session_userprofile_taken_lectures[] timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] From d08612733755f5d8af417fb6e300a97b36f9ab8a Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 11 Jul 2023 19:43:38 +0900 Subject: [PATCH 029/250] migrate: drop_subject_professor_course_list --- .../migration.sql | 8 ++++++++ src/prisma/schema.prisma | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql diff --git a/src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql b/src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql new file mode 100644 index 00000000..af5bcd34 --- /dev/null +++ b/src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the `subject_professor_course_list` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +DROP TABLE `subject_professor_course_list`; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index f3d51bd8..2d9abd17 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -532,14 +532,6 @@ model subject_professor { speech Float } -model subject_professor_course_list { - id Int @id @default(autoincrement()) - professor_id Int - course_id Int - - @@unique([professor_id, course_id], map: "professor_id") -} - model subject_semester { id Int @id @default(autoincrement()) year Int From 17c6d901adff6389e36a4d5fcfd3c57f690ebab2 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 12 Jul 2023 18:58:48 +0900 Subject: [PATCH 030/250] migrate: add_fk_subject_course_professors --- .../migration.sql | 5 ++++ src/prisma/schema.prisma | 30 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql diff --git a/src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql b/src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql new file mode 100644 index 00000000..a8a99711 --- /dev/null +++ b/src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql @@ -0,0 +1,5 @@ +-- AddForeignKey +ALTER TABLE `subject_course_professors` ADD CONSTRAINT `subject_course_professors_course_id_fkey` FOREIGN KEY (`course_id`) REFERENCES `subject_course`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `subject_course_professors` ADD CONSTRAINT `subject_course_professors_professor_id_fkey` FOREIGN KEY (`professor_id`) REFERENCES `subject_professor`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 2d9abd17..8bee49c6 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -387,14 +387,17 @@ model subject_course { subject_course_related_courses_prior_subject_course_related_courses_prior_from_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_from_course_idTosubject_course") subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_to_course_idTosubject_course") subject_courseuser subject_courseuser[] + subject_course_professors subject_course_professors[] @@index([department_id], map: "subject_course_department_id_fkey") } model subject_course_professors { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) course_id Int professor_id Int + course subject_course @relation(fields: [course_id], references: [id], onUpdate: Restrict) + professor subject_professor @relation(fields: [professor_id], references: [id], onUpdate: Restrict) @@unique([course_id, professor_id], map: "course_id") } @@ -518,18 +521,19 @@ model subject_lecture_professors { } model subject_professor { - id Int @id @default(autoincrement()) - professor_name String @db.VarChar(100) - professor_name_en String? @db.VarChar(100) - professor_id Int - major String @db.VarChar(30) - grade_sum Float - load_sum Float - speech_sum Float - review_total_weight Float - grade Float - load Float - speech Float + id Int @id @default(autoincrement()) + professor_name String @db.VarChar(100) + professor_name_en String? @db.VarChar(100) + professor_id Int + major String @db.VarChar(30) + grade_sum Float + load_sum Float + speech_sum Float + review_total_weight Float + grade Float + load Float + speech Float + subject_course_professors subject_course_professors[] } model subject_semester { From 13377bb949a0a4b518a41f4eef2b656c01c92a0b Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 12 Jul 2023 19:24:48 +0900 Subject: [PATCH 031/250] Add: implement filterByRequest --- .../interfaces/serializer/user.serializer.ts | 30 +++++++ src/modules/courses/courses.controller.ts | 85 ++----------------- src/modules/courses/courses.module.ts | 4 +- src/modules/courses/courses.service.ts | 16 +--- src/prisma/repositories/course.repository.ts | 9 +- 5 files changed, 43 insertions(+), 101 deletions(-) diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index 129bb629..901e62bb 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -26,4 +26,34 @@ export async function loadUser(user:session_userprofile | userSelectResultType, export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { + + const majors: subject_department[] = await prisma.session_userprofile.findMany({ + include: { + session_userprofile_majors: { + include: { + subject_department: true + } + }, + favorite_departments: { + include:{ + department: true + } + } + } + }); + + const reviewList: review_review[] = await prisma.review_review.findMany({ + + }) + + + return { + id: user.id, + email: user.email, + student_id: user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: user.department, + majors: user.session_userprofile_majors, + } } \ No newline at end of file diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 6b4064b3..7515d428 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,90 +1,15 @@ import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Controller, Get, Post, Param, Query, UseGuards } from '@nestjs/common'; import { CoursesService } from './courses.service'; -import { AuthGuard } from '@nestjs/passport'; -import { subject_course } from '@prisma/client'; -import { review_review } from '@prisma/client'; -@Controller('courses') +@Controller('api/courses') export class CourseController { - constructor(private readonly CoursesService: CoursesService, - private readonly CourseRepository: CourseRepository) {} + constructor(private readonly CoursesService: CoursesService) {} @Get() - async getCourses(@Query() query: any): Promise { - const courses = await this.CoursesService.getAllCourses(query); + async getCourses(@Query() query: any) { + const courses = await this.CoursesService.getCourseByFilter(query); - return courses.map((course) => this.CoursesService.courseToJson(course)); - } - - @Get(':id') - async getCourse(@Param('id') id: string): Promise { - return this.CoursesService.getCourseById(id); - } - - @Get('autocomplete') - async getCourseAutocomplete(@Query() query: any): Promise { - const { keyword } = query; - return this.CoursesService.getAutocompleteResults(keyword); - } - - @Get(':id/reviews') - async getCourseReviews( - @Param('id') id: string, - @Query() query: any, - ): Promise { - const MAX_LIMIT = 100; - const DEFAULT_ORDER = ['-lecture.year', '-lecture.semester', '-written_datetime', '-id']; - - const { order, offset, limit } = query; - - const course = await this.CoursesService.getCourseById(id); - const reviews = await this.CoursesService.getReviewsByCourse(course); - - let filteredReviews = await this.CoursesService.applyOrder( - reviews, - order, - DEFAULT_ORDER, - ); - filteredReviews = await this.CoursesService.applyOffsetAndLimit( - filteredReviews, - offset, - limit, - MAX_LIMIT, - ); - - return filteredReviews.map((review) => this.CoursesService.mapReviewToJSON(review)); - } - - @Get(':id/lectures') - async getCourseLectures(@Param('id') id: string, @Query() query: any): Promise { - const DEFAULT_ORDER = ['year', 'semester', 'class_no']; - - const { order } = query; - - const course = await this.CoursesService.getCourseById(id); - const lectures = await this.CoursesService.getLecturesByCourse(course); - - const filteredLectures = await this.CoursesService.applyOrder( - lectures, - order, - DEFAULT_ORDER, - ); - - return filteredLectures.map((lecture) => this.CoursesService.mapLectureToJSON(lecture)); - } - - @Post(':id/read') - @UseGuards(AuthGuard('jwt')) - async markCourseAsRead(@Param('id') id: string): Promise { - const course = await this.CoursesService.getCourseById(id); - const profile = request.user.userprofile; - - try { - const courseUser = await this.CoursesService.getCourseUser(profile, course); - await this.CoursesService.saveCourseUser(courseUser); - } catch (error) { - await this.CoursesService.createCourseUser(profile, course); - } + return courses } } diff --git a/src/modules/courses/courses.module.ts b/src/modules/courses/courses.module.ts index 367e861b..c4b983c2 100644 --- a/src/modules/courses/courses.module.ts +++ b/src/modules/courses/courses.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common'; -import { CoursesController } from './courses.controller'; +import { CourseController } from './courses.controller'; import { CoursesService } from './courses.service'; @Module({ - controllers: [CoursesController], + controllers: [CourseController], providers: [CoursesService] }) export class CoursesModule {} diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 58250624..f28fc875 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -12,22 +12,10 @@ export class CoursesService { private prisma: PrismaService ) {} - public async getAllCourses(query: any) { + public async getCourseByFilter(query: any) { const MAX_LIMIT = 150; const DEFAULT_ORDER = ['old_code']; - const { - department, - type, - level, - group, - keyword, - term, - order, - offset, - limit, - } = query; - - const query_result = CourseRepository.filterByRequest(query); + return await this.CourseRepository.filterByRequest(query); } } \ No newline at end of file diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index a83c8ac1..8ecea909 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,5 +1,6 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { courseSelectResultType } from "src/common/schemaTypes/types"; @Injectable() export class CourseRepository{ @@ -36,9 +37,7 @@ export class CourseRepository{ "CH", "TS", ] - //할일 - // Foreign key subject_course_professor 새로 걸어주기 - // subject_professor_course_list drop 하기 + public async filterByRequest (query: any) { const { department, @@ -61,8 +60,8 @@ export class CourseRepository{ filter_list = filter_list.filter((filter) => filter !== null) return await this.prisma.subject_course.findMany({ include: { - department: true, - professor_course_list: true + subject_department: true, + subject_course_professors: { include: { professor: true }} }, where: { AND: filter_list From 14f7089051fbf967d5d8e8662e7419dc42a88e30 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:27:26 +0900 Subject: [PATCH 032/250] migrate: add_fk_subject_course_subject_lecture --- .../migration.sql | 2 ++ src/prisma/schema.prisma | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql diff --git a/src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql b/src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql new file mode 100644 index 00000000..6d784c8c --- /dev/null +++ b/src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `subject_lecture` ADD CONSTRAINT `subject_lecture_course_id_fkey` FOREIGN KEY (`course_id`) REFERENCES `subject_course`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 8bee49c6..56ee313c 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -388,6 +388,7 @@ model subject_course { subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_to_course_idTosubject_course") subject_courseuser subject_courseuser[] subject_course_professors subject_course_professors[] + lecture subject_lecture[] @@index([department_id], map: "subject_course_department_id_fkey") } @@ -488,6 +489,7 @@ model subject_lecture { is_english Boolean deleted Boolean course_id Int + course subject_course @relation(fields: [course_id], references: [id], onUpdate: Restrict) grade_sum Float load_sum Float speech_sum Float From ee3d6cb040be2473a4986e8425dde8e45a2d7cfd Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:33:56 +0900 Subject: [PATCH 033/250] Add: implement course filtering --- src/app.module.ts | 3 +- .../interfaces/serializer/user.serializer.ts | 28 +++--- src/common/schemaTypes/types.ts | 4 + src/common/utils/search.utils.ts | 25 +++++ src/modules/courses/courses.controller.ts | 1 - src/modules/courses/courses.module.ts | 4 +- src/modules/courses/courses.service.ts | 34 +++++-- src/prisma/prisma.module.ts | 3 + src/prisma/repositories/course.repository.ts | 95 +++++++++++-------- 9 files changed, 130 insertions(+), 67 deletions(-) create mode 100644 src/common/utils/search.utils.ts diff --git a/src/app.module.ts b/src/app.module.ts index b248af72..f24f4c68 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,9 +7,10 @@ import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; import { AuthModule } from './modules/auth/auth.module'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; import { JwtService } from '@nestjs/jwt'; +import { CoursesModule } from './modules/courses/courses.module'; @Module({ - imports: [PrismaModule, AuthModule], + imports: [PrismaModule, AuthModule, CoursesModule], controllers: [AppController], providers: [ { diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index 901e62bb..b6c56620 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -27,20 +27,20 @@ export async function loadUser(user:session_userprofile | userSelectResultType, export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - const majors: subject_department[] = await prisma.session_userprofile.findMany({ - include: { - session_userprofile_majors: { - include: { - subject_department: true - } - }, - favorite_departments: { - include:{ - department: true - } - } - } - }); + // const majors: subject_department[] = await prisma.session_userprofile.findMany({ + // include: { + // session_userprofile_majors: { + // include: { + // subject_department: true + // } + // }, + // favorite_departments: { + // include:{ + // department: true + // } + // } + // } + // }); const reviewList: review_review[] = await prisma.review_review.findMany({ diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index e03f69af..b4fd1e40 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -11,3 +11,7 @@ export type courseSelectResultType = Prisma.subject_courseGetPayload<{ export type lectureSelectResultType = Prisma.subject_lectureGetPayload<{ include: Prisma.subject_lectureInclude }> + +export type departmentSelectResultType = Prisma.subject_departmentGetPayload<{ + include: Prisma.subject_departmentInclude +}> \ No newline at end of file diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts new file mode 100644 index 00000000..1562376b --- /dev/null +++ b/src/common/utils/search.utils.ts @@ -0,0 +1,25 @@ +export async function apply_order(query: T[], order_opt: string[]) { + if (order_opt.length == 0) { + return query; + } else { + query.sort((a: T, b: T) => { + for(let i=0; i < order_opt.length; i++) { + const order = order_opt[i]; + if (a[order] > b[order]) { + return 1; + } else if (a[order] < b[order]) { + return -1; + } + } + return 0; + }) + } +} + +export async function apply_offset(query: T[], offset: number) { + if (!(offset)) { + return query; + } else { + return query.slice(offset); + } +} \ No newline at end of file diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 7515d428..c363f2d9 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,4 +1,3 @@ -import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Controller, Get, Post, Param, Query, UseGuards } from '@nestjs/common'; import { CoursesService } from './courses.service'; diff --git a/src/modules/courses/courses.module.ts b/src/modules/courses/courses.module.ts index c4b983c2..40c50305 100644 --- a/src/modules/courses/courses.module.ts +++ b/src/modules/courses/courses.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; import { CourseController } from './courses.controller'; import { CoursesService } from './courses.service'; +import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ + imports: [PrismaModule], controllers: [CourseController], - providers: [CoursesService] + providers: [CoursesService], }) export class CoursesModule {} diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index f28fc875..80657a5e 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,21 +1,39 @@ -import { subject_department } from './../../../node_modules/.prisma/client/index.d'; import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable } from '@nestjs/common'; -import { review_review, subject_course } from '@prisma/client'; -import { courseSelectResultType } from 'src/common/schemaTypes/types'; -import { PrismaService } from 'src/prisma/prisma.service'; +import { apply_order } from 'src/common/utils/search.utils'; +import { courseSelectResultType, lectureSelectResultType } from 'src/common/schemaTypes/types'; @Injectable() export class CoursesService { constructor( private readonly CourseRepository: CourseRepository, - private prisma: PrismaService ) {} public async getCourseByFilter(query: any) { - const MAX_LIMIT = 150; - const DEFAULT_ORDER = ['old_code']; + const query_result = await this.CourseRepository.filterByRequest(query); + return this.to_json(query_result); + } + + private to_json(query_res: courseSelectResultType[], nested: boolean = false, user = null) { + return { + "id": query_res.map((x) => x.id), + "old_code": query_res.map((x) => x.old_code), + "department": query_res.map((x) => x.subject_department), + "type": query_res.map((x) => x.type), + "type_en": query_res.map((x) => x.type_en), + "title": query_res.map((x) => x.title), + "title_en": query_res.map((x) => x.title_en), + "summary": query_res.map((x) => x.summury), // Todo: fix summury typo in db. + "review_total_weight": query_res.map((x) => x.review_total_weight), + "credit": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), + "credit_au": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), + "num_classes": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), + "num_labs": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), + } + } - return await this.CourseRepository.filterByRequest(query); + private get_representative_lecture(lectures: lectureSelectResultType[]): lectureSelectResultType { + const ordered_lectures = apply_order(lectures, ["year", "semester"]) + return ordered_lectures[0]; } } \ No newline at end of file diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 3b4a5868..d74daa23 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -4,6 +4,7 @@ import { UserRepository } from "./repositories/user.repository"; import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewRepository } from "./repositories/review.repository"; import { DepartmentRepository } from "./repositories/department.repository"; +import { CourseRepository } from "./repositories/course.repository"; @Module({ providers: [PrismaService, @@ -11,12 +12,14 @@ import { DepartmentRepository } from "./repositories/department.repository"; LectureRepository, ReviewRepository, DepartmentRepository, + CourseRepository, ], exports: [PrismaService, UserRepository, LectureRepository, ReviewRepository, DepartmentRepository, + CourseRepository, ] }) export class PrismaModule {} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 8ecea909..a49457bb 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,10 +1,13 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { courseSelectResultType } from "src/common/schemaTypes/types"; +import { apply_order, apply_offset } from "src/common/utils/search.utils"; @Injectable() -export class CourseRepository{ - constructor(private readonly prisma: PrismaService){} +export class CourseRepository { + constructor( + private readonly prisma: PrismaService + ){} private TYPE_ACRONYMS = { "GR": "General Required", @@ -38,7 +41,10 @@ export class CourseRepository{ "TS", ] - public async filterByRequest (query: any) { + public async filterByRequest (query: any): Promise { + const DEFAULT_LIMIT = 150; + const DEFAULT_ORDER = ['old_code'] + const { department, type, @@ -58,36 +64,41 @@ export class CourseRepository{ const term_filter = this.term_filter(term); let filter_list = [department_filter, type_filter, level_filter, group_filter, keyword_filter, term_filter] filter_list = filter_list.filter((filter) => filter !== null) - return await this.prisma.subject_course.findMany({ + const query_result = await this.prisma.subject_course.findMany({ include: { subject_department: true, - subject_course_professors: { include: { professor: true }} + subject_course_professors: { include: { professor: true } } }, where: { AND: filter_list - } - }) + }, + take: limit ?? DEFAULT_LIMIT, + }); + + // Apply Ordering and Offset + const ordered_result = await apply_order(query_result, order ?? DEFAULT_ORDER); + return await apply_offset(ordered_result, offset ?? 0); } private department_filter(department_names: [string]): object { if (!(department_names)) { return null } - if ("ALL" in department_names) { + if (department_names.includes("ALL")) { return null - } else if ("ETC" in department_names) { + } else if (department_names.includes("ETC")) { return { - department: { + subject_department: { code: { - notIn: { department_names } + notIn: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)) } } } } else { return { - department: { + subject_department: { code: { - in: { department_names } + in: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)) } } } @@ -99,19 +110,19 @@ export class CourseRepository{ return null } - if ("ALL" in types) { + if (types.includes("ALL")) { return null - } else if ("ETC" in types) { + } else if (types.includes("ETC")) { const unselected_types = Object.values(this.TYPE_ACRONYMS).filter((type) => !(type in types)) return { type_en: { - in: { unselected_types } + in: unselected_types } } } else { return { type_en: { - in: { types } + in: types } } } @@ -123,24 +134,20 @@ export class CourseRepository{ } const acronym_dic = ["1", "2", "3", "4"]; - if ("ALL" in levels) { + if (levels.includes("ALL")) { return null; - } else if ("ETC" in levels) { + } else if (levels.includes("ETC")) { const numbers = acronym_dic.filter((level) => !(level in levels)); return { old_code: { - contains: { - numbers - } + contains: numbers } }; } else { const numbers = acronym_dic.filter((level) => level in levels); return { old_code: { - contains: { - numbers - } + contains: numbers } }; } @@ -151,7 +158,7 @@ export class CourseRepository{ return null; } - if ("ALL" in term) { + if (term.includes("ALL")) { return null; } else { const current_year = new Date().getFullYear().toString(); @@ -163,47 +170,51 @@ export class CourseRepository{ } } - private keyword_filter(keyword?: [string]): object { + private keyword_filter(keyword?: string): object { if (!(keyword)) { return null; } - const keyword_trimed = keyword.map((word) => word.trim()); - const keyword_space_removed = keyword_trimed.map((word) => word.replace(/\s/g, "")); + const keyword_trimed = keyword.trim() + const keyword_space_removed = keyword_trimed.replace(/\s/g, ""); const title_filter = { title_no_space: { - contains: { keyword_space_removed } + contains: keyword_space_removed } }; const en_title_filter = { - en_title_np_space: { - contains: { keyword_space_removed } + title_en_no_space: { + contains: keyword_space_removed } }; const department_name_filter = { - department: { + subject_department: { name: keyword_trimed } }; const department_name_en_filter = { - department: { + subject_department: { name_en: keyword_trimed } }; const professors_professor_name_filter = { - subject_professor_course_list: { - subject_professor: { - professor_name: { - contains: { keyword_trimed } + subject_course_professors: { + some: { + professor: { + professor_name: { + contains: keyword_trimed + } } } } }; const professors_professor_name_en_filter = { - subject_professor_course_list: { - subject_professor: { - professor_name_en: { - contains: { keyword_trimed } + subject_course_professors: { + some: { + professor: { + professor_name_en: { + contains: keyword_trimed + } } } } From f12b8fc932fdc06b5f8179aaa3d5eaba034433c3 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:16:34 +0900 Subject: [PATCH 034/250] Add: implement course search feature --- .../dto/course/course.professor.dto.ts | 6 + src/common/schemaTypes/types.ts | 4 + src/common/utils/search.utils.ts | 2 +- src/modules/courses/courses.controller.ts | 6 +- src/modules/courses/courses.service.ts | 110 ++++++++++++++---- src/prisma/prisma.module.ts | 3 + src/prisma/repositories/course.repository.ts | 4 +- .../repositories/professor.repository.ts | 15 +++ 8 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 src/common/interfaces/dto/course/course.professor.dto.ts create mode 100644 src/prisma/repositories/professor.repository.ts diff --git a/src/common/interfaces/dto/course/course.professor.dto.ts b/src/common/interfaces/dto/course/course.professor.dto.ts new file mode 100644 index 00000000..da3876f8 --- /dev/null +++ b/src/common/interfaces/dto/course/course.professor.dto.ts @@ -0,0 +1,6 @@ +export type CourseProfessorDto = { + name: string; + name_en: string; + professor_id: number; + review_total_weight: number; +}; \ No newline at end of file diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index b4fd1e40..095c0526 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -14,4 +14,8 @@ export type lectureSelectResultType = Prisma.subject_lectureGetPayload<{ export type departmentSelectResultType = Prisma.subject_departmentGetPayload<{ include: Prisma.subject_departmentInclude +}> + +export type professorSelectResultType = Prisma.subject_professorGetPayload<{ + include: Prisma.subject_professorInclude }> \ No newline at end of file diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index 1562376b..ebb635ae 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -2,7 +2,7 @@ export async function apply_order(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { - query.sort((a: T, b: T) => { + return query.sort((a: T, b: T) => { for(let i=0; i < order_opt.length; i++) { const order = order_opt[i]; if (a[order] > b[order]) { diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index c363f2d9..274782a7 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,13 +1,15 @@ import { Controller, Get, Post, Param, Query, UseGuards } from '@nestjs/common'; import { CoursesService } from './courses.service'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { session_userprofile } from '@prisma/client'; @Controller('api/courses') export class CourseController { constructor(private readonly CoursesService: CoursesService) {} @Get() - async getCourses(@Query() query: any) { - const courses = await this.CoursesService.getCourseByFilter(query); + async getCourses(@Query() query: any, @GetUser() user: session_userprofile) { + const courses = await this.CoursesService.getCourseByFilter(query, user); return courses } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 80657a5e..d8357796 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,39 +1,107 @@ import { CourseRepository } from './../../prisma/repositories/course.repository'; +import { ProfessorRepository } from 'src/prisma/repositories/professor.repository'; import { Injectable } from '@nestjs/common'; import { apply_order } from 'src/common/utils/search.utils'; -import { courseSelectResultType, lectureSelectResultType } from 'src/common/schemaTypes/types'; +import { courseSelectResultType, departmentSelectResultType, lectureSelectResultType, professorSelectResultType } from 'src/common/schemaTypes/types'; +import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { session_userprofile } from '@prisma/client'; + @Injectable() export class CoursesService { constructor( private readonly CourseRepository: CourseRepository, + private readonly ProfessorRepository: ProfessorRepository, ) {} - public async getCourseByFilter(query: any) { + public async getCourseByFilter(query: any, user: session_userprofile) { const query_result = await this.CourseRepository.filterByRequest(query); - return this.to_json(query_result); + return await this.to_json(query_result, user); } - private to_json(query_res: courseSelectResultType[], nested: boolean = false, user = null) { - return { - "id": query_res.map((x) => x.id), - "old_code": query_res.map((x) => x.old_code), - "department": query_res.map((x) => x.subject_department), - "type": query_res.map((x) => x.type), - "type_en": query_res.map((x) => x.type_en), - "title": query_res.map((x) => x.title), - "title_en": query_res.map((x) => x.title_en), - "summary": query_res.map((x) => x.summury), // Todo: fix summury typo in db. - "review_total_weight": query_res.map((x) => x.review_total_weight), - "credit": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), - "credit_au": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), - "num_classes": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), - "num_labs": query_res.map((x) => this.get_representative_lecture(x.lecture) ?? 0), - } + private async to_json(query_res: courseSelectResultType[], user: session_userprofile, nested=false) { + return Promise.all(query_res.map(async (course) => { + const representative_lecture = await this.get_representative_lecture(course.lecture); + const professor_raw = await Promise.all(course.subject_course_professors.map(async (x) => { + const professor_id = x.professor_id; + return await this.ProfessorRepository.getProfessorById(professor_id); + })); + const professor_json: CourseProfessorDto[] = await this.to_json_professor(professor_raw, true); + const professor_sorted = await apply_order(professor_json, ["name"]); + + let result = { + "id": course.id, + "old_code": course.old_code, + "department": this.to_json_department(course.subject_department, true), + "type": course.type, + "type_en": course.type_en, + "title": course.title, + "title_en": course.title_en, + "summary": course.summury, // Todo: fix summury typo in db. + "review_total_weight": course.review_total_weight, + "credit": representative_lecture.credit ?? null, + "credit_au": representative_lecture.credit_au ?? null, + "num_classes": representative_lecture.num_classes ?? null, + "num_labs": representative_lecture.num_labs ?? null, + }; + + if (nested) { + return result; + } + + result = Object.assign(result, { + "related_courses_prior": [], + "related_courses_posterior": [], + "professors": professor_sorted, + "grade": course.grade, + "load": course.load, + "speech": course.speech, + }) + + if (user) { + const latest_read_datetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; + const latest_written_datetime = course.latest_written_datetime; + return Object.assign(result, { + "userspecific_is_read": latest_written_datetime < latest_read_datetime, + }) + } else { + return Object.assign(result, { + "userspecific_is_read": false, + }) + } + })); } - private get_representative_lecture(lectures: lectureSelectResultType[]): lectureSelectResultType { - const ordered_lectures = apply_order(lectures, ["year", "semester"]) + private async get_representative_lecture(lectures: lectureSelectResultType[]): Promise { + const ordered_lectures = await apply_order(lectures, ["year", "semester"]) return ordered_lectures[0]; } + + private async to_json_professor(professors: professorSelectResultType[], nested=false) { + const result = professors.map((professor) => { + return { + "name": professor.professor_name, + "name_en": professor.professor_name_en, + "professor_id": professor.professor_id, + "review_total_weight": professor.review_total_weight, + } + }); + + if (nested) { + return result; + } + + return result.map((professor) => { + return professor; //todo: add necessary infos + }); + } + private to_json_department(department: departmentSelectResultType, nested=false) { + return { + "id": department.id, + "name": department.name, + "name_en": department.name_en, + "code": department.code, + } + } } \ No newline at end of file diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index d74daa23..7967ba35 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -5,6 +5,7 @@ import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewRepository } from "./repositories/review.repository"; import { DepartmentRepository } from "./repositories/department.repository"; import { CourseRepository } from "./repositories/course.repository"; +import { ProfessorRepository } from "./repositories/professor.repository"; @Module({ providers: [PrismaService, @@ -13,6 +14,7 @@ import { CourseRepository } from "./repositories/course.repository"; ReviewRepository, DepartmentRepository, CourseRepository, + ProfessorRepository, ], exports: [PrismaService, UserRepository, @@ -20,6 +22,7 @@ import { CourseRepository } from "./repositories/course.repository"; ReviewRepository, DepartmentRepository, CourseRepository, + ProfessorRepository, ] }) export class PrismaModule {} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index a49457bb..a078221e 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -67,7 +67,9 @@ export class CourseRepository { const query_result = await this.prisma.subject_course.findMany({ include: { subject_department: true, - subject_course_professors: { include: { professor: true } } + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, }, where: { AND: filter_list diff --git a/src/prisma/repositories/professor.repository.ts b/src/prisma/repositories/professor.repository.ts new file mode 100644 index 00000000..055abe0d --- /dev/null +++ b/src/prisma/repositories/professor.repository.ts @@ -0,0 +1,15 @@ +import { Injectable } from "@nestjs/common"; +import { PrismaService } from "../prisma.service"; + +@Injectable() +export class ProfessorRepository { + constructor(private readonly prisma: PrismaService){} + + getProfessorById(professor_id: number) { + return this.prisma.subject_professor.findUnique({ + where: { + id: professor_id + } + }) + } +} \ No newline at end of file From c01a9b8f54eaefb8d4c6c1ea8fac77185ffd6c38 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:45:42 +0900 Subject: [PATCH 035/250] temp --- src/modules/courses/courses.service.ts | 4 ++-- src/prisma/generated/prisma-class/index.ts | 3 --- .../generated/prisma-class/review_review.ts | 4 ++++ .../prisma-class/session_userprofile.ts | 22 +++++++++++++++++++ ...ession_userprofile_favorite_departments.ts | 8 +++++++ .../session_userprofile_taken_lectures.ts | 8 +++++++ .../generated/prisma-class/subject_course.ts | 18 +++++++++++++++ .../prisma-class/subject_course_professors.ts | 8 +++++++ .../prisma-class/subject_department.ts | 15 +++++++++++++ .../generated/prisma-class/subject_lecture.ts | 11 ++++++++++ .../prisma-class/subject_professor.ts | 4 ++++ 11 files changed, 100 insertions(+), 5 deletions(-) diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index d8357796..263eddaf 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -5,7 +5,7 @@ import { apply_order } from 'src/common/utils/search.utils'; import { courseSelectResultType, departmentSelectResultType, lectureSelectResultType, professorSelectResultType } from 'src/common/schemaTypes/types'; import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; -import { session_userprofile } from '@prisma/client'; +import { session_userprofile, subject_course } from '@prisma/client'; @Injectable() @@ -20,7 +20,7 @@ export class CoursesService { return await this.to_json(query_result, user); } - private async to_json(query_res: courseSelectResultType[], user: session_userprofile, nested=false) { + private async to_json(query_res: subject_course[], user: session_userprofile, nested=false) { return Promise.all(query_res.map(async (course) => { const representative_lecture = await this.get_representative_lecture(course.lecture); const professor_raw = await Promise.all(course.subject_course_professors.map(async (x) => { diff --git a/src/prisma/generated/prisma-class/index.ts b/src/prisma/generated/prisma-class/index.ts index 56d76b67..5337c035 100644 --- a/src/prisma/generated/prisma-class/index.ts +++ b/src/prisma/generated/prisma-class/index.ts @@ -37,7 +37,6 @@ import { subject_examtime as _subject_examtime } from './subject_examtime'; import { subject_lecture as _subject_lecture } from './subject_lecture'; import { subject_lecture_professors as _subject_lecture_professors } from './subject_lecture_professors'; import { subject_professor as _subject_professor } from './subject_professor'; -import { subject_professor_course_list as _subject_professor_course_list } from './subject_professor_course_list'; import { subject_semester as _subject_semester } from './subject_semester'; import { support_notice as _support_notice } from './support_notice'; import { support_rate as _support_rate } from './support_rate'; @@ -96,7 +95,6 @@ export namespace PrismaModel { export class subject_lecture extends _subject_lecture {} export class subject_lecture_professors extends _subject_lecture_professors {} export class subject_professor extends _subject_professor {} - export class subject_professor_course_list extends _subject_professor_course_list {} export class subject_semester extends _subject_semester {} export class support_notice extends _support_notice {} export class support_rate extends _support_rate {} @@ -155,7 +153,6 @@ export namespace PrismaModel { subject_lecture, subject_lecture_professors, subject_professor, - subject_professor_course_list, subject_semester, support_notice, support_rate, diff --git a/src/prisma/generated/prisma-class/review_review.ts b/src/prisma/generated/prisma-class/review_review.ts index a3fa0ef5..1dcf9180 100644 --- a/src/prisma/generated/prisma-class/review_review.ts +++ b/src/prisma/generated/prisma-class/review_review.ts @@ -1,5 +1,6 @@ import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class review_review { @@ -53,4 +54,7 @@ export class review_review { type: () => main_famousmajorreviewdailyfeed_reviews, }) main_famousmajorreviewdailyfeed_reviews: main_famousmajorreviewdailyfeed_reviews[]; + + @ApiPropertyOptional({ type: () => session_userprofile }) + writer?: session_userprofile; } diff --git a/src/prisma/generated/prisma-class/session_userprofile.ts b/src/prisma/generated/prisma-class/session_userprofile.ts index f7afb252..d5405578 100644 --- a/src/prisma/generated/prisma-class/session_userprofile.ts +++ b/src/prisma/generated/prisma-class/session_userprofile.ts @@ -2,9 +2,13 @@ import { main_ratedailyuserfeed } from './main_ratedailyuserfeed'; import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; import { planner_planner } from './planner_planner'; +import { review_review } from './review_review'; +import { subject_department } from './subject_department'; +import { session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; import { session_userprofile_majors } from './session_userprofile_majors'; import { session_userprofile_minors } from './session_userprofile_minors'; import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; import { subject_courseuser } from './subject_courseuser'; import { support_rate } from './support_rate'; import { timetable_timetable } from './timetable_timetable'; @@ -51,6 +55,18 @@ export class session_userprofile { @ApiProperty({ isArray: true, type: () => planner_planner }) planner_planner: planner_planner[]; + @ApiProperty({ isArray: true, type: () => review_review }) + reviews: review_review[]; + + @ApiPropertyOptional({ type: () => subject_department }) + department?: subject_department; + + @ApiProperty({ + isArray: true, + type: () => session_userprofile_favorite_departments, + }) + favorite_departments: session_userprofile_favorite_departments[]; + @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) session_userprofile_majors: session_userprofile_majors[]; @@ -63,6 +79,12 @@ export class session_userprofile { }) session_userprofile_specialized_major: session_userprofile_specialized_major[]; + @ApiProperty({ + isArray: true, + type: () => session_userprofile_taken_lectures, + }) + taken_lectures: session_userprofile_taken_lectures[]; + @ApiProperty({ isArray: true, type: () => subject_courseuser }) subject_courseuser: subject_courseuser[]; diff --git a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts index 3d442c2f..bc32cd7c 100644 --- a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts +++ b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts @@ -1,3 +1,5 @@ +import { subject_department } from './subject_department'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty } from '@nestjs/swagger'; export class session_userprofile_favorite_departments { @@ -9,4 +11,10 @@ export class session_userprofile_favorite_departments { @ApiProperty({ type: Number }) department_id: number; + + @ApiProperty({ type: () => subject_department }) + department: subject_department; + + @ApiProperty({ type: () => session_userprofile }) + userprofile: session_userprofile; } diff --git a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts index ab8e964a..15da4888 100644 --- a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts +++ b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts @@ -1,3 +1,5 @@ +import { subject_lecture } from './subject_lecture'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty } from '@nestjs/swagger'; export class session_userprofile_taken_lectures { @@ -9,4 +11,10 @@ export class session_userprofile_taken_lectures { @ApiProperty({ type: Number }) lecture_id: number; + + @ApiProperty({ type: () => subject_lecture }) + lecture: subject_lecture; + + @ApiProperty({ type: () => session_userprofile }) + userprofile: session_userprofile; } diff --git a/src/prisma/generated/prisma-class/subject_course.ts b/src/prisma/generated/prisma-class/subject_course.ts index 6ccf4d76..36f2271c 100644 --- a/src/prisma/generated/prisma-class/subject_course.ts +++ b/src/prisma/generated/prisma-class/subject_course.ts @@ -1,8 +1,11 @@ import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; import { planner_futureplanneritem } from './planner_futureplanneritem'; +import { subject_department } from './subject_department'; import { subject_course_related_courses_posterior } from './subject_course_related_courses_posterior'; import { subject_course_related_courses_prior } from './subject_course_related_courses_prior'; import { subject_courseuser } from './subject_courseuser'; +import { subject_course_professors } from './subject_course_professors'; +import { subject_lecture } from './subject_lecture'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_course { @@ -54,12 +57,21 @@ export class subject_course { @ApiPropertyOptional({ type: Date }) latest_written_datetime?: Date; + @ApiProperty({ type: String }) + title_en_no_space: string; + + @ApiProperty({ type: String }) + title_no_space: string; + @ApiProperty({ isArray: true, type: () => main_relatedcoursedailyuserfeed }) main_relatedcoursedailyuserfeed: main_relatedcoursedailyuserfeed[]; @ApiProperty({ isArray: true, type: () => planner_futureplanneritem }) planner_futureplanneritem: planner_futureplanneritem[]; + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; + @ApiProperty({ isArray: true, type: () => subject_course_related_courses_posterior, @@ -86,4 +98,10 @@ export class subject_course { @ApiProperty({ isArray: true, type: () => subject_courseuser }) subject_courseuser: subject_courseuser[]; + + @ApiProperty({ isArray: true, type: () => subject_course_professors }) + subject_course_professors: subject_course_professors[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture }) + lecture: subject_lecture[]; } diff --git a/src/prisma/generated/prisma-class/subject_course_professors.ts b/src/prisma/generated/prisma-class/subject_course_professors.ts index 5c14d9a9..bc7dfa7c 100644 --- a/src/prisma/generated/prisma-class/subject_course_professors.ts +++ b/src/prisma/generated/prisma-class/subject_course_professors.ts @@ -1,3 +1,5 @@ +import { subject_course } from './subject_course'; +import { subject_professor } from './subject_professor'; import { ApiProperty } from '@nestjs/swagger'; export class subject_course_professors { @@ -9,4 +11,10 @@ export class subject_course_professors { @ApiProperty({ type: Number }) professor_id: number; + + @ApiProperty({ type: () => subject_course }) + course: subject_course; + + @ApiProperty({ type: () => subject_professor }) + professor: subject_professor; } diff --git a/src/prisma/generated/prisma-class/subject_department.ts b/src/prisma/generated/prisma-class/subject_department.ts index 416d1708..ea82d5da 100644 --- a/src/prisma/generated/prisma-class/subject_department.ts +++ b/src/prisma/generated/prisma-class/subject_department.ts @@ -2,9 +2,12 @@ import { graduation_additionaltrack } from './graduation_additionaltrack'; import { graduation_majortrack } from './graduation_majortrack'; import { main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; import { planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; +import { session_userprofile } from './session_userprofile'; +import { session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; import { session_userprofile_majors } from './session_userprofile_majors'; import { session_userprofile_minors } from './session_userprofile_minors'; import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { subject_course } from './subject_course'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_department { @@ -38,6 +41,15 @@ export class subject_department { @ApiProperty({ isArray: true, type: () => planner_arbitraryplanneritem }) planner_arbitraryplanneritem: planner_arbitraryplanneritem[]; + @ApiProperty({ isArray: true, type: () => session_userprofile }) + session_userprofile: session_userprofile[]; + + @ApiProperty({ + isArray: true, + type: () => session_userprofile_favorite_departments, + }) + session_userprofile_favorite_departments: session_userprofile_favorite_departments[]; + @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) session_userprofile_majors: session_userprofile_majors[]; @@ -49,4 +61,7 @@ export class subject_department { type: () => session_userprofile_specialized_major, }) session_userprofile_specialized_major: session_userprofile_specialized_major[]; + + @ApiProperty({ isArray: true, type: () => subject_course }) + subject_course: subject_course[]; } diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts index dcd98f7d..b79375a7 100644 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -1,5 +1,7 @@ +import { subject_course } from './subject_course'; import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; import { planner_takenplanneritem } from './planner_takenplanneritem'; +import { session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; import { subject_classtime } from './subject_classtime'; import { subject_examtime } from './subject_examtime'; import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; @@ -71,6 +73,9 @@ export class subject_lecture { @ApiProperty({ type: Number }) course_id: number; + @ApiProperty({ type: () => subject_course }) + course: subject_course; + @ApiProperty({ type: Number }) grade_sum: number; @@ -110,6 +115,12 @@ export class subject_lecture { @ApiProperty({ isArray: true, type: () => planner_takenplanneritem }) planner_takenplanneritem: planner_takenplanneritem[]; + @ApiProperty({ + isArray: true, + type: () => session_userprofile_taken_lectures, + }) + students: session_userprofile_taken_lectures[]; + @ApiProperty({ isArray: true, type: () => subject_classtime }) subject_classtime: subject_classtime[]; diff --git a/src/prisma/generated/prisma-class/subject_professor.ts b/src/prisma/generated/prisma-class/subject_professor.ts index ca4f3a1f..bbaaf1d4 100644 --- a/src/prisma/generated/prisma-class/subject_professor.ts +++ b/src/prisma/generated/prisma-class/subject_professor.ts @@ -1,3 +1,4 @@ +import { subject_course_professors } from './subject_course_professors'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_professor { @@ -36,4 +37,7 @@ export class subject_professor { @ApiProperty({ type: Number }) speech: number; + + @ApiProperty({ isArray: true, type: () => subject_course_professors }) + subject_course_professors: subject_course_professors[]; } From c63e8db9cd9cf74046ff70f837ee87714a638e88 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:53:15 +0900 Subject: [PATCH 036/250] Fix: change db types into class --- src/common/schemaTypes/types.ts | 21 ------------------ src/modules/courses/courses.service.ts | 22 ++++++++----------- src/prisma/prisma.module.ts | 3 --- src/prisma/repositories/course.repository.ts | 10 ++++----- .../repositories/professor.repository.ts | 15 ------------- 5 files changed, 14 insertions(+), 57 deletions(-) delete mode 100644 src/common/schemaTypes/types.ts delete mode 100644 src/prisma/repositories/professor.repository.ts diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts deleted file mode 100644 index 095c0526..00000000 --- a/src/common/schemaTypes/types.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Prisma } from "@prisma/client"; - -export type userSelectResultType = Prisma.session_userprofileGetPayload<{ - include: Prisma.session_userprofileInclude -}> - -export type courseSelectResultType = Prisma.subject_courseGetPayload<{ - include: Prisma.subject_courseInclude -}> - -export type lectureSelectResultType = Prisma.subject_lectureGetPayload<{ - include: Prisma.subject_lectureInclude -}> - -export type departmentSelectResultType = Prisma.subject_departmentGetPayload<{ - include: Prisma.subject_departmentInclude -}> - -export type professorSelectResultType = Prisma.subject_professorGetPayload<{ - include: Prisma.subject_professorInclude -}> \ No newline at end of file diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 263eddaf..117c88b7 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,18 +1,17 @@ import { CourseRepository } from './../../prisma/repositories/course.repository'; -import { ProfessorRepository } from 'src/prisma/repositories/professor.repository'; import { Injectable } from '@nestjs/common'; import { apply_order } from 'src/common/utils/search.utils'; -import { courseSelectResultType, departmentSelectResultType, lectureSelectResultType, professorSelectResultType } from 'src/common/schemaTypes/types'; import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; -import { GetUser } from 'src/common/decorators/get-user.decorator'; -import { session_userprofile, subject_course } from '@prisma/client'; +import { session_userprofile, subject_professor } from '@prisma/client'; +import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; +import { subject_lecture } from 'src/prisma/generated/prisma-class/subject_lecture'; +import { subject_department } from 'src/prisma/generated/prisma-class/subject_department'; @Injectable() export class CoursesService { constructor( private readonly CourseRepository: CourseRepository, - private readonly ProfessorRepository: ProfessorRepository, ) {} public async getCourseByFilter(query: any, user: session_userprofile) { @@ -23,10 +22,7 @@ export class CoursesService { private async to_json(query_res: subject_course[], user: session_userprofile, nested=false) { return Promise.all(query_res.map(async (course) => { const representative_lecture = await this.get_representative_lecture(course.lecture); - const professor_raw = await Promise.all(course.subject_course_professors.map(async (x) => { - const professor_id = x.professor_id; - return await this.ProfessorRepository.getProfessorById(professor_id); - })); + const professor_raw = await Promise.all(course.subject_course_professors.map(async (x) => x.professor as subject_professor)); const professor_json: CourseProfessorDto[] = await this.to_json_professor(professor_raw, true); const professor_sorted = await apply_order(professor_json, ["name"]); @@ -73,12 +69,12 @@ export class CoursesService { })); } - private async get_representative_lecture(lectures: lectureSelectResultType[]): Promise { - const ordered_lectures = await apply_order(lectures, ["year", "semester"]) + private async get_representative_lecture(lectures: subject_lecture[]): Promise { + const ordered_lectures = await apply_order(lectures, ["year", "semester"]) return ordered_lectures[0]; } - private async to_json_professor(professors: professorSelectResultType[], nested=false) { + private async to_json_professor(professors: subject_professor[], nested=false) { const result = professors.map((professor) => { return { "name": professor.professor_name, @@ -96,7 +92,7 @@ export class CoursesService { return professor; //todo: add necessary infos }); } - private to_json_department(department: departmentSelectResultType, nested=false) { + private to_json_department(department: subject_department, nested=false) { return { "id": department.id, "name": department.name, diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 7967ba35..d74daa23 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -5,7 +5,6 @@ import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewRepository } from "./repositories/review.repository"; import { DepartmentRepository } from "./repositories/department.repository"; import { CourseRepository } from "./repositories/course.repository"; -import { ProfessorRepository } from "./repositories/professor.repository"; @Module({ providers: [PrismaService, @@ -14,7 +13,6 @@ import { ProfessorRepository } from "./repositories/professor.repository"; ReviewRepository, DepartmentRepository, CourseRepository, - ProfessorRepository, ], exports: [PrismaService, UserRepository, @@ -22,7 +20,6 @@ import { ProfessorRepository } from "./repositories/professor.repository"; ReviewRepository, DepartmentRepository, CourseRepository, - ProfessorRepository, ] }) export class PrismaModule {} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index a078221e..b4b716cf 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { courseSelectResultType } from "src/common/schemaTypes/types"; import { apply_order, apply_offset } from "src/common/utils/search.utils"; +import { subject_course } from "../generated/prisma-class/subject_course"; @Injectable() export class CourseRepository { @@ -41,7 +41,7 @@ export class CourseRepository { "TS", ] - public async filterByRequest (query: any): Promise { + public async filterByRequest (query: any): Promise { const DEFAULT_LIMIT = 150; const DEFAULT_ORDER = ['old_code'] @@ -75,11 +75,11 @@ export class CourseRepository { AND: filter_list }, take: limit ?? DEFAULT_LIMIT, - }); + }) as subject_course[]; // Apply Ordering and Offset - const ordered_result = await apply_order(query_result, order ?? DEFAULT_ORDER); - return await apply_offset(ordered_result, offset ?? 0); + const ordered_result = await apply_order(query_result, order ?? DEFAULT_ORDER); + return await apply_offset(ordered_result, offset ?? 0); } private department_filter(department_names: [string]): object { diff --git a/src/prisma/repositories/professor.repository.ts b/src/prisma/repositories/professor.repository.ts deleted file mode 100644 index 055abe0d..00000000 --- a/src/prisma/repositories/professor.repository.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "../prisma.service"; - -@Injectable() -export class ProfessorRepository { - constructor(private readonly prisma: PrismaService){} - - getProfessorById(professor_id: number) { - return this.prisma.subject_professor.findUnique({ - where: { - id: professor_id - } - }) - } -} \ No newline at end of file From 504276b359617c2fb18e477055dd7f5848c2e8df Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 19 Jul 2023 22:01:42 +0900 Subject: [PATCH 037/250] Add: resolve rebase conflict --- package.json | 2 +- src/bootstrap/bootstrap.ts | 2 +- src/modules/user/user.service.ts | 51 +++---------------- src/prisma/repositories/lecture.repository.ts | 5 +- src/settings.ts | 2 +- test/app.e2e-spec.ts | 2 +- test/session/session.spec.ts | 46 ++++++++++------- 7 files changed, 42 insertions(+), 68 deletions(-) diff --git a/package.json b/package.json index 2fe0e599..d3cb9ec4 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "json", "ts" ], - "rootDir": "./", + "rootDir": "test", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index 50b2738f..02756363 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -66,7 +66,7 @@ async function bootstrap() { const prismaService = app.get(PrismaService); await prismaService.enableShutdownHooks(app) - return app.listen(8080); + return app.listen(8000); } bootstrap() diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 5ab5e859..aa0f7812 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -26,51 +26,16 @@ export class UserService { public async getProfile(user: session_userprofile){ const promises = []; - console.time('querying') - const startTime = new Date(); - const departmentPromise = this.departmentRepository.getDepartmentOfUser(user).then((department) => { - const endTime = new Date(); - console.log('querying department took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user).then((department) => { - const endTime = new Date(); - console.log('querying favorite department took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const majorsPromise = this.departmentRepository.getMajors(user).then((department) => { - const endTime = new Date(); - console.log('querying majors took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const minorsPromise = this.departmentRepository.getMinors(user).then((department) => { - const endTime = new Date(); - console.log('querying minors took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user).then((department) => { - const endTime = new Date(); - console.log('querying specializedMajors took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()).then((department) => { - const endTime = new Date(); - console.log('querying reviewWritableLectures took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const takenLecturesPromise = this.lectureRepository.getTakenLectures(user).then((department) => { - const endTime = new Date(); - console.log('querying takenLectures took: ', endTime.getTime() - startTime.getTime()); - return department; - }) - const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user).then((department) => { - const endTime = new Date(); - console.log('querying writtenReview took: ', endTime.getTime() - startTime.getTime()); - return department; - }) + const departmentPromise = this.departmentRepository.getDepartmentOfUser(user) + const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user) + const majorsPromise = this.departmentRepository.getMajors(user) + const minorsPromise = this.departmentRepository.getMinors(user) + const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user) + const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()) + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user) + const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); - console.timeEnd('querying') const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; const researchLectures = Object.values(ResearchLecture); const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 33826c1a..c22b6a23 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -33,7 +33,6 @@ export class LectureRepository { ] } }); - console.log(notWritableSemesters); const notWritableYearAndSemester = groupBy(notWritableSemesters.map((semester) => { return { semester: semester.semester, @@ -41,7 +40,7 @@ export class LectureRepository { } }),(subject_semester) => subject_semester.year) - const notWritableYearAndSemesterMap: Record> = null; + const notWritableYearAndSemesterMap: Record> = { } ; for (const key in notWritableYearAndSemester) { const objects = notWritableYearAndSemester[key]; const mapObjects = groupBy(objects); @@ -50,7 +49,7 @@ export class LectureRepository { const takenLectures = await this.getTakenLectures(user); const reviewWritableLectures = takenLectures.filter((lecture) => { - return notWritableYearAndSemesterMap[lecture.year][lecture.semester] ? true: false + return notWritableYearAndSemesterMap[lecture.year]??[lecture.semester] ? true: false }) // const lectures = await this.prisma.subject_lecture.findMany({ diff --git a/src/settings.ts b/src/settings.ts index 8d4f1874..f9c885df 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -39,7 +39,7 @@ const getPrismaConfig = (): PrismaClientOptions => { }, }, errorFormat: 'pretty', - log: [`error`,'query'], + log: [`error`], }; }; diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 50cda623..7193e27f 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; +import request from "supertest"; import { AppModule } from './../src/app.module'; describe('AppController (e2e)', () => { diff --git a/test/session/session.spec.ts b/test/session/session.spec.ts index 1905d02f..9b5dcf1b 100644 --- a/test/session/session.spec.ts +++ b/test/session/session.spec.ts @@ -4,6 +4,7 @@ import { AppModule } from "../../src/app.module"; import * as request from "supertest"; import { PrismaService } from "../../src/prisma/prisma.service"; import { UserService } from "../../src/modules/user/user.service"; +import axios from "axios"; describe('AppController (e2e)', () => { let app: INestApplication; @@ -19,26 +20,35 @@ describe('AppController (e2e)', () => { it('/session/info (GET)', async () => { const prismaService = app.get(PrismaService); - const session_userprofileList = await prismaService.session_userprofile.findMany({}) - const userService = app.get(UserService); - const batchSize = 50; - const batchCount = Math.ceil(session_userprofileList.length / batchSize); - for(let i = 0; i < batchCount; i++){ - const batch = session_userprofileList.slice(i * batchSize, (i + 1) * batchSize); - batch.forEach((user) => { - const profile = userService.getProfile(user) - .then((profile) => { - }) - }) + const sidList = await axios.get('http://localhost:58000/session'); + + const BATCH_SIZE = 10; + const BATCH_COUNT = Math.floor(sidList.data.length / BATCH_SIZE) + 1; + for(let i = 0; i { + const r = await axios.get(`http://localhost:58000/session/login?sid=${sid}`); + const { data } = r; + const user = prismaService.session_userprofile.findFirst({ + where: { sid }, + }).then((user) => { + try{ + return userService.getProfile(user); + }catch (e) { + console.log('error with sid: ', sid) + console.error(e); + } + }).then((profile)=> { + expect(profile).toEqual(data) + return profile + }) + return user; + }); + await Promise.all(promises); + console.log(`batch ${i} / ${BATCH_COUNT} done`); } - - - return request(app.getHttpServer()) - .get('/') - .expect(200) - .expect('Hello World!'); - }); + }, 100000000); }); From 4f08723ea682d5f9b2488d29c352b6110be7b49c Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 19 Jul 2023 22:26:40 +0900 Subject: [PATCH 038/250] Add: change snake to camel --- .../interfaces/serializer/user.serializer.ts | 59 ------------------- src/common/utils/search.utils.ts | 4 +- src/modules/courses/courses.service.ts | 44 +++++++------- src/prisma/repositories/course.repository.ts | 36 +++++------ src/prisma/repositories/lecture.repository.ts | 1 - src/prisma/schema.prisma | 2 +- 6 files changed, 43 insertions(+), 103 deletions(-) delete mode 100644 src/common/interfaces/serializer/user.serializer.ts diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts deleted file mode 100644 index b6c56620..00000000 --- a/src/common/interfaces/serializer/user.serializer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Prisma, review_review, session_userprofile, subject_department } from "@prisma/client"; -import { PrismaService } from "../../../prisma/prisma.service"; -import { userSelectResultType } from "../../schemaTypes/types"; - -export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { - - const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { - if(user[key] && value) { - value = false; - }else if(user[key] && !value) { - value = false - } - else if(!user[key] && value) { - value = true - }else if(!user[key] && !value) { - value = false - } - }) - - const result: userSelectResultType = await prismaService.session_userprofile.findFirst({ - where: { sid: user.sid }, - include: userLoadOptions, - }) - return result; -} - -export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - - - // const majors: subject_department[] = await prisma.session_userprofile.findMany({ - // include: { - // session_userprofile_majors: { - // include: { - // subject_department: true - // } - // }, - // favorite_departments: { - // include:{ - // department: true - // } - // } - // } - // }); - - const reviewList: review_review[] = await prisma.review_review.findMany({ - - }) - - - return { - id: user.id, - email: user.email, - student_id: user.student_id, - firstName: user.first_name, - lastName: user.last_name, - department: user.department, - majors: user.session_userprofile_majors, - } -} \ No newline at end of file diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index ebb635ae..ca084457 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,4 +1,4 @@ -export async function apply_order(query: T[], order_opt: string[]) { +export async function applyOrder(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { @@ -16,7 +16,7 @@ export async function apply_order(query: T[], order_opt: string[]) { } } -export async function apply_offset(query: T[], offset: number) { +export async function applyOffset(query: T[], offset: number) { if (!(offset)) { return query; } else { diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 117c88b7..01b3bcd7 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,6 +1,6 @@ import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable } from '@nestjs/common'; -import { apply_order } from 'src/common/utils/search.utils'; +import { applyOrder } from 'src/common/utils/search.utils'; import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; import { session_userprofile, subject_professor } from '@prisma/client'; import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; @@ -15,31 +15,31 @@ export class CoursesService { ) {} public async getCourseByFilter(query: any, user: session_userprofile) { - const query_result = await this.CourseRepository.filterByRequest(query); - return await this.to_json(query_result, user); + const queryResult = await this.CourseRepository.filterByRequest(query); + return await this.toJson(queryResult, user); } - private async to_json(query_res: subject_course[], user: session_userprofile, nested=false) { + private async toJson(query_res: subject_course[], user: session_userprofile, nested=false) { return Promise.all(query_res.map(async (course) => { - const representative_lecture = await this.get_representative_lecture(course.lecture); - const professor_raw = await Promise.all(course.subject_course_professors.map(async (x) => x.professor as subject_professor)); - const professor_json: CourseProfessorDto[] = await this.to_json_professor(professor_raw, true); - const professor_sorted = await apply_order(professor_json, ["name"]); + const representativeLecture = await this.getRepresentativeLecture(course.lecture); + const professorRaw = await Promise.all(course.subject_course_professors.map(async (x) => x.professor as subject_professor)); + const professorJson: CourseProfessorDto[] = await this.toJsonProfessor(professorRaw, true); + const professorSorted = await applyOrder(professorJson, ["name"]); let result = { "id": course.id, "old_code": course.old_code, - "department": this.to_json_department(course.subject_department, true), + "department": this.toJsonDepartment(course.subject_department, true), "type": course.type, "type_en": course.type_en, "title": course.title, "title_en": course.title_en, "summary": course.summury, // Todo: fix summury typo in db. "review_total_weight": course.review_total_weight, - "credit": representative_lecture.credit ?? null, - "credit_au": representative_lecture.credit_au ?? null, - "num_classes": representative_lecture.num_classes ?? null, - "num_labs": representative_lecture.num_labs ?? null, + "credit": representativeLecture.credit ?? null, + "credit_au": representativeLecture.credit_au ?? null, + "num_classes": representativeLecture.num_classes ?? null, + "num_labs": representativeLecture.num_labs ?? null, }; if (nested) { @@ -49,17 +49,17 @@ export class CoursesService { result = Object.assign(result, { "related_courses_prior": [], "related_courses_posterior": [], - "professors": professor_sorted, + "professors": professorSorted, "grade": course.grade, "load": course.load, "speech": course.speech, }) if (user) { - const latest_read_datetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; - const latest_written_datetime = course.latest_written_datetime; + const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; + const latestWrittenDatetime = course.latest_written_datetime; return Object.assign(result, { - "userspecific_is_read": latest_written_datetime < latest_read_datetime, + "userspecific_is_read": latestWrittenDatetime < latestReadDatetime, }) } else { return Object.assign(result, { @@ -69,12 +69,12 @@ export class CoursesService { })); } - private async get_representative_lecture(lectures: subject_lecture[]): Promise { - const ordered_lectures = await apply_order(lectures, ["year", "semester"]) - return ordered_lectures[0]; + private async getRepresentativeLecture(lectures: subject_lecture[]): Promise { + const orderedLectures = await applyOrder(lectures, ["year", "semester"]) + return orderedLectures[0]; } - private async to_json_professor(professors: subject_professor[], nested=false) { + private async toJsonProfessor(professors: subject_professor[], nested=false) { const result = professors.map((professor) => { return { "name": professor.professor_name, @@ -92,7 +92,7 @@ export class CoursesService { return professor; //todo: add necessary infos }); } - private to_json_department(department: subject_department, nested=false) { + private toJsonDepartment(department: subject_department, nested=false) { return { "id": department.id, "name": department.name, diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index b4b716cf..c6771342 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { apply_order, apply_offset } from "src/common/utils/search.utils"; +import { applyOrder, applyOffset } from "src/common/utils/search.utils"; import { subject_course } from "../generated/prisma-class/subject_course"; @Injectable() @@ -56,14 +56,14 @@ export class CourseRepository { offset, limit, } = query; - const department_filter = this.department_filter(department); - const type_filter = this.type_filter(type); - const level_filter = this.level_filter(level); - const group_filter = this.group_filter(group); - const keyword_filter = this.keyword_filter(keyword); - const term_filter = this.term_filter(term); - let filter_list = [department_filter, type_filter, level_filter, group_filter, keyword_filter, term_filter] - filter_list = filter_list.filter((filter) => filter !== null) + const departmentFilter = this.departmentFilter(department); + const typeFilter = this.typeFilter(type); + const levelFilter = this.levelFilter(level); + const groupFilter = this.groupFilter(group); + const keywordFilter = this.keywordFilter(keyword); + const term_filter = this.termFilter(term); + let filterList = [departmentFilter, typeFilter, levelFilter, groupFilter, keywordFilter, term_filter] + filterList = filterList.filter((filter) => filter !== null) const query_result = await this.prisma.subject_course.findMany({ include: { subject_department: true, @@ -72,17 +72,17 @@ export class CourseRepository { subject_courseuser: true, }, where: { - AND: filter_list + AND: filterList }, take: limit ?? DEFAULT_LIMIT, }) as subject_course[]; // Apply Ordering and Offset - const ordered_result = await apply_order(query_result, order ?? DEFAULT_ORDER); - return await apply_offset(ordered_result, offset ?? 0); + const ordered_result = await applyOrder(query_result, order ?? DEFAULT_ORDER); + return await applyOffset(ordered_result, offset ?? 0); } - private department_filter(department_names: [string]): object { + private departmentFilter(department_names: [string]): object { if (!(department_names)) { return null } @@ -107,7 +107,7 @@ export class CourseRepository { } } - private type_filter(types: [string]): object { + private typeFilter(types: [string]): object { if (!(types)) { return null } @@ -130,7 +130,7 @@ export class CourseRepository { } } - private level_filter(levels?: [string]): object { + private levelFilter(levels?: [string]): object { if (!(levels)) { return null; } @@ -155,7 +155,7 @@ export class CourseRepository { } } - private term_filter(term?: [string]): object { + private termFilter(term?: [string]): object { if (!(term)) { return null; } @@ -172,7 +172,7 @@ export class CourseRepository { } } - private keyword_filter(keyword?: string): object { + private keywordFilter(keyword?: string): object { if (!(keyword)) { return null; } @@ -233,7 +233,7 @@ export class CourseRepository { }; } - private group_filter(group?: [string]): object { + private groupFilter(group?: [string]): object { if (!(group)) { return null; } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index c22b6a23..175fbd04 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,7 +1,6 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; -import { lectureSelectResultType } from "../../common/schemaTypes/types"; import { groupBy } from "../../common/utils/method.utils"; @Injectable() diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 56ee313c..92684296 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -4,7 +4,7 @@ generator client { generator prismaClassGenerator { provider = "prisma-class-generator" - dryRun = false + dryRun = true output = "./generated/prisma-class" } From c89b04cff5c37f50af4702db59dea3bd66603997 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:09:48 +0900 Subject: [PATCH 039/250] Add: implement getCourseById --- src/modules/courses/courses.controller.ts | 7 ++++++- src/modules/courses/courses.service.ts | 12 +++++++++++- src/prisma/repositories/course.repository.ts | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 274782a7..6196c59c 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Post, Param, Query, UseGuards } from '@nestjs/common'; +import { Controller, Get, Param, Query } from '@nestjs/common'; import { CoursesService } from './courses.service'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; @@ -13,4 +13,9 @@ export class CourseController { return courses } + + @Get(':id') + async getCourseById(@Param('id') id: number, @GetUser() user: session_userprofile) { + return await this.CoursesService.getCourseById(id, user); + } } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 01b3bcd7..6a77aecc 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,5 +1,6 @@ +import { DepartmentRepository } from './../../prisma/repositories/department.repository'; import { CourseRepository } from './../../prisma/repositories/course.repository'; -import { Injectable } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { applyOrder } from 'src/common/utils/search.utils'; import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; import { session_userprofile, subject_professor } from '@prisma/client'; @@ -19,6 +20,15 @@ export class CoursesService { return await this.toJson(queryResult, user); } + public async getCourseById(id: number, user: session_userprofile) { + const queryResult = await this.CourseRepository.getCourseById(id); + if (!queryResult) { + throw new NotFoundException(); + } + + return (await this.toJson([queryResult], user, false)).at(0); + } + private async toJson(query_res: subject_course[], user: session_userprofile, nested=false) { return Promise.all(query_res.map(async (course) => { const representativeLecture = await this.getRepresentativeLecture(course.lecture); diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index c6771342..3cec61c3 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -41,6 +41,20 @@ export class CourseRepository { "TS", ] + public async getCourseById (id: number): Promise { + return await this.prisma.subject_course.findUnique({ + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + where: { + id: id + } + }) as subject_course; + } + public async filterByRequest (query: any): Promise { const DEFAULT_LIMIT = 150; const DEFAULT_ORDER = ['old_code'] From 4bfca036179102963db5d826b064a3d22d5d0dac Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:15:17 +0900 Subject: [PATCH 040/250] refactor: implement types and serializer for courses --- .../dto/course/course.professor.dto.ts | 6 -- .../dto/course/course.response.dto.ts | 28 ++++++ .../dto/department/department.response.dto.ts | 6 ++ .../dto/professor/professor.response.dto.ts | 8 ++ .../department/department.response.dto.ts | 4 - .../serializer/course.serializer.ts | 43 +++++++++ .../serializer/department.serializer.ts | 11 +++ .../serializer/professor.serializer.ts | 21 +++++ src/common/utils/lecture.utils.ts | 7 ++ src/common/utils/search.utils.ts | 2 +- src/modules/courses/courses.service.ts | 87 +++---------------- 11 files changed, 139 insertions(+), 84 deletions(-) delete mode 100644 src/common/interfaces/dto/course/course.professor.dto.ts create mode 100644 src/common/interfaces/dto/course/course.response.dto.ts create mode 100644 src/common/interfaces/dto/department/department.response.dto.ts create mode 100644 src/common/interfaces/dto/professor/professor.response.dto.ts delete mode 100644 src/common/interfaces/dto/user/department/department.response.dto.ts create mode 100644 src/common/interfaces/serializer/course.serializer.ts create mode 100644 src/common/interfaces/serializer/department.serializer.ts create mode 100644 src/common/interfaces/serializer/professor.serializer.ts create mode 100644 src/common/utils/lecture.utils.ts diff --git a/src/common/interfaces/dto/course/course.professor.dto.ts b/src/common/interfaces/dto/course/course.professor.dto.ts deleted file mode 100644 index da3876f8..00000000 --- a/src/common/interfaces/dto/course/course.professor.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type CourseProfessorDto = { - name: string; - name_en: string; - professor_id: number; - review_total_weight: number; -}; \ No newline at end of file diff --git a/src/common/interfaces/dto/course/course.response.dto.ts b/src/common/interfaces/dto/course/course.response.dto.ts new file mode 100644 index 00000000..312bcbf0 --- /dev/null +++ b/src/common/interfaces/dto/course/course.response.dto.ts @@ -0,0 +1,28 @@ +import { toJsonDepartment } from "../../serializer/department.serializer"; +import { DepartmentResponseDto } from "../department/department.response.dto"; +import { ProfessorResponseDto } from "../professor/professor.response.dto"; + +export interface CourseResponseDto { + id: number; + old_code: string; + department: DepartmentResponseDto; + type: string; + type_en: string; + title: string; + title_en: string; + summary: string; + review_total_weight: number; + credit: number | null; + credit_au: number | null; + num_classes: number | null; + num_labs: number | null; +} + +export interface CourseResponseDtoNested extends CourseResponseDto { + related_courses_prior?: CourseResponseDto[]; + related_courses_posterior?: CourseResponseDto[]; + professors?: ProfessorResponseDto[]; + grade?: number; + load?: number; + speech?: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/department/department.response.dto.ts b/src/common/interfaces/dto/department/department.response.dto.ts new file mode 100644 index 00000000..2a8ec109 --- /dev/null +++ b/src/common/interfaces/dto/department/department.response.dto.ts @@ -0,0 +1,6 @@ +export interface DepartmentResponseDto{ + id: number; + name: string; + name_en: string; + code: string +} \ No newline at end of file diff --git a/src/common/interfaces/dto/professor/professor.response.dto.ts b/src/common/interfaces/dto/professor/professor.response.dto.ts new file mode 100644 index 00000000..7800d7bb --- /dev/null +++ b/src/common/interfaces/dto/professor/professor.response.dto.ts @@ -0,0 +1,8 @@ +import { subject_course } from "../../../../prisma/generated/prisma-class/subject_course"; + +export interface ProfessorResponseDto { + name: string; + name_en: string; + professor_id: number; + review_total_weight: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/user/department/department.response.dto.ts b/src/common/interfaces/dto/user/department/department.response.dto.ts deleted file mode 100644 index 71a4dfde..00000000 --- a/src/common/interfaces/dto/user/department/department.response.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Prisma, session_userprofile_majors} from "@prisma/client"; - - -export type DepartmentResponseDto = Partial; \ No newline at end of file diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts new file mode 100644 index 00000000..f83f261c --- /dev/null +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -0,0 +1,43 @@ +import { subject_course } from "../../../prisma/generated/prisma-class/subject_course"; +import { subject_lecture } from "../../../prisma/generated/prisma-class/subject_lecture"; +import { toJsonDepartment } from "./department.serializer"; +import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; +import { toJsonProfessor } from "./professor.serializer"; +import { applyOrder } from "../../utils/search.utils"; +import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; +import { CourseResponseDtoNested } from "../dto/course/course.response.dto"; + +export const toJsonCourse = (course: subject_course, lecture: subject_lecture, professor: subject_professor[], nested = false): CourseResponseDtoNested => { + const professorJson: ProfessorResponseDto[] = toJsonProfessor(professor, true); + const professorSorted = applyOrder(professorJson, ["name"]); + + let result = { + "id": course.id, + "old_code": course.old_code, + "department": toJsonDepartment(course.subject_department, true), + "type": course.type, + "type_en": course.type_en, + "title": course.title, + "title_en": course.title_en, + "summary": course.summury, // Todo: fix summury typo in db. + "review_total_weight": course.review_total_weight, + "credit": lecture.credit ?? null, + "credit_au": lecture.credit_au ?? null, + "num_classes": lecture.num_classes ?? null, + "num_labs": lecture.num_labs ?? null + }; + + if (nested) { + return result; + } + + result = Object.assign(result, { + "related_courses_prior": [], + "related_courses_posterior": [], + "professors": professorSorted, + "grade": course.grade, + "load": course.load, + "speech": course.speech + }); + return result; +}; \ No newline at end of file diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts new file mode 100644 index 00000000..dbb44909 --- /dev/null +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -0,0 +1,11 @@ +import { subject_department } from "../../../prisma/generated/prisma-class/subject_department"; +import { DepartmentResponseDto } from "../dto/department/department.response.dto"; + +export const toJsonDepartment = (department: subject_department, nested=false): DepartmentResponseDto => { + return { + "id": department.id, + "name": department.name, + "name_en": department.name_en, + "code": department.code, + } +} \ No newline at end of file diff --git a/src/common/interfaces/serializer/professor.serializer.ts b/src/common/interfaces/serializer/professor.serializer.ts new file mode 100644 index 00000000..af62653d --- /dev/null +++ b/src/common/interfaces/serializer/professor.serializer.ts @@ -0,0 +1,21 @@ +import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; +import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; + +export const toJsonProfessor = (professors: subject_professor[], nested=false): ProfessorResponseDto[] => { + const result = professors.map((professor) => { + return { + "name": professor.professor_name, + "name_en": professor.professor_name_en, + "professor_id": professor.professor_id, + "review_total_weight": professor.review_total_weight, + } + }); + + if (nested) { + return result; + } + + return result.map((professor) => { + return professor; //todo: add necessary infos + }); +} \ No newline at end of file diff --git a/src/common/utils/lecture.utils.ts b/src/common/utils/lecture.utils.ts new file mode 100644 index 00000000..1e2b22d6 --- /dev/null +++ b/src/common/utils/lecture.utils.ts @@ -0,0 +1,7 @@ +import { subject_lecture } from "../../prisma/generated/prisma-class/subject_lecture"; +import { applyOrder } from "./search.utils"; + +export const getRepresentativeLecture = (lectures: subject_lecture[]): subject_lecture => { + const orderedLectures = applyOrder(lectures, ["year", "semester"]) + return orderedLectures[0]; +} \ No newline at end of file diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index ca084457..cd4d3822 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,4 +1,4 @@ -export async function applyOrder(query: T[], order_opt: string[]) { +export function applyOrder(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 01b3bcd7..206d14ac 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,11 +1,17 @@ import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable } from '@nestjs/common'; +import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; import { applyOrder } from 'src/common/utils/search.utils'; -import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; -import { session_userprofile, subject_professor } from '@prisma/client'; +import { session_userprofile } from '@prisma/client'; import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; import { subject_lecture } from 'src/prisma/generated/prisma-class/subject_lecture'; import { subject_department } from 'src/prisma/generated/prisma-class/subject_department'; +import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; +import { toJsonProfessor } from "../../common/interfaces/serializer/professor.serializer"; +import { toJsonCourse } from "../../common/interfaces/serializer/course.serializer"; +import { subject_professor } from "../../prisma/generated/prisma-class/subject_professor"; +import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; +import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/course.response.dto"; @Injectable() @@ -14,46 +20,13 @@ export class CoursesService { private readonly CourseRepository: CourseRepository, ) {} - public async getCourseByFilter(query: any, user: session_userprofile) { + public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { const queryResult = await this.CourseRepository.filterByRequest(query); - return await this.toJson(queryResult, user); - } - - private async toJson(query_res: subject_course[], user: session_userprofile, nested=false) { - return Promise.all(query_res.map(async (course) => { - const representativeLecture = await this.getRepresentativeLecture(course.lecture); - const professorRaw = await Promise.all(course.subject_course_professors.map(async (x) => x.professor as subject_professor)); - const professorJson: CourseProfessorDto[] = await this.toJsonProfessor(professorRaw, true); - const professorSorted = await applyOrder(professorJson, ["name"]); + return queryResult.map((course) => { - let result = { - "id": course.id, - "old_code": course.old_code, - "department": this.toJsonDepartment(course.subject_department, true), - "type": course.type, - "type_en": course.type_en, - "title": course.title, - "title_en": course.title_en, - "summary": course.summury, // Todo: fix summury typo in db. - "review_total_weight": course.review_total_weight, - "credit": representativeLecture.credit ?? null, - "credit_au": representativeLecture.credit_au ?? null, - "num_classes": representativeLecture.num_classes ?? null, - "num_labs": representativeLecture.num_labs ?? null, - }; - - if (nested) { - return result; - } - - result = Object.assign(result, { - "related_courses_prior": [], - "related_courses_posterior": [], - "professors": professorSorted, - "grade": course.grade, - "load": course.load, - "speech": course.speech, - }) + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map( (x) => x.professor as subject_professor); + const result = toJsonCourse(course, representativeLecture, professorRaw,false); if (user) { const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; @@ -66,38 +39,6 @@ export class CoursesService { "userspecific_is_read": false, }) } - })); - } - - private async getRepresentativeLecture(lectures: subject_lecture[]): Promise { - const orderedLectures = await applyOrder(lectures, ["year", "semester"]) - return orderedLectures[0]; - } - - private async toJsonProfessor(professors: subject_professor[], nested=false) { - const result = professors.map((professor) => { - return { - "name": professor.professor_name, - "name_en": professor.professor_name_en, - "professor_id": professor.professor_id, - "review_total_weight": professor.review_total_weight, - } - }); - - if (nested) { - return result; - } - - return result.map((professor) => { - return professor; //todo: add necessary infos - }); - } - private toJsonDepartment(department: subject_department, nested=false) { - return { - "id": department.id, - "name": department.name, - "name_en": department.name_en, - "code": department.code, - } + }) } } \ No newline at end of file From 8e82b874edb0223149da2991b147d48089c6c686 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:18:05 +0900 Subject: [PATCH 041/250] Add: add FKs to userprofile and other tables --- package.json | 2 + .../interfaces/serializer/user.serializer.ts | 59 +++++++++++++++++++ src/common/schemaTypes/types.ts | 9 +++ .../20230703113703_create_f_ks/migration.sql | 8 +++ .../migration.sql | 8 +++ src/prisma/schema.prisma | 12 ++++ 6 files changed, 98 insertions(+) create mode 100644 src/common/schemaTypes/types.ts create mode 100644 src/prisma/migrations/20230703113703_create_f_ks/migration.sql create mode 100644 src/prisma/migrations/20230703135605_add_fk_writer/migration.sql diff --git a/package.json b/package.json index 623c126a..2fe0e599 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,8 @@ "prisma-generate": "npx prisma generate --schema src/prisma/schema.prisma", "prisma-status:local": "dotenv -e env/.env.local npx prisma migrate status", "prisma-status:dev": "dotenv -e env/.env.dev npx prisma migrate status", + "prisma-resolve:local": "dotenv -e env/.env.local npx prisma migrate resolve", + "prisma-resolve:dev": "dotenv -e env/.env.dev npx prisma migrate resolve", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts index e69de29b..63083ea7 100644 --- a/src/common/interfaces/serializer/user.serializer.ts +++ b/src/common/interfaces/serializer/user.serializer.ts @@ -0,0 +1,59 @@ +import { Prisma, review_review, session_userprofile, subject_department } from "@prisma/client"; +import { PrismaService } from "../../../prisma/prisma.service"; +import { userSelectResultType } from "../../schemaTypes/types"; + +export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { + + const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { + if(user[key] && value) { + value = false; + }else if(user[key] && !value) { + value = false + } + else if(!user[key] && value) { + value = true + }else if(!user[key] && !value) { + value = false + } + }) + + const result: userSelectResultType = await prismaService.session_userprofile.findFirst({ + where: { sid: user.sid }, + include: userLoadOptions, + }) + return result; +} + +export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { + + + const majors: subject_department[] = await prisma.session_userprofile.findMany({ + include: { + session_userprofile_majors: { + include: { + subject_department: true + } + }, + favorite_departments: { + include:{ + department: true + } + } + } + }); + + const reviewList: review_review[] = await prisma.review_review.findMany({ + + }) + + + return { + id: user.id, + email: user.email, + student_id: user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: user.department, + majors: user.session_userprofile_majors. + }; +} \ No newline at end of file diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts new file mode 100644 index 00000000..158b8b0c --- /dev/null +++ b/src/common/schemaTypes/types.ts @@ -0,0 +1,9 @@ +import { Prisma } from "@prisma/client"; + +export type userSelectResultType = Prisma.session_userprofileGetPayload<{ + include: Prisma.session_userprofileInclude +}> + +export type courseSelectResultType = Prisma.subject_courseGetPayload<{ + include: Prisma.subject_courseInclude +}> diff --git a/src/prisma/migrations/20230703113703_create_f_ks/migration.sql b/src/prisma/migrations/20230703113703_create_f_ks/migration.sql new file mode 100644 index 00000000..d49cd192 --- /dev/null +++ b/src/prisma/migrations/20230703113703_create_f_ks/migration.sql @@ -0,0 +1,8 @@ +-- AddForeignKey +ALTER TABLE `session_userprofile` ADD CONSTRAINT `session_userprofile_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_favorite_departments` ADD CONSTRAINT `session_userprofile_favorite_departments_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_favorite_departments` ADD CONSTRAINT `session_userprofile_favorite_departments_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql b/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql new file mode 100644 index 00000000..1bd255dd --- /dev/null +++ b/src/prisma/migrations/20230703135605_add_fk_writer/migration.sql @@ -0,0 +1,8 @@ +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_writer_id_fkey` FOREIGN KEY (`writer_id`) REFERENCES `session_userprofile`(`id`) ON DELETE SET NULL ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_taken_lectures` ADD CONSTRAINT `session_userprofile_taken_lectures_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `session_userprofile_taken_lectures` ADD CONSTRAINT `session_userprofile_taken_lectures_lecture_id_fkey` FOREIGN KEY (`lecture_id`) REFERENCES `subject_lecture`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index e4698f49..08e8eb30 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -236,6 +236,7 @@ model review_review { load Int @db.SmallInt speech Int @db.SmallInt writer_id Int? + writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) writer_label String @db.VarChar(200) updated_datetime DateTime @db.DateTime(0) like Int @@ -263,6 +264,7 @@ model session_userprofile { student_id String @db.VarChar(10) sid String @db.VarChar(30) department_id Int? + department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) email String? @db.VarChar(255) date_joined DateTime @db.DateTime(0) first_name String @db.VarChar(30) @@ -275,16 +277,21 @@ model session_userprofile { session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] + favorite_departments session_userprofile_favorite_departments[] subject_courseuser subject_courseuser[] + taken_lectures session_userprofile_taken_lectures[] support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? + reviews review_review[] } model session_userprofile_favorite_departments { id Int @id @default(autoincrement()) userprofile_id Int + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) department_id Int + department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, department_id], map: "userprofile_id") } @@ -325,7 +332,9 @@ model session_userprofile_specialized_major { model session_userprofile_taken_lectures { id Int @id @default(autoincrement()) userprofile_id Int + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) lecture_id Int + lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, lecture_id], map: "userprofile_id") } @@ -426,6 +435,8 @@ model subject_department { graduation_majortrack graduation_majortrack[] main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] planner_arbitraryplanneritem planner_arbitraryplanneritem[] + session_userprofile session_userprofile[] + session_userprofile_favorite_departments session_userprofile_favorite_departments[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] @@ -479,6 +490,7 @@ model subject_lecture { planner_takenplanneritem planner_takenplanneritem[] subject_classtime subject_classtime[] subject_examtime subject_examtime[] + students session_userprofile_taken_lectures[] timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] From 32c0c092ed92ae8890441b776f117abcdf688330 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 5 Jul 2023 20:43:54 +0900 Subject: [PATCH 042/250] migrate: add_no_space_columns --- .../migration.sql | 10 ++++ .../noSpaceColumns.ts | 55 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql create mode 100644 src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts diff --git a/src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql b/src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql new file mode 100644 index 00000000..6b20593e --- /dev/null +++ b/src/prisma/migrations/20230705113103_add_no_space_columns/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `title_en_no_space` to the `subject_course` table without a default value. This is not possible if the table is not empty. + - Added the required column `title_no_space` to the `subject_course` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `subject_course` ADD COLUMN `title_en_no_space` VARCHAR(200) NOT NULL, + ADD COLUMN `title_no_space` VARCHAR(100) NOT NULL; diff --git a/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts b/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts new file mode 100644 index 00000000..7c8a8dc6 --- /dev/null +++ b/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts @@ -0,0 +1,55 @@ +import { PrismaService } from "../../prisma.service"; +import settings from "../../../settings"; + +async function main() { + const ormConfig = settings().ormconfig(); + console.log(ormConfig); + const prisma = new PrismaService(); + try { + await prisma.$connect(); + await prisma.$transaction(async (tx)=> { + const subject_course = await tx.subject_course.findMany(); + + const BATCH_SIZE = 1000; + console.log(subject_course.length); + for (let i = 0; i < Math.ceil(subject_course.length / BATCH_SIZE); i++) { + const sliced_subject_course = subject_course.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE + ); + const bulkPromises = sliced_subject_course.map(async (course) => { + const result = tx.subject_course.update({ + where: { + id: course.id + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + } + }); + return result; + }); + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + },{ + maxWait: 5000, + timeout: 300000 + }) + } catch (e) { + console.error(e); + } finally { + await prisma.$disconnect(); + } +} + +main() + .then(() => { + console.log("done"); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + process.exit(0); + }); From 39aa60f719f1bb8f0d170bf3e0bb6c5113bcf886 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 11 Jul 2023 19:41:07 +0900 Subject: [PATCH 043/250] add_fk_between_course_and_department --- .../migration.sql | 5 + src/prisma/repositories/course.repository.ts | 239 ++++++++++++++++++ src/prisma/schema.prisma | 102 ++++---- 3 files changed, 300 insertions(+), 46 deletions(-) create mode 100644 src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql diff --git a/src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql b/src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql new file mode 100644 index 00000000..12090a5a --- /dev/null +++ b/src/prisma/migrations/20230711103921_add_fk_between_course_and_department/migration.sql @@ -0,0 +1,5 @@ +-- CreateIndex +CREATE INDEX `subject_course_department_id_fkey` ON `subject_course`(`department_id`); + +-- AddForeignKey +ALTER TABLE `subject_course` ADD CONSTRAINT `subject_course_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index b5afc2cb..a83c8ac1 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -4,5 +4,244 @@ import { PrismaService } from "../prisma.service"; @Injectable() export class CourseRepository{ constructor(private readonly prisma: PrismaService){} + + private TYPE_ACRONYMS = { + "GR": "General Required", + "MGC": "Mandatory General Courses", + "BE": "Basic Elective", + "BR": "Basic Required", + "EG": "Elective(Graduate)", + "HSE": "Humanities & Social Elective", + "OE": "Other Elective", + "ME": "Major Elective", + "MR": "Major Required", + } + private MAJOR_ACRONYMS = [ + "CE", + "MSB", + "ME", + "PH", + "BiS", + "IE", + "ID", + "BS", + "CBE", + "MAS", + "MS", + "NQE", + "HSS", + "EE", + "CS", + "AE", + "CH", + "TS", + ] + //할일 + // Foreign key subject_course_professor 새로 걸어주기 + // subject_professor_course_list drop 하기 + public async filterByRequest (query: any) { + const { + department, + type, + level, + group, + keyword, + term, + order, + offset, + limit, + } = query; + const department_filter = this.department_filter(department); + const type_filter = this.type_filter(type); + const level_filter = this.level_filter(level); + const group_filter = this.group_filter(group); + const keyword_filter = this.keyword_filter(keyword); + const term_filter = this.term_filter(term); + let filter_list = [department_filter, type_filter, level_filter, group_filter, keyword_filter, term_filter] + filter_list = filter_list.filter((filter) => filter !== null) + return await this.prisma.subject_course.findMany({ + include: { + department: true, + professor_course_list: true + }, + where: { + AND: filter_list + } + }) + } + private department_filter(department_names: [string]): object { + if (!(department_names)) { + return null + } + if ("ALL" in department_names) { + return null + } else if ("ETC" in department_names) { + return { + department: { + code: { + notIn: { department_names } + } + } + } + } else { + return { + department: { + code: { + in: { department_names } + } + } + } + } + } + + private type_filter(types: [string]): object { + if (!(types)) { + return null + } + + if ("ALL" in types) { + return null + } else if ("ETC" in types) { + const unselected_types = Object.values(this.TYPE_ACRONYMS).filter((type) => !(type in types)) + return { + type_en: { + in: { unselected_types } + } + } + } else { + return { + type_en: { + in: { types } + } + } + } + } + + private level_filter(levels?: [string]): object { + if (!(levels)) { + return null; + } + + const acronym_dic = ["1", "2", "3", "4"]; + if ("ALL" in levels) { + return null; + } else if ("ETC" in levels) { + const numbers = acronym_dic.filter((level) => !(level in levels)); + return { + old_code: { + contains: { + numbers + } + } + }; + } else { + const numbers = acronym_dic.filter((level) => level in levels); + return { + old_code: { + contains: { + numbers + } + } + }; + } + } + + private term_filter(term?: [string]): object { + if (!(term)) { + return null; + } + + if ("ALL" in term) { + return null; + } else { + const current_year = new Date().getFullYear().toString(); + return { + lecture: { + year: current_year + } + }; + } + } + + private keyword_filter(keyword?: [string]): object { + if (!(keyword)) { + return null; + } + + const keyword_trimed = keyword.map((word) => word.trim()); + const keyword_space_removed = keyword_trimed.map((word) => word.replace(/\s/g, "")); + const title_filter = { + title_no_space: { + contains: { keyword_space_removed } + } + }; + const en_title_filter = { + en_title_np_space: { + contains: { keyword_space_removed } + } + }; + const department_name_filter = { + department: { + name: keyword_trimed + } + }; + const department_name_en_filter = { + department: { + name_en: keyword_trimed + } + }; + const professors_professor_name_filter = { + subject_professor_course_list: { + subject_professor: { + professor_name: { + contains: { keyword_trimed } + } + } + } + }; + const professors_professor_name_en_filter = { + subject_professor_course_list: { + subject_professor: { + professor_name_en: { + contains: { keyword_trimed } + } + } + } + } + return { + OR: [ + title_filter, + en_title_filter, + department_name_filter, + department_name_en_filter, + professors_professor_name_filter, + professors_professor_name_en_filter + ] + }; + } + + private group_filter(group?: [string]): object { + if (!(group)) { + return null; + } + + const filter = []; + + if ("Basic" in group) { + filter.push("Basic Required", "Basic Elective"); + } + if ("Humanity" in group) { + filter.push("Humanities & Social Elective"); + } + if (group.length > 2) { + filter.push("Major Required", "Major Elective", "Elective(Graduate)"); + } + + return { + type_en: { + in: { filter } + } + }; + } } \ No newline at end of file diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 08e8eb30..f3d51bd8 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -236,7 +236,6 @@ model review_review { load Int @db.SmallInt speech Int @db.SmallInt writer_id Int? - writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) writer_label String @db.VarChar(200) updated_datetime DateTime @db.DateTime(0) like Int @@ -244,6 +243,7 @@ model review_review { written_datetime DateTime? @db.DateTime(0) main_famoushumanityreviewdailyfeed_reviews main_famoushumanityreviewdailyfeed_reviews[] main_famousmajorreviewdailyfeed_reviews main_famousmajorreviewdailyfeed_reviews[] + writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) @@unique([writer_id, lecture_id], map: "review_comment_writer_id_af700a5d_uniq") @@index([written_datetime], map: "review_comment_e5e30a4a") @@ -260,40 +260,43 @@ model review_reviewvote { } model session_userprofile { - id Int @id @default(autoincrement()) - student_id String @db.VarChar(10) - sid String @db.VarChar(30) + id Int @id @default(autoincrement()) + student_id String @db.VarChar(10) + sid String @db.VarChar(30) department_id Int? - department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) - email String? @db.VarChar(255) - date_joined DateTime @db.DateTime(0) - first_name String @db.VarChar(30) - last_name String @db.VarChar(150) - refresh_token String? @db.VarChar(255) + email String? @db.VarChar(255) + date_joined DateTime @db.DateTime(0) + first_name String @db.VarChar(30) + last_name String @db.VarChar(150) + refresh_token String? @db.VarChar(255) main_ratedailyuserfeed main_ratedailyuserfeed[] main_relatedcoursedailyuserfeed main_relatedcoursedailyuserfeed[] main_reviewwritedailyuserfeed main_reviewwritedailyuserfeed[] planner_planner planner_planner[] + reviews review_review[] + department subject_department? @relation(fields: [department_id], references: [id], onUpdate: Restrict) + favorite_departments session_userprofile_favorite_departments[] session_userprofile_majors session_userprofile_majors[] session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] - favorite_departments session_userprofile_favorite_departments[] - subject_courseuser subject_courseuser[] taken_lectures session_userprofile_taken_lectures[] + subject_courseuser subject_courseuser[] support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? - reviews review_review[] + + @@index([department_id], map: "session_userprofile_department_id_fkey") } model session_userprofile_favorite_departments { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) userprofile_id Int - userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) department_id Int department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, department_id], map: "userprofile_id") + @@index([department_id], map: "session_userprofile_favorite_departments_department_id_fkey") } model session_userprofile_majors { @@ -330,13 +333,14 @@ model session_userprofile_specialized_major { } model session_userprofile_taken_lectures { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) userprofile_id Int - userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) + userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, lecture_id], map: "userprofile_id") + @@index([lecture_id], map: "session_userprofile_taken_lectures_lecture_id_fkey") } model subject_classtime { @@ -373,13 +377,18 @@ model subject_course { load Float speech Float latest_written_datetime DateTime? @db.DateTime(0) + title_en_no_space String @db.VarChar(200) + title_no_space String @db.VarChar(100) main_relatedcoursedailyuserfeed main_relatedcoursedailyuserfeed[] planner_futureplanneritem planner_futureplanneritem[] + subject_department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) subject_course_related_courses_posterior_subject_course_related_courses_posterior_from_course_idTosubject_course subject_course_related_courses_posterior[] @relation("subject_course_related_courses_posterior_from_course_idTosubject_course") subject_course_related_courses_posterior_subject_course_related_courses_posterior_to_course_idTosubject_course subject_course_related_courses_posterior[] @relation("subject_course_related_courses_posterior_to_course_idTosubject_course") subject_course_related_courses_prior_subject_course_related_courses_prior_from_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_from_course_idTosubject_course") subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_to_course_idTosubject_course") subject_courseuser subject_courseuser[] + + @@index([department_id], map: "subject_course_department_id_fkey") } model subject_course_professors { @@ -425,21 +434,22 @@ model subject_courseuser { } model subject_department { - id Int @id - num_id String @db.VarChar(4) - code String @db.VarChar(5) - name String @db.VarChar(60) - name_en String? @db.VarChar(60) - visible Boolean - graduation_additionaltrack graduation_additionaltrack[] - graduation_majortrack graduation_majortrack[] - main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] - planner_arbitraryplanneritem planner_arbitraryplanneritem[] - session_userprofile session_userprofile[] - session_userprofile_favorite_departments session_userprofile_favorite_departments[] - session_userprofile_majors session_userprofile_majors[] - session_userprofile_minors session_userprofile_minors[] - session_userprofile_specialized_major session_userprofile_specialized_major[] + id Int @id + num_id String @db.VarChar(4) + code String @db.VarChar(5) + name String @db.VarChar(60) + name_en String? @db.VarChar(60) + visible Boolean + graduation_additionaltrack graduation_additionaltrack[] + graduation_majortrack graduation_majortrack[] + main_famousmajorreviewdailyfeed main_famousmajorreviewdailyfeed[] + planner_arbitraryplanneritem planner_arbitraryplanneritem[] + session_userprofile session_userprofile[] + session_userprofile_favorite_departments session_userprofile_favorite_departments[] + session_userprofile_majors session_userprofile_majors[] + session_userprofile_minors session_userprofile_minors[] + session_userprofile_specialized_major session_userprofile_specialized_major[] + subject_course subject_course[] } model subject_examtime { @@ -454,17 +464,17 @@ model subject_examtime { } model subject_lecture { - id Int @id @default(autoincrement()) - code String @db.VarChar(10) - old_code String @db.VarChar(10) + id Int @id @default(autoincrement()) + code String @db.VarChar(10) + old_code String @db.VarChar(10) year Int - semester Int @db.SmallInt + semester Int @db.SmallInt department_id Int - class_no String @db.VarChar(4) - title String @db.VarChar(100) - title_en String @db.VarChar(200) - type String @db.VarChar(12) - type_en String @db.VarChar(36) + class_no String @db.VarChar(4) + title String @db.VarChar(100) + title_en String @db.VarChar(200) + type String @db.VarChar(12) + type_en String @db.VarChar(36) audience Int credit Int num_classes Int @@ -482,15 +492,15 @@ model subject_lecture { load Float speech Float review_total_weight Float - class_title String? @db.VarChar(100) - class_title_en String? @db.VarChar(100) - common_title String? @db.VarChar(100) - common_title_en String? @db.VarChar(100) + class_title String? @db.VarChar(100) + class_title_en String? @db.VarChar(100) + common_title String? @db.VarChar(100) + common_title_en String? @db.VarChar(100) main_reviewwritedailyuserfeed main_reviewwritedailyuserfeed[] planner_takenplanneritem planner_takenplanneritem[] + students session_userprofile_taken_lectures[] subject_classtime subject_classtime[] subject_examtime subject_examtime[] - students session_userprofile_taken_lectures[] timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] From 6ba31e9e9c41cd93f2eb485baf74f23467db0c57 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 11 Jul 2023 19:43:38 +0900 Subject: [PATCH 044/250] migrate: drop_subject_professor_course_list --- .../migration.sql | 8 ++++++++ src/prisma/schema.prisma | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql diff --git a/src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql b/src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql new file mode 100644 index 00000000..af5bcd34 --- /dev/null +++ b/src/prisma/migrations/20230711104232_drop_subject_professor_course_list/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the `subject_professor_course_list` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +DROP TABLE `subject_professor_course_list`; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index f3d51bd8..2d9abd17 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -532,14 +532,6 @@ model subject_professor { speech Float } -model subject_professor_course_list { - id Int @id @default(autoincrement()) - professor_id Int - course_id Int - - @@unique([professor_id, course_id], map: "professor_id") -} - model subject_semester { id Int @id @default(autoincrement()) year Int From 2edd3e50814dff3b5199de25be9e72fe39975e33 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 12 Jul 2023 18:58:48 +0900 Subject: [PATCH 045/250] migrate: add_fk_subject_course_professors --- .../migration.sql | 5 ++++ src/prisma/schema.prisma | 30 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql diff --git a/src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql b/src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql new file mode 100644 index 00000000..a8a99711 --- /dev/null +++ b/src/prisma/migrations/20230712094426_add_fk_subject_course_professors/migration.sql @@ -0,0 +1,5 @@ +-- AddForeignKey +ALTER TABLE `subject_course_professors` ADD CONSTRAINT `subject_course_professors_course_id_fkey` FOREIGN KEY (`course_id`) REFERENCES `subject_course`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `subject_course_professors` ADD CONSTRAINT `subject_course_professors_professor_id_fkey` FOREIGN KEY (`professor_id`) REFERENCES `subject_professor`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 2d9abd17..8bee49c6 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -387,14 +387,17 @@ model subject_course { subject_course_related_courses_prior_subject_course_related_courses_prior_from_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_from_course_idTosubject_course") subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_to_course_idTosubject_course") subject_courseuser subject_courseuser[] + subject_course_professors subject_course_professors[] @@index([department_id], map: "subject_course_department_id_fkey") } model subject_course_professors { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) course_id Int professor_id Int + course subject_course @relation(fields: [course_id], references: [id], onUpdate: Restrict) + professor subject_professor @relation(fields: [professor_id], references: [id], onUpdate: Restrict) @@unique([course_id, professor_id], map: "course_id") } @@ -518,18 +521,19 @@ model subject_lecture_professors { } model subject_professor { - id Int @id @default(autoincrement()) - professor_name String @db.VarChar(100) - professor_name_en String? @db.VarChar(100) - professor_id Int - major String @db.VarChar(30) - grade_sum Float - load_sum Float - speech_sum Float - review_total_weight Float - grade Float - load Float - speech Float + id Int @id @default(autoincrement()) + professor_name String @db.VarChar(100) + professor_name_en String? @db.VarChar(100) + professor_id Int + major String @db.VarChar(30) + grade_sum Float + load_sum Float + speech_sum Float + review_total_weight Float + grade Float + load Float + speech Float + subject_course_professors subject_course_professors[] } model subject_semester { From 646da14941ae2bf39b0b80b863b90145863c45e1 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 17 Jul 2023 20:27:26 +0900 Subject: [PATCH 046/250] migrate: add_fk_subject_course_subject_lecture --- .../migration.sql | 2 ++ src/prisma/schema.prisma | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql diff --git a/src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql b/src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql new file mode 100644 index 00000000..6d784c8c --- /dev/null +++ b/src/prisma/migrations/20230717112040_add_fk_subject_course_subject_lecture/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `subject_lecture` ADD CONSTRAINT `subject_lecture_course_id_fkey` FOREIGN KEY (`course_id`) REFERENCES `subject_course`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 8bee49c6..56ee313c 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -388,6 +388,7 @@ model subject_course { subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course subject_course_related_courses_prior[] @relation("subject_course_related_courses_prior_to_course_idTosubject_course") subject_courseuser subject_courseuser[] subject_course_professors subject_course_professors[] + lecture subject_lecture[] @@index([department_id], map: "subject_course_department_id_fkey") } @@ -488,6 +489,7 @@ model subject_lecture { is_english Boolean deleted Boolean course_id Int + course subject_course @relation(fields: [course_id], references: [id], onUpdate: Restrict) grade_sum Float load_sum Float speech_sum Float From f7c7c0a59d1d876d98b756e82434e951473145f0 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:10:59 +0900 Subject: [PATCH 047/250] migrate: add fk between lecture and department --- .../migration.sql | 2 ++ src/prisma/schema.prisma | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/prisma/migrations/20230724120847_add_fk_subject_lecture_subject_department/migration.sql diff --git a/src/prisma/migrations/20230724120847_add_fk_subject_lecture_subject_department/migration.sql b/src/prisma/migrations/20230724120847_add_fk_subject_lecture_subject_department/migration.sql new file mode 100644 index 00000000..42675484 --- /dev/null +++ b/src/prisma/migrations/20230724120847_add_fk_subject_lecture_subject_department/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `subject_lecture` ADD CONSTRAINT `subject_lecture_department_id_fkey` FOREIGN KEY (`department_id`) REFERENCES `subject_department`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 56ee313c..2b37bc91 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -454,6 +454,7 @@ model subject_department { session_userprofile_minors session_userprofile_minors[] session_userprofile_specialized_major session_userprofile_specialized_major[] subject_course subject_course[] + subject_lecture subject_lecture[] } model subject_examtime { @@ -474,6 +475,7 @@ model subject_lecture { year Int semester Int @db.SmallInt department_id Int + department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) class_no String @db.VarChar(4) title String @db.VarChar(100) title_en String @db.VarChar(200) From 8a11161b36c8d55937f7ba079ac08c2b1ab2ea62 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:35:24 +0900 Subject: [PATCH 048/250] Delete: remove user.serializer --- .../interfaces/serializer/user.serializer.ts | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 src/common/interfaces/serializer/user.serializer.ts diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts deleted file mode 100644 index 63083ea7..00000000 --- a/src/common/interfaces/serializer/user.serializer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Prisma, review_review, session_userprofile, subject_department } from "@prisma/client"; -import { PrismaService } from "../../../prisma/prisma.service"; -import { userSelectResultType } from "../../schemaTypes/types"; - -export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { - - const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { - if(user[key] && value) { - value = false; - }else if(user[key] && !value) { - value = false - } - else if(!user[key] && value) { - value = true - }else if(!user[key] && !value) { - value = false - } - }) - - const result: userSelectResultType = await prismaService.session_userprofile.findFirst({ - where: { sid: user.sid }, - include: userLoadOptions, - }) - return result; -} - -export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - - - const majors: subject_department[] = await prisma.session_userprofile.findMany({ - include: { - session_userprofile_majors: { - include: { - subject_department: true - } - }, - favorite_departments: { - include:{ - department: true - } - } - } - }); - - const reviewList: review_review[] = await prisma.review_review.findMany({ - - }) - - - return { - id: user.id, - email: user.email, - student_id: user.student_id, - firstName: user.first_name, - lastName: user.last_name, - department: user.department, - majors: user.session_userprofile_majors. - }; -} \ No newline at end of file From 95ae6fb50762cf868f7717c23d29036563a298ef Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:15:17 +0900 Subject: [PATCH 049/250] refactor: implement types and serializer for courses --- .../dto/course/course.professor.dto.ts | 6 - .../dto/course/course.response.dto.ts | 28 +++++ .../dto/department/department.response.dto.ts | 6 + .../dto/professor/professor.response.dto.ts | 8 ++ .../department/department.response.dto.ts | 4 - .../serializer/course.serializer.ts | 43 +++++++ .../serializer/department.serializer.ts | 11 ++ .../serializer/professor.serializer.ts | 21 ++++ src/common/utils/lecture.utils.ts | 7 ++ src/common/utils/search.utils.ts | 2 +- src/modules/courses/courses.service.ts | 109 +++++------------- 11 files changed, 156 insertions(+), 89 deletions(-) delete mode 100644 src/common/interfaces/dto/course/course.professor.dto.ts create mode 100644 src/common/interfaces/dto/course/course.response.dto.ts create mode 100644 src/common/interfaces/dto/department/department.response.dto.ts create mode 100644 src/common/interfaces/dto/professor/professor.response.dto.ts delete mode 100644 src/common/interfaces/dto/user/department/department.response.dto.ts create mode 100644 src/common/interfaces/serializer/course.serializer.ts create mode 100644 src/common/interfaces/serializer/department.serializer.ts create mode 100644 src/common/interfaces/serializer/professor.serializer.ts create mode 100644 src/common/utils/lecture.utils.ts diff --git a/src/common/interfaces/dto/course/course.professor.dto.ts b/src/common/interfaces/dto/course/course.professor.dto.ts deleted file mode 100644 index da3876f8..00000000 --- a/src/common/interfaces/dto/course/course.professor.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type CourseProfessorDto = { - name: string; - name_en: string; - professor_id: number; - review_total_weight: number; -}; \ No newline at end of file diff --git a/src/common/interfaces/dto/course/course.response.dto.ts b/src/common/interfaces/dto/course/course.response.dto.ts new file mode 100644 index 00000000..312bcbf0 --- /dev/null +++ b/src/common/interfaces/dto/course/course.response.dto.ts @@ -0,0 +1,28 @@ +import { toJsonDepartment } from "../../serializer/department.serializer"; +import { DepartmentResponseDto } from "../department/department.response.dto"; +import { ProfessorResponseDto } from "../professor/professor.response.dto"; + +export interface CourseResponseDto { + id: number; + old_code: string; + department: DepartmentResponseDto; + type: string; + type_en: string; + title: string; + title_en: string; + summary: string; + review_total_weight: number; + credit: number | null; + credit_au: number | null; + num_classes: number | null; + num_labs: number | null; +} + +export interface CourseResponseDtoNested extends CourseResponseDto { + related_courses_prior?: CourseResponseDto[]; + related_courses_posterior?: CourseResponseDto[]; + professors?: ProfessorResponseDto[]; + grade?: number; + load?: number; + speech?: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/department/department.response.dto.ts b/src/common/interfaces/dto/department/department.response.dto.ts new file mode 100644 index 00000000..2a8ec109 --- /dev/null +++ b/src/common/interfaces/dto/department/department.response.dto.ts @@ -0,0 +1,6 @@ +export interface DepartmentResponseDto{ + id: number; + name: string; + name_en: string; + code: string +} \ No newline at end of file diff --git a/src/common/interfaces/dto/professor/professor.response.dto.ts b/src/common/interfaces/dto/professor/professor.response.dto.ts new file mode 100644 index 00000000..7800d7bb --- /dev/null +++ b/src/common/interfaces/dto/professor/professor.response.dto.ts @@ -0,0 +1,8 @@ +import { subject_course } from "../../../../prisma/generated/prisma-class/subject_course"; + +export interface ProfessorResponseDto { + name: string; + name_en: string; + professor_id: number; + review_total_weight: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/user/department/department.response.dto.ts b/src/common/interfaces/dto/user/department/department.response.dto.ts deleted file mode 100644 index 71a4dfde..00000000 --- a/src/common/interfaces/dto/user/department/department.response.dto.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Prisma, session_userprofile_majors} from "@prisma/client"; - - -export type DepartmentResponseDto = Partial; \ No newline at end of file diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts new file mode 100644 index 00000000..f83f261c --- /dev/null +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -0,0 +1,43 @@ +import { subject_course } from "../../../prisma/generated/prisma-class/subject_course"; +import { subject_lecture } from "../../../prisma/generated/prisma-class/subject_lecture"; +import { toJsonDepartment } from "./department.serializer"; +import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; +import { toJsonProfessor } from "./professor.serializer"; +import { applyOrder } from "../../utils/search.utils"; +import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; +import { CourseResponseDtoNested } from "../dto/course/course.response.dto"; + +export const toJsonCourse = (course: subject_course, lecture: subject_lecture, professor: subject_professor[], nested = false): CourseResponseDtoNested => { + const professorJson: ProfessorResponseDto[] = toJsonProfessor(professor, true); + const professorSorted = applyOrder(professorJson, ["name"]); + + let result = { + "id": course.id, + "old_code": course.old_code, + "department": toJsonDepartment(course.subject_department, true), + "type": course.type, + "type_en": course.type_en, + "title": course.title, + "title_en": course.title_en, + "summary": course.summury, // Todo: fix summury typo in db. + "review_total_weight": course.review_total_weight, + "credit": lecture.credit ?? null, + "credit_au": lecture.credit_au ?? null, + "num_classes": lecture.num_classes ?? null, + "num_labs": lecture.num_labs ?? null + }; + + if (nested) { + return result; + } + + result = Object.assign(result, { + "related_courses_prior": [], + "related_courses_posterior": [], + "professors": professorSorted, + "grade": course.grade, + "load": course.load, + "speech": course.speech + }); + return result; +}; \ No newline at end of file diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts new file mode 100644 index 00000000..dbb44909 --- /dev/null +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -0,0 +1,11 @@ +import { subject_department } from "../../../prisma/generated/prisma-class/subject_department"; +import { DepartmentResponseDto } from "../dto/department/department.response.dto"; + +export const toJsonDepartment = (department: subject_department, nested=false): DepartmentResponseDto => { + return { + "id": department.id, + "name": department.name, + "name_en": department.name_en, + "code": department.code, + } +} \ No newline at end of file diff --git a/src/common/interfaces/serializer/professor.serializer.ts b/src/common/interfaces/serializer/professor.serializer.ts new file mode 100644 index 00000000..af62653d --- /dev/null +++ b/src/common/interfaces/serializer/professor.serializer.ts @@ -0,0 +1,21 @@ +import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; +import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; + +export const toJsonProfessor = (professors: subject_professor[], nested=false): ProfessorResponseDto[] => { + const result = professors.map((professor) => { + return { + "name": professor.professor_name, + "name_en": professor.professor_name_en, + "professor_id": professor.professor_id, + "review_total_weight": professor.review_total_weight, + } + }); + + if (nested) { + return result; + } + + return result.map((professor) => { + return professor; //todo: add necessary infos + }); +} \ No newline at end of file diff --git a/src/common/utils/lecture.utils.ts b/src/common/utils/lecture.utils.ts new file mode 100644 index 00000000..1e2b22d6 --- /dev/null +++ b/src/common/utils/lecture.utils.ts @@ -0,0 +1,7 @@ +import { subject_lecture } from "../../prisma/generated/prisma-class/subject_lecture"; +import { applyOrder } from "./search.utils"; + +export const getRepresentativeLecture = (lectures: subject_lecture[]): subject_lecture => { + const orderedLectures = applyOrder(lectures, ["year", "semester"]) + return orderedLectures[0]; +} \ No newline at end of file diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index ca084457..cd4d3822 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,4 +1,4 @@ -export async function applyOrder(query: T[], order_opt: string[]) { +export function applyOrder(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 6a77aecc..dd0a6928 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,12 +1,18 @@ import { DepartmentRepository } from './../../prisma/repositories/department.repository'; import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable, NotFoundException } from '@nestjs/common'; +import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; import { applyOrder } from 'src/common/utils/search.utils'; -import { CourseProfessorDto } from 'src/common/interfaces/dto/course/course.professor.dto'; -import { session_userprofile, subject_professor } from '@prisma/client'; +import { session_userprofile } from '@prisma/client'; import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; import { subject_lecture } from 'src/prisma/generated/prisma-class/subject_lecture'; import { subject_department } from 'src/prisma/generated/prisma-class/subject_department'; +import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; +import { toJsonProfessor } from "../../common/interfaces/serializer/professor.serializer"; +import { toJsonCourse } from "../../common/interfaces/serializer/course.serializer"; +import { subject_professor } from "../../prisma/generated/prisma-class/subject_professor"; +import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; +import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/course.response.dto"; @Injectable() @@ -15,55 +21,12 @@ export class CoursesService { private readonly CourseRepository: CourseRepository, ) {} - public async getCourseByFilter(query: any, user: session_userprofile) { + public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { const queryResult = await this.CourseRepository.filterByRequest(query); - return await this.toJson(queryResult, user); - } - - public async getCourseById(id: number, user: session_userprofile) { - const queryResult = await this.CourseRepository.getCourseById(id); - if (!queryResult) { - throw new NotFoundException(); - } - - return (await this.toJson([queryResult], user, false)).at(0); - } - - private async toJson(query_res: subject_course[], user: session_userprofile, nested=false) { - return Promise.all(query_res.map(async (course) => { - const representativeLecture = await this.getRepresentativeLecture(course.lecture); - const professorRaw = await Promise.all(course.subject_course_professors.map(async (x) => x.professor as subject_professor)); - const professorJson: CourseProfessorDto[] = await this.toJsonProfessor(professorRaw, true); - const professorSorted = await applyOrder(professorJson, ["name"]); - - let result = { - "id": course.id, - "old_code": course.old_code, - "department": this.toJsonDepartment(course.subject_department, true), - "type": course.type, - "type_en": course.type_en, - "title": course.title, - "title_en": course.title_en, - "summary": course.summury, // Todo: fix summury typo in db. - "review_total_weight": course.review_total_weight, - "credit": representativeLecture.credit ?? null, - "credit_au": representativeLecture.credit_au ?? null, - "num_classes": representativeLecture.num_classes ?? null, - "num_labs": representativeLecture.num_labs ?? null, - }; - - if (nested) { - return result; - } - - result = Object.assign(result, { - "related_courses_prior": [], - "related_courses_posterior": [], - "professors": professorSorted, - "grade": course.grade, - "load": course.load, - "speech": course.speech, - }) + return queryResult.map((course) => { + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map((x) => x.professor as subject_professor); + const result = toJsonCourse(course, representativeLecture, professorRaw, false); if (user) { const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; @@ -76,38 +39,28 @@ export class CoursesService { "userspecific_is_read": false, }) } - })); - } - - private async getRepresentativeLecture(lectures: subject_lecture[]): Promise { - const orderedLectures = await applyOrder(lectures, ["year", "semester"]) - return orderedLectures[0]; + }) } - private async toJsonProfessor(professors: subject_professor[], nested=false) { - const result = professors.map((professor) => { - return { - "name": professor.professor_name, - "name_en": professor.professor_name_en, - "professor_id": professor.professor_id, - "review_total_weight": professor.review_total_weight, - } - }); - - if (nested) { - return result; + public async getCourseById(id: number, user: session_userprofile) { + const course = await this.CourseRepository.getCourseById(id); + if (!course) { + throw new NotFoundException(); } + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map((x) => x.professor as subject_professor); + const result = toJsonCourse(course, representativeLecture, professorRaw, false); - return result.map((professor) => { - return professor; //todo: add necessary infos - }); - } - private toJsonDepartment(department: subject_department, nested=false) { - return { - "id": department.id, - "name": department.name, - "name_en": department.name_en, - "code": department.code, + if (user) { + const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; + const latestWrittenDatetime = course.latest_written_datetime; + return Object.assign(result, { + "userspecific_is_read": latestWrittenDatetime < latestReadDatetime, + }) + } else { + return Object.assign(result, { + "userspecific_is_read": false, + }) } } } \ No newline at end of file From 836e701a90b49a62aaa5f7787c2c54aae84459a8 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:28:22 +0900 Subject: [PATCH 050/250] Fix: change hadling no representative lecture case to 0 --- src/common/interfaces/dto/course/course.response.dto.ts | 8 ++++---- src/common/interfaces/serializer/course.serializer.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/interfaces/dto/course/course.response.dto.ts b/src/common/interfaces/dto/course/course.response.dto.ts index 312bcbf0..9530be1b 100644 --- a/src/common/interfaces/dto/course/course.response.dto.ts +++ b/src/common/interfaces/dto/course/course.response.dto.ts @@ -12,10 +12,10 @@ export interface CourseResponseDto { title_en: string; summary: string; review_total_weight: number; - credit: number | null; - credit_au: number | null; - num_classes: number | null; - num_labs: number | null; + credit: number; + credit_au: number; + num_classes: number; + num_labs: number; } export interface CourseResponseDtoNested extends CourseResponseDto { diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts index f83f261c..b67ac56a 100644 --- a/src/common/interfaces/serializer/course.serializer.ts +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -21,10 +21,10 @@ export const toJsonCourse = (course: subject_course, lecture: subject_lecture, p "title_en": course.title_en, "summary": course.summury, // Todo: fix summury typo in db. "review_total_weight": course.review_total_weight, - "credit": lecture.credit ?? null, - "credit_au": lecture.credit_au ?? null, - "num_classes": lecture.num_classes ?? null, - "num_labs": lecture.num_labs ?? null + "credit": lecture.credit ?? 0, + "credit_au": lecture.credit_au ?? 0, + "num_classes": lecture.num_classes ?? 0, + "num_labs": lecture.num_labs ?? 0 }; if (nested) { From 788d157e33dbccc3edacea27597ae8c841535be4 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 20:35:35 +0900 Subject: [PATCH 051/250] temp --- src/modules/courses/courses.controller.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 6196c59c..206e6771 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -18,4 +18,9 @@ export class CourseController { async getCourseById(@Param('id') id: number, @GetUser() user: session_userprofile) { return await this.CoursesService.getCourseById(id, user); } + + @Get(':id/lectures') + async getLecturesByCourseId(@Param('id') id: number, @GetUser() user: session_userprofile) { + return await this.CoursesService.getLecturesByCourseId(id, user); + } } From f400f6cb4609d54b87ce42f8eefeedc2c7174cbb Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:10:59 +0900 Subject: [PATCH 052/250] migrate: add fk between lecture and department --- src/prisma/schema.prisma | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 860cd900..0beb8110 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -3,9 +3,9 @@ generator client { } generator prismaClassGenerator { - provider = "prisma-class-generator" - dryRun = true - output = "./generated/prisma-class" + provider = "prisma-class-generator" + dryRun = true + output = "./generated/prisma-class" } datasource db { From 380264af4959fa430fab2ac3e264735510e55268 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:11:07 +0900 Subject: [PATCH 053/250] temp --- .../serializer/lecture.serializer.ts | 33 +++++++++++++++++++ src/modules/courses/courses.service.ts | 10 ++++++ src/prisma/repositories/course.repository.ts | 13 ++++++++ 3 files changed, 56 insertions(+) create mode 100644 src/common/interfaces/serializer/lecture.serializer.ts diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts new file mode 100644 index 00000000..30ffa7f1 --- /dev/null +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -0,0 +1,33 @@ +import { subject_lecture } from "src/prisma/generated/prisma-class/subject_lecture" + +export const toJsonLecture = (lecture: subject_lecture, nested = false) => { + let result = { + "id": lecture.id, + "title": lecture.title, + "title_en": lecture.title_en, + "course": lecture.course_id, + "old_code": lecture.old_code, + "class_no": lecture.class_no, + "year": lecture.year, + "semester": lecture.semester, + "code": lecture.code, + "department": lecture.department.id, + "department_code": lecture.department.code, + "department_name": lecture.department.name, + "department_name_en": lecture.department.name_en, + "type": lecture.type, + "type_en": lecture.type_en, + "limit": lecture.limit, + "num_people": lecture.num_people, + "is_english": lecture.is_english, + "num_classes": lecture.num_classes, + "num_labs": lecture.num_labs, + "credit": lecture.credit, + "credit_au": lecture.credit_au, + "common_title": lecture.common_title, + "common_title_en": lecture.common_title_en, + "class_title": lecture.class_title, + "class_title_en": lecture.class_title_en, + "review_total_weight": lecture.review_total_weight, + } +} \ No newline at end of file diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index dd0a6928..9e202e86 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -13,6 +13,7 @@ import { toJsonCourse } from "../../common/interfaces/serializer/course.serializ import { subject_professor } from "../../prisma/generated/prisma-class/subject_professor"; import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/course.response.dto"; +import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; @Injectable() @@ -63,4 +64,13 @@ export class CoursesService { }) } } + + public async getLecturesByCourseId(query: {order: string}, id: number, user: session_userprofile) { + const lectures = await this.CourseRepository.getLecturesByCourseId(query, id); + if (!lectures) { + throw new NotFoundException(); + } + + return lectures.map((lecture) => toJsonLecture(lecture)); + } } \ No newline at end of file diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 7bb9c4c1..ebe8fc3a 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; import { subject_course } from "../generated/prisma-class/subject_course"; +import { subject_lecture } from "../generated/prisma-class/subject_lecture"; @Injectable() export class CourseRepository{ @@ -53,6 +54,18 @@ export class CourseRepository{ }) as subject_course; } + public async getLecturesByCourseId (query: {order: string}, id: number): Promise { + const course = await this.prisma.subject_course.findUnique({ + include: { + lecture: true, + }, + where: { + id: id, + } + }) as subject_course; + return course.lecture.filter((lecture) => !lecture.deleted) + } + public async filterByRequest (query: any): Promise { const DEFAULT_LIMIT = 150; const DEFAULT_ORDER = ['old_code'] From be73bfb2bc7c9a122162d96de90a7da4427dc9d0 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:41:49 +0900 Subject: [PATCH 054/250] Add: apply toJson serializer to session/info api --- src/modules/courses/courses.service.ts | 15 ++++----------- src/modules/user/user.service.ts | 11 ++++++----- src/prisma/repositories/department.repository.ts | 3 ++- src/prisma/repositories/lecture.repository.ts | 2 +- src/prisma/repositories/review.repository.ts | 2 +- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 206d14ac..271e279b 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,13 +1,6 @@ -import { CourseRepository } from './../../prisma/repositories/course.repository'; -import { Injectable } from '@nestjs/common'; -import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; -import { applyOrder } from 'src/common/utils/search.utils'; -import { session_userprofile } from '@prisma/client'; -import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; -import { subject_lecture } from 'src/prisma/generated/prisma-class/subject_lecture'; -import { subject_department } from 'src/prisma/generated/prisma-class/subject_department'; -import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; -import { toJsonProfessor } from "../../common/interfaces/serializer/professor.serializer"; +import { CourseRepository } from "./../../prisma/repositories/course.repository"; +import { Injectable } from "@nestjs/common"; +import { session_userprofile } from "@prisma/client"; import { toJsonCourse } from "../../common/interfaces/serializer/course.serializer"; import { subject_professor } from "../../prisma/generated/prisma-class/subject_professor"; import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; @@ -17,7 +10,7 @@ import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/cour @Injectable() export class CoursesService { constructor( - private readonly CourseRepository: CourseRepository, + private readonly CourseRepository: CourseRepository ) {} public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index aa0f7812..59257b2d 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -6,6 +6,7 @@ import { DepartmentRepository } from "../../prisma/repositories/department.repos import { normalizeArray } from "../../common/utils/method.utils"; import { ResearchLecture } from "../../common/interfaces/constants/lecture"; import { ReviewRepository } from "../../prisma/repositories/review.repository"; +import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; @Injectable() export class UserService { @@ -36,7 +37,7 @@ export class UserService { const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); - const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; + const departments = Object.values(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; const researchLectures = Object.values(ResearchLecture); const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); @@ -46,10 +47,10 @@ export class UserService { student_id : user.student_id, firstName: user.first_name, lastName: user.last_name, - department: department ?? null, - majors: majors, - departments: departments, - favorite_departments: favoriteDepartments, + department: toJsonDepartment(department) ?? null, + majors: toJsonDepartment(majors), + departments: departments.map((department) => toJsonDepartment(department)), + favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), review_writeable_lectures: reviewWritableLectures, my_timetable_lectures: timeTableLectures, reviews: writtenReviews diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index c11ac9a0..7943735a 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -1,7 +1,8 @@ import { PrismaService } from "../prisma.service"; -import { session_userprofile, subject_department } from "@prisma/client"; +import { session_userprofile } from "@prisma/client"; import session from "express-session"; import { Injectable } from "@nestjs/common"; +import { subject_department } from "../generated/prisma-class/subject_department"; @Injectable() export class DepartmentRepository{ diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 175fbd04..bdb6619c 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; import { groupBy } from "../../common/utils/method.utils"; +import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; @Injectable() export class LectureRepository { diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 8d761286..de8d1f6c 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { review_review, session_userprofile, subject_department } from "@prisma/client"; +import { review_review, session_userprofile } from "@prisma/client"; @Injectable() export class ReviewRepository{ From aa234a0c8747a451923257c59562634756a79f80 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:54:28 +0900 Subject: [PATCH 055/250] Migrate: add fk between subject_lecture and subject_professor --- .../migration.sql | 5 +++ src/prisma/schema.prisma | 33 +++++++++++-------- 2 files changed, 24 insertions(+), 14 deletions(-) create mode 100644 src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql diff --git a/src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql b/src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql new file mode 100644 index 00000000..178af8e5 --- /dev/null +++ b/src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql @@ -0,0 +1,5 @@ +-- AddForeignKey +ALTER TABLE `subject_lecture_professors` ADD CONSTRAINT `subject_lecture_professors_lecture_id_fkey` FOREIGN KEY (`lecture_id`) REFERENCES `subject_lecture`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `subject_lecture_professors` ADD CONSTRAINT `subject_lecture_professors_professor_id_fkey` FOREIGN KEY (`professor_id`) REFERENCES `subject_professor`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 0beb8110..63c2b517 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -4,7 +4,7 @@ generator client { generator prismaClassGenerator { provider = "prisma-class-generator" - dryRun = true + dryRun = false output = "./generated/prisma-class" } @@ -511,6 +511,7 @@ model subject_lecture { timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] + subject_lecture_professors subject_lecture_professors[] @@index([deleted], map: "subject_lecture_deleted_bedc6156_uniq") @@index([type_en], map: "subject_lecture_type_en_45ee2d3a_uniq") @@ -521,23 +522,27 @@ model subject_lecture_professors { lecture_id Int professor_id Int + lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) + professor subject_professor @relation(fields: [professor_id], references: [id], onUpdate: Restrict) + @@unique([lecture_id, professor_id], map: "lecture_id") } model subject_professor { - id Int @id @default(autoincrement()) - professor_name String @db.VarChar(100) - professor_name_en String? @db.VarChar(100) - professor_id Int - major String @db.VarChar(30) - grade_sum Float - load_sum Float - speech_sum Float - review_total_weight Float - grade Float - load Float - speech Float - subject_course_professors subject_course_professors[] + id Int @id @default(autoincrement()) + professor_name String @db.VarChar(100) + professor_name_en String? @db.VarChar(100) + professor_id Int + major String @db.VarChar(30) + grade_sum Float + load_sum Float + speech_sum Float + review_total_weight Float + grade Float + load Float + speech Float + subject_course_professors subject_course_professors[] + subject_lecture_professors subject_lecture_professors[] } model subject_semester { From 2a6d8dd0b4ef4a53d5631adf231eaf8ec87bbb1a Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 21:54:28 +0900 Subject: [PATCH 056/250] Migrate: add fk between subject_lecture and subject_professor --- .../migration.sql | 5 +++ src/prisma/schema.prisma | 31 +++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql diff --git a/src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql b/src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql new file mode 100644 index 00000000..178af8e5 --- /dev/null +++ b/src/prisma/migrations/20230724125117_add_fk_subject_lecture_subject_professor/migration.sql @@ -0,0 +1,5 @@ +-- AddForeignKey +ALTER TABLE `subject_lecture_professors` ADD CONSTRAINT `subject_lecture_professors_lecture_id_fkey` FOREIGN KEY (`lecture_id`) REFERENCES `subject_lecture`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; + +-- AddForeignKey +ALTER TABLE `subject_lecture_professors` ADD CONSTRAINT `subject_lecture_professors_professor_id_fkey` FOREIGN KEY (`professor_id`) REFERENCES `subject_professor`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 2b37bc91..3b4d8183 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -511,6 +511,7 @@ model subject_lecture { timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] + subject_lecture_professors subject_lecture_professors[] @@index([deleted], map: "subject_lecture_deleted_bedc6156_uniq") @@index([type_en], map: "subject_lecture_type_en_45ee2d3a_uniq") @@ -521,23 +522,27 @@ model subject_lecture_professors { lecture_id Int professor_id Int + lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) + professor subject_professor @relation(fields: [professor_id], references: [id], onUpdate: Restrict) + @@unique([lecture_id, professor_id], map: "lecture_id") } model subject_professor { - id Int @id @default(autoincrement()) - professor_name String @db.VarChar(100) - professor_name_en String? @db.VarChar(100) - professor_id Int - major String @db.VarChar(30) - grade_sum Float - load_sum Float - speech_sum Float - review_total_weight Float - grade Float - load Float - speech Float - subject_course_professors subject_course_professors[] + id Int @id @default(autoincrement()) + professor_name String @db.VarChar(100) + professor_name_en String? @db.VarChar(100) + professor_id Int + major String @db.VarChar(30) + grade_sum Float + load_sum Float + speech_sum Float + review_total_weight Float + grade Float + load Float + speech Float + subject_course_professors subject_course_professors[] + subject_lecture_professors subject_lecture_professors[] } model subject_semester { From ad514b5d8eeab6fec42c35630f5ccd4fa2605522 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:30:02 +0900 Subject: [PATCH 057/250] Add: add new fks in prisma class --- src/prisma/generated/prisma-class/subject_department.ts | 4 ++++ src/prisma/generated/prisma-class/subject_lecture.ts | 8 ++++++++ .../generated/prisma-class/subject_lecture_professors.ts | 8 ++++++++ src/prisma/generated/prisma-class/subject_professor.ts | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/src/prisma/generated/prisma-class/subject_department.ts b/src/prisma/generated/prisma-class/subject_department.ts index ea82d5da..083bb972 100644 --- a/src/prisma/generated/prisma-class/subject_department.ts +++ b/src/prisma/generated/prisma-class/subject_department.ts @@ -8,6 +8,7 @@ import { session_userprofile_majors } from './session_userprofile_majors'; import { session_userprofile_minors } from './session_userprofile_minors'; import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; import { subject_course } from './subject_course'; +import { subject_lecture } from './subject_lecture'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_department { @@ -64,4 +65,7 @@ export class subject_department { @ApiProperty({ isArray: true, type: () => subject_course }) subject_course: subject_course[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture }) + subject_lecture: subject_lecture[]; } diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts index b79375a7..64c5ecdc 100644 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -1,3 +1,4 @@ +import { subject_department } from './subject_department'; import { subject_course } from './subject_course'; import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; import { planner_takenplanneritem } from './planner_takenplanneritem'; @@ -7,6 +8,7 @@ import { subject_examtime } from './subject_examtime'; import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; import { timetable_timetable_lectures } from './timetable_timetable_lectures'; import { timetable_wishlist_lectures } from './timetable_wishlist_lectures'; +import { subject_lecture_professors } from './subject_lecture_professors'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_lecture { @@ -28,6 +30,9 @@ export class subject_lecture { @ApiProperty({ type: Number }) department_id: number; + @ApiProperty({ type: () => subject_department }) + department: subject_department; + @ApiProperty({ type: String }) class_no: string; @@ -135,4 +140,7 @@ export class subject_lecture { @ApiProperty({ isArray: true, type: () => timetable_wishlist_lectures }) timetable_wishlist_lectures: timetable_wishlist_lectures[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture_professors }) + subject_lecture_professors: subject_lecture_professors[]; } diff --git a/src/prisma/generated/prisma-class/subject_lecture_professors.ts b/src/prisma/generated/prisma-class/subject_lecture_professors.ts index 76d7a03a..2ff4209e 100644 --- a/src/prisma/generated/prisma-class/subject_lecture_professors.ts +++ b/src/prisma/generated/prisma-class/subject_lecture_professors.ts @@ -1,3 +1,5 @@ +import { subject_lecture } from './subject_lecture'; +import { subject_professor } from './subject_professor'; import { ApiProperty } from '@nestjs/swagger'; export class subject_lecture_professors { @@ -9,4 +11,10 @@ export class subject_lecture_professors { @ApiProperty({ type: Number }) professor_id: number; + + @ApiProperty({ type: () => subject_lecture }) + lecture: subject_lecture; + + @ApiProperty({ type: () => subject_professor }) + professor: subject_professor; } diff --git a/src/prisma/generated/prisma-class/subject_professor.ts b/src/prisma/generated/prisma-class/subject_professor.ts index bbaaf1d4..769b5a38 100644 --- a/src/prisma/generated/prisma-class/subject_professor.ts +++ b/src/prisma/generated/prisma-class/subject_professor.ts @@ -1,4 +1,5 @@ import { subject_course_professors } from './subject_course_professors'; +import { subject_lecture_professors } from './subject_lecture_professors'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_professor { @@ -40,4 +41,7 @@ export class subject_professor { @ApiProperty({ isArray: true, type: () => subject_course_professors }) subject_course_professors: subject_course_professors[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture_professors }) + subject_lecture_professors: subject_lecture_professors[]; } From e9d3cadfb470853a4375ede92ca47759dd3926ad Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:30:15 +0900 Subject: [PATCH 058/250] Add: implement classtime serializer --- .../serializer/classtime.serializer.ts | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/common/interfaces/serializer/classtime.serializer.ts diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts new file mode 100644 index 00000000..83601e31 --- /dev/null +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -0,0 +1,70 @@ +import { subject_classtime } from "src/prisma/generated/prisma-class/subject_classtime"; + +export const toJsonClassTime = (classtime: subject_classtime) => { + const classroomInfo = getClassroomStrs(classtime); + return Object.assign(classroomInfo, { + "day": classtime.day, + "begin": getTimeNumeric(classtime.begin), + "end": getTimeNumeric(classtime.end), + }) +} + +const getClassroomStrs = (classtime: subject_classtime) => { + const buildingFullName = classtime.building_full_name; + const buildingFullNameEn = classtime.building_full_name_en; + + if (!buildingFullName) { + return { + "building_code": "", + "room_name": "", + "classroom": "정보 없음", + "classroom_en": "Unknown", + "classroom_short": "정보 없음", + "classroom_short_en": "Unknown", + } + } else if (buildingFullName[0] == "(") { + const rightParanthesisIndex = buildingFullName.indexOf(")"); + const buildingCode = buildingFullName.slice(1, rightParanthesisIndex); + const buildingName = buildingFullName.slice(rightParanthesisIndex+1); + const buildingNameEn = buildingFullName.slice(rightParanthesisIndex+1); + const roomName = classtime.room_name ?? ""; + const classroom = "(" + buildingCode + ") " + buildingName + " " + roomName; + const classroomEn = "(" + buildingCode + ") " + buildingNameEn + " " + roomName; + const classroomShort = "(" + buildingCode + ") " + roomName; + const classroomShortEn = "(" + buildingCode + ") " + roomName; + + return { + "building_code": buildingCode, + "room_name": roomName, + "classroom": classroom, + "classroom_en": classroomEn, + "classroom_short": classroomShort, + "classroom_short_en": classroomShortEn, + } + } else { + const buildingCode = ""; + const roomName = classtime.room_name ?? ""; + const classroom = buildingFullName + " " + roomName; + const classroomEn = buildingFullNameEn + " " + roomName; + const classroomShort = buildingFullName + " " + roomName; + const classroomShortEn = buildingFullNameEn + " " + roomName; + + return { + "building_code": buildingCode, + "room_name": roomName, + "classroom": classroom, + "classroom_en": classroomEn, + "classroom_short": classroomShort, + "classroom_short_en": classroomShortEn, + } + } +} + +const getTimeNumeric = (time: Date) => { + const beginNumeric = time.getHours() * 60 + time.getMinutes(); + if (beginNumeric % 30) { + return beginNumeric + (30 - beginNumeric % 30); + } else { + return beginNumeric; + } +} \ No newline at end of file From 4bd985550da7eb820b8f9416d118fbb6e11fc085 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Mon, 24 Jul 2023 22:33:43 +0900 Subject: [PATCH 059/250] Migrate: add fk between review_review and subject_lecture --- src/prisma/generated/prisma-class/index.ts | 3 --- .../generated/prisma-class/review_review.ts | 8 +++++++ .../prisma-class/session_userprofile.ts | 22 ++++++++++++++++++ ...ession_userprofile_favorite_departments.ts | 8 +++++++ .../session_userprofile_taken_lectures.ts | 8 +++++++ .../generated/prisma-class/subject_course.ts | 18 +++++++++++++++ .../prisma-class/subject_course_professors.ts | 8 +++++++ .../prisma-class/subject_department.ts | 19 +++++++++++++++ .../generated/prisma-class/subject_lecture.ts | 23 +++++++++++++++++++ .../subject_lecture_professors.ts | 8 +++++++ .../prisma-class/subject_professor.ts | 8 +++++++ .../migration.sql | 2 ++ src/prisma/schema.prisma | 2 ++ 13 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 src/prisma/migrations/20230724133216_add_fk_review_review_subject_lecture/migration.sql diff --git a/src/prisma/generated/prisma-class/index.ts b/src/prisma/generated/prisma-class/index.ts index 56d76b67..5337c035 100644 --- a/src/prisma/generated/prisma-class/index.ts +++ b/src/prisma/generated/prisma-class/index.ts @@ -37,7 +37,6 @@ import { subject_examtime as _subject_examtime } from './subject_examtime'; import { subject_lecture as _subject_lecture } from './subject_lecture'; import { subject_lecture_professors as _subject_lecture_professors } from './subject_lecture_professors'; import { subject_professor as _subject_professor } from './subject_professor'; -import { subject_professor_course_list as _subject_professor_course_list } from './subject_professor_course_list'; import { subject_semester as _subject_semester } from './subject_semester'; import { support_notice as _support_notice } from './support_notice'; import { support_rate as _support_rate } from './support_rate'; @@ -96,7 +95,6 @@ export namespace PrismaModel { export class subject_lecture extends _subject_lecture {} export class subject_lecture_professors extends _subject_lecture_professors {} export class subject_professor extends _subject_professor {} - export class subject_professor_course_list extends _subject_professor_course_list {} export class subject_semester extends _subject_semester {} export class support_notice extends _support_notice {} export class support_rate extends _support_rate {} @@ -155,7 +153,6 @@ export namespace PrismaModel { subject_lecture, subject_lecture_professors, subject_professor, - subject_professor_course_list, subject_semester, support_notice, support_rate, diff --git a/src/prisma/generated/prisma-class/review_review.ts b/src/prisma/generated/prisma-class/review_review.ts index a3fa0ef5..28d8cdc8 100644 --- a/src/prisma/generated/prisma-class/review_review.ts +++ b/src/prisma/generated/prisma-class/review_review.ts @@ -1,5 +1,7 @@ +import { subject_lecture } from './subject_lecture'; import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class review_review { @@ -12,6 +14,9 @@ export class review_review { @ApiProperty({ type: Number }) lecture_id: number; + @ApiProperty({ type: () => subject_lecture }) + lecture: subject_lecture; + @ApiProperty({ type: String }) content: string; @@ -53,4 +58,7 @@ export class review_review { type: () => main_famousmajorreviewdailyfeed_reviews, }) main_famousmajorreviewdailyfeed_reviews: main_famousmajorreviewdailyfeed_reviews[]; + + @ApiPropertyOptional({ type: () => session_userprofile }) + writer?: session_userprofile; } diff --git a/src/prisma/generated/prisma-class/session_userprofile.ts b/src/prisma/generated/prisma-class/session_userprofile.ts index f7afb252..d5405578 100644 --- a/src/prisma/generated/prisma-class/session_userprofile.ts +++ b/src/prisma/generated/prisma-class/session_userprofile.ts @@ -2,9 +2,13 @@ import { main_ratedailyuserfeed } from './main_ratedailyuserfeed'; import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; import { planner_planner } from './planner_planner'; +import { review_review } from './review_review'; +import { subject_department } from './subject_department'; +import { session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; import { session_userprofile_majors } from './session_userprofile_majors'; import { session_userprofile_minors } from './session_userprofile_minors'; import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; import { subject_courseuser } from './subject_courseuser'; import { support_rate } from './support_rate'; import { timetable_timetable } from './timetable_timetable'; @@ -51,6 +55,18 @@ export class session_userprofile { @ApiProperty({ isArray: true, type: () => planner_planner }) planner_planner: planner_planner[]; + @ApiProperty({ isArray: true, type: () => review_review }) + reviews: review_review[]; + + @ApiPropertyOptional({ type: () => subject_department }) + department?: subject_department; + + @ApiProperty({ + isArray: true, + type: () => session_userprofile_favorite_departments, + }) + favorite_departments: session_userprofile_favorite_departments[]; + @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) session_userprofile_majors: session_userprofile_majors[]; @@ -63,6 +79,12 @@ export class session_userprofile { }) session_userprofile_specialized_major: session_userprofile_specialized_major[]; + @ApiProperty({ + isArray: true, + type: () => session_userprofile_taken_lectures, + }) + taken_lectures: session_userprofile_taken_lectures[]; + @ApiProperty({ isArray: true, type: () => subject_courseuser }) subject_courseuser: subject_courseuser[]; diff --git a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts index 3d442c2f..bc32cd7c 100644 --- a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts +++ b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts @@ -1,3 +1,5 @@ +import { subject_department } from './subject_department'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty } from '@nestjs/swagger'; export class session_userprofile_favorite_departments { @@ -9,4 +11,10 @@ export class session_userprofile_favorite_departments { @ApiProperty({ type: Number }) department_id: number; + + @ApiProperty({ type: () => subject_department }) + department: subject_department; + + @ApiProperty({ type: () => session_userprofile }) + userprofile: session_userprofile; } diff --git a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts index ab8e964a..15da4888 100644 --- a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts +++ b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts @@ -1,3 +1,5 @@ +import { subject_lecture } from './subject_lecture'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty } from '@nestjs/swagger'; export class session_userprofile_taken_lectures { @@ -9,4 +11,10 @@ export class session_userprofile_taken_lectures { @ApiProperty({ type: Number }) lecture_id: number; + + @ApiProperty({ type: () => subject_lecture }) + lecture: subject_lecture; + + @ApiProperty({ type: () => session_userprofile }) + userprofile: session_userprofile; } diff --git a/src/prisma/generated/prisma-class/subject_course.ts b/src/prisma/generated/prisma-class/subject_course.ts index 6ccf4d76..36f2271c 100644 --- a/src/prisma/generated/prisma-class/subject_course.ts +++ b/src/prisma/generated/prisma-class/subject_course.ts @@ -1,8 +1,11 @@ import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; import { planner_futureplanneritem } from './planner_futureplanneritem'; +import { subject_department } from './subject_department'; import { subject_course_related_courses_posterior } from './subject_course_related_courses_posterior'; import { subject_course_related_courses_prior } from './subject_course_related_courses_prior'; import { subject_courseuser } from './subject_courseuser'; +import { subject_course_professors } from './subject_course_professors'; +import { subject_lecture } from './subject_lecture'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_course { @@ -54,12 +57,21 @@ export class subject_course { @ApiPropertyOptional({ type: Date }) latest_written_datetime?: Date; + @ApiProperty({ type: String }) + title_en_no_space: string; + + @ApiProperty({ type: String }) + title_no_space: string; + @ApiProperty({ isArray: true, type: () => main_relatedcoursedailyuserfeed }) main_relatedcoursedailyuserfeed: main_relatedcoursedailyuserfeed[]; @ApiProperty({ isArray: true, type: () => planner_futureplanneritem }) planner_futureplanneritem: planner_futureplanneritem[]; + @ApiProperty({ type: () => subject_department }) + subject_department: subject_department; + @ApiProperty({ isArray: true, type: () => subject_course_related_courses_posterior, @@ -86,4 +98,10 @@ export class subject_course { @ApiProperty({ isArray: true, type: () => subject_courseuser }) subject_courseuser: subject_courseuser[]; + + @ApiProperty({ isArray: true, type: () => subject_course_professors }) + subject_course_professors: subject_course_professors[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture }) + lecture: subject_lecture[]; } diff --git a/src/prisma/generated/prisma-class/subject_course_professors.ts b/src/prisma/generated/prisma-class/subject_course_professors.ts index 5c14d9a9..bc7dfa7c 100644 --- a/src/prisma/generated/prisma-class/subject_course_professors.ts +++ b/src/prisma/generated/prisma-class/subject_course_professors.ts @@ -1,3 +1,5 @@ +import { subject_course } from './subject_course'; +import { subject_professor } from './subject_professor'; import { ApiProperty } from '@nestjs/swagger'; export class subject_course_professors { @@ -9,4 +11,10 @@ export class subject_course_professors { @ApiProperty({ type: Number }) professor_id: number; + + @ApiProperty({ type: () => subject_course }) + course: subject_course; + + @ApiProperty({ type: () => subject_professor }) + professor: subject_professor; } diff --git a/src/prisma/generated/prisma-class/subject_department.ts b/src/prisma/generated/prisma-class/subject_department.ts index 416d1708..083bb972 100644 --- a/src/prisma/generated/prisma-class/subject_department.ts +++ b/src/prisma/generated/prisma-class/subject_department.ts @@ -2,9 +2,13 @@ import { graduation_additionaltrack } from './graduation_additionaltrack'; import { graduation_majortrack } from './graduation_majortrack'; import { main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; import { planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; +import { session_userprofile } from './session_userprofile'; +import { session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; import { session_userprofile_majors } from './session_userprofile_majors'; import { session_userprofile_minors } from './session_userprofile_minors'; import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; +import { subject_course } from './subject_course'; +import { subject_lecture } from './subject_lecture'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_department { @@ -38,6 +42,15 @@ export class subject_department { @ApiProperty({ isArray: true, type: () => planner_arbitraryplanneritem }) planner_arbitraryplanneritem: planner_arbitraryplanneritem[]; + @ApiProperty({ isArray: true, type: () => session_userprofile }) + session_userprofile: session_userprofile[]; + + @ApiProperty({ + isArray: true, + type: () => session_userprofile_favorite_departments, + }) + session_userprofile_favorite_departments: session_userprofile_favorite_departments[]; + @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) session_userprofile_majors: session_userprofile_majors[]; @@ -49,4 +62,10 @@ export class subject_department { type: () => session_userprofile_specialized_major, }) session_userprofile_specialized_major: session_userprofile_specialized_major[]; + + @ApiProperty({ isArray: true, type: () => subject_course }) + subject_course: subject_course[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture }) + subject_lecture: subject_lecture[]; } diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts index dcd98f7d..305ed167 100644 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -1,10 +1,15 @@ +import { subject_department } from './subject_department'; +import { subject_course } from './subject_course'; import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; import { planner_takenplanneritem } from './planner_takenplanneritem'; +import { session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; import { subject_classtime } from './subject_classtime'; import { subject_examtime } from './subject_examtime'; import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; import { timetable_timetable_lectures } from './timetable_timetable_lectures'; import { timetable_wishlist_lectures } from './timetable_wishlist_lectures'; +import { subject_lecture_professors } from './subject_lecture_professors'; +import { review_review } from './review_review'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_lecture { @@ -26,6 +31,9 @@ export class subject_lecture { @ApiProperty({ type: Number }) department_id: number; + @ApiProperty({ type: () => subject_department }) + department: subject_department; + @ApiProperty({ type: String }) class_no: string; @@ -71,6 +79,9 @@ export class subject_lecture { @ApiProperty({ type: Number }) course_id: number; + @ApiProperty({ type: () => subject_course }) + course: subject_course; + @ApiProperty({ type: Number }) grade_sum: number; @@ -110,6 +121,12 @@ export class subject_lecture { @ApiProperty({ isArray: true, type: () => planner_takenplanneritem }) planner_takenplanneritem: planner_takenplanneritem[]; + @ApiProperty({ + isArray: true, + type: () => session_userprofile_taken_lectures, + }) + students: session_userprofile_taken_lectures[]; + @ApiProperty({ isArray: true, type: () => subject_classtime }) subject_classtime: subject_classtime[]; @@ -124,4 +141,10 @@ export class subject_lecture { @ApiProperty({ isArray: true, type: () => timetable_wishlist_lectures }) timetable_wishlist_lectures: timetable_wishlist_lectures[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture_professors }) + subject_lecture_professors: subject_lecture_professors[]; + + @ApiProperty({ isArray: true, type: () => review_review }) + review: review_review[]; } diff --git a/src/prisma/generated/prisma-class/subject_lecture_professors.ts b/src/prisma/generated/prisma-class/subject_lecture_professors.ts index 76d7a03a..2ff4209e 100644 --- a/src/prisma/generated/prisma-class/subject_lecture_professors.ts +++ b/src/prisma/generated/prisma-class/subject_lecture_professors.ts @@ -1,3 +1,5 @@ +import { subject_lecture } from './subject_lecture'; +import { subject_professor } from './subject_professor'; import { ApiProperty } from '@nestjs/swagger'; export class subject_lecture_professors { @@ -9,4 +11,10 @@ export class subject_lecture_professors { @ApiProperty({ type: Number }) professor_id: number; + + @ApiProperty({ type: () => subject_lecture }) + lecture: subject_lecture; + + @ApiProperty({ type: () => subject_professor }) + professor: subject_professor; } diff --git a/src/prisma/generated/prisma-class/subject_professor.ts b/src/prisma/generated/prisma-class/subject_professor.ts index ca4f3a1f..769b5a38 100644 --- a/src/prisma/generated/prisma-class/subject_professor.ts +++ b/src/prisma/generated/prisma-class/subject_professor.ts @@ -1,3 +1,5 @@ +import { subject_course_professors } from './subject_course_professors'; +import { subject_lecture_professors } from './subject_lecture_professors'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_professor { @@ -36,4 +38,10 @@ export class subject_professor { @ApiProperty({ type: Number }) speech: number; + + @ApiProperty({ isArray: true, type: () => subject_course_professors }) + subject_course_professors: subject_course_professors[]; + + @ApiProperty({ isArray: true, type: () => subject_lecture_professors }) + subject_lecture_professors: subject_lecture_professors[]; } diff --git a/src/prisma/migrations/20230724133216_add_fk_review_review_subject_lecture/migration.sql b/src/prisma/migrations/20230724133216_add_fk_review_review_subject_lecture/migration.sql new file mode 100644 index 00000000..b5c807c7 --- /dev/null +++ b/src/prisma/migrations/20230724133216_add_fk_review_review_subject_lecture/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_lecture_id_fkey` FOREIGN KEY (`lecture_id`) REFERENCES `subject_lecture`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 3b4d8183..016bb7ba 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -231,6 +231,7 @@ model review_review { id Int @id @default(autoincrement()) course_id Int lecture_id Int + lecture subject_lecture @relation(fields: [lecture_id], references: [id], onDelete: Restrict) content String @db.MediumText grade Int @db.SmallInt load Int @db.SmallInt @@ -512,6 +513,7 @@ model subject_lecture { timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] subject_lecture_professors subject_lecture_professors[] + review review_review[] @@index([deleted], map: "subject_lecture_deleted_bedc6156_uniq") @@index([type_en], map: "subject_lecture_type_en_45ee2d3a_uniq") From 02519d596c6a25be051b5a5614988fdb6bfc207a Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:36:30 +0900 Subject: [PATCH 060/250] Add: implement examtime serializer --- .../serializer/classtime.serializer.ts | 10 +--------- .../serializer/examtime.serializer.ts | 18 ++++++++++++++++++ src/common/utils/time.utils.ts | 8 ++++++++ 3 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 src/common/interfaces/serializer/examtime.serializer.ts create mode 100644 src/common/utils/time.utils.ts diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts index 83601e31..b650f622 100644 --- a/src/common/interfaces/serializer/classtime.serializer.ts +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -1,3 +1,4 @@ +import { getTimeNumeric } from "src/common/utils/time.utils"; import { subject_classtime } from "src/prisma/generated/prisma-class/subject_classtime"; export const toJsonClassTime = (classtime: subject_classtime) => { @@ -58,13 +59,4 @@ const getClassroomStrs = (classtime: subject_classtime) => { "classroom_short_en": classroomShortEn, } } -} - -const getTimeNumeric = (time: Date) => { - const beginNumeric = time.getHours() * 60 + time.getMinutes(); - if (beginNumeric % 30) { - return beginNumeric + (30 - beginNumeric % 30); - } else { - return beginNumeric; - } } \ No newline at end of file diff --git a/src/common/interfaces/serializer/examtime.serializer.ts b/src/common/interfaces/serializer/examtime.serializer.ts new file mode 100644 index 00000000..88b4d3e8 --- /dev/null +++ b/src/common/interfaces/serializer/examtime.serializer.ts @@ -0,0 +1,18 @@ +import { getTimeNumeric } from "src/common/utils/time.utils"; +import { subject_examtime } from "src/prisma/generated/prisma-class/subject_examtime"; + +export const toJsonExamTime = (examtime: subject_examtime) => { + const DAY_STR = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]; + const DAY_STR_EN = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + return { + "day": examtime.day, + "str": `${DAY_STR[examtime.day]} ${timeFormatter(examtime.begin)} ~ ${timeFormatter(examtime.end)}`, + "str_en": `${DAY_STR_EN[examtime.day]} ${timeFormatter(examtime.begin)} ~ ${timeFormatter(examtime.end)}`, + "begin": getTimeNumeric(examtime.begin), + "end": getTimeNumeric(examtime.begin), + } +} + +const timeFormatter = (time: Date) => { + return `${time.getHours()}:${time.getMinutes()}`; +} \ No newline at end of file diff --git a/src/common/utils/time.utils.ts b/src/common/utils/time.utils.ts new file mode 100644 index 00000000..6ba916a9 --- /dev/null +++ b/src/common/utils/time.utils.ts @@ -0,0 +1,8 @@ +export const getTimeNumeric = (time: Date) => { + const beginNumeric = time.getHours() * 60 + time.getMinutes(); + if (beginNumeric % 30) { + return beginNumeric + (30 - beginNumeric % 30); + } else { + return beginNumeric; + } +} \ No newline at end of file From d394423bb5926baaa14938f3e47b557517f2b555 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:45:50 +0900 Subject: [PATCH 061/250] Add: define dto for reponse --- .../dto/lecture/classtime.response.dto.ts | 11 +++++ .../dto/lecture/examtime.response.dto.ts | 7 ++++ .../dto/lecture/lecture.response.dto.ts | 40 +++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/common/interfaces/dto/lecture/classtime.response.dto.ts create mode 100644 src/common/interfaces/dto/lecture/examtime.response.dto.ts create mode 100644 src/common/interfaces/dto/lecture/lecture.response.dto.ts diff --git a/src/common/interfaces/dto/lecture/classtime.response.dto.ts b/src/common/interfaces/dto/lecture/classtime.response.dto.ts new file mode 100644 index 00000000..020ea679 --- /dev/null +++ b/src/common/interfaces/dto/lecture/classtime.response.dto.ts @@ -0,0 +1,11 @@ +export interface ClasstimeDto { + "building_code": string; + "room_name": string; + "classroom": string; + "classroom_en": string; + "classroom_short": string; + "classroom_short_en": string; + "day": number; + "begin": number; + "end": number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/lecture/examtime.response.dto.ts b/src/common/interfaces/dto/lecture/examtime.response.dto.ts new file mode 100644 index 00000000..125bc379 --- /dev/null +++ b/src/common/interfaces/dto/lecture/examtime.response.dto.ts @@ -0,0 +1,7 @@ +export interface ExamtimeDto { + "day": number; + "str": string; + "str_en": string; + "begin": number; + "end": number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/lecture/lecture.response.dto.ts b/src/common/interfaces/dto/lecture/lecture.response.dto.ts new file mode 100644 index 00000000..6645195d --- /dev/null +++ b/src/common/interfaces/dto/lecture/lecture.response.dto.ts @@ -0,0 +1,40 @@ +import { ClasstimeDto } from "./classtime.response.dto"; +import { ExamtimeDto } from "./examtime.response.dto"; + +export interface NestedLectureResponseDto { + "id": number; + "title": string; + "title_en": string; + "course": number; + "old_code": string; + "class_no": string; + "year": number; + "semester": number; + "code": string; + "department": number; + "department_code": string; + "department_name": string; + "department_name_en": string; + "type": string; + "type_en": string; + "limit": number; + "num_people": number; + "is_english": boolean; + "num_classes": number; + "num_labs": number; + "credit": number; + "credit_au": number; + "common_title": string; + "common_title_en": string; + "class_title": string; + "class_title_en": string; + "review_total_weight": number; +} + +export interface LectureResponseDto extends NestedLectureResponseDto { + "grade"?: number; + "load"?: number; + "speech"?: number; + "classtimes"?: ClasstimeDto; + "examtimes"?: ExamtimeDto; +} \ No newline at end of file From e3c4a0b236ecc61ebda0c94b311abde019552976 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:46:08 +0900 Subject: [PATCH 062/250] Add: implement getLecturesByCourseId --- .../serializer/classtime.serializer.ts | 2 +- .../serializer/examtime.serializer.ts | 2 +- .../serializer/lecture.serializer.ts | 26 +++++++++++++++++-- src/modules/courses/courses.controller.ts | 4 +-- src/modules/courses/courses.service.ts | 2 +- src/prisma/repositories/course.repository.ts | 11 ++++++-- 6 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts index b650f622..50574daa 100644 --- a/src/common/interfaces/serializer/classtime.serializer.ts +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -1,7 +1,7 @@ import { getTimeNumeric } from "src/common/utils/time.utils"; import { subject_classtime } from "src/prisma/generated/prisma-class/subject_classtime"; -export const toJsonClassTime = (classtime: subject_classtime) => { +export const toJsonClasstime = (classtime: subject_classtime) => { const classroomInfo = getClassroomStrs(classtime); return Object.assign(classroomInfo, { "day": classtime.day, diff --git a/src/common/interfaces/serializer/examtime.serializer.ts b/src/common/interfaces/serializer/examtime.serializer.ts index 88b4d3e8..a1fc2b05 100644 --- a/src/common/interfaces/serializer/examtime.serializer.ts +++ b/src/common/interfaces/serializer/examtime.serializer.ts @@ -1,7 +1,7 @@ import { getTimeNumeric } from "src/common/utils/time.utils"; import { subject_examtime } from "src/prisma/generated/prisma-class/subject_examtime"; -export const toJsonExamTime = (examtime: subject_examtime) => { +export const toJsonExamtime = (examtime: subject_examtime) => { const DAY_STR = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]; const DAY_STR_EN = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; return { diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index 30ffa7f1..f1e2b6ed 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -1,6 +1,10 @@ +import { applyOrder } from "src/common/utils/search.utils"; import { subject_lecture } from "src/prisma/generated/prisma-class/subject_lecture" +import { toJsonClasstime } from "./classtime.serializer"; +import { toJsonExamtime } from "./examtime.serializer"; +import { LectureResponseDto } from "../dto/lecture/lecture.response.dto"; -export const toJsonLecture = (lecture: subject_lecture, nested = false) => { +export const toJsonLecture = (lecture: subject_lecture, nested = false): LectureResponseDto => { let result = { "id": lecture.id, "title": lecture.title, @@ -11,7 +15,7 @@ export const toJsonLecture = (lecture: subject_lecture, nested = false) => { "year": lecture.year, "semester": lecture.semester, "code": lecture.code, - "department": lecture.department.id, + "department": lecture.department_id, "department_code": lecture.department.code, "department_name": lecture.department.name, "department_name_en": lecture.department.name_en, @@ -29,5 +33,23 @@ export const toJsonLecture = (lecture: subject_lecture, nested = false) => { "class_title": lecture.class_title, "class_title_en": lecture.class_title_en, "review_total_weight": lecture.review_total_weight, + }; + + const professors = lecture.subject_lecture_professors.map((x) => x.professor); + const ordered_professors = applyOrder(professors, ["professor_name"]); + result = Object.assign(result, { "professors": ordered_professors }); + + if (nested) { + return result; } + + result = Object.assign(result, { + "grade": lecture.grade, + "load": lecture.load, + "speech": lecture.speech, + "classtimes": lecture.subject_classtime.map((classtime) => toJsonClasstime(classtime)), + "examtimes": lecture.subject_examtime.map((examtime) => toJsonExamtime(examtime)), + }); + + return result; } \ No newline at end of file diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 206e6771..90a75893 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -20,7 +20,7 @@ export class CourseController { } @Get(':id/lectures') - async getLecturesByCourseId(@Param('id') id: number, @GetUser() user: session_userprofile) { - return await this.CoursesService.getLecturesByCourseId(id, user); + async getLecturesByCourseId(@Query() query: {order: string[]}, @Param('id') id: number) { + return await this.CoursesService.getLecturesByCourseId(query, id); } } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 9e202e86..0ac725e6 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -65,7 +65,7 @@ export class CoursesService { } } - public async getLecturesByCourseId(query: {order: string}, id: number, user: session_userprofile) { + public async getLecturesByCourseId(query: {order: string[]}, id: number) { const lectures = await this.CourseRepository.getLecturesByCourseId(query, id); if (!lectures) { throw new NotFoundException(); diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index ebe8fc3a..9d9ad913 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -54,10 +54,17 @@ export class CourseRepository{ }) as subject_course; } - public async getLecturesByCourseId (query: {order: string}, id: number): Promise { + public async getLecturesByCourseId (query: {order: string[]}, id: number): Promise { const course = await this.prisma.subject_course.findUnique({ include: { - lecture: true, + lecture: { + include: { + department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + } + }, }, where: { id: id, From 70fdac1ed9809e7e6d4d10aa50574d00aa62924d Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 24 Jul 2023 22:56:30 +0900 Subject: [PATCH 063/250] Add: implement complete of 'session/logout' and 'session' --- .../interfaces/dto/user/user.response.dto.ts | 9 +-- src/modules/auth/auth.controller.ts | 57 ++++++++++++++----- src/modules/user/user.service.ts | 2 +- .../repositories/department.repository.ts | 3 +- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index cebedda3..82c4ccab 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -1,6 +1,7 @@ import { review_review, session_userprofile_favorite_departments, session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; +import { DepartmentResponseDto } from "../department/department.response.dto"; export interface ProfileDto { id: number; @@ -8,10 +9,10 @@ export interface ProfileDto { student_id: string; firstName: string; lastName: string; - department: subject_department - majors: subject_department[] - departments: subject_department[] - favorite_departments: session_userprofile_favorite_departments[] + department: DepartmentResponseDto + majors: DepartmentResponseDto[] + departments: DepartmentResponseDto[] + favorite_departments: DepartmentResponseDto[] review_writeable_lectures: session_userprofile_taken_lectures[] my_timetable_lectures: session_userprofile_taken_lectures[] reviews: review_review[] diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 4f5ae6a9..84c21904 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,22 +1,22 @@ -import { Controller, Get, Query, Req, Res, Session } from '@nestjs/common'; -import { AuthService } from './auth.service'; -import { Response } from 'express'; -import { Client } from './utils/sparcs-sso'; -import settings from '../../settings'; -import { UserService } from '../user/user.service'; -import { Public } from '../../common/decorators/skip-auth.decorator'; -import { GetUser } from '../../common/decorators/get-user.decorator'; -import { session_userprofile } from '@prisma/client'; -import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; +import { Controller, Get, Query, Req, Res, Session } from "@nestjs/common"; +import { AuthService } from "./auth.service"; +import { Request, Response } from "express"; +import { Client } from "./utils/sparcs-sso"; +import settings from "../../settings"; +import { UserService } from "../user/user.service"; +import { Public } from "../../common/decorators/skip-auth.decorator"; +import { GetUser } from "../../common/decorators/get-user.decorator"; +import { session_userprofile } from "@prisma/client"; +import { SSOUser } from "../../common/interfaces/dto/auth/sso.dto"; import { ProfileDto } from "../../common/interfaces/dto/user/user.response.dto"; -@Controller('session') +@Controller("session") export class AuthController { private readonly ssoClient; constructor( private readonly authService: AuthService, - private readonly userService: UserService, + private readonly userService: UserService ) { const ssoConfig = settings().getSsoConfig(); const ssoClient = new Client( @@ -79,7 +79,7 @@ export class AuthController { response.redirect(next_url); } - @Get('info') + @Get("info") async getUserProfile(@GetUser() user: session_userprofile): Promise { /* @Todo @@ -88,4 +88,35 @@ export class AuthController { const profile = await this.userService.getProfile(user); return profile; } + + @Public() + @Get("/") + async home(@Req() req, + @Res() res) { + return res.redirect("/session/login"); + } + + @Public() + @Get("logout") + async logout( + @Req() req: Request, + @Res() res: Response, + @Query('next') next, + @GetUser() user: session_userprofile + ) { + if (user) { + const sid = user.sid; + const protocol = req.protocol; + const host = req.get('host'); + const originalUrl = req.originalUrl; + const absoluteUrl = `${protocol}://${host}${originalUrl}`; + const logoutUrl = this.ssoClient.get_logout_url(sid,absoluteUrl); + + res.clearCookie('accessToken'); + res.clearCookie('refreshToken'); + + return res.redirect(logoutUrl); + } + return res.redirect("/"); + } } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 59257b2d..d677a4d9 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -48,7 +48,7 @@ export class UserService { firstName: user.first_name, lastName: user.last_name, department: toJsonDepartment(department) ?? null, - majors: toJsonDepartment(majors), + majors: majors.map((major) => toJsonDepartment(major)), departments: departments.map((department) => toJsonDepartment(department)), favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), review_writeable_lectures: reviewWritableLectures, diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index 7943735a..c11ac9a0 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -1,8 +1,7 @@ import { PrismaService } from "../prisma.service"; -import { session_userprofile } from "@prisma/client"; +import { session_userprofile, subject_department } from "@prisma/client"; import session from "express-session"; import { Injectable } from "@nestjs/common"; -import { subject_department } from "../generated/prisma-class/subject_department"; @Injectable() export class DepartmentRepository{ From a39eff5321bae7880009941366e98fa268ad6094 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 24 Jul 2023 23:18:33 +0900 Subject: [PATCH 064/250] Fix: apply ordering --- src/prisma/repositories/course.repository.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 9d9ad913..fa98435f 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -70,7 +70,9 @@ export class CourseRepository{ id: id, } }) as subject_course; - return course.lecture.filter((lecture) => !lecture.deleted) + const filterdLecture = course.lecture.filter((lecture) => !lecture.deleted); + const order = query.order ? query.order : ['year', 'semester', 'class_no']; + return applyOrder(filterdLecture, order); } public async filterByRequest (query: any): Promise { From 8c17bf06fb2892240f234b72a8d3ade31aed461b Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 25 Jul 2023 19:29:24 +0900 Subject: [PATCH 065/250] Add: define lecture query dto --- .../interfaces/dto/lecture/lecture.query.dto.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/common/interfaces/dto/lecture/lecture.query.dto.ts diff --git a/src/common/interfaces/dto/lecture/lecture.query.dto.ts b/src/common/interfaces/dto/lecture/lecture.query.dto.ts new file mode 100644 index 00000000..697f03ab --- /dev/null +++ b/src/common/interfaces/dto/lecture/lecture.query.dto.ts @@ -0,0 +1,15 @@ +export interface LectureQueryDTO { + "year"?: number[]; + "semester"?: number[]; + "day"?: number[]; + "begin"?: number[]; + "end"?: number[]; + "department"?: string[]; + "type"?: string[]; + "level"?: "1"|"2"|"3"|"4"[] + "group"?: string[] + "keyword"?: string; + "order"?: string[]; + "offset"?: number; + "limit"?: number; +} \ No newline at end of file From bf7d8e0cce8f3a970c16eff22262cae7500356b4 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 25 Jul 2023 19:58:46 +0900 Subject: [PATCH 066/250] Add: Implement lecture filter by query --- .../dto/lecture/lecture.query.dto.ts | 2 +- src/common/utils/search.utils.ts | 2 +- src/prisma/repositories/course.repository.ts | 14 +-- src/prisma/repositories/lecture.repository.ts | 102 +++++++++++++++++- 4 files changed, 106 insertions(+), 14 deletions(-) diff --git a/src/common/interfaces/dto/lecture/lecture.query.dto.ts b/src/common/interfaces/dto/lecture/lecture.query.dto.ts index 697f03ab..f74daf91 100644 --- a/src/common/interfaces/dto/lecture/lecture.query.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.query.dto.ts @@ -6,7 +6,7 @@ export interface LectureQueryDTO { "end"?: number[]; "department"?: string[]; "type"?: string[]; - "level"?: "1"|"2"|"3"|"4"[] + "level"?: string[]; "group"?: string[] "keyword"?: string; "order"?: string[]; diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index cd4d3822..c26a1e44 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -16,7 +16,7 @@ export function applyOrder(query: T[], order_opt: string[]) { } } -export async function applyOffset(query: T[], offset: number) { +export function applyOffset(query: T[], offset: number) { if (!(offset)) { return query; } else { diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index fa98435f..fff03c23 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -112,11 +112,11 @@ export class CourseRepository{ }) as subject_course[]; // Apply Ordering and Offset - const ordered_result = await applyOrder(query_result, order ?? DEFAULT_ORDER); + const ordered_result = applyOrder(query_result, order ?? DEFAULT_ORDER); return await applyOffset(ordered_result, offset ?? 0); } - private departmentFilter(department_names: [string]): object { + public departmentFilter(department_names: string[]): object { if (!(department_names)) { return null } @@ -141,7 +141,7 @@ export class CourseRepository{ } } - private typeFilter(types: [string]): object { + public typeFilter(types: string[]): object { if (!(types)) { return null } @@ -164,7 +164,7 @@ export class CourseRepository{ } } - private levelFilter(levels?: [string]): object { + public levelFilter(levels?: string[]): object { if (!(levels)) { return null; } @@ -189,7 +189,7 @@ export class CourseRepository{ } } - private termFilter(term?: [string]): object { + public termFilter(term?: string[]): object { if (!(term)) { return null; } @@ -206,7 +206,7 @@ export class CourseRepository{ } } - private keywordFilter(keyword?: string): object { + public keywordFilter(keyword?: string): object { if (!(keyword)) { return null; } @@ -267,7 +267,7 @@ export class CourseRepository{ }; } - private groupFilter(group?: [string]): object { + public groupFilter(group?: string[]): object { if (!(group)) { return null; } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 175fbd04..13d8fcf6 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,13 +1,50 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import { groupBy } from "../../common/utils/method.utils"; +import { LectureQueryDTO } from "src/common/interfaces/dto/lecture/lecture.query.dto"; +import { CourseRepository } from "./course.repository"; +import { applyOrder, applyOffset } from "src/common/utils/search.utils"; +import { subject_lecture } from "../generated/prisma-class/subject_lecture"; +import { session_userprofile } from "../generated/prisma-class/session_userprofile"; @Injectable() export class LectureRepository { - constructor(private readonly prisma: PrismaService) { - } + constructor( + private readonly prisma: PrismaService, + private readonly courseRepository: CourseRepository + ) {} + + async filterByRequest(query: LectureQueryDTO): Promise { + const DEFAULT_LIMIT = 300; + const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; + + const semesterFilter = this.semesterFilter(query?.year, query?.semester); + const timeFilter = this.timeFilter(query?.day, query?.begin, query?.end); + const departmentFilter = this.courseRepository.departmentFilter(query?.department); + const typeFilter = this.courseRepository.typeFilter(query?.type); + const levelFilter = this.courseRepository.levelFilter(query?.level); + const groupFilter = this.courseRepository.groupFilter(query?.group); + const keywordFilter = this.courseRepository.keywordFilter(query?.keyword); + + const filters = [semesterFilter, timeFilter, + departmentFilter, typeFilter, levelFilter, groupFilter, keywordFilter]; + const queryResult = await this.prisma.subject_lecture.findMany({ + include: { + department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + where: { + AND: filters.filter((filter) => filter !== null) + }, + take: query.limit ?? DEFAULT_LIMIT, + }) as subject_lecture[]; + const orderedQuery = applyOrder(queryResult, query.order ?? DEFAULT_ORDER); + return applyOffset(orderedQuery, query.offset ?? 0); + } async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { let currDate; @@ -70,15 +107,70 @@ export class LectureRepository { } async getTakenLectures(user: session_userprofile): Promise { - const lectures: subject_lecture[] = (await this.prisma.session_userprofile_taken_lectures.findMany({ + const lectures = (await this.prisma.session_userprofile_taken_lectures.findMany({ where: { userprofile_id: user.id }, include: { lecture: true } - })).map((takenLecture) => takenLecture.lecture); + })).map((takenLecture) => takenLecture.lecture as subject_lecture); return lectures; } + + public semesterFilter(years: number[], semesters: number[]): object { + if ((!years) && (!semesters)) { + return null; + } else if (!years) { + return { + semester: { + In: semesters + } + } + } else if (!semesters) { + return { + years: { + In: semesters + } + } + } else { + return { + AND: [ + { + year: { + In: years + } + }, + { + semester: { + In: semesters + } + } + ] + } + } + } + + public timeFilter(day: number[], begin: number[], end: number[]): object { + const datetimeBegin = begin.map((time) => this.datetimeConverter(time)); + const datetimeEnd = end.map((time) => this.datetimeConverter(time)); + + const dayFilter = day ? { day: {In: day} } : null; + const beginFilter = begin ? { begin: {In: datetimeBegin} } : null; + const endFilter = end ? { end: {In: datetimeEnd} } : null; + return { + AND: [ + dayFilter, + beginFilter, + endFilter + ] + } + } + + public datetimeConverter (time: number) { + const hour = Math.floor(time / 2) + 8; + const minute = (time % 2) * 30; + return new Date(0, 0, 0, hour, minute, 0, 0); + } } \ No newline at end of file From 62660f6ea91abfcd615912cf15e0b5bd553c10a0 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Tue, 25 Jul 2023 23:21:12 +0900 Subject: [PATCH 067/250] Fix: remove invalid level filter --- src/prisma/repositories/course.repository.ts | 28 +------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index fff03c23..9025deff 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -92,11 +92,10 @@ export class CourseRepository{ } = query; const departmentFilter = this.departmentFilter(department); const typeFilter = this.typeFilter(type); - const levelFilter = this.levelFilter(level); const groupFilter = this.groupFilter(group); const keywordFilter = this.keywordFilter(keyword); const term_filter = this.termFilter(term); - let filterList = [departmentFilter, typeFilter, levelFilter, groupFilter, keywordFilter, term_filter] + let filterList = [departmentFilter, typeFilter, groupFilter, keywordFilter, term_filter] filterList = filterList.filter((filter) => filter !== null) const query_result = await this.prisma.subject_course.findMany({ include: { @@ -164,31 +163,6 @@ export class CourseRepository{ } } - public levelFilter(levels?: string[]): object { - if (!(levels)) { - return null; - } - - const acronym_dic = ["1", "2", "3", "4"]; - if (levels.includes("ALL")) { - return null; - } else if (levels.includes("ETC")) { - const numbers = acronym_dic.filter((level) => !(level in levels)); - return { - old_code: { - contains: numbers - } - }; - } else { - const numbers = acronym_dic.filter((level) => level in levels); - return { - old_code: { - contains: numbers - } - }; - } - } - public termFilter(term?: string[]): object { if (!(term)) { return null; From 04956355676e861d974b488ae825e124562a25bd Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Mon, 24 Jul 2023 20:02:46 +0900 Subject: [PATCH 068/250] refactor:just for rebase --- src/common/interfaces/reviews/reviews.dto.ts | 40 ++++++++++++ src/common/interfaces/reviews/validators.ts | 27 ++++++++ src/modules/reviews/reviews.controller.ts | 67 +++++++++++++++++++- src/modules/reviews/reviews.module.ts | 4 +- src/modules/reviews/reviews.service.ts | 10 ++- src/prisma/prisma.module.ts | 22 ++++--- src/prisma/repositories/review.repository.ts | 32 ++++++++-- 7 files changed, 182 insertions(+), 20 deletions(-) create mode 100644 src/common/interfaces/reviews/reviews.dto.ts create mode 100644 src/common/interfaces/reviews/validators.ts diff --git a/src/common/interfaces/reviews/reviews.dto.ts b/src/common/interfaces/reviews/reviews.dto.ts new file mode 100644 index 00000000..3de9a9b0 --- /dev/null +++ b/src/common/interfaces/reviews/reviews.dto.ts @@ -0,0 +1,40 @@ +import { Transform, Type } from 'class-transformer'; +import { + IsArray, + IsNumber, + IsOptional, + IsString, + Validate, +} from 'class-validator'; +import { OrderDefaultValidator } from './validators'; + +export class getReviewDto { + @IsOptional() + @IsNumber() + @Type(() => Number) + lecture_year?: number; + + @IsOptional() + @IsNumber() + @Type(() => Number) + lecture_semester?: number; + + @IsOptional() + @IsString() + response_type?: string; + + @IsOptional() + @IsArray() + @Validate(OrderDefaultValidator) + order?: string[]; + + @IsOptional() + @IsNumber() + @Type(() => Number) + offset?: number; + + @IsOptional() + @IsNumber() + @Type(() => Number) + limit?: number; +} diff --git a/src/common/interfaces/reviews/validators.ts b/src/common/interfaces/reviews/validators.ts new file mode 100644 index 00000000..5b38113e --- /dev/null +++ b/src/common/interfaces/reviews/validators.ts @@ -0,0 +1,27 @@ +import { + ValidationArguments, + ValidatorConstraint, + ValidatorConstraintInterface, +} from 'class-validator'; + +const PROHIBITED_FIELD_PATTERN: RegExp[] = [ + /\?/, + /user/, + /profile/, + /owner/, + /writer/, + /__.*__/, +]; + +@ValidatorConstraint({ name: 'ORDER_DEFAULT_VALIDATOR', async: false }) +export class OrderDefaultValidator implements ValidatorConstraintInterface { + validate(order: string[]): boolean { + return order.every((o) => { + return PROHIBITED_FIELD_PATTERN.every((p) => !p.test(o)); + }); + } + + defaultMessage(args: ValidationArguments): string { + return 'Body ' + args + ' did not pass validator'; + } +} diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 74a318b1..e7691ecc 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,4 +1,65 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, Query } from '@nestjs/common'; +import { review_review } from '@prisma/client'; +import { getReviewDto } from 'src/common/interfaces/reviews/reviews.dto'; +import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; +import { ReviewsService } from './reviews.service'; + +@Controller('api/reviews') +export class ReviewsController { + constructor(private readonly reviewsService:ReviewsService, + private readonly reviewsRepository:ReviewsRepository) {} -@Controller('reviews') -export class ReviewsController {} + @Get() + async getReviews( + @Query() reviewsParam: getReviewDto + ): Promise { + const MAX_LIMIT = 50; + const DEFAULT_ORDER = ['-written_datetime', '-id']; + + let reviews = this.reviewsService.getReviews(reviewsParam.lecture_year, reviewsParam.lecture_semester); + + if (responseType === 'count') { + return reviews.getCount(); + } + + reviews = reviews.orderBy(DEFAULT_ORDER[0], 'DESC').addOrderBy(DEFAULT_ORDER[1], 'DESC').take(MAX_LIMIT); + + const result = await reviews.getMany(); + + return result.map((review) => review.to_json(user)); // to_json 함수는 따로 구현 필요 + } + + @Post() + async createReview(@Body() body: any): Promise { + const { content, lecture, grade, load, speech } = body; + + const user = request.user; + if (!user || !user.isAuthenticated) { + throw new UnauthorizedException(); + } + + const user_profile = user.userProfile; + const lectureEntity = await this.lectureRepository.findOne(lecture); + + if (!lectureEntity) { + throw new NotFoundException('Lecture not found'); + } + + const course = lectureEntity.course; + + const review = new Review(); + review.course = course; + review.lecture = lectureEntity; + review.content = content; + review.grade = grade; + review.load = load; + review.speech = speech; + review.writer = user_profile; + + await this.reviewRepository.save(review); + + return review.to_json(user); // to_json 함수는 따로 구현 필요 + } +} + +} diff --git a/src/modules/reviews/reviews.module.ts b/src/modules/reviews/reviews.module.ts index 9d2b2968..e531b294 100644 --- a/src/modules/reviews/reviews.module.ts +++ b/src/modules/reviews/reviews.module.ts @@ -1,9 +1,11 @@ +import { PrismaModule } from './../../prisma/prisma.module'; import { Module } from '@nestjs/common'; import { ReviewsController } from './reviews.controller'; import { ReviewsService } from './reviews.service'; @Module({ + imports: [PrismaModule], controllers: [ReviewsController], - providers: [ReviewsService] + providers: [ReviewsService], }) export class ReviewsModule {} diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 99200567..00be7f45 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,4 +1,12 @@ import { Injectable } from '@nestjs/common'; +import { review_review } from '@prisma/client'; +import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; @Injectable() -export class ReviewsService {} +export class ReviewsService { + + constructor(private readonly reviewsRepository:ReviewsRepository) {} + async getReviews(lecture_year: number, lecture_semester:number): Promise{ + return await this.reviewsRepository.getReviews(lecture_year, lecture_semester); + } +} diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 131643af..125084ad 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -1,17 +1,21 @@ -import { Module } from "@nestjs/common"; -import { PrismaService } from "./prisma.service"; -import { UserRepository } from "./repositories/user.repository"; -import { LectureRepository } from "./repositories/lecture.repository"; -import { ReviewRepository } from "./repositories/review.repository"; +import { Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; +import { UserRepository } from './repositories/user.repository'; +import { LectureRepository } from './repositories/lecture.repository'; +import { ReviewsRepository } from './repositories/review.repository'; @Module({ - providers: [PrismaService, + providers: [ + PrismaService, UserRepository, LectureRepository, - ReviewRepository], - exports: [PrismaService, + ReviewsRepository, + ], + exports: [ + PrismaService, UserRepository, LectureRepository, - ReviewRepository] + ReviewsRepository, + ], }) export class PrismaModule {} diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index a2d1e90a..5ad6ae09 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,8 +1,28 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "../prisma.service"; - +import { Injectable } from '@nestjs/common'; +import { review_review } from '@prisma/client'; +import { PrismaService } from '../prisma.service'; +interface lectureFilter{ + [key:any]:number; +} @Injectable() -export class ReviewRepository{ - constructor(private readonly prisma: PrismaService){} +export class ReviewsRepository { + constructor(private readonly prisma: PrismaService) {} -} \ No newline at end of file + async getReviews(lecture_year: number, lecture_semester: number):Promise { + let lecture_filter:object = {}; + if(lecture_year){ + lecture_filter={...lecture_filter,year: lecture_year}; + } + if(lecture_semester){ + lecture_filter = { ...lecture_filter, semester: lecture_semester }; + } + //todo lecture와 review 연결. + const reviews = await this.prisma.review_review.findMany({ + where: { + lecture: lecture_filter, + }, + distict: true, + }); + return reviews; + } +} From 6ac28f5621427b9de109ce517fac2bc27b53722d Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:28:03 +0900 Subject: [PATCH 069/250] Migrate: add no space columns for lectures --- .../generated/prisma-class/subject_lecture.ts | 8 ++- .../migration.sql | 10 ++++ .../noSpaceColumns.ts | 55 +++++++++++++++++++ src/prisma/schema.prisma | 4 +- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql create mode 100644 src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts index 64c5ecdc..44ca6fe7 100644 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -31,7 +31,7 @@ export class subject_lecture { department_id: number; @ApiProperty({ type: () => subject_department }) - department: subject_department; + subject_department: subject_department; @ApiProperty({ type: String }) class_no: string; @@ -54,6 +54,12 @@ export class subject_lecture { @ApiProperty({ type: Number }) credit: number; + @ApiProperty({ type: String }) + title_en_no_space: string; + + @ApiProperty({ type: String }) + title_no_space: string; + @ApiProperty({ type: Number }) num_classes: number; diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql new file mode 100644 index 00000000..570c4079 --- /dev/null +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `title_en_no_space` to the `subject_lecture` table without a default value. This is not possible if the table is not empty. + - Added the required column `title_no_space` to the `subject_lecture` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `subject_lecture` ADD COLUMN `title_en_no_space` VARCHAR(200) NOT NULL, + ADD COLUMN `title_no_space` VARCHAR(100) NOT NULL; diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts new file mode 100644 index 00000000..0dacad11 --- /dev/null +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts @@ -0,0 +1,55 @@ +import { PrismaService } from "../../prisma.service"; +import settings from "../../../settings"; + +async function main() { + const ormConfig = settings().ormconfig(); + console.log(ormConfig); + const prisma = new PrismaService(); + try { + await prisma.$connect(); + await prisma.$transaction(async (tx)=> { + const subject_lecture = await tx.subject_lecture.findMany(); + + const BATCH_SIZE = 1000; + console.log(subject_lecture.length); + for (let i = 0; i < Math.ceil(subject_lecture.length / BATCH_SIZE); i++) { + const sliced_subject_lecture = subject_lecture.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE + ); + const bulkPromises = sliced_subject_lecture.map(async (course) => { + const result = tx.subject_lecture.update({ + where: { + id: course.id + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + } + }); + return result; + }); + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + },{ + maxWait: 5000, + timeout: 300000 + }) + } catch (e) { + console.error(e); + } finally { + await prisma.$disconnect(); + } +} + +main() + .then(() => { + console.log("done"); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + process.exit(0); + }); diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 63c2b517..af37b97f 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -475,7 +475,7 @@ model subject_lecture { year Int semester Int @db.SmallInt department_id Int - department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) + subject_department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) class_no String @db.VarChar(4) title String @db.VarChar(100) title_en String @db.VarChar(200) @@ -483,6 +483,8 @@ model subject_lecture { type_en String @db.VarChar(36) audience Int credit Int + title_en_no_space String @db.VarChar(200) + title_no_space String @db.VarChar(100) num_classes Int num_labs Int credit_au Int From c4f36caaf7ce988366ffec344758a478017f77a2 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:28:17 +0900 Subject: [PATCH 070/250] tmp --- src/app.module.ts | 3 +- .../serializer/lecture.serializer.ts | 6 ++-- src/modules/lectures/lectures.controller.ts | 15 ++++++++-- src/modules/lectures/lectures.module.ts | 2 ++ src/modules/lectures/lectures.service.ts | 13 +++++++- src/prisma/repositories/course.repository.ts | 30 +++++++++++++++---- src/prisma/repositories/lecture.repository.ts | 28 ++++++++++++----- 7 files changed, 76 insertions(+), 21 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index f24f4c68..b4fe3510 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,9 +8,10 @@ import { AuthModule } from './modules/auth/auth.module'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; import { JwtService } from '@nestjs/jwt'; import { CoursesModule } from './modules/courses/courses.module'; +import { LecturesModule } from './modules/lectures/lectures.module'; @Module({ - imports: [PrismaModule, AuthModule, CoursesModule], + imports: [PrismaModule, AuthModule, CoursesModule, LecturesModule], controllers: [AppController], providers: [ { diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index f1e2b6ed..13f79dac 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -16,9 +16,9 @@ export const toJsonLecture = (lecture: subject_lecture, nested = false): Lecture "semester": lecture.semester, "code": lecture.code, "department": lecture.department_id, - "department_code": lecture.department.code, - "department_name": lecture.department.name, - "department_name_en": lecture.department.name_en, + "department_code": lecture.subject_department.code, + "department_name": lecture.subject_department.name, + "department_name_en": lecture.subject_department.name_en, "type": lecture.type, "type_en": lecture.type_en, "limit": lecture.limit, diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index 6fbedbc7..ebfd4ce6 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -1,4 +1,13 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, Query } from '@nestjs/common'; +import { LecturesService } from './lectures.service'; +import { LectureQueryDTO } from 'src/common/interfaces/dto/lecture/lecture.query.dto'; -@Controller('lectures') -export class LecturesController {} +@Controller('api/lectures') +export class LecturesController { + constructor(private readonly LectureService: LecturesService) {} + + @Get() + async getLectures(@Query() query: LectureQueryDTO) { + return await this.LectureService.getLectureByFilter(query); + } +} diff --git a/src/modules/lectures/lectures.module.ts b/src/modules/lectures/lectures.module.ts index 8708d6c8..595e3e4c 100644 --- a/src/modules/lectures/lectures.module.ts +++ b/src/modules/lectures/lectures.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; import { LecturesController } from './lectures.controller'; import { LecturesService } from './lectures.service'; +import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ + imports: [PrismaModule], controllers: [LecturesController], providers: [LecturesService] }) diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index 9fbb3077..9333f4d0 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -1,4 +1,15 @@ +import { LectureQueryDTO } from 'src/common/interfaces/dto/lecture/lecture.query.dto'; +import { LectureRepository } from './../../prisma/repositories/lecture.repository'; import { Injectable } from '@nestjs/common'; +import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; +import { LectureResponseDto } from 'src/common/interfaces/dto/lecture/lecture.response.dto'; @Injectable() -export class LecturesService {} +export class LecturesService { + constructor(private LectureRepository: LectureRepository) {} + + public async getLectureByFilter(query: LectureQueryDTO): Promise { + const queryResult = await this.LectureRepository.filterByRequest(query); + return queryResult.map((lecture) => toJsonLecture(lecture, false)) + } +} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 9025deff..8ae60569 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -59,7 +59,7 @@ export class CourseRepository{ include: { lecture: { include: { - department: true, + subject_department: true, subject_lecture_professors: { include: { professor: true } }, subject_classtime: true, subject_examtime: true, @@ -180,7 +180,7 @@ export class CourseRepository{ } } - public keywordFilter(keyword?: string): object { + public keywordFilter(keyword?: string, isCourse = true): object { if (!(keyword)) { return null; } @@ -207,7 +207,7 @@ export class CourseRepository{ name_en: keyword_trimed } }; - const professors_professor_name_filter = { + const professors_professor_name_filter = isCourse ? { subject_course_professors: { some: { professor: { @@ -217,8 +217,18 @@ export class CourseRepository{ } } } + } : { + subject_lecture_professors: { + some: { + professor: { + professor_name: { + contains: keyword_trimed + } + } + } + } }; - const professors_professor_name_en_filter = { + const professors_professor_name_en_filter = isCourse ? { subject_course_professors: { some: { professor: { @@ -228,7 +238,17 @@ export class CourseRepository{ } } } - } + } : { + subject_lecture_professors: { + some: { + professor: { + professor_name_en: { + contains: keyword_trimed + } + } + } + } + }; return { OR: [ title_filter, diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 13d8fcf6..c3555782 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,12 +1,11 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; -import { Prisma } from "@prisma/client"; +import { Prisma, session_userprofile } from "@prisma/client"; import { groupBy } from "../../common/utils/method.utils"; import { LectureQueryDTO } from "src/common/interfaces/dto/lecture/lecture.query.dto"; import { CourseRepository } from "./course.repository"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; import { subject_lecture } from "../generated/prisma-class/subject_lecture"; -import { session_userprofile } from "../generated/prisma-class/session_userprofile"; @Injectable() export class LectureRepository { @@ -18,20 +17,33 @@ export class LectureRepository { async filterByRequest(query: LectureQueryDTO): Promise { const DEFAULT_LIMIT = 300; const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; + const researchTypes = ["Individual Study", "Thesis Study(Undergraduate)", + "Thesis Research(MA/phD)"]; const semesterFilter = this.semesterFilter(query?.year, query?.semester); const timeFilter = this.timeFilter(query?.day, query?.begin, query?.end); const departmentFilter = this.courseRepository.departmentFilter(query?.department); const typeFilter = this.courseRepository.typeFilter(query?.type); - const levelFilter = this.courseRepository.levelFilter(query?.level); const groupFilter = this.courseRepository.groupFilter(query?.group); - const keywordFilter = this.courseRepository.keywordFilter(query?.keyword); + const keywordFilter = this.courseRepository.keywordFilter(query?.keyword, false); + const defaultFilter = { + AND: [ + { + deleted: false, + }, + { + type_en: { + notIn: researchTypes + } + } + ] + } const filters = [semesterFilter, timeFilter, - departmentFilter, typeFilter, levelFilter, groupFilter, keywordFilter]; + departmentFilter, typeFilter, groupFilter, keywordFilter, defaultFilter]; const queryResult = await this.prisma.subject_lecture.findMany({ include: { - department: true, + subject_department: true, subject_lecture_professors: { include: { professor: true } }, subject_classtime: true, subject_examtime: true, @@ -153,8 +165,8 @@ export class LectureRepository { } public timeFilter(day: number[], begin: number[], end: number[]): object { - const datetimeBegin = begin.map((time) => this.datetimeConverter(time)); - const datetimeEnd = end.map((time) => this.datetimeConverter(time)); + const datetimeBegin = begin?.map((time) => this.datetimeConverter(time)); + const datetimeEnd = end?.map((time) => this.datetimeConverter(time)); const dayFilter = day ? { day: {In: day} } : null; const beginFilter = begin ? { begin: {In: datetimeBegin} } : null; From 33a9f4000f1c294ebb360febf82505adedda86b9 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:28:03 +0900 Subject: [PATCH 071/250] Migrate: add no space columns for lectures --- .../generated/prisma-class/subject_lecture.ts | 8 ++- .../migration.sql | 10 ++++ .../noSpaceColumns.ts | 55 +++++++++++++++++++ src/prisma/schema.prisma | 4 +- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql create mode 100644 src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts index 305ed167..67d8ad84 100644 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -32,7 +32,7 @@ export class subject_lecture { department_id: number; @ApiProperty({ type: () => subject_department }) - department: subject_department; + subject_department: subject_department; @ApiProperty({ type: String }) class_no: string; @@ -55,6 +55,12 @@ export class subject_lecture { @ApiProperty({ type: Number }) credit: number; + @ApiProperty({ type: String }) + title_en_no_space: string; + + @ApiProperty({ type: String }) + title_no_space: string; + @ApiProperty({ type: Number }) num_classes: number; diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql new file mode 100644 index 00000000..570c4079 --- /dev/null +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `title_en_no_space` to the `subject_lecture` table without a default value. This is not possible if the table is not empty. + - Added the required column `title_no_space` to the `subject_lecture` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `subject_lecture` ADD COLUMN `title_en_no_space` VARCHAR(200) NOT NULL, + ADD COLUMN `title_no_space` VARCHAR(100) NOT NULL; diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts new file mode 100644 index 00000000..0dacad11 --- /dev/null +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts @@ -0,0 +1,55 @@ +import { PrismaService } from "../../prisma.service"; +import settings from "../../../settings"; + +async function main() { + const ormConfig = settings().ormconfig(); + console.log(ormConfig); + const prisma = new PrismaService(); + try { + await prisma.$connect(); + await prisma.$transaction(async (tx)=> { + const subject_lecture = await tx.subject_lecture.findMany(); + + const BATCH_SIZE = 1000; + console.log(subject_lecture.length); + for (let i = 0; i < Math.ceil(subject_lecture.length / BATCH_SIZE); i++) { + const sliced_subject_lecture = subject_lecture.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE + ); + const bulkPromises = sliced_subject_lecture.map(async (course) => { + const result = tx.subject_lecture.update({ + where: { + id: course.id + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + } + }); + return result; + }); + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + },{ + maxWait: 5000, + timeout: 300000 + }) + } catch (e) { + console.error(e); + } finally { + await prisma.$disconnect(); + } +} + +main() + .then(() => { + console.log("done"); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + process.exit(0); + }); diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 016bb7ba..64d67305 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -476,7 +476,7 @@ model subject_lecture { year Int semester Int @db.SmallInt department_id Int - department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) + subject_department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) class_no String @db.VarChar(4) title String @db.VarChar(100) title_en String @db.VarChar(200) @@ -484,6 +484,8 @@ model subject_lecture { type_en String @db.VarChar(36) audience Int credit Int + title_en_no_space String @db.VarChar(200) + title_no_space String @db.VarChar(100) num_classes Int num_labs Int credit_au Int From c9126f09d79cc099107a37c6a075f36ef2ebbd7c Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:48:26 +0900 Subject: [PATCH 072/250] Add: implement lecture search feature --- src/common/utils/search.utils.ts | 6 ++-- src/prisma/repositories/course.repository.ts | 28 +++++++++++++++++-- src/prisma/repositories/lecture.repository.ts | 3 +- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index c26a1e44..ac8a5260 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -2,7 +2,7 @@ export function applyOrder(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { - return query.sort((a: T, b: T) => { + return query?.sort((a: T, b: T) => { for(let i=0; i < order_opt.length; i++) { const order = order_opt[i]; if (a[order] > b[order]) { @@ -12,7 +12,7 @@ export function applyOrder(query: T[], order_opt: string[]) { } } return 0; - }) + }) ?? [] } } @@ -20,6 +20,6 @@ export function applyOffset(query: T[], offset: number) { if (!(offset)) { return query; } else { - return query.slice(offset); + return query?.slice(offset) ?? []; } } \ No newline at end of file diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 8ae60569..bb750a51 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -97,7 +97,7 @@ export class CourseRepository{ const term_filter = this.termFilter(term); let filterList = [departmentFilter, typeFilter, groupFilter, keywordFilter, term_filter] filterList = filterList.filter((filter) => filter !== null) - const query_result = await this.prisma.subject_course.findMany({ + const queryResult = await this.prisma.subject_course.findMany({ include: { subject_department: true, subject_course_professors: { include: { professor: true } }, @@ -109,10 +109,11 @@ export class CourseRepository{ }, take: limit ?? DEFAULT_LIMIT, }) as subject_course[]; + const levelFilteredResult = this.levelFilter(queryResult, level) as subject_course[]; // Apply Ordering and Offset - const ordered_result = applyOrder(query_result, order ?? DEFAULT_ORDER); - return await applyOffset(ordered_result, offset ?? 0); + const orderedResult = applyOrder(levelFilteredResult, order ?? DEFAULT_ORDER); + return await applyOffset(orderedResult, offset ?? 0); } public departmentFilter(department_names: string[]): object { @@ -284,4 +285,25 @@ export class CourseRepository{ } }; } + + public levelFilter (queryResult: (subject_course|subject_lecture)[], levels: string[]) { + if (!levels) { + return queryResult + } + + const levelFilters = levels.map((level) => level[0]); + if (levels.includes("ALL")) { + return queryResult + } else if (levels.includes("ETC")) { + return queryResult.filter((item) => { + const level = item.old_code.replace(/[^0-9]/g, '')[0]; + return !levelFilters.includes(level); + }) + } else { + return queryResult.filter((item) => { + const level = item.old_code.replace(/[^0-9]/g, '')[0]; + return levelFilters.includes(level); + }) + } + } } \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index c3555782..a15b136e 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -53,8 +53,9 @@ export class LectureRepository { }, take: query.limit ?? DEFAULT_LIMIT, }) as subject_lecture[]; + const levelFilteredResult = this.courseRepository.levelFilter(queryResult, query?.level) as subject_lecture[]; - const orderedQuery = applyOrder(queryResult, query.order ?? DEFAULT_ORDER); + const orderedQuery = applyOrder(levelFilteredResult, query.order ?? DEFAULT_ORDER); return applyOffset(orderedQuery, query.offset ?? 0); } From 86e28b5d33d9a9b70dad85ba9bb2252fff59edc8 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:01:23 +0900 Subject: [PATCH 073/250] Add: implement get lecture by id --- src/modules/courses/courses.controller.ts | 1 - src/modules/lectures/lectures.controller.ts | 7 ++++++- src/modules/lectures/lectures.service.ts | 10 +++++++++- src/prisma/repositories/lecture.repository.ts | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 90a75893..341a5a98 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -10,7 +10,6 @@ export class CourseController { @Get() async getCourses(@Query() query: any, @GetUser() user: session_userprofile) { const courses = await this.CoursesService.getCourseByFilter(query, user); - return courses } diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index ebfd4ce6..c9365b01 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Query } from '@nestjs/common'; +import { Controller, Get, Param, Query } from '@nestjs/common'; import { LecturesService } from './lectures.service'; import { LectureQueryDTO } from 'src/common/interfaces/dto/lecture/lecture.query.dto'; @@ -10,4 +10,9 @@ export class LecturesController { async getLectures(@Query() query: LectureQueryDTO) { return await this.LectureService.getLectureByFilter(query); } + + @Get(':id') + async getLectureById(@Param('id') id: number) { + return await this.LectureService.getLectureById(id); + } } diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index 9333f4d0..b2e86725 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -1,6 +1,6 @@ import { LectureQueryDTO } from 'src/common/interfaces/dto/lecture/lecture.query.dto'; import { LectureRepository } from './../../prisma/repositories/lecture.repository'; -import { Injectable } from '@nestjs/common'; +import { Injectable, NotFoundException } from '@nestjs/common'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; import { LectureResponseDto } from 'src/common/interfaces/dto/lecture/lecture.response.dto'; @@ -12,4 +12,12 @@ export class LecturesService { const queryResult = await this.LectureRepository.filterByRequest(query); return queryResult.map((lecture) => toJsonLecture(lecture, false)) } + + public async getLectureById(id: number): Promise { + const queryResult = await this.LectureRepository.getLectureById(id); + if (!queryResult) { + throw new NotFoundException(); + } + return toJsonLecture(queryResult, false); + } } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index a15b136e..1d2e235d 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -14,6 +14,20 @@ export class LectureRepository { private readonly courseRepository: CourseRepository ) {} + async getLectureById(id: number): Promise { + return await this.prisma.subject_lecture.findUnique({ + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + where: { + id: id + } + }) as subject_lecture; + } + async filterByRequest(query: LectureQueryDTO): Promise { const DEFAULT_LIMIT = 300; const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; From ef6697c2b18dce1d016aa9f2200e2421f48c21ec Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 26 Jul 2023 20:27:31 +0900 Subject: [PATCH 074/250] Add: test complete with session and session/logout --- .../serializer/department.serializer.ts | 6 ++- src/modules/auth/auth.controller.ts | 9 ++-- src/modules/auth/guard/mock-auth-guard.ts | 42 ++++++++++++------- 3 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts index dbb44909..c43a1f94 100644 --- a/src/common/interfaces/serializer/department.serializer.ts +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -2,10 +2,12 @@ import { subject_department } from "../../../prisma/generated/prisma-class/subje import { DepartmentResponseDto } from "../dto/department/department.response.dto"; export const toJsonDepartment = (department: subject_department, nested=false): DepartmentResponseDto => { - return { + + + return department ? { "id": department.id, "name": department.name, "name_en": department.name_en, "code": department.code, - } + } : null; } \ No newline at end of file diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 84c21904..13c5fd9d 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -104,6 +104,7 @@ export class AuthController { @Query('next') next, @GetUser() user: session_userprofile ) { + const webURL = process.env.WEB_URL; if (user) { const sid = user.sid; const protocol = req.protocol; @@ -112,11 +113,13 @@ export class AuthController { const absoluteUrl = `${protocol}://${host}${originalUrl}`; const logoutUrl = this.ssoClient.get_logout_url(sid,absoluteUrl); - res.clearCookie('accessToken'); - res.clearCookie('refreshToken'); + res.clearCookie('accessToken',{ path: '/' ,maxAge: 0, httpOnly: true }); + res.clearCookie('refreshToken',{ path: '/' ,maxAge: 0, httpOnly: true }); + console.log(logoutUrl); return res.redirect(logoutUrl); } - return res.redirect("/"); + + return res.redirect(webURL + "/"); } } diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index aec54960..b73444cc 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -17,14 +17,6 @@ export class MockAuthGuard implements CanActivate{ } async canActivate(context: ExecutionContext) { - const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ - context.getHandler(), - context.getClass() - ]); - - if (isPublic) { - return true; - } const request = context.switchToHttp().getRequest(); const response = context.switchToHttp().getResponse(); @@ -32,8 +24,9 @@ export class MockAuthGuard implements CanActivate{ if (sid) { const user = await this.authService.findBySid(sid); request["user"] = user; - return true; + return this.determineAuth(context, true); }else{ + console.log("YYYY"); const accessToken = this.extractTokenFromCookie(request, "accessToken"); try { if (!accessToken) throw new Error("jwt expired"); @@ -45,12 +38,12 @@ export class MockAuthGuard implements CanActivate{ ); const user = this.authService.findBySid(payload.sid); request["user"] = user; - return true; + return this.determineAuth(context, true); } catch (e) { if (e.message === "jwt expired") { - const refreshToken = this.extractTokenFromCookie(request, "refreshToken"); - if (!refreshToken) throw new UnauthorizedException(); try { + const refreshToken = this.extractTokenFromCookie(request, "refreshToken"); + if (!refreshToken) throw new UnauthorizedException(); const payload = await this.jwtService.verify( refreshToken, { @@ -62,18 +55,39 @@ export class MockAuthGuard implements CanActivate{ const { accessToken, ...accessTokenOptions } = this.authService.getCookieWithAccessToken(payload.sid); request.res.cookie("accessToken", accessToken, accessTokenOptions); request["user"] = user; - return true; + return this.determineAuth(context, true); } - return false; + return this.determineAuth(context, false); } catch (e) { + console.log("XXXX"); + const result = this.determineAuth(context, false); + if (result) { + return result; + } throw new UnauthorizedException(); } } + const result = this.determineAuth(context, false); + if (result) { + return result; + } throw new UnauthorizedException(); } } } + private determineAuth(context: ExecutionContext, result: boolean): boolean { + const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ + context.getHandler(), + context.getClass() + ]); + + if (isPublic) { + return true; + } + return result; + } + private extractTokenFromCookie(request: Request, type: "accessToken" | "refreshToken"): string | undefined { const cookie = request.cookies[type]; if (cookie) { From f35a32600d8210e42f70a32d96121bb0401f174f Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Wed, 26 Jul 2023 22:15:12 +0900 Subject: [PATCH 075/250] Migrate:add fk between reivew_review and subject_course --- .../migration.sql | 2 ++ src/prisma/schema.prisma | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql diff --git a/src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql b/src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql new file mode 100644 index 00000000..2731eff2 --- /dev/null +++ b/src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_course_id_fkey` FOREIGN KEY (`course_id`) REFERENCES `subject_course`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index b05508cb..ba573a78 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -230,6 +230,7 @@ model review_majorbestreview { model review_review { id Int @id @default(autoincrement()) course_id Int + course subject_course @relation(fields: [course_id], references: [id], onDelete: Restrict) lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onDelete: Restrict) content String @db.MediumText @@ -390,6 +391,7 @@ model subject_course { subject_courseuser subject_courseuser[] subject_course_professors subject_course_professors[] lecture subject_lecture[] + review review_review[] @@index([department_id], map: "subject_course_department_id_fkey") } From 3df345b1ed708906d56c5e6b6b8a2c91fbddae5b Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Wed, 26 Jul 2023 22:15:12 +0900 Subject: [PATCH 076/250] Migrate:add fk between reivew_review and subject_course --- .../migration.sql | 2 ++ src/prisma/schema.prisma | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql diff --git a/src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql b/src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql new file mode 100644 index 00000000..2731eff2 --- /dev/null +++ b/src/prisma/migrations/20230726130510_add_fk_review_review_subject_course/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_course_id_fkey` FOREIGN KEY (`course_id`) REFERENCES `subject_course`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 64d67305..910ad14e 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -230,6 +230,7 @@ model review_majorbestreview { model review_review { id Int @id @default(autoincrement()) course_id Int + course subject_course @relation(fields: [course_id], references: [id], onDelete: Restrict) lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onDelete: Restrict) content String @db.MediumText @@ -390,6 +391,7 @@ model subject_course { subject_courseuser subject_courseuser[] subject_course_professors subject_course_professors[] lecture subject_lecture[] + review review_review[] @@index([department_id], map: "subject_course_department_id_fkey") } From 5f5bc3296c5c61a5b30fea93cf9c02bbbb3e4d67 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:28:03 +0900 Subject: [PATCH 077/250] Migrate: add no space columns for lectures --- .../generated/prisma-class/subject_lecture.ts | 8 ++- .../migration.sql | 10 ++++ .../noSpaceColumns.ts | 55 +++++++++++++++++++ src/prisma/schema.prisma | 4 +- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql create mode 100644 src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts index 305ed167..67d8ad84 100644 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ b/src/prisma/generated/prisma-class/subject_lecture.ts @@ -32,7 +32,7 @@ export class subject_lecture { department_id: number; @ApiProperty({ type: () => subject_department }) - department: subject_department; + subject_department: subject_department; @ApiProperty({ type: String }) class_no: string; @@ -55,6 +55,12 @@ export class subject_lecture { @ApiProperty({ type: Number }) credit: number; + @ApiProperty({ type: String }) + title_en_no_space: string; + + @ApiProperty({ type: String }) + title_no_space: string; + @ApiProperty({ type: Number }) num_classes: number; diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql new file mode 100644 index 00000000..570c4079 --- /dev/null +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `title_en_no_space` to the `subject_lecture` table without a default value. This is not possible if the table is not empty. + - Added the required column `title_no_space` to the `subject_lecture` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE `subject_lecture` ADD COLUMN `title_en_no_space` VARCHAR(200) NOT NULL, + ADD COLUMN `title_no_space` VARCHAR(100) NOT NULL; diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts new file mode 100644 index 00000000..0dacad11 --- /dev/null +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts @@ -0,0 +1,55 @@ +import { PrismaService } from "../../prisma.service"; +import settings from "../../../settings"; + +async function main() { + const ormConfig = settings().ormconfig(); + console.log(ormConfig); + const prisma = new PrismaService(); + try { + await prisma.$connect(); + await prisma.$transaction(async (tx)=> { + const subject_lecture = await tx.subject_lecture.findMany(); + + const BATCH_SIZE = 1000; + console.log(subject_lecture.length); + for (let i = 0; i < Math.ceil(subject_lecture.length / BATCH_SIZE); i++) { + const sliced_subject_lecture = subject_lecture.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE + ); + const bulkPromises = sliced_subject_lecture.map(async (course) => { + const result = tx.subject_lecture.update({ + where: { + id: course.id + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + } + }); + return result; + }); + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + },{ + maxWait: 5000, + timeout: 300000 + }) + } catch (e) { + console.error(e); + } finally { + await prisma.$disconnect(); + } +} + +main() + .then(() => { + console.log("done"); + }) + .catch((e) => { + console.error(e); + }) + .finally(() => { + process.exit(0); + }); diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index ba573a78..ad9e8f16 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -478,7 +478,7 @@ model subject_lecture { year Int semester Int @db.SmallInt department_id Int - department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) + subject_department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) class_no String @db.VarChar(4) title String @db.VarChar(100) title_en String @db.VarChar(200) @@ -486,6 +486,8 @@ model subject_lecture { type_en String @db.VarChar(36) audience Int credit Int + title_en_no_space String @db.VarChar(200) + title_no_space String @db.VarChar(100) num_classes Int num_labs Int credit_au Int From 108a9f6bb03b7087db4eae6a77fba7b95df53152 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Fri, 28 Jul 2023 07:32:58 +0900 Subject: [PATCH 078/250] Migrate:add fk between review_reviewvote and review_review,session_userprofile --- .../migration.sql | 5 +++++ src/prisma/schema.prisma | 4 ++++ 2 files changed, 9 insertions(+) create mode 100644 src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql diff --git a/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql b/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql new file mode 100644 index 00000000..0fbee3f5 --- /dev/null +++ b/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql @@ -0,0 +1,5 @@ +-- AddForeignKey +ALTER TABLE `review_reviewvote` ADD CONSTRAINT `review_reviewvote_review_id_fkey` FOREIGN KEY (`review_id`) REFERENCES `review_review`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `review_reviewvote` ADD CONSTRAINT `review_reviewvote_userprofile_id_fkey` FOREIGN KEY (`userprofile_id`) REFERENCES `session_userprofile`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 910ad14e..5b01d59e 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -246,6 +246,7 @@ model review_review { main_famoushumanityreviewdailyfeed_reviews main_famoushumanityreviewdailyfeed_reviews[] main_famousmajorreviewdailyfeed_reviews main_famousmajorreviewdailyfeed_reviews[] writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) + review_reviewvote review_reviewvote[] @@unique([writer_id, lecture_id], map: "review_comment_writer_id_af700a5d_uniq") @@index([written_datetime], map: "review_comment_e5e30a4a") @@ -254,7 +255,9 @@ model review_review { model review_reviewvote { id Int @id @default(autoincrement()) review_id Int + review review_review @relation(fields: [review_id], references: [id], onDelete: Cascade) userprofile_id Int? + userprofile session_userprofile? @relation(fields: [userprofile_id], references: [id], onDelete:SetNull) created_datetime DateTime? @db.DateTime(6) @@unique([review_id, userprofile_id], map: "review_commentvote_comment_id_e4594aea_uniq") @@ -286,6 +289,7 @@ model session_userprofile { support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? + reviewvote review_reviewvote[] @@index([department_id], map: "session_userprofile_department_id_fkey") } From 9093c9c959d7941cfc1068368e2280037d8471ce Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Sat, 29 Jul 2023 00:18:48 +0900 Subject: [PATCH 079/250] Add:implement /api/reviews/ @Get() handler --- .../dto/reviews/review.response.dto.ts | 13 +++ .../{ => dto}/reviews/reviews.dto.ts | 1 + .../{ => dto}/reviews/validators.ts | 0 .../serializer/review.serializer.ts | 35 ++++++ src/modules/reviews/reviews.controller.ts | 77 ++++--------- src/modules/reviews/reviews.service.ts | 46 +++++++- .../generated/prisma-class/review_review.ts | 8 ++ .../prisma-class/review_reviewvote.ts | 8 ++ .../prisma-class/session_userprofile.ts | 4 + .../generated/prisma-class/subject_course.ts | 4 + src/prisma/repositories/review.repository.ts | 102 +++++++++++++++--- 11 files changed, 225 insertions(+), 73 deletions(-) create mode 100644 src/common/interfaces/dto/reviews/review.response.dto.ts rename src/common/interfaces/{ => dto}/reviews/reviews.dto.ts (91%) rename src/common/interfaces/{ => dto}/reviews/validators.ts (100%) create mode 100644 src/common/interfaces/serializer/review.serializer.ts diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts new file mode 100644 index 00000000..bdeb29ab --- /dev/null +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -0,0 +1,13 @@ +import { CourseResponseDto } from "../course/course.response.dto"; + +export class ReviewResponseDto { + id: number; + course: CourseResponseDto; + lecture: LectureResponseDto; + content: string; + like: number; + is_deleted: number; + grade: number; + load: number; + speech: number; +} diff --git a/src/common/interfaces/reviews/reviews.dto.ts b/src/common/interfaces/dto/reviews/reviews.dto.ts similarity index 91% rename from src/common/interfaces/reviews/reviews.dto.ts rename to src/common/interfaces/dto/reviews/reviews.dto.ts index 3de9a9b0..c3255bae 100644 --- a/src/common/interfaces/reviews/reviews.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.dto.ts @@ -6,6 +6,7 @@ import { IsString, Validate, } from 'class-validator'; +import { CourseResponseDto } from '../course/course.response.dto'; import { OrderDefaultValidator } from './validators'; export class getReviewDto { diff --git a/src/common/interfaces/reviews/validators.ts b/src/common/interfaces/dto/reviews/validators.ts similarity index 100% rename from src/common/interfaces/reviews/validators.ts rename to src/common/interfaces/dto/reviews/validators.ts diff --git a/src/common/interfaces/serializer/review.serializer.ts b/src/common/interfaces/serializer/review.serializer.ts new file mode 100644 index 00000000..05b5c78d --- /dev/null +++ b/src/common/interfaces/serializer/review.serializer.ts @@ -0,0 +1,35 @@ +import { toJsonCourse } from './course.serializer'; +import { review_review } from 'src/prisma/generated/prisma-class/review_review'; +import { ReviewResponseDto } from './../dto/reviews/review.response.dto'; +import { getRepresentativeLecture } from 'src/common/utils/lecture.utils'; +import { subject_professor } from 'src/prisma/generated/prisma-class/subject_professor'; +export const toJsonReview= (review: review_review): ReviewResponseDto=>{ + const representativeLecture = getRepresentativeLecture(review.course.lecture); + const professorRaw = review.course.subject_course_professors.map( + (x) => x.professor as subject_professor, + ); + const courseResult = toJsonCourse( + review.course, + representativeLecture, + professorRaw, + true, + ); + Object.assign(courseResult, { + userspecific_is_read: false, + }); + + const result = { + id: review.id, + course: courseResult, + lecture: toJsonLecture(review.lecture, true), + content: review.is_deleted + ? '관리자에 의해 삭제된 코멘트입니다.' + : review.content, + like: review.like, + is_deleted: review.is_deleted, + grade: review.grade, + load: review.load, + speech: review.speech, + }; + return result; +} \ No newline at end of file diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index e7691ecc..afa701eb 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,65 +1,34 @@ -import { Controller, Get, Query } from '@nestjs/common'; -import { review_review } from '@prisma/client'; -import { getReviewDto } from 'src/common/interfaces/reviews/reviews.dto'; +import { Controller, Get, Header, Query } from '@nestjs/common'; +import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.dto'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; +import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { session_userprofile } from 'src/prisma/generated/prisma-class/session_userprofile'; @Controller('api/reviews') export class ReviewsController { - constructor(private readonly reviewsService:ReviewsService, - private readonly reviewsRepository:ReviewsRepository) {} + constructor( + private readonly reviewsService: ReviewsService, + private readonly reviewsRepository: ReviewsRepository, + ) {} @Get() + @Header('Content-type', 'application/json') async getReviews( - @Query() reviewsParam: getReviewDto - ): Promise { - const MAX_LIMIT = 50; - const DEFAULT_ORDER = ['-written_datetime', '-id']; - - let reviews = this.reviewsService.getReviews(reviewsParam.lecture_year, reviewsParam.lecture_semester); - - if (responseType === 'count') { - return reviews.getCount(); - } - - reviews = reviews.orderBy(DEFAULT_ORDER[0], 'DESC').addOrderBy(DEFAULT_ORDER[1], 'DESC').take(MAX_LIMIT); - - const result = await reviews.getMany(); - - return result.map((review) => review.to_json(user)); // to_json 함수는 따로 구현 필요 - } - - @Post() - async createReview(@Body() body: any): Promise { - const { content, lecture, grade, load, speech } = body; - - const user = request.user; - if (!user || !user.isAuthenticated) { - throw new UnauthorizedException(); + @Query() reviewsParam: getReviewDto, + @GetUser() user: session_userprofile, + ): Promise< + (ReviewResponseDto & { userspecific_is_liked: boolean })[] | number + > { + if (reviewsParam.response_type === 'count') { + const reviewsCount = await this.reviewsService.getReviewsCount( + reviewsParam.lecture_year, + reviewsParam.lecture_semester, + ); + return reviewsCount; } - - const user_profile = user.userProfile; - const lectureEntity = await this.lectureRepository.findOne(lecture); - - if (!lectureEntity) { - throw new NotFoundException('Lecture not found'); - } - - const course = lectureEntity.course; - - const review = new Review(); - review.course = course; - review.lecture = lectureEntity; - review.content = content; - review.grade = grade; - review.load = load; - review.speech = speech; - review.writer = user_profile; - - await this.reviewRepository.save(review); - - return review.to_json(user); // to_json 함수는 따로 구현 필요 + const result = await this.reviewsService.getReviews(reviewsParam, user); + return result; } } - -} diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 00be7f45..d8a63a22 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,12 +1,48 @@ +import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; +import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.dto'; import { Injectable } from '@nestjs/common'; -import { review_review } from '@prisma/client'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; +import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { session_userprofile } from 'src/prisma/generated/prisma-class/session_userprofile'; @Injectable() export class ReviewsService { + constructor(private readonly reviewsRepository: ReviewsRepository) {} + async getReviews( + reviewsParam: getReviewDto, + user: session_userprofile, + ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { + const MAX_LIMIT = 50; + const DEFAULT_ORDER = ['-written_datetime', '-id']; + const reviews = await this.reviewsRepository.getReviews( + reviewsParam.lecture_year, + reviewsParam.lecture_semester, + reviewsParam.order ?? DEFAULT_ORDER, + reviewsParam.offset ?? 0, + reviewsParam.limit ?? MAX_LIMIT, + ); + return await Promise.all(reviews.map(async (review) => { + const result = toJsonReview(review); + if (user) { + const isLiked: boolean =await this.reviewsRepository.isLiked(review.id, user.id); + return Object.assign(result, { + userspecific_is_liked: isLiked, + }); + } else { + return Object.assign(result, { + userspecific_is_liked: false, + }); + } + })); + } - constructor(private readonly reviewsRepository:ReviewsRepository) {} - async getReviews(lecture_year: number, lecture_semester:number): Promise{ - return await this.reviewsRepository.getReviews(lecture_year, lecture_semester); - } + async getReviewsCount( + lecture_year: number, + lecture_semester: number, + ): Promise { + return await this.reviewsRepository.getReviewsCount( + lecture_year, + lecture_semester, + ); + } } diff --git a/src/prisma/generated/prisma-class/review_review.ts b/src/prisma/generated/prisma-class/review_review.ts index 28d8cdc8..4ded1667 100644 --- a/src/prisma/generated/prisma-class/review_review.ts +++ b/src/prisma/generated/prisma-class/review_review.ts @@ -1,7 +1,9 @@ +import { subject_course } from './subject_course'; import { subject_lecture } from './subject_lecture'; import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; import { session_userprofile } from './session_userprofile'; +import { review_reviewvote } from './review_reviewvote'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class review_review { @@ -11,6 +13,9 @@ export class review_review { @ApiProperty({ type: Number }) course_id: number; + @ApiProperty({ type: () => subject_course }) + course: subject_course; + @ApiProperty({ type: Number }) lecture_id: number; @@ -61,4 +66,7 @@ export class review_review { @ApiPropertyOptional({ type: () => session_userprofile }) writer?: session_userprofile; + + @ApiProperty({ isArray: true, type: () => review_reviewvote }) + review_reviewvote: review_reviewvote[]; } diff --git a/src/prisma/generated/prisma-class/review_reviewvote.ts b/src/prisma/generated/prisma-class/review_reviewvote.ts index 3b57c7ae..47d5897d 100644 --- a/src/prisma/generated/prisma-class/review_reviewvote.ts +++ b/src/prisma/generated/prisma-class/review_reviewvote.ts @@ -1,3 +1,5 @@ +import { review_review } from './review_review'; +import { session_userprofile } from './session_userprofile'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class review_reviewvote { @@ -7,9 +9,15 @@ export class review_reviewvote { @ApiProperty({ type: Number }) review_id: number; + @ApiProperty({ type: () => review_review }) + review: review_review; + @ApiPropertyOptional({ type: Number }) userprofile_id?: number; + @ApiPropertyOptional({ type: () => session_userprofile }) + userprofile?: session_userprofile; + @ApiPropertyOptional({ type: Date }) created_datetime?: Date; } diff --git a/src/prisma/generated/prisma-class/session_userprofile.ts b/src/prisma/generated/prisma-class/session_userprofile.ts index d5405578..b290a25d 100644 --- a/src/prisma/generated/prisma-class/session_userprofile.ts +++ b/src/prisma/generated/prisma-class/session_userprofile.ts @@ -13,6 +13,7 @@ import { subject_courseuser } from './subject_courseuser'; import { support_rate } from './support_rate'; import { timetable_timetable } from './timetable_timetable'; import { timetable_wishlist } from './timetable_wishlist'; +import { review_reviewvote } from './review_reviewvote'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class session_userprofile { @@ -96,4 +97,7 @@ export class session_userprofile { @ApiPropertyOptional({ type: () => timetable_wishlist }) timetable_wishlist?: timetable_wishlist; + + @ApiProperty({ isArray: true, type: () => review_reviewvote }) + reviewvote: review_reviewvote[]; } diff --git a/src/prisma/generated/prisma-class/subject_course.ts b/src/prisma/generated/prisma-class/subject_course.ts index 36f2271c..0f35c5b2 100644 --- a/src/prisma/generated/prisma-class/subject_course.ts +++ b/src/prisma/generated/prisma-class/subject_course.ts @@ -6,6 +6,7 @@ import { subject_course_related_courses_prior } from './subject_course_related_c import { subject_courseuser } from './subject_courseuser'; import { subject_course_professors } from './subject_course_professors'; import { subject_lecture } from './subject_lecture'; +import { review_review } from './review_review'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; export class subject_course { @@ -104,4 +105,7 @@ export class subject_course { @ApiProperty({ isArray: true, type: () => subject_lecture }) lecture: subject_lecture[]; + + @ApiProperty({ isArray: true, type: () => review_review }) + review: review_review[]; } diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 08a161e2..b9e6fd2b 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,9 +1,9 @@ +import { applyOffset } from 'src/common/utils/search.utils'; import { Injectable } from '@nestjs/common'; +import { applyOrder } from 'src/common/utils/search.utils'; +import { review_review } from 'src/prisma/generated/prisma-class/review_review'; +import { session_userprofile } from 'src/prisma/generated/prisma-class/session_userprofile'; import { PrismaService } from '../prisma.service'; -import { review_review, session_userprofile, subject_department } from "@prisma/client"; -interface lectureFilter{ - [key:any]:number; -} @Injectable() export class ReviewsRepository { @@ -13,24 +13,98 @@ export class ReviewsRepository { const reviews = await this.prisma.review_review.findMany({ where: { writer_id: user.id }, }) + return reviews as review_review[]; + } + public async getReviews( + lecture_year: number, + lecture_semester: number, + order: string[], + offset: number, + limit: number + ): Promise { + let lectureFilter: object = {}; + const orderFilter: {[key:string]:string} = {}; + if (lecture_year) { + lectureFilter = { ...lectureFilter, year: lecture_year }; + } + if (lecture_semester) { + lectureFilter = { ...lectureFilter, semester: lecture_semester }; + } + order.forEach((orderList) => { + let order = 'asc'; + const orderBy = orderList.split('-'); + console.log(orderBy); + if (orderBy[0] == '') { + order = 'desc'; + } + orderFilter[orderBy[orderBy.length - 1]] = order; + }); + const reviews = await this.prisma.review_review.findMany({ + where: { + lecture: lectureFilter, + }, + skip: offset, + take: limit, + orderBy: orderFilter, + distinct: [ + 'id', + 'course_id', + 'lecture_id', + 'content', + 'grade', + 'load', + 'speech', + 'writer_id', + 'writer_label', + 'updated_datetime', + 'like', + 'is_deleted', + 'written_datetime', + ], + + }) as review_review[]; + return reviews; } - async getReviews(lecture_year: number, lecture_semester: number):Promise { - let lecture_filter:object = {}; - if(lecture_year){ - lecture_filter={...lecture_filter,year: lecture_year}; + async isLiked(reviewId: number, userId: number): Promise { + return !!(await this.prisma.review_reviewvote.findUnique({ + where: { + review_id_userprofile_id:{ + review_id: reviewId, + userprofile_id: userId + } + }, + })); + } + public async getReviewsCount(lecture_year:number, lecture_semester:number):Promise { + let lecture_filter: object = {}; + if (lecture_year) { + lecture_filter = { ...lecture_filter, year: lecture_year }; } - if(lecture_semester){ + if (lecture_semester) { lecture_filter = { ...lecture_filter, semester: lecture_semester }; } - //todo lecture와 review 연결. - const reviews = await this.prisma.review_review.findMany({ + const reviewsCount = await this.prisma.review_review.count({ where: { lecture: lecture_filter, }, - distict: true, - }); - return reviews; + distinct: [ + 'id', + 'course_id', + 'lecture_id', + 'content', + 'grade', + 'load', + 'speech', + 'writer_id', + 'writer_label', + 'updated_datetime', + 'like', + 'is_deleted', + 'written_datetime', + ], + }); + return reviewsCount; } } From 965e5c403d0c1ece7fe4736701980757707e805d Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Mon, 31 Jul 2023 19:22:15 +0900 Subject: [PATCH 080/250] Resolve #13, add API /api/courses (#14) * Add: implementing serializer * Add: reType the select result of user * Add: add FKs to userprofile and other tables * Add: complete implementing session/info * Add: remove redundant functions * Chore: Add DepartmentRepositiory to PrismaModule * Chore: remove redundant console.log * Chore: make departmentRepository injectable * Add: complete implementing * commit for merge * temporal commit * migrate: add_no_space_columns * add_fk_between_course_and_department * migrate: drop_subject_professor_course_list * migrate: add_fk_subject_course_professors * Add: implement filterByRequest * migrate: add_fk_subject_course_subject_lecture * Add: implement course filtering * Add: implement course search feature * temp * Fix: change db types into class * Add: resolve rebase conflict * Add: change snake to camel * refactor: implement types and serializer for courses * Fix: change hadling no representative lecture case to 0 --------- Co-authored-by: LarryKwon <65128957+LarryKwon@users.noreply.github.com> --- package.json | 2 +- src/app.module.ts | 3 +- src/bootstrap/bootstrap.ts | 5 +- src/common/interfaces/constants/lecture.ts | 8 ++ .../dto/course/course.response.dto.ts | 28 ++++ .../dto/department/department.response.dto.ts | 10 +- .../dto/professor/professor.response.dto.ts | 8 ++ .../interfaces/dto/user/user.response.dto.ts | 17 ++- .../serializer/course.serializer.ts | 43 ++++++ .../serializer/department.serializer.ts | 11 ++ .../serializer/professor.serializer.ts | 21 +++ .../interfaces/serializer/user.serializer.ts | 59 -------- src/common/utils/lecture.utils.ts | 7 + src/common/utils/method.utils.ts | 32 +++++ src/common/utils/search.utils.ts | 25 ++++ src/modules/auth/auth.controller.ts | 11 +- src/modules/auth/guard/mock-auth-guard.ts | 1 - .../auth/strategy/jwt-cookie.strategy.ts | 1 - src/modules/auth/utils/sparcs-sso.ts | 2 - src/modules/courses/courses.controller.ts | 18 ++- src/modules/courses/courses.module.ts | 8 +- src/modules/courses/courses.service.ts | 42 +++++- src/modules/user/user.service.ts | 45 +++++- src/prisma/prisma.module.ts | 12 +- src/prisma/repositories/course.repository.ts | 132 ++++++++++-------- .../repositories/department.repository.ts | 59 ++++++++ src/prisma/repositories/lecture.repository.ts | 80 ++++++++++- src/prisma/repositories/review.repository.ts | 8 ++ src/settings.ts | 14 ++ test/app.e2e-spec.ts | 2 +- test/session/session.spec.ts | 54 +++++++ 31 files changed, 612 insertions(+), 156 deletions(-) create mode 100644 src/common/interfaces/constants/lecture.ts create mode 100644 src/common/interfaces/dto/course/course.response.dto.ts create mode 100644 src/common/interfaces/dto/professor/professor.response.dto.ts create mode 100644 src/common/interfaces/serializer/course.serializer.ts create mode 100644 src/common/interfaces/serializer/department.serializer.ts create mode 100644 src/common/interfaces/serializer/professor.serializer.ts delete mode 100644 src/common/interfaces/serializer/user.serializer.ts create mode 100644 src/common/utils/lecture.utils.ts create mode 100644 src/common/utils/search.utils.ts create mode 100644 src/prisma/repositories/department.repository.ts create mode 100644 test/session/session.spec.ts diff --git a/package.json b/package.json index 2fe0e599..d3cb9ec4 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,7 @@ "json", "ts" ], - "rootDir": "./", + "rootDir": "test", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" diff --git a/src/app.module.ts b/src/app.module.ts index b248af72..f24f4c68 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,9 +7,10 @@ import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; import { AuthModule } from './modules/auth/auth.module'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; import { JwtService } from '@nestjs/jwt'; +import { CoursesModule } from './modules/courses/courses.module'; @Module({ - imports: [PrismaModule, AuthModule], + imports: [PrismaModule, AuthModule, CoursesModule], controllers: [AppController], providers: [ { diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index cb769cea..02756363 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -11,6 +11,7 @@ import cookieParser from "cookie-parser"; import session from "express-session"; import { MockAuthGuard } from "../modules/auth/guard/mock-auth-guard"; import { JwtCookieGuard } from "../modules/auth/guard/jwt-cookie.guard"; +import settings from "../settings"; let cachedServer: Server; @@ -22,7 +23,7 @@ async function bootstrap() { app.enableVersioning({ type: VersioningType.URI }); - app.enableCors(); + app.enableCors(settings().getCorsConfig()); app.useGlobalPipes( new ValidationPipe({ whitelist: true, @@ -65,7 +66,7 @@ async function bootstrap() { const prismaService = app.get(PrismaService); await prismaService.enableShutdownHooks(app) - return app.listen(3000); + return app.listen(8000); } bootstrap() diff --git a/src/common/interfaces/constants/lecture.ts b/src/common/interfaces/constants/lecture.ts new file mode 100644 index 00000000..d75c12c8 --- /dev/null +++ b/src/common/interfaces/constants/lecture.ts @@ -0,0 +1,8 @@ +import { Union } from "../../utils/method.utils"; + +export const ResearchLecture = { + IndividualStudy: "Individual Study", + UnderThesisStudy: "Thesis Study(Undergraduate)", + ThesisResearch: "Thesis Research(MA/phD)" +} +export type ResearchLecture = Union \ No newline at end of file diff --git a/src/common/interfaces/dto/course/course.response.dto.ts b/src/common/interfaces/dto/course/course.response.dto.ts new file mode 100644 index 00000000..9530be1b --- /dev/null +++ b/src/common/interfaces/dto/course/course.response.dto.ts @@ -0,0 +1,28 @@ +import { toJsonDepartment } from "../../serializer/department.serializer"; +import { DepartmentResponseDto } from "../department/department.response.dto"; +import { ProfessorResponseDto } from "../professor/professor.response.dto"; + +export interface CourseResponseDto { + id: number; + old_code: string; + department: DepartmentResponseDto; + type: string; + type_en: string; + title: string; + title_en: string; + summary: string; + review_total_weight: number; + credit: number; + credit_au: number; + num_classes: number; + num_labs: number; +} + +export interface CourseResponseDtoNested extends CourseResponseDto { + related_courses_prior?: CourseResponseDto[]; + related_courses_posterior?: CourseResponseDto[]; + professors?: ProfessorResponseDto[]; + grade?: number; + load?: number; + speech?: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/department/department.response.dto.ts b/src/common/interfaces/dto/department/department.response.dto.ts index 71a4dfde..2a8ec109 100644 --- a/src/common/interfaces/dto/department/department.response.dto.ts +++ b/src/common/interfaces/dto/department/department.response.dto.ts @@ -1,4 +1,6 @@ -import { Prisma, session_userprofile_majors} from "@prisma/client"; - - -export type DepartmentResponseDto = Partial; \ No newline at end of file +export interface DepartmentResponseDto{ + id: number; + name: string; + name_en: string; + code: string +} \ No newline at end of file diff --git a/src/common/interfaces/dto/professor/professor.response.dto.ts b/src/common/interfaces/dto/professor/professor.response.dto.ts new file mode 100644 index 00000000..7800d7bb --- /dev/null +++ b/src/common/interfaces/dto/professor/professor.response.dto.ts @@ -0,0 +1,8 @@ +import { subject_course } from "../../../../prisma/generated/prisma-class/subject_course"; + +export interface ProfessorResponseDto { + name: string; + name_en: string; + professor_id: number; + review_total_weight: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index ee593038..cebedda3 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -1,11 +1,18 @@ +import { + review_review, session_userprofile_favorite_departments, + session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; export interface ProfileDto { - id: string; + id: number; email: string; student_id: string; firstName: string; lastName: string; - /* - @todo: add more fields for relations - */ -} \ No newline at end of file + department: subject_department + majors: subject_department[] + departments: subject_department[] + favorite_departments: session_userprofile_favorite_departments[] + review_writeable_lectures: session_userprofile_taken_lectures[] + my_timetable_lectures: session_userprofile_taken_lectures[] + reviews: review_review[] +} diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts new file mode 100644 index 00000000..b67ac56a --- /dev/null +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -0,0 +1,43 @@ +import { subject_course } from "../../../prisma/generated/prisma-class/subject_course"; +import { subject_lecture } from "../../../prisma/generated/prisma-class/subject_lecture"; +import { toJsonDepartment } from "./department.serializer"; +import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; +import { toJsonProfessor } from "./professor.serializer"; +import { applyOrder } from "../../utils/search.utils"; +import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; +import { CourseResponseDtoNested } from "../dto/course/course.response.dto"; + +export const toJsonCourse = (course: subject_course, lecture: subject_lecture, professor: subject_professor[], nested = false): CourseResponseDtoNested => { + const professorJson: ProfessorResponseDto[] = toJsonProfessor(professor, true); + const professorSorted = applyOrder(professorJson, ["name"]); + + let result = { + "id": course.id, + "old_code": course.old_code, + "department": toJsonDepartment(course.subject_department, true), + "type": course.type, + "type_en": course.type_en, + "title": course.title, + "title_en": course.title_en, + "summary": course.summury, // Todo: fix summury typo in db. + "review_total_weight": course.review_total_weight, + "credit": lecture.credit ?? 0, + "credit_au": lecture.credit_au ?? 0, + "num_classes": lecture.num_classes ?? 0, + "num_labs": lecture.num_labs ?? 0 + }; + + if (nested) { + return result; + } + + result = Object.assign(result, { + "related_courses_prior": [], + "related_courses_posterior": [], + "professors": professorSorted, + "grade": course.grade, + "load": course.load, + "speech": course.speech + }); + return result; +}; \ No newline at end of file diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts new file mode 100644 index 00000000..dbb44909 --- /dev/null +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -0,0 +1,11 @@ +import { subject_department } from "../../../prisma/generated/prisma-class/subject_department"; +import { DepartmentResponseDto } from "../dto/department/department.response.dto"; + +export const toJsonDepartment = (department: subject_department, nested=false): DepartmentResponseDto => { + return { + "id": department.id, + "name": department.name, + "name_en": department.name_en, + "code": department.code, + } +} \ No newline at end of file diff --git a/src/common/interfaces/serializer/professor.serializer.ts b/src/common/interfaces/serializer/professor.serializer.ts new file mode 100644 index 00000000..af62653d --- /dev/null +++ b/src/common/interfaces/serializer/professor.serializer.ts @@ -0,0 +1,21 @@ +import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; +import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; + +export const toJsonProfessor = (professors: subject_professor[], nested=false): ProfessorResponseDto[] => { + const result = professors.map((professor) => { + return { + "name": professor.professor_name, + "name_en": professor.professor_name_en, + "professor_id": professor.professor_id, + "review_total_weight": professor.review_total_weight, + } + }); + + if (nested) { + return result; + } + + return result.map((professor) => { + return professor; //todo: add necessary infos + }); +} \ No newline at end of file diff --git a/src/common/interfaces/serializer/user.serializer.ts b/src/common/interfaces/serializer/user.serializer.ts deleted file mode 100644 index 63083ea7..00000000 --- a/src/common/interfaces/serializer/user.serializer.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Prisma, review_review, session_userprofile, subject_department } from "@prisma/client"; -import { PrismaService } from "../../../prisma/prisma.service"; -import { userSelectResultType } from "../../schemaTypes/types"; - -export async function loadUser(user:session_userprofile | userSelectResultType, userLoadOptions: Prisma.session_userprofileInclude, prismaService: PrismaService): Promise { - - const loadOptions = Object.entries(userLoadOptions).forEach(([key, value]) => { - if(user[key] && value) { - value = false; - }else if(user[key] && !value) { - value = false - } - else if(!user[key] && value) { - value = true - }else if(!user[key] && !value) { - value = false - } - }) - - const result: userSelectResultType = await prismaService.session_userprofile.findFirst({ - where: { sid: user.sid }, - include: userLoadOptions, - }) - return result; -} - -export async function toProfileDto(user: userSelectResultType, prisma: PrismaService) { - - - const majors: subject_department[] = await prisma.session_userprofile.findMany({ - include: { - session_userprofile_majors: { - include: { - subject_department: true - } - }, - favorite_departments: { - include:{ - department: true - } - } - } - }); - - const reviewList: review_review[] = await prisma.review_review.findMany({ - - }) - - - return { - id: user.id, - email: user.email, - student_id: user.student_id, - firstName: user.first_name, - lastName: user.last_name, - department: user.department, - majors: user.session_userprofile_majors. - }; -} \ No newline at end of file diff --git a/src/common/utils/lecture.utils.ts b/src/common/utils/lecture.utils.ts new file mode 100644 index 00000000..1e2b22d6 --- /dev/null +++ b/src/common/utils/lecture.utils.ts @@ -0,0 +1,7 @@ +import { subject_lecture } from "../../prisma/generated/prisma-class/subject_lecture"; +import { applyOrder } from "./search.utils"; + +export const getRepresentativeLecture = (lectures: subject_lecture[]): subject_lecture => { + const orderedLectures = applyOrder(lectures, ["year", "semester"]) + return orderedLectures[0]; +} \ No newline at end of file diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 7c7cbf84..5615d677 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,3 +15,35 @@ export function normalizeArray( return normalizeObj } +export function groupBy( + arr: T[], + selector: (item: T) => string | number | null = (item: any) => item.id, +) { + const map: Record = {} + + arr.forEach(data => { + const key = selector(data) + if (key !== null) { + if (map[key]) { + map[key]!.push(data) + } else { + map[key] = [data] + } + } + }) + + return map +} + +type ValueType = string | number | boolean +export type Union< + T extends { [key: string]: ValueType } | ReadonlyArray, + > = T extends ReadonlyArray + ? T[number] + : T extends { [key: string]: infer U } + ? U + : never + + + + diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts new file mode 100644 index 00000000..cd4d3822 --- /dev/null +++ b/src/common/utils/search.utils.ts @@ -0,0 +1,25 @@ +export function applyOrder(query: T[], order_opt: string[]) { + if (order_opt.length == 0) { + return query; + } else { + return query.sort((a: T, b: T) => { + for(let i=0; i < order_opt.length; i++) { + const order = order_opt[i]; + if (a[order] > b[order]) { + return 1; + } else if (a[order] < b[order]) { + return -1; + } + } + return 0; + }) + } +} + +export async function applyOffset(query: T[], offset: number) { + if (!(offset)) { + return query; + } else { + return query.slice(offset); + } +} \ No newline at end of file diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 0ecdd92a..4f5ae6a9 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -8,6 +8,7 @@ import { Public } from '../../common/decorators/skip-auth.decorator'; import { GetUser } from '../../common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; +import { ProfileDto } from "../../common/interfaces/dto/user/user.response.dto"; @Controller('session') export class AuthController { @@ -39,7 +40,6 @@ export class AuthController { } req.session['next'] = next ?? '/'; const { url, state } = this.ssoClient.get_login_params(); - console.log(url, state); req.session['sso_state'] = state; if (social_login === '0') { return res.redirect(url + '&social_enabled=0&show_disabled_button=0'); @@ -75,20 +75,17 @@ export class AuthController { call import_student_lectures(studentId) */ - /* - @Todo - save refreshToken in session_userprofile - */ const next_url = session['next'] ?? '/'; response.redirect(next_url); } @Get('info') - async getUserProfile(@GetUser() user: session_userprofile) { + async getUserProfile(@GetUser() user: session_userprofile): Promise { /* @Todo implement userSerializer, before that, we'd like to architect the dto types */ - return user; + const profile = await this.userService.getProfile(user); + return profile; } } diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index 4a823c2c..aec54960 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -43,7 +43,6 @@ export class MockAuthGuard implements CanActivate{ secret: settings().getJwtConfig().secret } ); - console.log("payload", payload); const user = this.authService.findBySid(payload.sid); request["user"] = user; return true; diff --git a/src/modules/auth/strategy/jwt-cookie.strategy.ts b/src/modules/auth/strategy/jwt-cookie.strategy.ts index 74460201..f477a1ac 100644 --- a/src/modules/auth/strategy/jwt-cookie.strategy.ts +++ b/src/modules/auth/strategy/jwt-cookie.strategy.ts @@ -32,7 +32,6 @@ export class JwtCookieStrategy extends PassportStrategy( } async validate(payload) { - console.log(payload); return this.authService.findBySid(payload.sid); } } diff --git a/src/modules/auth/utils/sparcs-sso.ts b/src/modules/auth/utils/sparcs-sso.ts index 9da89446..af91143a 100644 --- a/src/modules/auth/utils/sparcs-sso.ts +++ b/src/modules/auth/utils/sparcs-sso.ts @@ -44,8 +44,6 @@ export class Client { :param secret_key: your secret key :param is_beta: true iff you want to use SPARCS SSO beta server :param server_addr: SPARCS SSO server addr (only for testing)*/ - console.log(is_beta) - console.log(is_beta ? true : false); this.DOMAIN = is_beta ? this.BETA_DOMAIN : this.SERVER_DOMAIN; this.DOMAIN = server_addr || this.DOMAIN; diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 569fbdc4..274782a7 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,4 +1,16 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, Post, Param, Query, UseGuards } from '@nestjs/common'; +import { CoursesService } from './courses.service'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { session_userprofile } from '@prisma/client'; -@Controller('courses') -export class CoursesController {} +@Controller('api/courses') +export class CourseController { + constructor(private readonly CoursesService: CoursesService) {} + + @Get() + async getCourses(@Query() query: any, @GetUser() user: session_userprofile) { + const courses = await this.CoursesService.getCourseByFilter(query, user); + + return courses + } +} diff --git a/src/modules/courses/courses.module.ts b/src/modules/courses/courses.module.ts index 367e861b..40c50305 100644 --- a/src/modules/courses/courses.module.ts +++ b/src/modules/courses/courses.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; -import { CoursesController } from './courses.controller'; +import { CourseController } from './courses.controller'; import { CoursesService } from './courses.service'; +import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ - controllers: [CoursesController], - providers: [CoursesService] + imports: [PrismaModule], + controllers: [CourseController], + providers: [CoursesService], }) export class CoursesModule {} diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 6bd25f32..206d14ac 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,4 +1,44 @@ +import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable } from '@nestjs/common'; +import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; +import { applyOrder } from 'src/common/utils/search.utils'; +import { session_userprofile } from '@prisma/client'; +import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; +import { subject_lecture } from 'src/prisma/generated/prisma-class/subject_lecture'; +import { subject_department } from 'src/prisma/generated/prisma-class/subject_department'; +import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; +import { toJsonProfessor } from "../../common/interfaces/serializer/professor.serializer"; +import { toJsonCourse } from "../../common/interfaces/serializer/course.serializer"; +import { subject_professor } from "../../prisma/generated/prisma-class/subject_professor"; +import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; +import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/course.response.dto"; + @Injectable() -export class CoursesService {} +export class CoursesService { + constructor( + private readonly CourseRepository: CourseRepository, + ) {} + + public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { + const queryResult = await this.CourseRepository.filterByRequest(query); + return queryResult.map((course) => { + + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map( (x) => x.professor as subject_professor); + const result = toJsonCourse(course, representativeLecture, professorRaw,false); + + if (user) { + const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; + const latestWrittenDatetime = course.latest_written_datetime; + return Object.assign(result, { + "userspecific_is_read": latestWrittenDatetime < latestReadDatetime, + }) + } else { + return Object.assign(result, { + "userspecific_is_read": false, + }) + } + }) + } +} \ No newline at end of file diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index cabf448d..aa0f7812 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,9 +1,20 @@ import { UserRepository } from "../../prisma/repositories/user.repository"; import { Injectable, NotFoundException } from "@nestjs/common"; +import { LectureRepository } from "../../prisma/repositories/lecture.repository"; +import { session_userprofile, subject_department } from "@prisma/client"; +import { DepartmentRepository } from "../../prisma/repositories/department.repository"; +import { normalizeArray } from "../../common/utils/method.utils"; +import { ResearchLecture } from "../../common/interfaces/constants/lecture"; +import { ReviewRepository } from "../../prisma/repositories/review.repository"; @Injectable() export class UserService { - constructor(private readonly userRepository: UserRepository) { + constructor( + private readonly userRepository: UserRepository, + private readonly lectureRepository: LectureRepository, + private readonly departmentRepository: DepartmentRepository, + private readonly reviewRepository: ReviewRepository, + ) { } public async findBySid(sid: string){ @@ -12,4 +23,36 @@ export class UserService { throw new NotFoundException(`Can't find user with sid: ${sid}`); } } + + public async getProfile(user: session_userprofile){ + const promises = []; + const departmentPromise = this.departmentRepository.getDepartmentOfUser(user) + const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user) + const majorsPromise = this.departmentRepository.getMajors(user) + const minorsPromise = this.departmentRepository.getMinors(user) + const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user) + const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()) + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user) + const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) + promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); + const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); + const departments = Object.entries(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; + const researchLectures = Object.values(ResearchLecture); + const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); + + return { + id: user.id, + email: user.email, + student_id : user.student_id, + firstName: user.first_name, + lastName: user.last_name, + department: department ?? null, + majors: majors, + departments: departments, + favorite_departments: favoriteDepartments, + review_writeable_lectures: reviewWritableLectures, + my_timetable_lectures: timeTableLectures, + reviews: writtenReviews + } + } } \ No newline at end of file diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 131643af..d74daa23 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -3,15 +3,23 @@ import { PrismaService } from "./prisma.service"; import { UserRepository } from "./repositories/user.repository"; import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewRepository } from "./repositories/review.repository"; +import { DepartmentRepository } from "./repositories/department.repository"; +import { CourseRepository } from "./repositories/course.repository"; @Module({ providers: [PrismaService, UserRepository, LectureRepository, - ReviewRepository], + ReviewRepository, + DepartmentRepository, + CourseRepository, + ], exports: [PrismaService, UserRepository, LectureRepository, - ReviewRepository] + ReviewRepository, + DepartmentRepository, + CourseRepository, + ] }) export class PrismaModule {} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index a83c8ac1..c6771342 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,9 +1,13 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { applyOrder, applyOffset } from "src/common/utils/search.utils"; +import { subject_course } from "../generated/prisma-class/subject_course"; @Injectable() -export class CourseRepository{ - constructor(private readonly prisma: PrismaService){} +export class CourseRepository { + constructor( + private readonly prisma: PrismaService + ){} private TYPE_ACRONYMS = { "GR": "General Required", @@ -36,10 +40,11 @@ export class CourseRepository{ "CH", "TS", ] - //할일 - // Foreign key subject_course_professor 새로 걸어주기 - // subject_professor_course_list drop 하기 - public async filterByRequest (query: any) { + + public async filterByRequest (query: any): Promise { + const DEFAULT_LIMIT = 150; + const DEFAULT_ORDER = ['old_code'] + const { department, type, @@ -51,108 +56,111 @@ export class CourseRepository{ offset, limit, } = query; - const department_filter = this.department_filter(department); - const type_filter = this.type_filter(type); - const level_filter = this.level_filter(level); - const group_filter = this.group_filter(group); - const keyword_filter = this.keyword_filter(keyword); - const term_filter = this.term_filter(term); - let filter_list = [department_filter, type_filter, level_filter, group_filter, keyword_filter, term_filter] - filter_list = filter_list.filter((filter) => filter !== null) - return await this.prisma.subject_course.findMany({ + const departmentFilter = this.departmentFilter(department); + const typeFilter = this.typeFilter(type); + const levelFilter = this.levelFilter(level); + const groupFilter = this.groupFilter(group); + const keywordFilter = this.keywordFilter(keyword); + const term_filter = this.termFilter(term); + let filterList = [departmentFilter, typeFilter, levelFilter, groupFilter, keywordFilter, term_filter] + filterList = filterList.filter((filter) => filter !== null) + const query_result = await this.prisma.subject_course.findMany({ include: { - department: true, - professor_course_list: true + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, }, where: { - AND: filter_list - } - }) + AND: filterList + }, + take: limit ?? DEFAULT_LIMIT, + }) as subject_course[]; + + // Apply Ordering and Offset + const ordered_result = await applyOrder(query_result, order ?? DEFAULT_ORDER); + return await applyOffset(ordered_result, offset ?? 0); } - private department_filter(department_names: [string]): object { + private departmentFilter(department_names: [string]): object { if (!(department_names)) { return null } - if ("ALL" in department_names) { + if (department_names.includes("ALL")) { return null - } else if ("ETC" in department_names) { + } else if (department_names.includes("ETC")) { return { - department: { + subject_department: { code: { - notIn: { department_names } + notIn: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)) } } } } else { return { - department: { + subject_department: { code: { - in: { department_names } + in: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)) } } } } } - private type_filter(types: [string]): object { + private typeFilter(types: [string]): object { if (!(types)) { return null } - if ("ALL" in types) { + if (types.includes("ALL")) { return null - } else if ("ETC" in types) { + } else if (types.includes("ETC")) { const unselected_types = Object.values(this.TYPE_ACRONYMS).filter((type) => !(type in types)) return { type_en: { - in: { unselected_types } + in: unselected_types } } } else { return { type_en: { - in: { types } + in: types } } } } - private level_filter(levels?: [string]): object { + private levelFilter(levels?: [string]): object { if (!(levels)) { return null; } const acronym_dic = ["1", "2", "3", "4"]; - if ("ALL" in levels) { + if (levels.includes("ALL")) { return null; - } else if ("ETC" in levels) { + } else if (levels.includes("ETC")) { const numbers = acronym_dic.filter((level) => !(level in levels)); return { old_code: { - contains: { - numbers - } + contains: numbers } }; } else { const numbers = acronym_dic.filter((level) => level in levels); return { old_code: { - contains: { - numbers - } + contains: numbers } }; } } - private term_filter(term?: [string]): object { + private termFilter(term?: [string]): object { if (!(term)) { return null; } - if ("ALL" in term) { + if (term.includes("ALL")) { return null; } else { const current_year = new Date().getFullYear().toString(); @@ -164,47 +172,51 @@ export class CourseRepository{ } } - private keyword_filter(keyword?: [string]): object { + private keywordFilter(keyword?: string): object { if (!(keyword)) { return null; } - const keyword_trimed = keyword.map((word) => word.trim()); - const keyword_space_removed = keyword_trimed.map((word) => word.replace(/\s/g, "")); + const keyword_trimed = keyword.trim() + const keyword_space_removed = keyword_trimed.replace(/\s/g, ""); const title_filter = { title_no_space: { - contains: { keyword_space_removed } + contains: keyword_space_removed } }; const en_title_filter = { - en_title_np_space: { - contains: { keyword_space_removed } + title_en_no_space: { + contains: keyword_space_removed } }; const department_name_filter = { - department: { + subject_department: { name: keyword_trimed } }; const department_name_en_filter = { - department: { + subject_department: { name_en: keyword_trimed } }; const professors_professor_name_filter = { - subject_professor_course_list: { - subject_professor: { - professor_name: { - contains: { keyword_trimed } + subject_course_professors: { + some: { + professor: { + professor_name: { + contains: keyword_trimed + } } } } }; const professors_professor_name_en_filter = { - subject_professor_course_list: { - subject_professor: { - professor_name_en: { - contains: { keyword_trimed } + subject_course_professors: { + some: { + professor: { + professor_name_en: { + contains: keyword_trimed + } } } } @@ -221,7 +233,7 @@ export class CourseRepository{ }; } - private group_filter(group?: [string]): object { + private groupFilter(group?: [string]): object { if (!(group)) { return null; } diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts new file mode 100644 index 00000000..c11ac9a0 --- /dev/null +++ b/src/prisma/repositories/department.repository.ts @@ -0,0 +1,59 @@ +import { PrismaService } from "../prisma.service"; +import { session_userprofile, subject_department } from "@prisma/client"; +import session from "express-session"; +import { Injectable } from "@nestjs/common"; + +@Injectable() +export class DepartmentRepository{ + constructor(private readonly prisma: PrismaService) { + } + + async getDepartmentOfUser(user: session_userprofile): Promise { + const departmentId = user.department_id + if(!departmentId) return null; + const department = await this.prisma.subject_department.findUnique({ + where: { id: departmentId } + }); + return department; + } + + async getFavoriteDepartments(user: session_userprofile): Promise{ + const favoriteDepartments = (await this.prisma.session_userprofile_favorite_departments.findMany({ + where: { userprofile_id: user.id }, + include:{ + department: true + } + })).map((favoriteDepartment) => favoriteDepartment.department); + return favoriteDepartments; + } + + async getMajors(user: session_userprofile): Promise{ + const majors = (await this.prisma.session_userprofile_majors.findMany({ + where: { userprofile_id: user.id }, + include:{ + subject_department: true + } + })).map((major) => major.subject_department); + return majors; + } + + async getMinors(user: session_userprofile): Promise{ + const minors = (await this.prisma.session_userprofile_minors.findMany({ + where: { userprofile_id: user.id }, + include:{ + subject_department: true + } + })).map((minor) => minor.subject_department); + return minors; + } + + async getSpecializedMajors(user: session_userprofile): Promise{ + const specializedMajors = (await this.prisma.session_userprofile_specialized_major.findMany({ + where: {userprofile_id: user.id}, + include:{ + subject_department: true + } + })).map((specializedMajor) => specializedMajor.subject_department); + return specializedMajors; + } +} \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index b2f90ee6..175fbd04 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,8 +1,84 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { Prisma, session_userprofile, subject_lecture } from "@prisma/client"; +import { groupBy } from "../../common/utils/method.utils"; @Injectable() -export class LectureRepository{ - constructor(private readonly prisma: PrismaService){} +export class LectureRepository { + constructor(private readonly prisma: PrismaService) { + } + + async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { + let currDate; + if (!date) { + currDate = Date.now(); + } else { + currDate = date + } + const notWritableSemesters = await this.prisma.subject_semester.findMany({ + where: { + OR: [ + { + courseAddDropPeriodEnd: { + gte: currDate + }, + }, + { + beginning: { + gte: currDate + } + } + ] + } + }); + const notWritableYearAndSemester = groupBy(notWritableSemesters.map((semester) => { + return { + semester: semester.semester, + year: semester.year + } + }),(subject_semester) => subject_semester.year) + + const notWritableYearAndSemesterMap: Record> = { } ; + for (const key in notWritableYearAndSemester) { + const objects = notWritableYearAndSemester[key]; + const mapObjects = groupBy(objects); + notWritableYearAndSemesterMap[key] = mapObjects; + } + + const takenLectures = await this.getTakenLectures(user); + const reviewWritableLectures = takenLectures.filter((lecture) => { + return notWritableYearAndSemesterMap[lecture.year]??[lecture.semester] ? true: false + }) + + // const lectures = await this.prisma.subject_lecture.findMany({ + // where: { + // AND: notWritableYearAndSemester + // } + // }) + + return reviewWritableLectures; + } + + getResearchLectureQuery(): Prisma.subject_lectureWhereInput { + return { + type_en: { + in: ["Individual Study", "Thesis Study(Undergraduate)", + "Thesis Research(MA/phD)"] + } + } + } + + async getTakenLectures(user: session_userprofile): Promise { + const lectures: subject_lecture[] = (await this.prisma.session_userprofile_taken_lectures.findMany({ + where: { + userprofile_id: user.id + }, + include: { + lecture: true + } + })).map((takenLecture) => takenLecture.lecture); + + return lectures; + } } \ No newline at end of file diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index a2d1e90a..8d761286 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,8 +1,16 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; +import { review_review, session_userprofile, subject_department } from "@prisma/client"; @Injectable() export class ReviewRepository{ constructor(private readonly prisma: PrismaService){} + async findReviewByUser(user: session_userprofile): Promise{ + const reviews = await this.prisma.review_review.findMany({ + where: { writer_id: user.id }, + }) + return reviews; + } + } \ No newline at end of file diff --git a/src/settings.ts b/src/settings.ts index 43614f2d..f9c885df 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -14,9 +14,23 @@ export default () => { awsconfig: () => getAWSConfig(), getJwtConfig: () => getJwtConfig(), getSsoConfig: () => getSsoConfig(), + getCorsConfig: () => getCorsConfig(), }; }; +const getCorsConfig = () => { + const { NODE_ENV } = process.env; + if(NODE_ENV === 'local'){ + return { + origin: "http://localhost:3000", + methods: "GET,HEAD,PUT,PATCH,POST,DELETE", + credentials: true, + preflightContinue: false, + optionsSuccessStatus: 204 + } + } +} + const getPrismaConfig = (): PrismaClientOptions => { return { datasources: { diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 50cda623..7193e27f 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; +import request from "supertest"; import { AppModule } from './../src/app.module'; describe('AppController (e2e)', () => { diff --git a/test/session/session.spec.ts b/test/session/session.spec.ts new file mode 100644 index 00000000..9b5dcf1b --- /dev/null +++ b/test/session/session.spec.ts @@ -0,0 +1,54 @@ +import { INestApplication } from "@nestjs/common"; +import { Test, TestingModule } from "@nestjs/testing"; +import { AppModule } from "../../src/app.module"; +import * as request from "supertest"; +import { PrismaService } from "../../src/prisma/prisma.service"; +import { UserService } from "../../src/modules/user/user.service"; +import axios from "axios"; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/session/info (GET)', async () => { + const prismaService = app.get(PrismaService); + const userService = app.get(UserService); + + + const sidList = await axios.get('http://localhost:58000/session'); + + const BATCH_SIZE = 10; + const BATCH_COUNT = Math.floor(sidList.data.length / BATCH_SIZE) + 1; + for(let i = 0; i { + const r = await axios.get(`http://localhost:58000/session/login?sid=${sid}`); + const { data } = r; + const user = prismaService.session_userprofile.findFirst({ + where: { sid }, + }).then((user) => { + try{ + return userService.getProfile(user); + }catch (e) { + console.log('error with sid: ', sid) + console.error(e); + } + }).then((profile)=> { + expect(profile).toEqual(data) + return profile + }) + return user; + }); + await Promise.all(promises); + console.log(`batch ${i} / ${BATCH_COUNT} done`); + } + }, 100000000); +}); From e2eab48e03b9d330f54ed3a7066b1c6c2b517456 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Mon, 31 Jul 2023 19:50:20 +0900 Subject: [PATCH 081/250] Fix:orderByFilter, include course at ReviewsReposiotry --- src/app.module.ts | 3 ++- .../dto/reviews/review.response.dto.ts | 2 +- .../serializer/review.serializer.ts | 2 +- src/modules/reviews/reviews.controller.ts | 2 -- src/modules/user/user.service.ts | 4 ++-- src/prisma/prisma.module.ts | 6 ++--- src/prisma/repositories/review.repository.ts | 24 +++++++++++++------ 7 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index f24f4c68..1c2575f8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -8,9 +8,10 @@ import { AuthModule } from './modules/auth/auth.module'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; import { JwtService } from '@nestjs/jwt'; import { CoursesModule } from './modules/courses/courses.module'; +import { ReviewsModule } from './modules/reviews/reviews.module'; @Module({ - imports: [PrismaModule, AuthModule, CoursesModule], + imports: [PrismaModule, AuthModule, CoursesModule, ReviewsModule], controllers: [AppController], providers: [ { diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts index bdeb29ab..9f5625e4 100644 --- a/src/common/interfaces/dto/reviews/review.response.dto.ts +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -3,7 +3,7 @@ import { CourseResponseDto } from "../course/course.response.dto"; export class ReviewResponseDto { id: number; course: CourseResponseDto; - lecture: LectureResponseDto; + lecture: any;//LectureResponseDto; content: string; like: number; is_deleted: number; diff --git a/src/common/interfaces/serializer/review.serializer.ts b/src/common/interfaces/serializer/review.serializer.ts index 05b5c78d..91f543cb 100644 --- a/src/common/interfaces/serializer/review.serializer.ts +++ b/src/common/interfaces/serializer/review.serializer.ts @@ -21,7 +21,7 @@ export const toJsonReview= (review: review_review): ReviewResponseDto=>{ const result = { id: review.id, course: courseResult, - lecture: toJsonLecture(review.lecture, true), + lecture: "toJsonLecture(review.lecture, true)", content: review.is_deleted ? '관리자에 의해 삭제된 코멘트입니다.' : review.content, diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index afa701eb..d2e603ff 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -12,9 +12,7 @@ export class ReviewsController { private readonly reviewsService: ReviewsService, private readonly reviewsRepository: ReviewsRepository, ) {} - @Get() - @Header('Content-type', 'application/json') async getReviews( @Query() reviewsParam: getReviewDto, @GetUser() user: session_userprofile, diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index aa0f7812..2f21ecb2 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -5,7 +5,7 @@ import { session_userprofile, subject_department } from "@prisma/client"; import { DepartmentRepository } from "../../prisma/repositories/department.repository"; import { normalizeArray } from "../../common/utils/method.utils"; import { ResearchLecture } from "../../common/interfaces/constants/lecture"; -import { ReviewRepository } from "../../prisma/repositories/review.repository"; +import { ReviewsRepository } from "../../prisma/repositories/review.repository"; @Injectable() export class UserService { @@ -13,7 +13,7 @@ export class UserService { private readonly userRepository: UserRepository, private readonly lectureRepository: LectureRepository, private readonly departmentRepository: DepartmentRepository, - private readonly reviewRepository: ReviewRepository, + private readonly reviewRepository: ReviewsRepository, ) { } diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index d74daa23..fab96731 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -2,7 +2,7 @@ import { Module } from "@nestjs/common"; import { PrismaService } from "./prisma.service"; import { UserRepository } from "./repositories/user.repository"; import { LectureRepository } from "./repositories/lecture.repository"; -import { ReviewRepository } from "./repositories/review.repository"; +import { ReviewsRepository } from "./repositories/review.repository"; import { DepartmentRepository } from "./repositories/department.repository"; import { CourseRepository } from "./repositories/course.repository"; @@ -10,14 +10,14 @@ import { CourseRepository } from "./repositories/course.repository"; providers: [PrismaService, UserRepository, LectureRepository, - ReviewRepository, + ReviewsRepository, DepartmentRepository, CourseRepository, ], exports: [PrismaService, UserRepository, LectureRepository, - ReviewRepository, + ReviewsRepository, DepartmentRepository, CourseRepository, ] diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index b9e6fd2b..363f2386 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -2,7 +2,7 @@ import { applyOffset } from 'src/common/utils/search.utils'; import { Injectable } from '@nestjs/common'; import { applyOrder } from 'src/common/utils/search.utils'; import { review_review } from 'src/prisma/generated/prisma-class/review_review'; -import { session_userprofile } from 'src/prisma/generated/prisma-class/session_userprofile'; +import { session_userprofile } from '@prisma/client'; import { PrismaService } from '../prisma.service'; @Injectable() @@ -23,7 +23,7 @@ export class ReviewsRepository { limit: number ): Promise { let lectureFilter: object = {}; - const orderFilter: {[key:string]:string} = {}; + const orderFilter: { [key: string]: string }[] = []; if (lecture_year) { lectureFilter = { ...lectureFilter, year: lecture_year }; } @@ -31,18 +31,29 @@ export class ReviewsRepository { lectureFilter = { ...lectureFilter, semester: lecture_semester }; } order.forEach((orderList) => { + const orderDict: {[key:string]:string} = {}; let order = 'asc'; const orderBy = orderList.split('-'); - console.log(orderBy); if (orderBy[0] == '') { order = 'desc'; } - orderFilter[orderBy[orderBy.length - 1]] = order; + orderDict[orderBy[orderBy.length - 1]] = order; + orderFilter.push(orderDict); }); - const reviews = await this.prisma.review_review.findMany({ + const reviews = (await this.prisma.review_review.findMany({ where: { lecture: lectureFilter, }, + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + }, skip: offset, take: limit, orderBy: orderFilter, @@ -61,8 +72,7 @@ export class ReviewsRepository { 'is_deleted', 'written_datetime', ], - - }) as review_review[]; + })) as review_review[]; return reviews; } From 6791b266fca5c0984147c6a3cce58493db1c0baf Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 2 Aug 2023 19:46:45 +0900 Subject: [PATCH 082/250] Add: apply toJsonLecture and toJsonReview to session/info --- .../interfaces/dto/user/user.response.dto.ts | 3 +- .../serializer/review.serializer.ts | 33 ++++++++++--------- src/modules/user/user.service.ts | 10 +++--- src/prisma/repositories/lecture.repository.ts | 10 +++++- src/prisma/repositories/review.repository.ts | 8 +++++ 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index 82c4ccab..7d3546f0 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -2,6 +2,7 @@ import { review_review, session_userprofile_favorite_departments, session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; import { DepartmentResponseDto } from "../department/department.response.dto"; +import { ReviewResponseDto } from "../reviews/review.response.dto"; export interface ProfileDto { id: number; @@ -15,5 +16,5 @@ export interface ProfileDto { favorite_departments: DepartmentResponseDto[] review_writeable_lectures: session_userprofile_taken_lectures[] my_timetable_lectures: session_userprofile_taken_lectures[] - reviews: review_review[] + reviews: ReviewResponseDto[] } diff --git a/src/common/interfaces/serializer/review.serializer.ts b/src/common/interfaces/serializer/review.serializer.ts index 91f543cb..ed54d869 100644 --- a/src/common/interfaces/serializer/review.serializer.ts +++ b/src/common/interfaces/serializer/review.serializer.ts @@ -1,17 +1,20 @@ -import { toJsonCourse } from './course.serializer'; -import { review_review } from 'src/prisma/generated/prisma-class/review_review'; -import { ReviewResponseDto } from './../dto/reviews/review.response.dto'; -import { getRepresentativeLecture } from 'src/common/utils/lecture.utils'; -import { subject_professor } from 'src/prisma/generated/prisma-class/subject_professor'; -export const toJsonReview= (review: review_review): ReviewResponseDto=>{ - const representativeLecture = getRepresentativeLecture(review.course.lecture); - const professorRaw = review.course.subject_course_professors.map( - (x) => x.professor as subject_professor, - ); - const courseResult = toJsonCourse( - review.course, - representativeLecture, - professorRaw, +import { toJsonCourse } from "./course.serializer"; +import { review_review } from "src/prisma/generated/prisma-class/review_review"; +import { ReviewResponseDto } from "./../dto/reviews/review.response.dto"; +import { getRepresentativeLecture } from "src/common/utils/lecture.utils"; +import { subject_professor } from "src/prisma/generated/prisma-class/subject_professor"; +import { toJsonLecture } from "./lecture.serializer"; + + +export const toJsonReview = (review: review_review): ReviewResponseDto => { + const representativeLecture = getRepresentativeLecture(review.course.lecture); + const professorRaw = review.course.subject_course_professors.map( + (x) => x.professor as subject_professor + ); + const courseResult = toJsonCourse( + review.course, + representativeLecture, + professorRaw, true, ); Object.assign(courseResult, { @@ -21,7 +24,7 @@ export const toJsonReview= (review: review_review): ReviewResponseDto=>{ const result = { id: review.id, course: courseResult, - lecture: "toJsonLecture(review.lecture, true)", + lecture: toJsonLecture(review.lecture, true), content: review.is_deleted ? '관리자에 의해 삭제된 코멘트입니다.' : review.content, diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 196793c1..7480ea63 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -7,6 +7,8 @@ import { normalizeArray } from "../../common/utils/method.utils"; import { ResearchLecture } from "../../common/interfaces/constants/lecture"; import { ReviewsRepository } from "../../prisma/repositories/review.repository"; import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; +import { toJsonReview } from "../../common/interfaces/serializer/review.serializer"; +import { toJsonLecture } from "../../common/interfaces/serializer/lecture.serializer"; @Injectable() export class UserService { @@ -39,7 +41,7 @@ export class UserService { const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); const departments = Object.values(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; const researchLectures = Object.values(ResearchLecture); - const timeTableLectures = takenLectures.filter((lecture) => researchLectures.includes(lecture.type_en)); + const timeTableLectures = takenLectures.filter((lecture) => !researchLectures.includes(lecture.type_en)); return { id: user.id, @@ -51,9 +53,9 @@ export class UserService { majors: majors.map((major) => toJsonDepartment(major)), departments: departments.map((department) => toJsonDepartment(department)), favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), - review_writeable_lectures: reviewWritableLectures, - my_timetable_lectures: timeTableLectures, - reviews: writtenReviews + review_writeable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture)), + my_timetable_lectures: timeTableLectures.map((lecture) => toJsonLecture(lecture)), + reviews: writtenReviews.map((review) => toJsonReview(review)), } } } \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 1d2e235d..125f2f8d 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -139,7 +139,15 @@ export class LectureRepository { userprofile_id: user.id }, include: { - lecture: true + lecture: { + include:{ + subject_lecture_professors: { + include:{ + professor: true + } + } + } + } } })).map((takenLecture) => takenLecture.lecture as subject_lecture); diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 363f2386..ce2b0466 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -12,6 +12,14 @@ export class ReviewsRepository { async findReviewByUser(user: session_userprofile): Promise{ const reviews = await this.prisma.review_review.findMany({ where: { writer_id: user.id }, + include:{ + course: { + include:{ + lecture: true, + } + }, + lecture: true, + } }) return reviews as review_review[]; } From bcefd434b9ec0e70cb39650bf8a585cc78e55ccb Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 2 Aug 2023 18:10:04 +0900 Subject: [PATCH 083/250] Add: test complete - api/courses - api/courses/{courseId} --- package-lock.json | 136 ++++++++++++++++++ package.json | 1 + .../dto/course/course.request.dto.ts | 56 ++++++++ .../dto/lecture/lecture.query.dto.ts | 54 +++++-- .../serializer/lecture.serializer.ts | 3 +- src/modules/courses/courses.controller.ts | 3 +- src/modules/courses/courses.service.ts | 2 + src/prisma/prisma.service.ts | 5 + src/prisma/repositories/course.repository.ts | 5 +- src/prisma/repositories/lecture.repository.ts | 14 +- src/settings.ts | 5 +- 11 files changed, 258 insertions(+), 26 deletions(-) create mode 100644 src/common/interfaces/dto/course/course.request.dto.ts diff --git a/package-lock.json b/package-lock.json index 5468ff9d..8b489212 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "@types/passport-local": "^1.0.34", "axios": "^1.4.0", "bcrypt": "^5.1.0", + "cached-prisma": "^1.2.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", @@ -3610,6 +3611,17 @@ "node": ">= 0.8" } }, + "node_modules/cached-prisma": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cached-prisma/-/cached-prisma-1.2.1.tgz", + "integrity": "sha512-bsWZo5gRO4dKW7SIPMGSwCDmkTbR7WJLo2YB8sxlvCbSU2Akdhqq6OWEq23CTvX9uTNH4k6+RJYIb4m4Mx0fmg==", + "dependencies": { + "@prisma/client": "^4.10.1", + "collections": "^5.1.12", + "memcached": "^2.2.2", + "prisma": "^4.10.1" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -3936,6 +3948,14 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "node_modules/collections": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/collections/-/collections-5.1.13.tgz", + "integrity": "sha512-SCb6Qd+d3Z02corWQ7/mqXiXeeTdHvkP6TeFSYfGYdCFp1WrjSNZ3j6y8Y3T/7osGEe0iOcU2g1d346l99m4Lg==", + "dependencies": { + "weak-map": "~1.0.x" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4037,6 +4057,11 @@ "typedarray": "^0.0.6" } }, + "node_modules/connection-parse": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", + "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==" + }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -5639,6 +5664,15 @@ "node": ">=8" } }, + "node_modules/hashring": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", + "integrity": "sha512-xCMovURClsQZ+TR30icCZj+34Fq1hs0y6YCASD6ZqdRfYRybb5Iadws2WS+w09mGM/kf9xyA5FCdJQGcgcraSA==", + "dependencies": { + "connection-parse": "0.0.x", + "simple-lru-cache": "0.0.x" + } + }, "node_modules/header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -6166,6 +6200,22 @@ "node": ">=6" } }, + "node_modules/jackpot": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/jackpot/-/jackpot-0.0.6.tgz", + "integrity": "sha512-rbWXX+A9ooq03/dfavLg9OXQ8YB57Wa7PY5c4LfU3CgFpwEhhl3WyXTQVurkaT7zBM5I9SSOaiLyJ4I0DQmC0g==", + "dependencies": { + "retry": "0.6.0" + } + }, + "node_modules/jackpot/node_modules/retry": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", + "integrity": "sha512-RgncoxLF1GqwAzTZs/K2YpZkWrdIYbXsmesdomi+iPilSzjUyr/wzNIuteoTVaWokzdwZIJ9NHRNQa/RUiOB2g==", + "engines": { + "node": "*" + } + }, "node_modules/jest": { "version": "28.1.2", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.2.tgz", @@ -7076,6 +7126,15 @@ "node": ">= 0.6" } }, + "node_modules/memcached": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/memcached/-/memcached-2.2.2.tgz", + "integrity": "sha512-lHwUmqkT9WdUUgRsAvquO4xsKXYaBd644Orz31tuth+w/BIfFNuJMWwsG7sa7H3XXytaNfPTZ5R/yOG3d9zJMA==", + "dependencies": { + "hashring": "3.2.x", + "jackpot": ">=0.0.6" + } + }, "node_modules/memfs": { "version": "3.4.13", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", @@ -8842,6 +8901,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-lru-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", + "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -9950,6 +10014,11 @@ "defaults": "^1.0.3" } }, + "node_modules/weak-map": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", + "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -13009,6 +13078,17 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, + "cached-prisma": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cached-prisma/-/cached-prisma-1.2.1.tgz", + "integrity": "sha512-bsWZo5gRO4dKW7SIPMGSwCDmkTbR7WJLo2YB8sxlvCbSU2Akdhqq6OWEq23CTvX9uTNH4k6+RJYIb4m4Mx0fmg==", + "requires": { + "@prisma/client": "^4.10.1", + "collections": "^5.1.12", + "memcached": "^2.2.2", + "prisma": "^4.10.1" + } + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -13243,6 +13323,14 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "collections": { + "version": "5.1.13", + "resolved": "https://registry.npmjs.org/collections/-/collections-5.1.13.tgz", + "integrity": "sha512-SCb6Qd+d3Z02corWQ7/mqXiXeeTdHvkP6TeFSYfGYdCFp1WrjSNZ3j6y8Y3T/7osGEe0iOcU2g1d346l99m4Lg==", + "requires": { + "weak-map": "~1.0.x" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -13325,6 +13413,11 @@ "typedarray": "^0.0.6" } }, + "connection-parse": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", + "integrity": "sha512-bTTG28diWg7R7/+qE5NZumwPbCiJOT8uPdZYu674brDjBWQctbaQbYlDKhalS+4i5HxIx+G8dZsnBHKzWpp01A==" + }, "consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -14556,6 +14649,15 @@ } } }, + "hashring": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", + "integrity": "sha512-xCMovURClsQZ+TR30icCZj+34Fq1hs0y6YCASD6ZqdRfYRybb5Iadws2WS+w09mGM/kf9xyA5FCdJQGcgcraSA==", + "requires": { + "connection-parse": "0.0.x", + "simple-lru-cache": "0.0.x" + } + }, "header-case": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", @@ -14933,6 +15035,21 @@ "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==" }, + "jackpot": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/jackpot/-/jackpot-0.0.6.tgz", + "integrity": "sha512-rbWXX+A9ooq03/dfavLg9OXQ8YB57Wa7PY5c4LfU3CgFpwEhhl3WyXTQVurkaT7zBM5I9SSOaiLyJ4I0DQmC0g==", + "requires": { + "retry": "0.6.0" + }, + "dependencies": { + "retry": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", + "integrity": "sha512-RgncoxLF1GqwAzTZs/K2YpZkWrdIYbXsmesdomi+iPilSzjUyr/wzNIuteoTVaWokzdwZIJ9NHRNQa/RUiOB2g==" + } + } + }, "jest": { "version": "28.1.2", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.2.tgz", @@ -15642,6 +15759,15 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, + "memcached": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/memcached/-/memcached-2.2.2.tgz", + "integrity": "sha512-lHwUmqkT9WdUUgRsAvquO4xsKXYaBd644Orz31tuth+w/BIfFNuJMWwsG7sa7H3XXytaNfPTZ5R/yOG3d9zJMA==", + "requires": { + "hashring": "3.2.x", + "jackpot": ">=0.0.6" + } + }, "memfs": { "version": "3.4.13", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", @@ -16945,6 +17071,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-lru-cache": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", + "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -17756,6 +17887,11 @@ "defaults": "^1.0.3" } }, + "weak-map": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", + "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==" + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index d3cb9ec4..ab681566 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "@types/passport-local": "^1.0.34", "axios": "^1.4.0", "bcrypt": "^5.1.0", + "cached-prisma": "^1.2.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", diff --git a/src/common/interfaces/dto/course/course.request.dto.ts b/src/common/interfaces/dto/course/course.request.dto.ts new file mode 100644 index 00000000..1bf04abf --- /dev/null +++ b/src/common/interfaces/dto/course/course.request.dto.ts @@ -0,0 +1,56 @@ +import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; +import { Transform } from "class-transformer"; + +export class CourseQueryDto{ + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + @IsString({each: true}) + department?: string[] + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + @IsString({each: true}) + type?: string[] + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + //@todo: @Transform() + @IsString({each: true}) + level?: string[] + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + @IsString({each: true}) + group?: string[] + + @IsOptional() + @IsString() + keyword?: string + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + @IsString({each: true}) + term?: string[] + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + @IsString({each: true}) + order?: string[] + + @IsOptional() + @IsNumber() + @Transform(({value}) => parseInt(value)) + offset?: number + + @IsOptional() + @IsNumber() + @Transform(({value}) => parseInt(value)) + limit?: number +} \ No newline at end of file diff --git a/src/common/interfaces/dto/lecture/lecture.query.dto.ts b/src/common/interfaces/dto/lecture/lecture.query.dto.ts index f74daf91..d0dd7ee9 100644 --- a/src/common/interfaces/dto/lecture/lecture.query.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.query.dto.ts @@ -1,15 +1,41 @@ -export interface LectureQueryDTO { - "year"?: number[]; - "semester"?: number[]; - "day"?: number[]; - "begin"?: number[]; - "end"?: number[]; - "department"?: string[]; - "type"?: string[]; - "level"?: string[]; - "group"?: string[] - "keyword"?: string; - "order"?: string[]; - "offset"?: number; - "limit"?: number; +import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; +import { Transform } from "class-transformer"; +import { CourseQueryDto } from "../course/course.request.dto"; + +export class LectureQueryDTO extends CourseQueryDto{ + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({value}) => value.map((v)=> parseInt(v))) + @IsArray() + @IsNumber({},{each: true}) + year?: number[]; + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({value}) => value.map((v)=> parseInt(v))) + @IsArray() + @IsNumber({},{each: true}) + semester?: number[]; + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({value}) => value.map((v)=> parseInt(v))) + @IsArray() + @IsNumber({},{each: true}) + day?: number[]; + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({value}) => value.map((v)=> parseInt(v))) + @IsArray() + @IsNumber({},{each: true}) + begin?: number[]; + + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({value}) => value.map((v)=> parseInt(v))) + @IsArray() + @IsNumber({},{each: true}) + end?: number[]; } \ No newline at end of file diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index 13f79dac..cd510710 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -3,6 +3,7 @@ import { subject_lecture } from "src/prisma/generated/prisma-class/subject_lectu import { toJsonClasstime } from "./classtime.serializer"; import { toJsonExamtime } from "./examtime.serializer"; import { LectureResponseDto } from "../dto/lecture/lecture.response.dto"; +import { toJsonProfessor } from "./professor.serializer"; export const toJsonLecture = (lecture: subject_lecture, nested = false): LectureResponseDto => { let result = { @@ -37,7 +38,7 @@ export const toJsonLecture = (lecture: subject_lecture, nested = false): Lecture const professors = lecture.subject_lecture_professors.map((x) => x.professor); const ordered_professors = applyOrder(professors, ["professor_name"]); - result = Object.assign(result, { "professors": ordered_professors }); + result = Object.assign(result, { "professors": toJsonProfessor(ordered_professors) }); if (nested) { return result; diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 341a5a98..f2d459b9 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -2,13 +2,14 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { CoursesService } from './courses.service'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; +import { CourseQueryDto } from "../../common/interfaces/dto/course/course.request.dto"; @Controller('api/courses') export class CourseController { constructor(private readonly CoursesService: CoursesService) {} @Get() - async getCourses(@Query() query: any, @GetUser() user: session_userprofile) { + async getCourses(@Query() query: CourseQueryDto, @GetUser() user: session_userprofile) { const courses = await this.CoursesService.getCourseByFilter(query, user); return courses } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 0ac725e6..11b931fb 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -23,7 +23,9 @@ export class CoursesService { ) {} public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { + console.time("getCourseByFilter") const queryResult = await this.CourseRepository.filterByRequest(query); + console.timeEnd("getCourseByFilter") return queryResult.map((course) => { const representativeLecture = getRepresentativeLecture(course.lecture); const professorRaw = course.subject_course_professors.map((x) => x.professor as subject_professor); diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index 0d534565..879de995 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -11,6 +11,11 @@ export class PrismaService extends PrismaClient implements OnModuleInit { async onModuleInit() { await this.$connect(); + // @ts-ignore + this.$on('query', async (e) => { + // @ts-ignore + console.log(`Query: ${e.query} ${e.params}`); + }) } async enableShutdownHooks(app: INestApplication) { diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 678b52f8..7dcd1660 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -77,6 +77,7 @@ export class CourseRepository { return applyOrder(filterdLecture, order); } + //@todo: optimize goal: 1.5s -> 0.5s, recommended: using cache public async filterByRequest (query: any): Promise { const DEFAULT_LIMIT = 150; const DEFAULT_ORDER = ['old_code'] @@ -151,7 +152,7 @@ export class CourseRepository { if (types.includes("ALL")) { return null } else if (types.includes("ETC")) { - const unselected_types = Object.values(this.TYPE_ACRONYMS).filter((type) => !(type in types)) + const unselected_types = Object.keys(this.TYPE_ACRONYMS).filter((type) => !(type in types)).map((type) => this.TYPE_ACRONYMS[type]) return { type_en: { in: unselected_types @@ -160,7 +161,7 @@ export class CourseRepository { } else { return { type_en: { - in: types + in: types.map((type) => this.TYPE_ACRONYMS[type]) } } } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 125f2f8d..5a4cdf19 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -160,13 +160,13 @@ export class LectureRepository { } else if (!years) { return { semester: { - In: semesters + in: semesters } } } else if (!semesters) { return { years: { - In: semesters + in: semesters } } } else { @@ -174,12 +174,12 @@ export class LectureRepository { AND: [ { year: { - In: years + in: years } }, { semester: { - In: semesters + in: semesters } } ] @@ -191,9 +191,9 @@ export class LectureRepository { const datetimeBegin = begin?.map((time) => this.datetimeConverter(time)); const datetimeEnd = end?.map((time) => this.datetimeConverter(time)); - const dayFilter = day ? { day: {In: day} } : null; - const beginFilter = begin ? { begin: {In: datetimeBegin} } : null; - const endFilter = end ? { end: {In: datetimeEnd} } : null; + const dayFilter = day ? { day: {in: day} } : null; + const beginFilter = begin ? { begin: {in: datetimeBegin} } : null; + const endFilter = end ? { end: {in: datetimeEnd} } : null; return { AND: [ dayFilter, diff --git a/src/settings.ts b/src/settings.ts index f9c885df..44c1f404 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -39,7 +39,10 @@ const getPrismaConfig = (): PrismaClientOptions => { }, }, errorFormat: 'pretty', - log: [`error`], + log: [{ + emit: 'event', + level: 'query', + }], }; }; From b7a7e7fbf773c08b6c6c276c812e149b2f01de31 Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 2 Aug 2023 19:45:21 +0900 Subject: [PATCH 084/250] Fix: resolve lecture serializer bugs --- src/common/interfaces/serializer/classtime.serializer.ts | 2 +- src/common/interfaces/serializer/examtime.serializer.ts | 6 +++--- src/common/utils/time.utils.ts | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts index 50574daa..61cf4d9d 100644 --- a/src/common/interfaces/serializer/classtime.serializer.ts +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -27,7 +27,7 @@ const getClassroomStrs = (classtime: subject_classtime) => { const rightParanthesisIndex = buildingFullName.indexOf(")"); const buildingCode = buildingFullName.slice(1, rightParanthesisIndex); const buildingName = buildingFullName.slice(rightParanthesisIndex+1); - const buildingNameEn = buildingFullName.slice(rightParanthesisIndex+1); + const buildingNameEn = buildingFullNameEn.slice(rightParanthesisIndex+1); const roomName = classtime.room_name ?? ""; const classroom = "(" + buildingCode + ") " + buildingName + " " + roomName; const classroomEn = "(" + buildingCode + ") " + buildingNameEn + " " + roomName; diff --git a/src/common/interfaces/serializer/examtime.serializer.ts b/src/common/interfaces/serializer/examtime.serializer.ts index a1fc2b05..988f6d71 100644 --- a/src/common/interfaces/serializer/examtime.serializer.ts +++ b/src/common/interfaces/serializer/examtime.serializer.ts @@ -8,11 +8,11 @@ export const toJsonExamtime = (examtime: subject_examtime) => { "day": examtime.day, "str": `${DAY_STR[examtime.day]} ${timeFormatter(examtime.begin)} ~ ${timeFormatter(examtime.end)}`, "str_en": `${DAY_STR_EN[examtime.day]} ${timeFormatter(examtime.begin)} ~ ${timeFormatter(examtime.end)}`, - "begin": getTimeNumeric(examtime.begin), - "end": getTimeNumeric(examtime.begin), + "begin": getTimeNumeric(examtime.begin, false), + "end": getTimeNumeric(examtime.end, false), } } const timeFormatter = (time: Date) => { - return `${time.getHours()}:${time.getMinutes()}`; + return `${time.getUTCHours()}:${time.getUTCMinutes().toString().padStart(2, '0')}`; } \ No newline at end of file diff --git a/src/common/utils/time.utils.ts b/src/common/utils/time.utils.ts index 6ba916a9..6a85a898 100644 --- a/src/common/utils/time.utils.ts +++ b/src/common/utils/time.utils.ts @@ -1,7 +1,7 @@ -export const getTimeNumeric = (time: Date) => { - const beginNumeric = time.getHours() * 60 + time.getMinutes(); - if (beginNumeric % 30) { - return beginNumeric + (30 - beginNumeric % 30); +export const getTimeNumeric = (time: Date, isClass = true) => { + const beginNumeric = (time.getUTCHours() * 60) + time.getUTCMinutes(); + if (beginNumeric % 30 && isClass) { + return beginNumeric - (beginNumeric % 30); } else { return beginNumeric; } From 7e35741c81d5f2177c6fc089658ef990d3a51d8f Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Wed, 2 Aug 2023 20:57:17 +0900 Subject: [PATCH 085/250] Add: test complete - /api/reviews/ --- .../interfaces/dto/reviews/review.response.dto.ts | 3 ++- .../{reviews.dto.ts => reviews.request.dto.ts} | 0 src/modules/reviews/reviews.controller.ts | 11 +++++++++-- src/modules/reviews/reviews.service.ts | 2 +- src/prisma/repositories/review.repository.ts | 8 ++++++++ 5 files changed, 20 insertions(+), 4 deletions(-) rename src/common/interfaces/dto/reviews/{reviews.dto.ts => reviews.request.dto.ts} (100%) diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts index 9f5625e4..39236ca6 100644 --- a/src/common/interfaces/dto/reviews/review.response.dto.ts +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -1,9 +1,10 @@ import { CourseResponseDto } from "../course/course.response.dto"; +import { LectureResponseDto } from "../lecture/lecture.response.dto"; export class ReviewResponseDto { id: number; course: CourseResponseDto; - lecture: any;//LectureResponseDto; + lecture: LectureResponseDto; content: string; like: number; is_deleted: number; diff --git a/src/common/interfaces/dto/reviews/reviews.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts similarity index 100% rename from src/common/interfaces/dto/reviews/reviews.dto.ts rename to src/common/interfaces/dto/reviews/reviews.request.dto.ts diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index d2e603ff..24767d02 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,5 +1,5 @@ -import { Controller, Get, Header, Query } from '@nestjs/common'; -import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.dto'; +import { Body, Controller, Get, Post, Query } from '@nestjs/common'; +import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @@ -29,4 +29,11 @@ export class ReviewsController { const result = await this.reviewsService.getReviews(reviewsParam, user); return result; } + + /*@Post() + async postReviews(@Body() reviewsBody: postReviewDto,@GetUser() user: session_userprofile): Promise { + if(user){ + const lecture = user. + } + }*/ } diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index d8a63a22..83eea517 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,5 +1,5 @@ import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.dto'; +import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; import { Injectable } from '@nestjs/common'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index ce2b0466..0a3446f9 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -61,6 +61,14 @@ export class ReviewsRepository { subject_courseuser: true, }, }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, }, skip: offset, take: limit, From ba31cf6e5bdd580a8cd5cdb2810f17fba453c232 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 2 Aug 2023 21:30:40 +0900 Subject: [PATCH 086/250] Add: Test Complete - /api/lectures - /api/lectures/{lectureId} - session/info --- .../serializer/examtime.serializer.ts | 2 +- src/modules/auth/guard/mock-auth-guard.ts | 2 -- src/prisma/repositories/lecture.repository.ts | 5 ++++- src/prisma/repositories/review.repository.ts | 18 ++++++++++++++---- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/common/interfaces/serializer/examtime.serializer.ts b/src/common/interfaces/serializer/examtime.serializer.ts index 988f6d71..2246e348 100644 --- a/src/common/interfaces/serializer/examtime.serializer.ts +++ b/src/common/interfaces/serializer/examtime.serializer.ts @@ -14,5 +14,5 @@ export const toJsonExamtime = (examtime: subject_examtime) => { } const timeFormatter = (time: Date) => { - return `${time.getUTCHours()}:${time.getUTCMinutes().toString().padStart(2, '0')}`; + return `${time.getUTCHours().toString().padStart(2,'0')}:${time.getUTCMinutes().toString().padStart(2, '0')}`; } \ No newline at end of file diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index b73444cc..508e33e3 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -26,7 +26,6 @@ export class MockAuthGuard implements CanActivate{ request["user"] = user; return this.determineAuth(context, true); }else{ - console.log("YYYY"); const accessToken = this.extractTokenFromCookie(request, "accessToken"); try { if (!accessToken) throw new Error("jwt expired"); @@ -59,7 +58,6 @@ export class MockAuthGuard implements CanActivate{ } return this.determineAuth(context, false); } catch (e) { - console.log("XXXX"); const result = this.determineAuth(context, false); if (result) { return result; diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 5a4cdf19..8e6f0857 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -145,7 +145,10 @@ export class LectureRepository { include:{ professor: true } - } + }, + subject_department: true, + subject_examtime: true, + subject_classtime: true, } } } diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 0a3446f9..f5f1575d 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -12,13 +12,23 @@ export class ReviewsRepository { async findReviewByUser(user: session_userprofile): Promise{ const reviews = await this.prisma.review_review.findMany({ where: { writer_id: user.id }, - include:{ + include: { course: { - include:{ + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, lecture: true, - } + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, }, - lecture: true, } }) return reviews as review_review[]; From 902b80eab92a387922190b150a5381523cc7640c Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 2 Aug 2023 23:20:01 +0900 Subject: [PATCH 087/250] Add: Type Conversion --- package-lock.json | 2958 ++--------------- package.json | 1 - ...re.query.dto.ts => lecture.request.dto.ts} | 2 +- .../dto/professor/professor.response.dto.ts | 1 - .../serializer/classtime.serializer.ts | 2 +- .../serializer/course.serializer.ts | 17 +- .../serializer/department.serializer.ts | 2 +- .../serializer/examtime.serializer.ts | 2 +- .../serializer/lecture.serializer.ts | 6 +- .../serializer/professor.serializer.ts | 4 +- .../serializer/review.serializer.ts | 11 +- src/common/schemaTypes/types.ts | 32 + src/common/utils/lecture.utils.ts | 2 +- src/common/utils/method.utils.ts | 2 + src/modules/courses/courses.service.ts | 14 +- src/modules/lectures/lectures.controller.ts | 4 +- src/modules/lectures/lectures.service.ts | 8 +- src/modules/reviews/reviews.controller.ts | 5 +- src/modules/reviews/reviews.service.ts | 3 +- src/modules/user/user.service.ts | 7 +- .../generated/prisma-class/auth_group.ts | 17 - .../prisma-class/auth_group_permissions.ts | 20 - .../generated/prisma-class/auth_permission.ts | 27 - .../generated/prisma-class/auth_user.ts | 48 - .../prisma-class/auth_user_groups.ts | 20 - .../auth_user_user_permissions.ts | 20 - .../prisma-class/django_admin_log.ts | 35 - .../prisma-class/django_content_type.ts | 20 - .../prisma-class/django_migrations.ts | 15 - .../generated/prisma-class/django_session.ts | 12 - .../graduation_additionaltrack.ts | 32 - .../prisma-class/graduation_generaltrack.ts | 49 - .../prisma-class/graduation_majortrack.ts | 32 - src/prisma/generated/prisma-class/index.ts | 174 - .../main_famoushumanityreviewdailyfeed.ts | 22 - ...n_famoushumanityreviewdailyfeed_reviews.ts | 20 - .../main_famousmajorreviewdailyfeed.ts | 29 - ...main_famousmajorreviewdailyfeed_reviews.ts | 20 - .../main_rankedreviewdailyfeed.ts | 22 - .../prisma-class/main_ratedailyuserfeed.ts | 22 - .../main_relatedcoursedailyuserfeed.ts | 29 - .../main_reviewwritedailyuserfeed.ts | 29 - .../planner_arbitraryplanneritem.ts | 41 - .../prisma-class/planner_futureplanneritem.ts | 29 - .../generated/prisma-class/planner_planner.ts | 52 - .../planner_planner_additional_tracks.ts | 20 - .../prisma-class/planner_takenplanneritem.ts | 23 - .../prisma-class/review_humanitybestreview.ts | 6 - .../prisma-class/review_majorbestreview.ts | 6 - .../generated/prisma-class/review_review.ts | 72 - .../prisma-class/review_reviewvote.ts | 23 - .../prisma-class/session_userprofile.ts | 103 - ...ession_userprofile_favorite_departments.ts | 20 - .../session_userprofile_majors.ts | 20 - .../session_userprofile_minors.ts | 20 - .../session_userprofile_specialized_major.ts | 20 - .../session_userprofile_taken_lectures.ts | 20 - .../prisma-class/subject_classtime.ts | 40 - .../generated/prisma-class/subject_course.ts | 111 - .../prisma-class/subject_course_professors.ts | 20 - ...ubject_course_related_courses_posterior.ts | 19 - .../subject_course_related_courses_prior.ts | 19 - .../prisma-class/subject_courseuser.ts | 23 - .../prisma-class/subject_department.ts | 71 - .../prisma-class/subject_examtime.ts | 22 - .../generated/prisma-class/subject_lecture.ts | 156 - .../subject_lecture_professors.ts | 20 - .../prisma-class/subject_professor.ts | 47 - .../subject_professor_course_list.ts | 12 - .../prisma-class/subject_semester.ts | 43 - .../generated/prisma-class/support_notice.ts | 18 - .../generated/prisma-class/support_rate.ts | 25 - .../prisma-class/timetable_oldtimetable.ts | 22 - .../timetable_oldtimetable_lectures.ts | 20 - .../prisma-class/timetable_timetable.ts | 26 - .../timetable_timetable_lectures.ts | 20 - .../prisma-class/timetable_wishlist.ts | 17 - .../timetable_wishlist_lectures.ts | 20 - src/prisma/repositories/course.repository.ts | 27 +- src/prisma/repositories/lecture.repository.ts | 24 +- src/prisma/repositories/review.repository.ts | 14 +- test/typeTest.ts | 36 + 82 files changed, 399 insertions(+), 4745 deletions(-) rename src/common/interfaces/dto/lecture/{lecture.query.dto.ts => lecture.request.dto.ts} (95%) delete mode 100644 src/prisma/generated/prisma-class/auth_group.ts delete mode 100644 src/prisma/generated/prisma-class/auth_group_permissions.ts delete mode 100644 src/prisma/generated/prisma-class/auth_permission.ts delete mode 100644 src/prisma/generated/prisma-class/auth_user.ts delete mode 100644 src/prisma/generated/prisma-class/auth_user_groups.ts delete mode 100644 src/prisma/generated/prisma-class/auth_user_user_permissions.ts delete mode 100644 src/prisma/generated/prisma-class/django_admin_log.ts delete mode 100644 src/prisma/generated/prisma-class/django_content_type.ts delete mode 100644 src/prisma/generated/prisma-class/django_migrations.ts delete mode 100644 src/prisma/generated/prisma-class/django_session.ts delete mode 100644 src/prisma/generated/prisma-class/graduation_additionaltrack.ts delete mode 100644 src/prisma/generated/prisma-class/graduation_generaltrack.ts delete mode 100644 src/prisma/generated/prisma-class/graduation_majortrack.ts delete mode 100644 src/prisma/generated/prisma-class/index.ts delete mode 100644 src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts delete mode 100644 src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts delete mode 100644 src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts delete mode 100644 src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts delete mode 100644 src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts delete mode 100644 src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts delete mode 100644 src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts delete mode 100644 src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts delete mode 100644 src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts delete mode 100644 src/prisma/generated/prisma-class/planner_futureplanneritem.ts delete mode 100644 src/prisma/generated/prisma-class/planner_planner.ts delete mode 100644 src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts delete mode 100644 src/prisma/generated/prisma-class/planner_takenplanneritem.ts delete mode 100644 src/prisma/generated/prisma-class/review_humanitybestreview.ts delete mode 100644 src/prisma/generated/prisma-class/review_majorbestreview.ts delete mode 100644 src/prisma/generated/prisma-class/review_review.ts delete mode 100644 src/prisma/generated/prisma-class/review_reviewvote.ts delete mode 100644 src/prisma/generated/prisma-class/session_userprofile.ts delete mode 100644 src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts delete mode 100644 src/prisma/generated/prisma-class/session_userprofile_majors.ts delete mode 100644 src/prisma/generated/prisma-class/session_userprofile_minors.ts delete mode 100644 src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts delete mode 100644 src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts delete mode 100644 src/prisma/generated/prisma-class/subject_classtime.ts delete mode 100644 src/prisma/generated/prisma-class/subject_course.ts delete mode 100644 src/prisma/generated/prisma-class/subject_course_professors.ts delete mode 100644 src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts delete mode 100644 src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts delete mode 100644 src/prisma/generated/prisma-class/subject_courseuser.ts delete mode 100644 src/prisma/generated/prisma-class/subject_department.ts delete mode 100644 src/prisma/generated/prisma-class/subject_examtime.ts delete mode 100644 src/prisma/generated/prisma-class/subject_lecture.ts delete mode 100644 src/prisma/generated/prisma-class/subject_lecture_professors.ts delete mode 100644 src/prisma/generated/prisma-class/subject_professor.ts delete mode 100644 src/prisma/generated/prisma-class/subject_professor_course_list.ts delete mode 100644 src/prisma/generated/prisma-class/subject_semester.ts delete mode 100644 src/prisma/generated/prisma-class/support_notice.ts delete mode 100644 src/prisma/generated/prisma-class/support_rate.ts delete mode 100644 src/prisma/generated/prisma-class/timetable_oldtimetable.ts delete mode 100644 src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts delete mode 100644 src/prisma/generated/prisma-class/timetable_timetable.ts delete mode 100644 src/prisma/generated/prisma-class/timetable_timetable_lectures.ts delete mode 100644 src/prisma/generated/prisma-class/timetable_wishlist.ts delete mode 100644 src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts create mode 100644 test/typeTest.ts diff --git a/package-lock.json b/package-lock.json index 8b489212..25db5fbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,6 @@ "passport": "^0.6.0", "passport-jwt": "^4.0.1", "prisma": "4.16.0", - "prisma-class-generator": "^0.2.7", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" @@ -205,24 +204,11 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/@antfu/ni": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.4.tgz", - "integrity": "sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==", - "bin": { - "na": "bin/na.mjs", - "nci": "bin/nci.mjs", - "ni": "bin/ni.mjs", - "nlx": "bin/nlx.mjs", - "nr": "bin/nr.mjs", - "nu": "bin/nu.mjs", - "nun": "bin/nun.mjs" - } - }, "node_modules/@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -446,6 +432,7 @@ "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -477,6 +464,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -490,6 +478,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -501,6 +490,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -514,6 +504,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -521,12 +512,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -535,6 +528,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -543,6 +537,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1887,6 +1882,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1899,6 +1895,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } @@ -1907,6 +1904,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1932,14 +1930,6 @@ "npm": ">=5.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@prisma/client": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.0.tgz", @@ -1960,16 +1950,6 @@ } } }, - "node_modules/@prisma/debug": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.16.2.tgz", - "integrity": "sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==", - "dependencies": { - "@types/debug": "4.1.8", - "debug": "4.3.4", - "strip-ansi": "6.0.1" - } - }, "node_modules/@prisma/engines": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.0.tgz", @@ -1981,216 +1961,6 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c.tgz", "integrity": "sha512-tMWAF/qF00fbUH1HB4Yjmz6bjh7fzkb7Y3NRoUfMlHu6V+O45MGvqwYxqwBjn1BIUXkl3r04W351D4qdJjrgvA==" }, - "node_modules/@prisma/fetch-engine": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.16.2.tgz", - "integrity": "sha512-lnCnHcOaNn0kw8qTJbVcNhyfIf5Lus2GFXbj3qpkdKEIB9xLgqkkuTP+35q1xFaqwQ0vy4HFpdRUpFP7njE15g==", - "dependencies": { - "@prisma/debug": "4.16.2", - "@prisma/get-platform": "4.16.2", - "execa": "5.1.1", - "find-cache-dir": "3.3.2", - "fs-extra": "11.1.1", - "hasha": "5.2.2", - "http-proxy-agent": "7.0.0", - "https-proxy-agent": "7.0.0", - "kleur": "4.1.5", - "node-fetch": "2.6.11", - "p-filter": "2.1.0", - "p-map": "4.0.0", - "p-retry": "4.6.2", - "progress": "2.0.3", - "rimraf": "3.0.2", - "temp-dir": "2.0.0", - "tempy": "1.0.1" - } - }, - "node_modules/@prisma/fetch-engine/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@prisma/fetch-engine/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@prisma/fetch-engine/node_modules/https-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", - "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@prisma/fetch-engine/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@prisma/generator-helper": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.16.2.tgz", - "integrity": "sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==", - "dependencies": { - "@prisma/debug": "4.16.2", - "@types/cross-spawn": "6.0.2", - "cross-spawn": "7.0.3", - "kleur": "4.1.5" - } - }, - "node_modules/@prisma/generator-helper/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@prisma/get-platform": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.16.2.tgz", - "integrity": "sha512-fnDey1/iSefHJRMB+w243BhWENf+paRouPMdCqIVqu8dYkR1NqhldblsSUC4Zr2sKS7Ta2sK4OLdt9IH+PZTfw==", - "dependencies": { - "@prisma/debug": "4.16.2", - "escape-string-regexp": "4.0.0", - "execa": "5.1.1", - "fs-jetpack": "5.1.0", - "kleur": "4.1.5", - "replace-string": "3.1.0", - "strip-ansi": "6.0.1", - "tempy": "1.0.1", - "terminal-link": "2.1.1", - "ts-pattern": "4.3.0" - } - }, - "node_modules/@prisma/get-platform/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@prisma/internals": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.16.2.tgz", - "integrity": "sha512-/3OiSADA3RRgsaeEE+MDsBgL6oAMwddSheXn6wtYGUnjERAV/BmF5bMMLnTykesQqwZ1s8HrISrJ0Vf6cjOxMg==", - "dependencies": { - "@antfu/ni": "0.21.4", - "@opentelemetry/api": "1.4.1", - "@prisma/debug": "4.16.2", - "@prisma/engines": "4.16.2", - "@prisma/fetch-engine": "4.16.2", - "@prisma/generator-helper": "4.16.2", - "@prisma/get-platform": "4.16.2", - "@prisma/prisma-fmt-wasm": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "archiver": "5.3.1", - "arg": "5.0.2", - "checkpoint-client": "1.1.24", - "cli-truncate": "2.1.0", - "dotenv": "16.0.3", - "escape-string-regexp": "4.0.0", - "execa": "5.1.1", - "find-up": "5.0.0", - "fp-ts": "2.16.0", - "fs-extra": "11.1.1", - "fs-jetpack": "5.1.0", - "global-dirs": "3.0.1", - "globby": "11.1.0", - "indent-string": "4.0.0", - "is-windows": "1.0.2", - "is-wsl": "2.2.0", - "kleur": "4.1.5", - "new-github-issue-url": "0.2.1", - "node-fetch": "2.6.11", - "npm-packlist": "5.1.3", - "open": "7.4.2", - "p-map": "4.0.0", - "prompts": "2.4.2", - "read-pkg-up": "7.0.1", - "replace-string": "3.1.0", - "resolve": "1.22.2", - "string-width": "4.2.3", - "strip-ansi": "6.0.1", - "strip-indent": "3.0.0", - "temp-dir": "2.0.0", - "temp-write": "4.0.0", - "tempy": "1.0.1", - "terminal-link": "2.1.1", - "tmp": "0.2.1", - "ts-pattern": "4.3.0" - } - }, - "node_modules/@prisma/internals/node_modules/@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", - "hasInstallScript": true - }, - "node_modules/@prisma/internals/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/@prisma/internals/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@prisma/internals/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@prisma/internals/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/@prisma/prisma-fmt-wasm": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-g090+dEH7wrdCw359+8J9+TGH84qK28V/dxwINjhhNCtju9lej99z9w/AVsJP9UhhcCPS4psYz4iu8d53uxVpA==" - }, "node_modules/@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", @@ -2320,22 +2090,6 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, - "node_modules/@types/cross-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", - "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -2461,21 +2215,11 @@ "@types/node": "*" } }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, "node_modules/@types/node": { "version": "16.18.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==" }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -2535,11 +2279,6 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -3013,18 +2752,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -3071,6 +2798,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "dependencies": { "type-fest": "^0.21.3" }, @@ -3085,6 +2813,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, "engines": { "node": ">=10" }, @@ -3137,56 +2866,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, - "node_modules/archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -3232,6 +2911,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { "node": ">=8" } @@ -3242,19 +2922,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3370,6 +3037,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, "funding": [ { "type": "github", @@ -3427,6 +3095,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3437,6 +3106,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3495,6 +3165,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3555,6 +3226,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -3574,14 +3246,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -3643,15 +3307,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3681,16 +3336,6 @@ } ] }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3706,25 +3351,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -3740,25 +3366,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "node_modules/checkpoint-client": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.24.tgz", - "integrity": "sha512-nIOlLhDS7MKs4tUzS3LCm+sE1NgTCVnVrXlD0RRxaoEkkLu8LIWSUNiNWai6a+LK5unLzTyZeTCYX1Smqy0YoA==", - "dependencies": { - "ci-info": "3.8.0", - "env-paths": "2.2.1", - "fast-write-atomic": "0.2.1", - "make-dir": "3.1.0", - "ms": "2.1.3", - "node-fetch": "2.6.11", - "uuid": "9.0.0" - } - }, - "node_modules/checkpoint-client/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -3807,6 +3414,7 @@ "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, "funding": [ { "type": "github", @@ -3838,14 +3446,6 @@ "validator": "^13.7.0" } }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -3885,21 +3485,6 @@ "@colors/colors": "1.5.0" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -4000,44 +3585,12 @@ "node": ">= 6" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "node_modules/compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4072,16 +3625,6 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -4179,42 +3722,6 @@ "node": ">=10" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -4234,14 +3741,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4291,27 +3790,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4391,6 +3869,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -4410,15 +3889,6 @@ "node": ">=6.0.0" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -4497,6 +3967,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "dependencies": { "once": "^1.4.0" } @@ -4514,18 +3985,11 @@ "node": ">=10.13.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -4554,6 +4018,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -4843,6 +4308,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -5051,6 +4517,7 @@ "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5079,15 +4546,11 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/fast-write-atomic": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz", - "integrity": "sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==" - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5141,6 +4604,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5178,26 +4642,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5325,11 +4774,6 @@ "node": ">= 0.6" } }, - "node_modules/fp-ts": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz", - "integrity": "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==" - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -5338,11 +4782,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "node_modules/fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -5357,33 +4796,6 @@ "node": ">=14.14" } }, - "node_modules/fs-jetpack": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", - "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/fs-jetpack/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/fs-jetpack/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -5504,6 +4916,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { "node": ">=10" }, @@ -5534,6 +4947,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -5547,20 +4961,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -5580,6 +4980,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -5598,7 +4999,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -5641,29 +5043,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, "node_modules/hashring": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", @@ -5673,15 +5052,6 @@ "simple-lru-cache": "0.0.x" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", @@ -5691,11 +5061,6 @@ "node": ">=8" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5717,29 +5082,6 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -5756,6 +5098,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, "engines": { "node": ">=10.17.0" } @@ -5775,6 +5118,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -5794,40 +5138,11 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5872,14 +5187,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5894,14 +5201,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -5948,7 +5247,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -5966,6 +5266,7 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -5973,24 +5274,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -6016,6 +5304,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6036,22 +5325,16 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6060,6 +5343,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, "engines": { "node": ">=8" }, @@ -6079,25 +5363,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6803,7 +6068,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -6831,7 +6097,8 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", @@ -6867,6 +6134,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -6912,21 +6180,11 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -6957,7 +6215,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/loader-runner": { "version": "4.3.0", @@ -6972,6 +6231,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -6987,26 +6247,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -7019,11 +6259,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -7040,14 +6275,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -7155,12 +6382,14 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -7177,6 +6406,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -7219,18 +6449,11 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7391,23 +6614,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/new-github-issue-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", - "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -7473,134 +6679,44 @@ "node": ">=6" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "path-key": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" } }, - "node_modules/npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-packlist/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" } }, "node_modules/object-inspect": { @@ -7642,6 +6758,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -7652,21 +6769,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -7732,29 +6834,11 @@ "node": ">=0.10.0" } }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-filter/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "engines": { - "node": ">=6" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -7769,6 +6853,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -7779,49 +6864,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7838,6 +6889,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -7859,15 +6911,6 @@ "node": ">= 0.8" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/passport": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", @@ -7902,19 +6945,11 @@ "node": ">= 0.4.0" } }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -7938,7 +6973,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "node_modules/path-scurry": { "version": "1.6.3", @@ -7974,6 +7010,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } @@ -7993,6 +7030,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -8013,6 +7051,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -8024,6 +7063,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8036,6 +7076,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -8047,6 +7088,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -8061,6 +7103,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -8156,52 +7199,16 @@ "node": ">=14.17" } }, - "node_modules/prisma-class-generator": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/prisma-class-generator/-/prisma-class-generator-0.2.7.tgz", - "integrity": "sha512-zFicPSAqHSOY2DAfnCrcwxUIFLOLhrxVlOmrT8nB3SQbEP66tIaCf/Z+2y85pawIfXhacZL3QoWArqnbdJOMDg==", - "dependencies": { - "@prisma/client": "^4.12.0", - "@prisma/generator-helper": "^4.12.0", - "@prisma/internals": "^4.12.0", - "change-case": "^4.1.2", - "prettier": "2.5.1" - }, - "bin": { - "prisma-class-generator": "dist/bin.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/prisma-class-generator/node_modules/prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -8264,6 +7271,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -8324,100 +7332,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -8437,33 +7351,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -8493,17 +7380,6 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "node_modules/replace-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", - "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8526,6 +7402,7 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -8590,18 +7467,11 @@ "node": ">=8" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -8634,6 +7504,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -8804,16 +7675,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -8909,38 +7770,18 @@ "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -8976,34 +7817,6 @@ "deprecated": "Please use @jridgewell/sourcemap-codec instead", "dev": true }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -9110,21 +7923,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, "engines": { "node": ">=6" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -9198,6 +8001,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -9210,6 +8014,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -9241,47 +8046,19 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, "node_modules/tar/node_modules/minipass": { @@ -9308,79 +8085,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-write": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", - "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", - "dependencies": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/temp-write/node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/temp-write/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -9536,6 +8245,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -9666,11 +8376,6 @@ } } }, - "node_modules/ts-pattern": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", - "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" - }, "node_modules/tsconfig-paths": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz", @@ -9839,21 +8544,11 @@ "node": ">= 0.8" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -9892,22 +8587,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -9930,14 +8609,6 @@ "node": ">= 0.4.0" } }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -9958,15 +8629,6 @@ "node": ">=10.12.0" } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -10299,38 +8961,13 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } } }, "dependencies": { @@ -10443,15 +9080,11 @@ } } }, - "@antfu/ni": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@antfu/ni/-/ni-0.21.4.tgz", - "integrity": "sha512-O0Uv9LbLDSoEg26fnMDdDRiPwFJnQSoD4WnrflDwKCJm8Cx/0mV4cGxwBLXan5mGIrpK4Dd7vizf4rQm0QCEAA==" - }, "@babel/code-frame": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, "requires": { "@babel/highlight": "^7.18.6" } @@ -10622,7 +9255,8 @@ "@babel/helper-validator-identifier": { "version": "7.19.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true }, "@babel/helper-validator-option": { "version": "7.21.0", @@ -10645,6 +9279,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -10655,6 +9290,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -10663,6 +9299,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -10673,6 +9310,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -10680,22 +9318,26 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -11662,6 +10304,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -11670,12 +10313,14 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -11691,11 +10336,6 @@ "node-fetch": "^2.6.1" } }, - "@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==" - }, "@prisma/client": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.0.tgz", @@ -11704,16 +10344,6 @@ "@prisma/engines-version": "4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c" } }, - "@prisma/debug": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-4.16.2.tgz", - "integrity": "sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==", - "requires": { - "@types/debug": "4.1.8", - "debug": "4.3.4", - "strip-ansi": "6.0.1" - } - }, "@prisma/engines": { "version": "4.16.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.0.tgz", @@ -11724,196 +10354,6 @@ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.0-66.b20ead4d3ab9e78ac112966e242ded703f4a052c.tgz", "integrity": "sha512-tMWAF/qF00fbUH1HB4Yjmz6bjh7fzkb7Y3NRoUfMlHu6V+O45MGvqwYxqwBjn1BIUXkl3r04W351D4qdJjrgvA==" }, - "@prisma/fetch-engine": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-4.16.2.tgz", - "integrity": "sha512-lnCnHcOaNn0kw8qTJbVcNhyfIf5Lus2GFXbj3qpkdKEIB9xLgqkkuTP+35q1xFaqwQ0vy4HFpdRUpFP7njE15g==", - "requires": { - "@prisma/debug": "4.16.2", - "@prisma/get-platform": "4.16.2", - "execa": "5.1.1", - "find-cache-dir": "3.3.2", - "fs-extra": "11.1.1", - "hasha": "5.2.2", - "http-proxy-agent": "7.0.0", - "https-proxy-agent": "7.0.0", - "kleur": "4.1.5", - "node-fetch": "2.6.11", - "p-filter": "2.1.0", - "p-map": "4.0.0", - "p-retry": "4.6.2", - "progress": "2.0.3", - "rimraf": "3.0.2", - "temp-dir": "2.0.0", - "tempy": "1.0.1" - }, - "dependencies": { - "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "requires": { - "debug": "^4.3.4" - } - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "https-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", - "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - } - } - }, - "@prisma/generator-helper": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/generator-helper/-/generator-helper-4.16.2.tgz", - "integrity": "sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==", - "requires": { - "@prisma/debug": "4.16.2", - "@types/cross-spawn": "6.0.2", - "cross-spawn": "7.0.3", - "kleur": "4.1.5" - }, - "dependencies": { - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - } - } - }, - "@prisma/get-platform": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-4.16.2.tgz", - "integrity": "sha512-fnDey1/iSefHJRMB+w243BhWENf+paRouPMdCqIVqu8dYkR1NqhldblsSUC4Zr2sKS7Ta2sK4OLdt9IH+PZTfw==", - "requires": { - "@prisma/debug": "4.16.2", - "escape-string-regexp": "4.0.0", - "execa": "5.1.1", - "fs-jetpack": "5.1.0", - "kleur": "4.1.5", - "replace-string": "3.1.0", - "strip-ansi": "6.0.1", - "tempy": "1.0.1", - "terminal-link": "2.1.1", - "ts-pattern": "4.3.0" - }, - "dependencies": { - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - } - } - }, - "@prisma/internals": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/internals/-/internals-4.16.2.tgz", - "integrity": "sha512-/3OiSADA3RRgsaeEE+MDsBgL6oAMwddSheXn6wtYGUnjERAV/BmF5bMMLnTykesQqwZ1s8HrISrJ0Vf6cjOxMg==", - "requires": { - "@antfu/ni": "0.21.4", - "@opentelemetry/api": "1.4.1", - "@prisma/debug": "4.16.2", - "@prisma/engines": "4.16.2", - "@prisma/fetch-engine": "4.16.2", - "@prisma/generator-helper": "4.16.2", - "@prisma/get-platform": "4.16.2", - "@prisma/prisma-fmt-wasm": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "archiver": "5.3.1", - "arg": "5.0.2", - "checkpoint-client": "1.1.24", - "cli-truncate": "2.1.0", - "dotenv": "16.0.3", - "escape-string-regexp": "4.0.0", - "execa": "5.1.1", - "find-up": "5.0.0", - "fp-ts": "2.16.0", - "fs-extra": "11.1.1", - "fs-jetpack": "5.1.0", - "global-dirs": "3.0.1", - "globby": "11.1.0", - "indent-string": "4.0.0", - "is-windows": "1.0.2", - "is-wsl": "2.2.0", - "kleur": "4.1.5", - "new-github-issue-url": "0.2.1", - "node-fetch": "2.6.11", - "npm-packlist": "5.1.3", - "open": "7.4.2", - "p-map": "4.0.0", - "prompts": "2.4.2", - "read-pkg-up": "7.0.1", - "replace-string": "3.1.0", - "resolve": "1.22.2", - "string-width": "4.2.3", - "strip-ansi": "6.0.1", - "strip-indent": "3.0.0", - "temp-dir": "2.0.0", - "temp-write": "4.0.0", - "tempy": "1.0.1", - "terminal-link": "2.1.1", - "tmp": "0.2.1", - "ts-pattern": "4.3.0" - }, - "dependencies": { - "@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==" - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - } - } - }, - "@prisma/prisma-fmt-wasm": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/prisma-fmt-wasm/-/prisma-fmt-wasm-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-g090+dEH7wrdCw359+8J9+TGH84qK28V/dxwINjhhNCtju9lej99z9w/AVsJP9UhhcCPS4psYz4iu8d53uxVpA==" - }, "@sinclair/typebox": { "version": "0.24.51", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", @@ -12043,22 +10483,6 @@ "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", "dev": true }, - "@types/cross-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.2.tgz", - "integrity": "sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==", - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "requires": { - "@types/ms": "*" - } - }, "@types/eslint": { "version": "8.37.0", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", @@ -12184,21 +10608,11 @@ "@types/node": "*" } }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, "@types/node": { "version": "16.18.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==" }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -12258,11 +10672,6 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -12628,15 +11037,6 @@ "debug": "4" } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -12668,6 +11068,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, "requires": { "type-fest": "^0.21.3" }, @@ -12675,7 +11076,8 @@ "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true } } }, @@ -12712,49 +11114,6 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, - "archiver": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", - "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", - "requires": { - "archiver-utils": "^2.1.0", - "async": "^3.2.3", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "requires": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - } - }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -12795,7 +11154,8 @@ "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true }, "asap": { "version": "2.0.6", @@ -12803,16 +11163,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -12906,7 +11256,8 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "basic-auth": { "version": "2.0.1", @@ -12942,6 +11293,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -12952,6 +11304,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13007,6 +11360,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -13045,16 +11399,12 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -13104,15 +11454,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -13125,16 +11466,6 @@ "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", "dev": true }, - "capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13144,25 +11475,6 @@ "supports-color": "^7.1.0" } }, - "change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "requires": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -13175,27 +11487,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "checkpoint-client": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/checkpoint-client/-/checkpoint-client-1.1.24.tgz", - "integrity": "sha512-nIOlLhDS7MKs4tUzS3LCm+sE1NgTCVnVrXlD0RRxaoEkkLu8LIWSUNiNWai6a+LK5unLzTyZeTCYX1Smqy0YoA==", - "requires": { - "ci-info": "3.8.0", - "env-paths": "2.2.1", - "fast-write-atomic": "0.2.1", - "make-dir": "3.1.0", - "ms": "2.1.3", - "node-fetch": "2.6.11", - "uuid": "9.0.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -13226,7 +11517,8 @@ "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true }, "cjs-module-lexer": { "version": "1.2.2", @@ -13249,11 +11541,6 @@ "validator": "^13.7.0" } }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -13273,18 +11560,9 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, "requires": { - "slice-ansi": "^3.0.0", + "@colors/colors": "1.5.0", "string-width": "^4.2.0" } }, @@ -13363,40 +11641,12 @@ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "compress-commons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", - "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", - "requires": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -13428,16 +11678,6 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, - "constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -13516,32 +11756,6 @@ "yaml": "^1.10.0" } }, - "crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - }, - "crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "requires": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -13558,11 +11772,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -13598,21 +11807,6 @@ "clone": "^1.0.2" } }, - "del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -13670,6 +11864,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "requires": { "path-type": "^4.0.0" } @@ -13683,15 +11878,6 @@ "esutils": "^2.0.2" } }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -13752,6 +11938,7 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -13766,15 +11953,11 @@ "tapable": "^2.2.0" } }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -13799,7 +11982,8 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true }, "eslint": { "version": "8.37.0", @@ -14004,6 +12188,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -14185,6 +12370,7 @@ "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -14210,15 +12396,11 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "fast-write-atomic": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fast-write-atomic/-/fast-write-atomic-0.2.1.tgz", - "integrity": "sha512-WvJe06IfNYlr+6cO3uQkdKdy3Cb1LlCJSF8zRs2eT8yuhdbSlR9nIt+TgQ92RUxiRrQm+/S7RARnMfCs5iuAjw==" - }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "requires": { "reusify": "^1.0.4" } @@ -14262,6 +12444,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -14295,20 +12478,11 @@ } } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14395,21 +12569,11 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, - "fp-ts": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz", - "integrity": "sha512-bLq+KgbiXdTEoT1zcARrWEpa5z6A/8b7PcDW7Gef3NSisQ+VS7ll2Xbf1E+xsgik0rWub/8u0qP/iTTjj+PhxQ==" - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, "fs-extra": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", @@ -14421,32 +12585,6 @@ "universalify": "^2.0.0" } }, - "fs-jetpack": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz", - "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==", - "requires": { - "minimatch": "^5.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "fs-minipass": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", @@ -14540,7 +12678,8 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true }, "glob": { "version": "7.2.3", @@ -14559,6 +12698,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -14569,14 +12709,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "requires": { - "ini": "2.0.0" - } - }, "globals": { "version": "13.20.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", @@ -14590,6 +12722,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -14602,7 +12735,8 @@ "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "grapheme-splitter": { "version": "1.0.4", @@ -14633,22 +12767,6 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, "hashring": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", @@ -14658,26 +12776,12 @@ "simple-lru-cache": "0.0.x" } }, - "header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "requires": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "hexoid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", "dev": true }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -14696,25 +12800,6 @@ "toidentifier": "1.0.1" } }, - "http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "dependencies": { - "agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "requires": { - "debug": "^4.3.4" - } - } - } - }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -14727,7 +12812,8 @@ "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true }, "iconv-lite": { "version": "0.4.24", @@ -14740,38 +12826,14 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, - "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true }, "import-fresh": { "version": "3.3.0", @@ -14799,11 +12861,6 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -14818,11 +12875,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - }, "inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -14860,7 +12912,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, "is-binary-path": { "version": "2.1.0", @@ -14875,19 +12928,16 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, "requires": { "has": "^1.0.3" } }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -14904,6 +12954,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -14917,22 +12968,20 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true }, "is-unicode-supported": { "version": "0.1.0", @@ -14940,19 +12989,6 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "requires": { - "is-docker": "^2.0.0" - } - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -15503,7 +13539,8 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "js-yaml": { "version": "4.1.0", @@ -15522,7 +13559,8 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "json-schema-traverse": { "version": "1.0.0", @@ -15552,6 +13590,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -15590,15 +13629,8 @@ "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "requires": { - "readable-stream": "^2.0.5" - } + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true }, "leven": { "version": "3.1.0", @@ -15624,7 +13656,8 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "loader-runner": { "version": "4.3.0", @@ -15636,6 +13669,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "requires": { "p-locate": "^5.0.0" } @@ -15645,26 +13679,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -15677,11 +13691,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" - }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -15692,14 +13701,6 @@ "is-unicode-supported": "^0.1.0" } }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "requires": { - "tslib": "^2.0.3" - } - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -15785,12 +13786,14 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true }, "methods": { "version": "1.1.2", @@ -15801,6 +13804,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -15827,12 +13831,8 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true }, "minimatch": { "version": "3.1.2", @@ -15968,20 +13968,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "new-github-issue-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz", - "integrity": "sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==" - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -16030,87 +14016,17 @@ "abbrev": "1" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "requires": { - "npm-normalize-package-bin": "^2.0.0" - } - }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==" - }, - "npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, "requires": { "path-key": "^3.0.0" } @@ -16161,19 +14077,11 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -16221,25 +14129,11 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "requires": { - "p-map": "^2.0.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" - } - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "requires": { "yocto-queue": "^0.1.0" } @@ -16248,40 +14142,16 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "requires": { "p-limit": "^3.0.2" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "parent-module": { "version": "1.0.1", @@ -16296,6 +14166,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -16308,15 +14179,6 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "passport": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", @@ -16341,19 +14203,11 @@ "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==" }, - "path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -16368,7 +14222,8 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, "path-scurry": { "version": "1.6.3", @@ -16396,7 +14251,8 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "pause": { "version": "0.0.1", @@ -16412,7 +14268,8 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "pirates": { "version": "4.0.5", @@ -16424,6 +14281,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "requires": { "find-up": "^4.0.0" }, @@ -16432,6 +14290,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -16441,6 +14300,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -16449,6 +14309,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -16457,6 +14318,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -16518,39 +14380,16 @@ "@prisma/engines": "4.16.0" } }, - "prisma-class-generator": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/prisma-class-generator/-/prisma-class-generator-0.2.7.tgz", - "integrity": "sha512-zFicPSAqHSOY2DAfnCrcwxUIFLOLhrxVlOmrT8nB3SQbEP66tIaCf/Z+2y85pawIfXhacZL3QoWArqnbdJOMDg==", - "requires": { - "@prisma/client": "^4.12.0", - "@prisma/generator-helper": "^4.12.0", - "@prisma/internals": "^4.12.0", - "change-case": "^4.1.2", - "prettier": "2.5.1" - }, - "dependencies": { - "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==" - } - } - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" - }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -16597,7 +14436,8 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, "random-bytes": { "version": "1.0.0", @@ -16635,74 +14475,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -16724,32 +14496,6 @@ } } }, - "readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "requires": { - "minimatch": "^5.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -16773,11 +14519,6 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, - "replace-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/replace-string/-/replace-string-3.1.0.tgz", - "integrity": "sha512-yPpxc4ZR2makceA9hy/jHNqc7QVkd4Je/N0WRHm6bs3PtivPuPynxE5ejU/mp5EhnCv8+uZL7vhz8rkluSlx+Q==" - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -16794,6 +14535,7 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, "requires": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -16839,15 +14581,11 @@ "signal-exit": "^3.0.2" } }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, "rimraf": { "version": "3.0.2", @@ -16867,6 +14605,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -16992,16 +14731,6 @@ } } }, - "sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "serialize-javascript": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", @@ -17079,31 +14808,14 @@ "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "source-map": { "version": "0.7.4", @@ -17135,34 +14847,6 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -17248,15 +14932,8 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true }, "strip-json-comments": { "version": "3.1.1", @@ -17312,6 +14989,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, "requires": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -17320,7 +14998,8 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true }, "swagger-ui-dist": { "version": "5.1.0", @@ -17369,82 +15048,11 @@ } } }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==" - }, - "temp-write": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-4.0.0.tgz", - "integrity": "sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw==", - "requires": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "requires": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==" - } - } - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, "requires": { "ansi-escapes": "^4.2.1", "supports-hyperlinks": "^2.0.0" @@ -17553,6 +15161,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { "is-number": "^7.0.0" } @@ -17622,11 +15231,6 @@ "yn": "3.1.1" } }, - "ts-pattern": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-4.3.0.tgz", - "integrity": "sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg==" - }, "tsconfig-paths": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz", @@ -17755,18 +15359,11 @@ "random-bytes": "~1.0.0" } }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "requires": { - "crypto-random-string": "^2.0.0" - } - }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true }, "unpipe": { "version": "1.0.0", @@ -17783,22 +15380,6 @@ "picocolors": "^1.0.0" } }, - "upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "requires": { - "tslib": "^2.0.3" - } - }, - "upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "requires": { - "tslib": "^2.0.3" - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -17818,11 +15399,6 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -17840,15 +15416,6 @@ "convert-source-map": "^1.6.0" } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "validator": { "version": "13.9.0", "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", @@ -18095,29 +15662,8 @@ "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zip-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", - "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", - "requires": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index ab681566..2e1ec262 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,6 @@ "passport": "^0.6.0", "passport-jwt": "^4.0.1", "prisma": "4.16.0", - "prisma-class-generator": "^0.2.7", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" diff --git a/src/common/interfaces/dto/lecture/lecture.query.dto.ts b/src/common/interfaces/dto/lecture/lecture.request.dto.ts similarity index 95% rename from src/common/interfaces/dto/lecture/lecture.query.dto.ts rename to src/common/interfaces/dto/lecture/lecture.request.dto.ts index d0dd7ee9..e2fe6c4c 100644 --- a/src/common/interfaces/dto/lecture/lecture.query.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.request.dto.ts @@ -2,7 +2,7 @@ import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-v import { Transform } from "class-transformer"; import { CourseQueryDto } from "../course/course.request.dto"; -export class LectureQueryDTO extends CourseQueryDto{ +export class LectureQueryDto extends CourseQueryDto{ @IsOptional() @Transform(({value}) => typeof value === 'string' ? [value] : value) diff --git a/src/common/interfaces/dto/professor/professor.response.dto.ts b/src/common/interfaces/dto/professor/professor.response.dto.ts index 7800d7bb..4057561d 100644 --- a/src/common/interfaces/dto/professor/professor.response.dto.ts +++ b/src/common/interfaces/dto/professor/professor.response.dto.ts @@ -1,4 +1,3 @@ -import { subject_course } from "../../../../prisma/generated/prisma-class/subject_course"; export interface ProfessorResponseDto { name: string; diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts index 61cf4d9d..16e5ec33 100644 --- a/src/common/interfaces/serializer/classtime.serializer.ts +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -1,5 +1,5 @@ import { getTimeNumeric } from "src/common/utils/time.utils"; -import { subject_classtime } from "src/prisma/generated/prisma-class/subject_classtime"; +import { subject_classtime } from "@prisma/client"; export const toJsonClasstime = (classtime: subject_classtime) => { const classroomInfo = getClassroomStrs(classtime); diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts index b67ac56a..a980ca99 100644 --- a/src/common/interfaces/serializer/course.serializer.ts +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -1,15 +1,16 @@ -import { subject_course } from "../../../prisma/generated/prisma-class/subject_course"; -import { subject_lecture } from "../../../prisma/generated/prisma-class/subject_lecture"; +import { subject_course, subject_lecture} from "@prisma/client"; import { toJsonDepartment } from "./department.serializer"; import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; import { toJsonProfessor } from "./professor.serializer"; import { applyOrder } from "../../utils/search.utils"; -import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; +import { subject_professor } from "@prisma/client"; import { CourseResponseDtoNested } from "../dto/course/course.response.dto"; +import { CourseDetails, NESTED } from "../../schemaTypes/types"; +import { OmitType } from "@nestjs/swagger"; + -export const toJsonCourse = (course: subject_course, lecture: subject_lecture, professor: subject_professor[], nested = false): CourseResponseDtoNested => { - const professorJson: ProfessorResponseDto[] = toJsonProfessor(professor, true); - const professorSorted = applyOrder(professorJson, ["name"]); + +export function toJsonCourse(course: T extends NESTED ? Omit : CourseDetails, lecture: subject_lecture, professor: subject_professor[], nested : T extends NESTED ? true : false): CourseResponseDtoNested { let result = { "id": course.id, @@ -31,6 +32,8 @@ export const toJsonCourse = (course: subject_course, lecture: subject_lecture, p return result; } + const professorJson: ProfessorResponseDto[] = toJsonProfessor(professor, true); + const professorSorted = applyOrder(professorJson, ["name"]); result = Object.assign(result, { "related_courses_prior": [], "related_courses_posterior": [], @@ -40,4 +43,4 @@ export const toJsonCourse = (course: subject_course, lecture: subject_lecture, p "speech": course.speech }); return result; -}; \ No newline at end of file +} \ No newline at end of file diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts index c43a1f94..80f91694 100644 --- a/src/common/interfaces/serializer/department.serializer.ts +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -1,4 +1,4 @@ -import { subject_department } from "../../../prisma/generated/prisma-class/subject_department"; +import { subject_department } from "@prisma/client"; import { DepartmentResponseDto } from "../dto/department/department.response.dto"; export const toJsonDepartment = (department: subject_department, nested=false): DepartmentResponseDto => { diff --git a/src/common/interfaces/serializer/examtime.serializer.ts b/src/common/interfaces/serializer/examtime.serializer.ts index 2246e348..e5c08a24 100644 --- a/src/common/interfaces/serializer/examtime.serializer.ts +++ b/src/common/interfaces/serializer/examtime.serializer.ts @@ -1,5 +1,5 @@ import { getTimeNumeric } from "src/common/utils/time.utils"; -import { subject_examtime } from "src/prisma/generated/prisma-class/subject_examtime"; +import { subject_examtime } from "@prisma/client"; export const toJsonExamtime = (examtime: subject_examtime) => { const DAY_STR = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]; diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index cd510710..e85b59b7 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -1,11 +1,13 @@ import { applyOrder } from "src/common/utils/search.utils"; -import { subject_lecture } from "src/prisma/generated/prisma-class/subject_lecture" import { toJsonClasstime } from "./classtime.serializer"; import { toJsonExamtime } from "./examtime.serializer"; import { LectureResponseDto } from "../dto/lecture/lecture.response.dto"; import { toJsonProfessor } from "./professor.serializer"; +import { LectureDetails, NESTED } from "../../schemaTypes/types"; +import { subject_professor } from "@prisma/client"; -export const toJsonLecture = (lecture: subject_lecture, nested = false): LectureResponseDto => { + +export function toJsonLecture (lecture:T extends NESTED ? Omit : LectureDetails, nested: T extends NESTED? true : false): LectureResponseDto { let result = { "id": lecture.id, "title": lecture.title, diff --git a/src/common/interfaces/serializer/professor.serializer.ts b/src/common/interfaces/serializer/professor.serializer.ts index af62653d..ea593edd 100644 --- a/src/common/interfaces/serializer/professor.serializer.ts +++ b/src/common/interfaces/serializer/professor.serializer.ts @@ -1,5 +1,7 @@ import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; -import { subject_professor } from "../../../prisma/generated/prisma-class/subject_professor"; +import { subject_professor } from "@prisma/client"; + + export const toJsonProfessor = (professors: subject_professor[], nested=false): ProfessorResponseDto[] => { const result = professors.map((professor) => { diff --git a/src/common/interfaces/serializer/review.serializer.ts b/src/common/interfaces/serializer/review.serializer.ts index ed54d869..6f5c88d8 100644 --- a/src/common/interfaces/serializer/review.serializer.ts +++ b/src/common/interfaces/serializer/review.serializer.ts @@ -1,17 +1,16 @@ import { toJsonCourse } from "./course.serializer"; -import { review_review } from "src/prisma/generated/prisma-class/review_review"; import { ReviewResponseDto } from "./../dto/reviews/review.response.dto"; import { getRepresentativeLecture } from "src/common/utils/lecture.utils"; -import { subject_professor } from "src/prisma/generated/prisma-class/subject_professor"; import { toJsonLecture } from "./lecture.serializer"; +import { ReviewDetails } from "../../schemaTypes/types"; -export const toJsonReview = (review: review_review): ReviewResponseDto => { +export const toJsonReview = (review: ReviewDetails): ReviewResponseDto => { const representativeLecture = getRepresentativeLecture(review.course.lecture); const professorRaw = review.course.subject_course_professors.map( - (x) => x.professor as subject_professor + (x) => x.professor ); - const courseResult = toJsonCourse( + const courseResult = toJsonCourse( review.course, representativeLecture, professorRaw, @@ -24,7 +23,7 @@ export const toJsonReview = (review: review_review): ReviewResponseDto => { const result = { id: review.id, course: courseResult, - lecture: toJsonLecture(review.lecture, true), + lecture: toJsonLecture(review.lecture, true), content: review.is_deleted ? '관리자에 의해 삭제된 코멘트입니다.' : review.content, diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 158b8b0c..5d78bb9a 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -7,3 +7,35 @@ export type userSelectResultType = Prisma.session_userprofileGetPayload<{ export type courseSelectResultType = Prisma.subject_courseGetPayload<{ include: Prisma.subject_courseInclude }> + +const courseDetails = Prisma.validator()({ + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true + } +}); + +const lectureDetails = Prisma.validator()({ + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true + } +}); + +export type NESTED = true; + + +const reviewDetails = Prisma.validator()({ + include: { + course: courseDetails, + lecture: lectureDetails + } +}); + +export type ReviewDetails = Prisma.review_reviewGetPayload +export type LectureDetails = Prisma.subject_lectureGetPayload +export type CourseDetails = Prisma.subject_courseGetPayload \ No newline at end of file diff --git a/src/common/utils/lecture.utils.ts b/src/common/utils/lecture.utils.ts index 1e2b22d6..f01159ff 100644 --- a/src/common/utils/lecture.utils.ts +++ b/src/common/utils/lecture.utils.ts @@ -1,4 +1,4 @@ -import { subject_lecture } from "../../prisma/generated/prisma-class/subject_lecture"; +import { subject_lecture } from "@prisma/client"; import { applyOrder } from "./search.utils"; export const getRepresentativeLecture = (lectures: subject_lecture[]): subject_lecture => { diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 5615d677..bee0d431 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -36,6 +36,8 @@ export function groupBy( } type ValueType = string | number | boolean + + export type Union< T extends { [key: string]: ValueType } | ReadonlyArray, > = T extends ReadonlyArray diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 11b931fb..45fba127 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -4,13 +4,9 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; import { applyOrder } from 'src/common/utils/search.utils'; import { session_userprofile } from '@prisma/client'; -import { subject_course } from 'src/prisma/generated/prisma-class/subject_course'; -import { subject_lecture } from 'src/prisma/generated/prisma-class/subject_lecture'; -import { subject_department } from 'src/prisma/generated/prisma-class/subject_department'; import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; import { toJsonProfessor } from "../../common/interfaces/serializer/professor.serializer"; import { toJsonCourse } from "../../common/interfaces/serializer/course.serializer"; -import { subject_professor } from "../../prisma/generated/prisma-class/subject_professor"; import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/course.response.dto"; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; @@ -23,13 +19,11 @@ export class CoursesService { ) {} public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { - console.time("getCourseByFilter") const queryResult = await this.CourseRepository.filterByRequest(query); - console.timeEnd("getCourseByFilter") return queryResult.map((course) => { const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map((x) => x.professor as subject_professor); - const result = toJsonCourse(course, representativeLecture, professorRaw, false); + const professorRaw = course.subject_course_professors.map((x) => x.professor); + const result = toJsonCourse(course, representativeLecture, professorRaw, false); if (user) { const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; @@ -51,7 +45,7 @@ export class CoursesService { throw new NotFoundException(); } const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map((x) => x.professor as subject_professor); + const professorRaw = course.subject_course_professors.map((x) => x.professor); const result = toJsonCourse(course, representativeLecture, professorRaw, false); if (user) { @@ -73,6 +67,6 @@ export class CoursesService { throw new NotFoundException(); } - return lectures.map((lecture) => toJsonLecture(lecture)); + return lectures.map((lecture) => toJsonLecture(lecture,false)); } } \ No newline at end of file diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index c9365b01..fcb315ce 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -1,13 +1,13 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { LecturesService } from './lectures.service'; -import { LectureQueryDTO } from 'src/common/interfaces/dto/lecture/lecture.query.dto'; +import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; @Controller('api/lectures') export class LecturesController { constructor(private readonly LectureService: LecturesService) {} @Get() - async getLectures(@Query() query: LectureQueryDTO) { + async getLectures(@Query() query: LectureQueryDto) { return await this.LectureService.getLectureByFilter(query); } diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index b2e86725..fa0eb2cb 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -1,4 +1,4 @@ -import { LectureQueryDTO } from 'src/common/interfaces/dto/lecture/lecture.query.dto'; +import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; import { LectureRepository } from './../../prisma/repositories/lecture.repository'; import { Injectable, NotFoundException } from '@nestjs/common'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; @@ -8,9 +8,9 @@ import { LectureResponseDto } from 'src/common/interfaces/dto/lecture/lecture.re export class LecturesService { constructor(private LectureRepository: LectureRepository) {} - public async getLectureByFilter(query: LectureQueryDTO): Promise { + public async getLectureByFilter(query: LectureQueryDto): Promise { const queryResult = await this.LectureRepository.filterByRequest(query); - return queryResult.map((lecture) => toJsonLecture(lecture, false)) + return queryResult.map((lecture) => toJsonLecture(lecture, false)) } public async getLectureById(id: number): Promise { @@ -18,6 +18,6 @@ export class LecturesService { if (!queryResult) { throw new NotFoundException(); } - return toJsonLecture(queryResult, false); + return toJsonLecture(queryResult, false); } } diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 24767d02..c37aca2e 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -4,8 +4,7 @@ import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; -import { session_userprofile } from 'src/prisma/generated/prisma-class/session_userprofile'; - + @Controller('api/reviews') export class ReviewsController { constructor( @@ -15,7 +14,7 @@ export class ReviewsController { @Get() async getReviews( @Query() reviewsParam: getReviewDto, - @GetUser() user: session_userprofile, + @GetUser() user, ): Promise< (ReviewResponseDto & { userspecific_is_liked: boolean })[] | number > { diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 83eea517..a7cd6a6d 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -3,14 +3,13 @@ import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request. import { Injectable } from '@nestjs/common'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; -import { session_userprofile } from 'src/prisma/generated/prisma-class/session_userprofile'; @Injectable() export class ReviewsService { constructor(private readonly reviewsRepository: ReviewsRepository) {} async getReviews( reviewsParam: getReviewDto, - user: session_userprofile, + user, ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { const MAX_LIMIT = 50; const DEFAULT_ORDER = ['-written_datetime', '-id']; diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 7480ea63..7f9ae2e0 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -9,6 +9,7 @@ import { ReviewsRepository } from "../../prisma/repositories/review.repository"; import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; import { toJsonReview } from "../../common/interfaces/serializer/review.serializer"; import { toJsonLecture } from "../../common/interfaces/serializer/lecture.serializer"; +import { ReviewDetails } from "../../common/schemaTypes/types"; @Injectable() export class UserService { @@ -36,7 +37,7 @@ export class UserService { const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user) const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()) const takenLecturesPromise = this.lectureRepository.getTakenLectures(user) - const writtenReviewsPromise = this.reviewRepository.findReviewByUser(user) + const writtenReviewsPromise: ReviewDetails[] = await this.reviewRepository.findReviewByUser(user) promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); const departments = Object.values(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; @@ -53,8 +54,8 @@ export class UserService { majors: majors.map((major) => toJsonDepartment(major)), departments: departments.map((department) => toJsonDepartment(department)), favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), - review_writeable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture)), - my_timetable_lectures: timeTableLectures.map((lecture) => toJsonLecture(lecture)), + review_writeable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture,false)), + my_timetable_lectures: timeTableLectures.map((lecture) => toJsonLecture(lecture,false)), reviews: writtenReviews.map((review) => toJsonReview(review)), } } diff --git a/src/prisma/generated/prisma-class/auth_group.ts b/src/prisma/generated/prisma-class/auth_group.ts deleted file mode 100644 index 6fa20277..00000000 --- a/src/prisma/generated/prisma-class/auth_group.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { auth_group_permissions } from './auth_group_permissions'; -import { auth_user_groups } from './auth_user_groups'; -import { ApiProperty } from '@nestjs/swagger'; - -export class auth_group { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - name: string; - - @ApiProperty({ isArray: true, type: () => auth_group_permissions }) - auth_group_permissions: auth_group_permissions[]; - - @ApiProperty({ isArray: true, type: () => auth_user_groups }) - auth_user_groups: auth_user_groups[]; -} diff --git a/src/prisma/generated/prisma-class/auth_group_permissions.ts b/src/prisma/generated/prisma-class/auth_group_permissions.ts deleted file mode 100644 index 2463ed35..00000000 --- a/src/prisma/generated/prisma-class/auth_group_permissions.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { auth_permission } from './auth_permission'; -import { auth_group } from './auth_group'; -import { ApiProperty } from '@nestjs/swagger'; - -export class auth_group_permissions { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - group_id: number; - - @ApiProperty({ type: Number }) - permission_id: number; - - @ApiProperty({ type: () => auth_permission }) - auth_permission: auth_permission; - - @ApiProperty({ type: () => auth_group }) - auth_group: auth_group; -} diff --git a/src/prisma/generated/prisma-class/auth_permission.ts b/src/prisma/generated/prisma-class/auth_permission.ts deleted file mode 100644 index 5b23fe11..00000000 --- a/src/prisma/generated/prisma-class/auth_permission.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { auth_group_permissions } from './auth_group_permissions'; -import { django_content_type } from './django_content_type'; -import { auth_user_user_permissions } from './auth_user_user_permissions'; -import { ApiProperty } from '@nestjs/swagger'; - -export class auth_permission { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - name: string; - - @ApiProperty({ type: Number }) - content_type_id: number; - - @ApiProperty({ type: String }) - codename: string; - - @ApiProperty({ isArray: true, type: () => auth_group_permissions }) - auth_group_permissions: auth_group_permissions[]; - - @ApiProperty({ type: () => django_content_type }) - django_content_type: django_content_type; - - @ApiProperty({ isArray: true, type: () => auth_user_user_permissions }) - auth_user_user_permissions: auth_user_user_permissions[]; -} diff --git a/src/prisma/generated/prisma-class/auth_user.ts b/src/prisma/generated/prisma-class/auth_user.ts deleted file mode 100644 index 4ed1990f..00000000 --- a/src/prisma/generated/prisma-class/auth_user.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { auth_user_groups } from './auth_user_groups'; -import { auth_user_user_permissions } from './auth_user_user_permissions'; -import { django_admin_log } from './django_admin_log'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class auth_user { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - password: string; - - @ApiPropertyOptional({ type: Date }) - last_login?: Date; - - @ApiProperty({ type: Boolean }) - is_superuser: boolean; - - @ApiProperty({ type: String }) - username: string; - - @ApiProperty({ type: String }) - first_name: string; - - @ApiProperty({ type: String }) - last_name: string; - - @ApiProperty({ type: String }) - email: string; - - @ApiProperty({ type: Boolean }) - is_staff: boolean; - - @ApiProperty({ type: Boolean }) - is_active: boolean; - - @ApiProperty({ type: Date }) - date_joined: Date; - - @ApiProperty({ isArray: true, type: () => auth_user_groups }) - auth_user_groups: auth_user_groups[]; - - @ApiProperty({ isArray: true, type: () => auth_user_user_permissions }) - auth_user_user_permissions: auth_user_user_permissions[]; - - @ApiProperty({ isArray: true, type: () => django_admin_log }) - django_admin_log: django_admin_log[]; -} diff --git a/src/prisma/generated/prisma-class/auth_user_groups.ts b/src/prisma/generated/prisma-class/auth_user_groups.ts deleted file mode 100644 index b03c0664..00000000 --- a/src/prisma/generated/prisma-class/auth_user_groups.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { auth_group } from './auth_group'; -import { auth_user } from './auth_user'; -import { ApiProperty } from '@nestjs/swagger'; - -export class auth_user_groups { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: Number }) - group_id: number; - - @ApiProperty({ type: () => auth_group }) - auth_group: auth_group; - - @ApiProperty({ type: () => auth_user }) - auth_user: auth_user; -} diff --git a/src/prisma/generated/prisma-class/auth_user_user_permissions.ts b/src/prisma/generated/prisma-class/auth_user_user_permissions.ts deleted file mode 100644 index 7b2e0140..00000000 --- a/src/prisma/generated/prisma-class/auth_user_user_permissions.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { auth_permission } from './auth_permission'; -import { auth_user } from './auth_user'; -import { ApiProperty } from '@nestjs/swagger'; - -export class auth_user_user_permissions { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: Number }) - permission_id: number; - - @ApiProperty({ type: () => auth_permission }) - auth_permission: auth_permission; - - @ApiProperty({ type: () => auth_user }) - auth_user: auth_user; -} diff --git a/src/prisma/generated/prisma-class/django_admin_log.ts b/src/prisma/generated/prisma-class/django_admin_log.ts deleted file mode 100644 index e2f1a337..00000000 --- a/src/prisma/generated/prisma-class/django_admin_log.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { django_content_type } from './django_content_type'; -import { auth_user } from './auth_user'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class django_admin_log { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - action_time: Date; - - @ApiPropertyOptional({ type: String }) - object_id?: string; - - @ApiProperty({ type: String }) - object_repr: string; - - @ApiProperty({ type: Number }) - action_flag: number; - - @ApiProperty({ type: String }) - change_message: string; - - @ApiPropertyOptional({ type: Number }) - content_type_id?: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiPropertyOptional({ type: () => django_content_type }) - django_content_type?: django_content_type; - - @ApiProperty({ type: () => auth_user }) - auth_user: auth_user; -} diff --git a/src/prisma/generated/prisma-class/django_content_type.ts b/src/prisma/generated/prisma-class/django_content_type.ts deleted file mode 100644 index bb56dd55..00000000 --- a/src/prisma/generated/prisma-class/django_content_type.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { auth_permission } from './auth_permission'; -import { django_admin_log } from './django_admin_log'; -import { ApiProperty } from '@nestjs/swagger'; - -export class django_content_type { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - app_label: string; - - @ApiProperty({ type: String }) - model: string; - - @ApiProperty({ isArray: true, type: () => auth_permission }) - auth_permission: auth_permission[]; - - @ApiProperty({ isArray: true, type: () => django_admin_log }) - django_admin_log: django_admin_log[]; -} diff --git a/src/prisma/generated/prisma-class/django_migrations.ts b/src/prisma/generated/prisma-class/django_migrations.ts deleted file mode 100644 index 062571b7..00000000 --- a/src/prisma/generated/prisma-class/django_migrations.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class django_migrations { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - app: string; - - @ApiProperty({ type: String }) - name: string; - - @ApiProperty({ type: Date }) - applied: Date; -} diff --git a/src/prisma/generated/prisma-class/django_session.ts b/src/prisma/generated/prisma-class/django_session.ts deleted file mode 100644 index 6370af81..00000000 --- a/src/prisma/generated/prisma-class/django_session.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class django_session { - @ApiProperty({ type: String }) - session_key: string; - - @ApiProperty({ type: String }) - session_data: string; - - @ApiProperty({ type: Date }) - expire_date: Date; -} diff --git a/src/prisma/generated/prisma-class/graduation_additionaltrack.ts b/src/prisma/generated/prisma-class/graduation_additionaltrack.ts deleted file mode 100644 index fe880689..00000000 --- a/src/prisma/generated/prisma-class/graduation_additionaltrack.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { subject_department } from './subject_department'; -import { planner_planner_additional_tracks } from './planner_planner_additional_tracks'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class graduation_additionaltrack { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - start_year: number; - - @ApiProperty({ type: Number }) - end_year: number; - - @ApiProperty({ type: String }) - type: string; - - @ApiProperty({ type: Number }) - major_required: number; - - @ApiProperty({ type: Number }) - major_elective: number; - - @ApiPropertyOptional({ type: Number }) - department_id?: number; - - @ApiPropertyOptional({ type: () => subject_department }) - subject_department?: subject_department; - - @ApiProperty({ isArray: true, type: () => planner_planner_additional_tracks }) - planner_planner_additional_tracks: planner_planner_additional_tracks[]; -} diff --git a/src/prisma/generated/prisma-class/graduation_generaltrack.ts b/src/prisma/generated/prisma-class/graduation_generaltrack.ts deleted file mode 100644 index d0f9691a..00000000 --- a/src/prisma/generated/prisma-class/graduation_generaltrack.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { planner_planner } from './planner_planner'; -import { ApiProperty } from '@nestjs/swagger'; - -export class graduation_generaltrack { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - start_year: number; - - @ApiProperty({ type: Number }) - end_year: number; - - @ApiProperty({ type: Boolean }) - is_foreign: boolean; - - @ApiProperty({ type: Number }) - total_credit: number; - - @ApiProperty({ type: Number }) - total_au: number; - - @ApiProperty({ type: Number }) - basic_required: number; - - @ApiProperty({ type: Number }) - basic_elective: number; - - @ApiProperty({ type: Number }) - thesis_study: number; - - @ApiProperty({ type: Number }) - thesis_study_doublemajor: number; - - @ApiProperty({ type: Number }) - general_required_credit: number; - - @ApiProperty({ type: Number }) - general_required_au: number; - - @ApiProperty({ type: Number }) - humanities: number; - - @ApiProperty({ type: Number }) - humanities_doublemajor: number; - - @ApiProperty({ isArray: true, type: () => planner_planner }) - planner_planner: planner_planner[]; -} diff --git a/src/prisma/generated/prisma-class/graduation_majortrack.ts b/src/prisma/generated/prisma-class/graduation_majortrack.ts deleted file mode 100644 index 414c96ca..00000000 --- a/src/prisma/generated/prisma-class/graduation_majortrack.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { subject_department } from './subject_department'; -import { planner_planner } from './planner_planner'; -import { ApiProperty } from '@nestjs/swagger'; - -export class graduation_majortrack { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - start_year: number; - - @ApiProperty({ type: Number }) - end_year: number; - - @ApiProperty({ type: Number }) - basic_elective_doublemajor: number; - - @ApiProperty({ type: Number }) - major_required: number; - - @ApiProperty({ type: Number }) - major_elective: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; - - @ApiProperty({ isArray: true, type: () => planner_planner }) - planner_planner: planner_planner[]; -} diff --git a/src/prisma/generated/prisma-class/index.ts b/src/prisma/generated/prisma-class/index.ts deleted file mode 100644 index 5337c035..00000000 --- a/src/prisma/generated/prisma-class/index.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { auth_group as _auth_group } from './auth_group'; -import { auth_group_permissions as _auth_group_permissions } from './auth_group_permissions'; -import { auth_permission as _auth_permission } from './auth_permission'; -import { auth_user as _auth_user } from './auth_user'; -import { auth_user_groups as _auth_user_groups } from './auth_user_groups'; -import { auth_user_user_permissions as _auth_user_user_permissions } from './auth_user_user_permissions'; -import { django_admin_log as _django_admin_log } from './django_admin_log'; -import { django_content_type as _django_content_type } from './django_content_type'; -import { django_migrations as _django_migrations } from './django_migrations'; -import { django_session as _django_session } from './django_session'; -import { main_famoushumanityreviewdailyfeed as _main_famoushumanityreviewdailyfeed } from './main_famoushumanityreviewdailyfeed'; -import { main_famoushumanityreviewdailyfeed_reviews as _main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; -import { main_famousmajorreviewdailyfeed as _main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; -import { main_famousmajorreviewdailyfeed_reviews as _main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; -import { main_rankedreviewdailyfeed as _main_rankedreviewdailyfeed } from './main_rankedreviewdailyfeed'; -import { main_ratedailyuserfeed as _main_ratedailyuserfeed } from './main_ratedailyuserfeed'; -import { main_relatedcoursedailyuserfeed as _main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; -import { main_reviewwritedailyuserfeed as _main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; -import { review_humanitybestreview as _review_humanitybestreview } from './review_humanitybestreview'; -import { review_majorbestreview as _review_majorbestreview } from './review_majorbestreview'; -import { review_review as _review_review } from './review_review'; -import { review_reviewvote as _review_reviewvote } from './review_reviewvote'; -import { session_userprofile as _session_userprofile } from './session_userprofile'; -import { session_userprofile_favorite_departments as _session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; -import { session_userprofile_majors as _session_userprofile_majors } from './session_userprofile_majors'; -import { session_userprofile_minors as _session_userprofile_minors } from './session_userprofile_minors'; -import { session_userprofile_specialized_major as _session_userprofile_specialized_major } from './session_userprofile_specialized_major'; -import { session_userprofile_taken_lectures as _session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; -import { subject_classtime as _subject_classtime } from './subject_classtime'; -import { subject_course as _subject_course } from './subject_course'; -import { subject_course_professors as _subject_course_professors } from './subject_course_professors'; -import { subject_course_related_courses_posterior as _subject_course_related_courses_posterior } from './subject_course_related_courses_posterior'; -import { subject_course_related_courses_prior as _subject_course_related_courses_prior } from './subject_course_related_courses_prior'; -import { subject_courseuser as _subject_courseuser } from './subject_courseuser'; -import { subject_department as _subject_department } from './subject_department'; -import { subject_examtime as _subject_examtime } from './subject_examtime'; -import { subject_lecture as _subject_lecture } from './subject_lecture'; -import { subject_lecture_professors as _subject_lecture_professors } from './subject_lecture_professors'; -import { subject_professor as _subject_professor } from './subject_professor'; -import { subject_semester as _subject_semester } from './subject_semester'; -import { support_notice as _support_notice } from './support_notice'; -import { support_rate as _support_rate } from './support_rate'; -import { timetable_oldtimetable as _timetable_oldtimetable } from './timetable_oldtimetable'; -import { timetable_oldtimetable_lectures as _timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; -import { timetable_timetable as _timetable_timetable } from './timetable_timetable'; -import { timetable_timetable_lectures as _timetable_timetable_lectures } from './timetable_timetable_lectures'; -import { timetable_wishlist as _timetable_wishlist } from './timetable_wishlist'; -import { timetable_wishlist_lectures as _timetable_wishlist_lectures } from './timetable_wishlist_lectures'; -import { graduation_additionaltrack as _graduation_additionaltrack } from './graduation_additionaltrack'; -import { graduation_generaltrack as _graduation_generaltrack } from './graduation_generaltrack'; -import { graduation_majortrack as _graduation_majortrack } from './graduation_majortrack'; -import { planner_arbitraryplanneritem as _planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; -import { planner_futureplanneritem as _planner_futureplanneritem } from './planner_futureplanneritem'; -import { planner_planner as _planner_planner } from './planner_planner'; -import { planner_planner_additional_tracks as _planner_planner_additional_tracks } from './planner_planner_additional_tracks'; -import { planner_takenplanneritem as _planner_takenplanneritem } from './planner_takenplanneritem'; - -export namespace PrismaModel { - export class auth_group extends _auth_group {} - export class auth_group_permissions extends _auth_group_permissions {} - export class auth_permission extends _auth_permission {} - export class auth_user extends _auth_user {} - export class auth_user_groups extends _auth_user_groups {} - export class auth_user_user_permissions extends _auth_user_user_permissions {} - export class django_admin_log extends _django_admin_log {} - export class django_content_type extends _django_content_type {} - export class django_migrations extends _django_migrations {} - export class django_session extends _django_session {} - export class main_famoushumanityreviewdailyfeed extends _main_famoushumanityreviewdailyfeed {} - export class main_famoushumanityreviewdailyfeed_reviews extends _main_famoushumanityreviewdailyfeed_reviews {} - export class main_famousmajorreviewdailyfeed extends _main_famousmajorreviewdailyfeed {} - export class main_famousmajorreviewdailyfeed_reviews extends _main_famousmajorreviewdailyfeed_reviews {} - export class main_rankedreviewdailyfeed extends _main_rankedreviewdailyfeed {} - export class main_ratedailyuserfeed extends _main_ratedailyuserfeed {} - export class main_relatedcoursedailyuserfeed extends _main_relatedcoursedailyuserfeed {} - export class main_reviewwritedailyuserfeed extends _main_reviewwritedailyuserfeed {} - export class review_humanitybestreview extends _review_humanitybestreview {} - export class review_majorbestreview extends _review_majorbestreview {} - export class review_review extends _review_review {} - export class review_reviewvote extends _review_reviewvote {} - export class session_userprofile extends _session_userprofile {} - export class session_userprofile_favorite_departments extends _session_userprofile_favorite_departments {} - export class session_userprofile_majors extends _session_userprofile_majors {} - export class session_userprofile_minors extends _session_userprofile_minors {} - export class session_userprofile_specialized_major extends _session_userprofile_specialized_major {} - export class session_userprofile_taken_lectures extends _session_userprofile_taken_lectures {} - export class subject_classtime extends _subject_classtime {} - export class subject_course extends _subject_course {} - export class subject_course_professors extends _subject_course_professors {} - export class subject_course_related_courses_posterior extends _subject_course_related_courses_posterior {} - export class subject_course_related_courses_prior extends _subject_course_related_courses_prior {} - export class subject_courseuser extends _subject_courseuser {} - export class subject_department extends _subject_department {} - export class subject_examtime extends _subject_examtime {} - export class subject_lecture extends _subject_lecture {} - export class subject_lecture_professors extends _subject_lecture_professors {} - export class subject_professor extends _subject_professor {} - export class subject_semester extends _subject_semester {} - export class support_notice extends _support_notice {} - export class support_rate extends _support_rate {} - export class timetable_oldtimetable extends _timetable_oldtimetable {} - export class timetable_oldtimetable_lectures extends _timetable_oldtimetable_lectures {} - export class timetable_timetable extends _timetable_timetable {} - export class timetable_timetable_lectures extends _timetable_timetable_lectures {} - export class timetable_wishlist extends _timetable_wishlist {} - export class timetable_wishlist_lectures extends _timetable_wishlist_lectures {} - export class graduation_additionaltrack extends _graduation_additionaltrack {} - export class graduation_generaltrack extends _graduation_generaltrack {} - export class graduation_majortrack extends _graduation_majortrack {} - export class planner_arbitraryplanneritem extends _planner_arbitraryplanneritem {} - export class planner_futureplanneritem extends _planner_futureplanneritem {} - export class planner_planner extends _planner_planner {} - export class planner_planner_additional_tracks extends _planner_planner_additional_tracks {} - export class planner_takenplanneritem extends _planner_takenplanneritem {} - - export const extraModels = [ - auth_group, - auth_group_permissions, - auth_permission, - auth_user, - auth_user_groups, - auth_user_user_permissions, - django_admin_log, - django_content_type, - django_migrations, - django_session, - main_famoushumanityreviewdailyfeed, - main_famoushumanityreviewdailyfeed_reviews, - main_famousmajorreviewdailyfeed, - main_famousmajorreviewdailyfeed_reviews, - main_rankedreviewdailyfeed, - main_ratedailyuserfeed, - main_relatedcoursedailyuserfeed, - main_reviewwritedailyuserfeed, - review_humanitybestreview, - review_majorbestreview, - review_review, - review_reviewvote, - session_userprofile, - session_userprofile_favorite_departments, - session_userprofile_majors, - session_userprofile_minors, - session_userprofile_specialized_major, - session_userprofile_taken_lectures, - subject_classtime, - subject_course, - subject_course_professors, - subject_course_related_courses_posterior, - subject_course_related_courses_prior, - subject_courseuser, - subject_department, - subject_examtime, - subject_lecture, - subject_lecture_professors, - subject_professor, - subject_semester, - support_notice, - support_rate, - timetable_oldtimetable, - timetable_oldtimetable_lectures, - timetable_timetable, - timetable_timetable_lectures, - timetable_wishlist, - timetable_wishlist_lectures, - graduation_additionaltrack, - graduation_generaltrack, - graduation_majortrack, - planner_arbitraryplanneritem, - planner_futureplanneritem, - planner_planner, - planner_planner_additional_tracks, - planner_takenplanneritem, - ]; -} diff --git a/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts b/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts deleted file mode 100644 index c5acce69..00000000 --- a/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_famoushumanityreviewdailyfeed { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - date: Date; - - @ApiProperty({ type: Number }) - priority: number; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiProperty({ - isArray: true, - type: () => main_famoushumanityreviewdailyfeed_reviews, - }) - main_famoushumanityreviewdailyfeed_reviews: main_famoushumanityreviewdailyfeed_reviews[]; -} diff --git a/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts b/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts deleted file mode 100644 index 24092f28..00000000 --- a/src/prisma/generated/prisma-class/main_famoushumanityreviewdailyfeed_reviews.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { main_famoushumanityreviewdailyfeed } from './main_famoushumanityreviewdailyfeed'; -import { review_review } from './review_review'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_famoushumanityreviewdailyfeed_reviews { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - famoushumanityreviewdailyfeed_id: number; - - @ApiProperty({ type: Number }) - review_id: number; - - @ApiProperty({ type: () => main_famoushumanityreviewdailyfeed }) - main_famoushumanityreviewdailyfeed: main_famoushumanityreviewdailyfeed; - - @ApiProperty({ type: () => review_review }) - review_review: review_review; -} diff --git a/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts b/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts deleted file mode 100644 index ce5fae90..00000000 --- a/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { subject_department } from './subject_department'; -import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_famousmajorreviewdailyfeed { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - date: Date; - - @ApiProperty({ type: Number }) - priority: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; - - @ApiProperty({ - isArray: true, - type: () => main_famousmajorreviewdailyfeed_reviews, - }) - main_famousmajorreviewdailyfeed_reviews: main_famousmajorreviewdailyfeed_reviews[]; -} diff --git a/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts b/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts deleted file mode 100644 index 5060570e..00000000 --- a/src/prisma/generated/prisma-class/main_famousmajorreviewdailyfeed_reviews.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; -import { review_review } from './review_review'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_famousmajorreviewdailyfeed_reviews { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - famousmajorreviewdailyfeed_id: number; - - @ApiProperty({ type: Number }) - review_id: number; - - @ApiProperty({ type: () => main_famousmajorreviewdailyfeed }) - main_famousmajorreviewdailyfeed: main_famousmajorreviewdailyfeed; - - @ApiProperty({ type: () => review_review }) - review_review: review_review; -} diff --git a/src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts b/src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts deleted file mode 100644 index 4d612214..00000000 --- a/src/prisma/generated/prisma-class/main_rankedreviewdailyfeed.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { subject_semester } from './subject_semester'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class main_rankedreviewdailyfeed { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - date: Date; - - @ApiProperty({ type: Number }) - priority: number; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiPropertyOptional({ type: Number }) - semester_id?: number; - - @ApiPropertyOptional({ type: () => subject_semester }) - subject_semester?: subject_semester; -} diff --git a/src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts b/src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts deleted file mode 100644 index ebb9dcab..00000000 --- a/src/prisma/generated/prisma-class/main_ratedailyuserfeed.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_ratedailyuserfeed { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - date: Date; - - @ApiProperty({ type: Number }) - priority: number; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts b/src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts deleted file mode 100644 index 6ea53167..00000000 --- a/src/prisma/generated/prisma-class/main_relatedcoursedailyuserfeed.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { subject_course } from './subject_course'; -import { session_userprofile } from './session_userprofile'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_relatedcoursedailyuserfeed { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - date: Date; - - @ApiProperty({ type: Number }) - priority: number; - - @ApiProperty({ type: Number }) - course_id: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiProperty({ type: () => subject_course }) - subject_course: subject_course; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts b/src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts deleted file mode 100644 index 8b4eaeb7..00000000 --- a/src/prisma/generated/prisma-class/main_reviewwritedailyuserfeed.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { session_userprofile } from './session_userprofile'; -import { ApiProperty } from '@nestjs/swagger'; - -export class main_reviewwritedailyuserfeed { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - date: Date; - - @ApiProperty({ type: Number }) - priority: number; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiProperty({ type: () => subject_lecture }) - subject_lecture: subject_lecture; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts b/src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts deleted file mode 100644 index d4583a91..00000000 --- a/src/prisma/generated/prisma-class/planner_arbitraryplanneritem.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { subject_department } from './subject_department'; -import { planner_planner } from './planner_planner'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class planner_arbitraryplanneritem { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Boolean }) - is_excluded: boolean; - - @ApiProperty({ type: Number }) - year: number; - - @ApiProperty({ type: Number }) - semester: number; - - @ApiProperty({ type: String }) - type: string; - - @ApiProperty({ type: String }) - type_en: string; - - @ApiProperty({ type: Number }) - credit: number; - - @ApiProperty({ type: Number }) - credit_au: number; - - @ApiPropertyOptional({ type: Number }) - department_id?: number; - - @ApiProperty({ type: Number }) - planner_id: number; - - @ApiPropertyOptional({ type: () => subject_department }) - subject_department?: subject_department; - - @ApiProperty({ type: () => planner_planner }) - planner_planner: planner_planner; -} diff --git a/src/prisma/generated/prisma-class/planner_futureplanneritem.ts b/src/prisma/generated/prisma-class/planner_futureplanneritem.ts deleted file mode 100644 index 9ff492d0..00000000 --- a/src/prisma/generated/prisma-class/planner_futureplanneritem.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { subject_course } from './subject_course'; -import { planner_planner } from './planner_planner'; -import { ApiProperty } from '@nestjs/swagger'; - -export class planner_futureplanneritem { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Boolean }) - is_excluded: boolean; - - @ApiProperty({ type: Number }) - year: number; - - @ApiProperty({ type: Number }) - semester: number; - - @ApiProperty({ type: Number }) - course_id: number; - - @ApiProperty({ type: Number }) - planner_id: number; - - @ApiProperty({ type: () => subject_course }) - subject_course: subject_course; - - @ApiProperty({ type: () => planner_planner }) - planner_planner: planner_planner; -} diff --git a/src/prisma/generated/prisma-class/planner_planner.ts b/src/prisma/generated/prisma-class/planner_planner.ts deleted file mode 100644 index b6704453..00000000 --- a/src/prisma/generated/prisma-class/planner_planner.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; -import { planner_futureplanneritem } from './planner_futureplanneritem'; -import { graduation_generaltrack } from './graduation_generaltrack'; -import { graduation_majortrack } from './graduation_majortrack'; -import { session_userprofile } from './session_userprofile'; -import { planner_planner_additional_tracks } from './planner_planner_additional_tracks'; -import { planner_takenplanneritem } from './planner_takenplanneritem'; -import { ApiProperty } from '@nestjs/swagger'; - -export class planner_planner { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - start_year: number; - - @ApiProperty({ type: Number }) - end_year: number; - - @ApiProperty({ type: Number }) - arrange_order: number; - - @ApiProperty({ type: Number }) - general_track_id: number; - - @ApiProperty({ type: Number }) - major_track_id: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ isArray: true, type: () => planner_arbitraryplanneritem }) - planner_arbitraryplanneritem: planner_arbitraryplanneritem[]; - - @ApiProperty({ isArray: true, type: () => planner_futureplanneritem }) - planner_futureplanneritem: planner_futureplanneritem[]; - - @ApiProperty({ type: () => graduation_generaltrack }) - graduation_generaltrack: graduation_generaltrack; - - @ApiProperty({ type: () => graduation_majortrack }) - graduation_majortrack: graduation_majortrack; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; - - @ApiProperty({ isArray: true, type: () => planner_planner_additional_tracks }) - planner_planner_additional_tracks: planner_planner_additional_tracks[]; - - @ApiProperty({ isArray: true, type: () => planner_takenplanneritem }) - planner_takenplanneritem: planner_takenplanneritem[]; -} diff --git a/src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts b/src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts deleted file mode 100644 index dfa927b3..00000000 --- a/src/prisma/generated/prisma-class/planner_planner_additional_tracks.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { graduation_additionaltrack } from './graduation_additionaltrack'; -import { planner_planner } from './planner_planner'; -import { ApiProperty } from '@nestjs/swagger'; - -export class planner_planner_additional_tracks { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - planner_id: number; - - @ApiProperty({ type: Number }) - additionaltrack_id: number; - - @ApiProperty({ type: () => graduation_additionaltrack }) - graduation_additionaltrack: graduation_additionaltrack; - - @ApiProperty({ type: () => planner_planner }) - planner_planner: planner_planner; -} diff --git a/src/prisma/generated/prisma-class/planner_takenplanneritem.ts b/src/prisma/generated/prisma-class/planner_takenplanneritem.ts deleted file mode 100644 index 4c0d81c8..00000000 --- a/src/prisma/generated/prisma-class/planner_takenplanneritem.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { planner_planner } from './planner_planner'; -import { ApiProperty } from '@nestjs/swagger'; - -export class planner_takenplanneritem { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Boolean }) - is_excluded: boolean; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: Number }) - planner_id: number; - - @ApiProperty({ type: () => subject_lecture }) - subject_lecture: subject_lecture; - - @ApiProperty({ type: () => planner_planner }) - planner_planner: planner_planner; -} diff --git a/src/prisma/generated/prisma-class/review_humanitybestreview.ts b/src/prisma/generated/prisma-class/review_humanitybestreview.ts deleted file mode 100644 index d289e054..00000000 --- a/src/prisma/generated/prisma-class/review_humanitybestreview.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class review_humanitybestreview { - @ApiProperty({ type: Number }) - review_id: number; -} diff --git a/src/prisma/generated/prisma-class/review_majorbestreview.ts b/src/prisma/generated/prisma-class/review_majorbestreview.ts deleted file mode 100644 index 53f8495f..00000000 --- a/src/prisma/generated/prisma-class/review_majorbestreview.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class review_majorbestreview { - @ApiProperty({ type: Number }) - review_id: number; -} diff --git a/src/prisma/generated/prisma-class/review_review.ts b/src/prisma/generated/prisma-class/review_review.ts deleted file mode 100644 index 4ded1667..00000000 --- a/src/prisma/generated/prisma-class/review_review.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { subject_course } from './subject_course'; -import { subject_lecture } from './subject_lecture'; -import { main_famoushumanityreviewdailyfeed_reviews } from './main_famoushumanityreviewdailyfeed_reviews'; -import { main_famousmajorreviewdailyfeed_reviews } from './main_famousmajorreviewdailyfeed_reviews'; -import { session_userprofile } from './session_userprofile'; -import { review_reviewvote } from './review_reviewvote'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class review_review { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - course_id: number; - - @ApiProperty({ type: () => subject_course }) - course: subject_course; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: () => subject_lecture }) - lecture: subject_lecture; - - @ApiProperty({ type: String }) - content: string; - - @ApiProperty({ type: Number }) - grade: number; - - @ApiProperty({ type: Number }) - load: number; - - @ApiProperty({ type: Number }) - speech: number; - - @ApiPropertyOptional({ type: Number }) - writer_id?: number; - - @ApiProperty({ type: String }) - writer_label: string; - - @ApiProperty({ type: Date }) - updated_datetime: Date; - - @ApiProperty({ type: Number }) - like: number; - - @ApiProperty({ type: Number }) - is_deleted: number; - - @ApiPropertyOptional({ type: Date }) - written_datetime?: Date; - - @ApiProperty({ - isArray: true, - type: () => main_famoushumanityreviewdailyfeed_reviews, - }) - main_famoushumanityreviewdailyfeed_reviews: main_famoushumanityreviewdailyfeed_reviews[]; - - @ApiProperty({ - isArray: true, - type: () => main_famousmajorreviewdailyfeed_reviews, - }) - main_famousmajorreviewdailyfeed_reviews: main_famousmajorreviewdailyfeed_reviews[]; - - @ApiPropertyOptional({ type: () => session_userprofile }) - writer?: session_userprofile; - - @ApiProperty({ isArray: true, type: () => review_reviewvote }) - review_reviewvote: review_reviewvote[]; -} diff --git a/src/prisma/generated/prisma-class/review_reviewvote.ts b/src/prisma/generated/prisma-class/review_reviewvote.ts deleted file mode 100644 index 47d5897d..00000000 --- a/src/prisma/generated/prisma-class/review_reviewvote.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { review_review } from './review_review'; -import { session_userprofile } from './session_userprofile'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class review_reviewvote { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - review_id: number; - - @ApiProperty({ type: () => review_review }) - review: review_review; - - @ApiPropertyOptional({ type: Number }) - userprofile_id?: number; - - @ApiPropertyOptional({ type: () => session_userprofile }) - userprofile?: session_userprofile; - - @ApiPropertyOptional({ type: Date }) - created_datetime?: Date; -} diff --git a/src/prisma/generated/prisma-class/session_userprofile.ts b/src/prisma/generated/prisma-class/session_userprofile.ts deleted file mode 100644 index b290a25d..00000000 --- a/src/prisma/generated/prisma-class/session_userprofile.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { main_ratedailyuserfeed } from './main_ratedailyuserfeed'; -import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; -import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; -import { planner_planner } from './planner_planner'; -import { review_review } from './review_review'; -import { subject_department } from './subject_department'; -import { session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; -import { session_userprofile_majors } from './session_userprofile_majors'; -import { session_userprofile_minors } from './session_userprofile_minors'; -import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; -import { session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; -import { subject_courseuser } from './subject_courseuser'; -import { support_rate } from './support_rate'; -import { timetable_timetable } from './timetable_timetable'; -import { timetable_wishlist } from './timetable_wishlist'; -import { review_reviewvote } from './review_reviewvote'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class session_userprofile { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - student_id: string; - - @ApiProperty({ type: String }) - sid: string; - - @ApiPropertyOptional({ type: Number }) - department_id?: number; - - @ApiPropertyOptional({ type: String }) - email?: string; - - @ApiProperty({ type: Date }) - date_joined: Date; - - @ApiProperty({ type: String }) - first_name: string; - - @ApiProperty({ type: String }) - last_name: string; - - @ApiPropertyOptional({ type: String }) - refresh_token?: string; - - @ApiProperty({ isArray: true, type: () => main_ratedailyuserfeed }) - main_ratedailyuserfeed: main_ratedailyuserfeed[]; - - @ApiProperty({ isArray: true, type: () => main_relatedcoursedailyuserfeed }) - main_relatedcoursedailyuserfeed: main_relatedcoursedailyuserfeed[]; - - @ApiProperty({ isArray: true, type: () => main_reviewwritedailyuserfeed }) - main_reviewwritedailyuserfeed: main_reviewwritedailyuserfeed[]; - - @ApiProperty({ isArray: true, type: () => planner_planner }) - planner_planner: planner_planner[]; - - @ApiProperty({ isArray: true, type: () => review_review }) - reviews: review_review[]; - - @ApiPropertyOptional({ type: () => subject_department }) - department?: subject_department; - - @ApiProperty({ - isArray: true, - type: () => session_userprofile_favorite_departments, - }) - favorite_departments: session_userprofile_favorite_departments[]; - - @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) - session_userprofile_majors: session_userprofile_majors[]; - - @ApiProperty({ isArray: true, type: () => session_userprofile_minors }) - session_userprofile_minors: session_userprofile_minors[]; - - @ApiProperty({ - isArray: true, - type: () => session_userprofile_specialized_major, - }) - session_userprofile_specialized_major: session_userprofile_specialized_major[]; - - @ApiProperty({ - isArray: true, - type: () => session_userprofile_taken_lectures, - }) - taken_lectures: session_userprofile_taken_lectures[]; - - @ApiProperty({ isArray: true, type: () => subject_courseuser }) - subject_courseuser: subject_courseuser[]; - - @ApiProperty({ isArray: true, type: () => support_rate }) - support_rate: support_rate[]; - - @ApiProperty({ isArray: true, type: () => timetable_timetable }) - timetable_timetable: timetable_timetable[]; - - @ApiPropertyOptional({ type: () => timetable_wishlist }) - timetable_wishlist?: timetable_wishlist; - - @ApiProperty({ isArray: true, type: () => review_reviewvote }) - reviewvote: review_reviewvote[]; -} diff --git a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts b/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts deleted file mode 100644 index bc32cd7c..00000000 --- a/src/prisma/generated/prisma-class/session_userprofile_favorite_departments.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_department } from './subject_department'; -import { session_userprofile } from './session_userprofile'; -import { ApiProperty } from '@nestjs/swagger'; - -export class session_userprofile_favorite_departments { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - userprofile_id: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: () => subject_department }) - department: subject_department; - - @ApiProperty({ type: () => session_userprofile }) - userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/session_userprofile_majors.ts b/src/prisma/generated/prisma-class/session_userprofile_majors.ts deleted file mode 100644 index c7bbc44c..00000000 --- a/src/prisma/generated/prisma-class/session_userprofile_majors.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { subject_department } from './subject_department'; -import { ApiProperty } from '@nestjs/swagger'; - -export class session_userprofile_majors { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - userprofile_id: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; -} diff --git a/src/prisma/generated/prisma-class/session_userprofile_minors.ts b/src/prisma/generated/prisma-class/session_userprofile_minors.ts deleted file mode 100644 index 5f19f446..00000000 --- a/src/prisma/generated/prisma-class/session_userprofile_minors.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { subject_department } from './subject_department'; -import { ApiProperty } from '@nestjs/swagger'; - -export class session_userprofile_minors { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - userprofile_id: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; -} diff --git a/src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts b/src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts deleted file mode 100644 index a241f200..00000000 --- a/src/prisma/generated/prisma-class/session_userprofile_specialized_major.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { subject_department } from './subject_department'; -import { ApiProperty } from '@nestjs/swagger'; - -export class session_userprofile_specialized_major { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - userprofile_id: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; -} diff --git a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts b/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts deleted file mode 100644 index 15da4888..00000000 --- a/src/prisma/generated/prisma-class/session_userprofile_taken_lectures.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { session_userprofile } from './session_userprofile'; -import { ApiProperty } from '@nestjs/swagger'; - -export class session_userprofile_taken_lectures { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - userprofile_id: number; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: () => subject_lecture }) - lecture: subject_lecture; - - @ApiProperty({ type: () => session_userprofile }) - userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/subject_classtime.ts b/src/prisma/generated/prisma-class/subject_classtime.ts deleted file mode 100644 index 5fdc8de1..00000000 --- a/src/prisma/generated/prisma-class/subject_classtime.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class subject_classtime { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - day: number; - - @ApiProperty({ type: Date }) - begin: Date; - - @ApiProperty({ type: Date }) - end: Date; - - @ApiProperty({ type: String }) - type: string; - - @ApiPropertyOptional({ type: String }) - building_id?: string; - - @ApiPropertyOptional({ type: String }) - building_full_name?: string; - - @ApiPropertyOptional({ type: String }) - building_full_name_en?: string; - - @ApiPropertyOptional({ type: String }) - room_name?: string; - - @ApiPropertyOptional({ type: Number }) - unit_time?: number; - - @ApiPropertyOptional({ type: Number }) - lecture_id?: number; - - @ApiPropertyOptional({ type: () => subject_lecture }) - subject_lecture?: subject_lecture; -} diff --git a/src/prisma/generated/prisma-class/subject_course.ts b/src/prisma/generated/prisma-class/subject_course.ts deleted file mode 100644 index 0f35c5b2..00000000 --- a/src/prisma/generated/prisma-class/subject_course.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { main_relatedcoursedailyuserfeed } from './main_relatedcoursedailyuserfeed'; -import { planner_futureplanneritem } from './planner_futureplanneritem'; -import { subject_department } from './subject_department'; -import { subject_course_related_courses_posterior } from './subject_course_related_courses_posterior'; -import { subject_course_related_courses_prior } from './subject_course_related_courses_prior'; -import { subject_courseuser } from './subject_courseuser'; -import { subject_course_professors } from './subject_course_professors'; -import { subject_lecture } from './subject_lecture'; -import { review_review } from './review_review'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class subject_course { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - old_code: string; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: String }) - type: string; - - @ApiProperty({ type: String }) - type_en: string; - - @ApiProperty({ type: String }) - title: string; - - @ApiProperty({ type: String }) - title_en: string; - - @ApiProperty({ type: String }) - summury: string; - - @ApiProperty({ type: Number }) - grade_sum: number; - - @ApiProperty({ type: Number }) - load_sum: number; - - @ApiProperty({ type: Number }) - speech_sum: number; - - @ApiProperty({ type: Number }) - review_total_weight: number; - - @ApiProperty({ type: Number }) - grade: number; - - @ApiProperty({ type: Number }) - load: number; - - @ApiProperty({ type: Number }) - speech: number; - - @ApiPropertyOptional({ type: Date }) - latest_written_datetime?: Date; - - @ApiProperty({ type: String }) - title_en_no_space: string; - - @ApiProperty({ type: String }) - title_no_space: string; - - @ApiProperty({ isArray: true, type: () => main_relatedcoursedailyuserfeed }) - main_relatedcoursedailyuserfeed: main_relatedcoursedailyuserfeed[]; - - @ApiProperty({ isArray: true, type: () => planner_futureplanneritem }) - planner_futureplanneritem: planner_futureplanneritem[]; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; - - @ApiProperty({ - isArray: true, - type: () => subject_course_related_courses_posterior, - }) - subject_course_related_courses_posterior_subject_course_related_courses_posterior_from_course_idTosubject_course: subject_course_related_courses_posterior[]; - - @ApiProperty({ - isArray: true, - type: () => subject_course_related_courses_posterior, - }) - subject_course_related_courses_posterior_subject_course_related_courses_posterior_to_course_idTosubject_course: subject_course_related_courses_posterior[]; - - @ApiProperty({ - isArray: true, - type: () => subject_course_related_courses_prior, - }) - subject_course_related_courses_prior_subject_course_related_courses_prior_from_course_idTosubject_course: subject_course_related_courses_prior[]; - - @ApiProperty({ - isArray: true, - type: () => subject_course_related_courses_prior, - }) - subject_course_related_courses_prior_subject_course_related_courses_prior_to_course_idTosubject_course: subject_course_related_courses_prior[]; - - @ApiProperty({ isArray: true, type: () => subject_courseuser }) - subject_courseuser: subject_courseuser[]; - - @ApiProperty({ isArray: true, type: () => subject_course_professors }) - subject_course_professors: subject_course_professors[]; - - @ApiProperty({ isArray: true, type: () => subject_lecture }) - lecture: subject_lecture[]; - - @ApiProperty({ isArray: true, type: () => review_review }) - review: review_review[]; -} diff --git a/src/prisma/generated/prisma-class/subject_course_professors.ts b/src/prisma/generated/prisma-class/subject_course_professors.ts deleted file mode 100644 index bc7dfa7c..00000000 --- a/src/prisma/generated/prisma-class/subject_course_professors.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_course } from './subject_course'; -import { subject_professor } from './subject_professor'; -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_course_professors { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - course_id: number; - - @ApiProperty({ type: Number }) - professor_id: number; - - @ApiProperty({ type: () => subject_course }) - course: subject_course; - - @ApiProperty({ type: () => subject_professor }) - professor: subject_professor; -} diff --git a/src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts b/src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts deleted file mode 100644 index 77008bdb..00000000 --- a/src/prisma/generated/prisma-class/subject_course_related_courses_posterior.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { subject_course } from './subject_course'; -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_course_related_courses_posterior { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - from_course_id: number; - - @ApiProperty({ type: Number }) - to_course_id: number; - - @ApiProperty({ type: () => subject_course }) - subject_course_subject_course_related_courses_posterior_from_course_idTosubject_course: subject_course; - - @ApiProperty({ type: () => subject_course }) - subject_course_subject_course_related_courses_posterior_to_course_idTosubject_course: subject_course; -} diff --git a/src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts b/src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts deleted file mode 100644 index faef4fb5..00000000 --- a/src/prisma/generated/prisma-class/subject_course_related_courses_prior.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { subject_course } from './subject_course'; -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_course_related_courses_prior { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - from_course_id: number; - - @ApiProperty({ type: Number }) - to_course_id: number; - - @ApiProperty({ type: () => subject_course }) - subject_course_subject_course_related_courses_prior_from_course_idTosubject_course: subject_course; - - @ApiProperty({ type: () => subject_course }) - subject_course_subject_course_related_courses_prior_to_course_idTosubject_course: subject_course; -} diff --git a/src/prisma/generated/prisma-class/subject_courseuser.ts b/src/prisma/generated/prisma-class/subject_courseuser.ts deleted file mode 100644 index a54b4e71..00000000 --- a/src/prisma/generated/prisma-class/subject_courseuser.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { subject_course } from './subject_course'; -import { session_userprofile } from './session_userprofile'; -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_courseuser { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - latest_read_datetime: Date; - - @ApiProperty({ type: Number }) - course_id: number; - - @ApiProperty({ type: Number }) - user_profile_id: number; - - @ApiProperty({ type: () => subject_course }) - subject_course: subject_course; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/subject_department.ts b/src/prisma/generated/prisma-class/subject_department.ts deleted file mode 100644 index 083bb972..00000000 --- a/src/prisma/generated/prisma-class/subject_department.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { graduation_additionaltrack } from './graduation_additionaltrack'; -import { graduation_majortrack } from './graduation_majortrack'; -import { main_famousmajorreviewdailyfeed } from './main_famousmajorreviewdailyfeed'; -import { planner_arbitraryplanneritem } from './planner_arbitraryplanneritem'; -import { session_userprofile } from './session_userprofile'; -import { session_userprofile_favorite_departments } from './session_userprofile_favorite_departments'; -import { session_userprofile_majors } from './session_userprofile_majors'; -import { session_userprofile_minors } from './session_userprofile_minors'; -import { session_userprofile_specialized_major } from './session_userprofile_specialized_major'; -import { subject_course } from './subject_course'; -import { subject_lecture } from './subject_lecture'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class subject_department { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - num_id: string; - - @ApiProperty({ type: String }) - code: string; - - @ApiProperty({ type: String }) - name: string; - - @ApiPropertyOptional({ type: String }) - name_en?: string; - - @ApiProperty({ type: Boolean }) - visible: boolean; - - @ApiProperty({ isArray: true, type: () => graduation_additionaltrack }) - graduation_additionaltrack: graduation_additionaltrack[]; - - @ApiProperty({ isArray: true, type: () => graduation_majortrack }) - graduation_majortrack: graduation_majortrack[]; - - @ApiProperty({ isArray: true, type: () => main_famousmajorreviewdailyfeed }) - main_famousmajorreviewdailyfeed: main_famousmajorreviewdailyfeed[]; - - @ApiProperty({ isArray: true, type: () => planner_arbitraryplanneritem }) - planner_arbitraryplanneritem: planner_arbitraryplanneritem[]; - - @ApiProperty({ isArray: true, type: () => session_userprofile }) - session_userprofile: session_userprofile[]; - - @ApiProperty({ - isArray: true, - type: () => session_userprofile_favorite_departments, - }) - session_userprofile_favorite_departments: session_userprofile_favorite_departments[]; - - @ApiProperty({ isArray: true, type: () => session_userprofile_majors }) - session_userprofile_majors: session_userprofile_majors[]; - - @ApiProperty({ isArray: true, type: () => session_userprofile_minors }) - session_userprofile_minors: session_userprofile_minors[]; - - @ApiProperty({ - isArray: true, - type: () => session_userprofile_specialized_major, - }) - session_userprofile_specialized_major: session_userprofile_specialized_major[]; - - @ApiProperty({ isArray: true, type: () => subject_course }) - subject_course: subject_course[]; - - @ApiProperty({ isArray: true, type: () => subject_lecture }) - subject_lecture: subject_lecture[]; -} diff --git a/src/prisma/generated/prisma-class/subject_examtime.ts b/src/prisma/generated/prisma-class/subject_examtime.ts deleted file mode 100644 index 7fa39b9b..00000000 --- a/src/prisma/generated/prisma-class/subject_examtime.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_examtime { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - day: number; - - @ApiProperty({ type: Date }) - begin: Date; - - @ApiProperty({ type: Date }) - end: Date; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: () => subject_lecture }) - subject_lecture: subject_lecture; -} diff --git a/src/prisma/generated/prisma-class/subject_lecture.ts b/src/prisma/generated/prisma-class/subject_lecture.ts deleted file mode 100644 index 67d8ad84..00000000 --- a/src/prisma/generated/prisma-class/subject_lecture.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { subject_department } from './subject_department'; -import { subject_course } from './subject_course'; -import { main_reviewwritedailyuserfeed } from './main_reviewwritedailyuserfeed'; -import { planner_takenplanneritem } from './planner_takenplanneritem'; -import { session_userprofile_taken_lectures } from './session_userprofile_taken_lectures'; -import { subject_classtime } from './subject_classtime'; -import { subject_examtime } from './subject_examtime'; -import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; -import { timetable_timetable_lectures } from './timetable_timetable_lectures'; -import { timetable_wishlist_lectures } from './timetable_wishlist_lectures'; -import { subject_lecture_professors } from './subject_lecture_professors'; -import { review_review } from './review_review'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class subject_lecture { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - code: string; - - @ApiProperty({ type: String }) - old_code: string; - - @ApiProperty({ type: Number }) - year: number; - - @ApiProperty({ type: Number }) - semester: number; - - @ApiProperty({ type: Number }) - department_id: number; - - @ApiProperty({ type: () => subject_department }) - subject_department: subject_department; - - @ApiProperty({ type: String }) - class_no: string; - - @ApiProperty({ type: String }) - title: string; - - @ApiProperty({ type: String }) - title_en: string; - - @ApiProperty({ type: String }) - type: string; - - @ApiProperty({ type: String }) - type_en: string; - - @ApiProperty({ type: Number }) - audience: number; - - @ApiProperty({ type: Number }) - credit: number; - - @ApiProperty({ type: String }) - title_en_no_space: string; - - @ApiProperty({ type: String }) - title_no_space: string; - - @ApiProperty({ type: Number }) - num_classes: number; - - @ApiProperty({ type: Number }) - num_labs: number; - - @ApiProperty({ type: Number }) - credit_au: number; - - @ApiProperty({ type: Number }) - limit: number; - - @ApiPropertyOptional({ type: Number }) - num_people?: number; - - @ApiProperty({ type: Boolean }) - is_english: boolean; - - @ApiProperty({ type: Boolean }) - deleted: boolean; - - @ApiProperty({ type: Number }) - course_id: number; - - @ApiProperty({ type: () => subject_course }) - course: subject_course; - - @ApiProperty({ type: Number }) - grade_sum: number; - - @ApiProperty({ type: Number }) - load_sum: number; - - @ApiProperty({ type: Number }) - speech_sum: number; - - @ApiProperty({ type: Number }) - grade: number; - - @ApiProperty({ type: Number }) - load: number; - - @ApiProperty({ type: Number }) - speech: number; - - @ApiProperty({ type: Number }) - review_total_weight: number; - - @ApiPropertyOptional({ type: String }) - class_title?: string; - - @ApiPropertyOptional({ type: String }) - class_title_en?: string; - - @ApiPropertyOptional({ type: String }) - common_title?: string; - - @ApiPropertyOptional({ type: String }) - common_title_en?: string; - - @ApiProperty({ isArray: true, type: () => main_reviewwritedailyuserfeed }) - main_reviewwritedailyuserfeed: main_reviewwritedailyuserfeed[]; - - @ApiProperty({ isArray: true, type: () => planner_takenplanneritem }) - planner_takenplanneritem: planner_takenplanneritem[]; - - @ApiProperty({ - isArray: true, - type: () => session_userprofile_taken_lectures, - }) - students: session_userprofile_taken_lectures[]; - - @ApiProperty({ isArray: true, type: () => subject_classtime }) - subject_classtime: subject_classtime[]; - - @ApiProperty({ isArray: true, type: () => subject_examtime }) - subject_examtime: subject_examtime[]; - - @ApiProperty({ isArray: true, type: () => timetable_oldtimetable_lectures }) - timetable_oldtimetable_lectures: timetable_oldtimetable_lectures[]; - - @ApiProperty({ isArray: true, type: () => timetable_timetable_lectures }) - timetable_timetable_lectures: timetable_timetable_lectures[]; - - @ApiProperty({ isArray: true, type: () => timetable_wishlist_lectures }) - timetable_wishlist_lectures: timetable_wishlist_lectures[]; - - @ApiProperty({ isArray: true, type: () => subject_lecture_professors }) - subject_lecture_professors: subject_lecture_professors[]; - - @ApiProperty({ isArray: true, type: () => review_review }) - review: review_review[]; -} diff --git a/src/prisma/generated/prisma-class/subject_lecture_professors.ts b/src/prisma/generated/prisma-class/subject_lecture_professors.ts deleted file mode 100644 index 2ff4209e..00000000 --- a/src/prisma/generated/prisma-class/subject_lecture_professors.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { subject_professor } from './subject_professor'; -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_lecture_professors { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: Number }) - professor_id: number; - - @ApiProperty({ type: () => subject_lecture }) - lecture: subject_lecture; - - @ApiProperty({ type: () => subject_professor }) - professor: subject_professor; -} diff --git a/src/prisma/generated/prisma-class/subject_professor.ts b/src/prisma/generated/prisma-class/subject_professor.ts deleted file mode 100644 index 769b5a38..00000000 --- a/src/prisma/generated/prisma-class/subject_professor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { subject_course_professors } from './subject_course_professors'; -import { subject_lecture_professors } from './subject_lecture_professors'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class subject_professor { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - professor_name: string; - - @ApiPropertyOptional({ type: String }) - professor_name_en?: string; - - @ApiProperty({ type: Number }) - professor_id: number; - - @ApiProperty({ type: String }) - major: string; - - @ApiProperty({ type: Number }) - grade_sum: number; - - @ApiProperty({ type: Number }) - load_sum: number; - - @ApiProperty({ type: Number }) - speech_sum: number; - - @ApiProperty({ type: Number }) - review_total_weight: number; - - @ApiProperty({ type: Number }) - grade: number; - - @ApiProperty({ type: Number }) - load: number; - - @ApiProperty({ type: Number }) - speech: number; - - @ApiProperty({ isArray: true, type: () => subject_course_professors }) - subject_course_professors: subject_course_professors[]; - - @ApiProperty({ isArray: true, type: () => subject_lecture_professors }) - subject_lecture_professors: subject_lecture_professors[]; -} diff --git a/src/prisma/generated/prisma-class/subject_professor_course_list.ts b/src/prisma/generated/prisma-class/subject_professor_course_list.ts deleted file mode 100644 index aaa69a00..00000000 --- a/src/prisma/generated/prisma-class/subject_professor_course_list.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class subject_professor_course_list { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - professor_id: number; - - @ApiProperty({ type: Number }) - course_id: number; -} diff --git a/src/prisma/generated/prisma-class/subject_semester.ts b/src/prisma/generated/prisma-class/subject_semester.ts deleted file mode 100644 index 60aa70d0..00000000 --- a/src/prisma/generated/prisma-class/subject_semester.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { main_rankedreviewdailyfeed } from './main_rankedreviewdailyfeed'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class subject_semester { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - year: number; - - @ApiProperty({ type: Number }) - semester: number; - - @ApiProperty({ type: Date }) - beginning: Date; - - @ApiProperty({ type: Date }) - end: Date; - - @ApiPropertyOptional({ type: Date }) - courseRegistrationPeriodStart?: Date; - - @ApiPropertyOptional({ type: Date }) - courseRegistrationPeriodEnd?: Date; - - @ApiPropertyOptional({ type: Date }) - courseAddDropPeriodEnd?: Date; - - @ApiPropertyOptional({ type: Date }) - courseDropDeadline?: Date; - - @ApiPropertyOptional({ type: Date }) - courseEvaluationDeadline?: Date; - - @ApiPropertyOptional({ type: Date }) - gradePosting?: Date; - - @ApiPropertyOptional({ type: Date }) - courseDesciptionSubmission?: Date; - - @ApiProperty({ isArray: true, type: () => main_rankedreviewdailyfeed }) - main_rankedreviewdailyfeed: main_rankedreviewdailyfeed[]; -} diff --git a/src/prisma/generated/prisma-class/support_notice.ts b/src/prisma/generated/prisma-class/support_notice.ts deleted file mode 100644 index 844220d0..00000000 --- a/src/prisma/generated/prisma-class/support_notice.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; - -export class support_notice { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Date }) - start_time: Date; - - @ApiProperty({ type: Date }) - end_time: Date; - - @ApiProperty({ type: String }) - title: string; - - @ApiProperty({ type: String }) - content: string; -} diff --git a/src/prisma/generated/prisma-class/support_rate.ts b/src/prisma/generated/prisma-class/support_rate.ts deleted file mode 100644 index 72b2977a..00000000 --- a/src/prisma/generated/prisma-class/support_rate.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class support_rate { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - score: number; - - @ApiProperty({ type: Number }) - year: number; - - @ApiPropertyOptional({ type: Date }) - created_datetime?: Date; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: String }) - version: string; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; -} diff --git a/src/prisma/generated/prisma-class/timetable_oldtimetable.ts b/src/prisma/generated/prisma-class/timetable_oldtimetable.ts deleted file mode 100644 index 5d12a8be..00000000 --- a/src/prisma/generated/prisma-class/timetable_oldtimetable.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { timetable_oldtimetable_lectures } from './timetable_oldtimetable_lectures'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class timetable_oldtimetable { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: String }) - student_id: string; - - @ApiPropertyOptional({ type: Number }) - year?: number; - - @ApiPropertyOptional({ type: Number }) - semester?: number; - - @ApiPropertyOptional({ type: Number }) - table_no?: number; - - @ApiProperty({ isArray: true, type: () => timetable_oldtimetable_lectures }) - timetable_oldtimetable_lectures: timetable_oldtimetable_lectures[]; -} diff --git a/src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts b/src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts deleted file mode 100644 index 422c374d..00000000 --- a/src/prisma/generated/prisma-class/timetable_oldtimetable_lectures.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { timetable_oldtimetable } from './timetable_oldtimetable'; -import { ApiProperty } from '@nestjs/swagger'; - -export class timetable_oldtimetable_lectures { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - oldtimetable_id: number; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: () => subject_lecture }) - subject_lecture: subject_lecture; - - @ApiProperty({ type: () => timetable_oldtimetable }) - timetable_oldtimetable: timetable_oldtimetable; -} diff --git a/src/prisma/generated/prisma-class/timetable_timetable.ts b/src/prisma/generated/prisma-class/timetable_timetable.ts deleted file mode 100644 index 9c2f15ce..00000000 --- a/src/prisma/generated/prisma-class/timetable_timetable.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { timetable_timetable_lectures } from './timetable_timetable_lectures'; -import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class timetable_timetable { - @ApiProperty({ type: Number }) - id: number; - - @ApiPropertyOptional({ type: Number }) - year?: number; - - @ApiPropertyOptional({ type: Number }) - semester?: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: Number }) - arrange_order: number; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; - - @ApiProperty({ isArray: true, type: () => timetable_timetable_lectures }) - timetable_timetable_lectures: timetable_timetable_lectures[]; -} diff --git a/src/prisma/generated/prisma-class/timetable_timetable_lectures.ts b/src/prisma/generated/prisma-class/timetable_timetable_lectures.ts deleted file mode 100644 index 582cdf2a..00000000 --- a/src/prisma/generated/prisma-class/timetable_timetable_lectures.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { timetable_timetable } from './timetable_timetable'; -import { ApiProperty } from '@nestjs/swagger'; - -export class timetable_timetable_lectures { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - timetable_id: number; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: () => subject_lecture }) - subject_lecture: subject_lecture; - - @ApiProperty({ type: () => timetable_timetable }) - timetable_timetable: timetable_timetable; -} diff --git a/src/prisma/generated/prisma-class/timetable_wishlist.ts b/src/prisma/generated/prisma-class/timetable_wishlist.ts deleted file mode 100644 index 2e3e42b9..00000000 --- a/src/prisma/generated/prisma-class/timetable_wishlist.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { session_userprofile } from './session_userprofile'; -import { timetable_wishlist_lectures } from './timetable_wishlist_lectures'; -import { ApiProperty } from '@nestjs/swagger'; - -export class timetable_wishlist { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - user_id: number; - - @ApiProperty({ type: () => session_userprofile }) - session_userprofile: session_userprofile; - - @ApiProperty({ isArray: true, type: () => timetable_wishlist_lectures }) - timetable_wishlist_lectures: timetable_wishlist_lectures[]; -} diff --git a/src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts b/src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts deleted file mode 100644 index b09da8e5..00000000 --- a/src/prisma/generated/prisma-class/timetable_wishlist_lectures.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { subject_lecture } from './subject_lecture'; -import { timetable_wishlist } from './timetable_wishlist'; -import { ApiProperty } from '@nestjs/swagger'; - -export class timetable_wishlist_lectures { - @ApiProperty({ type: Number }) - id: number; - - @ApiProperty({ type: Number }) - wishlist_id: number; - - @ApiProperty({ type: Number }) - lecture_id: number; - - @ApiProperty({ type: () => subject_lecture }) - subject_lecture: subject_lecture; - - @ApiProperty({ type: () => timetable_wishlist }) - timetable_wishlist: timetable_wishlist; -} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 7dcd1660..deb8988b 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,8 +1,7 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { subject_course } from "../generated/prisma-class/subject_course"; -import { subject_lecture } from "../generated/prisma-class/subject_lecture"; +import { CourseDetails, LectureDetails } from "../../common/schemaTypes/types"; @Injectable() export class CourseRepository { @@ -42,7 +41,7 @@ export class CourseRepository { "TS", ] - public async getCourseById (id: number): Promise { + public async getCourseById (id: number): Promise { return await this.prisma.subject_course.findUnique({ include: { subject_department: true, @@ -53,10 +52,10 @@ export class CourseRepository { where: { id: id } - }) as subject_course; + }); } - public async getLecturesByCourseId (query: {order: string[]}, id: number): Promise { + public async getLecturesByCourseId (query: {order: string[]}, id: number): Promise { const course = await this.prisma.subject_course.findUnique({ include: { lecture: { @@ -71,14 +70,14 @@ export class CourseRepository { where: { id: id, } - }) as subject_course; - const filterdLecture = course.lecture.filter((lecture) => !lecture.deleted); + }); + const filteredLecture = course.lecture.filter((lecture) => !lecture.deleted); const order = query.order ? query.order : ['year', 'semester', 'class_no']; - return applyOrder(filterdLecture, order); + return applyOrder(filteredLecture, order); } //@todo: optimize goal: 1.5s -> 0.5s, recommended: using cache - public async filterByRequest (query: any): Promise { + public async filterByRequest (query: any): Promise { const DEFAULT_LIMIT = 150; const DEFAULT_ORDER = ['old_code'] @@ -111,12 +110,12 @@ export class CourseRepository { AND: filterList }, take: limit ?? DEFAULT_LIMIT, - }) as subject_course[]; - const levelFilteredResult = this.levelFilter(queryResult, level) as subject_course[]; + }); + const levelFilteredResult = this.levelFilter(queryResult, level); // Apply Ordering and Offset - const orderedResult = applyOrder(levelFilteredResult, order ?? DEFAULT_ORDER); - return await applyOffset(orderedResult, offset ?? 0); + const orderedResult = applyOrder(levelFilteredResult, order ?? DEFAULT_ORDER); + return applyOffset(orderedResult, offset ?? 0); } public departmentFilter(department_names: string[]): object { @@ -289,7 +288,7 @@ export class CourseRepository { }; } - public levelFilter (queryResult: (subject_course|subject_lecture)[], levels: string[]) { + public levelFilter (queryResult: T[], levels: string[]): (T)[] { if (!levels) { return queryResult } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 8e6f0857..cf5a8d67 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -2,10 +2,10 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { Prisma, session_userprofile } from "@prisma/client"; import { groupBy } from "../../common/utils/method.utils"; -import { LectureQueryDTO } from "src/common/interfaces/dto/lecture/lecture.query.dto"; +import { LectureQueryDto } from "src/common/interfaces/dto/lecture/lecture.request.dto"; import { CourseRepository } from "./course.repository"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { subject_lecture } from "../generated/prisma-class/subject_lecture"; +import { LectureDetails } from "../../common/schemaTypes/types"; @Injectable() export class LectureRepository { @@ -14,7 +14,7 @@ export class LectureRepository { private readonly courseRepository: CourseRepository ) {} - async getLectureById(id: number): Promise { + async getLectureById(id: number): Promise { return await this.prisma.subject_lecture.findUnique({ include: { subject_department: true, @@ -25,10 +25,10 @@ export class LectureRepository { where: { id: id } - }) as subject_lecture; + }); } - async filterByRequest(query: LectureQueryDTO): Promise { + async filterByRequest(query: LectureQueryDto): Promise { const DEFAULT_LIMIT = 300; const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; const researchTypes = ["Individual Study", "Thesis Study(Undergraduate)", @@ -66,14 +66,14 @@ export class LectureRepository { AND: filters.filter((filter) => filter !== null) }, take: query.limit ?? DEFAULT_LIMIT, - }) as subject_lecture[]; - const levelFilteredResult = this.courseRepository.levelFilter(queryResult, query?.level) as subject_lecture[]; + }); + const levelFilteredResult = this.courseRepository.levelFilter(queryResult, query?.level); - const orderedQuery = applyOrder(levelFilteredResult, query.order ?? DEFAULT_ORDER); - return applyOffset(orderedQuery, query.offset ?? 0); + const orderedQuery = applyOrder(levelFilteredResult, query.order ?? DEFAULT_ORDER); + return applyOffset(orderedQuery, query.offset ?? 0); } - async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { + async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { let currDate; if (!date) { currDate = Date.now(); @@ -133,7 +133,7 @@ export class LectureRepository { } } - async getTakenLectures(user: session_userprofile): Promise { + async getTakenLectures(user: session_userprofile): Promise { const lectures = (await this.prisma.session_userprofile_taken_lectures.findMany({ where: { userprofile_id: user.id @@ -152,7 +152,7 @@ export class LectureRepository { } } } - })).map((takenLecture) => takenLecture.lecture as subject_lecture); + })).map((takenLecture) => takenLecture.lecture); return lectures; } diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index f5f1575d..4334dfbb 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,15 +1,15 @@ import { applyOffset } from 'src/common/utils/search.utils'; import { Injectable } from '@nestjs/common'; import { applyOrder } from 'src/common/utils/search.utils'; -import { review_review } from 'src/prisma/generated/prisma-class/review_review'; -import { session_userprofile } from '@prisma/client'; +import { Prisma, session_userprofile } from "@prisma/client"; import { PrismaService } from '../prisma.service'; +import { ReviewDetails } from "../../common/schemaTypes/types"; @Injectable() export class ReviewsRepository { constructor(private readonly prisma: PrismaService) {} - async findReviewByUser(user: session_userprofile): Promise{ + async findReviewByUser(user: session_userprofile): Promise{ const reviews = await this.prisma.review_review.findMany({ where: { writer_id: user.id }, include: { @@ -31,15 +31,17 @@ export class ReviewsRepository { }, } }) - return reviews as review_review[]; + return reviews; } + + public async getReviews( lecture_year: number, lecture_semester: number, order: string[], offset: number, limit: number - ): Promise { + ): Promise { let lectureFilter: object = {}; const orderFilter: { [key: string]: string }[] = []; if (lecture_year) { @@ -98,7 +100,7 @@ export class ReviewsRepository { 'is_deleted', 'written_datetime', ], - })) as review_review[]; + })); return reviews; } diff --git a/test/typeTest.ts b/test/typeTest.ts new file mode 100644 index 00000000..27a8bf5f --- /dev/null +++ b/test/typeTest.ts @@ -0,0 +1,36 @@ +import settings from "../src/settings"; +import { PrismaService } from "../src/prisma/prisma.service"; +import { Prisma, session_userprofile } from "@prisma/client"; + +const ormSettings = settings().ormconfig(); + +const prismaService = new PrismaService(); + +async function findReviewByUserTest(user: session_userprofile) { + return await this.prisma.review_review.findMany({ + where: { writer_id: user.id }, + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, + } + }) +} + + + +type ReviewDetails = Prisma.PromiseReturnType + From 2725d4afa466fa5f262555f3c6e6cfaddfcc3bb2 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Mon, 14 Aug 2023 13:30:59 +0900 Subject: [PATCH 088/250] Migrate: add default to is_deleted, like, speech, load, grade of review_review --- .../migration.sql | 12 ++++++++++++ src/prisma/schema.prisma | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 src/prisma/migrations/20230814042655_add_default_value_review_review_is_deleted_like/migration.sql diff --git a/src/prisma/migrations/20230814042655_add_default_value_review_review_is_deleted_like/migration.sql b/src/prisma/migrations/20230814042655_add_default_value_review_review_is_deleted_like/migration.sql new file mode 100644 index 00000000..5a2bcf1a --- /dev/null +++ b/src/prisma/migrations/20230814042655_add_default_value_review_review_is_deleted_like/migration.sql @@ -0,0 +1,12 @@ +-- DropForeignKey +ALTER TABLE `review_review` DROP FOREIGN KEY `review_review_writer_id_fkey`; + +-- AlterTable +ALTER TABLE `review_review` MODIFY `grade` SMALLINT NOT NULL DEFAULT 0, + MODIFY `load` SMALLINT NOT NULL DEFAULT 0, + MODIFY `speech` SMALLINT NOT NULL DEFAULT 0, + MODIFY `like` INTEGER NOT NULL DEFAULT 0, + MODIFY `is_deleted` INTEGER NOT NULL DEFAULT 0; + +-- AddForeignKey +ALTER TABLE `review_review` ADD CONSTRAINT `review_review_writer_id_fkey` FOREIGN KEY (`writer_id`) REFERENCES `session_userprofile`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index ec6a9721..0acf5efe 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -234,18 +234,18 @@ model review_review { lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onDelete: Restrict) content String @db.MediumText - grade Int @db.SmallInt - load Int @db.SmallInt - speech Int @db.SmallInt + grade Int @db.SmallInt @default(0) + load Int @db.SmallInt @default(0) + speech Int @db.SmallInt @default(0) writer_id Int? writer_label String @db.VarChar(200) updated_datetime DateTime @db.DateTime(0) - like Int - is_deleted Int + like Int @default(0) + is_deleted Int @default(0) written_datetime DateTime? @db.DateTime(0) main_famoushumanityreviewdailyfeed_reviews main_famoushumanityreviewdailyfeed_reviews[] main_famousmajorreviewdailyfeed_reviews main_famousmajorreviewdailyfeed_reviews[] - writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) + writer session_userprofile? @relation(fields: [writer_id], references: [id], onDelete: SetNull) review_reviewvote review_reviewvote[] @@unique([writer_id, lecture_id], map: "review_comment_writer_id_af700a5d_uniq") From 21bfbcdcef1602c3bbb68bbf14f10f2b77fa0c48 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Mon, 14 Aug 2023 15:20:43 +0900 Subject: [PATCH 089/250] Add: test complete -[POST] /api/reviews --- .../dto/reviews/reviews.request.dto.ts | 38 ++++++++- .../interfaces/dto/reviews/validators.ts | 11 +++ src/modules/reviews/reviews.controller.ts | 21 +++-- src/modules/reviews/reviews.module.ts | 3 +- src/modules/reviews/reviews.service.ts | 79 ++++++++++++++---- src/prisma/repositories/review.repository.ts | 81 +++++++++++++++---- 6 files changed, 190 insertions(+), 43 deletions(-) diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index c3255bae..ee842a87 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -1,13 +1,16 @@ import { Transform, Type } from 'class-transformer'; import { IsArray, + IsNotEmpty, IsNumber, IsOptional, IsString, + Max, + Min, Validate, } from 'class-validator'; import { CourseResponseDto } from '../course/course.response.dto'; -import { OrderDefaultValidator } from './validators'; +import { OrderDefaultValidator, StringStripLength } from './validators'; export class getReviewDto { @IsOptional() @@ -39,3 +42,36 @@ export class getReviewDto { @Type(() => Number) limit?: number; } + +export class postReviewDto { + @IsString() + @IsNotEmpty() + @Validate(StringStripLength) + content: string; + + @IsNumber() + @IsNotEmpty() + @Type(() => Number) + lecture: number; + + @IsNumber() + @IsNotEmpty() + @Min(1) + @Max(5) + @Type(() => Number) + grade: number; + + @IsNumber() + @IsNotEmpty() + @Min(1) + @Max(5) + @Type(() => Number) + load: number; + + @IsNumber() + @IsNotEmpty() + @Min(1) + @Max(5) + @Type(() => Number) + speech: number; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/reviews/validators.ts b/src/common/interfaces/dto/reviews/validators.ts index 5b38113e..0cd4b6da 100644 --- a/src/common/interfaces/dto/reviews/validators.ts +++ b/src/common/interfaces/dto/reviews/validators.ts @@ -25,3 +25,14 @@ export class OrderDefaultValidator implements ValidatorConstraintInterface { return 'Body ' + args + ' did not pass validator'; } } + +@ValidatorConstraint({ name: 'STRING_STRIP_LENGTH', async: false }) +export class StringStripLength implements ValidatorConstraintInterface { + validate(text: string): boolean { + return text?.trim().length > 0; + } + + defaultMessage(args: ValidationArguments): string { + return "Body 'content' did not pass validator: content must not be empty"; + } +} \ No newline at end of file diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index c37aca2e..40624187 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,9 +1,10 @@ -import { Body, Controller, Get, Post, Query } from '@nestjs/common'; -import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { Body, Controller, Get, HttpException, Post, Query } from '@nestjs/common'; +import { getReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { session_userprofile } from '@prisma/client'; @Controller('api/reviews') export class ReviewsController { @@ -29,10 +30,16 @@ export class ReviewsController { return result; } - /*@Post() - async postReviews(@Body() reviewsBody: postReviewDto,@GetUser() user: session_userprofile): Promise { - if(user){ - const lecture = user. + @Post() + async postReviews( + @Body() reviewsBody: postReviewDto, + @GetUser() user: session_userprofile, + ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })> { + if (user) { + const result = await this.reviewsService.postReviews(reviewsBody, user); + return result; + } else { + throw new HttpException("Can't find user", 401); } - }*/ + } } diff --git a/src/modules/reviews/reviews.module.ts b/src/modules/reviews/reviews.module.ts index e531b294..e7063905 100644 --- a/src/modules/reviews/reviews.module.ts +++ b/src/modules/reviews/reviews.module.ts @@ -2,10 +2,11 @@ import { PrismaModule } from './../../prisma/prisma.module'; import { Module } from '@nestjs/common'; import { ReviewsController } from './reviews.controller'; import { ReviewsService } from './reviews.service'; +import { UserService } from '../user/user.service'; @Module({ imports: [PrismaModule], controllers: [ReviewsController], - providers: [ReviewsService], + providers: [ReviewsService, UserService], }) export class ReviewsModule {} diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index a7cd6a6d..e5eac4c6 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,15 +1,20 @@ import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { getReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; -import { Injectable } from '@nestjs/common'; +import { getReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { HttpException, Injectable } from '@nestjs/common'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { session_userprofile } from '@prisma/client'; +import { LectureRepository } from 'src/prisma/repositories/lecture.repository'; @Injectable() export class ReviewsService { - constructor(private readonly reviewsRepository: ReviewsRepository) {} + constructor( + private readonly reviewsRepository: ReviewsRepository, + private readonly lectureRepository: LectureRepository, + ) {} async getReviews( reviewsParam: getReviewDto, - user, + user: session_userprofile, ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { const MAX_LIMIT = 50; const DEFAULT_ORDER = ['-written_datetime', '-id']; @@ -20,19 +25,24 @@ export class ReviewsService { reviewsParam.offset ?? 0, reviewsParam.limit ?? MAX_LIMIT, ); - return await Promise.all(reviews.map(async (review) => { - const result = toJsonReview(review); - if (user) { - const isLiked: boolean =await this.reviewsRepository.isLiked(review.id, user.id); - return Object.assign(result, { - userspecific_is_liked: isLiked, - }); - } else { - return Object.assign(result, { - userspecific_is_liked: false, - }); - } - })); + return await Promise.all( + reviews.map(async (review) => { + const result = toJsonReview(review); + if (user) { + const isLiked: boolean = await this.reviewsRepository.isLiked( + review.id, + user.id, + ); + return Object.assign(result, { + userspecific_is_liked: isLiked, + }); + } else { + return Object.assign(result, { + userspecific_is_liked: false, + }); + } + }), + ); } async getReviewsCount( @@ -44,4 +54,39 @@ export class ReviewsService { lecture_semester, ); } + + async postReviews( + reviewsBody: postReviewDto, + user: session_userprofile, + ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })> { + const reviewWritableLectures = + await this.lectureRepository.findReviewWritableLectures(user, new Date()); + const reviewLecture = reviewWritableLectures.find((lecture) => { + return lecture.id == reviewsBody.lecture; + }); + if(reviewLecture==undefined) throw new HttpException("Can't find lecture", 401); + const review = await this.reviewsRepository.newReview( + reviewLecture.course_id, + reviewLecture.id, + reviewsBody.content, + reviewsBody.grade, + reviewsBody.load, + reviewsBody.speech, + user.id, + ); + const result = toJsonReview(review); + if (user) { + const isLiked: boolean = await this.reviewsRepository.isLiked( + review.id, + user.id, + ); + return Object.assign(result, { + userspecific_is_liked: isLiked, + }); + } else { + return Object.assign(result, { + userspecific_is_liked: false, + }); + } + } } diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 4334dfbb..4b3cb160 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,7 +1,5 @@ -import { applyOffset } from 'src/common/utils/search.utils'; import { Injectable } from '@nestjs/common'; -import { applyOrder } from 'src/common/utils/search.utils'; -import { Prisma, session_userprofile } from "@prisma/client"; +import { session_userprofile } from "@prisma/client"; import { PrismaService } from '../prisma.service'; import { ReviewDetails } from "../../common/schemaTypes/types"; @@ -9,7 +7,7 @@ import { ReviewDetails } from "../../common/schemaTypes/types"; export class ReviewsRepository { constructor(private readonly prisma: PrismaService) {} - async findReviewByUser(user: session_userprofile): Promise{ + async findReviewByUser(user: session_userprofile): Promise { const reviews = await this.prisma.review_review.findMany({ where: { writer_id: user.id }, include: { @@ -29,18 +27,17 @@ export class ReviewsRepository { subject_examtime: true, }, }, - } - }) + }, + }); return reviews; } - public async getReviews( lecture_year: number, lecture_semester: number, order: string[], offset: number, - limit: number + limit: number, ): Promise { let lectureFilter: object = {}; const orderFilter: { [key: string]: string }[] = []; @@ -51,7 +48,7 @@ export class ReviewsRepository { lectureFilter = { ...lectureFilter, semester: lecture_semester }; } order.forEach((orderList) => { - const orderDict: {[key:string]:string} = {}; + const orderDict: { [key: string]: string } = {}; let order = 'asc'; const orderBy = orderList.split('-'); if (orderBy[0] == '') { @@ -60,7 +57,7 @@ export class ReviewsRepository { orderDict[orderBy[orderBy.length - 1]] = order; orderFilter.push(orderDict); }); - const reviews = (await this.prisma.review_review.findMany({ + const reviews = await this.prisma.review_review.findMany({ where: { lecture: lectureFilter, }, @@ -100,7 +97,7 @@ export class ReviewsRepository { 'is_deleted', 'written_datetime', ], - })); + }); return reviews; } @@ -108,14 +105,17 @@ export class ReviewsRepository { async isLiked(reviewId: number, userId: number): Promise { return !!(await this.prisma.review_reviewvote.findUnique({ where: { - review_id_userprofile_id:{ + review_id_userprofile_id: { review_id: reviewId, - userprofile_id: userId - } + userprofile_id: userId, + }, }, })); } - public async getReviewsCount(lecture_year:number, lecture_semester:number):Promise { + public async getReviewsCount( + lecture_year: number, + lecture_semester: number, + ): Promise { let lecture_filter: object = {}; if (lecture_year) { lecture_filter = { ...lecture_filter, year: lecture_year }; @@ -133,7 +133,7 @@ export class ReviewsRepository { 'lecture_id', 'content', 'grade', - 'load', + 'load', 'speech', 'writer_id', 'writer_label', @@ -142,7 +142,54 @@ export class ReviewsRepository { 'is_deleted', 'written_datetime', ], - }); + }); return reviewsCount; } + + async newReview( + courseId: number, + lectureId: number, + content: string, + grade: number, + load: number, + speech: number, + writerId: number, + ): Promise { + return await this.prisma.review_review.upsert({ + where: { + writer_id_lecture_id: {writer_id:writerId, lecture_id:lectureId} + }, + update: {}, + create: { + course: { connect: { id: courseId } }, + lecture: { connect: { id: lectureId } }, + content: content, + grade: grade, + load: load, + speech: speech, + writer: { connect: { id: writerId } }, + writer_label: '무학과 넙죽이', + written_datetime: new Date(), + updated_datetime: new Date(), + }, + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, + }, + }); + } } From a724deac5007136aa375b3265b44655c4666d63c Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Mon, 14 Aug 2023 17:14:28 +0900 Subject: [PATCH 090/250] Add: test complete -[GET] /api/reviews/:reviewId -[PATCH] /api/reviews/:reviewId --- .../dto/reviews/reviews.request.dto.ts | 28 ++++++++ src/modules/reviews/reviews.controller.ts | 36 ++++++++-- src/modules/reviews/reviews.service.ts | 65 +++++++++++++++++-- src/prisma/repositories/review.repository.ts | 63 +++++++++++++++++- 4 files changed, 180 insertions(+), 12 deletions(-) diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index ee842a87..ac5eb61b 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -74,4 +74,32 @@ export class postReviewDto { @Max(5) @Type(() => Number) speech: number; +} + +export class patchReviewDto { + @IsOptional() + @IsString() + @Validate(StringStripLength) + content?: string; + + @IsOptional() + @IsNumber() + @Min(1) + @Max(5) + @Type(() => Number) + grade?: number; + + @IsOptional() + @IsNumber() + @Min(1) + @Max(5) + @Type(() => Number) + load?: number; + + @IsOptional() + @IsNumber() + @Min(1) + @Max(5) + @Type(() => Number) + speech?: number; } \ No newline at end of file diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 40624187..92a2a61b 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,5 +1,9 @@ -import { Body, Controller, Get, HttpException, Post, Query } from '@nestjs/common'; -import { getReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { Body, Controller, Get, HttpException, Param, Patch, Post, Query } from '@nestjs/common'; +import { + getReviewDto, + postReviewDto, + patchReviewDto, +} from 'src/common/interfaces/dto/reviews/reviews.request.dto'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @@ -8,10 +12,7 @@ import { session_userprofile } from '@prisma/client'; @Controller('api/reviews') export class ReviewsController { - constructor( - private readonly reviewsService: ReviewsService, - private readonly reviewsRepository: ReviewsRepository, - ) {} + constructor(private readonly reviewsService: ReviewsService) {} @Get() async getReviews( @Query() reviewsParam: getReviewDto, @@ -34,7 +35,7 @@ export class ReviewsController { async postReviews( @Body() reviewsBody: postReviewDto, @GetUser() user: session_userprofile, - ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })> { + ): Promise { if (user) { const result = await this.reviewsService.postReviews(reviewsBody, user); return result; @@ -42,4 +43,25 @@ export class ReviewsController { throw new HttpException("Can't find user", 401); } } + + @Get(':reviewId') + async getReviewInstance( + @Param('reviewId') reviewId: number, + @GetUser() user: session_userprofile, + ): Promise { + return await this.reviewsService.getReviewById(reviewId, user); + } + + @Patch(':reviewId') + async patchReviewInstance( + @Body() reviewsBody: patchReviewDto, + @Param('reviewId') reviewId: number, + @GetUser() user: session_userprofile, + ): Promise { + if (user) { + return await this.reviewsService.patchReviewById(reviewId, user, reviewsBody); + } else { + throw new HttpException("Can't find user", 401); + } + } } diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index e5eac4c6..5df82d20 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,6 +1,6 @@ import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { getReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; -import { HttpException, Injectable } from '@nestjs/common'; +import { getReviewDto, patchReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; import { session_userprofile } from '@prisma/client'; @@ -12,6 +12,28 @@ export class ReviewsService { private readonly reviewsRepository: ReviewsRepository, private readonly lectureRepository: LectureRepository, ) {} + + async getReviewById( + reviewId: number, + user: session_userprofile, + ): Promise { + const review = await this.reviewsRepository.getReviewById(reviewId); + if (review == undefined) throw new HttpException("Can't find review", 404); + const result = toJsonReview(review); + if (user) { + const isLiked: boolean = await this.reviewsRepository.isLiked( + review.id, + user.id, + ); + return Object.assign(result, { + userspecific_is_liked: isLiked, + }); + } else { + return Object.assign(result, { + userspecific_is_liked: false, + }); + } + } async getReviews( reviewsParam: getReviewDto, user: session_userprofile, @@ -58,13 +80,14 @@ export class ReviewsService { async postReviews( reviewsBody: postReviewDto, user: session_userprofile, - ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })> { + ): Promise { const reviewWritableLectures = await this.lectureRepository.findReviewWritableLectures(user, new Date()); const reviewLecture = reviewWritableLectures.find((lecture) => { return lecture.id == reviewsBody.lecture; }); - if(reviewLecture==undefined) throw new HttpException("Can't find lecture", 401); + if (reviewLecture == undefined) + throw new HttpException("Can't find lecture", 401); const review = await this.reviewsRepository.newReview( reviewLecture.course_id, reviewLecture.id, @@ -89,4 +112,38 @@ export class ReviewsService { }); } } + + async patchReviewById( + reviewId: number, + user: session_userprofile, + reviewBody: patchReviewDto, + ): Promise { + const review = await this.reviewsRepository.getReviewById(reviewId); + if (review == undefined) throw new HttpException("Can't find review", 404); + if (review.writer_id !== user.id) + throw new HttpException("Can't find user", 401); + if (review.is_deleted) + throw new HttpException('Target review deleted by admin',HttpStatus.BAD_REQUEST); + const patchReview = await this.reviewsRepository.patchReview( + review.id, + reviewBody.content, + reviewBody.grade, + reviewBody.load, + reviewBody.speech + ); + const result = toJsonReview(patchReview); + if (user) { + const isLiked: boolean = await this.reviewsRepository.isLiked( + review.id, + user.id, + ); + return Object.assign(result, { + userspecific_is_liked: isLiked, + }); + } else { + return Object.assign(result, { + userspecific_is_liked: false, + }); + } + } } diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 4b3cb160..07a5eb12 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -32,6 +32,29 @@ export class ReviewsRepository { return reviews; } + async getReviewById(reviewId: number): Promise { + return await this.prisma.review_review.findUnique({ + where: { id: reviewId }, + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, + }, + }); + } public async getReviews( lecture_year: number, lecture_semester: number, @@ -157,7 +180,7 @@ export class ReviewsRepository { ): Promise { return await this.prisma.review_review.upsert({ where: { - writer_id_lecture_id: {writer_id:writerId, lecture_id:lectureId} + writer_id_lecture_id: { writer_id: writerId, lecture_id: lectureId }, }, update: {}, create: { @@ -192,4 +215,42 @@ export class ReviewsRepository { }, }); } + + async patchReview( + reviewId: number, + content:string, + grade: number, + load: number, + speech: number, + ):Promise{ + return await this.prisma.review_review.update({ + where: { + id: reviewId, + }, + data: { + content: content, + grade: grade, + load: load, + speech: speech + }, + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, + }, + }); + } } From 45e3077a73bfce23c1ab2b8c9b84890aac711113 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 21 Aug 2023 22:16:13 +0900 Subject: [PATCH 091/250] Refactor: rename class name and remove prisma-class generator from schema.prisma --- src/common/interfaces/dto/reviews/reviews.request.dto.ts | 4 ++-- src/modules/reviews/reviews.controller.ts | 6 +++--- src/modules/reviews/reviews.service.ts | 6 +++--- src/prisma/schema.prisma | 6 ------ 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index ee842a87..718176ab 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -12,7 +12,7 @@ import { import { CourseResponseDto } from '../course/course.response.dto'; import { OrderDefaultValidator, StringStripLength } from './validators'; -export class getReviewDto { +export class GetReviewDto { @IsOptional() @IsNumber() @Type(() => Number) @@ -43,7 +43,7 @@ export class getReviewDto { limit?: number; } -export class postReviewDto { +export class PostReviewDto { @IsString() @IsNotEmpty() @Validate(StringStripLength) diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 40624187..77c774c6 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,5 +1,5 @@ import { Body, Controller, Get, HttpException, Post, Query } from '@nestjs/common'; -import { getReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { GetReviewDto, PostReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @@ -14,7 +14,7 @@ export class ReviewsController { ) {} @Get() async getReviews( - @Query() reviewsParam: getReviewDto, + @Query() reviewsParam: GetReviewDto, @GetUser() user, ): Promise< (ReviewResponseDto & { userspecific_is_liked: boolean })[] | number @@ -32,7 +32,7 @@ export class ReviewsController { @Post() async postReviews( - @Body() reviewsBody: postReviewDto, + @Body() reviewsBody: PostReviewDto, @GetUser() user: session_userprofile, ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })> { if (user) { diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index e5eac4c6..cfa9198a 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,5 +1,5 @@ import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { getReviewDto, postReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { GetReviewDto, PostReviewDto } from 'src/common/interfaces/dto/reviews/reviews.request.dto'; import { HttpException, Injectable } from '@nestjs/common'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @@ -13,7 +13,7 @@ export class ReviewsService { private readonly lectureRepository: LectureRepository, ) {} async getReviews( - reviewsParam: getReviewDto, + reviewsParam: GetReviewDto, user: session_userprofile, ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { const MAX_LIMIT = 50; @@ -56,7 +56,7 @@ export class ReviewsService { } async postReviews( - reviewsBody: postReviewDto, + reviewsBody: PostReviewDto, user: session_userprofile, ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })> { const reviewWritableLectures = diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 0acf5efe..731fbded 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -2,12 +2,6 @@ generator client { provider = "prisma-client-js" } -generator prismaClassGenerator { - provider = "prisma-class-generator" - dryRun = true - output = "./generated/prisma-class" -} - datasource db { provider = "mysql" url = env("DATABASE_URL") From a235dcc25f21e236e5f55693bd70a9dc92ca59cd Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 21 Aug 2023 22:44:43 +0900 Subject: [PATCH 092/250] Refactor: rename function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit todo - patch도 같은 함수 쓰도록 - validator 조금 더 범용적으로 쓸 수 있게 바꾸기 --- src/common/interfaces/dto/reviews/validators.ts | 1 + src/modules/reviews/reviews.service.ts | 4 ++-- src/prisma/repositories/review.repository.ts | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/interfaces/dto/reviews/validators.ts b/src/common/interfaces/dto/reviews/validators.ts index 0cd4b6da..2a50d2a0 100644 --- a/src/common/interfaces/dto/reviews/validators.ts +++ b/src/common/interfaces/dto/reviews/validators.ts @@ -13,6 +13,7 @@ const PROHIBITED_FIELD_PATTERN: RegExp[] = [ /__.*__/, ]; +//todo: make more general @ValidatorConstraint({ name: 'ORDER_DEFAULT_VALIDATOR', async: false }) export class OrderDefaultValidator implements ValidatorConstraintInterface { validate(order: string[]): boolean { diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index cfa9198a..45ad9015 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -64,8 +64,8 @@ export class ReviewsService { const reviewLecture = reviewWritableLectures.find((lecture) => { return lecture.id == reviewsBody.lecture; }); - if(reviewLecture==undefined) throw new HttpException("Can't find lecture", 401); - const review = await this.reviewsRepository.newReview( + if(reviewLecture==undefined) throw new HttpException("Can't find lecture", 404); + const review = await this.reviewsRepository.upsertReview( reviewLecture.course_id, reviewLecture.id, reviewsBody.content, diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 4b3cb160..1221d1aa 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -146,7 +146,8 @@ export class ReviewsRepository { return reviewsCount; } - async newReview( + // todo: patch도 동일한 함수 쓰게끔 + async upsertReview( courseId: number, lectureId: number, content: string, From 507d2ae7afcb2de398814127a66057ab794a0f99 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:05:27 +0900 Subject: [PATCH 093/250] Refactor: rename dtos in reviews.request.dto.ts --- src/common/interfaces/dto/reviews/reviews.request.dto.ts | 6 +++--- src/modules/reviews/reviews.controller.ts | 8 ++++---- src/modules/reviews/reviews.service.ts | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index 87e34b29..f52ae265 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -13,7 +13,7 @@ import { CourseResponseDto } from '../course/course.response.dto'; import { OrderDefaultValidator, StringStripLength } from './validators'; import { OmitType, PartialType } from "@nestjs/swagger"; -export class GetReviewDto { +export class ReviewQueryDto { @IsOptional() @IsNumber() @Type(() => Number) @@ -44,7 +44,7 @@ export class GetReviewDto { limit?: number; } -export class PostReviewDto { +export class ReviewCreateDto { @IsString() @IsNotEmpty() @Validate(StringStripLength) @@ -82,7 +82,7 @@ export class PostReviewDto { // } // nestjs-swagger -export class PatchReviewDto { +export class ReviewUpdateDto { @IsOptional() @IsString() @Validate(StringStripLength) diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 627b353f..85f26d83 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,5 +1,5 @@ import { Body, Controller, Get, HttpException, Post, Query, Param, Patch} from '@nestjs/common'; -import { GetReviewDto, PatchReviewDto, PostReviewDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; +import { ReviewQueryDto, ReviewUpdateDto, ReviewCreateDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @@ -11,7 +11,7 @@ export class ReviewsController { constructor(private readonly reviewsService: ReviewsService) {} @Get() async getReviews( - @Query() reviewsParam: GetReviewDto, + @Query() reviewsParam: ReviewQueryDto, @GetUser() user, ): Promise< (ReviewResponseDto & { userspecific_is_liked: boolean })[] | number @@ -29,7 +29,7 @@ export class ReviewsController { @Post() async postReviews( - @Body() reviewsBody: PostReviewDto, + @Body() reviewsBody: ReviewCreateDto, @GetUser() user: session_userprofile, ): Promise { if (user) { @@ -50,7 +50,7 @@ export class ReviewsController { @Patch(':reviewId') async patchReviewInstance( - @Body() reviewsBody: PatchReviewDto, + @Body() reviewsBody: ReviewUpdateDto, @Param('reviewId') reviewId: number, @GetUser() user: session_userprofile, ): Promise { diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 3b70d96d..9fd1ae4d 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,5 +1,5 @@ import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { GetReviewDto, PatchReviewDto, PostReviewDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; +import { ReviewQueryDto, ReviewUpdateDto, ReviewCreateDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; import { HttpException, HttpStatus, Injectable } from "@nestjs/common"; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @@ -35,7 +35,7 @@ export class ReviewsService { } } async getReviews( - reviewsParam: GetReviewDto, + reviewsParam: ReviewQueryDto, user: session_userprofile, ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { const MAX_LIMIT = 50; @@ -78,7 +78,7 @@ export class ReviewsService { } async postReviews( - reviewsBody: PostReviewDto, + reviewsBody: ReviewCreateDto, user: session_userprofile, ): Promise { const reviewWritableLectures = @@ -116,7 +116,7 @@ export class ReviewsService { async patchReviewById( reviewId: number, user: session_userprofile, - reviewBody: PatchReviewDto, + reviewBody: ReviewUpdateDto, ): Promise { const review = await this.reviewsRepository.getReviewById(reviewId); if (review == undefined) throw new HttpException("Can't find review", 404); From 41c050c37c16351c55670edbb85047544ff5bcd5 Mon Sep 17 00:00:00 2001 From: Jiuuung <89976594+Jiuuung@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:06:16 +0900 Subject: [PATCH 094/250] Issue/34/users (#35) * Add: test complete -/api/users/:userId/taken-courses * Refactor: rename UserTakenCoursesQueryDto --------- Co-authored-by: LarryKwon <65128957+LarryKwon@users.noreply.github.com> --- src/app.module.ts | 3 +- .../interfaces/dto/user/user.request.dto.ts | 9 + src/modules/user/user.controller.ts | 27 ++ src/modules/user/user.module.ts | 11 + src/modules/user/user.service.ts | 127 +++++-- src/prisma/repositories/course.repository.ts | 350 +++++++++++------- 6 files changed, 361 insertions(+), 166 deletions(-) create mode 100644 src/common/interfaces/dto/user/user.request.dto.ts diff --git a/src/app.module.ts b/src/app.module.ts index d17efe2a..f8a90324 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,9 +10,10 @@ import { JwtService } from '@nestjs/jwt'; import { CoursesModule } from './modules/courses/courses.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; +import { UserModule } from './modules/user/user.module'; @Module({ - imports: [PrismaModule, AuthModule, CoursesModule, LecturesModule,ReviewsModule], + imports: [PrismaModule, AuthModule, CoursesModule, LecturesModule,ReviewsModule,UserModule], controllers: [AppController], providers: [ { diff --git a/src/common/interfaces/dto/user/user.request.dto.ts b/src/common/interfaces/dto/user/user.request.dto.ts new file mode 100644 index 00000000..2b01bc51 --- /dev/null +++ b/src/common/interfaces/dto/user/user.request.dto.ts @@ -0,0 +1,9 @@ +import { IsArray, IsOptional, Validate } from "class-validator"; +import { OrderDefaultValidator } from "../reviews/validators"; + +export class UserTakenCoursesQueryDto { + @IsOptional() + @IsArray() + @Validate(OrderDefaultValidator) + order?: string[]; +} diff --git a/src/modules/user/user.controller.ts b/src/modules/user/user.controller.ts index e69de29b..bc8140f6 100644 --- a/src/modules/user/user.controller.ts +++ b/src/modules/user/user.controller.ts @@ -0,0 +1,27 @@ +import { Controller, Get, HttpException, Param, Query } from "@nestjs/common"; +import { UserService } from "./user.service"; +import { GetUser } from "src/common/decorators/get-user.decorator"; +import { session_userprofile } from "@prisma/client"; +import { UserTakenCoursesQueryDto } from "src/common/interfaces/dto/user/user.request.dto"; +import { CourseResponseDtoNested } from "src/common/interfaces/dto/course/course.response.dto"; + +@Controller('api/users') +export class UserController { + constructor(private readonly userService: UserService) {} + + @Get(':user_id/taken-courses') + async getUserTakenCourses( + @Query() query: UserTakenCoursesQueryDto, + @Param('user_id') userId: number, + @GetUser() user: session_userprofile, + ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { + if (userId === user.id) { + return await this.userService.getUserTakenCourses( + query, + user, + ); + } else { + throw new HttpException("Can't find user", 401); + } + } +} diff --git a/src/modules/user/user.module.ts b/src/modules/user/user.module.ts index e69de29b..a38678ae 100644 --- a/src/modules/user/user.module.ts +++ b/src/modules/user/user.module.ts @@ -0,0 +1,11 @@ +import { PrismaModule } from 'src/prisma/prisma.module'; +import { UserController } from './user.controller'; +import { UserService } from './user.service'; +import { Module } from '@nestjs/common'; + +@Module({ + imports: [PrismaModule], + controllers: [UserController], + providers: [UserService], +}) +export class UserModule {} diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 7f9ae2e0..0b1d4436 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,3 +1,4 @@ +import { CourseRepository } from "./../../prisma/repositories/course.repository"; import { UserRepository } from "../../prisma/repositories/user.repository"; import { Injectable, NotFoundException } from "@nestjs/common"; import { LectureRepository } from "../../prisma/repositories/lecture.repository"; @@ -10,6 +11,10 @@ import { toJsonDepartment } from "../../common/interfaces/serializer/department. import { toJsonReview } from "../../common/interfaces/serializer/review.serializer"; import { toJsonLecture } from "../../common/interfaces/serializer/lecture.serializer"; import { ReviewDetails } from "../../common/schemaTypes/types"; +import { UserTakenCoursesQueryDto } from "src/common/interfaces/dto/user/user.request.dto"; +import { toJsonCourse } from "src/common/interfaces/serializer/course.serializer"; +import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; +import { CourseResponseDtoNested } from "src/common/interfaces/dto/course/course.response.dto"; @Injectable() export class UserService { @@ -18,45 +23,125 @@ export class UserService { private readonly lectureRepository: LectureRepository, private readonly departmentRepository: DepartmentRepository, private readonly reviewRepository: ReviewsRepository, + private readonly courseRepository: CourseRepository ) { } - public async findBySid(sid: string){ - const user = this.userRepository.findBySid(sid); + public async findBySid(sid: string) { + const user = this.userRepository.findBySid(sid); if (!user) { throw new NotFoundException(`Can't find user with sid: ${sid}`); } } - public async getProfile(user: session_userprofile){ + public async getProfile(user: session_userprofile) { const promises = []; - const departmentPromise = this.departmentRepository.getDepartmentOfUser(user) - const favoriteDepartmentsPromise = this.departmentRepository.getFavoriteDepartments(user) - const majorsPromise = this.departmentRepository.getMajors(user) - const minorsPromise = this.departmentRepository.getMinors(user) - const specializedMajorsPromise = this.departmentRepository.getSpecializedMajors(user) - const reviewWritableLecturesPromise = this.lectureRepository.findReviewWritableLectures(user, new Date()) - const takenLecturesPromise = this.lectureRepository.getTakenLectures(user) - const writtenReviewsPromise: ReviewDetails[] = await this.reviewRepository.findReviewByUser(user) - promises.push(departmentPromise, favoriteDepartmentsPromise, majorsPromise, minorsPromise, specializedMajorsPromise,reviewWritableLecturesPromise,takenLecturesPromise,writtenReviewsPromise); - const [department, favoriteDepartments, majors, minors, specializedMajors, reviewWritableLectures, takenLectures, writtenReviews] = await Promise.all(promises); - const departments = Object.values(normalizeArray([...majors, ...minors, ...specializedMajors, ...favoriteDepartments])) ?? [department]; + const departmentPromise = + this.departmentRepository.getDepartmentOfUser(user); + const favoriteDepartmentsPromise = + this.departmentRepository.getFavoriteDepartments(user); + const majorsPromise = this.departmentRepository.getMajors(user); + const minorsPromise = this.departmentRepository.getMinors(user); + const specializedMajorsPromise = + this.departmentRepository.getSpecializedMajors(user); + const reviewWritableLecturesPromise = + this.lectureRepository.findReviewWritableLectures(user, new Date()); + const takenLecturesPromise = this.lectureRepository.getTakenLectures(user); + const writtenReviewsPromise: ReviewDetails[] = + await this.reviewRepository.findReviewByUser(user); + promises.push( + departmentPromise, + favoriteDepartmentsPromise, + majorsPromise, + minorsPromise, + specializedMajorsPromise, + reviewWritableLecturesPromise, + takenLecturesPromise, + writtenReviewsPromise, + ); + const [ + department, + favoriteDepartments, + majors, + minors, + specializedMajors, + reviewWritableLectures, + takenLectures, + writtenReviews, + ] = await Promise.all(promises); + const departments = Object.values( + normalizeArray([ + ...majors, + ...minors, + ...specializedMajors, + ...favoriteDepartments, + ]), + ) ?? [department]; const researchLectures = Object.values(ResearchLecture); - const timeTableLectures = takenLectures.filter((lecture) => !researchLectures.includes(lecture.type_en)); + const timeTableLectures = takenLectures.filter( + (lecture) => !researchLectures.includes(lecture.type_en), + ); return { id: user.id, email: user.email, - student_id : user.student_id, + student_id: user.student_id, firstName: user.first_name, lastName: user.last_name, department: toJsonDepartment(department) ?? null, majors: majors.map((major) => toJsonDepartment(major)), - departments: departments.map((department) => toJsonDepartment(department)), - favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), - review_writeable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture,false)), - my_timetable_lectures: timeTableLectures.map((lecture) => toJsonLecture(lecture,false)), + departments: departments.map((department) => + toJsonDepartment(department), + ), + favorite_departments: favoriteDepartments.map((department) => + toJsonDepartment(department), + ), + review_writeable_lectures: reviewWritableLectures.map((lecture) => + toJsonLecture(lecture, false), + ), + my_timetable_lectures: timeTableLectures.map((lecture) => + toJsonLecture(lecture, false), + ), reviews: writtenReviews.map((review) => toJsonReview(review)), - } + }; + } + + async getUserTakenCourses( + query: UserTakenCoursesQueryDto, + user: session_userprofile + ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { + const DEFAULT_ORDER = ['old_code']; + const takenLectures = await this.lectureRepository.getTakenLectures(user); + const takenLecturesId = takenLectures.map((lecture) => lecture.id); + const courses = await this.courseRepository.getUserTakenCourses( + takenLecturesId, + query.order ?? DEFAULT_ORDER + ); + return courses.map((course) => { + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map( + (x) => x.professor, + ); + const result = toJsonCourse( + course, + representativeLecture, + professorRaw, + false, + ); + + if (user) { + const latestReadDatetime = course.subject_courseuser.find( + (x) => (x.user_profile_id = user.id), + )?.latest_read_datetime; + const latestWrittenDatetime = course.latest_written_datetime; + return Object.assign(result, { + userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + }); + } else { + return Object.assign(result, { + userspecific_is_read: false, + }); + } + }) } } \ No newline at end of file diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index deb8988b..8d5da824 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -2,46 +2,45 @@ import { Injectable } from "@nestjs/common"; import { PrismaService } from "../prisma.service"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; import { CourseDetails, LectureDetails } from "../../common/schemaTypes/types"; +import { session_userprofile } from "@prisma/client"; @Injectable() export class CourseRepository { - constructor( - private readonly prisma: PrismaService - ){} - + constructor(private readonly prisma: PrismaService) {} + private TYPE_ACRONYMS = { - "GR": "General Required", - "MGC": "Mandatory General Courses", - "BE": "Basic Elective", - "BR": "Basic Required", - "EG": "Elective(Graduate)", - "HSE": "Humanities & Social Elective", - "OE": "Other Elective", - "ME": "Major Elective", - "MR": "Major Required", - } + GR: 'General Required', + MGC: 'Mandatory General Courses', + BE: 'Basic Elective', + BR: 'Basic Required', + EG: 'Elective(Graduate)', + HSE: 'Humanities & Social Elective', + OE: 'Other Elective', + ME: 'Major Elective', + MR: 'Major Required', + }; private MAJOR_ACRONYMS = [ - "CE", - "MSB", - "ME", - "PH", - "BiS", - "IE", - "ID", - "BS", - "CBE", - "MAS", - "MS", - "NQE", - "HSS", - "EE", - "CS", - "AE", - "CH", - "TS", - ] + 'CE', + 'MSB', + 'ME', + 'PH', + 'BiS', + 'IE', + 'ID', + 'BS', + 'CBE', + 'MAS', + 'MS', + 'NQE', + 'HSS', + 'EE', + 'CS', + 'AE', + 'CH', + 'TS', + ]; - public async getCourseById (id: number): Promise { + public async getCourseById(id: number): Promise { return await this.prisma.subject_course.findUnique({ include: { subject_department: true, @@ -50,12 +49,15 @@ export class CourseRepository { subject_courseuser: true, }, where: { - id: id - } + id: id, + }, }); } - public async getLecturesByCourseId (query: {order: string[]}, id: number): Promise { + public async getLecturesByCourseId( + query: { order: string[] }, + id: number, + ): Promise { const course = await this.prisma.subject_course.findUnique({ include: { lecture: { @@ -64,22 +66,24 @@ export class CourseRepository { subject_lecture_professors: { include: { professor: true } }, subject_classtime: true, subject_examtime: true, - } + }, }, }, where: { id: id, - } + }, }); - const filteredLecture = course.lecture.filter((lecture) => !lecture.deleted); + const filteredLecture = course.lecture.filter( + (lecture) => !lecture.deleted, + ); const order = query.order ? query.order : ['year', 'semester', 'class_no']; return applyOrder(filteredLecture, order); } //@todo: optimize goal: 1.5s -> 0.5s, recommended: using cache - public async filterByRequest (query: any): Promise { + public async filterByRequest(query: any): Promise { const DEFAULT_LIMIT = 150; - const DEFAULT_ORDER = ['old_code'] + const DEFAULT_ORDER = ['old_code']; const { department, @@ -97,8 +101,14 @@ export class CourseRepository { const groupFilter = this.groupFilter(group); const keywordFilter = this.keywordFilter(keyword); const term_filter = this.termFilter(term); - let filterList = [departmentFilter, typeFilter, groupFilter, keywordFilter, term_filter] - filterList = filterList.filter((filter) => filter !== null) + let filterList = [ + departmentFilter, + typeFilter, + groupFilter, + keywordFilter, + term_filter, + ]; + filterList = filterList.filter((filter) => filter !== null); const queryResult = await this.prisma.subject_course.findMany({ include: { subject_department: true, @@ -107,151 +117,165 @@ export class CourseRepository { subject_courseuser: true, }, where: { - AND: filterList + AND: filterList, }, take: limit ?? DEFAULT_LIMIT, }); - const levelFilteredResult = this.levelFilter(queryResult, level); + const levelFilteredResult = this.levelFilter( + queryResult, + level, + ); // Apply Ordering and Offset - const orderedResult = applyOrder(levelFilteredResult, order ?? DEFAULT_ORDER); + const orderedResult = applyOrder( + levelFilteredResult, + order ?? DEFAULT_ORDER, + ); return applyOffset(orderedResult, offset ?? 0); } public departmentFilter(department_names: string[]): object { - if (!(department_names)) { - return null + if (!department_names) { + return null; } - if (department_names.includes("ALL")) { - return null - } else if (department_names.includes("ETC")) { + if (department_names.includes('ALL')) { + return null; + } else if (department_names.includes('ETC')) { return { subject_department: { code: { - notIn: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)) - } - } - } + notIn: this.MAJOR_ACRONYMS.filter((x) => + department_names.includes(x), + ), + }, + }, + }; } else { return { subject_department: { code: { - in: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)) - } - } - } + in: this.MAJOR_ACRONYMS.filter((x) => department_names.includes(x)), + }, + }, + }; } } public typeFilter(types: string[]): object { - if (!(types)) { - return null + if (!types) { + return null; } - if (types.includes("ALL")) { - return null - } else if (types.includes("ETC")) { - const unselected_types = Object.keys(this.TYPE_ACRONYMS).filter((type) => !(type in types)).map((type) => this.TYPE_ACRONYMS[type]) + if (types.includes('ALL')) { + return null; + } else if (types.includes('ETC')) { + const unselected_types = Object.keys(this.TYPE_ACRONYMS) + .filter((type) => !(type in types)) + .map((type) => this.TYPE_ACRONYMS[type]); return { type_en: { - in: unselected_types - } - } + in: unselected_types, + }, + }; } else { return { type_en: { - in: types.map((type) => this.TYPE_ACRONYMS[type]) - } - } + in: types.map((type) => this.TYPE_ACRONYMS[type]), + }, + }; } } public termFilter(term?: string[]): object { - if (!(term)) { + if (!term) { return null; } - if (term.includes("ALL")) { + if (term.includes('ALL')) { return null; } else { const current_year = new Date().getFullYear().toString(); return { lecture: { - year: current_year - } + year: current_year, + }, }; } } public keywordFilter(keyword?: string, isCourse = true): object { - if (!(keyword)) { + if (!keyword) { return null; } - const keyword_trimed = keyword.trim() - const keyword_space_removed = keyword_trimed.replace(/\s/g, ""); + const keyword_trimed = keyword.trim(); + const keyword_space_removed = keyword_trimed.replace(/\s/g, ''); const title_filter = { title_no_space: { - contains: keyword_space_removed - } + contains: keyword_space_removed, + }, }; const en_title_filter = { title_en_no_space: { - contains: keyword_space_removed - } + contains: keyword_space_removed, + }, }; const department_name_filter = { subject_department: { - name: keyword_trimed - } + name: keyword_trimed, + }, }; const department_name_en_filter = { subject_department: { - name_en: keyword_trimed - } - }; - const professors_professor_name_filter = isCourse ? { - subject_course_professors: { - some: { - professor: { - professor_name: { - contains: keyword_trimed - } - } - } - } - } : { - subject_lecture_professors: { - some: { - professor: { - professor_name: { - contains: keyword_trimed - } - } - } - } + name_en: keyword_trimed, + }, }; - const professors_professor_name_en_filter = isCourse ? { - subject_course_professors: { - some: { - professor: { - professor_name_en: { - contains: keyword_trimed - } - } + const professors_professor_name_filter = isCourse + ? { + subject_course_professors: { + some: { + professor: { + professor_name: { + contains: keyword_trimed, + }, + }, + }, + }, } - } - } : { - subject_lecture_professors: { - some: { - professor: { - professor_name_en: { - contains: keyword_trimed - } - } + : { + subject_lecture_professors: { + some: { + professor: { + professor_name: { + contains: keyword_trimed, + }, + }, + }, + }, + }; + const professors_professor_name_en_filter = isCourse + ? { + subject_course_professors: { + some: { + professor: { + professor_name_en: { + contains: keyword_trimed, + }, + }, + }, + }, } - } - }; + : { + subject_lecture_professors: { + some: { + professor: { + professor_name_en: { + contains: keyword_trimed, + }, + }, + }, + }, + }; return { OR: [ title_filter, @@ -259,53 +283,91 @@ export class CourseRepository { department_name_filter, department_name_en_filter, professors_professor_name_filter, - professors_professor_name_en_filter - ] + professors_professor_name_en_filter, + ], }; } public groupFilter(group?: string[]): object { - if (!(group)) { + if (!group) { return null; } const filter = []; - if ("Basic" in group) { - filter.push("Basic Required", "Basic Elective"); + if ('Basic' in group) { + filter.push('Basic Required', 'Basic Elective'); } - if ("Humanity" in group) { - filter.push("Humanities & Social Elective"); + if ('Humanity' in group) { + filter.push('Humanities & Social Elective'); } if (group.length > 2) { - filter.push("Major Required", "Major Elective", "Elective(Graduate)"); + filter.push('Major Required', 'Major Elective', 'Elective(Graduate)'); } return { type_en: { - in: { filter } - } + in: { filter }, + }, }; } - public levelFilter (queryResult: T[], levels: string[]): (T)[] { + public levelFilter( + queryResult: T[], + levels: string[], + ): T[] { if (!levels) { - return queryResult + return queryResult; } const levelFilters = levels.map((level) => level[0]); - if (levels.includes("ALL")) { - return queryResult - } else if (levels.includes("ETC")) { + if (levels.includes('ALL')) { + return queryResult; + } else if (levels.includes('ETC')) { return queryResult.filter((item) => { const level = item.old_code.replace(/[^0-9]/g, '')[0]; return !levelFilters.includes(level); - }) + }); } else { return queryResult.filter((item) => { const level = item.old_code.replace(/[^0-9]/g, '')[0]; return levelFilters.includes(level); - }) + }); } } + + async getUserTakenCourses( + takenLecturesId: number[], + order: string[], + ): Promise { + const orderFilter: { [key: string]: string }[] = []; + order.forEach((orderList) => { + const orderDict: { [key: string]: string } = {}; + let order = 'asc'; + const orderBy = orderList.split('-'); + if (orderBy[0] == '') { + order = 'desc'; + } + orderDict[orderBy[orderBy.length - 1]] = order; + orderFilter.push(orderDict); + }); + return await this.prisma.subject_course.findMany({ + where: { + lecture: { + some: { + id: { + in: takenLecturesId, + }, + }, + }, + }, + orderBy: orderFilter, + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }); + } } \ No newline at end of file From 4e6ff574de7bffdda080c04ab0ef4bb305f8e33d Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Tue, 22 Aug 2023 19:55:34 +0900 Subject: [PATCH 095/250] Move: review request validator to decorator folder Refactor -orderdefaultvalidator -ReviewUpdateDto use pratialtype and omittype(base: ReviewCreateDto) at review request dto --- .../request-ordervalidator.decorator.ts | 37 +++++++++++++++++ .../decorators/reviews.request.validators.ts | 17 ++++++++ .../dto/reviews/reviews.request.dto.ts | 41 +++---------------- .../interfaces/dto/reviews/validators.ts | 39 ------------------ 4 files changed, 60 insertions(+), 74 deletions(-) create mode 100644 src/common/decorators/request-ordervalidator.decorator.ts create mode 100644 src/common/decorators/reviews.request.validators.ts delete mode 100644 src/common/interfaces/dto/reviews/validators.ts diff --git a/src/common/decorators/request-ordervalidator.decorator.ts b/src/common/decorators/request-ordervalidator.decorator.ts new file mode 100644 index 00000000..197ef1bd --- /dev/null +++ b/src/common/decorators/request-ordervalidator.decorator.ts @@ -0,0 +1,37 @@ +import { ValidationArguments, registerDecorator } from "class-validator"; + +// todo: timetable 브랜치와 merge 후 삭제 필요 +export const _PROHIBITED_FIELD_PATTERN: RegExp[] = [ + /user/, + /profile/, + /owner/, + /writer/, + /__.*__/, + /\?/, +]; + + +export function OrderDefaultValidator( + regexExps: RegExp[], + validationOptions?: { message?: string }, +) { + return function (object:object, propertyName: string) { + registerDecorator({ + name: 'OrderDefaultValidator', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + constraints: regexExps, + validator: { + validate(order: string[], args: ValidationArguments): boolean { + return order.every((o) => { + return regexExps.every((p) => !p.test(o)); + }); + }, + defaultMessage(validationArguments?: ValidationArguments): string { + return 'Only alphanumeric characters are allowed'; + }, + }, + }); + }; +} \ No newline at end of file diff --git a/src/common/decorators/reviews.request.validators.ts b/src/common/decorators/reviews.request.validators.ts new file mode 100644 index 00000000..7e16591d --- /dev/null +++ b/src/common/decorators/reviews.request.validators.ts @@ -0,0 +1,17 @@ +import { + ValidationArguments, + ValidatorConstraint, + ValidatorConstraintInterface, +} from 'class-validator'; + + +@ValidatorConstraint({ name: 'STRING_STRIP_LENGTH', async: false }) +export class StringStripLength implements ValidatorConstraintInterface { + validate(text: string): boolean { + return text?.trim().length > 0; + } + + defaultMessage(args: ValidationArguments): string { + return "Body 'content' did not pass validator: content must not be empty"; + } +} \ No newline at end of file diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index f52ae265..71cd498c 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -10,9 +10,9 @@ import { Validate, } from 'class-validator'; import { CourseResponseDto } from '../course/course.response.dto'; -import { OrderDefaultValidator, StringStripLength } from './validators'; +import { StringStripLength } from '../../../decorators/reviews.request.validators'; import { OmitType, PartialType } from "@nestjs/swagger"; - +import { _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator } from 'src/common/decorators/request-ordervalidator.decorator'; export class ReviewQueryDto { @IsOptional() @IsNumber() @@ -30,7 +30,7 @@ export class ReviewQueryDto { @IsOptional() @IsArray() - @Validate(OrderDefaultValidator) + @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) order?: string[]; @IsOptional() @@ -77,35 +77,6 @@ export class ReviewCreateDto { speech: number; } -// export class patchReviewDto extends PartialType(OmitType(PostReviewDto, ['lecture'])){ -// -// } - -// nestjs-swagger -export class ReviewUpdateDto { - @IsOptional() - @IsString() - @Validate(StringStripLength) - content?: string; - - @IsOptional() - @IsNumber() - @Min(1) - @Max(5) - @Type(() => Number) - grade?: number; - - @IsOptional() - @IsNumber() - @Min(1) - @Max(5) - @Type(() => Number) - load?: number; - - @IsOptional() - @IsNumber() - @Min(1) - @Max(5) - @Type(() => Number) - speech?: number; -} \ No newline at end of file +export class ReviewUpdateDto extends PartialType( + OmitType(ReviewCreateDto, ['lecture']), +) {} \ No newline at end of file diff --git a/src/common/interfaces/dto/reviews/validators.ts b/src/common/interfaces/dto/reviews/validators.ts deleted file mode 100644 index 2a50d2a0..00000000 --- a/src/common/interfaces/dto/reviews/validators.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { - ValidationArguments, - ValidatorConstraint, - ValidatorConstraintInterface, -} from 'class-validator'; - -const PROHIBITED_FIELD_PATTERN: RegExp[] = [ - /\?/, - /user/, - /profile/, - /owner/, - /writer/, - /__.*__/, -]; - -//todo: make more general -@ValidatorConstraint({ name: 'ORDER_DEFAULT_VALIDATOR', async: false }) -export class OrderDefaultValidator implements ValidatorConstraintInterface { - validate(order: string[]): boolean { - return order.every((o) => { - return PROHIBITED_FIELD_PATTERN.every((p) => !p.test(o)); - }); - } - - defaultMessage(args: ValidationArguments): string { - return 'Body ' + args + ' did not pass validator'; - } -} - -@ValidatorConstraint({ name: 'STRING_STRIP_LENGTH', async: false }) -export class StringStripLength implements ValidatorConstraintInterface { - validate(text: string): boolean { - return text?.trim().length > 0; - } - - defaultMessage(args: ValidationArguments): string { - return "Body 'content' did not pass validator: content must not be empty"; - } -} \ No newline at end of file From 7f780ec5d225777327746e1643669e26d3cc9aec Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed, 23 Aug 2023 21:29:33 +0900 Subject: [PATCH 096/250] Resolve: typo in session/info --- src/common/interfaces/dto/user/user.response.dto.ts | 2 +- src/modules/user/user.service.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index 7d3546f0..96462d90 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -14,7 +14,7 @@ export interface ProfileDto { majors: DepartmentResponseDto[] departments: DepartmentResponseDto[] favorite_departments: DepartmentResponseDto[] - review_writeable_lectures: session_userprofile_taken_lectures[] + review_writable_lectures: session_userprofile_taken_lectures[] my_timetable_lectures: session_userprofile_taken_lectures[] reviews: ReviewResponseDto[] } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 7f9ae2e0..bf9557a0 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -54,7 +54,7 @@ export class UserService { majors: majors.map((major) => toJsonDepartment(major)), departments: departments.map((department) => toJsonDepartment(department)), favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), - review_writeable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture,false)), + review_writable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture,false)), my_timetable_lectures: timeTableLectures.map((lecture) => toJsonLecture(lecture,false)), reviews: writtenReviews.map((review) => toJsonReview(review)), } From 3d04b9433e9ba905e41826cde7d41486ade3c1b9 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Thu, 24 Aug 2023 00:11:14 +0900 Subject: [PATCH 097/250] Refactor: function name Add: @ApiProperty at ReviewCreateDto for partialtype --- .../dto/reviews/reviews.request.dto.ts | 7 +++++- src/modules/reviews/reviews.controller.ts | 9 +++---- src/modules/reviews/reviews.service.ts | 18 ++++++------- src/prisma/repositories/review.repository.ts | 25 +++++++++---------- 4 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index 71cd498c..fdc3a2c3 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -11,7 +11,7 @@ import { } from 'class-validator'; import { CourseResponseDto } from '../course/course.response.dto'; import { StringStripLength } from '../../../decorators/reviews.request.validators'; -import { OmitType, PartialType } from "@nestjs/swagger"; +import { ApiProperty, OmitType, PartialType } from "@nestjs/swagger"; import { _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator } from 'src/common/decorators/request-ordervalidator.decorator'; export class ReviewQueryDto { @IsOptional() @@ -45,16 +45,19 @@ export class ReviewQueryDto { } export class ReviewCreateDto { + @ApiProperty() @IsString() @IsNotEmpty() @Validate(StringStripLength) content: string; + @ApiProperty() @IsNumber() @IsNotEmpty() @Type(() => Number) lecture: number; + @ApiProperty() @IsNumber() @IsNotEmpty() @Min(1) @@ -62,6 +65,7 @@ export class ReviewCreateDto { @Type(() => Number) grade: number; + @ApiProperty() @IsNumber() @IsNotEmpty() @Min(1) @@ -69,6 +73,7 @@ export class ReviewCreateDto { @Type(() => Number) load: number; + @ApiProperty() @IsNumber() @IsNotEmpty() @Min(1) diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 85f26d83..09e2b501 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,6 +1,5 @@ import { Body, Controller, Get, HttpException, Post, Query, Param, Patch} from '@nestjs/common'; import { ReviewQueryDto, ReviewUpdateDto, ReviewCreateDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; -import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; @@ -28,12 +27,12 @@ export class ReviewsController { } @Post() - async postReviews( + async createReviews( @Body() reviewsBody: ReviewCreateDto, @GetUser() user: session_userprofile, ): Promise { if (user) { - const result = await this.reviewsService.postReviews(reviewsBody, user); + const result = await this.reviewsService.createReviews(reviewsBody, user); return result; } else { throw new HttpException("Can't find user", 401); @@ -49,13 +48,13 @@ export class ReviewsController { } @Patch(':reviewId') - async patchReviewInstance( + async updateReviewInstance( @Body() reviewsBody: ReviewUpdateDto, @Param('reviewId') reviewId: number, @GetUser() user: session_userprofile, ): Promise { if (user) { - return await this.reviewsService.patchReviewById(reviewId, user, reviewsBody); + return await this.reviewsService.updateReviewById(reviewId, user, reviewsBody); } else { throw new HttpException("Can't find user", 401); } diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 9fd1ae4d..fb909911 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -68,16 +68,16 @@ export class ReviewsService { } async getReviewsCount( - lecture_year: number, - lecture_semester: number, + lectureYear: number, + lectureSemester: number, ): Promise { return await this.reviewsRepository.getReviewsCount( - lecture_year, - lecture_semester, + lectureYear, + lectureSemester, ); } - async postReviews( + async createReviews( reviewsBody: ReviewCreateDto, user: session_userprofile, ): Promise { @@ -113,7 +113,7 @@ export class ReviewsService { } } - async patchReviewById( + async updateReviewById( reviewId: number, user: session_userprofile, reviewBody: ReviewUpdateDto, @@ -124,14 +124,14 @@ export class ReviewsService { throw new HttpException("Can't find user", 401); if (review.is_deleted) throw new HttpException('Target review deleted by admin',HttpStatus.BAD_REQUEST); - const patchReview = await this.reviewsRepository.patchReview( + const updateReview = await this.reviewsRepository.updateReview( review.id, reviewBody.content, reviewBody.grade, reviewBody.load, - reviewBody.speech + reviewBody.speech, ); - const result = toJsonReview(patchReview); + const result = toJsonReview(updateReview); if (user) { const isLiked: boolean = await this.reviewsRepository.isLiked( review.id, diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 050d1667..08662c29 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -136,19 +136,19 @@ export class ReviewsRepository { })); } public async getReviewsCount( - lecture_year: number, - lecture_semester: number, + lectureYear: number, + lectureSemester: number, ): Promise { - let lecture_filter: object = {}; - if (lecture_year) { - lecture_filter = { ...lecture_filter, year: lecture_year }; + let lectureFilter: object = {}; + if (lectureYear) { + lectureFilter = { ...lectureFilter, year: lectureYear }; } - if (lecture_semester) { - lecture_filter = { ...lecture_filter, semester: lecture_semester }; + if (lectureSemester) { + lectureFilter = { ...lectureFilter, semester: lectureSemester }; } const reviewsCount = await this.prisma.review_review.count({ where: { - lecture: lecture_filter, + lecture: lectureFilter, }, distinct: [ 'id', @@ -169,7 +169,6 @@ export class ReviewsRepository { return reviewsCount; } - // todo: patch도 동일한 함수 쓰게끔 async upsertReview( courseId: number, lectureId: number, @@ -217,13 +216,13 @@ export class ReviewsRepository { }); } - async patchReview( + async updateReview( reviewId: number, - content:string, + content: string, grade: number, load: number, speech: number, - ):Promise{ + ): Promise { return await this.prisma.review_review.update({ where: { id: reviewId, @@ -232,7 +231,7 @@ export class ReviewsRepository { content: content, grade: grade, load: load, - speech: speech + speech: speech, }, include: { course: { From 5c40adc42c7bda3eb6b58f14864dbbba1b308708 Mon Sep 17 00:00:00 2001 From: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Fri, 25 Aug 2023 01:04:23 +0900 Subject: [PATCH 098/250] Squashed commit of the following: commit 60de07f2d329f26f8e54a51a4ae00d3c56f4faa9 Author: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed Aug 23 23:37:34 2023 +0900 Add: Complete Implement - /api/users/:userId/timetables/:timeTableId commit 8deb9ed31632de7f092c3b69c9180a0b7499dcd3 Author: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed Aug 23 22:33:29 2023 +0900 Add: Complete Implement - /api/users/:userId/timetables/remove-lecture(POST) commit 9e3a93d3a74febdf4a0782a982c68da9e6e27011 Author: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed Aug 23 22:22:39 2023 +0900 Add: Complete Implement - /api/semesters - /api/users/:userId/timetables (GET, POST) - /api/users/:userId/timetables/add-lecture(POST) commit 1fd4136be7774f86da631e355fa5fd77675f1303 Author: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed Aug 23 21:53:56 2023 +0900 Add: Implement api/semesters commit 632a6f623fa690e1bc76b6b11ad873930c9803ef Author: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed Aug 23 21:08:19 2023 +0900 Add: implement users/:userId/timetables commit 6382d566854f4f74180e2d224f6a9b0535a95885 Author: LarryKwon <65128957+LarryKwon@users.noreply.github.com> Date: Wed Jul 26 22:58:58 2023 +0900 Add: implement timeTables Repository Todo: create dto and toJson, and add include options --- src/app.module.ts | 4 +- .../request-ordervalidator.decorator.ts | 37 ----- .../decorators/reviews.request.validators.ts | 17 --- src/common/decorators/validators.decorator.ts | 107 ++++++++++++++ .../dto/reviews/reviews.request.dto.ts | 7 +- .../dto/semester/semester.request.dto.ts | 10 ++ .../dto/semester/semester.response.dto.ts | 3 + .../dto/timetable/timetable.request.dto.ts | 56 +++++++ .../dto/timetable/timetable.response.dto.ts | 8 + .../interfaces/dto/user/user.request.dto.ts | 2 +- .../serializer/semester.serializer.ts | 21 +++ .../serializer/timetable.serializer.ts | 26 ++++ src/common/schemaTypes/types.ts | 20 ++- src/common/utils/search.utils.ts | 36 ++++- src/modules/lectures/lectures.module.ts | 3 +- src/modules/lectures/lectures.service.ts | 5 + src/modules/semesters/semesters.controller.ts | 24 ++- src/modules/semesters/semesters.module.ts | 2 + src/modules/semesters/semesters.service.ts | 16 +- .../timetables/timetables.controller.ts | 79 +++++++++- src/modules/timetables/timetables.module.ts | 3 + src/modules/timetables/timetables.service.ts | 121 ++++++++++++++- src/prisma/prisma.module.ts | 6 + src/prisma/repositories/lecture.repository.ts | 28 +++- .../repositories/semester.repository.ts | 32 ++++ .../repositories/timetable.repository.ts | 138 ++++++++++++++++++ 26 files changed, 732 insertions(+), 79 deletions(-) delete mode 100644 src/common/decorators/request-ordervalidator.decorator.ts delete mode 100644 src/common/decorators/reviews.request.validators.ts create mode 100644 src/common/decorators/validators.decorator.ts create mode 100644 src/common/interfaces/dto/semester/semester.request.dto.ts create mode 100644 src/common/interfaces/dto/semester/semester.response.dto.ts create mode 100644 src/common/interfaces/dto/timetable/timetable.request.dto.ts create mode 100644 src/common/interfaces/dto/timetable/timetable.response.dto.ts create mode 100644 src/common/interfaces/serializer/semester.serializer.ts create mode 100644 src/common/interfaces/serializer/timetable.serializer.ts create mode 100644 src/prisma/repositories/semester.repository.ts create mode 100644 src/prisma/repositories/timetable.repository.ts diff --git a/src/app.module.ts b/src/app.module.ts index f8a90324..4689b9e2 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,10 +10,12 @@ import { JwtService } from '@nestjs/jwt'; import { CoursesModule } from './modules/courses/courses.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; +import { SemestersModule } from "./modules/semesters/semesters.module"; +import { TimetablesModule } from "./modules/timetables/timetables.module"; import { UserModule } from './modules/user/user.module'; @Module({ - imports: [PrismaModule, AuthModule, CoursesModule, LecturesModule,ReviewsModule,UserModule], + imports: [PrismaModule, AuthModule, CoursesModule, LecturesModule,ReviewsModule,UserModule, SemestersModule,TimetablesModule], controllers: [AppController], providers: [ { diff --git a/src/common/decorators/request-ordervalidator.decorator.ts b/src/common/decorators/request-ordervalidator.decorator.ts deleted file mode 100644 index 197ef1bd..00000000 --- a/src/common/decorators/request-ordervalidator.decorator.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ValidationArguments, registerDecorator } from "class-validator"; - -// todo: timetable 브랜치와 merge 후 삭제 필요 -export const _PROHIBITED_FIELD_PATTERN: RegExp[] = [ - /user/, - /profile/, - /owner/, - /writer/, - /__.*__/, - /\?/, -]; - - -export function OrderDefaultValidator( - regexExps: RegExp[], - validationOptions?: { message?: string }, -) { - return function (object:object, propertyName: string) { - registerDecorator({ - name: 'OrderDefaultValidator', - target: object.constructor, - propertyName: propertyName, - options: validationOptions, - constraints: regexExps, - validator: { - validate(order: string[], args: ValidationArguments): boolean { - return order.every((o) => { - return regexExps.every((p) => !p.test(o)); - }); - }, - defaultMessage(validationArguments?: ValidationArguments): string { - return 'Only alphanumeric characters are allowed'; - }, - }, - }); - }; -} \ No newline at end of file diff --git a/src/common/decorators/reviews.request.validators.ts b/src/common/decorators/reviews.request.validators.ts deleted file mode 100644 index 7e16591d..00000000 --- a/src/common/decorators/reviews.request.validators.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - ValidationArguments, - ValidatorConstraint, - ValidatorConstraintInterface, -} from 'class-validator'; - - -@ValidatorConstraint({ name: 'STRING_STRIP_LENGTH', async: false }) -export class StringStripLength implements ValidatorConstraintInterface { - validate(text: string): boolean { - return text?.trim().length > 0; - } - - defaultMessage(args: ValidationArguments): string { - return "Body 'content' did not pass validator: content must not be empty"; - } -} \ No newline at end of file diff --git a/src/common/decorators/validators.decorator.ts b/src/common/decorators/validators.decorator.ts new file mode 100644 index 00000000..b713de2f --- /dev/null +++ b/src/common/decorators/validators.decorator.ts @@ -0,0 +1,107 @@ +import { + registerDecorator, + ValidationArguments, + ValidatorConstraint, + ValidatorConstraintInterface +} from "class-validator"; + +export const _PROHIBITED_FIELD_PATTERN: RegExp[] = [ + /user/, + /profile/, + /owner/, + /writer/, + /__.*__/, + /\?/, +]; + +export function RegexValidator( + regexExps: RegExp[], + validationOptions?: { message?: string } +) { + // eslint-disable-next-line @typescript-eslint/ban-types + return function(object: Object, propertyName: string) { + registerDecorator({ + name: "regexValidator", + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + constraints: regexExps, + validator: { + validate(order: string[], args: ValidationArguments): boolean { + return order.every((o) => { + return regexExps.every((p) => p.test(o)); + }); + }, + + defaultMessage(validationArguments?: ValidationArguments): string { + return "Only alphanumeric characters are allowed"; + } + } + }); + }; +} + +export function InverseRegexValidator( + regexExps: RegExp[], + validationOptions?: { message?: string } +) { + // eslint-disable-next-line @typescript-eslint/ban-types + return function(object: Object, propertyName: string) { + registerDecorator({ + name: "regexValidator", + target: object.constructor, + propertyName: propertyName, + constraints: regexExps, + options: validationOptions, + validator: { + validate(order: string[], args: ValidationArguments): boolean { + return order.every((o) => { + return regexExps.every((p) => !p.test(o)); + }); + }, + + defaultMessage(validationArguments?: ValidationArguments): string { + return "Only alphanumeric characters are allowed"; + } + } + }); + }; +} + + + +export function OrderDefaultValidator( + regexExps: RegExp[], + validationOptions?: { message?: string }, +) { + return function (object:object, propertyName: string) { + registerDecorator({ + name: 'OrderDefaultValidator', + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + constraints: regexExps, + validator: { + validate(order: string[], args: ValidationArguments): boolean { + return order.every((o) => { + return regexExps.every((p) => !p.test(o)); + }); + }, + defaultMessage(validationArguments?: ValidationArguments): string { + return 'Only alphanumeric characters are allowed'; + }, + }, + }); + }; +} + +@ValidatorConstraint({ name: 'STRING_STRIP_LENGTH', async: false }) +export class StringStripLength implements ValidatorConstraintInterface { + validate(text: string): boolean { + return text?.trim().length > 0; + } + + defaultMessage(args: ValidationArguments): string { + return "Body 'content' did not pass validator: content must not be empty"; + } +} \ No newline at end of file diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index fdc3a2c3..c351ef72 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -10,9 +10,12 @@ import { Validate, } from 'class-validator'; import { CourseResponseDto } from '../course/course.response.dto'; -import { StringStripLength } from '../../../decorators/reviews.request.validators'; import { ApiProperty, OmitType, PartialType } from "@nestjs/swagger"; -import { _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator } from 'src/common/decorators/request-ordervalidator.decorator'; +import { + _PROHIBITED_FIELD_PATTERN, + OrderDefaultValidator, + StringStripLength +} from "../../../decorators/validators.decorator"; export class ReviewQueryDto { @IsOptional() @IsNumber() diff --git a/src/common/interfaces/dto/semester/semester.request.dto.ts b/src/common/interfaces/dto/semester/semester.request.dto.ts new file mode 100644 index 00000000..8c93c50d --- /dev/null +++ b/src/common/interfaces/dto/semester/semester.request.dto.ts @@ -0,0 +1,10 @@ +import { IsArray, IsOptional, Validate } from "class-validator"; +import { _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator } from "../../../decorators/validators.decorator"; + + +export class SemesterQueryDto{ + @IsOptional() + @IsArray() + @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) + order?: string[]; +} \ No newline at end of file diff --git a/src/common/interfaces/dto/semester/semester.response.dto.ts b/src/common/interfaces/dto/semester/semester.response.dto.ts new file mode 100644 index 00000000..772f3bfd --- /dev/null +++ b/src/common/interfaces/dto/semester/semester.response.dto.ts @@ -0,0 +1,3 @@ +import { SemesterBasic } from "../../../schemaTypes/types"; + +export type SemesterResponseDto = Omit \ No newline at end of file diff --git a/src/common/interfaces/dto/timetable/timetable.request.dto.ts b/src/common/interfaces/dto/timetable/timetable.request.dto.ts new file mode 100644 index 00000000..c60e71e2 --- /dev/null +++ b/src/common/interfaces/dto/timetable/timetable.request.dto.ts @@ -0,0 +1,56 @@ +import { Transform, Type } from "class-transformer"; +import { IsArray, IsNumber, IsOptional, IsString, Min, ValidateBy } from "class-validator"; +import { + _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator +} from "../../../decorators/validators.decorator"; + +export const TIMETABLE_MAX_LIMIT = 50; + +export class TimetableQueryDto { + + @IsOptional() + @IsNumber() + @Type(() => Number) + year?: number + + @IsOptional() + @IsNumber() + @Type(() => Number) + semester?: number + + @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) + @IsOptional() + @Transform(({value}) => typeof value === 'string' ? [value] : value) + @IsArray() + @IsString({each: true}) + order?: string[] + + @IsOptional() + @Transform(({ value }) => value ?? 0) + @IsNumber() + offset?: number + + @IsOptional() + @Transform(({ value }) => value ?? TIMETABLE_MAX_LIMIT) + @IsNumber() + limit?: number +} + +export class TimetableCreateDto { + @IsNumber() + year: number; + + @IsNumber() + semester: number; + + @IsArray() + @IsNumber({},{each: true}) + lectures: number[] +} + +export class AddLectureDto{ + + @IsNumber() + @Type(() => Number) + lecture: number; +} diff --git a/src/common/interfaces/dto/timetable/timetable.response.dto.ts b/src/common/interfaces/dto/timetable/timetable.response.dto.ts new file mode 100644 index 00000000..8acefde2 --- /dev/null +++ b/src/common/interfaces/dto/timetable/timetable.response.dto.ts @@ -0,0 +1,8 @@ +import { CourseResponseDto } from "../course/course.response.dto"; +import { LectureResponseDto } from "../lecture/lecture.response.dto"; + +export class TimetableResponseDto { + id: number; + lectures: LectureResponseDto[]; + arrange_order: number; +} diff --git a/src/common/interfaces/dto/user/user.request.dto.ts b/src/common/interfaces/dto/user/user.request.dto.ts index 2b01bc51..71bd3c79 100644 --- a/src/common/interfaces/dto/user/user.request.dto.ts +++ b/src/common/interfaces/dto/user/user.request.dto.ts @@ -1,5 +1,5 @@ import { IsArray, IsOptional, Validate } from "class-validator"; -import { OrderDefaultValidator } from "../reviews/validators"; +import { OrderDefaultValidator } from "../../../decorators/validators.decorator"; export class UserTakenCoursesQueryDto { @IsOptional() diff --git a/src/common/interfaces/serializer/semester.serializer.ts b/src/common/interfaces/serializer/semester.serializer.ts new file mode 100644 index 00000000..faa38944 --- /dev/null +++ b/src/common/interfaces/serializer/semester.serializer.ts @@ -0,0 +1,21 @@ +import { DepartmentResponseDto } from "../dto/department/department.response.dto"; +import { SemesterBasic } from "../../schemaTypes/types"; +import { SemesterResponseDto } from "../dto/semester/semester.response.dto"; + +export const toJsonSemester = (semester: SemesterBasic,): SemesterResponseDto => { + + + return { + year : semester.year, + semester: semester.semester, + beginning: semester.beginning, + end: semester.end, + courseDesciptionSubmission: semester.courseDesciptionSubmission, + courseRegistrationPeriodStart: semester.courseRegistrationPeriodStart, + courseRegistrationPeriodEnd: semester.courseRegistrationPeriodEnd, + courseAddDropPeriodEnd: semester.courseAddDropPeriodEnd, + courseDropDeadline: semester.courseDropDeadline, + courseEvaluationDeadline: semester.courseEvaluationDeadline, + gradePosting: semester.gradePosting, + } +} \ No newline at end of file diff --git a/src/common/interfaces/serializer/timetable.serializer.ts b/src/common/interfaces/serializer/timetable.serializer.ts new file mode 100644 index 00000000..d062b6ed --- /dev/null +++ b/src/common/interfaces/serializer/timetable.serializer.ts @@ -0,0 +1,26 @@ +import { TimetableResponseDto } from "../dto/timetable/timetable.response.dto"; +import { LectureDetails, TimeTableBasic, TimeTableDetails } from "../../schemaTypes/types"; +import { toJsonLecture } from "./lecture.serializer"; + +export const toJsonTimetable = (timetable: TimeTableDetails | TimeTableBasic, lectures?: LectureDetails[]): TimetableResponseDto => { + if ('timetable_timetable_lectures' in timetable) { + const id = timetable.id; + const lectures = timetable.timetable_timetable_lectures.map((x) => x.subject_lecture) + .map((lecture) => toJsonLecture(lecture, false)); + const arrange_order = timetable.arrange_order; + return { + id: id, + lectures: lectures, + arrange_order: arrange_order + }; + }else{ + const id = timetable.id; + const lectureLists = lectures.map(lecture => toJsonLecture(lecture, false)); + const arrange_order = timetable.arrange_order; + return { + id: id, + lectures: lectureLists, + arrange_order: arrange_order + } + } +}; \ No newline at end of file diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 5d78bb9a..8918274d 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -8,7 +8,7 @@ export type courseSelectResultType = Prisma.subject_courseGetPayload<{ include: Prisma.subject_courseInclude }> -const courseDetails = Prisma.validator()({ +export const courseDetails = Prisma.validator()({ include: { subject_department: true, subject_course_professors: { include: { professor: true } }, @@ -17,7 +17,7 @@ const courseDetails = Prisma.validator()({ } }); -const lectureDetails = Prisma.validator()({ +export const lectureDetails = Prisma.validator()({ include: { subject_department: true, subject_lecture_professors: { include: { professor: true } }, @@ -26,6 +26,16 @@ const lectureDetails = Prisma.validator()({ } }); +export const timeTableDetails = Prisma.validator()({ + include:{ + timetable_timetable_lectures: { + include:{ + subject_lecture: lectureDetails, + } + } + } +}) + export type NESTED = true; @@ -38,4 +48,8 @@ const reviewDetails = Prisma.validator()({ export type ReviewDetails = Prisma.review_reviewGetPayload export type LectureDetails = Prisma.subject_lectureGetPayload -export type CourseDetails = Prisma.subject_courseGetPayload \ No newline at end of file +export type LectureBasic = Prisma.subject_lectureGetPayload +export type CourseDetails = Prisma.subject_courseGetPayload +export type TimeTableDetails = Prisma.timetable_timetableGetPayload +export type TimeTableBasic = Prisma.timetable_timetableGetPayload +export type SemesterBasic = Prisma.subject_semesterGetPayload \ No newline at end of file diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index ac8a5260..ed1ce2e9 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,9 +1,12 @@ +import { PrismaService } from "../../prisma/prisma.service"; +import { SemesterRepository } from "../../prisma/repositories/semester.repository"; + export function applyOrder(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { return query?.sort((a: T, b: T) => { - for(let i=0; i < order_opt.length; i++) { + for (let i = 0; i < order_opt.length; i++) { const order = order_opt[i]; if (a[order] > b[order]) { return 1; @@ -22,4 +25,35 @@ export function applyOffset(query: T[], offset: number) { } else { return query?.slice(offset) ?? []; } +} + +export function semesterFilter(year: number, semester: number): { year?: number, semester?: number } { + let semesterFilter: object = {}; + if (year) { + semesterFilter = { ...semesterFilter, year: year }; + } + if (semester) { + semesterFilter = { ...semesterFilter, semester: semester }; + } + return semesterFilter; +} + +export function orderFilter(order: string[]) { + const orderFilter: { [key: string]: string }[] = []; + order.forEach((orderList) => { + const orderDict: { [key: string]: string } = {}; + let order = 'asc'; + const orderBy = orderList.split('-'); + if (orderBy[0] == '') { + order = 'desc'; + } + orderDict[orderBy[orderBy.length - 1]] = order; + orderFilter.push(orderDict); + }); + return orderFilter; +} + +export async function validateYearAndSemester(year: number, semester: number, semesterRepo: SemesterRepository) { + const existsSemester: boolean = await semesterRepo.existsSemester(year, semester); + return existsSemester || (2009 < year && year < 2018 && semester && [1, 3].includes(semester)); } \ No newline at end of file diff --git a/src/modules/lectures/lectures.module.ts b/src/modules/lectures/lectures.module.ts index 595e3e4c..3e290b23 100644 --- a/src/modules/lectures/lectures.module.ts +++ b/src/modules/lectures/lectures.module.ts @@ -6,6 +6,7 @@ import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ imports: [PrismaModule], controllers: [LecturesController], - providers: [LecturesService] + providers: [LecturesService], + exports:[LecturesService], }) export class LecturesModule {} diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index fa0eb2cb..90c1406a 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -3,6 +3,7 @@ import { LectureRepository } from './../../prisma/repositories/lecture.repositor import { Injectable, NotFoundException } from '@nestjs/common'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; import { LectureResponseDto } from 'src/common/interfaces/dto/lecture/lecture.response.dto'; +import { LectureDetails } from "../../common/schemaTypes/types"; @Injectable() export class LecturesService { @@ -20,4 +21,8 @@ export class LecturesService { } return toJsonLecture(queryResult, false); } + + public async getLecturesByIds(ids: number[]): Promise { + return await this.LectureRepository.getLectureByIds(ids); + } } diff --git a/src/modules/semesters/semesters.controller.ts b/src/modules/semesters/semesters.controller.ts index 57532d86..c4fd1be3 100644 --- a/src/modules/semesters/semesters.controller.ts +++ b/src/modules/semesters/semesters.controller.ts @@ -1,4 +1,22 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, Query } from "@nestjs/common"; +import { SemestersService } from "./semesters.service"; +import { GetUser } from "../../common/decorators/get-user.decorator"; +import { SemesterQueryDto } from "../../common/interfaces/dto/semester/semester.request.dto"; +import { toJsonSemester } from "../../common/interfaces/serializer/semester.serializer"; -@Controller('semesters') -export class SemestersController {} +@Controller('api/semesters') +export class SemestersController { + constructor( + private readonly semestersService: SemestersService, + ) { + } + + @Get() + async getSemesters( + @Query() query: SemesterQueryDto, + @GetUser() user, + ) { + const semesters = await this.semestersService.getSemesters(query); + return semesters.map((semester) => toJsonSemester(semester)); + } +} diff --git a/src/modules/semesters/semesters.module.ts b/src/modules/semesters/semesters.module.ts index 795827ef..19ece6e4 100644 --- a/src/modules/semesters/semesters.module.ts +++ b/src/modules/semesters/semesters.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; import { SemestersController } from './semesters.controller'; import { SemestersService } from './semesters.service'; +import { PrismaModule } from "../../prisma/prisma.module"; @Module({ + imports: [PrismaModule], controllers: [SemestersController], providers: [SemestersService] }) diff --git a/src/modules/semesters/semesters.service.ts b/src/modules/semesters/semesters.service.ts index b4808882..82b4e8e4 100644 --- a/src/modules/semesters/semesters.service.ts +++ b/src/modules/semesters/semesters.service.ts @@ -1,4 +1,18 @@ import { Injectable } from '@nestjs/common'; +import { SemesterRepository } from 'src/prisma/repositories/semester.repository'; +import { orderFilter } from "../../common/utils/search.utils"; +import { SemesterQueryDto } from "../../common/interfaces/dto/semester/semester.request.dto"; @Injectable() -export class SemestersService {} +export class SemestersService { + constructor( + private readonly semesterRepository: SemesterRepository, + ) { + } + + async getSemesters(order: SemesterQueryDto) { + const orderBy = orderFilter(order.order); + const semesters = await this.semesterRepository.getSemesters({ orderBy: orderBy }); + return semesters; + } +} diff --git a/src/modules/timetables/timetables.controller.ts b/src/modules/timetables/timetables.controller.ts index d078e4e7..61aaaf33 100644 --- a/src/modules/timetables/timetables.controller.ts +++ b/src/modules/timetables/timetables.controller.ts @@ -1,4 +1,77 @@ -import { Controller } from '@nestjs/common'; +import { Body, Controller, Delete, Get, NotFoundException, Param, Post, Query } from "@nestjs/common"; +import { TimetablesService } from "./timetables.service"; +import { GetUser } from "../../common/decorators/get-user.decorator"; +import { session_userprofile } from "@prisma/client"; +import { + AddLectureDto, + TimetableCreateDto, + TimetableQueryDto +} from "../../common/interfaces/dto/timetable/timetable.request.dto"; +import { toJsonTimetable } from "../../common/interfaces/serializer/timetable.serializer"; +import { LecturesService } from "../lectures/lectures.service"; -@Controller('timetables') -export class TimetablesController {} +@Controller("/api/users/:userId/timetables") +export class TimetablesController { + + constructor( + private readonly timetablesService: TimetablesService, + private readonly lectureService: LecturesService + ) { + } + + @Get() + async getTimetables( + @Param("userId") userId: number, + @Query() query: TimetableQueryDto, + @GetUser() user: session_userprofile + ) { + + const timeTableList = await this.timetablesService.getTimetables(query, user); + return timeTableList.map((timeTable) => toJsonTimetable(timeTable)); + } + + @Get('/:timetableId') + async getTimeTable( + @Param("userId") userId: number, + @Param("timetableId") timetableId: number, + @GetUser() user: session_userprofile + ) { + const timeTable = await this.timetablesService.getTimetable(timetableId); + return toJsonTimetable(timeTable); + } + + @Delete('/:timetableId') + async deleteTimetable( + @Param("userId") userId: number, + @Param("timetableId") timetableId: number, + @GetUser() user: session_userprofile + ){ + await this.timetablesService.deleteTimetable(user, timetableId); + return null; + } + + @Post() + async createTimetable(@Body() timeTableBody: TimetableCreateDto, @GetUser() user: session_userprofile) { + const timeTable = await this.timetablesService.createTimetable(timeTableBody, user); + return toJsonTimetable(timeTable); + } + + @Post('/:timetableId/add-lecture') + async addLectureToTimetable( + @Param('timetableId') timetableId: number, + @Body() body: AddLectureDto, + ){ + const timeTable = await this.timetablesService.addLectureToTimetable(timetableId, body); + return toJsonTimetable(timeTable); + } + + @Post('/:timetableId/remove-lecture') + async removeLectureFromTimetable( + @Param('timetableId') timetableId: number, + @Body() body: AddLectureDto, + ){ + const timeTable = await this.timetablesService.removeLectureFromTimetable(timetableId, body); + return toJsonTimetable(timeTable); + } + +} diff --git a/src/modules/timetables/timetables.module.ts b/src/modules/timetables/timetables.module.ts index 1b710fcf..4fe6071c 100644 --- a/src/modules/timetables/timetables.module.ts +++ b/src/modules/timetables/timetables.module.ts @@ -1,8 +1,11 @@ import { Module } from '@nestjs/common'; import { TimetablesController } from './timetables.controller'; import { TimetablesService } from './timetables.service'; +import { PrismaModule } from "../../prisma/prisma.module"; +import { LecturesModule } from "../lectures/lectures.module"; @Module({ + imports: [PrismaModule, LecturesModule], controllers: [TimetablesController], providers: [TimetablesService] }) diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index 9de46396..24c7e741 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -1,4 +1,121 @@ -import { Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; +import { TimetableRepository } from "../../prisma/repositories/timetable.repository"; +import { session_userprofile } from "@prisma/client"; +import { + AddLectureDto, + TimetableCreateDto, + TimetableQueryDto +} from "../../common/interfaces/dto/timetable/timetable.request.dto"; +import { orderFilter, validateYearAndSemester } from "../../common/utils/search.utils"; +import { SemesterRepository } from "../../prisma/repositories/semester.repository"; +import { LectureRepository } from "../../prisma/repositories/lecture.repository"; +import { PrismaService } from "../../prisma/prisma.service"; @Injectable() -export class TimetablesService {} +export class TimetablesService { + constructor( + private readonly prismaService: PrismaService, + private readonly timetableRepository: TimetableRepository, + private readonly lectureRepository: LectureRepository, + private readonly semesterRepository: SemesterRepository + ) { + } + + async getTimetables(query: TimetableQueryDto, user: session_userprofile) { + const { year, semester, order, offset, limit } = query; + + const orderBy = orderFilter(order); + const paginationAndSorting = { + skip: offset, + take: limit, + orderBy: orderBy + }; + + const timetables = await this.timetableRepository.getTimetables(user, year, semester, paginationAndSorting); + return timetables; + } + + async getTimetable(timetableId: number) { + const timeTable = await this.timetableRepository.getTimeTableById(timetableId); + return timeTable; + } + + async createTimetable(timeTableBody: TimetableCreateDto, user: session_userprofile) { + const { year, semester } = timeTableBody; + if (!await validateYearAndSemester(year, semester, this.semesterRepository)) { + throw new BadRequestException("Wrong fields 'year' and 'semester' in request data"); + } + + let arrangeOrder = 0; + const relatedTimeTables = await this.timetableRepository.getTimetableBasics(user, year, semester, { orderBy: { arrange_order: "asc" } }); + if (relatedTimeTables.length > 0) { + arrangeOrder = relatedTimeTables[relatedTimeTables.length - 1].arrange_order + 1; + } + + /* + 기존 파이썬 코드는 lectureId list가 오면 냅다 검색해서 timetable에 붙이고 return 해버렸으나, + timetable이 속한 semester, year와 lecture들의 semester, year를 비교해서 일치하는 것만 붙이는 것으로 변경 + + 또한 lectureId 중 데이터베이스에 존재하지 않는 것이 하나라도 있으면, 바로 에러를 내버리는 식으로 구현되었으나, + 가능한 것들은 모두 붙여서 저장하는 것으로 변경. + */ + const lectureIds = timeTableBody.lectures; + const lectures = await this.lectureRepository.getLectureByIds(lectureIds); + const filteredLectures = lectures.filter((lecture) => + lecture.semester === timeTableBody.semester && lecture.year === timeTableBody.year + ); + return await this.timetableRepository.createTimetable(user, year, semester, arrangeOrder, filteredLectures); + } + + async addLectureToTimetable(timeTableId: number, body: AddLectureDto) { + const lectureId = body.lecture; + const lecture = await this.lectureRepository.getLectureBasicById(lectureId); + const timetable = await this.timetableRepository.getTimeTableBasicById(timeTableId); + if(!lecture){ + throw new BadRequestException("Wrong field \\'lecture\\' in request data") + } + if( !(lecture.year == timetable.year && lecture.semester == timetable.semester)){ + throw new BadRequestException("Wrong field \\'lecture\\' in request data") + } + await this.timetableRepository.addLectureToTimetable(timeTableId, lectureId); + return await this.timetableRepository.getTimeTableById(timeTableId) + } + + async removeLectureFromTimetable(timeTableId: number, body: AddLectureDto) { + const lectureId = body.lecture; + const lecture = await this.lectureRepository.getLectureBasicById(lectureId); + const timetable = await this.timetableRepository.getTimeTableBasicById(timeTableId); + if (!lecture) { + throw new BadRequestException("Wrong field \\'lecture\\' in request data"); + } + if (!(lecture.year == timetable.year && lecture.semester == timetable.semester)) { + throw new BadRequestException("Wrong field \\'lecture\\' in request data"); + } + await this.timetableRepository.removeLectureFromTimetable(timeTableId, lectureId); + return await this.timetableRepository.getTimeTableById(timeTableId); + } + + + async deleteTimetable(user, timetableId: number) { + return await this.prismaService.$transaction(async (tx) => { + const timeTable = await this.getTimetable(timetableId); + const semester = timeTable.semester; + const year = timeTable.year; + const arrangeOrder = timeTable.arrange_order; + if (!timeTable) { + return new NotFoundException(); + } + await this.timetableRepository.deleteById(timetableId); + const relatedTimeTables = await this.timetableRepository.getTimetables(user, year, semester); + const timeTablesToBeUpdated = relatedTimeTables.filter((timeTable) => timeTable.arrange_order > arrangeOrder) + .map((timeTable) => { + return { id: timeTable.id, arrange_order: timeTable.arrange_order - 1 }; + }); + await Promise.all(timeTablesToBeUpdated.map(async (updateElem) => { + return this.timetableRepository.updateOrder(updateElem.id, updateElem.arrange_order); + }) + ); + }) + } + +} diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index fab96731..e769401d 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -5,6 +5,8 @@ import { LectureRepository } from "./repositories/lecture.repository"; import { ReviewsRepository } from "./repositories/review.repository"; import { DepartmentRepository } from "./repositories/department.repository"; import { CourseRepository } from "./repositories/course.repository"; +import { SemesterRepository } from "./repositories/semester.repository"; +import { TimetableRepository } from "./repositories/timetable.repository"; @Module({ providers: [PrismaService, @@ -13,6 +15,8 @@ import { CourseRepository } from "./repositories/course.repository"; ReviewsRepository, DepartmentRepository, CourseRepository, + SemesterRepository, + TimetableRepository, ], exports: [PrismaService, UserRepository, @@ -20,6 +24,8 @@ import { CourseRepository } from "./repositories/course.repository"; ReviewsRepository, DepartmentRepository, CourseRepository, + SemesterRepository, + TimetableRepository, ] }) export class PrismaModule {} diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index cf5a8d67..33c74129 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -5,7 +5,7 @@ import { groupBy } from "../../common/utils/method.utils"; import { LectureQueryDto } from "src/common/interfaces/dto/lecture/lecture.request.dto"; import { CourseRepository } from "./course.repository"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { LectureDetails } from "../../common/schemaTypes/types"; +import { LectureBasic, lectureDetails, LectureDetails } from "../../common/schemaTypes/types"; @Injectable() export class LectureRepository { @@ -16,18 +16,32 @@ export class LectureRepository { async getLectureById(id: number): Promise { return await this.prisma.subject_lecture.findUnique({ - include: { - subject_department: true, - subject_lecture_professors: { include: { professor: true } }, - subject_classtime: true, - subject_examtime: true, - }, + include: lectureDetails.include, where: { id: id } }); } + async getLectureBasicById(id: number): Promise { + return await this.prisma.subject_lecture.findUnique({ + where: { + id: id + } + }); + } + + async getLectureByIds(ids: number[]): Promise{ + return await this.prisma.subject_lecture.findMany({ + include: lectureDetails.include, + where: { + id: { + in: ids + } + } + }); + } + async filterByRequest(query: LectureQueryDto): Promise { const DEFAULT_LIMIT = 300; const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; diff --git a/src/prisma/repositories/semester.repository.ts b/src/prisma/repositories/semester.repository.ts new file mode 100644 index 00000000..25fa5ada --- /dev/null +++ b/src/prisma/repositories/semester.repository.ts @@ -0,0 +1,32 @@ +import { PrismaService } from "../prisma.service"; +import { Injectable } from "@nestjs/common"; +import { Prisma } from "@prisma/client"; + +@Injectable() +export class SemesterRepository{ + constructor(private readonly prisma: PrismaService) { + } + + async existsSemester(year: number, semester: number): Promise { + const existsSemester: boolean = await this.prisma.subject_semester.findFirstOrThrow({ + where: { + year: year, + semester: semester + } + }).catch((e) => false) + .then((s)=> true); + return existsSemester; + } + + async getSemesters(paginationAndSoring?: { orderBy?: Prisma.subject_semesterOrderByWithRelationInput[],skip?: number, take?: number }) { + const orderBy = paginationAndSoring.orderBy; + const skip = paginationAndSoring.skip; + const take = paginationAndSoring.take; + + return await this.prisma.subject_semester.findMany({ + orderBy: orderBy, + skip: skip, + take: take, + }) + } +} \ No newline at end of file diff --git a/src/prisma/repositories/timetable.repository.ts b/src/prisma/repositories/timetable.repository.ts new file mode 100644 index 00000000..c1144202 --- /dev/null +++ b/src/prisma/repositories/timetable.repository.ts @@ -0,0 +1,138 @@ +import { Injectable } from "@nestjs/common"; +import { PrismaService } from "../prisma.service"; +import { Prisma, PrismaClient, session_userprofile } from "@prisma/client"; +import { + lectureDetails, + LectureDetails, + TimeTableBasic, + timeTableDetails, + TimeTableDetails +} from "../../common/schemaTypes/types"; +import session from "express-session"; + +@Injectable() +export class TimetableRepository{ + constructor(private readonly prisma: PrismaService){} + + async getTimetables( user: session_userprofile, year?: number, semester?: number, paginationAndSorting?: {orderBy?: Prisma.timetable_timetableOrderByWithRelationInput[], skip?: number, take?: number}): Promise { + + const skip = paginationAndSorting?.skip; + const take = paginationAndSorting?.take; + const orderBy = paginationAndSorting?.orderBy; + + return await this.prisma.timetable_timetable.findMany({ + include: timeTableDetails.include, + where:{ + year: year, + semester: semester, + user_id: user.id, + }, + skip: skip, + take: take, + orderBy: orderBy, + }) + } + + async getTimetableBasics(user: session_userprofile, year?: number, semester?: number, paginationAndSorting?: {orderBy: Prisma.timetable_timetableOrderByWithRelationInput, skip?: number, take?: number}): Promise{ + const skip = paginationAndSorting.skip; + const take = paginationAndSorting.take; + const orderBy = paginationAndSorting.orderBy; + + return await this.prisma.timetable_timetable.findMany({ + where:{ + year: year, + semester: semester, + user_id: user.id, + }, + skip: skip, + take: take, + orderBy: orderBy, + }) + } + + async createTimetable(user: session_userprofile, year: number, semester: number, arrangeOrder: number, lectures: LectureDetails[]): Promise { + return await this.prisma.timetable_timetable.create({ + data:{ + user_id: user.id, + year: year, + semester: semester, + arrange_order: arrangeOrder, + timetable_timetable_lectures: { + createMany:{ + data: lectures.map(lecture => { + return { + lecture_id: lecture.id, + } + }) + } + } + }, + include:timeTableDetails.include, + }) + } + + async getTimeTableBasicById(timeTableId: number) { + return await this.prisma.timetable_timetable.findUnique({ + where: { + id: timeTableId + } + }); + } + + async addLectureToTimetable(timeTableId: number, lectureId: number) { + return await this.prisma.timetable_timetable_lectures.create({ + data:{ + timetable_id: timeTableId, + lecture_id: lectureId, + } + }) + } + + async getTimeTableById(timeTableId: number):Promise{ + return await this.prisma.timetable_timetable.findUnique({ + include: timeTableDetails.include, + where: { + id: timeTableId + } + }); + } + + async removeLectureFromTimetable(timeTableId: number, lectureId: number) { + return await this.prisma.timetable_timetable_lectures.delete({ + where:{ + timetable_id_lecture_id: { + timetable_id: timeTableId, + lecture_id: lectureId, + } + } + }) + } + + async deleteById(timetableId: number, tx?: PrismaClient ) { + let prismaClient: PrismaClient = this.prisma; + if(tx){ + prismaClient = tx; + } + await prismaClient.timetable_timetable_lectures.deleteMany({ + where:{ + timetable_id: timetableId + } + }) + return await prismaClient.timetable_timetable.delete({ + where:{ + id: timetableId + } + }) + } + + async updateOrder(id: number, arrange_order: number) { + return await this.prisma.timetable_timetable.update({ + where:{ + id: id + }, + data:{ + arrange_order: arrange_order + } + }) + } +} \ No newline at end of file From c40e8ccd88bfc2a9dda4e8c0de84d33665aad137 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Fri, 25 Aug 2023 01:22:53 +0900 Subject: [PATCH 099/250] Feat: add get lecture review api Fix:change string to array when order have one value at review.request.dto, user.request.dto.ts Refactor: parameter name at review.repo-getReviews --- .../dto/lecture/lecture.request.dto.ts | 22 +- .../dto/reviews/reviews.request.dto.ts | 2 + .../interfaces/dto/user/user.request.dto.ts | 9 +- src/common/schemaTypes/types.ts | 12 + src/modules/lectures/lectures.controller.ts | 8 +- src/modules/lectures/lectures.service.ts | 47 +++- src/prisma/repositories/lecture.repository.ts | 242 ++++++++++++------ src/prisma/repositories/review.repository.ts | 12 +- 8 files changed, 258 insertions(+), 96 deletions(-) diff --git a/src/common/interfaces/dto/lecture/lecture.request.dto.ts b/src/common/interfaces/dto/lecture/lecture.request.dto.ts index e2fe6c4c..43e504e0 100644 --- a/src/common/interfaces/dto/lecture/lecture.request.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.request.dto.ts @@ -1,5 +1,6 @@ +import { OrderDefaultValidator, _PROHIBITED_FIELD_PATTERN } from 'src/common/decorators/request-ordervalidator.decorator'; import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; -import { Transform } from "class-transformer"; +import { Transform, Type } from "class-transformer"; import { CourseQueryDto } from "../course/course.request.dto"; export class LectureQueryDto extends CourseQueryDto{ @@ -38,4 +39,23 @@ export class LectureQueryDto extends CourseQueryDto{ @IsArray() @IsNumber({},{each: true}) end?: number[]; +} + +export class LectureReviewsQueryDto { + @IsOptional() + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @IsArray() + @IsString({ each: true }) + @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) + order?: string[]; + + @IsOptional() + @IsNumber() + @Type(() => Number) + offset?: number; + + @IsOptional() + @IsNumber() + @Type(() => Number) + limit?: number; } \ No newline at end of file diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index fdc3a2c3..5bac620e 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -29,7 +29,9 @@ export class ReviewQueryDto { response_type?: string; @IsOptional() + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() + @IsString({ each: true }) @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) order?: string[]; diff --git a/src/common/interfaces/dto/user/user.request.dto.ts b/src/common/interfaces/dto/user/user.request.dto.ts index 2b01bc51..11f55f7c 100644 --- a/src/common/interfaces/dto/user/user.request.dto.ts +++ b/src/common/interfaces/dto/user/user.request.dto.ts @@ -1,9 +1,12 @@ -import { IsArray, IsOptional, Validate } from "class-validator"; -import { OrderDefaultValidator } from "../reviews/validators"; +import { Transform } from "class-transformer"; +import { IsArray, IsOptional, IsString, Validate } from "class-validator"; +import { OrderDefaultValidator, _PROHIBITED_FIELD_PATTERN } from "src/common/decorators/request-ordervalidator.decorator"; export class UserTakenCoursesQueryDto { @IsOptional() + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @Validate(OrderDefaultValidator) + @IsString({ each: true }) + @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) order?: string[]; } diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 5d78bb9a..922ad8d2 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -36,6 +36,18 @@ const reviewDetails = Prisma.validator()({ } }); +const lectureReviews = Prisma.validator()({ + include: { + review: { + include: { + course: courseDetails, + lecture: lectureDetails, + }, + }, + }, +}); + +export type LectureReview = Prisma.subject_lectureGetPayload export type ReviewDetails = Prisma.review_reviewGetPayload export type LectureDetails = Prisma.subject_lectureGetPayload export type CourseDetails = Prisma.subject_courseGetPayload \ No newline at end of file diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index fcb315ce..d6945095 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -1,6 +1,7 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { LecturesService } from './lectures.service'; -import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; +import { LectureQueryDto, LectureReviewsQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; @Controller('api/lectures') export class LecturesController { @@ -15,4 +16,9 @@ export class LecturesController { async getLectureById(@Param('id') id: number) { return await this.LectureService.getLectureById(id); } + + @Get(':lectureId/reviews') + async getLectureReviews(@Query() query: LectureReviewsQueryDto, @Param('lectureId') lectureId:number, @GetUser() user):Promise{ + return await this.LectureService.getLectureReviews(user, lectureId, query); + } } diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index fa0eb2cb..dcd39c5f 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -1,16 +1,21 @@ -import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; +import { LectureQueryDto, LectureReviewsQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; import { LectureRepository } from './../../prisma/repositories/lecture.repository'; import { Injectable, NotFoundException } from '@nestjs/common'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; import { LectureResponseDto } from 'src/common/interfaces/dto/lecture/lecture.response.dto'; +import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; +import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; +import { session_userprofile } from '@prisma/client'; @Injectable() export class LecturesService { - constructor(private LectureRepository: LectureRepository) {} + constructor(private LectureRepository: LectureRepository, private reviewsRepository: ReviewsRepository) {} - public async getLectureByFilter(query: LectureQueryDto): Promise { + public async getLectureByFilter( + query: LectureQueryDto, + ): Promise { const queryResult = await this.LectureRepository.filterByRequest(query); - return queryResult.map((lecture) => toJsonLecture(lecture, false)) + return queryResult.map((lecture) => toJsonLecture(lecture, false)); } public async getLectureById(id: number): Promise { @@ -20,4 +25,38 @@ export class LecturesService { } return toJsonLecture(queryResult, false); } + + public async getLectureReviews( + user: session_userprofile, + lectureId: number, + query: LectureReviewsQueryDto, + ):Promise{ + const MAX_LIMIT = 100; + const DEFAULT_ORDER = ['-written_datetime', '-id']; + const lecture = await this.LectureRepository.getLectureReviewsById( + lectureId, + query.order ?? DEFAULT_ORDER, + query.offset ?? 0, + query.limit ?? MAX_LIMIT, + ); + const reviews = lecture.review; + return await Promise.all( + reviews.map(async (review) => { + const result = toJsonReview(review); + if (user) { + const isLiked: boolean = await this.reviewsRepository.isLiked( + review.id, + user.id, + ); + return Object.assign(result, { + userspecific_is_liked: isLiked, + }); + } else { + return Object.assign(result, { + userspecific_is_liked: false, + }); + } + }), + ); + } } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index cf5a8d67..f59b926c 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -5,13 +5,13 @@ import { groupBy } from "../../common/utils/method.utils"; import { LectureQueryDto } from "src/common/interfaces/dto/lecture/lecture.request.dto"; import { CourseRepository } from "./course.repository"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { LectureDetails } from "../../common/schemaTypes/types"; +import { LectureDetails, LectureReview } from "../../common/schemaTypes/types"; @Injectable() export class LectureRepository { constructor( private readonly prisma: PrismaService, - private readonly courseRepository: CourseRepository + private readonly courseRepository: CourseRepository, ) {} async getLectureById(id: number): Promise { @@ -23,23 +23,77 @@ export class LectureRepository { subject_examtime: true, }, where: { - id: id + id: id, + }, + }); + } + + async getLectureReviewsById(id: number,order: string[], + offset: number, + limit: number): Promise { + const orderFilter: { [key: string]: string }[] = []; + order.forEach((orderList) => { + const orderDict: { [key: string]: string } = {}; + let order = 'asc'; + const orderBy = orderList.split('-'); + if (orderBy[0] == '') { + order = 'desc'; } + orderDict[orderBy[orderBy.length - 1]] = order; + orderFilter.push(orderDict); + }); + return await this.prisma.subject_lecture.findUnique({ + include: { + review: { + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, + }, + orderBy: orderFilter, + skip: offset, + take: limit, + }, + }, + where: { + id: id, + }, }); } async filterByRequest(query: LectureQueryDto): Promise { const DEFAULT_LIMIT = 300; const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; - const researchTypes = ["Individual Study", "Thesis Study(Undergraduate)", - "Thesis Research(MA/phD)"]; - + const researchTypes = [ + 'Individual Study', + 'Thesis Study(Undergraduate)', + 'Thesis Research(MA/phD)', + ]; + const semesterFilter = this.semesterFilter(query?.year, query?.semester); const timeFilter = this.timeFilter(query?.day, query?.begin, query?.end); - const departmentFilter = this.courseRepository.departmentFilter(query?.department); + const departmentFilter = this.courseRepository.departmentFilter( + query?.department, + ); const typeFilter = this.courseRepository.typeFilter(query?.type); const groupFilter = this.courseRepository.groupFilter(query?.group); - const keywordFilter = this.courseRepository.keywordFilter(query?.keyword, false); + const keywordFilter = this.courseRepository.keywordFilter( + query?.keyword, + false, + ); const defaultFilter = { AND: [ { @@ -47,14 +101,21 @@ export class LectureRepository { }, { type_en: { - notIn: researchTypes - } - } - ] - } + notIn: researchTypes, + }, + }, + ], + }; - const filters = [semesterFilter, timeFilter, - departmentFilter, typeFilter, groupFilter, keywordFilter, defaultFilter]; + const filters = [ + semesterFilter, + timeFilter, + departmentFilter, + typeFilter, + groupFilter, + keywordFilter, + defaultFilter, + ]; const queryResult = await this.prisma.subject_lecture.findMany({ include: { subject_department: true, @@ -63,47 +124,63 @@ export class LectureRepository { subject_examtime: true, }, where: { - AND: filters.filter((filter) => filter !== null) + AND: filters.filter((filter) => filter !== null), }, take: query.limit ?? DEFAULT_LIMIT, }); - const levelFilteredResult = this.courseRepository.levelFilter(queryResult, query?.level); + const levelFilteredResult = + this.courseRepository.levelFilter( + queryResult, + query?.level, + ); - const orderedQuery = applyOrder(levelFilteredResult, query.order ?? DEFAULT_ORDER); + const orderedQuery = applyOrder( + levelFilteredResult, + query.order ?? DEFAULT_ORDER, + ); return applyOffset(orderedQuery, query.offset ?? 0); } - async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { + async findReviewWritableLectures( + user: session_userprofile, + date?: Date, + ): Promise { let currDate; if (!date) { currDate = Date.now(); } else { - currDate = date + currDate = date; } const notWritableSemesters = await this.prisma.subject_semester.findMany({ where: { OR: [ { courseAddDropPeriodEnd: { - gte: currDate + gte: currDate, }, }, { beginning: { - gte: currDate - } - } - ] - } + gte: currDate, + }, + }, + ], + }, }); - const notWritableYearAndSemester = groupBy(notWritableSemesters.map((semester) => { - return { - semester: semester.semester, - year: semester.year - } - }),(subject_semester) => subject_semester.year) + const notWritableYearAndSemester = groupBy( + notWritableSemesters.map((semester) => { + return { + semester: semester.semester, + year: semester.year, + }; + }), + (subject_semester) => subject_semester.year, + ); - const notWritableYearAndSemesterMap: Record> = { } ; + const notWritableYearAndSemesterMap: Record< + number, + Record + > = {}; for (const key in notWritableYearAndSemester) { const objects = notWritableYearAndSemester[key]; const mapObjects = groupBy(objects); @@ -112,8 +189,10 @@ export class LectureRepository { const takenLectures = await this.getTakenLectures(user); const reviewWritableLectures = takenLectures.filter((lecture) => { - return notWritableYearAndSemesterMap[lecture.year]??[lecture.semester] ? true: false - }) + return notWritableYearAndSemesterMap[lecture.year] ?? [lecture.semester] + ? true + : false; + }); // const lectures = await this.prisma.subject_lecture.findMany({ // where: { @@ -127,66 +206,71 @@ export class LectureRepository { getResearchLectureQuery(): Prisma.subject_lectureWhereInput { return { type_en: { - in: ["Individual Study", "Thesis Study(Undergraduate)", - "Thesis Research(MA/phD)"] - } - } + in: [ + 'Individual Study', + 'Thesis Study(Undergraduate)', + 'Thesis Research(MA/phD)', + ], + }, + }; } async getTakenLectures(user: session_userprofile): Promise { - const lectures = (await this.prisma.session_userprofile_taken_lectures.findMany({ - where: { - userprofile_id: user.id - }, - include: { - lecture: { - include:{ - subject_lecture_professors: { - include:{ - professor: true - } + const lectures = ( + await this.prisma.session_userprofile_taken_lectures.findMany({ + where: { + userprofile_id: user.id, + }, + include: { + lecture: { + include: { + subject_lecture_professors: { + include: { + professor: true, + }, + }, + subject_department: true, + subject_examtime: true, + subject_classtime: true, }, - subject_department: true, - subject_examtime: true, - subject_classtime: true, - } - } - } - })).map((takenLecture) => takenLecture.lecture); + }, + }, + }) + ).map((takenLecture) => takenLecture.lecture); return lectures; } public semesterFilter(years: number[], semesters: number[]): object { - if ((!years) && (!semesters)) { + if (!years && !semesters) { return null; } else if (!years) { return { semester: { - in: semesters - } - } + in: semesters, + }, + }; } else if (!semesters) { return { years: { - in: semesters - } - } + in: semesters, + }, + }; } else { return { AND: [ { year: { - in: years - } + in: years, + }, }, { semester: { - in: semesters - } - } - ] - } + in: semesters, + }, + }, + ], + }; } } @@ -194,19 +278,15 @@ export class LectureRepository { const datetimeBegin = begin?.map((time) => this.datetimeConverter(time)); const datetimeEnd = end?.map((time) => this.datetimeConverter(time)); - const dayFilter = day ? { day: {in: day} } : null; - const beginFilter = begin ? { begin: {in: datetimeBegin} } : null; - const endFilter = end ? { end: {in: datetimeEnd} } : null; + const dayFilter = day ? { day: { in: day } } : null; + const beginFilter = begin ? { begin: { in: datetimeBegin } } : null; + const endFilter = end ? { end: { in: datetimeEnd } } : null; return { - AND: [ - dayFilter, - beginFilter, - endFilter - ] - } + AND: [dayFilter, beginFilter, endFilter], + }; } - public datetimeConverter (time: number) { + public datetimeConverter(time: number) { const hour = Math.floor(time / 2) + 8; const minute = (time % 2) * 30; return new Date(0, 0, 0, hour, minute, 0, 0); diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 08662c29..92da49b7 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -56,19 +56,19 @@ export class ReviewsRepository { }); } public async getReviews( - lecture_year: number, - lecture_semester: number, + lectureYear: number, + lectureSemester: number, order: string[], offset: number, limit: number, ): Promise { let lectureFilter: object = {}; const orderFilter: { [key: string]: string }[] = []; - if (lecture_year) { - lectureFilter = { ...lectureFilter, year: lecture_year }; + if (lectureYear) { + lectureFilter = { ...lectureFilter, year: lectureYear }; } - if (lecture_semester) { - lectureFilter = { ...lectureFilter, semester: lecture_semester }; + if (lectureSemester) { + lectureFilter = { ...lectureFilter, semester: lectureSemester }; } order.forEach((orderList) => { const orderDict: { [key: string]: string } = {}; From 5b9646a1fd16d52623671342475d8dd2ddf2e1ac Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Fri, 25 Aug 2023 01:34:37 +0900 Subject: [PATCH 100/250] Fix:add Return Type --- src/modules/lectures/lectures.controller.ts | 7 ++++++- src/modules/lectures/lectures.service.ts | 12 ++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index d6945095..bb9e52cd 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -2,6 +2,7 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { LecturesService } from './lectures.service'; import { LectureQueryDto, LectureReviewsQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @Controller('api/lectures') export class LecturesController { @@ -18,7 +19,11 @@ export class LecturesController { } @Get(':lectureId/reviews') - async getLectureReviews(@Query() query: LectureReviewsQueryDto, @Param('lectureId') lectureId:number, @GetUser() user):Promise{ + async getLectureReviews( + @Query() query: LectureReviewsQueryDto, + @Param('lectureId') lectureId: number, + @GetUser() user, + ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { return await this.LectureService.getLectureReviews(user, lectureId, query); } } diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index 95a53c98..a49576cc 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -7,10 +7,14 @@ import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; import { session_userprofile } from '@prisma/client'; import { LectureDetails } from "../../common/schemaTypes/types"; +import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; @Injectable() export class LecturesService { - constructor(private LectureRepository: LectureRepository, private reviewsRepository: ReviewsRepository) {} + constructor( + private LectureRepository: LectureRepository, + private reviewsRepository: ReviewsRepository, + ) {} public async getLectureByFilter( query: LectureQueryDto, @@ -31,7 +35,7 @@ export class LecturesService { user: session_userprofile, lectureId: number, query: LectureReviewsQueryDto, - ):Promise{ + ): Promise<(ReviewResponseDto & { userspecific_is_liked: boolean })[]> { const MAX_LIMIT = 100; const DEFAULT_ORDER = ['-written_datetime', '-id']; const lecture = await this.LectureRepository.getLectureReviewsById( @@ -59,8 +63,8 @@ export class LecturesService { } }), ); - } - + } + public async getLecturesByIds(ids: number[]): Promise { return await this.LectureRepository.getLectureByIds(ids); } From 5e18ad77d63be3294e094f56cfccd8077ece4f6b Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 6 Sep 2023 16:15:23 +0900 Subject: [PATCH 101/250] Add: implement getReviewByCourseId (#40) --- .../dto/course/course.review.request.dto.ts | 20 ++++ .../dto/reviews/review.response.dto.ts | 5 +- .../serializer/review.serializer.ts | 70 +++++++----- src/common/schemaTypes/types.ts | 65 ++++++----- src/common/utils/search.utils.ts | 74 +++++++++---- src/modules/courses/courses.controller.ts | 31 +++++- src/modules/courses/courses.service.ts | 102 +++++++++++++----- src/prisma/repositories/course.repository.ts | 54 ++++++++-- src/prisma/repositories/review.repository.ts | 9 +- 9 files changed, 308 insertions(+), 122 deletions(-) create mode 100644 src/common/interfaces/dto/course/course.review.request.dto.ts diff --git a/src/common/interfaces/dto/course/course.review.request.dto.ts b/src/common/interfaces/dto/course/course.review.request.dto.ts new file mode 100644 index 00000000..13007089 --- /dev/null +++ b/src/common/interfaces/dto/course/course.review.request.dto.ts @@ -0,0 +1,20 @@ +import { IsArray, IsNumber, IsOptional, IsString } from 'class-validator'; +import { Transform } from 'class-transformer'; + +export class CourseReviewQueryDto { + @IsOptional() + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @IsArray() + @IsString({ each: true }) + order?: string[]; + + @IsOptional() + @IsNumber() + @Transform(({ value }) => parseInt(value)) + offset?: number; + + @IsOptional() + @IsNumber() + @Transform(({ value }) => parseInt(value)) + limit?: number; +} diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts index 39236ca6..50bc2500 100644 --- a/src/common/interfaces/dto/reviews/review.response.dto.ts +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -1,5 +1,5 @@ -import { CourseResponseDto } from "../course/course.response.dto"; -import { LectureResponseDto } from "../lecture/lecture.response.dto"; +import { CourseResponseDto } from '../course/course.response.dto'; +import { LectureResponseDto } from '../lecture/lecture.response.dto'; export class ReviewResponseDto { id: number; @@ -11,4 +11,5 @@ export class ReviewResponseDto { grade: number; load: number; speech: number; + userspecific_is_liked: boolean; } diff --git a/src/common/interfaces/serializer/review.serializer.ts b/src/common/interfaces/serializer/review.serializer.ts index 6f5c88d8..e93f0778 100644 --- a/src/common/interfaces/serializer/review.serializer.ts +++ b/src/common/interfaces/serializer/review.serializer.ts @@ -1,37 +1,49 @@ -import { toJsonCourse } from "./course.serializer"; -import { ReviewResponseDto } from "./../dto/reviews/review.response.dto"; -import { getRepresentativeLecture } from "src/common/utils/lecture.utils"; -import { toJsonLecture } from "./lecture.serializer"; -import { ReviewDetails } from "../../schemaTypes/types"; +import { toJsonCourse } from './course.serializer'; +import { ReviewResponseDto } from './../dto/reviews/review.response.dto'; +import { getRepresentativeLecture } from 'src/common/utils/lecture.utils'; +import { toJsonLecture } from './lecture.serializer'; +import { ReviewDetails } from '../../schemaTypes/types'; +import { session_userprofile } from '@prisma/client'; - -export const toJsonReview = (review: ReviewDetails): ReviewResponseDto => { +export const toJsonReview = ( + review: ReviewDetails, + user?: session_userprofile, +): ReviewResponseDto => { const representativeLecture = getRepresentativeLecture(review.course.lecture); const professorRaw = review.course.subject_course_professors.map( - (x) => x.professor + (x) => x.professor, ); + let isLiked = true; + if (!user || !review.review_reviewvote) { + isLiked = false; + } else if ( + !review.review_reviewvote.find( + (reviewvote) => reviewvote.userprofile_id === user.id, + ) + ) { + isLiked = false; + } + const courseResult = toJsonCourse( review.course, representativeLecture, professorRaw, - true, - ); - Object.assign(courseResult, { - userspecific_is_read: false, - }); - - const result = { - id: review.id, - course: courseResult, - lecture: toJsonLecture(review.lecture, true), - content: review.is_deleted - ? '관리자에 의해 삭제된 코멘트입니다.' - : review.content, - like: review.like, - is_deleted: review.is_deleted, - grade: review.grade, - load: review.load, - speech: review.speech, - }; - return result; -} \ No newline at end of file + true, + ); + + const result = { + id: review.id, + course: courseResult, + lecture: toJsonLecture(review.lecture, true), + content: review.is_deleted + ? '관리자에 의해 삭제된 코멘트입니다.' + : review.content, + like: review.like, + is_deleted: review.is_deleted, + grade: review.grade, + load: review.load, + speech: review.speech, + userspecific_is_liked: isLiked, + }; + return result; +}; diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 8918274d..36a47c92 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -1,20 +1,20 @@ -import { Prisma } from "@prisma/client"; +import { Prisma } from '@prisma/client'; export type userSelectResultType = Prisma.session_userprofileGetPayload<{ - include: Prisma.session_userprofileInclude -}> + include: Prisma.session_userprofileInclude; +}>; export type courseSelectResultType = Prisma.subject_courseGetPayload<{ - include: Prisma.subject_courseInclude -}> + include: Prisma.subject_courseInclude; +}>; export const courseDetails = Prisma.validator()({ include: { subject_department: true, subject_course_professors: { include: { professor: true } }, lecture: true, - subject_courseuser: true - } + subject_courseuser: true, + }, }); export const lectureDetails = Prisma.validator()({ @@ -22,34 +22,43 @@ export const lectureDetails = Prisma.validator()({ subject_department: true, subject_lecture_professors: { include: { professor: true } }, subject_classtime: true, - subject_examtime: true - } + subject_examtime: true, + }, }); -export const timeTableDetails = Prisma.validator()({ - include:{ - timetable_timetable_lectures: { - include:{ - subject_lecture: lectureDetails, - } - } - } -}) +export const timeTableDetails = + Prisma.validator()({ + include: { + timetable_timetable_lectures: { + include: { + subject_lecture: lectureDetails, + }, + }, + }, + }); export type NESTED = true; - const reviewDetails = Prisma.validator()({ include: { course: courseDetails, - lecture: lectureDetails - } + lecture: lectureDetails, + review_reviewvote: true, + }, }); -export type ReviewDetails = Prisma.review_reviewGetPayload -export type LectureDetails = Prisma.subject_lectureGetPayload -export type LectureBasic = Prisma.subject_lectureGetPayload -export type CourseDetails = Prisma.subject_courseGetPayload -export type TimeTableDetails = Prisma.timetable_timetableGetPayload -export type TimeTableBasic = Prisma.timetable_timetableGetPayload -export type SemesterBasic = Prisma.subject_semesterGetPayload \ No newline at end of file +export type ReviewDetails = Prisma.review_reviewGetPayload< + typeof reviewDetails +>; +export type LectureDetails = Prisma.subject_lectureGetPayload< + typeof lectureDetails +>; +export type LectureBasic = Prisma.subject_lectureGetPayload; +export type CourseDetails = Prisma.subject_courseGetPayload< + typeof courseDetails +>; +export type TimeTableDetails = Prisma.timetable_timetableGetPayload< + typeof timeTableDetails +>; +export type TimeTableBasic = Prisma.timetable_timetableGetPayload; +export type SemesterBasic = Prisma.subject_semesterGetPayload; diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index ed1ce2e9..29677941 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,33 +1,38 @@ -import { PrismaService } from "../../prisma/prisma.service"; -import { SemesterRepository } from "../../prisma/repositories/semester.repository"; +import { PrismaService } from '../../prisma/prisma.service'; +import { SemesterRepository } from '../../prisma/repositories/semester.repository'; export function applyOrder(query: T[], order_opt: string[]) { if (order_opt.length == 0) { return query; } else { - return query?.sort((a: T, b: T) => { - for (let i = 0; i < order_opt.length; i++) { - const order = order_opt[i]; - if (a[order] > b[order]) { - return 1; - } else if (a[order] < b[order]) { - return -1; + return ( + query?.sort((a: T, b: T) => { + for (let i = 0; i < order_opt.length; i++) { + const order = order_opt[i]; + if (a[order] > b[order]) { + return 1; + } else if (a[order] < b[order]) { + return -1; + } } - } - return 0; - }) ?? [] + return 0; + }) ?? [] + ); } } export function applyOffset(query: T[], offset: number) { - if (!(offset)) { + if (!offset) { return query; } else { return query?.slice(offset) ?? []; } } -export function semesterFilter(year: number, semester: number): { year?: number, semester?: number } { +export function semesterFilter( + year: number, + semester: number, +): { year?: number; semester?: number } { let semesterFilter: object = {}; if (year) { semesterFilter = { ...semesterFilter, year: year }; @@ -38,22 +43,49 @@ export function semesterFilter(year: number, semester: number): { year?: number, return semesterFilter; } +export type orderFilterType = { + [key: string]: orderFilterType | string; +}; + export function orderFilter(order: string[]) { - const orderFilter: { [key: string]: string }[] = []; + const orderFilter: orderFilterType[] = []; order.forEach((orderList) => { const orderDict: { [key: string]: string } = {}; let order = 'asc'; - const orderBy = orderList.split('-'); + const orderBy = orderList.split(/-|__/); if (orderBy[0] == '') { order = 'desc'; } + orderDict[orderBy[orderBy.length - 1]] = order; - orderFilter.push(orderDict); + orderFilter.push(orderDictHelper(orderBy.slice(1), order)); }); return orderFilter; } -export async function validateYearAndSemester(year: number, semester: number, semesterRepo: SemesterRepository) { - const existsSemester: boolean = await semesterRepo.existsSemester(year, semester); - return existsSemester || (2009 < year && year < 2018 && semester && [1, 3].includes(semester)); -} \ No newline at end of file +function orderDictHelper(orderList: string[], order: string): orderFilterType { + if (orderList.length == 0) { + return {}; + } else if (orderList[0] == '') { + return orderDictHelper(orderList.slice(1), order); + } else if (orderList.length == 1) { + return { [orderList[0]]: order }; + } else { + return { [orderList[0]]: orderDictHelper(orderList.slice(1), order) }; + } +} + +export async function validateYearAndSemester( + year: number, + semester: number, + semesterRepo: SemesterRepository, +) { + const existsSemester: boolean = await semesterRepo.existsSemester( + year, + semester, + ); + return ( + existsSemester || + (2009 < year && year < 2018 && semester && [1, 3].includes(semester)) + ); +} diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index f2d459b9..072f46ef 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -2,25 +2,46 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { CoursesService } from './courses.service'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; -import { CourseQueryDto } from "../../common/interfaces/dto/course/course.request.dto"; +import { CourseQueryDto } from '../../common/interfaces/dto/course/course.request.dto'; +import { Public } from 'src/common/decorators/skip-auth.decorator'; +import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; @Controller('api/courses') export class CourseController { constructor(private readonly CoursesService: CoursesService) {} @Get() - async getCourses(@Query() query: CourseQueryDto, @GetUser() user: session_userprofile) { + async getCourses( + @Query() query: CourseQueryDto, + @GetUser() user: session_userprofile, + ) { const courses = await this.CoursesService.getCourseByFilter(query, user); - return courses + return courses; } @Get(':id') - async getCourseById(@Param('id') id: number, @GetUser() user: session_userprofile) { + async getCourseById( + @Param('id') id: number, + @GetUser() user: session_userprofile, + ) { return await this.CoursesService.getCourseById(id, user); } @Get(':id/lectures') - async getLecturesByCourseId(@Query() query: {order: string[]}, @Param('id') id: number) { + async getLecturesByCourseId( + @Query() query: { order: string[] }, + @Param('id') id: number, + ) { return await this.CoursesService.getLecturesByCourseId(query, id); } + + @Get(':id/reviews') + @Public() + async getReviewByCourseId( + @Query() query: CourseReviewQueryDto, + @Param('id') id: number, + @GetUser() user: session_userprofile, + ) { + return await this.CoursesService.getReviewsByCourseId(query, id, user); + } } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 45fba127..0824ccdd 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -4,39 +4,50 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; import { applyOrder } from 'src/common/utils/search.utils'; import { session_userprofile } from '@prisma/client'; -import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; -import { toJsonProfessor } from "../../common/interfaces/serializer/professor.serializer"; -import { toJsonCourse } from "../../common/interfaces/serializer/course.serializer"; -import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; -import { CourseResponseDtoNested } from "../../common/interfaces/dto/course/course.response.dto"; +import { toJsonDepartment } from '../../common/interfaces/serializer/department.serializer'; +import { toJsonProfessor } from '../../common/interfaces/serializer/professor.serializer'; +import { toJsonCourse } from '../../common/interfaces/serializer/course.serializer'; +import { getRepresentativeLecture } from '../../common/utils/lecture.utils'; +import { CourseResponseDtoNested } from '../../common/interfaces/dto/course/course.response.dto'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; - +import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; +import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; @Injectable() export class CoursesService { - constructor( - private readonly CourseRepository: CourseRepository, - ) {} + constructor(private readonly CourseRepository: CourseRepository) {} - public async getCourseByFilter(query: any, user: session_userprofile): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { + public async getCourseByFilter( + query: any, + user: session_userprofile, + ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { const queryResult = await this.CourseRepository.filterByRequest(query); return queryResult.map((course) => { const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map((x) => x.professor); - const result = toJsonCourse(course, representativeLecture, professorRaw, false); + const professorRaw = course.subject_course_professors.map( + (x) => x.professor, + ); + const result = toJsonCourse( + course, + representativeLecture, + professorRaw, + false, + ); if (user) { - const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; + const latestReadDatetime = course.subject_courseuser.find( + (x) => (x.user_profile_id = user.id), + )?.latest_read_datetime; const latestWrittenDatetime = course.latest_written_datetime; return Object.assign(result, { - "userspecific_is_read": latestWrittenDatetime < latestReadDatetime, - }) + userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + }); } else { return Object.assign(result, { - "userspecific_is_read": false, - }) + userspecific_is_read: false, + }); } - }) + }); } public async getCourseById(id: number, user: session_userprofile) { @@ -45,28 +56,61 @@ export class CoursesService { throw new NotFoundException(); } const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map((x) => x.professor); - const result = toJsonCourse(course, representativeLecture, professorRaw, false); + const professorRaw = course.subject_course_professors.map( + (x) => x.professor, + ); + const result = toJsonCourse( + course, + representativeLecture, + professorRaw, + false, + ); if (user) { - const latestReadDatetime = course.subject_courseuser.find(x => x.user_profile_id = user.id)?.latest_read_datetime; + const latestReadDatetime = course.subject_courseuser.find( + (x) => (x.user_profile_id = user.id), + )?.latest_read_datetime; const latestWrittenDatetime = course.latest_written_datetime; return Object.assign(result, { - "userspecific_is_read": latestWrittenDatetime < latestReadDatetime, - }) + userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + }); } else { return Object.assign(result, { - "userspecific_is_read": false, - }) + userspecific_is_read: false, + }); } } - public async getLecturesByCourseId(query: {order: string[]}, id: number) { - const lectures = await this.CourseRepository.getLecturesByCourseId(query, id); + public async getLecturesByCourseId(query: { order: string[] }, id: number) { + const lectures = await this.CourseRepository.getLecturesByCourseId( + query, + id, + ); if (!lectures) { throw new NotFoundException(); } - return lectures.map((lecture) => toJsonLecture(lecture,false)); + return lectures.map((lecture) => toJsonLecture(lecture, false)); + } + + public async getReviewsByCourseId( + query: CourseReviewQueryDto, + id: number, + user: session_userprofile, + ) { + query.limit = query.limit ?? 100; + query.offset = query.offset ?? 0; + query.order = query.order ?? [ + '-lecture__year', + '-lecture__semester', + '-written_datetime', + '-id', + ]; + const reviews = await this.CourseRepository.getReviewsByCourseId(query, id); + if (!reviews) { + throw new NotFoundException(); + } + + return reviews.map((review) => toJsonReview(review, user)); } -} \ No newline at end of file +} diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 8d5da824..f2c0b25d 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,8 +1,17 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "../prisma.service"; -import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { CourseDetails, LectureDetails } from "../../common/schemaTypes/types"; -import { session_userprofile } from "@prisma/client"; +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma.service'; +import { + applyOrder, + applyOffset, + orderFilter, +} from 'src/common/utils/search.utils'; +import { + CourseDetails, + LectureDetails, + ReviewDetails, +} from '../../common/schemaTypes/types'; +import { session_userprofile } from '@prisma/client'; +import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; @Injectable() export class CourseRepository { @@ -80,6 +89,39 @@ export class CourseRepository { return applyOrder(filteredLecture, order); } + public async getReviewsByCourseId( + query: CourseReviewQueryDto, + id: number, + ): Promise { + console.log(orderFilter(query.order)); + const review = await this.prisma.review_review.findMany({ + where: { course_id: id }, + include: { + course: { + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + lecture: true, + subject_courseuser: true, + }, + }, + lecture: { + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }, + review_reviewvote: true, + }, + take: query.limit, + skip: query.offset, + orderBy: orderFilter(query.order), + }); + return review; + } + //@todo: optimize goal: 1.5s -> 0.5s, recommended: using cache public async filterByRequest(query: any): Promise { const DEFAULT_LIMIT = 150; @@ -370,4 +412,4 @@ export class CourseRepository { }, }); } -} \ No newline at end of file +} diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 08662c29..a00802dd 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; -import { session_userprofile } from "@prisma/client"; +import { session_userprofile } from '@prisma/client'; import { PrismaService } from '../prisma.service'; -import { ReviewDetails } from "../../common/schemaTypes/types"; +import { ReviewDetails } from '../../common/schemaTypes/types'; @Injectable() export class ReviewsRepository { @@ -27,6 +27,7 @@ export class ReviewsRepository { subject_examtime: true, }, }, + review_reviewvote: true, }, }); return reviews; @@ -52,6 +53,7 @@ export class ReviewsRepository { subject_examtime: true, }, }, + review_reviewvote: true, }, }); } @@ -101,6 +103,7 @@ export class ReviewsRepository { subject_examtime: true, }, }, + review_reviewvote: true, }, skip: offset, take: limit, @@ -212,6 +215,7 @@ export class ReviewsRepository { subject_examtime: true, }, }, + review_reviewvote: true, }, }); } @@ -250,6 +254,7 @@ export class ReviewsRepository { subject_examtime: true, }, }, + review_reviewvote: true, }, }); } From d1099f34231e9ac39f2d3e7fdeafd378e4e08cb8 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Wed, 6 Sep 2023 16:17:07 +0900 Subject: [PATCH 102/250] Add: @Public decorators to controller --- src/common/schemaTypes/types.ts | 2 +- src/modules/lectures/lectures.controller.ts | 2 ++ src/modules/reviews/reviews.controller.ts | 9 ++++++++- src/prisma/repositories/lecture.repository.ts | 4 ++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 580f552e..652c7e6b 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -57,7 +57,7 @@ const lectureReviews = Prisma.validator()({ }, }); -export type LectureReview = Prisma.subject_lectureGetPayload +export type LectureReviewDetails = Prisma.subject_lectureGetPayload export type ReviewDetails = Prisma.review_reviewGetPayload export type LectureDetails = Prisma.subject_lectureGetPayload export type LectureBasic = Prisma.subject_lectureGetPayload diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index bb9e52cd..1b21e898 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -3,6 +3,7 @@ import { LecturesService } from './lectures.service'; import { LectureQueryDto, LectureReviewsQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { Public } from 'src/common/decorators/skip-auth.decorator'; @Controller('api/lectures') export class LecturesController { @@ -18,6 +19,7 @@ export class LecturesController { return await this.LectureService.getLectureById(id); } + @Public() @Get(':lectureId/reviews') async getLectureReviews( @Query() query: LectureReviewsQueryDto, diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 09e2b501..60cf5540 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -4,10 +4,12 @@ import { ReviewsService } from './reviews.service'; import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; +import { Public } from 'src/common/decorators/skip-auth.decorator'; @Controller('api/reviews') export class ReviewsController { constructor(private readonly reviewsService: ReviewsService) {} + @Public() @Get() async getReviews( @Query() reviewsParam: ReviewQueryDto, @@ -39,6 +41,7 @@ export class ReviewsController { } } + @Public() @Get(':reviewId') async getReviewInstance( @Param('reviewId') reviewId: number, @@ -54,7 +57,11 @@ export class ReviewsController { @GetUser() user: session_userprofile, ): Promise { if (user) { - return await this.reviewsService.updateReviewById(reviewId, user, reviewsBody); + return await this.reviewsService.updateReviewById( + reviewId, + user, + reviewsBody, + ); } else { throw new HttpException("Can't find user", 401); } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index bba41afa..2aaade34 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -5,7 +5,7 @@ import { groupBy } from "../../common/utils/method.utils"; import { LectureQueryDto } from "src/common/interfaces/dto/lecture/lecture.request.dto"; import { CourseRepository } from "./course.repository"; import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { LectureBasic, lectureDetails, LectureDetails, LectureReview } from "../../common/schemaTypes/types"; +import { LectureBasic, lectureDetails, LectureDetails, LectureReviewDetails } from "../../common/schemaTypes/types"; @Injectable() export class LectureRepository { @@ -25,7 +25,7 @@ export class LectureRepository { async getLectureReviewsById(id: number,order: string[], offset: number, - limit: number): Promise { + limit: number): Promise { const orderFilter: { [key: string]: string }[] = []; order.forEach((orderList) => { const orderDict: { [key: string]: string } = {}; From 4121b639e276d2c9c3d7d07d84f24ee4cf4cd1b1 Mon Sep 17 00:00:00 2001 From: Jiuuung Date: Wed, 6 Sep 2023 16:45:19 +0900 Subject: [PATCH 103/250] Fix: conflict --- .../dto/lecture/lecture.request.dto.ts | 2 +- .../interfaces/dto/user/user.request.dto.ts | 5 +- src/common/schemaTypes/types.ts | 61 +++++++------------ src/prisma/repositories/lecture.repository.ts | 1 + 4 files changed, 28 insertions(+), 41 deletions(-) diff --git a/src/common/interfaces/dto/lecture/lecture.request.dto.ts b/src/common/interfaces/dto/lecture/lecture.request.dto.ts index 43e504e0..ed478fe3 100644 --- a/src/common/interfaces/dto/lecture/lecture.request.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.request.dto.ts @@ -1,7 +1,7 @@ -import { OrderDefaultValidator, _PROHIBITED_FIELD_PATTERN } from 'src/common/decorators/request-ordervalidator.decorator'; import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; import { Transform, Type } from "class-transformer"; import { CourseQueryDto } from "../course/course.request.dto"; +import { OrderDefaultValidator, _PROHIBITED_FIELD_PATTERN } from "src/common/decorators/validators.decorator"; export class LectureQueryDto extends CourseQueryDto{ diff --git a/src/common/interfaces/dto/user/user.request.dto.ts b/src/common/interfaces/dto/user/user.request.dto.ts index 11f55f7c..4462d6a1 100644 --- a/src/common/interfaces/dto/user/user.request.dto.ts +++ b/src/common/interfaces/dto/user/user.request.dto.ts @@ -1,6 +1,9 @@ import { Transform } from "class-transformer"; import { IsArray, IsOptional, IsString, Validate } from "class-validator"; -import { OrderDefaultValidator, _PROHIBITED_FIELD_PATTERN } from "src/common/decorators/request-ordervalidator.decorator"; +import { + OrderDefaultValidator, + _PROHIBITED_FIELD_PATTERN, +} from 'src/common/decorators/validators.decorator'; export class UserTakenCoursesQueryDto { @IsOptional() diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index d08efbae..55db1422 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -1,20 +1,20 @@ -import { Prisma } from '@prisma/client'; +import { Prisma } from "@prisma/client"; export type userSelectResultType = Prisma.session_userprofileGetPayload<{ - include: Prisma.session_userprofileInclude; -}>; + include: Prisma.session_userprofileInclude +}> export type courseSelectResultType = Prisma.subject_courseGetPayload<{ - include: Prisma.subject_courseInclude; -}>; + include: Prisma.subject_courseInclude +}> export const courseDetails = Prisma.validator()({ include: { subject_department: true, subject_course_professors: { include: { professor: true } }, lecture: true, - subject_courseuser: true, - }, + subject_courseuser: true + } }); export const lectureDetails = Prisma.validator()({ @@ -22,38 +22,38 @@ export const lectureDetails = Prisma.validator()({ subject_department: true, subject_lecture_professors: { include: { professor: true } }, subject_classtime: true, - subject_examtime: true, - }, + subject_examtime: true + } }); -export const timeTableDetails = - Prisma.validator()({ - include: { - timetable_timetable_lectures: { - include: { - subject_lecture: lectureDetails, - }, - }, - }, - }); +export const timeTableDetails = Prisma.validator()({ + include:{ + timetable_timetable_lectures: { + include:{ + subject_lecture: lectureDetails, + } + } + } +}) export type NESTED = true; + const reviewDetails = Prisma.validator()({ include: { course: courseDetails, lecture: lectureDetails, review_reviewvote: true, - }, + } }); -<<<<<<< HEAD const lectureReviews = Prisma.validator()({ include: { review: { include: { course: courseDetails, lecture: lectureDetails, + review_reviewvote: true, }, }, }, @@ -66,21 +66,4 @@ export type LectureBasic = Prisma.subject_lectureGetPayload export type CourseDetails = Prisma.subject_courseGetPayload export type TimeTableDetails = Prisma.timetable_timetableGetPayload export type TimeTableBasic = Prisma.timetable_timetableGetPayload -export type SemesterBasic = Prisma.subject_semesterGetPayload -======= -export type ReviewDetails = Prisma.review_reviewGetPayload< - typeof reviewDetails ->; -export type LectureDetails = Prisma.subject_lectureGetPayload< - typeof lectureDetails ->; -export type LectureBasic = Prisma.subject_lectureGetPayload; -export type CourseDetails = Prisma.subject_courseGetPayload< - typeof courseDetails ->; -export type TimeTableDetails = Prisma.timetable_timetableGetPayload< - typeof timeTableDetails ->; -export type TimeTableBasic = Prisma.timetable_timetableGetPayload; -export type SemesterBasic = Prisma.subject_semesterGetPayload; ->>>>>>> release +export type SemesterBasic = Prisma.subject_semesterGetPayload \ No newline at end of file diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 2aaade34..0e755db7 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -57,6 +57,7 @@ export class LectureRepository { subject_examtime: true, }, }, + review_reviewvote: true, }, orderBy: orderFilter, skip: offset, From 18cb5b07915c9a01055d8a4dcc897e6eb4081e10 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 11 Sep 2023 21:43:48 +0900 Subject: [PATCH 104/250] Fix: not formatted files --- .vscode/settings.json | 5 + src/app.controller.ts | 2 +- src/app.module.ts | 23 +- src/app.service.ts | 12 +- src/bootstrap/bootstrap.ts | 60 +++-- src/common/decorators/get-user.decorator.ts | 2 +- src/common/decorators/validators.decorator.ts | 34 ++- src/common/interfaces/constants/lecture.ts | 12 +- src/common/interfaces/dto/auth/sso.dto.ts | 2 +- .../dto/course/course.request.dto.ts | 55 ++--- .../dto/course/course.response.dto.ts | 7 +- .../dto/course/course.review.request.dto.ts | 2 +- .../dto/department/department.response.dto.ts | 6 +- .../dto/lecture/classtime.response.dto.ts | 20 +- .../dto/lecture/examtime.response.dto.ts | 12 +- .../dto/lecture/lecture.request.dto.ts | 41 ++-- .../dto/lecture/lecture.response.dto.ts | 70 +++--- .../dto/professor/professor.response.dto.ts | 3 +- .../dto/reviews/reviews.request.dto.ts | 13 +- .../dto/semester/semester.request.dto.ts | 12 +- .../dto/semester/semester.response.dto.ts | 4 +- .../dto/timetable/timetable.request.dto.ts | 31 ++- .../dto/timetable/timetable.response.dto.ts | 3 +- .../department/department.response.dto.ts | 6 +- .../interfaces/dto/user/user.request.dto.ts | 4 +- .../interfaces/dto/user/user.response.dto.ts | 22 +- .../serializer/classtime.serializer.ts | 89 +++---- .../serializer/course.serializer.ts | 77 +++--- .../serializer/department.serializer.ts | 27 +- .../serializer/examtime.serializer.ts | 49 +++- .../serializer/lecture.serializer.ts | 97 ++++---- .../serializer/professor.serializer.ts | 23 +- .../serializer/review.serializer.ts | 8 +- .../serializer/semester.serializer.ts | 17 +- .../serializer/timetable.serializer.ts | 32 ++- src/common/scholarDB/scripts.ts | 8 +- src/common/utils/lecture.utils.ts | 15 +- src/common/utils/method.utils.ts | 39 ++- src/common/utils/search.utils.ts | 1 - src/common/utils/time.utils.ts | 4 +- src/dotenv-options.ts | 2 +- src/main.ts | 3 - src/modules/auth/auth.controller.ts | 51 ++-- src/modules/auth/auth.module.ts | 26 +- src/modules/auth/auth.service.ts | 8 +- src/modules/auth/guard/jwt-cookie.guard.ts | 18 +- src/modules/auth/guard/mock-auth-guard.ts | 84 ++++--- .../auth/strategy/jwt-cookie.strategy.ts | 12 +- src/modules/auth/utils/sparcs-sso.ts | 23 +- src/modules/courses/courses.controller.ts | 6 +- src/modules/courses/courses.module.ts | 2 +- src/modules/courses/courses.service.ts | 15 +- src/modules/lectures/lectures.controller.ts | 2 +- src/modules/lectures/lectures.module.ts | 4 +- src/modules/lectures/lectures.service.ts | 14 +- src/modules/notices/notices.module.ts | 2 +- src/modules/planners/planners.module.ts | 2 +- src/modules/rates/rates.module.ts | 2 +- src/modules/reviews/reviews.controller.ts | 29 ++- src/modules/reviews/reviews.module.ts | 4 +- src/modules/reviews/reviews.service.ts | 19 +- src/modules/semesters/semesters.controller.ts | 20 +- src/modules/semesters/semesters.module.ts | 4 +- src/modules/semesters/semesters.service.ts | 13 +- src/modules/share/share.module.ts | 2 +- src/modules/status/status.module.ts | 2 +- src/modules/template/template.module.ts | 2 +- .../timetables/timetables.controller.ts | 81 +++--- src/modules/timetables/timetables.module.ts | 6 +- src/modules/timetables/timetables.service.ts | 158 ++++++++---- src/modules/user/user.controller.ts | 17 +- src/modules/user/user.module.ts | 2 +- src/modules/user/user.service.ts | 109 +++++---- src/modules/wishlist/wishlist.module.ts | 2 +- .../mergeAuthUserAndSessionUser.ts | 4 +- .../addRefreshToken.ts | 78 +++--- .../noSpaceColumns.ts | 67 ++--- .../noSpaceColumns.ts | 67 ++--- src/prisma/prisma.module.ts | 26 +- src/prisma/prisma.service.ts | 6 +- src/prisma/repositories/course.repository.ts | 7 +- .../repositories/department.repository.ts | 92 ++++--- src/prisma/repositories/lecture.repository.ts | 230 ++++++++++-------- src/prisma/repositories/review.repository.ts | 2 +- .../repositories/semester.repository.ts | 37 +-- .../repositories/timetable.repository.ts | 131 +++++----- src/prisma/repositories/user.repository.ts | 35 +-- src/settings.ts | 29 +-- test/app.e2e-spec.ts | 4 +- test/session/session.spec.ts | 51 ++-- test/typeTest.ts | 15 +- 91 files changed, 1413 insertions(+), 1163 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9cb3a1aa --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "editor.codeActionsOnSave": { + "source.organizeImports": true + } +} \ No newline at end of file diff --git a/src/app.controller.ts b/src/app.controller.ts index c585364b..10fe8a54 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -1,6 +1,6 @@ import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; -import { Public } from "./common/decorators/skip-auth.decorator"; +import { Public } from './common/decorators/skip-auth.decorator'; @Controller() export class AppController { diff --git a/src/app.module.ts b/src/app.module.ts index 4689b9e2..661cf026 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,21 +1,30 @@ import { Module } from '@nestjs/common'; +import { APP_GUARD } from '@nestjs/core'; +import { JwtService } from '@nestjs/jwt'; import { AppController } from './app.controller'; import { AppService } from './app.service'; -import { PrismaModule } from './prisma/prisma.module'; -import { APP_GUARD } from '@nestjs/core'; -import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; import { AuthModule } from './modules/auth/auth.module'; +import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; -import { JwtService } from '@nestjs/jwt'; import { CoursesModule } from './modules/courses/courses.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; -import { SemestersModule } from "./modules/semesters/semesters.module"; -import { TimetablesModule } from "./modules/timetables/timetables.module"; +import { SemestersModule } from './modules/semesters/semesters.module'; +import { TimetablesModule } from './modules/timetables/timetables.module'; import { UserModule } from './modules/user/user.module'; +import { PrismaModule } from './prisma/prisma.module'; @Module({ - imports: [PrismaModule, AuthModule, CoursesModule, LecturesModule,ReviewsModule,UserModule, SemestersModule,TimetablesModule], + imports: [ + PrismaModule, + AuthModule, + CoursesModule, + LecturesModule, + ReviewsModule, + UserModule, + SemestersModule, + TimetablesModule, + ], controllers: [AppController], providers: [ { diff --git a/src/app.service.ts b/src/app.service.ts index 33c039d7..402bbe47 100644 --- a/src/app.service.ts +++ b/src/app.service.ts @@ -1,17 +1,11 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from "./prisma/prisma.service"; +import { PrismaService } from './prisma/prisma.service'; @Injectable() export class AppService { + constructor(private readonly prismaService: PrismaService) {} - constructor( - private readonly prismaService: PrismaService - ) {} - - public async prismaTest() { - - } - + public async prismaTest() {} getHello(): string { return 'Hello World!'; diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index 02756363..fa8730fb 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -1,35 +1,31 @@ -import { ValidationPipe, VersioningType } from "@nestjs/common"; -import { HttpAdapterHost, NestFactory, Reflector } from "@nestjs/core"; -import { ExpressAdapter } from "@nestjs/platform-express"; -import express from "express"; -import { Server } from "http"; -import { AppModule } from "../app.module"; +import { ValidationPipe, VersioningType } from '@nestjs/common'; +import { NestFactory } from '@nestjs/core'; +import cookieParser from 'cookie-parser'; +import session from 'express-session'; +import { Server } from 'http'; +import { AppModule } from '../app.module'; +import { PrismaService } from '../prisma/prisma.service'; +import settings from '../settings'; // import { AuthGuard, MockAuthGuard } from '../../common/guards/auth.guard' -import morgan = require("morgan"); -import { PrismaService } from "../prisma/prisma.service"; -import cookieParser from "cookie-parser"; -import session from "express-session"; -import { MockAuthGuard } from "../modules/auth/guard/mock-auth-guard"; -import { JwtCookieGuard } from "../modules/auth/guard/jwt-cookie.guard"; -import settings from "../settings"; +import morgan = require('morgan'); let cachedServer: Server; async function bootstrap() { - const {NODE_ENV} = process.env; + const { NODE_ENV } = process.env; const app = await NestFactory.create(AppModule); app.enableVersioning({ - type: VersioningType.URI + type: VersioningType.URI, }); app.enableCors(settings().getCorsConfig()); app.useGlobalPipes( new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, - transform: true - }) + transform: true, + }), ); app.use( @@ -37,38 +33,38 @@ async function bootstrap() { secret: 'p@ssw0rd', resave: false, saveUninitialized: false, - }) - ) + }), + ); app.use(cookieParser()); // Logs requests app.use( - morgan(":method :url OS/:req[client-os] Ver/:req[client-api-version]", { + morgan(':method :url OS/:req[client-os] Ver/:req[client-api-version]', { // https://github.com/expressjs/morgan#immediate immediate: true, stream: { - write: message => { + write: (message) => { console.info(message.trim()); - } - } - }) + }, + }, + }), ); // Logs responses app.use( - morgan(":method :url :status :res[content-length] :response-time ms", { + morgan(':method :url :status :res[content-length] :response-time ms', { stream: { - write: message => { + write: (message) => { console.info(message.trim()); - } - } - }) + }, + }, + }), ); const prismaService = app.get(PrismaService); - await prismaService.enableShutdownHooks(app) + await prismaService.enableShutdownHooks(app); return app.listen(8000); } bootstrap() - .then(() => console.log("Nest Ready")) - .catch(error => console.log(error)); + .then(() => console.log('Nest Ready')) + .catch((error) => console.log(error)); diff --git a/src/common/decorators/get-user.decorator.ts b/src/common/decorators/get-user.decorator.ts index eb1b6585..bb9d0f88 100644 --- a/src/common/decorators/get-user.decorator.ts +++ b/src/common/decorators/get-user.decorator.ts @@ -1,5 +1,5 @@ import { createParamDecorator, ExecutionContext } from '@nestjs/common'; -import { session_userprofile } from "@prisma/client"; +import { session_userprofile } from '@prisma/client'; export const GetUser = createParamDecorator( (data, ctx: ExecutionContext): session_userprofile => { diff --git a/src/common/decorators/validators.decorator.ts b/src/common/decorators/validators.decorator.ts index b713de2f..d4c6a4df 100644 --- a/src/common/decorators/validators.decorator.ts +++ b/src/common/decorators/validators.decorator.ts @@ -2,8 +2,8 @@ import { registerDecorator, ValidationArguments, ValidatorConstraint, - ValidatorConstraintInterface -} from "class-validator"; + ValidatorConstraintInterface, +} from 'class-validator'; export const _PROHIBITED_FIELD_PATTERN: RegExp[] = [ /user/, @@ -16,12 +16,12 @@ export const _PROHIBITED_FIELD_PATTERN: RegExp[] = [ export function RegexValidator( regexExps: RegExp[], - validationOptions?: { message?: string } + validationOptions?: { message?: string }, ) { // eslint-disable-next-line @typescript-eslint/ban-types - return function(object: Object, propertyName: string) { + return function (object: Object, propertyName: string) { registerDecorator({ - name: "regexValidator", + name: 'regexValidator', target: object.constructor, propertyName: propertyName, options: validationOptions, @@ -34,21 +34,21 @@ export function RegexValidator( }, defaultMessage(validationArguments?: ValidationArguments): string { - return "Only alphanumeric characters are allowed"; - } - } + return 'Only alphanumeric characters are allowed'; + }, + }, }); }; } export function InverseRegexValidator( regexExps: RegExp[], - validationOptions?: { message?: string } + validationOptions?: { message?: string }, ) { // eslint-disable-next-line @typescript-eslint/ban-types - return function(object: Object, propertyName: string) { + return function (object: Object, propertyName: string) { registerDecorator({ - name: "regexValidator", + name: 'regexValidator', target: object.constructor, propertyName: propertyName, constraints: regexExps, @@ -61,20 +61,18 @@ export function InverseRegexValidator( }, defaultMessage(validationArguments?: ValidationArguments): string { - return "Only alphanumeric characters are allowed"; - } - } + return 'Only alphanumeric characters are allowed'; + }, + }, }); }; } - - export function OrderDefaultValidator( regexExps: RegExp[], validationOptions?: { message?: string }, ) { - return function (object:object, propertyName: string) { + return function (object: object, propertyName: string) { registerDecorator({ name: 'OrderDefaultValidator', target: object.constructor, @@ -104,4 +102,4 @@ export class StringStripLength implements ValidatorConstraintInterface { defaultMessage(args: ValidationArguments): string { return "Body 'content' did not pass validator: content must not be empty"; } -} \ No newline at end of file +} diff --git a/src/common/interfaces/constants/lecture.ts b/src/common/interfaces/constants/lecture.ts index d75c12c8..2193eded 100644 --- a/src/common/interfaces/constants/lecture.ts +++ b/src/common/interfaces/constants/lecture.ts @@ -1,8 +1,8 @@ -import { Union } from "../../utils/method.utils"; +import { Union } from '../../utils/method.utils'; export const ResearchLecture = { - IndividualStudy: "Individual Study", - UnderThesisStudy: "Thesis Study(Undergraduate)", - ThesisResearch: "Thesis Research(MA/phD)" -} -export type ResearchLecture = Union \ No newline at end of file + IndividualStudy: 'Individual Study', + UnderThesisStudy: 'Thesis Study(Undergraduate)', + ThesisResearch: 'Thesis Research(MA/phD)', +}; +export type ResearchLecture = Union; diff --git a/src/common/interfaces/dto/auth/sso.dto.ts b/src/common/interfaces/dto/auth/sso.dto.ts index f1631c99..bfe9a943 100644 --- a/src/common/interfaces/dto/auth/sso.dto.ts +++ b/src/common/interfaces/dto/auth/sso.dto.ts @@ -33,4 +33,4 @@ export class KaistInfo { givenname: string; ku_sex: string; ku_kname: string; -} \ No newline at end of file +} diff --git a/src/common/interfaces/dto/course/course.request.dto.ts b/src/common/interfaces/dto/course/course.request.dto.ts index 1bf04abf..2d9a8830 100644 --- a/src/common/interfaces/dto/course/course.request.dto.ts +++ b/src/common/interfaces/dto/course/course.request.dto.ts @@ -1,56 +1,55 @@ -import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; -import { Transform } from "class-transformer"; - -export class CourseQueryDto{ +import { Transform } from 'class-transformer'; +import { IsArray, IsNumber, IsOptional, IsString } from 'class-validator'; +export class CourseQueryDto { @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @IsString({each: true}) - department?: string[] + @IsString({ each: true }) + department?: string[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @IsString({each: true}) - type?: string[] + @IsString({ each: true }) + type?: string[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() //@todo: @Transform() - @IsString({each: true}) - level?: string[] + @IsString({ each: true }) + level?: string[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @IsString({each: true}) - group?: string[] + @IsString({ each: true }) + group?: string[]; @IsOptional() @IsString() - keyword?: string + keyword?: string; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @IsString({each: true}) - term?: string[] + @IsString({ each: true }) + term?: string[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @IsString({each: true}) - order?: string[] + @IsString({ each: true }) + order?: string[]; @IsOptional() @IsNumber() - @Transform(({value}) => parseInt(value)) - offset?: number + @Transform(({ value }) => parseInt(value)) + offset?: number; @IsOptional() @IsNumber() - @Transform(({value}) => parseInt(value)) - limit?: number -} \ No newline at end of file + @Transform(({ value }) => parseInt(value)) + limit?: number; +} diff --git a/src/common/interfaces/dto/course/course.response.dto.ts b/src/common/interfaces/dto/course/course.response.dto.ts index 9530be1b..1897cd08 100644 --- a/src/common/interfaces/dto/course/course.response.dto.ts +++ b/src/common/interfaces/dto/course/course.response.dto.ts @@ -1,6 +1,5 @@ -import { toJsonDepartment } from "../../serializer/department.serializer"; -import { DepartmentResponseDto } from "../department/department.response.dto"; -import { ProfessorResponseDto } from "../professor/professor.response.dto"; +import { DepartmentResponseDto } from '../department/department.response.dto'; +import { ProfessorResponseDto } from '../professor/professor.response.dto'; export interface CourseResponseDto { id: number; @@ -25,4 +24,4 @@ export interface CourseResponseDtoNested extends CourseResponseDto { grade?: number; load?: number; speech?: number; -} \ No newline at end of file +} diff --git a/src/common/interfaces/dto/course/course.review.request.dto.ts b/src/common/interfaces/dto/course/course.review.request.dto.ts index 13007089..a01ccf32 100644 --- a/src/common/interfaces/dto/course/course.review.request.dto.ts +++ b/src/common/interfaces/dto/course/course.review.request.dto.ts @@ -1,5 +1,5 @@ -import { IsArray, IsNumber, IsOptional, IsString } from 'class-validator'; import { Transform } from 'class-transformer'; +import { IsArray, IsNumber, IsOptional, IsString } from 'class-validator'; export class CourseReviewQueryDto { @IsOptional() diff --git a/src/common/interfaces/dto/department/department.response.dto.ts b/src/common/interfaces/dto/department/department.response.dto.ts index 2a8ec109..209a6201 100644 --- a/src/common/interfaces/dto/department/department.response.dto.ts +++ b/src/common/interfaces/dto/department/department.response.dto.ts @@ -1,6 +1,6 @@ -export interface DepartmentResponseDto{ +export interface DepartmentResponseDto { id: number; name: string; name_en: string; - code: string -} \ No newline at end of file + code: string; +} diff --git a/src/common/interfaces/dto/lecture/classtime.response.dto.ts b/src/common/interfaces/dto/lecture/classtime.response.dto.ts index 020ea679..23b13e02 100644 --- a/src/common/interfaces/dto/lecture/classtime.response.dto.ts +++ b/src/common/interfaces/dto/lecture/classtime.response.dto.ts @@ -1,11 +1,11 @@ export interface ClasstimeDto { - "building_code": string; - "room_name": string; - "classroom": string; - "classroom_en": string; - "classroom_short": string; - "classroom_short_en": string; - "day": number; - "begin": number; - "end": number; -} \ No newline at end of file + building_code: string; + room_name: string; + classroom: string; + classroom_en: string; + classroom_short: string; + classroom_short_en: string; + day: number; + begin: number; + end: number; +} diff --git a/src/common/interfaces/dto/lecture/examtime.response.dto.ts b/src/common/interfaces/dto/lecture/examtime.response.dto.ts index 125bc379..ed861077 100644 --- a/src/common/interfaces/dto/lecture/examtime.response.dto.ts +++ b/src/common/interfaces/dto/lecture/examtime.response.dto.ts @@ -1,7 +1,7 @@ export interface ExamtimeDto { - "day": number; - "str": string; - "str_en": string; - "begin": number; - "end": number; -} \ No newline at end of file + day: number; + str: string; + str_en: string; + begin: number; + end: number; +} diff --git a/src/common/interfaces/dto/lecture/lecture.request.dto.ts b/src/common/interfaces/dto/lecture/lecture.request.dto.ts index e2fe6c4c..22c9ec15 100644 --- a/src/common/interfaces/dto/lecture/lecture.request.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.request.dto.ts @@ -1,41 +1,40 @@ -import { IsArray, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; -import { Transform } from "class-transformer"; -import { CourseQueryDto } from "../course/course.request.dto"; - -export class LectureQueryDto extends CourseQueryDto{ +import { Transform } from 'class-transformer'; +import { IsArray, IsNumber, IsOptional } from 'class-validator'; +import { CourseQueryDto } from '../course/course.request.dto'; +export class LectureQueryDto extends CourseQueryDto { @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) - @Transform(({value}) => value.map((v)=> parseInt(v))) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @Transform(({ value }) => value.map((v) => parseInt(v))) @IsArray() - @IsNumber({},{each: true}) + @IsNumber({}, { each: true }) year?: number[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) - @Transform(({value}) => value.map((v)=> parseInt(v))) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @Transform(({ value }) => value.map((v) => parseInt(v))) @IsArray() - @IsNumber({},{each: true}) + @IsNumber({}, { each: true }) semester?: number[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) - @Transform(({value}) => value.map((v)=> parseInt(v))) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @Transform(({ value }) => value.map((v) => parseInt(v))) @IsArray() - @IsNumber({},{each: true}) + @IsNumber({}, { each: true }) day?: number[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) - @Transform(({value}) => value.map((v)=> parseInt(v))) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @Transform(({ value }) => value.map((v) => parseInt(v))) @IsArray() - @IsNumber({},{each: true}) + @IsNumber({}, { each: true }) begin?: number[]; @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) - @Transform(({value}) => value.map((v)=> parseInt(v))) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @Transform(({ value }) => value.map((v) => parseInt(v))) @IsArray() - @IsNumber({},{each: true}) + @IsNumber({}, { each: true }) end?: number[]; -} \ No newline at end of file +} diff --git a/src/common/interfaces/dto/lecture/lecture.response.dto.ts b/src/common/interfaces/dto/lecture/lecture.response.dto.ts index 6645195d..e9f3d909 100644 --- a/src/common/interfaces/dto/lecture/lecture.response.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.response.dto.ts @@ -1,40 +1,40 @@ -import { ClasstimeDto } from "./classtime.response.dto"; -import { ExamtimeDto } from "./examtime.response.dto"; +import { ClasstimeDto } from './classtime.response.dto'; +import { ExamtimeDto } from './examtime.response.dto'; export interface NestedLectureResponseDto { - "id": number; - "title": string; - "title_en": string; - "course": number; - "old_code": string; - "class_no": string; - "year": number; - "semester": number; - "code": string; - "department": number; - "department_code": string; - "department_name": string; - "department_name_en": string; - "type": string; - "type_en": string; - "limit": number; - "num_people": number; - "is_english": boolean; - "num_classes": number; - "num_labs": number; - "credit": number; - "credit_au": number; - "common_title": string; - "common_title_en": string; - "class_title": string; - "class_title_en": string; - "review_total_weight": number; + id: number; + title: string; + title_en: string; + course: number; + old_code: string; + class_no: string; + year: number; + semester: number; + code: string; + department: number; + department_code: string; + department_name: string; + department_name_en: string; + type: string; + type_en: string; + limit: number; + num_people: number; + is_english: boolean; + num_classes: number; + num_labs: number; + credit: number; + credit_au: number; + common_title: string; + common_title_en: string; + class_title: string; + class_title_en: string; + review_total_weight: number; } export interface LectureResponseDto extends NestedLectureResponseDto { - "grade"?: number; - "load"?: number; - "speech"?: number; - "classtimes"?: ClasstimeDto; - "examtimes"?: ExamtimeDto; -} \ No newline at end of file + grade?: number; + load?: number; + speech?: number; + classtimes?: ClasstimeDto; + examtimes?: ExamtimeDto; +} diff --git a/src/common/interfaces/dto/professor/professor.response.dto.ts b/src/common/interfaces/dto/professor/professor.response.dto.ts index 4057561d..95aa4297 100644 --- a/src/common/interfaces/dto/professor/professor.response.dto.ts +++ b/src/common/interfaces/dto/professor/professor.response.dto.ts @@ -1,7 +1,6 @@ - export interface ProfessorResponseDto { name: string; name_en: string; professor_id: number; review_total_weight: number; -} \ No newline at end of file +} diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index c351ef72..c3896389 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -1,4 +1,5 @@ -import { Transform, Type } from 'class-transformer'; +import { ApiProperty, OmitType, PartialType } from '@nestjs/swagger'; +import { Type } from 'class-transformer'; import { IsArray, IsNotEmpty, @@ -9,13 +10,11 @@ import { Min, Validate, } from 'class-validator'; -import { CourseResponseDto } from '../course/course.response.dto'; -import { ApiProperty, OmitType, PartialType } from "@nestjs/swagger"; import { - _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator, - StringStripLength -} from "../../../decorators/validators.decorator"; + StringStripLength, + _PROHIBITED_FIELD_PATTERN, +} from '../../../decorators/validators.decorator'; export class ReviewQueryDto { @IsOptional() @IsNumber() @@ -87,4 +86,4 @@ export class ReviewCreateDto { export class ReviewUpdateDto extends PartialType( OmitType(ReviewCreateDto, ['lecture']), -) {} \ No newline at end of file +) {} diff --git a/src/common/interfaces/dto/semester/semester.request.dto.ts b/src/common/interfaces/dto/semester/semester.request.dto.ts index 8c93c50d..899573a3 100644 --- a/src/common/interfaces/dto/semester/semester.request.dto.ts +++ b/src/common/interfaces/dto/semester/semester.request.dto.ts @@ -1,10 +1,12 @@ -import { IsArray, IsOptional, Validate } from "class-validator"; -import { _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator } from "../../../decorators/validators.decorator"; +import { IsArray, IsOptional } from 'class-validator'; +import { + OrderDefaultValidator, + _PROHIBITED_FIELD_PATTERN, +} from '../../../decorators/validators.decorator'; - -export class SemesterQueryDto{ +export class SemesterQueryDto { @IsOptional() @IsArray() @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) order?: string[]; -} \ No newline at end of file +} diff --git a/src/common/interfaces/dto/semester/semester.response.dto.ts b/src/common/interfaces/dto/semester/semester.response.dto.ts index 772f3bfd..01ecc65c 100644 --- a/src/common/interfaces/dto/semester/semester.response.dto.ts +++ b/src/common/interfaces/dto/semester/semester.response.dto.ts @@ -1,3 +1,3 @@ -import { SemesterBasic } from "../../../schemaTypes/types"; +import { SemesterBasic } from '../../../schemaTypes/types'; -export type SemesterResponseDto = Omit \ No newline at end of file +export type SemesterResponseDto = Omit; diff --git a/src/common/interfaces/dto/timetable/timetable.request.dto.ts b/src/common/interfaces/dto/timetable/timetable.request.dto.ts index c60e71e2..ff5d64da 100644 --- a/src/common/interfaces/dto/timetable/timetable.request.dto.ts +++ b/src/common/interfaces/dto/timetable/timetable.request.dto.ts @@ -1,39 +1,39 @@ -import { Transform, Type } from "class-transformer"; -import { IsArray, IsNumber, IsOptional, IsString, Min, ValidateBy } from "class-validator"; +import { Transform, Type } from 'class-transformer'; +import { IsArray, IsNumber, IsOptional, IsString } from 'class-validator'; import { - _PROHIBITED_FIELD_PATTERN, OrderDefaultValidator -} from "../../../decorators/validators.decorator"; + OrderDefaultValidator, + _PROHIBITED_FIELD_PATTERN, +} from '../../../decorators/validators.decorator'; export const TIMETABLE_MAX_LIMIT = 50; export class TimetableQueryDto { - @IsOptional() @IsNumber() @Type(() => Number) - year?: number + year?: number; @IsOptional() @IsNumber() @Type(() => Number) - semester?: number + semester?: number; @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) @IsOptional() - @Transform(({value}) => typeof value === 'string' ? [value] : value) + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) @IsArray() - @IsString({each: true}) - order?: string[] + @IsString({ each: true }) + order?: string[]; @IsOptional() @Transform(({ value }) => value ?? 0) @IsNumber() - offset?: number + offset?: number; @IsOptional() @Transform(({ value }) => value ?? TIMETABLE_MAX_LIMIT) @IsNumber() - limit?: number + limit?: number; } export class TimetableCreateDto { @@ -44,12 +44,11 @@ export class TimetableCreateDto { semester: number; @IsArray() - @IsNumber({},{each: true}) - lectures: number[] + @IsNumber({}, { each: true }) + lectures: number[]; } -export class AddLectureDto{ - +export class AddLectureDto { @IsNumber() @Type(() => Number) lecture: number; diff --git a/src/common/interfaces/dto/timetable/timetable.response.dto.ts b/src/common/interfaces/dto/timetable/timetable.response.dto.ts index 8acefde2..77e46682 100644 --- a/src/common/interfaces/dto/timetable/timetable.response.dto.ts +++ b/src/common/interfaces/dto/timetable/timetable.response.dto.ts @@ -1,5 +1,4 @@ -import { CourseResponseDto } from "../course/course.response.dto"; -import { LectureResponseDto } from "../lecture/lecture.response.dto"; +import { LectureResponseDto } from '../lecture/lecture.response.dto'; export class TimetableResponseDto { id: number; diff --git a/src/common/interfaces/dto/user/department/department.response.dto.ts b/src/common/interfaces/dto/user/department/department.response.dto.ts index 2a8ec109..209a6201 100644 --- a/src/common/interfaces/dto/user/department/department.response.dto.ts +++ b/src/common/interfaces/dto/user/department/department.response.dto.ts @@ -1,6 +1,6 @@ -export interface DepartmentResponseDto{ +export interface DepartmentResponseDto { id: number; name: string; name_en: string; - code: string -} \ No newline at end of file + code: string; +} diff --git a/src/common/interfaces/dto/user/user.request.dto.ts b/src/common/interfaces/dto/user/user.request.dto.ts index 71bd3c79..1ba0d16a 100644 --- a/src/common/interfaces/dto/user/user.request.dto.ts +++ b/src/common/interfaces/dto/user/user.request.dto.ts @@ -1,5 +1,5 @@ -import { IsArray, IsOptional, Validate } from "class-validator"; -import { OrderDefaultValidator } from "../../../decorators/validators.decorator"; +import { IsArray, IsOptional, Validate } from 'class-validator'; +import { OrderDefaultValidator } from '../../../decorators/validators.decorator'; export class UserTakenCoursesQueryDto { @IsOptional() diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index 96462d90..60191454 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -1,8 +1,6 @@ -import { - review_review, session_userprofile_favorite_departments, - session_userprofile_taken_lectures, subject_department, subject_lecture } from "@prisma/client"; -import { DepartmentResponseDto } from "../department/department.response.dto"; -import { ReviewResponseDto } from "../reviews/review.response.dto"; +import { session_userprofile_taken_lectures } from '@prisma/client'; +import { DepartmentResponseDto } from '../department/department.response.dto'; +import { ReviewResponseDto } from '../reviews/review.response.dto'; export interface ProfileDto { id: number; @@ -10,11 +8,11 @@ export interface ProfileDto { student_id: string; firstName: string; lastName: string; - department: DepartmentResponseDto - majors: DepartmentResponseDto[] - departments: DepartmentResponseDto[] - favorite_departments: DepartmentResponseDto[] - review_writable_lectures: session_userprofile_taken_lectures[] - my_timetable_lectures: session_userprofile_taken_lectures[] - reviews: ReviewResponseDto[] + department: DepartmentResponseDto; + majors: DepartmentResponseDto[]; + departments: DepartmentResponseDto[]; + favorite_departments: DepartmentResponseDto[]; + review_writable_lectures: session_userprofile_taken_lectures[]; + my_timetable_lectures: session_userprofile_taken_lectures[]; + reviews: ReviewResponseDto[]; } diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts index 16e5ec33..647753d5 100644 --- a/src/common/interfaces/serializer/classtime.serializer.ts +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -1,14 +1,14 @@ -import { getTimeNumeric } from "src/common/utils/time.utils"; -import { subject_classtime } from "@prisma/client"; +import { subject_classtime } from '@prisma/client'; +import { getTimeNumeric } from 'src/common/utils/time.utils'; export const toJsonClasstime = (classtime: subject_classtime) => { const classroomInfo = getClassroomStrs(classtime); return Object.assign(classroomInfo, { - "day": classtime.day, - "begin": getTimeNumeric(classtime.begin), - "end": getTimeNumeric(classtime.end), - }) -} + day: classtime.day, + begin: getTimeNumeric(classtime.begin), + end: getTimeNumeric(classtime.end), + }); +}; const getClassroomStrs = (classtime: subject_classtime) => { const buildingFullName = classtime.building_full_name; @@ -16,47 +16,48 @@ const getClassroomStrs = (classtime: subject_classtime) => { if (!buildingFullName) { return { - "building_code": "", - "room_name": "", - "classroom": "정보 없음", - "classroom_en": "Unknown", - "classroom_short": "정보 없음", - "classroom_short_en": "Unknown", - } - } else if (buildingFullName[0] == "(") { - const rightParanthesisIndex = buildingFullName.indexOf(")"); + building_code: '', + room_name: '', + classroom: '정보 없음', + classroom_en: 'Unknown', + classroom_short: '정보 없음', + classroom_short_en: 'Unknown', + }; + } else if (buildingFullName[0] == '(') { + const rightParanthesisIndex = buildingFullName.indexOf(')'); const buildingCode = buildingFullName.slice(1, rightParanthesisIndex); - const buildingName = buildingFullName.slice(rightParanthesisIndex+1); - const buildingNameEn = buildingFullNameEn.slice(rightParanthesisIndex+1); - const roomName = classtime.room_name ?? ""; - const classroom = "(" + buildingCode + ") " + buildingName + " " + roomName; - const classroomEn = "(" + buildingCode + ") " + buildingNameEn + " " + roomName; - const classroomShort = "(" + buildingCode + ") " + roomName; - const classroomShortEn = "(" + buildingCode + ") " + roomName; + const buildingName = buildingFullName.slice(rightParanthesisIndex + 1); + const buildingNameEn = buildingFullNameEn.slice(rightParanthesisIndex + 1); + const roomName = classtime.room_name ?? ''; + const classroom = '(' + buildingCode + ') ' + buildingName + ' ' + roomName; + const classroomEn = + '(' + buildingCode + ') ' + buildingNameEn + ' ' + roomName; + const classroomShort = '(' + buildingCode + ') ' + roomName; + const classroomShortEn = '(' + buildingCode + ') ' + roomName; return { - "building_code": buildingCode, - "room_name": roomName, - "classroom": classroom, - "classroom_en": classroomEn, - "classroom_short": classroomShort, - "classroom_short_en": classroomShortEn, - } + building_code: buildingCode, + room_name: roomName, + classroom: classroom, + classroom_en: classroomEn, + classroom_short: classroomShort, + classroom_short_en: classroomShortEn, + }; } else { - const buildingCode = ""; - const roomName = classtime.room_name ?? ""; - const classroom = buildingFullName + " " + roomName; - const classroomEn = buildingFullNameEn + " " + roomName; - const classroomShort = buildingFullName + " " + roomName; - const classroomShortEn = buildingFullNameEn + " " + roomName; + const buildingCode = ''; + const roomName = classtime.room_name ?? ''; + const classroom = buildingFullName + ' ' + roomName; + const classroomEn = buildingFullNameEn + ' ' + roomName; + const classroomShort = buildingFullName + ' ' + roomName; + const classroomShortEn = buildingFullNameEn + ' ' + roomName; return { - "building_code": buildingCode, - "room_name": roomName, - "classroom": classroom, - "classroom_en": classroomEn, - "classroom_short": classroomShort, - "classroom_short_en": classroomShortEn, - } + building_code: buildingCode, + room_name: roomName, + classroom: classroom, + classroom_en: classroomEn, + classroom_short: classroomShort, + classroom_short_en: classroomShortEn, + }; } -} \ No newline at end of file +}; diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts index a980ca99..a7e76f3a 100644 --- a/src/common/interfaces/serializer/course.serializer.ts +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -1,46 +1,53 @@ -import { subject_course, subject_lecture} from "@prisma/client"; -import { toJsonDepartment } from "./department.serializer"; -import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; -import { toJsonProfessor } from "./professor.serializer"; -import { applyOrder } from "../../utils/search.utils"; -import { subject_professor } from "@prisma/client"; -import { CourseResponseDtoNested } from "../dto/course/course.response.dto"; -import { CourseDetails, NESTED } from "../../schemaTypes/types"; -import { OmitType } from "@nestjs/swagger"; - - - -export function toJsonCourse(course: T extends NESTED ? Omit : CourseDetails, lecture: subject_lecture, professor: subject_professor[], nested : T extends NESTED ? true : false): CourseResponseDtoNested { +import { subject_lecture, subject_professor } from '@prisma/client'; +import { CourseDetails, NESTED } from '../../schemaTypes/types'; +import { applyOrder } from '../../utils/search.utils'; +import { CourseResponseDtoNested } from '../dto/course/course.response.dto'; +import { ProfessorResponseDto } from '../dto/professor/professor.response.dto'; +import { toJsonDepartment } from './department.serializer'; +import { toJsonProfessor } from './professor.serializer'; +export function toJsonCourse( + course: T extends NESTED + ? Omit + : CourseDetails, + lecture: subject_lecture, + professor: subject_professor[], + nested: T extends NESTED ? true : false, +): CourseResponseDtoNested { let result = { - "id": course.id, - "old_code": course.old_code, - "department": toJsonDepartment(course.subject_department, true), - "type": course.type, - "type_en": course.type_en, - "title": course.title, - "title_en": course.title_en, - "summary": course.summury, // Todo: fix summury typo in db. - "review_total_weight": course.review_total_weight, - "credit": lecture.credit ?? 0, - "credit_au": lecture.credit_au ?? 0, - "num_classes": lecture.num_classes ?? 0, - "num_labs": lecture.num_labs ?? 0 + id: course.id, + old_code: course.old_code, + department: toJsonDepartment(course.subject_department, true), + type: course.type, + type_en: course.type_en, + title: course.title, + title_en: course.title_en, + summary: course.summury, // Todo: fix summury typo in db. + review_total_weight: course.review_total_weight, + credit: lecture.credit ?? 0, + credit_au: lecture.credit_au ?? 0, + num_classes: lecture.num_classes ?? 0, + num_labs: lecture.num_labs ?? 0, }; if (nested) { return result; } - const professorJson: ProfessorResponseDto[] = toJsonProfessor(professor, true); - const professorSorted = applyOrder(professorJson, ["name"]); + const professorJson: ProfessorResponseDto[] = toJsonProfessor( + professor, + true, + ); + const professorSorted = applyOrder(professorJson, [ + 'name', + ]); result = Object.assign(result, { - "related_courses_prior": [], - "related_courses_posterior": [], - "professors": professorSorted, - "grade": course.grade, - "load": course.load, - "speech": course.speech + related_courses_prior: [], + related_courses_posterior: [], + professors: professorSorted, + grade: course.grade, + load: course.load, + speech: course.speech, }); return result; -} \ No newline at end of file +} diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts index 80f91694..ad27dd40 100644 --- a/src/common/interfaces/serializer/department.serializer.ts +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -1,13 +1,16 @@ -import { subject_department } from "@prisma/client"; -import { DepartmentResponseDto } from "../dto/department/department.response.dto"; +import { subject_department } from '@prisma/client'; +import { DepartmentResponseDto } from '../dto/department/department.response.dto'; -export const toJsonDepartment = (department: subject_department, nested=false): DepartmentResponseDto => { - - - return department ? { - "id": department.id, - "name": department.name, - "name_en": department.name_en, - "code": department.code, - } : null; -} \ No newline at end of file +export const toJsonDepartment = ( + department: subject_department, + nested = false, +): DepartmentResponseDto => { + return department + ? { + id: department.id, + name: department.name, + name_en: department.name_en, + code: department.code, + } + : null; +}; diff --git a/src/common/interfaces/serializer/examtime.serializer.ts b/src/common/interfaces/serializer/examtime.serializer.ts index e5c08a24..67231764 100644 --- a/src/common/interfaces/serializer/examtime.serializer.ts +++ b/src/common/interfaces/serializer/examtime.serializer.ts @@ -1,18 +1,41 @@ -import { getTimeNumeric } from "src/common/utils/time.utils"; -import { subject_examtime } from "@prisma/client"; +import { subject_examtime } from '@prisma/client'; +import { getTimeNumeric } from 'src/common/utils/time.utils'; export const toJsonExamtime = (examtime: subject_examtime) => { - const DAY_STR = ["월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"]; - const DAY_STR_EN = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; + const DAY_STR = [ + '월요일', + '화요일', + '수요일', + '목요일', + '금요일', + '토요일', + '일요일', + ]; + const DAY_STR_EN = [ + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + 'Sunday', + ]; return { - "day": examtime.day, - "str": `${DAY_STR[examtime.day]} ${timeFormatter(examtime.begin)} ~ ${timeFormatter(examtime.end)}`, - "str_en": `${DAY_STR_EN[examtime.day]} ${timeFormatter(examtime.begin)} ~ ${timeFormatter(examtime.end)}`, - "begin": getTimeNumeric(examtime.begin, false), - "end": getTimeNumeric(examtime.end, false), - } -} + day: examtime.day, + str: `${DAY_STR[examtime.day]} ${timeFormatter( + examtime.begin, + )} ~ ${timeFormatter(examtime.end)}`, + str_en: `${DAY_STR_EN[examtime.day]} ${timeFormatter( + examtime.begin, + )} ~ ${timeFormatter(examtime.end)}`, + begin: getTimeNumeric(examtime.begin, false), + end: getTimeNumeric(examtime.end, false), + }; +}; const timeFormatter = (time: Date) => { - return `${time.getUTCHours().toString().padStart(2,'0')}:${time.getUTCMinutes().toString().padStart(2, '0')}`; -} \ No newline at end of file + return `${time.getUTCHours().toString().padStart(2, '0')}:${time + .getUTCMinutes() + .toString() + .padStart(2, '0')}`; +}; diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index e85b59b7..7251d6e9 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -1,58 +1,67 @@ -import { applyOrder } from "src/common/utils/search.utils"; -import { toJsonClasstime } from "./classtime.serializer"; -import { toJsonExamtime } from "./examtime.serializer"; -import { LectureResponseDto } from "../dto/lecture/lecture.response.dto"; -import { toJsonProfessor } from "./professor.serializer"; -import { LectureDetails, NESTED } from "../../schemaTypes/types"; -import { subject_professor } from "@prisma/client"; +import { applyOrder } from 'src/common/utils/search.utils'; +import { LectureDetails, NESTED } from '../../schemaTypes/types'; +import { LectureResponseDto } from '../dto/lecture/lecture.response.dto'; +import { toJsonClasstime } from './classtime.serializer'; +import { toJsonExamtime } from './examtime.serializer'; +import { toJsonProfessor } from './professor.serializer'; - -export function toJsonLecture (lecture:T extends NESTED ? Omit : LectureDetails, nested: T extends NESTED? true : false): LectureResponseDto { +export function toJsonLecture( + lecture: T extends NESTED + ? Omit + : LectureDetails, + nested: T extends NESTED ? true : false, +): LectureResponseDto { let result = { - "id": lecture.id, - "title": lecture.title, - "title_en": lecture.title_en, - "course": lecture.course_id, - "old_code": lecture.old_code, - "class_no": lecture.class_no, - "year": lecture.year, - "semester": lecture.semester, - "code": lecture.code, - "department": lecture.department_id, - "department_code": lecture.subject_department.code, - "department_name": lecture.subject_department.name, - "department_name_en": lecture.subject_department.name_en, - "type": lecture.type, - "type_en": lecture.type_en, - "limit": lecture.limit, - "num_people": lecture.num_people, - "is_english": lecture.is_english, - "num_classes": lecture.num_classes, - "num_labs": lecture.num_labs, - "credit": lecture.credit, - "credit_au": lecture.credit_au, - "common_title": lecture.common_title, - "common_title_en": lecture.common_title_en, - "class_title": lecture.class_title, - "class_title_en": lecture.class_title_en, - "review_total_weight": lecture.review_total_weight, + id: lecture.id, + title: lecture.title, + title_en: lecture.title_en, + course: lecture.course_id, + old_code: lecture.old_code, + class_no: lecture.class_no, + year: lecture.year, + semester: lecture.semester, + code: lecture.code, + department: lecture.department_id, + department_code: lecture.subject_department.code, + department_name: lecture.subject_department.name, + department_name_en: lecture.subject_department.name_en, + type: lecture.type, + type_en: lecture.type_en, + limit: lecture.limit, + num_people: lecture.num_people, + is_english: lecture.is_english, + num_classes: lecture.num_classes, + num_labs: lecture.num_labs, + credit: lecture.credit, + credit_au: lecture.credit_au, + common_title: lecture.common_title, + common_title_en: lecture.common_title_en, + class_title: lecture.class_title, + class_title_en: lecture.class_title_en, + review_total_weight: lecture.review_total_weight, }; const professors = lecture.subject_lecture_professors.map((x) => x.professor); - const ordered_professors = applyOrder(professors, ["professor_name"]); - result = Object.assign(result, { "professors": toJsonProfessor(ordered_professors) }); + const ordered_professors = applyOrder(professors, ['professor_name']); + result = Object.assign(result, { + professors: toJsonProfessor(ordered_professors), + }); if (nested) { return result; } result = Object.assign(result, { - "grade": lecture.grade, - "load": lecture.load, - "speech": lecture.speech, - "classtimes": lecture.subject_classtime.map((classtime) => toJsonClasstime(classtime)), - "examtimes": lecture.subject_examtime.map((examtime) => toJsonExamtime(examtime)), + grade: lecture.grade, + load: lecture.load, + speech: lecture.speech, + classtimes: lecture.subject_classtime.map((classtime) => + toJsonClasstime(classtime), + ), + examtimes: lecture.subject_examtime.map((examtime) => + toJsonExamtime(examtime), + ), }); return result; -} \ No newline at end of file +} diff --git a/src/common/interfaces/serializer/professor.serializer.ts b/src/common/interfaces/serializer/professor.serializer.ts index ea593edd..0dc1f8dc 100644 --- a/src/common/interfaces/serializer/professor.serializer.ts +++ b/src/common/interfaces/serializer/professor.serializer.ts @@ -1,16 +1,17 @@ -import { ProfessorResponseDto } from "../dto/professor/professor.response.dto"; -import { subject_professor } from "@prisma/client"; +import { subject_professor } from '@prisma/client'; +import { ProfessorResponseDto } from '../dto/professor/professor.response.dto'; - - -export const toJsonProfessor = (professors: subject_professor[], nested=false): ProfessorResponseDto[] => { +export const toJsonProfessor = ( + professors: subject_professor[], + nested = false, +): ProfessorResponseDto[] => { const result = professors.map((professor) => { return { - "name": professor.professor_name, - "name_en": professor.professor_name_en, - "professor_id": professor.professor_id, - "review_total_weight": professor.review_total_weight, - } + name: professor.professor_name, + name_en: professor.professor_name_en, + professor_id: professor.professor_id, + review_total_weight: professor.review_total_weight, + }; }); if (nested) { @@ -20,4 +21,4 @@ export const toJsonProfessor = (professors: subject_professor[], nested=false): return result.map((professor) => { return professor; //todo: add necessary infos }); -} \ No newline at end of file +}; diff --git a/src/common/interfaces/serializer/review.serializer.ts b/src/common/interfaces/serializer/review.serializer.ts index e93f0778..668e1197 100644 --- a/src/common/interfaces/serializer/review.serializer.ts +++ b/src/common/interfaces/serializer/review.serializer.ts @@ -1,9 +1,9 @@ -import { toJsonCourse } from './course.serializer'; -import { ReviewResponseDto } from './../dto/reviews/review.response.dto'; +import { session_userprofile } from '@prisma/client'; import { getRepresentativeLecture } from 'src/common/utils/lecture.utils'; -import { toJsonLecture } from './lecture.serializer'; import { ReviewDetails } from '../../schemaTypes/types'; -import { session_userprofile } from '@prisma/client'; +import { ReviewResponseDto } from './../dto/reviews/review.response.dto'; +import { toJsonCourse } from './course.serializer'; +import { toJsonLecture } from './lecture.serializer'; export const toJsonReview = ( review: ReviewDetails, diff --git a/src/common/interfaces/serializer/semester.serializer.ts b/src/common/interfaces/serializer/semester.serializer.ts index faa38944..bdde02e1 100644 --- a/src/common/interfaces/serializer/semester.serializer.ts +++ b/src/common/interfaces/serializer/semester.serializer.ts @@ -1,12 +1,11 @@ -import { DepartmentResponseDto } from "../dto/department/department.response.dto"; -import { SemesterBasic } from "../../schemaTypes/types"; -import { SemesterResponseDto } from "../dto/semester/semester.response.dto"; - -export const toJsonSemester = (semester: SemesterBasic,): SemesterResponseDto => { - +import { SemesterBasic } from '../../schemaTypes/types'; +import { SemesterResponseDto } from '../dto/semester/semester.response.dto'; +export const toJsonSemester = ( + semester: SemesterBasic, +): SemesterResponseDto => { return { - year : semester.year, + year: semester.year, semester: semester.semester, beginning: semester.beginning, end: semester.end, @@ -17,5 +16,5 @@ export const toJsonSemester = (semester: SemesterBasic,): SemesterResponseDto => courseDropDeadline: semester.courseDropDeadline, courseEvaluationDeadline: semester.courseEvaluationDeadline, gradePosting: semester.gradePosting, - } -} \ No newline at end of file + }; +}; diff --git a/src/common/interfaces/serializer/timetable.serializer.ts b/src/common/interfaces/serializer/timetable.serializer.ts index d062b6ed..c54cddea 100644 --- a/src/common/interfaces/serializer/timetable.serializer.ts +++ b/src/common/interfaces/serializer/timetable.serializer.ts @@ -1,26 +1,36 @@ -import { TimetableResponseDto } from "../dto/timetable/timetable.response.dto"; -import { LectureDetails, TimeTableBasic, TimeTableDetails } from "../../schemaTypes/types"; -import { toJsonLecture } from "./lecture.serializer"; +import { + LectureDetails, + TimeTableBasic, + TimeTableDetails, +} from '../../schemaTypes/types'; +import { TimetableResponseDto } from '../dto/timetable/timetable.response.dto'; +import { toJsonLecture } from './lecture.serializer'; -export const toJsonTimetable = (timetable: TimeTableDetails | TimeTableBasic, lectures?: LectureDetails[]): TimetableResponseDto => { +export const toJsonTimetable = ( + timetable: TimeTableDetails | TimeTableBasic, + lectures?: LectureDetails[], +): TimetableResponseDto => { if ('timetable_timetable_lectures' in timetable) { const id = timetable.id; - const lectures = timetable.timetable_timetable_lectures.map((x) => x.subject_lecture) + const lectures = timetable.timetable_timetable_lectures + .map((x) => x.subject_lecture) .map((lecture) => toJsonLecture(lecture, false)); const arrange_order = timetable.arrange_order; return { id: id, lectures: lectures, - arrange_order: arrange_order + arrange_order: arrange_order, }; - }else{ + } else { const id = timetable.id; - const lectureLists = lectures.map(lecture => toJsonLecture(lecture, false)); + const lectureLists = lectures.map((lecture) => + toJsonLecture(lecture, false), + ); const arrange_order = timetable.arrange_order; return { id: id, lectures: lectureLists, - arrange_order: arrange_order - } + arrange_order: arrange_order, + }; } -}; \ No newline at end of file +}; diff --git a/src/common/scholarDB/scripts.ts b/src/common/scholarDB/scripts.ts index 5a37b5cf..40f2d050 100644 --- a/src/common/scholarDB/scripts.ts +++ b/src/common/scholarDB/scripts.ts @@ -1,9 +1,9 @@ - - -export const import_student_lectures = async (studentId: string): Promise => { +export const import_student_lectures = async ( + studentId: string, +): Promise => { /* @Todo implement this function. this function uses sort of python script. I don't know what it is -larry */ -} +}; diff --git a/src/common/utils/lecture.utils.ts b/src/common/utils/lecture.utils.ts index f01159ff..df6aae17 100644 --- a/src/common/utils/lecture.utils.ts +++ b/src/common/utils/lecture.utils.ts @@ -1,7 +1,12 @@ -import { subject_lecture } from "@prisma/client"; -import { applyOrder } from "./search.utils"; +import { subject_lecture } from '@prisma/client'; +import { applyOrder } from './search.utils'; -export const getRepresentativeLecture = (lectures: subject_lecture[]): subject_lecture => { - const orderedLectures = applyOrder(lectures, ["year", "semester"]) +export const getRepresentativeLecture = ( + lectures: subject_lecture[], +): subject_lecture => { + const orderedLectures = applyOrder(lectures, [ + 'year', + 'semester', + ]); return orderedLectures[0]; -} \ No newline at end of file +}; diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index bee0d431..23a179b5 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -5,47 +5,42 @@ export function normalizeArray( defaultObj?: { [key: string]: T | undefined }, ): { [key: string | number | symbol]: T | undefined } { const normalizeObj: { [key: string | number | symbol]: T | undefined } = - defaultObj || {} + defaultObj || {}; - arr.forEach(data => { - const key = selector(data) - if (key !== null) normalizeObj[key] = data - }) + arr.forEach((data) => { + const key = selector(data); + if (key !== null) normalizeObj[key] = data; + }); - return normalizeObj + return normalizeObj; } export function groupBy( arr: T[], selector: (item: T) => string | number | null = (item: any) => item.id, ) { - const map: Record = {} + const map: Record = {}; - arr.forEach(data => { - const key = selector(data) + arr.forEach((data) => { + const key = selector(data); if (key !== null) { if (map[key]) { - map[key]!.push(data) + map[key]!.push(data); } else { - map[key] = [data] + map[key] = [data]; } } - }) + }); - return map + return map; } -type ValueType = string | number | boolean - +type ValueType = string | number | boolean; export type Union< T extends { [key: string]: ValueType } | ReadonlyArray, - > = T extends ReadonlyArray +> = T extends ReadonlyArray ? T[number] : T extends { [key: string]: infer U } - ? U - : never - - - - + ? U + : never; diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index 29677941..a6a240b2 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,4 +1,3 @@ -import { PrismaService } from '../../prisma/prisma.service'; import { SemesterRepository } from '../../prisma/repositories/semester.repository'; export function applyOrder(query: T[], order_opt: string[]) { diff --git a/src/common/utils/time.utils.ts b/src/common/utils/time.utils.ts index 6a85a898..e266a289 100644 --- a/src/common/utils/time.utils.ts +++ b/src/common/utils/time.utils.ts @@ -1,8 +1,8 @@ export const getTimeNumeric = (time: Date, isClass = true) => { - const beginNumeric = (time.getUTCHours() * 60) + time.getUTCMinutes(); + const beginNumeric = time.getUTCHours() * 60 + time.getUTCMinutes(); if (beginNumeric % 30 && isClass) { return beginNumeric - (beginNumeric % 30); } else { return beginNumeric; } -} \ No newline at end of file +}; diff --git a/src/dotenv-options.ts b/src/dotenv-options.ts index 1ca4e6f1..e70f0a8b 100644 --- a/src/dotenv-options.ts +++ b/src/dotenv-options.ts @@ -1,7 +1,7 @@ import path from 'path'; const env = process.env.NODE_ENV || 'local'; -const envFilePath = path.join( process.cwd(), `env/.env.${env}`); +const envFilePath = path.join(process.cwd(), `env/.env.${env}`); console.log(`Loading environment from ${envFilePath}`); const dotEnvOptions = { path: envFilePath, diff --git a/src/main.ts b/src/main.ts index 356a1b6d..75696bb4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,3 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; - // async function bootstrap() { // const app = await NestFactory.create(AppModule); // await app.listen(3000); diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 13c5fd9d..284ec896 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,22 +1,22 @@ -import { Controller, Get, Query, Req, Res, Session } from "@nestjs/common"; -import { AuthService } from "./auth.service"; -import { Request, Response } from "express"; -import { Client } from "./utils/sparcs-sso"; -import settings from "../../settings"; -import { UserService } from "../user/user.service"; -import { Public } from "../../common/decorators/skip-auth.decorator"; -import { GetUser } from "../../common/decorators/get-user.decorator"; -import { session_userprofile } from "@prisma/client"; -import { SSOUser } from "../../common/interfaces/dto/auth/sso.dto"; -import { ProfileDto } from "../../common/interfaces/dto/user/user.response.dto"; +import { Controller, Get, Query, Req, Res, Session } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { Request, Response } from 'express'; +import { GetUser } from '../../common/decorators/get-user.decorator'; +import { Public } from '../../common/decorators/skip-auth.decorator'; +import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; +import { ProfileDto } from '../../common/interfaces/dto/user/user.response.dto'; +import settings from '../../settings'; +import { UserService } from '../user/user.service'; +import { AuthService } from './auth.service'; +import { Client } from './utils/sparcs-sso'; -@Controller("session") +@Controller('session') export class AuthController { private readonly ssoClient; constructor( private readonly authService: AuthService, - private readonly userService: UserService + private readonly userService: UserService, ) { const ssoConfig = settings().getSsoConfig(); const ssoClient = new Client( @@ -79,8 +79,10 @@ export class AuthController { response.redirect(next_url); } - @Get("info") - async getUserProfile(@GetUser() user: session_userprofile): Promise { + @Get('info') + async getUserProfile( + @GetUser() user: session_userprofile, + ): Promise { /* @Todo implement userSerializer, before that, we'd like to architect the dto types @@ -90,19 +92,18 @@ export class AuthController { } @Public() - @Get("/") - async home(@Req() req, - @Res() res) { - return res.redirect("/session/login"); + @Get('/') + async home(@Req() req, @Res() res) { + return res.redirect('/session/login'); } @Public() - @Get("logout") + @Get('logout') async logout( @Req() req: Request, @Res() res: Response, @Query('next') next, - @GetUser() user: session_userprofile + @GetUser() user: session_userprofile, ) { const webURL = process.env.WEB_URL; if (user) { @@ -111,15 +112,15 @@ export class AuthController { const host = req.get('host'); const originalUrl = req.originalUrl; const absoluteUrl = `${protocol}://${host}${originalUrl}`; - const logoutUrl = this.ssoClient.get_logout_url(sid,absoluteUrl); + const logoutUrl = this.ssoClient.get_logout_url(sid, absoluteUrl); - res.clearCookie('accessToken',{ path: '/' ,maxAge: 0, httpOnly: true }); - res.clearCookie('refreshToken',{ path: '/' ,maxAge: 0, httpOnly: true }); + res.clearCookie('accessToken', { path: '/', maxAge: 0, httpOnly: true }); + res.clearCookie('refreshToken', { path: '/', maxAge: 0, httpOnly: true }); console.log(logoutUrl); return res.redirect(logoutUrl); } - return res.redirect(webURL + "/"); + return res.redirect(webURL + '/'); } } diff --git a/src/modules/auth/auth.module.ts b/src/modules/auth/auth.module.ts index 27bfef0f..5234631f 100644 --- a/src/modules/auth/auth.module.ts +++ b/src/modules/auth/auth.module.ts @@ -1,13 +1,12 @@ -import { PrismaModule } from "../../prisma/prisma.module"; -import { Module } from "@nestjs/common"; -import { AuthController } from "./auth.controller"; -import { AuthService } from "./auth.service"; -import { JwtCookieStrategy } from "./strategy/jwt-cookie.strategy"; -import { UserRepository } from "../../prisma/repositories/user.repository"; -import { JwtModule } from "@nestjs/jwt"; -import settings from "../../settings"; -import { UserService } from "../user/user.service"; -import { PassportModule } from "@nestjs/passport"; +import { Module } from '@nestjs/common'; +import { JwtModule } from '@nestjs/jwt'; +import { PassportModule } from '@nestjs/passport'; +import { PrismaModule } from '../../prisma/prisma.module'; +import { UserRepository } from '../../prisma/repositories/user.repository'; +import { UserService } from '../user/user.service'; +import { AuthController } from './auth.controller'; +import { AuthService } from './auth.service'; +import { JwtCookieStrategy } from './strategy/jwt-cookie.strategy'; @Module({ imports: [ @@ -16,12 +15,7 @@ import { PassportModule } from "@nestjs/passport"; JwtModule.register({}), ], controllers: [AuthController], - providers: [ - AuthService, - JwtCookieStrategy, - UserService, - UserRepository, - ], + providers: [AuthService, JwtCookieStrategy, UserService, UserRepository], exports: [AuthService], }) export class AuthModule {} diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 7c97b5f6..5908c825 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -1,13 +1,11 @@ -import { PrismaService } from '../../prisma/prisma.service'; import { Injectable } from '@nestjs/common'; -import { UserRepository } from '../../prisma/repositories/user.repository'; -import { Prisma, session_userprofile } from '@prisma/client'; import { JwtService } from '@nestjs/jwt'; -import settings from '../../settings'; +import { Prisma, session_userprofile } from '@prisma/client'; import * as bcrypt from 'bcrypt'; -import session from 'express-session'; import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; import { import_student_lectures } from '../../common/scholarDB/scripts'; +import { UserRepository } from '../../prisma/repositories/user.repository'; +import settings from '../../settings'; @Injectable() export class AuthService { diff --git a/src/modules/auth/guard/jwt-cookie.guard.ts b/src/modules/auth/guard/jwt-cookie.guard.ts index fdd96ed3..360999f4 100644 --- a/src/modules/auth/guard/jwt-cookie.guard.ts +++ b/src/modules/auth/guard/jwt-cookie.guard.ts @@ -1,22 +1,22 @@ -import { AuthGuard } from "@nestjs/passport"; -import { ExecutionContext, Injectable } from "@nestjs/common"; -import { Reflector } from "@nestjs/core"; -import { IS_PUBLIC_KEY } from "../../../common/decorators/skip-auth.decorator"; -import { Request } from "express"; -import { AuthService } from "../auth.service"; +import { ExecutionContext, Injectable } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { AuthGuard } from '@nestjs/passport'; +import { IS_PUBLIC_KEY } from '../../../common/decorators/skip-auth.decorator'; +import { AuthService } from '../auth.service'; @Injectable() -export class JwtCookieGuard extends AuthGuard("jwt-cookie") { +export class JwtCookieGuard extends AuthGuard('jwt-cookie') { constructor( private reflector: Reflector, - private readonly authService: AuthService) { + private readonly authService: AuthService, + ) { super(); } canActivate(context: ExecutionContext) { const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ context.getHandler(), - context.getClass() + context.getClass(), ]); if (isPublic) { return true; diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index 508e33e3..0f5b4f08 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -1,59 +1,64 @@ -import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from "@nestjs/common"; -import { Reflector } from "@nestjs/core"; -import { IS_PUBLIC_KEY } from "../../../common/decorators/skip-auth.decorator"; -import { Request } from "express"; -import * as bcrypt from "bcrypt"; -import { AuthService } from "../auth.service"; -import { JwtService } from "@nestjs/jwt"; -import settings from "../../../settings"; +import { + CanActivate, + ExecutionContext, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { JwtService } from '@nestjs/jwt'; +import * as bcrypt from 'bcrypt'; +import { Request } from 'express'; +import { IS_PUBLIC_KEY } from '../../../common/decorators/skip-auth.decorator'; +import settings from '../../../settings'; +import { AuthService } from '../auth.service'; @Injectable() -export class MockAuthGuard implements CanActivate{ +export class MockAuthGuard implements CanActivate { constructor( private reflector: Reflector, private readonly authService: AuthService, - private jwtService: JwtService - ) { - } + private jwtService: JwtService, + ) {} async canActivate(context: ExecutionContext) { - const request = context.switchToHttp().getRequest(); const response = context.switchToHttp().getResponse(); - const sid = request.cookies["auth-cookie"]; + const sid = request.cookies['auth-cookie']; if (sid) { const user = await this.authService.findBySid(sid); - request["user"] = user; + request['user'] = user; return this.determineAuth(context, true); - }else{ - const accessToken = this.extractTokenFromCookie(request, "accessToken"); + } else { + const accessToken = this.extractTokenFromCookie(request, 'accessToken'); try { - if (!accessToken) throw new Error("jwt expired"); - const payload = await this.jwtService.verify( - accessToken, - { - secret: settings().getJwtConfig().secret - } - ); + if (!accessToken) throw new Error('jwt expired'); + const payload = await this.jwtService.verify(accessToken, { + secret: settings().getJwtConfig().secret, + }); const user = this.authService.findBySid(payload.sid); - request["user"] = user; + request['user'] = user; return this.determineAuth(context, true); } catch (e) { - if (e.message === "jwt expired") { + if (e.message === 'jwt expired') { try { - const refreshToken = this.extractTokenFromCookie(request, "refreshToken"); - if (!refreshToken) throw new UnauthorizedException(); - const payload = await this.jwtService.verify( - refreshToken, - { - secret: settings().getJwtConfig().secret - } + const refreshToken = this.extractTokenFromCookie( + request, + 'refreshToken', ); + if (!refreshToken) throw new UnauthorizedException(); + const payload = await this.jwtService.verify(refreshToken, { + secret: settings().getJwtConfig().secret, + }); const user = await this.authService.findBySid(payload.sid); if (await bcrypt.compare(refreshToken, user.refresh_token)) { - const { accessToken, ...accessTokenOptions } = this.authService.getCookieWithAccessToken(payload.sid); - request.res.cookie("accessToken", accessToken, accessTokenOptions); - request["user"] = user; + const { accessToken, ...accessTokenOptions } = + this.authService.getCookieWithAccessToken(payload.sid); + request.res.cookie( + 'accessToken', + accessToken, + accessTokenOptions, + ); + request['user'] = user; return this.determineAuth(context, true); } return this.determineAuth(context, false); @@ -77,7 +82,7 @@ export class MockAuthGuard implements CanActivate{ private determineAuth(context: ExecutionContext, result: boolean): boolean { const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ context.getHandler(), - context.getClass() + context.getClass(), ]); if (isPublic) { @@ -86,7 +91,10 @@ export class MockAuthGuard implements CanActivate{ return result; } - private extractTokenFromCookie(request: Request, type: "accessToken" | "refreshToken"): string | undefined { + private extractTokenFromCookie( + request: Request, + type: 'accessToken' | 'refreshToken', + ): string | undefined { const cookie = request.cookies[type]; if (cookie) { return cookie; diff --git a/src/modules/auth/strategy/jwt-cookie.strategy.ts b/src/modules/auth/strategy/jwt-cookie.strategy.ts index f477a1ac..b3e238bf 100644 --- a/src/modules/auth/strategy/jwt-cookie.strategy.ts +++ b/src/modules/auth/strategy/jwt-cookie.strategy.ts @@ -1,10 +1,8 @@ -import { Injectable, Logger, UnauthorizedException } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; -import { AuthService } from '../auth.service'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { UserService } from "../../user/user.service"; -import settings from "../../../settings"; - +import settings from '../../../settings'; +import { AuthService } from '../auth.service'; /* @@ -17,9 +15,7 @@ export class JwtCookieStrategy extends PassportStrategy( Strategy, 'jwt-cookie', ) { - constructor( - private readonly authService: AuthService, - ) { + constructor(private readonly authService: AuthService) { super({ secretOrKey: settings().getJwtConfig().secret, ignoreExpiration: false, diff --git a/src/modules/auth/utils/sparcs-sso.ts b/src/modules/auth/utils/sparcs-sso.ts index af91143a..a2e7412e 100644 --- a/src/modules/auth/utils/sparcs-sso.ts +++ b/src/modules/auth/utils/sparcs-sso.ts @@ -1,7 +1,7 @@ +import axios, { AxiosResponse } from 'axios'; import * as crypto from 'crypto'; import * as querystring from 'querystring'; -import axios, { AxiosResponse } from 'axios'; -import { KaistInfo, SSOUser } from "../../../common/interfaces/dto/auth/sso.dto"; +import { SSOUser } from '../../../common/interfaces/dto/auth/sso.dto'; // CONVERT SPARCS SSO V2 Client Version 1.1 TO TYPESCRIPT // VALID ONLY AFTER ----(NOT VALID) ---- @@ -112,9 +112,11 @@ export class Client { throw new Error('UNKNOWN_ERROR'); } - const result = r.data - console.log(result) - result.kaist_info = result.kaist_info ? JSON.parse(result.kaist_info) : {} + const result = r.data; + console.log(result); + result.kaist_info = result.kaist_info + ? JSON.parse(result.kaist_info) + : {}; return result as SSOUser; } catch (e) { console.error(e); @@ -122,7 +124,7 @@ export class Client { } } - public get_login_params(): {url: string, state: string} { + public get_login_params(): { url: string; state: string } { /* Get login parameters for SPARCS SSO login :returns: [url, state] where url is a url to redirect user, @@ -134,14 +136,14 @@ export class Client { */ const state: string = crypto.randomBytes(10).toString('hex'); const params: Params = { client_id: this.client_id, state: state }; - console.log(this.client_id) + console.log(this.client_id); console.log(state); - console.log(this.URLS['token_require']) + console.log(this.URLS['token_require']); const url: string = `${this.URLS['token_require']}?${querystring.stringify( params, )}`; - console.log('url',url) - return {url, state} + console.log('url', url); + return { url, state }; } public async get_user_info(code: string): Promise { @@ -181,7 +183,6 @@ export class Client { return `${this.URLS['logout']}?${querystring.stringify(params)}`; } - public async get_notice( offset: number = 0, limit: number = 3, diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 072f46ef..e2ad2ab9 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,10 +1,10 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; -import { CoursesService } from './courses.service'; -import { GetUser } from 'src/common/decorators/get-user.decorator'; import { session_userprofile } from '@prisma/client'; -import { CourseQueryDto } from '../../common/interfaces/dto/course/course.request.dto'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; import { Public } from 'src/common/decorators/skip-auth.decorator'; import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; +import { CourseQueryDto } from '../../common/interfaces/dto/course/course.request.dto'; +import { CoursesService } from './courses.service'; @Controller('api/courses') export class CourseController { diff --git a/src/modules/courses/courses.module.ts b/src/modules/courses/courses.module.ts index 40c50305..877b9e23 100644 --- a/src/modules/courses/courses.module.ts +++ b/src/modules/courses/courses.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; import { CourseController } from './courses.controller'; import { CoursesService } from './courses.service'; -import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ imports: [PrismaModule], diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 0824ccdd..fa3aee2a 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,17 +1,12 @@ -import { DepartmentRepository } from './../../prisma/repositories/department.repository'; -import { CourseRepository } from './../../prisma/repositories/course.repository'; import { Injectable, NotFoundException } from '@nestjs/common'; -import { ProfessorResponseDto } from 'src/common/interfaces/dto/professor/professor.response.dto'; -import { applyOrder } from 'src/common/utils/search.utils'; import { session_userprofile } from '@prisma/client'; -import { toJsonDepartment } from '../../common/interfaces/serializer/department.serializer'; -import { toJsonProfessor } from '../../common/interfaces/serializer/professor.serializer'; -import { toJsonCourse } from '../../common/interfaces/serializer/course.serializer'; -import { getRepresentativeLecture } from '../../common/utils/lecture.utils'; -import { CourseResponseDtoNested } from '../../common/interfaces/dto/course/course.response.dto'; +import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; +import { CourseResponseDtoNested } from '../../common/interfaces/dto/course/course.response.dto'; +import { toJsonCourse } from '../../common/interfaces/serializer/course.serializer'; +import { getRepresentativeLecture } from '../../common/utils/lecture.utils'; +import { CourseRepository } from './../../prisma/repositories/course.repository'; @Injectable() export class CoursesService { diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index fcb315ce..869873db 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -1,6 +1,6 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; -import { LecturesService } from './lectures.service'; import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; +import { LecturesService } from './lectures.service'; @Controller('api/lectures') export class LecturesController { diff --git a/src/modules/lectures/lectures.module.ts b/src/modules/lectures/lectures.module.ts index 3e290b23..1fd4a38e 100644 --- a/src/modules/lectures/lectures.module.ts +++ b/src/modules/lectures/lectures.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; import { LecturesController } from './lectures.controller'; import { LecturesService } from './lectures.service'; -import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ imports: [PrismaModule], controllers: [LecturesController], providers: [LecturesService], - exports:[LecturesService], + exports: [LecturesService], }) export class LecturesModule {} diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index 90c1406a..8ac7bf60 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -1,17 +1,19 @@ -import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; -import { LectureRepository } from './../../prisma/repositories/lecture.repository'; import { Injectable, NotFoundException } from '@nestjs/common'; -import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; +import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; import { LectureResponseDto } from 'src/common/interfaces/dto/lecture/lecture.response.dto'; -import { LectureDetails } from "../../common/schemaTypes/types"; +import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; +import { LectureDetails } from '../../common/schemaTypes/types'; +import { LectureRepository } from './../../prisma/repositories/lecture.repository'; @Injectable() export class LecturesService { constructor(private LectureRepository: LectureRepository) {} - public async getLectureByFilter(query: LectureQueryDto): Promise { + public async getLectureByFilter( + query: LectureQueryDto, + ): Promise { const queryResult = await this.LectureRepository.filterByRequest(query); - return queryResult.map((lecture) => toJsonLecture(lecture, false)) + return queryResult.map((lecture) => toJsonLecture(lecture, false)); } public async getLectureById(id: number): Promise { diff --git a/src/modules/notices/notices.module.ts b/src/modules/notices/notices.module.ts index e2a29e08..7a1fe0ff 100644 --- a/src/modules/notices/notices.module.ts +++ b/src/modules/notices/notices.module.ts @@ -4,6 +4,6 @@ import { NoticesService } from './notices.service'; @Module({ controllers: [NoticesController], - providers: [NoticesService] + providers: [NoticesService], }) export class NoticesModule {} diff --git a/src/modules/planners/planners.module.ts b/src/modules/planners/planners.module.ts index 9023d523..82449cee 100644 --- a/src/modules/planners/planners.module.ts +++ b/src/modules/planners/planners.module.ts @@ -4,6 +4,6 @@ import { PlannersService } from './planners.service'; @Module({ controllers: [PlannersController], - providers: [PlannersService] + providers: [PlannersService], }) export class PlannersModule {} diff --git a/src/modules/rates/rates.module.ts b/src/modules/rates/rates.module.ts index d654e473..3d266852 100644 --- a/src/modules/rates/rates.module.ts +++ b/src/modules/rates/rates.module.ts @@ -4,6 +4,6 @@ import { RatesService } from './rates.service'; @Module({ controllers: [RatesController], - providers: [RatesService] + providers: [RatesService], }) export class RatesModule {} diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index 09e2b501..b6e56296 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -1,9 +1,22 @@ -import { Body, Controller, Get, HttpException, Post, Query, Param, Patch} from '@nestjs/common'; -import { ReviewQueryDto, ReviewUpdateDto, ReviewCreateDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; -import { ReviewsService } from './reviews.service'; -import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; -import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { + Body, + Controller, + Get, + HttpException, + Param, + Patch, + Post, + Query, +} from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { + ReviewCreateDto, + ReviewQueryDto, + ReviewUpdateDto, +} from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { ReviewsService } from './reviews.service'; @Controller('api/reviews') export class ReviewsController { @@ -54,7 +67,11 @@ export class ReviewsController { @GetUser() user: session_userprofile, ): Promise { if (user) { - return await this.reviewsService.updateReviewById(reviewId, user, reviewsBody); + return await this.reviewsService.updateReviewById( + reviewId, + user, + reviewsBody, + ); } else { throw new HttpException("Can't find user", 401); } diff --git a/src/modules/reviews/reviews.module.ts b/src/modules/reviews/reviews.module.ts index e7063905..685a4507 100644 --- a/src/modules/reviews/reviews.module.ts +++ b/src/modules/reviews/reviews.module.ts @@ -1,8 +1,8 @@ -import { PrismaModule } from './../../prisma/prisma.module'; import { Module } from '@nestjs/common'; +import { UserService } from '../user/user.service'; +import { PrismaModule } from './../../prisma/prisma.module'; import { ReviewsController } from './reviews.controller'; import { ReviewsService } from './reviews.service'; -import { UserService } from '../user/user.service'; @Module({ imports: [PrismaModule], diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index fb909911..904bdf2c 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -1,10 +1,14 @@ -import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; -import { ReviewQueryDto, ReviewUpdateDto, ReviewCreateDto } from "src/common/interfaces/dto/reviews/reviews.request.dto"; -import { HttpException, HttpStatus, Injectable } from "@nestjs/common"; -import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; -import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; +import { ReviewResponseDto } from 'src/common/interfaces/dto/reviews/review.response.dto'; +import { + ReviewCreateDto, + ReviewQueryDto, + ReviewUpdateDto, +} from 'src/common/interfaces/dto/reviews/reviews.request.dto'; +import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; import { LectureRepository } from 'src/prisma/repositories/lecture.repository'; +import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; @Injectable() export class ReviewsService { @@ -123,7 +127,10 @@ export class ReviewsService { if (review.writer_id !== user.id) throw new HttpException("Can't find user", 401); if (review.is_deleted) - throw new HttpException('Target review deleted by admin',HttpStatus.BAD_REQUEST); + throw new HttpException( + 'Target review deleted by admin', + HttpStatus.BAD_REQUEST, + ); const updateReview = await this.reviewsRepository.updateReview( review.id, reviewBody.content, diff --git a/src/modules/semesters/semesters.controller.ts b/src/modules/semesters/semesters.controller.ts index c4fd1be3..c7c87887 100644 --- a/src/modules/semesters/semesters.controller.ts +++ b/src/modules/semesters/semesters.controller.ts @@ -1,21 +1,15 @@ -import { Controller, Get, Query } from "@nestjs/common"; -import { SemestersService } from "./semesters.service"; -import { GetUser } from "../../common/decorators/get-user.decorator"; -import { SemesterQueryDto } from "../../common/interfaces/dto/semester/semester.request.dto"; -import { toJsonSemester } from "../../common/interfaces/serializer/semester.serializer"; +import { Controller, Get, Query } from '@nestjs/common'; +import { GetUser } from '../../common/decorators/get-user.decorator'; +import { SemesterQueryDto } from '../../common/interfaces/dto/semester/semester.request.dto'; +import { toJsonSemester } from '../../common/interfaces/serializer/semester.serializer'; +import { SemestersService } from './semesters.service'; @Controller('api/semesters') export class SemestersController { - constructor( - private readonly semestersService: SemestersService, - ) { - } + constructor(private readonly semestersService: SemestersService) {} @Get() - async getSemesters( - @Query() query: SemesterQueryDto, - @GetUser() user, - ) { + async getSemesters(@Query() query: SemesterQueryDto, @GetUser() user) { const semesters = await this.semestersService.getSemesters(query); return semesters.map((semester) => toJsonSemester(semester)); } diff --git a/src/modules/semesters/semesters.module.ts b/src/modules/semesters/semesters.module.ts index 19ece6e4..fb4a2aa2 100644 --- a/src/modules/semesters/semesters.module.ts +++ b/src/modules/semesters/semesters.module.ts @@ -1,11 +1,11 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from '../../prisma/prisma.module'; import { SemestersController } from './semesters.controller'; import { SemestersService } from './semesters.service'; -import { PrismaModule } from "../../prisma/prisma.module"; @Module({ imports: [PrismaModule], controllers: [SemestersController], - providers: [SemestersService] + providers: [SemestersService], }) export class SemestersModule {} diff --git a/src/modules/semesters/semesters.service.ts b/src/modules/semesters/semesters.service.ts index 82b4e8e4..5a34d52d 100644 --- a/src/modules/semesters/semesters.service.ts +++ b/src/modules/semesters/semesters.service.ts @@ -1,18 +1,17 @@ import { Injectable } from '@nestjs/common'; import { SemesterRepository } from 'src/prisma/repositories/semester.repository'; -import { orderFilter } from "../../common/utils/search.utils"; -import { SemesterQueryDto } from "../../common/interfaces/dto/semester/semester.request.dto"; +import { SemesterQueryDto } from '../../common/interfaces/dto/semester/semester.request.dto'; +import { orderFilter } from '../../common/utils/search.utils'; @Injectable() export class SemestersService { - constructor( - private readonly semesterRepository: SemesterRepository, - ) { - } + constructor(private readonly semesterRepository: SemesterRepository) {} async getSemesters(order: SemesterQueryDto) { const orderBy = orderFilter(order.order); - const semesters = await this.semesterRepository.getSemesters({ orderBy: orderBy }); + const semesters = await this.semesterRepository.getSemesters({ + orderBy: orderBy, + }); return semesters; } } diff --git a/src/modules/share/share.module.ts b/src/modules/share/share.module.ts index 0b021de5..e175eb51 100644 --- a/src/modules/share/share.module.ts +++ b/src/modules/share/share.module.ts @@ -4,6 +4,6 @@ import { ShareService } from './share.service'; @Module({ controllers: [ShareController], - providers: [ShareService] + providers: [ShareService], }) export class ShareModule {} diff --git a/src/modules/status/status.module.ts b/src/modules/status/status.module.ts index 44bc91b1..5c116e3e 100644 --- a/src/modules/status/status.module.ts +++ b/src/modules/status/status.module.ts @@ -4,6 +4,6 @@ import { StatusService } from './status.service'; @Module({ controllers: [StatusController], - providers: [StatusService] + providers: [StatusService], }) export class StatusModule {} diff --git a/src/modules/template/template.module.ts b/src/modules/template/template.module.ts index 7efd03d8..a292c765 100644 --- a/src/modules/template/template.module.ts +++ b/src/modules/template/template.module.ts @@ -4,6 +4,6 @@ import { TemplateService } from './template.service'; @Module({ controllers: [TemplateController], - providers: [TemplateService] + providers: [TemplateService], }) export class TemplateModule {} diff --git a/src/modules/timetables/timetables.controller.ts b/src/modules/timetables/timetables.controller.ts index 61aaaf33..82d96a38 100644 --- a/src/modules/timetables/timetables.controller.ts +++ b/src/modules/timetables/timetables.controller.ts @@ -1,40 +1,48 @@ -import { Body, Controller, Delete, Get, NotFoundException, Param, Post, Query } from "@nestjs/common"; -import { TimetablesService } from "./timetables.service"; -import { GetUser } from "../../common/decorators/get-user.decorator"; -import { session_userprofile } from "@prisma/client"; +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Query, +} from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from '../../common/decorators/get-user.decorator'; import { AddLectureDto, TimetableCreateDto, - TimetableQueryDto -} from "../../common/interfaces/dto/timetable/timetable.request.dto"; -import { toJsonTimetable } from "../../common/interfaces/serializer/timetable.serializer"; -import { LecturesService } from "../lectures/lectures.service"; + TimetableQueryDto, +} from '../../common/interfaces/dto/timetable/timetable.request.dto'; +import { toJsonTimetable } from '../../common/interfaces/serializer/timetable.serializer'; +import { LecturesService } from '../lectures/lectures.service'; +import { TimetablesService } from './timetables.service'; -@Controller("/api/users/:userId/timetables") +@Controller('/api/users/:userId/timetables') export class TimetablesController { - constructor( private readonly timetablesService: TimetablesService, - private readonly lectureService: LecturesService - ) { - } + private readonly lectureService: LecturesService, + ) {} @Get() async getTimetables( - @Param("userId") userId: number, + @Param('userId') userId: number, @Query() query: TimetableQueryDto, - @GetUser() user: session_userprofile + @GetUser() user: session_userprofile, ) { - - const timeTableList = await this.timetablesService.getTimetables(query, user); + const timeTableList = await this.timetablesService.getTimetables( + query, + user, + ); return timeTableList.map((timeTable) => toJsonTimetable(timeTable)); } @Get('/:timetableId') async getTimeTable( - @Param("userId") userId: number, - @Param("timetableId") timetableId: number, - @GetUser() user: session_userprofile + @Param('userId') userId: number, + @Param('timetableId') timetableId: number, + @GetUser() user: session_userprofile, ) { const timeTable = await this.timetablesService.getTimetable(timetableId); return toJsonTimetable(timeTable); @@ -42,17 +50,23 @@ export class TimetablesController { @Delete('/:timetableId') async deleteTimetable( - @Param("userId") userId: number, - @Param("timetableId") timetableId: number, - @GetUser() user: session_userprofile - ){ + @Param('userId') userId: number, + @Param('timetableId') timetableId: number, + @GetUser() user: session_userprofile, + ) { await this.timetablesService.deleteTimetable(user, timetableId); return null; } @Post() - async createTimetable(@Body() timeTableBody: TimetableCreateDto, @GetUser() user: session_userprofile) { - const timeTable = await this.timetablesService.createTimetable(timeTableBody, user); + async createTimetable( + @Body() timeTableBody: TimetableCreateDto, + @GetUser() user: session_userprofile, + ) { + const timeTable = await this.timetablesService.createTimetable( + timeTableBody, + user, + ); return toJsonTimetable(timeTable); } @@ -60,8 +74,11 @@ export class TimetablesController { async addLectureToTimetable( @Param('timetableId') timetableId: number, @Body() body: AddLectureDto, - ){ - const timeTable = await this.timetablesService.addLectureToTimetable(timetableId, body); + ) { + const timeTable = await this.timetablesService.addLectureToTimetable( + timetableId, + body, + ); return toJsonTimetable(timeTable); } @@ -69,9 +86,11 @@ export class TimetablesController { async removeLectureFromTimetable( @Param('timetableId') timetableId: number, @Body() body: AddLectureDto, - ){ - const timeTable = await this.timetablesService.removeLectureFromTimetable(timetableId, body); + ) { + const timeTable = await this.timetablesService.removeLectureFromTimetable( + timetableId, + body, + ); return toJsonTimetable(timeTable); } - } diff --git a/src/modules/timetables/timetables.module.ts b/src/modules/timetables/timetables.module.ts index 4fe6071c..b68015ca 100644 --- a/src/modules/timetables/timetables.module.ts +++ b/src/modules/timetables/timetables.module.ts @@ -1,12 +1,12 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from '../../prisma/prisma.module'; +import { LecturesModule } from '../lectures/lectures.module'; import { TimetablesController } from './timetables.controller'; import { TimetablesService } from './timetables.service'; -import { PrismaModule } from "../../prisma/prisma.module"; -import { LecturesModule } from "../lectures/lectures.module"; @Module({ imports: [PrismaModule, LecturesModule], controllers: [TimetablesController], - providers: [TimetablesService] + providers: [TimetablesService], }) export class TimetablesModule {} diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index 24c7e741..d19530ae 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -1,15 +1,22 @@ -import { BadRequestException, Injectable, NotFoundException } from "@nestjs/common"; -import { TimetableRepository } from "../../prisma/repositories/timetable.repository"; -import { session_userprofile } from "@prisma/client"; +import { + BadRequestException, + Injectable, + NotFoundException, +} from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; import { AddLectureDto, TimetableCreateDto, - TimetableQueryDto -} from "../../common/interfaces/dto/timetable/timetable.request.dto"; -import { orderFilter, validateYearAndSemester } from "../../common/utils/search.utils"; -import { SemesterRepository } from "../../prisma/repositories/semester.repository"; -import { LectureRepository } from "../../prisma/repositories/lecture.repository"; -import { PrismaService } from "../../prisma/prisma.service"; + TimetableQueryDto, +} from '../../common/interfaces/dto/timetable/timetable.request.dto'; +import { + orderFilter, + validateYearAndSemester, +} from '../../common/utils/search.utils'; +import { PrismaService } from '../../prisma/prisma.service'; +import { LectureRepository } from '../../prisma/repositories/lecture.repository'; +import { SemesterRepository } from '../../prisma/repositories/semester.repository'; +import { TimetableRepository } from '../../prisma/repositories/timetable.repository'; @Injectable() export class TimetablesService { @@ -17,9 +24,8 @@ export class TimetablesService { private readonly prismaService: PrismaService, private readonly timetableRepository: TimetableRepository, private readonly lectureRepository: LectureRepository, - private readonly semesterRepository: SemesterRepository - ) { - } + private readonly semesterRepository: SemesterRepository, + ) {} async getTimetables(query: TimetableQueryDto, user: session_userprofile) { const { year, semester, order, offset, limit } = query; @@ -28,28 +34,48 @@ export class TimetablesService { const paginationAndSorting = { skip: offset, take: limit, - orderBy: orderBy + orderBy: orderBy, }; - const timetables = await this.timetableRepository.getTimetables(user, year, semester, paginationAndSorting); + const timetables = await this.timetableRepository.getTimetables( + user, + year, + semester, + paginationAndSorting, + ); return timetables; } async getTimetable(timetableId: number) { - const timeTable = await this.timetableRepository.getTimeTableById(timetableId); + const timeTable = await this.timetableRepository.getTimeTableById( + timetableId, + ); return timeTable; } - async createTimetable(timeTableBody: TimetableCreateDto, user: session_userprofile) { + async createTimetable( + timeTableBody: TimetableCreateDto, + user: session_userprofile, + ) { const { year, semester } = timeTableBody; - if (!await validateYearAndSemester(year, semester, this.semesterRepository)) { - throw new BadRequestException("Wrong fields 'year' and 'semester' in request data"); + if ( + !(await validateYearAndSemester(year, semester, this.semesterRepository)) + ) { + throw new BadRequestException( + "Wrong fields 'year' and 'semester' in request data", + ); } let arrangeOrder = 0; - const relatedTimeTables = await this.timetableRepository.getTimetableBasics(user, year, semester, { orderBy: { arrange_order: "asc" } }); + const relatedTimeTables = await this.timetableRepository.getTimetableBasics( + user, + year, + semester, + { orderBy: { arrange_order: 'asc' } }, + ); if (relatedTimeTables.length > 0) { - arrangeOrder = relatedTimeTables[relatedTimeTables.length - 1].arrange_order + 1; + arrangeOrder = + relatedTimeTables[relatedTimeTables.length - 1].arrange_order + 1; } /* @@ -61,41 +87,74 @@ export class TimetablesService { */ const lectureIds = timeTableBody.lectures; const lectures = await this.lectureRepository.getLectureByIds(lectureIds); - const filteredLectures = lectures.filter((lecture) => - lecture.semester === timeTableBody.semester && lecture.year === timeTableBody.year + const filteredLectures = lectures.filter( + (lecture) => + lecture.semester === timeTableBody.semester && + lecture.year === timeTableBody.year, + ); + return await this.timetableRepository.createTimetable( + user, + year, + semester, + arrangeOrder, + filteredLectures, ); - return await this.timetableRepository.createTimetable(user, year, semester, arrangeOrder, filteredLectures); } async addLectureToTimetable(timeTableId: number, body: AddLectureDto) { const lectureId = body.lecture; const lecture = await this.lectureRepository.getLectureBasicById(lectureId); - const timetable = await this.timetableRepository.getTimeTableBasicById(timeTableId); - if(!lecture){ - throw new BadRequestException("Wrong field \\'lecture\\' in request data") + const timetable = await this.timetableRepository.getTimeTableBasicById( + timeTableId, + ); + if (!lecture) { + throw new BadRequestException( + "Wrong field \\'lecture\\' in request data", + ); } - if( !(lecture.year == timetable.year && lecture.semester == timetable.semester)){ - throw new BadRequestException("Wrong field \\'lecture\\' in request data") + if ( + !( + lecture.year == timetable.year && lecture.semester == timetable.semester + ) + ) { + throw new BadRequestException( + "Wrong field \\'lecture\\' in request data", + ); } - await this.timetableRepository.addLectureToTimetable(timeTableId, lectureId); - return await this.timetableRepository.getTimeTableById(timeTableId) + await this.timetableRepository.addLectureToTimetable( + timeTableId, + lectureId, + ); + return await this.timetableRepository.getTimeTableById(timeTableId); } async removeLectureFromTimetable(timeTableId: number, body: AddLectureDto) { const lectureId = body.lecture; const lecture = await this.lectureRepository.getLectureBasicById(lectureId); - const timetable = await this.timetableRepository.getTimeTableBasicById(timeTableId); + const timetable = await this.timetableRepository.getTimeTableBasicById( + timeTableId, + ); if (!lecture) { - throw new BadRequestException("Wrong field \\'lecture\\' in request data"); + throw new BadRequestException( + "Wrong field \\'lecture\\' in request data", + ); } - if (!(lecture.year == timetable.year && lecture.semester == timetable.semester)) { - throw new BadRequestException("Wrong field \\'lecture\\' in request data"); + if ( + !( + lecture.year == timetable.year && lecture.semester == timetable.semester + ) + ) { + throw new BadRequestException( + "Wrong field \\'lecture\\' in request data", + ); } - await this.timetableRepository.removeLectureFromTimetable(timeTableId, lectureId); + await this.timetableRepository.removeLectureFromTimetable( + timeTableId, + lectureId, + ); return await this.timetableRepository.getTimeTableById(timeTableId); } - async deleteTimetable(user, timetableId: number) { return await this.prismaService.$transaction(async (tx) => { const timeTable = await this.getTimetable(timetableId); @@ -106,16 +165,27 @@ export class TimetablesService { return new NotFoundException(); } await this.timetableRepository.deleteById(timetableId); - const relatedTimeTables = await this.timetableRepository.getTimetables(user, year, semester); - const timeTablesToBeUpdated = relatedTimeTables.filter((timeTable) => timeTable.arrange_order > arrangeOrder) + const relatedTimeTables = await this.timetableRepository.getTimetables( + user, + year, + semester, + ); + const timeTablesToBeUpdated = relatedTimeTables + .filter((timeTable) => timeTable.arrange_order > arrangeOrder) .map((timeTable) => { - return { id: timeTable.id, arrange_order: timeTable.arrange_order - 1 }; + return { + id: timeTable.id, + arrange_order: timeTable.arrange_order - 1, + }; }); - await Promise.all(timeTablesToBeUpdated.map(async (updateElem) => { - return this.timetableRepository.updateOrder(updateElem.id, updateElem.arrange_order); - }) + await Promise.all( + timeTablesToBeUpdated.map(async (updateElem) => { + return this.timetableRepository.updateOrder( + updateElem.id, + updateElem.arrange_order, + ); + }), ); - }) + }); } - } diff --git a/src/modules/user/user.controller.ts b/src/modules/user/user.controller.ts index bc8140f6..224a5955 100644 --- a/src/modules/user/user.controller.ts +++ b/src/modules/user/user.controller.ts @@ -1,9 +1,9 @@ -import { Controller, Get, HttpException, Param, Query } from "@nestjs/common"; -import { UserService } from "./user.service"; -import { GetUser } from "src/common/decorators/get-user.decorator"; -import { session_userprofile } from "@prisma/client"; -import { UserTakenCoursesQueryDto } from "src/common/interfaces/dto/user/user.request.dto"; -import { CourseResponseDtoNested } from "src/common/interfaces/dto/course/course.response.dto"; +import { Controller, Get, HttpException, Param, Query } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { CourseResponseDtoNested } from 'src/common/interfaces/dto/course/course.response.dto'; +import { UserTakenCoursesQueryDto } from 'src/common/interfaces/dto/user/user.request.dto'; +import { UserService } from './user.service'; @Controller('api/users') export class UserController { @@ -16,10 +16,7 @@ export class UserController { @GetUser() user: session_userprofile, ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { if (userId === user.id) { - return await this.userService.getUserTakenCourses( - query, - user, - ); + return await this.userService.getUserTakenCourses(query, user); } else { throw new HttpException("Can't find user", 401); } diff --git a/src/modules/user/user.module.ts b/src/modules/user/user.module.ts index a38678ae..2be35f8d 100644 --- a/src/modules/user/user.module.ts +++ b/src/modules/user/user.module.ts @@ -1,7 +1,7 @@ +import { Module } from '@nestjs/common'; import { PrismaModule } from 'src/prisma/prisma.module'; import { UserController } from './user.controller'; import { UserService } from './user.service'; -import { Module } from '@nestjs/common'; @Module({ imports: [PrismaModule], diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 72b3388b..7674d2d3 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,20 +1,20 @@ -import { CourseRepository } from "./../../prisma/repositories/course.repository"; -import { UserRepository } from "../../prisma/repositories/user.repository"; -import { Injectable, NotFoundException } from "@nestjs/common"; -import { LectureRepository } from "../../prisma/repositories/lecture.repository"; -import { session_userprofile, subject_department } from "@prisma/client"; -import { DepartmentRepository } from "../../prisma/repositories/department.repository"; -import { normalizeArray } from "../../common/utils/method.utils"; -import { ResearchLecture } from "../../common/interfaces/constants/lecture"; -import { ReviewsRepository } from "../../prisma/repositories/review.repository"; -import { toJsonDepartment } from "../../common/interfaces/serializer/department.serializer"; -import { toJsonReview } from "../../common/interfaces/serializer/review.serializer"; -import { toJsonLecture } from "../../common/interfaces/serializer/lecture.serializer"; -import { ReviewDetails } from "../../common/schemaTypes/types"; -import { UserTakenCoursesQueryDto } from "src/common/interfaces/dto/user/user.request.dto"; -import { toJsonCourse } from "src/common/interfaces/serializer/course.serializer"; -import { getRepresentativeLecture } from "../../common/utils/lecture.utils"; -import { CourseResponseDtoNested } from "src/common/interfaces/dto/course/course.response.dto"; +import { Injectable, NotFoundException } from '@nestjs/common'; +import { session_userprofile, subject_department } from '@prisma/client'; +import { CourseResponseDtoNested } from 'src/common/interfaces/dto/course/course.response.dto'; +import { UserTakenCoursesQueryDto } from 'src/common/interfaces/dto/user/user.request.dto'; +import { toJsonCourse } from 'src/common/interfaces/serializer/course.serializer'; +import { ResearchLecture } from '../../common/interfaces/constants/lecture'; +import { toJsonDepartment } from '../../common/interfaces/serializer/department.serializer'; +import { toJsonLecture } from '../../common/interfaces/serializer/lecture.serializer'; +import { toJsonReview } from '../../common/interfaces/serializer/review.serializer'; +import { ReviewDetails } from '../../common/schemaTypes/types'; +import { getRepresentativeLecture } from '../../common/utils/lecture.utils'; +import { normalizeArray } from '../../common/utils/method.utils'; +import { DepartmentRepository } from '../../prisma/repositories/department.repository'; +import { LectureRepository } from '../../prisma/repositories/lecture.repository'; +import { ReviewsRepository } from '../../prisma/repositories/review.repository'; +import { UserRepository } from '../../prisma/repositories/user.repository'; +import { CourseRepository } from './../../prisma/repositories/course.repository'; @Injectable() export class UserService { @@ -23,9 +23,8 @@ export class UserService { private readonly lectureRepository: LectureRepository, private readonly departmentRepository: DepartmentRepository, private readonly reviewRepository: ReviewsRepository, - private readonly courseRepository: CourseRepository - ) { - } + private readonly courseRepository: CourseRepository, + ) {} public async findBySid(sid: string) { const user = this.userRepository.findBySid(sid); @@ -90,50 +89,58 @@ export class UserService { lastName: user.last_name, department: toJsonDepartment(department) ?? null, majors: majors.map((major) => toJsonDepartment(major)), - departments: departments.map((department) => toJsonDepartment(department)), - favorite_departments: favoriteDepartments.map((department) => toJsonDepartment(department)), - review_writable_lectures: reviewWritableLectures.map((lecture) => toJsonLecture(lecture,false)), - my_timetable_lectures: timeTableLectures.map((lecture) => toJsonLecture(lecture,false)), + departments: departments.map((department) => + toJsonDepartment(department), + ), + favorite_departments: favoriteDepartments.map((department) => + toJsonDepartment(department), + ), + review_writable_lectures: reviewWritableLectures.map((lecture) => + toJsonLecture(lecture, false), + ), + my_timetable_lectures: timeTableLectures.map((lecture) => + toJsonLecture(lecture, false), + ), reviews: writtenReviews.map((review) => toJsonReview(review)), }; } async getUserTakenCourses( query: UserTakenCoursesQueryDto, - user: session_userprofile + user: session_userprofile, ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { const DEFAULT_ORDER = ['old_code']; const takenLectures = await this.lectureRepository.getTakenLectures(user); const takenLecturesId = takenLectures.map((lecture) => lecture.id); const courses = await this.courseRepository.getUserTakenCourses( takenLecturesId, - query.order ?? DEFAULT_ORDER + query.order ?? DEFAULT_ORDER, ); return courses.map((course) => { - const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map( - (x) => x.professor, - ); - const result = toJsonCourse( - course, - representativeLecture, - professorRaw, - false, - ); + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map( + (x) => x.professor, + ); + const result = toJsonCourse( + course, + representativeLecture, + professorRaw, + false, + ); - if (user) { - const latestReadDatetime = course.subject_courseuser.find( - (x) => (x.user_profile_id = user.id), - )?.latest_read_datetime; - const latestWrittenDatetime = course.latest_written_datetime; - return Object.assign(result, { - userspecific_is_read: latestWrittenDatetime < latestReadDatetime, - }); - } else { - return Object.assign(result, { - userspecific_is_read: false, - }); - } - }) + if (user) { + const latestReadDatetime = course.subject_courseuser.find( + (x) => (x.user_profile_id = user.id), + )?.latest_read_datetime; + const latestWrittenDatetime = course.latest_written_datetime; + return Object.assign(result, { + userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + }); + } else { + return Object.assign(result, { + userspecific_is_read: false, + }); + } + }); } -} \ No newline at end of file +} diff --git a/src/modules/wishlist/wishlist.module.ts b/src/modules/wishlist/wishlist.module.ts index f2f6e1d8..35162849 100644 --- a/src/modules/wishlist/wishlist.module.ts +++ b/src/modules/wishlist/wishlist.module.ts @@ -2,6 +2,6 @@ import { Module } from '@nestjs/common'; import { WishlistController } from './wishlist.controller'; @Module({ - controllers: [WishlistController] + controllers: [WishlistController], }) export class WishlistModule {} diff --git a/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/mergeAuthUserAndSessionUser.ts b/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/mergeAuthUserAndSessionUser.ts index e681ffd6..4997191d 100644 --- a/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/mergeAuthUserAndSessionUser.ts +++ b/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/mergeAuthUserAndSessionUser.ts @@ -1,6 +1,6 @@ -import { PrismaService } from '../../prisma.service'; -import settings from '../../../settings'; import { normalizeArray } from '../../../common/utils/method.utils'; +import settings from '../../../settings'; +import { PrismaService } from '../../prisma.service'; async function main() { const ormConfig = settings().ormconfig(); diff --git a/src/prisma/migrations/20230621131500_add_refresh_token_to_session_user_profile/addRefreshToken.ts b/src/prisma/migrations/20230621131500_add_refresh_token_to_session_user_profile/addRefreshToken.ts index fc749c67..55fdcbfb 100644 --- a/src/prisma/migrations/20230621131500_add_refresh_token_to_session_user_profile/addRefreshToken.ts +++ b/src/prisma/migrations/20230621131500_add_refresh_token_to_session_user_profile/addRefreshToken.ts @@ -1,9 +1,9 @@ -import { PrismaService } from "../../prisma.service"; -import settings from "../../../settings"; -import { JwtService } from "@nestjs/jwt"; -import { UserRepository } from "../../repositories/user.repository"; -import { AuthService } from "../../../modules/auth/auth.service"; -import * as bcrypt from "bcrypt"; +import { JwtService } from '@nestjs/jwt'; +import * as bcrypt from 'bcrypt'; +import { AuthService } from '../../../modules/auth/auth.service'; +import settings from '../../../settings'; +import { PrismaService } from '../../prisma.service'; +import { UserRepository } from '../../repositories/user.repository'; async function main() { const ormConfig = settings().ormconfig(); @@ -13,38 +13,42 @@ async function main() { const authService = new AuthService(userRepository, new JwtService({})); try { await prisma.$connect(); - await prisma.$transaction(async (tx)=> { - const session_users = await tx.session_userprofile.findMany(); + await prisma.$transaction( + async (tx) => { + const session_users = await tx.session_userprofile.findMany(); - const BATCH_SIZE = 1000; - console.log(session_users.length); - for (let i = 0; i < Math.ceil(session_users.length / BATCH_SIZE); i++) { - const slicedSessionUsers = session_users.slice( - i * BATCH_SIZE, - (i + 1) * BATCH_SIZE - ); - const bulkPromises = slicedSessionUsers.map(async (session_user) => { - const { refreshToken, ...refreshTokenOptions } = authService.getCookieWithRefreshToken(session_user.sid) - const salt = await bcrypt.genSalt(Number(process.env.saltRounds)); - const encryptedRefreshToken = await bcrypt.hash(refreshToken, salt); - session_user.refresh_token = encryptedRefreshToken - const result = tx.session_userprofile.update({ - where: { - id: session_user.id - }, - data: { - refresh_token: encryptedRefreshToken - } + const BATCH_SIZE = 1000; + console.log(session_users.length); + for (let i = 0; i < Math.ceil(session_users.length / BATCH_SIZE); i++) { + const slicedSessionUsers = session_users.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE, + ); + const bulkPromises = slicedSessionUsers.map(async (session_user) => { + const { refreshToken, ...refreshTokenOptions } = + authService.getCookieWithRefreshToken(session_user.sid); + const salt = await bcrypt.genSalt(Number(process.env.saltRounds)); + const encryptedRefreshToken = await bcrypt.hash(refreshToken, salt); + session_user.refresh_token = encryptedRefreshToken; + const result = tx.session_userprofile.update({ + where: { + id: session_user.id, + }, + data: { + refresh_token: encryptedRefreshToken, + }, + }); + return result; }); - return result; - }); - await Promise.all(bulkPromises); - console.log(`batch ${i} done`); - } - },{ - maxWait: 5000, - timeout: 300000 - }) + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + }, + { + maxWait: 5000, + timeout: 300000, + }, + ); } catch (e) { console.error(e); } finally { @@ -54,7 +58,7 @@ async function main() { main() .then(() => { - console.log("done"); + console.log('done'); }) .catch((e) => { console.error(e); diff --git a/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts b/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts index 7c8a8dc6..d0909b35 100644 --- a/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts +++ b/src/prisma/migrations/20230705113103_add_no_space_columns/noSpaceColumns.ts @@ -1,5 +1,5 @@ -import { PrismaService } from "../../prisma.service"; -import settings from "../../../settings"; +import settings from '../../../settings'; +import { PrismaService } from '../../prisma.service'; async function main() { const ormConfig = settings().ormconfig(); @@ -7,35 +7,42 @@ async function main() { const prisma = new PrismaService(); try { await prisma.$connect(); - await prisma.$transaction(async (tx)=> { - const subject_course = await tx.subject_course.findMany(); + await prisma.$transaction( + async (tx) => { + const subject_course = await tx.subject_course.findMany(); - const BATCH_SIZE = 1000; - console.log(subject_course.length); - for (let i = 0; i < Math.ceil(subject_course.length / BATCH_SIZE); i++) { - const sliced_subject_course = subject_course.slice( - i * BATCH_SIZE, - (i + 1) * BATCH_SIZE - ); - const bulkPromises = sliced_subject_course.map(async (course) => { - const result = tx.subject_course.update({ - where: { - id: course.id - }, - data: { - title_no_space: course.title.replace(/\s/g, ''), - title_en_no_space: course.title_en.replace(/\s/g, ''), - } + const BATCH_SIZE = 1000; + console.log(subject_course.length); + for ( + let i = 0; + i < Math.ceil(subject_course.length / BATCH_SIZE); + i++ + ) { + const sliced_subject_course = subject_course.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE, + ); + const bulkPromises = sliced_subject_course.map(async (course) => { + const result = tx.subject_course.update({ + where: { + id: course.id, + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + }, + }); + return result; }); - return result; - }); - await Promise.all(bulkPromises); - console.log(`batch ${i} done`); - } - },{ - maxWait: 5000, - timeout: 300000 - }) + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + }, + { + maxWait: 5000, + timeout: 300000, + }, + ); } catch (e) { console.error(e); } finally { @@ -45,7 +52,7 @@ async function main() { main() .then(() => { - console.log("done"); + console.log('done'); }) .catch((e) => { console.error(e); diff --git a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts index 0dacad11..9ffa6191 100644 --- a/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts +++ b/src/prisma/migrations/20230726101554_add_no_space_column_for_lecture/noSpaceColumns.ts @@ -1,5 +1,5 @@ -import { PrismaService } from "../../prisma.service"; -import settings from "../../../settings"; +import settings from '../../../settings'; +import { PrismaService } from '../../prisma.service'; async function main() { const ormConfig = settings().ormconfig(); @@ -7,35 +7,42 @@ async function main() { const prisma = new PrismaService(); try { await prisma.$connect(); - await prisma.$transaction(async (tx)=> { - const subject_lecture = await tx.subject_lecture.findMany(); + await prisma.$transaction( + async (tx) => { + const subject_lecture = await tx.subject_lecture.findMany(); - const BATCH_SIZE = 1000; - console.log(subject_lecture.length); - for (let i = 0; i < Math.ceil(subject_lecture.length / BATCH_SIZE); i++) { - const sliced_subject_lecture = subject_lecture.slice( - i * BATCH_SIZE, - (i + 1) * BATCH_SIZE - ); - const bulkPromises = sliced_subject_lecture.map(async (course) => { - const result = tx.subject_lecture.update({ - where: { - id: course.id - }, - data: { - title_no_space: course.title.replace(/\s/g, ''), - title_en_no_space: course.title_en.replace(/\s/g, ''), - } + const BATCH_SIZE = 1000; + console.log(subject_lecture.length); + for ( + let i = 0; + i < Math.ceil(subject_lecture.length / BATCH_SIZE); + i++ + ) { + const sliced_subject_lecture = subject_lecture.slice( + i * BATCH_SIZE, + (i + 1) * BATCH_SIZE, + ); + const bulkPromises = sliced_subject_lecture.map(async (course) => { + const result = tx.subject_lecture.update({ + where: { + id: course.id, + }, + data: { + title_no_space: course.title.replace(/\s/g, ''), + title_en_no_space: course.title_en.replace(/\s/g, ''), + }, + }); + return result; }); - return result; - }); - await Promise.all(bulkPromises); - console.log(`batch ${i} done`); - } - },{ - maxWait: 5000, - timeout: 300000 - }) + await Promise.all(bulkPromises); + console.log(`batch ${i} done`); + } + }, + { + maxWait: 5000, + timeout: 300000, + }, + ); } catch (e) { console.error(e); } finally { @@ -45,7 +52,7 @@ async function main() { main() .then(() => { - console.log("done"); + console.log('done'); }) .catch((e) => { console.error(e); diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index e769401d..7233b0c0 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -1,15 +1,16 @@ -import { Module } from "@nestjs/common"; -import { PrismaService } from "./prisma.service"; -import { UserRepository } from "./repositories/user.repository"; -import { LectureRepository } from "./repositories/lecture.repository"; -import { ReviewsRepository } from "./repositories/review.repository"; -import { DepartmentRepository } from "./repositories/department.repository"; -import { CourseRepository } from "./repositories/course.repository"; -import { SemesterRepository } from "./repositories/semester.repository"; -import { TimetableRepository } from "./repositories/timetable.repository"; +import { Module } from '@nestjs/common'; +import { PrismaService } from './prisma.service'; +import { CourseRepository } from './repositories/course.repository'; +import { DepartmentRepository } from './repositories/department.repository'; +import { LectureRepository } from './repositories/lecture.repository'; +import { ReviewsRepository } from './repositories/review.repository'; +import { SemesterRepository } from './repositories/semester.repository'; +import { TimetableRepository } from './repositories/timetable.repository'; +import { UserRepository } from './repositories/user.repository'; @Module({ - providers: [PrismaService, + providers: [ + PrismaService, UserRepository, LectureRepository, ReviewsRepository, @@ -18,7 +19,8 @@ import { TimetableRepository } from "./repositories/timetable.repository"; SemesterRepository, TimetableRepository, ], - exports: [PrismaService, + exports: [ + PrismaService, UserRepository, LectureRepository, ReviewsRepository, @@ -26,6 +28,6 @@ import { TimetableRepository } from "./repositories/timetable.repository"; CourseRepository, SemesterRepository, TimetableRepository, - ] + ], }) export class PrismaModule {} diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index 879de995..d18ea1a6 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -1,6 +1,6 @@ -import { INestApplication, Injectable, OnModuleInit } from "@nestjs/common"; +import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; -import settings from "../settings"; +import settings from '../settings'; @Injectable() export class PrismaService extends PrismaClient implements OnModuleInit { @@ -15,7 +15,7 @@ export class PrismaService extends PrismaClient implements OnModuleInit { this.$on('query', async (e) => { // @ts-ignore console.log(`Query: ${e.query} ${e.params}`); - }) + }); } async enableShutdownHooks(app: INestApplication) { diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index f2c0b25d..79ca29e5 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../prisma.service'; +import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; import { - applyOrder, applyOffset, + applyOrder, orderFilter, } from 'src/common/utils/search.utils'; import { @@ -10,8 +10,7 @@ import { LectureDetails, ReviewDetails, } from '../../common/schemaTypes/types'; -import { session_userprofile } from '@prisma/client'; -import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; +import { PrismaService } from '../prisma.service'; @Injectable() export class CourseRepository { diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index c11ac9a0..77382d5b 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -1,59 +1,71 @@ -import { PrismaService } from "../prisma.service"; -import { session_userprofile, subject_department } from "@prisma/client"; -import session from "express-session"; -import { Injectable } from "@nestjs/common"; +import { Injectable } from '@nestjs/common'; +import { session_userprofile, subject_department } from '@prisma/client'; +import { PrismaService } from '../prisma.service'; @Injectable() -export class DepartmentRepository{ - constructor(private readonly prisma: PrismaService) { - } +export class DepartmentRepository { + constructor(private readonly prisma: PrismaService) {} - async getDepartmentOfUser(user: session_userprofile): Promise { - const departmentId = user.department_id - if(!departmentId) return null; + async getDepartmentOfUser( + user: session_userprofile, + ): Promise { + const departmentId = user.department_id; + if (!departmentId) return null; const department = await this.prisma.subject_department.findUnique({ - where: { id: departmentId } + where: { id: departmentId }, }); return department; } - async getFavoriteDepartments(user: session_userprofile): Promise{ - const favoriteDepartments = (await this.prisma.session_userprofile_favorite_departments.findMany({ - where: { userprofile_id: user.id }, - include:{ - department: true - } - })).map((favoriteDepartment) => favoriteDepartment.department); + async getFavoriteDepartments( + user: session_userprofile, + ): Promise { + const favoriteDepartments = ( + await this.prisma.session_userprofile_favorite_departments.findMany({ + where: { userprofile_id: user.id }, + include: { + department: true, + }, + }) + ).map((favoriteDepartment) => favoriteDepartment.department); return favoriteDepartments; } - async getMajors(user: session_userprofile): Promise{ - const majors = (await this.prisma.session_userprofile_majors.findMany({ - where: { userprofile_id: user.id }, - include:{ - subject_department: true - } - })).map((major) => major.subject_department); + async getMajors(user: session_userprofile): Promise { + const majors = ( + await this.prisma.session_userprofile_majors.findMany({ + where: { userprofile_id: user.id }, + include: { + subject_department: true, + }, + }) + ).map((major) => major.subject_department); return majors; } - async getMinors(user: session_userprofile): Promise{ - const minors = (await this.prisma.session_userprofile_minors.findMany({ - where: { userprofile_id: user.id }, - include:{ - subject_department: true - } - })).map((minor) => minor.subject_department); + async getMinors(user: session_userprofile): Promise { + const minors = ( + await this.prisma.session_userprofile_minors.findMany({ + where: { userprofile_id: user.id }, + include: { + subject_department: true, + }, + }) + ).map((minor) => minor.subject_department); return minors; } - async getSpecializedMajors(user: session_userprofile): Promise{ - const specializedMajors = (await this.prisma.session_userprofile_specialized_major.findMany({ - where: {userprofile_id: user.id}, - include:{ - subject_department: true - } - })).map((specializedMajor) => specializedMajor.subject_department); + async getSpecializedMajors( + user: session_userprofile, + ): Promise { + const specializedMajors = ( + await this.prisma.session_userprofile_specialized_major.findMany({ + where: { userprofile_id: user.id }, + include: { + subject_department: true, + }, + }) + ).map((specializedMajor) => specializedMajor.subject_department); return specializedMajors; } -} \ No newline at end of file +} diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 33c74129..bb213145 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,59 +1,71 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "../prisma.service"; -import { Prisma, session_userprofile } from "@prisma/client"; -import { groupBy } from "../../common/utils/method.utils"; -import { LectureQueryDto } from "src/common/interfaces/dto/lecture/lecture.request.dto"; -import { CourseRepository } from "./course.repository"; -import { applyOrder, applyOffset } from "src/common/utils/search.utils"; -import { LectureBasic, lectureDetails, LectureDetails } from "../../common/schemaTypes/types"; +import { Injectable } from '@nestjs/common'; +import { Prisma, session_userprofile } from '@prisma/client'; +import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; +import { applyOffset, applyOrder } from 'src/common/utils/search.utils'; +import { + LectureBasic, + LectureDetails, + lectureDetails, +} from '../../common/schemaTypes/types'; +import { groupBy } from '../../common/utils/method.utils'; +import { PrismaService } from '../prisma.service'; +import { CourseRepository } from './course.repository'; @Injectable() export class LectureRepository { constructor( private readonly prisma: PrismaService, - private readonly courseRepository: CourseRepository + private readonly courseRepository: CourseRepository, ) {} async getLectureById(id: number): Promise { return await this.prisma.subject_lecture.findUnique({ include: lectureDetails.include, where: { - id: id - } + id: id, + }, }); } async getLectureBasicById(id: number): Promise { return await this.prisma.subject_lecture.findUnique({ where: { - id: id - } + id: id, + }, }); } - async getLectureByIds(ids: number[]): Promise{ + async getLectureByIds(ids: number[]): Promise { return await this.prisma.subject_lecture.findMany({ include: lectureDetails.include, where: { id: { - in: ids - } - } + in: ids, + }, + }, }); } async filterByRequest(query: LectureQueryDto): Promise { const DEFAULT_LIMIT = 300; const DEFAULT_ORDER = ['year', 'semester', 'old_code', 'class_no']; - const researchTypes = ["Individual Study", "Thesis Study(Undergraduate)", - "Thesis Research(MA/phD)"]; - + const researchTypes = [ + 'Individual Study', + 'Thesis Study(Undergraduate)', + 'Thesis Research(MA/phD)', + ]; + const semesterFilter = this.semesterFilter(query?.year, query?.semester); const timeFilter = this.timeFilter(query?.day, query?.begin, query?.end); - const departmentFilter = this.courseRepository.departmentFilter(query?.department); + const departmentFilter = this.courseRepository.departmentFilter( + query?.department, + ); const typeFilter = this.courseRepository.typeFilter(query?.type); const groupFilter = this.courseRepository.groupFilter(query?.group); - const keywordFilter = this.courseRepository.keywordFilter(query?.keyword, false); + const keywordFilter = this.courseRepository.keywordFilter( + query?.keyword, + false, + ); const defaultFilter = { AND: [ { @@ -61,14 +73,21 @@ export class LectureRepository { }, { type_en: { - notIn: researchTypes - } - } - ] - } + notIn: researchTypes, + }, + }, + ], + }; - const filters = [semesterFilter, timeFilter, - departmentFilter, typeFilter, groupFilter, keywordFilter, defaultFilter]; + const filters = [ + semesterFilter, + timeFilter, + departmentFilter, + typeFilter, + groupFilter, + keywordFilter, + defaultFilter, + ]; const queryResult = await this.prisma.subject_lecture.findMany({ include: { subject_department: true, @@ -77,47 +96,63 @@ export class LectureRepository { subject_examtime: true, }, where: { - AND: filters.filter((filter) => filter !== null) + AND: filters.filter((filter) => filter !== null), }, take: query.limit ?? DEFAULT_LIMIT, }); - const levelFilteredResult = this.courseRepository.levelFilter(queryResult, query?.level); + const levelFilteredResult = + this.courseRepository.levelFilter( + queryResult, + query?.level, + ); - const orderedQuery = applyOrder(levelFilteredResult, query.order ?? DEFAULT_ORDER); + const orderedQuery = applyOrder( + levelFilteredResult, + query.order ?? DEFAULT_ORDER, + ); return applyOffset(orderedQuery, query.offset ?? 0); } - async findReviewWritableLectures(user: session_userprofile, date?: Date): Promise { + async findReviewWritableLectures( + user: session_userprofile, + date?: Date, + ): Promise { let currDate; if (!date) { currDate = Date.now(); } else { - currDate = date + currDate = date; } const notWritableSemesters = await this.prisma.subject_semester.findMany({ where: { OR: [ { courseAddDropPeriodEnd: { - gte: currDate + gte: currDate, }, }, { beginning: { - gte: currDate - } - } - ] - } + gte: currDate, + }, + }, + ], + }, }); - const notWritableYearAndSemester = groupBy(notWritableSemesters.map((semester) => { - return { - semester: semester.semester, - year: semester.year - } - }),(subject_semester) => subject_semester.year) + const notWritableYearAndSemester = groupBy( + notWritableSemesters.map((semester) => { + return { + semester: semester.semester, + year: semester.year, + }; + }), + (subject_semester) => subject_semester.year, + ); - const notWritableYearAndSemesterMap: Record> = { } ; + const notWritableYearAndSemesterMap: Record< + number, + Record + > = {}; for (const key in notWritableYearAndSemester) { const objects = notWritableYearAndSemester[key]; const mapObjects = groupBy(objects); @@ -126,8 +161,10 @@ export class LectureRepository { const takenLectures = await this.getTakenLectures(user); const reviewWritableLectures = takenLectures.filter((lecture) => { - return notWritableYearAndSemesterMap[lecture.year]??[lecture.semester] ? true: false - }) + return notWritableYearAndSemesterMap[lecture.year] ?? [lecture.semester] + ? true + : false; + }); // const lectures = await this.prisma.subject_lecture.findMany({ // where: { @@ -141,66 +178,71 @@ export class LectureRepository { getResearchLectureQuery(): Prisma.subject_lectureWhereInput { return { type_en: { - in: ["Individual Study", "Thesis Study(Undergraduate)", - "Thesis Research(MA/phD)"] - } - } + in: [ + 'Individual Study', + 'Thesis Study(Undergraduate)', + 'Thesis Research(MA/phD)', + ], + }, + }; } async getTakenLectures(user: session_userprofile): Promise { - const lectures = (await this.prisma.session_userprofile_taken_lectures.findMany({ - where: { - userprofile_id: user.id - }, - include: { - lecture: { - include:{ - subject_lecture_professors: { - include:{ - professor: true - } + const lectures = ( + await this.prisma.session_userprofile_taken_lectures.findMany({ + where: { + userprofile_id: user.id, + }, + include: { + lecture: { + include: { + subject_lecture_professors: { + include: { + professor: true, + }, + }, + subject_department: true, + subject_examtime: true, + subject_classtime: true, }, - subject_department: true, - subject_examtime: true, - subject_classtime: true, - } - } - } - })).map((takenLecture) => takenLecture.lecture); + }, + }, + }) + ).map((takenLecture) => takenLecture.lecture); return lectures; } public semesterFilter(years: number[], semesters: number[]): object { - if ((!years) && (!semesters)) { + if (!years && !semesters) { return null; } else if (!years) { return { semester: { - in: semesters - } - } + in: semesters, + }, + }; } else if (!semesters) { return { years: { - in: semesters - } - } + in: semesters, + }, + }; } else { return { AND: [ { year: { - in: years - } + in: years, + }, }, { semester: { - in: semesters - } - } - ] - } + in: semesters, + }, + }, + ], + }; } } @@ -208,21 +250,17 @@ export class LectureRepository { const datetimeBegin = begin?.map((time) => this.datetimeConverter(time)); const datetimeEnd = end?.map((time) => this.datetimeConverter(time)); - const dayFilter = day ? { day: {in: day} } : null; - const beginFilter = begin ? { begin: {in: datetimeBegin} } : null; - const endFilter = end ? { end: {in: datetimeEnd} } : null; + const dayFilter = day ? { day: { in: day } } : null; + const beginFilter = begin ? { begin: { in: datetimeBegin } } : null; + const endFilter = end ? { end: { in: datetimeEnd } } : null; return { - AND: [ - dayFilter, - beginFilter, - endFilter - ] - } + AND: [dayFilter, beginFilter, endFilter], + }; } - public datetimeConverter (time: number) { + public datetimeConverter(time: number) { const hour = Math.floor(time / 2) + 8; const minute = (time % 2) * 30; return new Date(0, 0, 0, hour, minute, 0, 0); } -} \ No newline at end of file +} diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index a00802dd..d3d16b40 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; -import { PrismaService } from '../prisma.service'; import { ReviewDetails } from '../../common/schemaTypes/types'; +import { PrismaService } from '../prisma.service'; @Injectable() export class ReviewsRepository { diff --git a/src/prisma/repositories/semester.repository.ts b/src/prisma/repositories/semester.repository.ts index 25fa5ada..e5079a7d 100644 --- a/src/prisma/repositories/semester.repository.ts +++ b/src/prisma/repositories/semester.repository.ts @@ -1,24 +1,29 @@ -import { PrismaService } from "../prisma.service"; -import { Injectable } from "@nestjs/common"; -import { Prisma } from "@prisma/client"; +import { Injectable } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; +import { PrismaService } from '../prisma.service'; @Injectable() -export class SemesterRepository{ - constructor(private readonly prisma: PrismaService) { - } +export class SemesterRepository { + constructor(private readonly prisma: PrismaService) {} async existsSemester(year: number, semester: number): Promise { - const existsSemester: boolean = await this.prisma.subject_semester.findFirstOrThrow({ - where: { - year: year, - semester: semester - } - }).catch((e) => false) - .then((s)=> true); + const existsSemester: boolean = await this.prisma.subject_semester + .findFirstOrThrow({ + where: { + year: year, + semester: semester, + }, + }) + .catch((e) => false) + .then((s) => true); return existsSemester; } - async getSemesters(paginationAndSoring?: { orderBy?: Prisma.subject_semesterOrderByWithRelationInput[],skip?: number, take?: number }) { + async getSemesters(paginationAndSoring?: { + orderBy?: Prisma.subject_semesterOrderByWithRelationInput[]; + skip?: number; + take?: number; + }) { const orderBy = paginationAndSoring.orderBy; const skip = paginationAndSoring.skip; const take = paginationAndSoring.take; @@ -27,6 +32,6 @@ export class SemesterRepository{ orderBy: orderBy, skip: skip, take: take, - }) + }); } -} \ No newline at end of file +} diff --git a/src/prisma/repositories/timetable.repository.ts b/src/prisma/repositories/timetable.repository.ts index c1144202..a258ef0d 100644 --- a/src/prisma/repositories/timetable.repository.ts +++ b/src/prisma/repositories/timetable.repository.ts @@ -1,28 +1,34 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "../prisma.service"; -import { Prisma, PrismaClient, session_userprofile } from "@prisma/client"; +import { Injectable } from '@nestjs/common'; +import { Prisma, PrismaClient, session_userprofile } from '@prisma/client'; import { - lectureDetails, LectureDetails, TimeTableBasic, + TimeTableDetails, timeTableDetails, - TimeTableDetails -} from "../../common/schemaTypes/types"; -import session from "express-session"; +} from '../../common/schemaTypes/types'; +import { PrismaService } from '../prisma.service'; @Injectable() -export class TimetableRepository{ - constructor(private readonly prisma: PrismaService){} - - async getTimetables( user: session_userprofile, year?: number, semester?: number, paginationAndSorting?: {orderBy?: Prisma.timetable_timetableOrderByWithRelationInput[], skip?: number, take?: number}): Promise { +export class TimetableRepository { + constructor(private readonly prisma: PrismaService) {} + async getTimetables( + user: session_userprofile, + year?: number, + semester?: number, + paginationAndSorting?: { + orderBy?: Prisma.timetable_timetableOrderByWithRelationInput[]; + skip?: number; + take?: number; + }, + ): Promise { const skip = paginationAndSorting?.skip; const take = paginationAndSorting?.take; const orderBy = paginationAndSorting?.orderBy; return await this.prisma.timetable_timetable.findMany({ include: timeTableDetails.include, - where:{ + where: { year: year, semester: semester, user_id: user.id, @@ -30,16 +36,25 @@ export class TimetableRepository{ skip: skip, take: take, orderBy: orderBy, - }) + }); } - async getTimetableBasics(user: session_userprofile, year?: number, semester?: number, paginationAndSorting?: {orderBy: Prisma.timetable_timetableOrderByWithRelationInput, skip?: number, take?: number}): Promise{ + async getTimetableBasics( + user: session_userprofile, + year?: number, + semester?: number, + paginationAndSorting?: { + orderBy: Prisma.timetable_timetableOrderByWithRelationInput; + skip?: number; + take?: number; + }, + ): Promise { const skip = paginationAndSorting.skip; const take = paginationAndSorting.take; const orderBy = paginationAndSorting.orderBy; return await this.prisma.timetable_timetable.findMany({ - where:{ + where: { year: year, semester: semester, user_id: user.id, @@ -47,92 +62,98 @@ export class TimetableRepository{ skip: skip, take: take, orderBy: orderBy, - }) + }); } - async createTimetable(user: session_userprofile, year: number, semester: number, arrangeOrder: number, lectures: LectureDetails[]): Promise { + async createTimetable( + user: session_userprofile, + year: number, + semester: number, + arrangeOrder: number, + lectures: LectureDetails[], + ): Promise { return await this.prisma.timetable_timetable.create({ - data:{ + data: { user_id: user.id, year: year, semester: semester, arrange_order: arrangeOrder, timetable_timetable_lectures: { - createMany:{ - data: lectures.map(lecture => { + createMany: { + data: lectures.map((lecture) => { return { lecture_id: lecture.id, - } - }) - } - } + }; + }), + }, + }, }, - include:timeTableDetails.include, - }) + include: timeTableDetails.include, + }); } async getTimeTableBasicById(timeTableId: number) { return await this.prisma.timetable_timetable.findUnique({ where: { - id: timeTableId - } + id: timeTableId, + }, }); } async addLectureToTimetable(timeTableId: number, lectureId: number) { return await this.prisma.timetable_timetable_lectures.create({ - data:{ + data: { timetable_id: timeTableId, lecture_id: lectureId, - } - }) + }, + }); } - async getTimeTableById(timeTableId: number):Promise{ + async getTimeTableById(timeTableId: number): Promise { return await this.prisma.timetable_timetable.findUnique({ include: timeTableDetails.include, where: { - id: timeTableId - } + id: timeTableId, + }, }); } async removeLectureFromTimetable(timeTableId: number, lectureId: number) { return await this.prisma.timetable_timetable_lectures.delete({ - where:{ + where: { timetable_id_lecture_id: { timetable_id: timeTableId, lecture_id: lectureId, - } - } - }) + }, + }, + }); } - async deleteById(timetableId: number, tx?: PrismaClient ) { + async deleteById(timetableId: number, tx?: PrismaClient) { let prismaClient: PrismaClient = this.prisma; - if(tx){ + if (tx) { prismaClient = tx; } await prismaClient.timetable_timetable_lectures.deleteMany({ - where:{ - timetable_id: timetableId - } - }) + where: { + timetable_id: timetableId, + }, + }); return await prismaClient.timetable_timetable.delete({ - where:{ - id: timetableId - } - }) + where: { + id: timetableId, + }, + }); } async updateOrder(id: number, arrange_order: number) { return await this.prisma.timetable_timetable.update({ - where:{ - id: id + where: { + id: id, }, - data:{ - arrange_order: arrange_order - } - }) + data: { + arrange_order: arrange_order, + }, + }); } -} \ No newline at end of file +} diff --git a/src/prisma/repositories/user.repository.ts b/src/prisma/repositories/user.repository.ts index dcc1960d..13d3a543 100644 --- a/src/prisma/repositories/user.repository.ts +++ b/src/prisma/repositories/user.repository.ts @@ -1,27 +1,32 @@ -import { Injectable } from "@nestjs/common"; -import { PrismaService } from "../prisma.service"; -import { session_userprofile, Prisma} from "@prisma/client"; +import { Injectable } from '@nestjs/common'; +import { Prisma, session_userprofile } from '@prisma/client'; +import { PrismaService } from '../prisma.service'; @Injectable() -export class UserRepository{ - constructor(private readonly prisma: PrismaService){} +export class UserRepository { + constructor(private readonly prisma: PrismaService) {} - async findBySid(sid: string){ + async findBySid(sid: string) { return await this.prisma.session_userprofile.findFirst({ - where: { sid: sid } - }) + where: { sid: sid }, + }); } - async createUser(user: Prisma.session_userprofileCreateInput): Promise{ + async createUser( + user: Prisma.session_userprofileCreateInput, + ): Promise { return await this.prisma.session_userprofile.create({ - data: user - }) + data: user, + }); } - async updateUser(userId, user: Prisma.session_userprofileUpdateInput): Promise{ + async updateUser( + userId, + user: Prisma.session_userprofileUpdateInput, + ): Promise { return await this.prisma.session_userprofile.update({ data: user, - where: { id : userId } - }) + where: { id: userId }, + }); } -} \ No newline at end of file +} diff --git a/src/settings.ts b/src/settings.ts index 44c1f404..67977005 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,7 +1,6 @@ import dotenv from 'dotenv'; -import { dotEnvOptions } from './dotenv-options'; import { PrismaClientOptions } from 'prisma/prisma-client/runtime'; -import { JwtModuleOptions, JwtOptionsFactory } from '@nestjs/jwt'; +import { dotEnvOptions } from './dotenv-options'; dotenv.config(dotEnvOptions); console.log(`NODE_ENV environment: ${process.env.NODE_ENV}`); @@ -20,16 +19,16 @@ export default () => { const getCorsConfig = () => { const { NODE_ENV } = process.env; - if(NODE_ENV === 'local'){ + if (NODE_ENV === 'local') { return { - origin: "http://localhost:3000", - methods: "GET,HEAD,PUT,PATCH,POST,DELETE", + origin: 'http://localhost:3000', + methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', credentials: true, preflightContinue: false, - optionsSuccessStatus: 204 - } + optionsSuccessStatus: 204, + }; } -} +}; const getPrismaConfig = (): PrismaClientOptions => { return { @@ -39,10 +38,12 @@ const getPrismaConfig = (): PrismaClientOptions => { }, }, errorFormat: 'pretty', - log: [{ - emit: 'event', - level: 'query', - }], + log: [ + { + emit: 'event', + level: 'query', + }, + ], }; }; @@ -61,7 +62,7 @@ const getJwtConfig = () => { expiresIn: process.env.EXPIRES_IN, refreshExpiresIn: process.env.REFRESH_EXPIRES_IN, }, - } + }; }; const getSsoConfig = (): any => { @@ -70,4 +71,4 @@ const getSsoConfig = (): any => { ssoClientId: process.env.SSO_CLIENT_ID, ssoSecretKey: process.env.SSO_SECRET_KEY, }; -}; \ No newline at end of file +}; diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 7193e27f..846b1c28 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -1,6 +1,6 @@ -import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; -import request from "supertest"; +import { Test, TestingModule } from '@nestjs/testing'; +import request from 'supertest'; import { AppModule } from './../src/app.module'; describe('AppController (e2e)', () => { diff --git a/test/session/session.spec.ts b/test/session/session.spec.ts index 9b5dcf1b..4a1cbea9 100644 --- a/test/session/session.spec.ts +++ b/test/session/session.spec.ts @@ -1,10 +1,9 @@ -import { INestApplication } from "@nestjs/common"; -import { Test, TestingModule } from "@nestjs/testing"; -import { AppModule } from "../../src/app.module"; -import * as request from "supertest"; -import { PrismaService } from "../../src/prisma/prisma.service"; -import { UserService } from "../../src/modules/user/user.service"; -import axios from "axios"; +import { INestApplication } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import axios from 'axios'; +import { AppModule } from '../../src/app.module'; +import { UserService } from '../../src/modules/user/user.service'; +import { PrismaService } from '../../src/prisma/prisma.service'; describe('AppController (e2e)', () => { let app: INestApplication; @@ -22,29 +21,33 @@ describe('AppController (e2e)', () => { const prismaService = app.get(PrismaService); const userService = app.get(UserService); - const sidList = await axios.get('http://localhost:58000/session'); const BATCH_SIZE = 10; const BATCH_COUNT = Math.floor(sidList.data.length / BATCH_SIZE) + 1; - for(let i = 0; i { - const r = await axios.get(`http://localhost:58000/session/login?sid=${sid}`); + const r = await axios.get( + `http://localhost:58000/session/login?sid=${sid}`, + ); const { data } = r; - const user = prismaService.session_userprofile.findFirst({ - where: { sid }, - }).then((user) => { - try{ - return userService.getProfile(user); - }catch (e) { - console.log('error with sid: ', sid) - console.error(e); - } - }).then((profile)=> { - expect(profile).toEqual(data) - return profile - }) + const user = prismaService.session_userprofile + .findFirst({ + where: { sid }, + }) + .then((user) => { + try { + return userService.getProfile(user); + } catch (e) { + console.log('error with sid: ', sid); + console.error(e); + } + }) + .then((profile) => { + expect(profile).toEqual(data); + return profile; + }); return user; }); await Promise.all(promises); diff --git a/test/typeTest.ts b/test/typeTest.ts index 27a8bf5f..eed19f68 100644 --- a/test/typeTest.ts +++ b/test/typeTest.ts @@ -1,6 +1,6 @@ -import settings from "../src/settings"; -import { PrismaService } from "../src/prisma/prisma.service"; -import { Prisma, session_userprofile } from "@prisma/client"; +import { Prisma, session_userprofile } from '@prisma/client'; +import { PrismaService } from '../src/prisma/prisma.service'; +import settings from '../src/settings'; const ormSettings = settings().ormconfig(); @@ -26,11 +26,8 @@ async function findReviewByUserTest(user: session_userprofile) { subject_examtime: true, }, }, - } - }) + }, + }); } - - -type ReviewDetails = Prisma.PromiseReturnType - +type ReviewDetails = Prisma.PromiseReturnType; From 492dbfa91b4e18fb32970cc2a0b2d3f592038a4b Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 11 Sep 2023 21:58:46 +0900 Subject: [PATCH 105/250] Add: release branch to the target branch of github ci --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 64f47e99..bc952dae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main] + branches: [main, release] pull_request: - branches: [main] + branches: [main, release] env: NODE_VERSION: 18 From 74a2ba47a2d3d76db78dc6e1fb6316f545eb7094 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 11 Sep 2023 22:04:27 +0900 Subject: [PATCH 106/250] Add: include all files for formatting target and apply it --- .prettierrc | 2 +- .vscode/settings.json | 8 ++++---- docker/docker-compose.dev.yml | 6 +++--- package.json | 2 +- src/bootstrap/nest-cli.json | 2 +- tsconfig.build.json | 8 +++++++- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.prettierrc b/.prettierrc index dcb72794..a20502b7 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,4 @@ { "singleQuote": true, "trailingComma": "all" -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 9cb3a1aa..79ecc5ae 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "editor.codeActionsOnSave": { - "source.organizeImports": true - } -} \ No newline at end of file + "editor.codeActionsOnSave": { + "source.organizeImports": true + } +} diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index 9dc07ed5..b70b0920 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -7,7 +7,7 @@ services: image: mysql:5.7 restart: on-failure ports: - - "43306:3306" + - '43306:3306' environment: - MYSQL_ROOT_HOSTS=% - MYSQL_ROOT_PASSWORD=${OTLPLUS_DB_PASSWORD:-password} @@ -30,7 +30,7 @@ services: restart: always tty: true ports: - - "43000:3000" + - '43000:3000' volumes: - - "/etc/timezone:/etc/timezone:ro" + - '/etc/timezone:/etc/timezone:ro' working_dir: /var/www/otlplus-server diff --git a/package.json b/package.json index 0449cde3..8a3be446 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "scripts": { "prebuild": "rimraf dist", "build": "nest build", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "format": "prettier --write .", "format:check": "prettier --check .", "start:local": "NODE_ENV=local nest start --watch --config src/bootstrap/nest-cli.json", "start:dev": "NODE_ENV=dev nest start --config src/bootstrap/nest-cli.json", diff --git a/src/bootstrap/nest-cli.json b/src/bootstrap/nest-cli.json index 9f767d20..4ffcb8d8 100644 --- a/src/bootstrap/nest-cli.json +++ b/src/bootstrap/nest-cli.json @@ -2,4 +2,4 @@ "collection": "@nestjs/schematics", "sourceRoot": "src", "entryFile": "src/bootstrap/bootstrap" -} \ No newline at end of file +} diff --git a/tsconfig.build.json b/tsconfig.build.json index a576a685..462d24d5 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -1,4 +1,10 @@ { "extends": "./tsconfig.json", - "exclude": ["node_modules", "test", "dist", "**/*spec.ts","src/prisma/migrations"] + "exclude": [ + "node_modules", + "test", + "dist", + "**/*spec.ts", + "src/prisma/migrations" + ] } From 084328b45fdbe2f3394f9a496cf3ee94186192ac Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 11 Sep 2023 23:25:00 +0900 Subject: [PATCH 107/250] Add: strict true --- tsconfig.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 2a384126..defa8007 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,10 +14,10 @@ "baseUrl": "./", "incremental": true, "skipLibCheck": true, - "strictNullChecks": false, - "noImplicitAny": false, - "strictBindCallApply": false, - "forceConsistentCasingInFileNames": false, + "strict": true, + "alwaysStrict": true, + "noImplicitAny": true, + "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": false } } From 0c3fdda39c6afd69aa0ce4b5bca3b8cb2c4791fb Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 13 Sep 2023 15:39:16 +0900 Subject: [PATCH 108/250] Fix: strict error in dto of sso --- src/common/interfaces/dto/auth/sso.dto.ts | 106 +++++++++++++++------- 1 file changed, 75 insertions(+), 31 deletions(-) diff --git a/src/common/interfaces/dto/auth/sso.dto.ts b/src/common/interfaces/dto/auth/sso.dto.ts index bfe9a943..d2a4a49e 100644 --- a/src/common/interfaces/dto/auth/sso.dto.ts +++ b/src/common/interfaces/dto/auth/sso.dto.ts @@ -1,36 +1,80 @@ export class SSOUser { - uid: string; // 사용자가 SSO 전체에서 고유하게 받은 ID입니다. 30자를 초과하지 않습니다. - sid: string; // RP에서 사용자를 식별할 수 있는 고유한 값입니다. - first_name: string; // 사용자의 이름입니다. 30자를 초과하지 않습니다. - last_name: string; // 사용자의 성입니다. 30자를 초과하지 않습니다. - email: string; // 사용자의 이메일 주소입니다. 인증된 이메일인지는 보장하지 않으며, 254자를 초과하지 않습니다. - gender: string; // 사용자의 성별입니다. *M (남성), *F (여성), *H (숨김), *E (기타) 또는 30자를 초과하지 않는 성별을 나타내는 문자열입니다. - birthday?: Date; // 사용자의 생일입니다. YYYY-MM-DD 형식의 날짜 또는 빈 문자열 값입니다. - point: number; // 사용자의 포인트를 나타냅니다. 개발 전용 서비스와 실제 포인트 값은 분리되어 적용됩니다. - flags: string[]; // 사용자가 특별한 권한이 있는 경우 이를 표시합니다. 사용자가 테스트 기능이 있는 경우 TEST 문자열이, SPARCS 회원인 경우 SPARCS 문자열이 포함되어 있습니다. - facebook_id: string; // 사용자의 페이스북 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. - twitter_id: string; // 사용자의 트위터 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. - kaist_id: string; // 사용자의 KAIST 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. - kaist_info: KaistInfo; // 사용자의 KAIST Portal 데이터입니다. ku_std_no, kaist_uid, ku_psft_user_status_kor, employeeType, ku_person_type, ku_kaist_org_id, ku_psft_user_status, ku_acad_prog_code, ku_born_date, ku_person_type_kor, sn, mail, displayname, givenname, ku_sex, ku_kname의 데이터가 포함되어 있습니다. - kaist_info_time?: Date; // kaist_info를 업데이트한 날짜입니다. YYYY-MM-DD 형식의 날짜 또는 빈 문자열 값입니다. - sparcs_id: string; // 사용자의 SPARCS ID입니다. SPARCS 회원이 아닌 경우 빈 문자열 값입니다. + /** 사용자가 SSO 전체에서 고유하게 받은 ID입니다. 30자를 초과하지 않습니다. */ + uid!: string; + + /** RP에서 사용자를 식별할 수 있는 고유한 값입니다. */ + sid!: string; + + /** 사용자의 이름입니다. 30자를 초과하지 않습니다. */ + first_name!: string; + + /** 사용자의 성입니다. 30자를 초과하지 않습니다. */ + last_name!: string; + + /** 사용자의 이메일 주소입니다. 인증된 이메일인지는 보장하지 않으며, 254자를 초과하지 않습니다. */ + email!: string; + + /** 사용자의 성별입니다. *M (남성), *F (여성), *H (숨김), *E (기타) 또는 30자를 초과하지 않는 성별을 나타내는 문자열입니다. */ + gender!: string; + + /** 사용자의 생일입니다. YYYY-MM-DD 형식의 날짜 또는 빈 문자열 값입니다. */ + birthday?: Date; + + /** 사용자의 포인트를 나타냅니다. 개발 전용 서비스와 실제 포인트 값은 분리되어 적용됩니다. */ + point!: number; + + /** 사용자가 특별한 권한이 있는 경우 이를 표시합니다. 사용자가 테스트 기능이 있는 경우 TEST 문자열이, SPARCS 회원인 경우 SPARCS 문자열이 포함되어 있습니다. */ + flags!: string[]; + + /** 사용자의 페이스북 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. */ + facebook_id!: string; + + /** 사용자의 트위터 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. */ + twitter_id!: string; + + /** 사용자의 KAIST 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. */ + kaist_id!: string; + + /** 사용자의 KAIST Portal 데이터입니다.*/ + kaist_info!: KaistInfo; + + /** kaist_info를 업데이트한 날짜입니다. YYYY-MM-DD 형식의 날짜 또는 빈 문자열 값입니다. */ + kaist_info_time?: Date; + + /** 사용자의 SPARCS ID입니다. SPARCS 회원이 아닌 경우 빈 문자열 값입니다. */ + sparcs_id!: string; } export class KaistInfo { - ku_std_no: string; - kaist_uid: string; - ku_psft_user_status_kor: string; - employeeType: string; - ku_person_type: string; - ku_kaist_org_id: string; - ku_psft_user_status: string; - ku_acad_prog_code: string; - ku_born_date: string; - ku_person_type_kor: string; - sn: string; - mail: string; - displayname: string; - givenname: string; - ku_sex: string; - ku_kname: string; + ku_std_no!: string; + + kaist_uid!: string; + + ku_psft_user_status_kor!: string; + + employeeType!: string; + + ku_person_type!: string; + + ku_kaist_org_id!: string; + + ku_psft_user_status!: string; + + ku_acad_prog_code!: string; + + ku_born_date!: string; + + ku_person_type_kor!: string; + + sn!: string; + + mail!: string; + + displayname!: string; + + givenname!: string; + + ku_sex!: string; + + ku_kname!: string; } From 4831114c10400d9a64e75d79fcbb96db234573df Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 13 Sep 2023 16:05:20 +0900 Subject: [PATCH 109/250] Fix: strict error in serializer of professor --- src/common/interfaces/serializer/professor.serializer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/interfaces/serializer/professor.serializer.ts b/src/common/interfaces/serializer/professor.serializer.ts index 0dc1f8dc..76f4ff60 100644 --- a/src/common/interfaces/serializer/professor.serializer.ts +++ b/src/common/interfaces/serializer/professor.serializer.ts @@ -8,7 +8,7 @@ export const toJsonProfessor = ( const result = professors.map((professor) => { return { name: professor.professor_name, - name_en: professor.professor_name_en, + name_en: professor.professor_name_en ?? '', professor_id: professor.professor_id, review_total_weight: professor.review_total_weight, }; From 90ac52edb53c42a6812684dea2e81e0923b578ed Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Sat, 16 Sep 2023 17:33:32 +0900 Subject: [PATCH 110/250] fix: add ! to fix ts(2564) --- src/common/interfaces/dto/auth/sso.dto.ts | 58 +++++++++---------- .../dto/reviews/review.response.dto.ts | 20 +++---- .../dto/timetable/timetable.request.dto.ts | 8 +-- .../dto/timetable/timetable.response.dto.ts | 6 +- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/common/interfaces/dto/auth/sso.dto.ts b/src/common/interfaces/dto/auth/sso.dto.ts index bfe9a943..d796d68a 100644 --- a/src/common/interfaces/dto/auth/sso.dto.ts +++ b/src/common/interfaces/dto/auth/sso.dto.ts @@ -1,36 +1,36 @@ export class SSOUser { - uid: string; // 사용자가 SSO 전체에서 고유하게 받은 ID입니다. 30자를 초과하지 않습니다. - sid: string; // RP에서 사용자를 식별할 수 있는 고유한 값입니다. - first_name: string; // 사용자의 이름입니다. 30자를 초과하지 않습니다. - last_name: string; // 사용자의 성입니다. 30자를 초과하지 않습니다. - email: string; // 사용자의 이메일 주소입니다. 인증된 이메일인지는 보장하지 않으며, 254자를 초과하지 않습니다. - gender: string; // 사용자의 성별입니다. *M (남성), *F (여성), *H (숨김), *E (기타) 또는 30자를 초과하지 않는 성별을 나타내는 문자열입니다. + uid!: string; // 사용자가 SSO 전체에서 고유하게 받은 ID입니다. 30자를 초과하지 않습니다. + sid!: string; // RP에서 사용자를 식별할 수 있는 고유한 값입니다. + first_name!: string; // 사용자의 이름입니다. 30자를 초과하지 않습니다. + last_name!: string; // 사용자의 성입니다. 30자를 초과하지 않습니다. + email!: string; // 사용자의 이메일 주소입니다. 인증된 이메일인지는 보장하지 않으며, 254자를 초과하지 않습니다. + gender!: string; // 사용자의 성별입니다. *M (남성), *F (여성), *H (숨김), *E (기타) 또는 30자를 초과하지 않는 성별을 나타내는 문자열입니다. birthday?: Date; // 사용자의 생일입니다. YYYY-MM-DD 형식의 날짜 또는 빈 문자열 값입니다. - point: number; // 사용자의 포인트를 나타냅니다. 개발 전용 서비스와 실제 포인트 값은 분리되어 적용됩니다. - flags: string[]; // 사용자가 특별한 권한이 있는 경우 이를 표시합니다. 사용자가 테스트 기능이 있는 경우 TEST 문자열이, SPARCS 회원인 경우 SPARCS 문자열이 포함되어 있습니다. - facebook_id: string; // 사용자의 페이스북 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. - twitter_id: string; // 사용자의 트위터 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. - kaist_id: string; // 사용자의 KAIST 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. - kaist_info: KaistInfo; // 사용자의 KAIST Portal 데이터입니다. ku_std_no, kaist_uid, ku_psft_user_status_kor, employeeType, ku_person_type, ku_kaist_org_id, ku_psft_user_status, ku_acad_prog_code, ku_born_date, ku_person_type_kor, sn, mail, displayname, givenname, ku_sex, ku_kname의 데이터가 포함되어 있습니다. + point!: number; // 사용자의 포인트를 나타냅니다. 개발 전용 서비스와 실제 포인트 값은 분리되어 적용됩니다. + flags!: string[]; // 사용자가 특별한 권한이 있는 경우 이를 표시합니다. 사용자가 테스트 기능이 있는 경우 TEST 문자열이, SPARCS 회원인 경우 SPARCS 문자열이 포함되어 있습니다. + facebook_id!: string; // 사용자의 페이스북 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. + twitter_id!: string; // 사용자의 트위터 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. + kaist_id!: string; // 사용자의 KAIST 고유 ID입니다. 연동하지 않았을 경우 빈 문자열입니다. + kaist_info!: KaistInfo; // 사용자의 KAIST Portal 데이터입니다. ku_std_no, kaist_uid, ku_psft_user_status_kor, employeeType, ku_person_type, ku_kaist_org_id, ku_psft_user_status, ku_acad_prog_code, ku_born_date, ku_person_type_kor, sn, mail, displayname, givenname, ku_sex, ku_kname의 데이터가 포함되어 있습니다. kaist_info_time?: Date; // kaist_info를 업데이트한 날짜입니다. YYYY-MM-DD 형식의 날짜 또는 빈 문자열 값입니다. - sparcs_id: string; // 사용자의 SPARCS ID입니다. SPARCS 회원이 아닌 경우 빈 문자열 값입니다. + sparcs_id!: string; // 사용자의 SPARCS ID입니다. SPARCS 회원이 아닌 경우 빈 문자열 값입니다. } export class KaistInfo { - ku_std_no: string; - kaist_uid: string; - ku_psft_user_status_kor: string; - employeeType: string; - ku_person_type: string; - ku_kaist_org_id: string; - ku_psft_user_status: string; - ku_acad_prog_code: string; - ku_born_date: string; - ku_person_type_kor: string; - sn: string; - mail: string; - displayname: string; - givenname: string; - ku_sex: string; - ku_kname: string; + ku_std_no!: string; + kaist_uid!: string; + ku_psft_user_status_kor!: string; + employeeType!: string; + ku_person_type!: string; + ku_kaist_org_id!: string; + ku_psft_user_status!: string; + ku_acad_prog_code!: string; + ku_born_date!: string; + ku_person_type_kor!: string; + sn!: string; + mail!: string; + displayname!: string; + givenname!: string; + ku_sex!: string; + ku_kname!: string; } diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts index 50bc2500..5381956c 100644 --- a/src/common/interfaces/dto/reviews/review.response.dto.ts +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -2,14 +2,14 @@ import { CourseResponseDto } from '../course/course.response.dto'; import { LectureResponseDto } from '../lecture/lecture.response.dto'; export class ReviewResponseDto { - id: number; - course: CourseResponseDto; - lecture: LectureResponseDto; - content: string; - like: number; - is_deleted: number; - grade: number; - load: number; - speech: number; - userspecific_is_liked: boolean; + id!: number; + course!: CourseResponseDto; + lecture!: LectureResponseDto; + content!: string; + like!: number; + is_deleted!: number; + grade!: number; + load!: number; + speech!: number; + userspecific_is_liked!: boolean; } diff --git a/src/common/interfaces/dto/timetable/timetable.request.dto.ts b/src/common/interfaces/dto/timetable/timetable.request.dto.ts index ff5d64da..b5206dc1 100644 --- a/src/common/interfaces/dto/timetable/timetable.request.dto.ts +++ b/src/common/interfaces/dto/timetable/timetable.request.dto.ts @@ -38,18 +38,18 @@ export class TimetableQueryDto { export class TimetableCreateDto { @IsNumber() - year: number; + year!: number; @IsNumber() - semester: number; + semester!: number; @IsArray() @IsNumber({}, { each: true }) - lectures: number[]; + lectures!: number[]; } export class AddLectureDto { @IsNumber() @Type(() => Number) - lecture: number; + lecture!: number; } diff --git a/src/common/interfaces/dto/timetable/timetable.response.dto.ts b/src/common/interfaces/dto/timetable/timetable.response.dto.ts index 77e46682..a9a577c6 100644 --- a/src/common/interfaces/dto/timetable/timetable.response.dto.ts +++ b/src/common/interfaces/dto/timetable/timetable.response.dto.ts @@ -1,7 +1,7 @@ import { LectureResponseDto } from '../lecture/lecture.response.dto'; export class TimetableResponseDto { - id: number; - lectures: LectureResponseDto[]; - arrange_order: number; + id!: number; + lectures!: LectureResponseDto[]; + arrange_order!: number; } From a5eb9ebc71c0eaa318cacc0ae3e266e0a856647a Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Sat, 16 Sep 2023 17:44:49 +0900 Subject: [PATCH 111/250] fix: unwrap function without writing type --- .../interfaces/dto/lecture/lecture.request.dto.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/interfaces/dto/lecture/lecture.request.dto.ts b/src/common/interfaces/dto/lecture/lecture.request.dto.ts index 22c9ec15..702f2c6a 100644 --- a/src/common/interfaces/dto/lecture/lecture.request.dto.ts +++ b/src/common/interfaces/dto/lecture/lecture.request.dto.ts @@ -5,35 +5,35 @@ import { CourseQueryDto } from '../course/course.request.dto'; export class LectureQueryDto extends CourseQueryDto { @IsOptional() @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) - @Transform(({ value }) => value.map((v) => parseInt(v))) + @Transform(({ value }) => value.map(parseInt)) @IsArray() @IsNumber({}, { each: true }) year?: number[]; @IsOptional() @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) - @Transform(({ value }) => value.map((v) => parseInt(v))) + @Transform(({ value }) => value.map(parseInt)) @IsArray() @IsNumber({}, { each: true }) semester?: number[]; @IsOptional() @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) - @Transform(({ value }) => value.map((v) => parseInt(v))) + @Transform(({ value }) => value.map(parseInt)) @IsArray() @IsNumber({}, { each: true }) day?: number[]; @IsOptional() @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) - @Transform(({ value }) => value.map((v) => parseInt(v))) + @Transform(({ value }) => value.map(parseInt)) @IsArray() @IsNumber({}, { each: true }) begin?: number[]; @IsOptional() @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) - @Transform(({ value }) => value.map((v) => parseInt(v))) + @Transform(({ value }) => value.map(parseInt)) @IsArray() @IsNumber({}, { each: true }) end?: number[]; From 159eeeefe9c5242565577a5e03b2f3bae88e5655 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Sat, 16 Sep 2023 18:26:34 +0900 Subject: [PATCH 112/250] fix: handle when course is null --- src/prisma/repositories/course.repository.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 79ca29e5..67484e03 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -81,9 +81,9 @@ export class CourseRepository { id: id, }, }); - const filteredLecture = course.lecture.filter( - (lecture) => !lecture.deleted, - ); + const filteredLecture = course + ? course.lecture.filter((lecture) => !lecture.deleted) + : []; const order = query.order ? query.order : ['year', 'semester', 'class_no']; return applyOrder(filteredLecture, order); } From 69485ce19800581ca0765fca4340ad1ee4087ca9 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Sat, 16 Sep 2023 19:31:58 +0900 Subject: [PATCH 113/250] refactor: change util functions --- src/common/utils/search.utils.ts | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index a6a240b2..1cf2c62f 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -1,23 +1,18 @@ import { SemesterRepository } from '../../prisma/repositories/semester.repository'; -export function applyOrder(query: T[], order_opt: string[]) { +export function applyOrder(query: T[], order_opt: (keyof T)[]): T[] { if (order_opt.length == 0) { return query; - } else { - return ( - query?.sort((a: T, b: T) => { - for (let i = 0; i < order_opt.length; i++) { - const order = order_opt[i]; - if (a[order] > b[order]) { - return 1; - } else if (a[order] < b[order]) { - return -1; - } - } - return 0; - }) ?? [] - ); } + return query.sort((a: T, b: T): 1 | 0 | -1 => { + for (const order of order_opt) { + if (a[order] === b[order]) { + continue; + } + return a[order] > b[order] ? 1 : -1; + } + return 0; + }); } export function applyOffset(query: T[], offset: number) { @@ -46,7 +41,10 @@ export type orderFilterType = { [key: string]: orderFilterType | string; }; -export function orderFilter(order: string[]) { +export function orderFilter(order: string[] | undefined): orderFilterType[] { + if (order == undefined) { + return []; + } const orderFilter: orderFilterType[] = []; order.forEach((orderList) => { const orderDict: { [key: string]: string } = {}; From fba8feba6ce099358906408bce9a7a26fac0b2e8 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Mon, 18 Sep 2023 23:37:19 +0900 Subject: [PATCH 114/250] Fix: strict error in auth module --- src/common/interfaces/structures/IAuth.ts | 15 +++++++++++++++ src/common/interfaces/structures/index.ts | 1 + src/modules/auth/auth.controller.ts | 22 +++++++++++----------- src/modules/auth/auth.service.ts | 2 +- src/modules/auth/guard/mock-auth-guard.ts | 18 +++++++++++++++--- 5 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 src/common/interfaces/structures/IAuth.ts create mode 100644 src/common/interfaces/structures/index.ts diff --git a/src/common/interfaces/structures/IAuth.ts b/src/common/interfaces/structures/IAuth.ts new file mode 100644 index 00000000..7936c96f --- /dev/null +++ b/src/common/interfaces/structures/IAuth.ts @@ -0,0 +1,15 @@ +import { Request, Response } from 'express'; + +export namespace IAuth { + export type IRequest = Request & IRequestExtra; + + export interface IRequestExtra { + session: { + next: string; + + sso_state: string; + }; + } + + export interface IResponse extends Response {} +} diff --git a/src/common/interfaces/structures/index.ts b/src/common/interfaces/structures/index.ts new file mode 100644 index 00000000..c1a5d427 --- /dev/null +++ b/src/common/interfaces/structures/index.ts @@ -0,0 +1 @@ +export * from './IAuth'; diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 284ec896..d12b10b6 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Query, Req, Res, Session } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; -import { Request, Response } from 'express'; -import { GetUser } from '../../common/decorators/get-user.decorator'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { IAuth } from 'src/common/interfaces/structures'; import { Public } from '../../common/decorators/skip-auth.decorator'; import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; import { ProfileDto } from '../../common/interfaces/dto/user/user.response.dto'; @@ -30,10 +30,10 @@ export class AuthController { @Public() @Get('login') user_login( - @Query('next') next, - @Query('social_login') social_login, - @Req() req, - @Res() res, + @Query('next') next: string, + @Query('social_login') social_login: string, + @Req() req: IAuth.IRequest, + @Res() res: IAuth.IResponse, ) { if (req.user) { return res.redirect(next ?? '/'); @@ -53,7 +53,7 @@ export class AuthController { @Query('state') state: string, @Query('code') code: string, @Session() session: Record, - @Res() response: Response, + @Res() response: IAuth.IResponse, ) { const stateBefore = session['sso_state']; if (!stateBefore || stateBefore != state) { @@ -93,16 +93,16 @@ export class AuthController { @Public() @Get('/') - async home(@Req() req, @Res() res) { + async home(@Req() req: IAuth.IRequest, @Res() res: IAuth.IResponse) { return res.redirect('/session/login'); } @Public() @Get('logout') async logout( - @Req() req: Request, - @Res() res: Response, - @Query('next') next, + @Req() req: IAuth.IRequest, + @Res() res: IAuth.IResponse, + @Query('next') next: string, @GetUser() user: session_userprofile, ) { const webURL = process.env.WEB_URL; diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 5908c825..ed0fa7cc 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -125,7 +125,7 @@ export class AuthService { } async updateUser( - userId, + userId: number, user: Prisma.session_userprofileUpdateInput, ): Promise { return await this.userRepository.updateUser(userId, user); diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index 0f5b4f08..fe943421 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -2,6 +2,7 @@ import { CanActivate, ExecutionContext, Injectable, + NotFoundException, UnauthorizedException, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; @@ -26,10 +27,15 @@ export class MockAuthGuard implements CanActivate { const sid = request.cookies['auth-cookie']; if (sid) { const user = await this.authService.findBySid(sid); + if (!user) { + throw new NotFoundException('user is not found'); + } + request['user'] = user; return this.determineAuth(context, true); } else { const accessToken = this.extractTokenFromCookie(request, 'accessToken'); + try { if (!accessToken) throw new Error('jwt expired'); const payload = await this.jwtService.verify(accessToken, { @@ -38,7 +44,7 @@ export class MockAuthGuard implements CanActivate { const user = this.authService.findBySid(payload.sid); request['user'] = user; return this.determineAuth(context, true); - } catch (e) { + } catch (e: any) { if (e.message === 'jwt expired') { try { const refreshToken = this.extractTokenFromCookie( @@ -50,10 +56,16 @@ export class MockAuthGuard implements CanActivate { secret: settings().getJwtConfig().secret, }); const user = await this.authService.findBySid(payload.sid); - if (await bcrypt.compare(refreshToken, user.refresh_token)) { + if (!user) { + throw new NotFoundException('user is not found'); + } + if ( + user.refresh_token && + (await bcrypt.compare(refreshToken, user.refresh_token)) + ) { const { accessToken, ...accessTokenOptions } = this.authService.getCookieWithAccessToken(payload.sid); - request.res.cookie( + request.res?.cookie( 'accessToken', accessToken, accessTokenOptions, From 55bd2dc381fb9979263afa17504c8ab77ed20637 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Tue, 19 Sep 2023 00:04:05 +0900 Subject: [PATCH 115/250] Fix: strict error in jwt --- src/common/interfaces/structures/IAuth.ts | 4 ++++ src/modules/auth/strategy/jwt-cookie.strategy.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/common/interfaces/structures/IAuth.ts b/src/common/interfaces/structures/IAuth.ts index 7936c96f..8123dbfc 100644 --- a/src/common/interfaces/structures/IAuth.ts +++ b/src/common/interfaces/structures/IAuth.ts @@ -12,4 +12,8 @@ export namespace IAuth { } export interface IResponse extends Response {} + + export interface IJwtPayload { + sid: string; + } } diff --git a/src/modules/auth/strategy/jwt-cookie.strategy.ts b/src/modules/auth/strategy/jwt-cookie.strategy.ts index b3e238bf..adef7c76 100644 --- a/src/modules/auth/strategy/jwt-cookie.strategy.ts +++ b/src/modules/auth/strategy/jwt-cookie.strategy.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; +import { IAuth } from 'src/common/interfaces/structures'; import settings from '../../../settings'; import { AuthService } from '../auth.service'; @@ -27,7 +28,7 @@ export class JwtCookieStrategy extends PassportStrategy( }); } - async validate(payload) { + async validate(payload: IAuth.IJwtPayload) { return this.authService.findBySid(payload.sid); } } From 4a6a20e22b852b1d9d71a53a66962974d593b6bc Mon Sep 17 00:00:00 2001 From: ddungiii Date: Tue, 19 Sep 2023 01:25:09 +0900 Subject: [PATCH 116/250] Fix: strict error in review --- .../dto/reviews/review.response.dto.ts | 29 ++++++++++++------- .../dto/reviews/reviews.request.dto.ts | 10 +++---- src/modules/reviews/reviews.controller.ts | 2 +- src/modules/reviews/reviews.service.ts | 20 +++++++------ src/prisma/repositories/review.repository.ts | 29 ++++++++++--------- 5 files changed, 51 insertions(+), 39 deletions(-) diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts index 50bc2500..0f24dcc6 100644 --- a/src/common/interfaces/dto/reviews/review.response.dto.ts +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -2,14 +2,23 @@ import { CourseResponseDto } from '../course/course.response.dto'; import { LectureResponseDto } from '../lecture/lecture.response.dto'; export class ReviewResponseDto { - id: number; - course: CourseResponseDto; - lecture: LectureResponseDto; - content: string; - like: number; - is_deleted: number; - grade: number; - load: number; - speech: number; - userspecific_is_liked: boolean; + id!: number; + + course!: CourseResponseDto; + + lecture!: LectureResponseDto; + + content!: string; + + like!: number; + + is_deleted!: number; + + grade!: number; + + load!: number; + + speech!: number; + + userspecific_is_liked!: boolean; } diff --git a/src/common/interfaces/dto/reviews/reviews.request.dto.ts b/src/common/interfaces/dto/reviews/reviews.request.dto.ts index c3896389..be78f35d 100644 --- a/src/common/interfaces/dto/reviews/reviews.request.dto.ts +++ b/src/common/interfaces/dto/reviews/reviews.request.dto.ts @@ -51,13 +51,13 @@ export class ReviewCreateDto { @IsString() @IsNotEmpty() @Validate(StringStripLength) - content: string; + content!: string; @ApiProperty() @IsNumber() @IsNotEmpty() @Type(() => Number) - lecture: number; + lecture!: number; @ApiProperty() @IsNumber() @@ -65,7 +65,7 @@ export class ReviewCreateDto { @Min(1) @Max(5) @Type(() => Number) - grade: number; + grade!: number; @ApiProperty() @IsNumber() @@ -73,7 +73,7 @@ export class ReviewCreateDto { @Min(1) @Max(5) @Type(() => Number) - load: number; + load!: number; @ApiProperty() @IsNumber() @@ -81,7 +81,7 @@ export class ReviewCreateDto { @Min(1) @Max(5) @Type(() => Number) - speech: number; + speech!: number; } export class ReviewUpdateDto extends PartialType( diff --git a/src/modules/reviews/reviews.controller.ts b/src/modules/reviews/reviews.controller.ts index b6e56296..cdac839a 100644 --- a/src/modules/reviews/reviews.controller.ts +++ b/src/modules/reviews/reviews.controller.ts @@ -24,7 +24,7 @@ export class ReviewsController { @Get() async getReviews( @Query() reviewsParam: ReviewQueryDto, - @GetUser() user, + @GetUser() user: session_userprofile, ): Promise< (ReviewResponseDto & { userspecific_is_liked: boolean })[] | number > { diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 904bdf2c..2ce11495 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -45,11 +45,11 @@ export class ReviewsService { const MAX_LIMIT = 50; const DEFAULT_ORDER = ['-written_datetime', '-id']; const reviews = await this.reviewsRepository.getReviews( - reviewsParam.lecture_year, - reviewsParam.lecture_semester, reviewsParam.order ?? DEFAULT_ORDER, reviewsParam.offset ?? 0, reviewsParam.limit ?? MAX_LIMIT, + reviewsParam.lecture_year, + reviewsParam.lecture_semester, ); return await Promise.all( reviews.map(async (review) => { @@ -72,8 +72,8 @@ export class ReviewsService { } async getReviewsCount( - lectureYear: number, - lectureSemester: number, + lectureYear?: number, + lectureSemester?: number, ): Promise { return await this.reviewsRepository.getReviewsCount( lectureYear, @@ -122,8 +122,10 @@ export class ReviewsService { user: session_userprofile, reviewBody: ReviewUpdateDto, ): Promise { + const { content, grade, load, speech } = reviewBody; + const review = await this.reviewsRepository.getReviewById(reviewId); - if (review == undefined) throw new HttpException("Can't find review", 404); + if (!review) throw new HttpException("Can't find review", 404); if (review.writer_id !== user.id) throw new HttpException("Can't find user", 401); if (review.is_deleted) @@ -133,10 +135,10 @@ export class ReviewsService { ); const updateReview = await this.reviewsRepository.updateReview( review.id, - reviewBody.content, - reviewBody.grade, - reviewBody.load, - reviewBody.speech, + content, + grade, + load, + speech, ); const result = toJsonReview(updateReview); if (user) { diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index d3d16b40..0bfafac6 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -33,8 +33,8 @@ export class ReviewsRepository { return reviews; } - async getReviewById(reviewId: number): Promise { - return await this.prisma.review_review.findUnique({ + async getReviewById(reviewId: number): Promise { + const review = await this.prisma.review_review.findUnique({ where: { id: reviewId }, include: { course: { @@ -56,13 +56,14 @@ export class ReviewsRepository { review_reviewvote: true, }, }); + return review ? review : null; } public async getReviews( - lecture_year: number, - lecture_semester: number, order: string[], offset: number, limit: number, + lecture_year?: number, + lecture_semester?: number, ): Promise { let lectureFilter: object = {}; const orderFilter: { [key: string]: string }[] = []; @@ -139,8 +140,8 @@ export class ReviewsRepository { })); } public async getReviewsCount( - lectureYear: number, - lectureSemester: number, + lectureYear?: number, + lectureSemester?: number, ): Promise { let lectureFilter: object = {}; if (lectureYear) { @@ -222,20 +223,20 @@ export class ReviewsRepository { async updateReview( reviewId: number, - content: string, - grade: number, - load: number, - speech: number, + content?: string, + grade?: number, + load?: number, + speech?: number, ): Promise { return await this.prisma.review_review.update({ where: { id: reviewId, }, data: { - content: content, - grade: grade, - load: load, - speech: speech, + content, + grade, + load, + speech, }, include: { course: { From dabf43b705b68445ef8eaa8bf2af5bbba35c166f Mon Sep 17 00:00:00 2001 From: ddungiii Date: Tue, 19 Sep 2023 01:26:46 +0900 Subject: [PATCH 117/250] Fix: strict error in department --- .../interfaces/serializer/department.serializer.ts | 14 ++++++-------- src/prisma/repositories/department.repository.ts | 10 ++++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/common/interfaces/serializer/department.serializer.ts b/src/common/interfaces/serializer/department.serializer.ts index ad27dd40..576cdcb9 100644 --- a/src/common/interfaces/serializer/department.serializer.ts +++ b/src/common/interfaces/serializer/department.serializer.ts @@ -5,12 +5,10 @@ export const toJsonDepartment = ( department: subject_department, nested = false, ): DepartmentResponseDto => { - return department - ? { - id: department.id, - name: department.name, - name_en: department.name_en, - code: department.code, - } - : null; + return { + id: department.id, + name: department.name, + name_en: department.name_en ?? '', + code: department.code, + }; }; diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index 77382d5b..36c82b5f 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -8,13 +8,15 @@ export class DepartmentRepository { async getDepartmentOfUser( user: session_userprofile, - ): Promise { + ): Promise { const departmentId = user.department_id; - if (!departmentId) return null; - const department = await this.prisma.subject_department.findUnique({ + if (!departmentId) { + return null; + } + + return this.prisma.subject_department.findUnique({ where: { id: departmentId }, }); - return department; } async getFavoriteDepartments( From aeba0bdb797a61d57bbdc0413b6574523bad63b4 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Tue, 19 Sep 2023 21:56:53 +0900 Subject: [PATCH 118/250] Fix: strict error in user --- .../interfaces/dto/user/user.response.dto.ts | 8 +-- src/modules/user/user.service.ts | 66 ++++++++----------- src/prisma/repositories/lecture.repository.ts | 7 +- src/prisma/repositories/user.repository.ts | 2 +- 4 files changed, 32 insertions(+), 51 deletions(-) diff --git a/src/common/interfaces/dto/user/user.response.dto.ts b/src/common/interfaces/dto/user/user.response.dto.ts index 60191454..271845f7 100644 --- a/src/common/interfaces/dto/user/user.response.dto.ts +++ b/src/common/interfaces/dto/user/user.response.dto.ts @@ -1,5 +1,5 @@ -import { session_userprofile_taken_lectures } from '@prisma/client'; import { DepartmentResponseDto } from '../department/department.response.dto'; +import { LectureResponseDto } from '../lecture/lecture.response.dto'; import { ReviewResponseDto } from '../reviews/review.response.dto'; export interface ProfileDto { @@ -8,11 +8,11 @@ export interface ProfileDto { student_id: string; firstName: string; lastName: string; - department: DepartmentResponseDto; + department: DepartmentResponseDto | null; majors: DepartmentResponseDto[]; departments: DepartmentResponseDto[]; favorite_departments: DepartmentResponseDto[]; - review_writable_lectures: session_userprofile_taken_lectures[]; - my_timetable_lectures: session_userprofile_taken_lectures[]; + review_writable_lectures: LectureResponseDto[]; + my_timetable_lectures: LectureResponseDto[]; reviews: ReviewResponseDto[]; } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 7674d2d3..5f883855 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -1,15 +1,14 @@ import { Injectable, NotFoundException } from '@nestjs/common'; -import { session_userprofile, subject_department } from '@prisma/client'; +import { session_userprofile } from '@prisma/client'; import { CourseResponseDtoNested } from 'src/common/interfaces/dto/course/course.response.dto'; import { UserTakenCoursesQueryDto } from 'src/common/interfaces/dto/user/user.request.dto'; +import { ProfileDto } from 'src/common/interfaces/dto/user/user.response.dto'; import { toJsonCourse } from 'src/common/interfaces/serializer/course.serializer'; import { ResearchLecture } from '../../common/interfaces/constants/lecture'; import { toJsonDepartment } from '../../common/interfaces/serializer/department.serializer'; import { toJsonLecture } from '../../common/interfaces/serializer/lecture.serializer'; import { toJsonReview } from '../../common/interfaces/serializer/review.serializer'; -import { ReviewDetails } from '../../common/schemaTypes/types'; import { getRepresentativeLecture } from '../../common/utils/lecture.utils'; -import { normalizeArray } from '../../common/utils/method.utils'; import { DepartmentRepository } from '../../prisma/repositories/department.repository'; import { LectureRepository } from '../../prisma/repositories/lecture.repository'; import { ReviewsRepository } from '../../prisma/repositories/review.repository'; @@ -33,31 +32,7 @@ export class UserService { } } - public async getProfile(user: session_userprofile) { - const promises = []; - const departmentPromise = - this.departmentRepository.getDepartmentOfUser(user); - const favoriteDepartmentsPromise = - this.departmentRepository.getFavoriteDepartments(user); - const majorsPromise = this.departmentRepository.getMajors(user); - const minorsPromise = this.departmentRepository.getMinors(user); - const specializedMajorsPromise = - this.departmentRepository.getSpecializedMajors(user); - const reviewWritableLecturesPromise = - this.lectureRepository.findReviewWritableLectures(user, new Date()); - const takenLecturesPromise = this.lectureRepository.getTakenLectures(user); - const writtenReviewsPromise: ReviewDetails[] = - await this.reviewRepository.findReviewByUser(user); - promises.push( - departmentPromise, - favoriteDepartmentsPromise, - majorsPromise, - minorsPromise, - specializedMajorsPromise, - reviewWritableLecturesPromise, - takenLecturesPromise, - writtenReviewsPromise, - ); + public async getProfile(user: session_userprofile): Promise { const [ department, favoriteDepartments, @@ -67,15 +42,22 @@ export class UserService { reviewWritableLectures, takenLectures, writtenReviews, - ] = await Promise.all(promises); - const departments = Object.values( - normalizeArray([ - ...majors, - ...minors, - ...specializedMajors, - ...favoriteDepartments, - ]), - ) ?? [department]; + ] = await Promise.all([ + this.departmentRepository.getDepartmentOfUser(user), + this.departmentRepository.getFavoriteDepartments(user), + this.departmentRepository.getMajors(user), + this.departmentRepository.getMinors(user), + this.departmentRepository.getSpecializedMajors(user), + this.lectureRepository.findReviewWritableLectures(user, new Date()), + this.lectureRepository.getTakenLectures(user), + this.reviewRepository.findReviewByUser(user), + ]); + const departments = [ + ...majors, + ...minors, + ...specializedMajors, + ...favoriteDepartments, + ]; const researchLectures = Object.values(ResearchLecture); const timeTableLectures = takenLectures.filter( (lecture) => !researchLectures.includes(lecture.type_en), @@ -83,11 +65,11 @@ export class UserService { return { id: user.id, - email: user.email, + email: user.email ?? '', student_id: user.student_id, firstName: user.first_name, lastName: user.last_name, - department: toJsonDepartment(department) ?? null, + department: department ? toJsonDepartment(department) : null, majors: majors.map((major) => toJsonDepartment(major)), departments: departments.map((department) => toJsonDepartment(department), @@ -133,8 +115,12 @@ export class UserService { (x) => (x.user_profile_id = user.id), )?.latest_read_datetime; const latestWrittenDatetime = course.latest_written_datetime; + return Object.assign(result, { - userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + userspecific_is_read: + latestReadDatetime && latestWrittenDatetime + ? latestWrittenDatetime < latestReadDatetime + : false, }); } else { return Object.assign(result, { diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index bb213145..d69b342f 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -117,12 +117,7 @@ export class LectureRepository { user: session_userprofile, date?: Date, ): Promise { - let currDate; - if (!date) { - currDate = Date.now(); - } else { - currDate = date; - } + const currDate = date ? date : new Date(); const notWritableSemesters = await this.prisma.subject_semester.findMany({ where: { OR: [ diff --git a/src/prisma/repositories/user.repository.ts b/src/prisma/repositories/user.repository.ts index 13d3a543..aaf3b2b9 100644 --- a/src/prisma/repositories/user.repository.ts +++ b/src/prisma/repositories/user.repository.ts @@ -21,7 +21,7 @@ export class UserRepository { } async updateUser( - userId, + userId: number, user: Prisma.session_userprofileUpdateInput, ): Promise { return await this.prisma.session_userprofile.update({ From 353477470ff4ddb33f439ef56c416dcbd9df8867 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 20 Sep 2023 01:09:38 +0900 Subject: [PATCH 119/250] Fix: apply review --- src/modules/auth/guard/mock-auth-guard.ts | 9 ++++++++- src/modules/reviews/reviews.service.ts | 10 ++++------ src/prisma/repositories/lecture.repository.ts | 2 +- src/prisma/repositories/review.repository.ts | 3 +-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/modules/auth/guard/mock-auth-guard.ts b/src/modules/auth/guard/mock-auth-guard.ts index fe943421..42d93164 100644 --- a/src/modules/auth/guard/mock-auth-guard.ts +++ b/src/modules/auth/guard/mock-auth-guard.ts @@ -2,6 +2,7 @@ import { CanActivate, ExecutionContext, Injectable, + InternalServerErrorException, NotFoundException, UnauthorizedException, } from '@nestjs/common'; @@ -65,7 +66,13 @@ export class MockAuthGuard implements CanActivate { ) { const { accessToken, ...accessTokenOptions } = this.authService.getCookieWithAccessToken(payload.sid); - request.res?.cookie( + + if (!request.res) { + throw new InternalServerErrorException( + 'res property is not found in request', + ); + } + request.res.cookie( 'accessToken', accessToken, accessTokenOptions, diff --git a/src/modules/reviews/reviews.service.ts b/src/modules/reviews/reviews.service.ts index 2ce11495..6aa0aa7e 100644 --- a/src/modules/reviews/reviews.service.ts +++ b/src/modules/reviews/reviews.service.ts @@ -122,8 +122,6 @@ export class ReviewsService { user: session_userprofile, reviewBody: ReviewUpdateDto, ): Promise { - const { content, grade, load, speech } = reviewBody; - const review = await this.reviewsRepository.getReviewById(reviewId); if (!review) throw new HttpException("Can't find review", 404); if (review.writer_id !== user.id) @@ -135,10 +133,10 @@ export class ReviewsService { ); const updateReview = await this.reviewsRepository.updateReview( review.id, - content, - grade, - load, - speech, + reviewBody.content, + reviewBody.grade, + reviewBody.load, + reviewBody.speech, ); const result = toJsonReview(updateReview); if (user) { diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index d69b342f..31e1f41e 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -117,7 +117,7 @@ export class LectureRepository { user: session_userprofile, date?: Date, ): Promise { - const currDate = date ? date : new Date(); + const currDate = date ?? new Date(); const notWritableSemesters = await this.prisma.subject_semester.findMany({ where: { OR: [ diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 0bfafac6..e81bbf89 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -34,7 +34,7 @@ export class ReviewsRepository { } async getReviewById(reviewId: number): Promise { - const review = await this.prisma.review_review.findUnique({ + return this.prisma.review_review.findUnique({ where: { id: reviewId }, include: { course: { @@ -56,7 +56,6 @@ export class ReviewsRepository { review_reviewvote: true, }, }); - return review ? review : null; } public async getReviews( order: string[], From 459c9dc54f79d50d580feb3b10a90fcd91ea0942 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:42:32 +0900 Subject: [PATCH 120/250] fix: assume default value --- .../interfaces/serializer/classtime.serializer.ts | 4 +++- .../interfaces/serializer/lecture.serializer.ts | 13 +++++++------ src/modules/courses/courses.service.ts | 10 ++++++++-- src/prisma/repositories/timetable.repository.ts | 4 ++-- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/common/interfaces/serializer/classtime.serializer.ts b/src/common/interfaces/serializer/classtime.serializer.ts index 647753d5..8b7e38d5 100644 --- a/src/common/interfaces/serializer/classtime.serializer.ts +++ b/src/common/interfaces/serializer/classtime.serializer.ts @@ -27,7 +27,9 @@ const getClassroomStrs = (classtime: subject_classtime) => { const rightParanthesisIndex = buildingFullName.indexOf(')'); const buildingCode = buildingFullName.slice(1, rightParanthesisIndex); const buildingName = buildingFullName.slice(rightParanthesisIndex + 1); - const buildingNameEn = buildingFullNameEn.slice(rightParanthesisIndex + 1); + const buildingNameEn = buildingFullNameEn + ? buildingFullNameEn.slice(rightParanthesisIndex + 1) + : buildingName; const roomName = classtime.room_name ?? ''; const classroom = '(' + buildingCode + ') ' + buildingName + ' ' + roomName; const classroomEn = diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index 7251d6e9..4289a326 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -24,20 +24,21 @@ export function toJsonLecture( department: lecture.department_id, department_code: lecture.subject_department.code, department_name: lecture.subject_department.name, - department_name_en: lecture.subject_department.name_en, + department_name_en: + lecture.subject_department.name_en ?? lecture.subject_department.name, type: lecture.type, type_en: lecture.type_en, limit: lecture.limit, - num_people: lecture.num_people, + num_people: lecture.num_people ?? 0, is_english: lecture.is_english, num_classes: lecture.num_classes, num_labs: lecture.num_labs, credit: lecture.credit, credit_au: lecture.credit_au, - common_title: lecture.common_title, - common_title_en: lecture.common_title_en, - class_title: lecture.class_title, - class_title_en: lecture.class_title_en, + common_title: lecture.common_title ?? '', + common_title_en: lecture.common_title_en ?? '', + class_title: lecture.class_title ?? '', + class_title_en: lecture.class_title_en ?? '', review_total_weight: lecture.review_total_weight, }; diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index fa3aee2a..ba4246fb 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -35,7 +35,10 @@ export class CoursesService { )?.latest_read_datetime; const latestWrittenDatetime = course.latest_written_datetime; return Object.assign(result, { - userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + userspecific_is_read: + latestWrittenDatetime && latestReadDatetime + ? latestWrittenDatetime < latestReadDatetime + : false, }); } else { return Object.assign(result, { @@ -67,7 +70,10 @@ export class CoursesService { )?.latest_read_datetime; const latestWrittenDatetime = course.latest_written_datetime; return Object.assign(result, { - userspecific_is_read: latestWrittenDatetime < latestReadDatetime, + userspecific_is_read: + latestReadDatetime && latestWrittenDatetime + ? latestWrittenDatetime < latestReadDatetime + : false, }); } else { return Object.assign(result, { diff --git a/src/prisma/repositories/timetable.repository.ts b/src/prisma/repositories/timetable.repository.ts index a258ef0d..175259d4 100644 --- a/src/prisma/repositories/timetable.repository.ts +++ b/src/prisma/repositories/timetable.repository.ts @@ -29,8 +29,8 @@ export class TimetableRepository { return await this.prisma.timetable_timetable.findMany({ include: timeTableDetails.include, where: { - year: year, - semester: semester, + year: year ?? undefined, + semester: semester ?? undefined, user_id: user.id, }, skip: skip, From 5c1ff37c6227b02959012e48a596dee0cf51058b Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:29:43 +0900 Subject: [PATCH 121/250] fix: remove unused param --- src/modules/semesters/semesters.controller.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/modules/semesters/semesters.controller.ts b/src/modules/semesters/semesters.controller.ts index c7c87887..d25b8afd 100644 --- a/src/modules/semesters/semesters.controller.ts +++ b/src/modules/semesters/semesters.controller.ts @@ -1,5 +1,4 @@ import { Controller, Get, Query } from '@nestjs/common'; -import { GetUser } from '../../common/decorators/get-user.decorator'; import { SemesterQueryDto } from '../../common/interfaces/dto/semester/semester.request.dto'; import { toJsonSemester } from '../../common/interfaces/serializer/semester.serializer'; import { SemestersService } from './semesters.service'; @@ -9,7 +8,7 @@ export class SemestersController { constructor(private readonly semestersService: SemestersService) {} @Get() - async getSemesters(@Query() query: SemesterQueryDto, @GetUser() user) { + async getSemesters(@Query() query: SemesterQueryDto) { const semesters = await this.semestersService.getSemesters(query); return semesters.map((semester) => toJsonSemester(semester)); } From e7a34f176e5641a228d3261064b90ec4cd58e9a3 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:30:53 +0900 Subject: [PATCH 122/250] fix: make output type safer --- src/common/utils/method.utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 23a179b5..8ac5d954 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -18,8 +18,8 @@ export function normalizeArray( export function groupBy( arr: T[], selector: (item: T) => string | number | null = (item: any) => item.id, -) { - const map: Record = {}; +): Record { + const map: Record = {}; arr.forEach((data) => { const key = selector(data); From 6c06c1d87071c014ed443bf2c8f4e416e636c0c5 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:34:05 +0900 Subject: [PATCH 123/250] fix: make prisma function throwable --- src/modules/lectures/lectures.service.ts | 3 --- src/modules/timetables/timetables.service.ts | 5 +---- src/prisma/repositories/lecture.repository.ts | 4 ++-- src/prisma/repositories/timetable.repository.ts | 4 ++-- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index 8ac7bf60..dae00214 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -18,9 +18,6 @@ export class LecturesService { public async getLectureById(id: number): Promise { const queryResult = await this.LectureRepository.getLectureById(id); - if (!queryResult) { - throw new NotFoundException(); - } return toJsonLecture(queryResult, false); } diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index d19530ae..2b50041f 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -47,10 +47,7 @@ export class TimetablesService { } async getTimetable(timetableId: number) { - const timeTable = await this.timetableRepository.getTimeTableById( - timetableId, - ); - return timeTable; + return await this.timetableRepository.getTimeTableById(timetableId); } async createTimetable( diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 31e1f41e..5af53599 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -19,7 +19,7 @@ export class LectureRepository { ) {} async getLectureById(id: number): Promise { - return await this.prisma.subject_lecture.findUnique({ + return await this.prisma.subject_lecture.findUniqueOrThrow({ include: lectureDetails.include, where: { id: id, @@ -28,7 +28,7 @@ export class LectureRepository { } async getLectureBasicById(id: number): Promise { - return await this.prisma.subject_lecture.findUnique({ + return await this.prisma.subject_lecture.findUniqueOrThrow({ where: { id: id, }, diff --git a/src/prisma/repositories/timetable.repository.ts b/src/prisma/repositories/timetable.repository.ts index 175259d4..ec068415 100644 --- a/src/prisma/repositories/timetable.repository.ts +++ b/src/prisma/repositories/timetable.repository.ts @@ -93,7 +93,7 @@ export class TimetableRepository { } async getTimeTableBasicById(timeTableId: number) { - return await this.prisma.timetable_timetable.findUnique({ + return await this.prisma.timetable_timetable.findUniqueOrThrow({ where: { id: timeTableId, }, @@ -110,7 +110,7 @@ export class TimetableRepository { } async getTimeTableById(timeTableId: number): Promise { - return await this.prisma.timetable_timetable.findUnique({ + return await this.prisma.timetable_timetable.findUniqueOrThrow({ include: timeTableDetails.include, where: { id: timeTableId, From c80ffa700c924f79cc3d8df92303d5dd5fb31b94 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:39:50 +0900 Subject: [PATCH 124/250] fix: change param type of function --- src/modules/timetables/timetables.service.ts | 2 +- src/prisma/repositories/course.repository.ts | 14 +++++++------- src/prisma/repositories/lecture.repository.ts | 4 ++-- src/prisma/repositories/semester.repository.ts | 2 +- src/prisma/repositories/timetable.repository.ts | 10 +++++----- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index 2b50041f..17a6f0d7 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -152,7 +152,7 @@ export class TimetablesService { return await this.timetableRepository.getTimeTableById(timeTableId); } - async deleteTimetable(user, timetableId: number) { + async deleteTimetable(user: session_userprofile, timetableId: number) { return await this.prismaService.$transaction(async (tx) => { const timeTable = await this.getTimetable(timetableId); const semester = timeTable.semester; diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 67484e03..2fe8fb4e 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -48,7 +48,7 @@ export class CourseRepository { 'TS', ]; - public async getCourseById(id: number): Promise { + public async getCourseById(id: number): Promise { return await this.prisma.subject_course.findUnique({ include: { subject_department: true, @@ -175,7 +175,7 @@ export class CourseRepository { return applyOffset(orderedResult, offset ?? 0); } - public departmentFilter(department_names: string[]): object { + public departmentFilter(department_names?: string[]): object | null { if (!department_names) { return null; } @@ -202,7 +202,7 @@ export class CourseRepository { } } - public typeFilter(types: string[]): object { + public typeFilter(types?: string[]): object | null { if (!types) { return null; } @@ -227,7 +227,7 @@ export class CourseRepository { } } - public termFilter(term?: string[]): object { + public termFilter(term?: string[]): object | null { if (!term) { return null; } @@ -244,7 +244,7 @@ export class CourseRepository { } } - public keywordFilter(keyword?: string, isCourse = true): object { + public keywordFilter(keyword?: string, isCourse = true): object | null { if (!keyword) { return null; } @@ -329,7 +329,7 @@ export class CourseRepository { }; } - public groupFilter(group?: string[]): object { + public groupFilter(group?: string[]): object | null { if (!group) { return null; } @@ -355,7 +355,7 @@ export class CourseRepository { public levelFilter( queryResult: T[], - levels: string[], + levels?: string[], ): T[] { if (!levels) { return queryResult; diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 5af53599..56b2ca11 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -208,7 +208,7 @@ export class LectureRepository { return lectures; } - public semesterFilter(years: number[], semesters: number[]): object { + public semesterFilter(years?: number[], semesters?: number[]): object | null { if (!years && !semesters) { return null; } else if (!years) { @@ -241,7 +241,7 @@ export class LectureRepository { } } - public timeFilter(day: number[], begin: number[], end: number[]): object { + public timeFilter(day?: number[], begin?: number[], end?: number[]): object { const datetimeBegin = begin?.map((time) => this.datetimeConverter(time)); const datetimeEnd = end?.map((time) => this.datetimeConverter(time)); diff --git a/src/prisma/repositories/semester.repository.ts b/src/prisma/repositories/semester.repository.ts index e5079a7d..bc9497af 100644 --- a/src/prisma/repositories/semester.repository.ts +++ b/src/prisma/repositories/semester.repository.ts @@ -19,7 +19,7 @@ export class SemesterRepository { return existsSemester; } - async getSemesters(paginationAndSoring?: { + async getSemesters(paginationAndSoring: { orderBy?: Prisma.subject_semesterOrderByWithRelationInput[]; skip?: number; take?: number; diff --git a/src/prisma/repositories/timetable.repository.ts b/src/prisma/repositories/timetable.repository.ts index ec068415..61f4814e 100644 --- a/src/prisma/repositories/timetable.repository.ts +++ b/src/prisma/repositories/timetable.repository.ts @@ -14,8 +14,8 @@ export class TimetableRepository { async getTimetables( user: session_userprofile, - year?: number, - semester?: number, + year?: number | null, + semester?: number | null, paginationAndSorting?: { orderBy?: Prisma.timetable_timetableOrderByWithRelationInput[]; skip?: number; @@ -41,9 +41,9 @@ export class TimetableRepository { async getTimetableBasics( user: session_userprofile, - year?: number, - semester?: number, - paginationAndSorting?: { + year: number, + semester: number, + paginationAndSorting: { orderBy: Prisma.timetable_timetableOrderByWithRelationInput; skip?: number; take?: number; From 191c833f45398dc8d2c09e7abe0a4aaee08e215b Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:40:38 +0900 Subject: [PATCH 125/250] fix: resolve type error --- src/prisma/repositories/course.repository.ts | 19 +++++++++++++------ src/prisma/repositories/lecture.repository.ts | 12 ++++++------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 2fe8fb4e..c9877881 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -85,7 +85,10 @@ export class CourseRepository { ? course.lecture.filter((lecture) => !lecture.deleted) : []; const order = query.order ? query.order : ['year', 'semester', 'class_no']; - return applyOrder(filteredLecture, order); + return applyOrder( + filteredLecture, + order as (keyof LectureDetails)[], + ); } public async getReviewsByCourseId( @@ -142,14 +145,13 @@ export class CourseRepository { const groupFilter = this.groupFilter(group); const keywordFilter = this.keywordFilter(keyword); const term_filter = this.termFilter(term); - let filterList = [ + const filterList: object[] = [ departmentFilter, typeFilter, groupFilter, keywordFilter, term_filter, - ]; - filterList = filterList.filter((filter) => filter !== null); + ].filter((filter): filter is object => filter !== null); const queryResult = await this.prisma.subject_course.findMany({ include: { subject_department: true, @@ -212,7 +214,9 @@ export class CourseRepository { } else if (types.includes('ETC')) { const unselected_types = Object.keys(this.TYPE_ACRONYMS) .filter((type) => !(type in types)) - .map((type) => this.TYPE_ACRONYMS[type]); + .map( + (type) => this.TYPE_ACRONYMS[type as keyof typeof this.TYPE_ACRONYMS], + ); return { type_en: { in: unselected_types, @@ -221,7 +225,10 @@ export class CourseRepository { } else { return { type_en: { - in: types.map((type) => this.TYPE_ACRONYMS[type]), + in: types.map( + (type) => + this.TYPE_ACRONYMS[type as keyof typeof this.TYPE_ACRONYMS], + ), }, }; } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index 56b2ca11..bdcd57e3 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -79,7 +79,7 @@ export class LectureRepository { ], }; - const filters = [ + const filters: object[] = [ semesterFilter, timeFilter, departmentFilter, @@ -87,7 +87,7 @@ export class LectureRepository { groupFilter, keywordFilter, defaultFilter, - ]; + ].filter((filter): filter is object => filter !== null); const queryResult = await this.prisma.subject_lecture.findMany({ include: { subject_department: true, @@ -96,7 +96,7 @@ export class LectureRepository { subject_examtime: true, }, where: { - AND: filters.filter((filter) => filter !== null), + AND: filters, }, take: query.limit ?? DEFAULT_LIMIT, }); @@ -108,7 +108,7 @@ export class LectureRepository { const orderedQuery = applyOrder( levelFilteredResult, - query.order ?? DEFAULT_ORDER, + (query.order ?? DEFAULT_ORDER) as (keyof LectureDetails)[], ); return applyOffset(orderedQuery, query.offset ?? 0); } @@ -145,8 +145,8 @@ export class LectureRepository { ); const notWritableYearAndSemesterMap: Record< - number, - Record + string, + Record > = {}; for (const key in notWritableYearAndSemester) { const objects = notWritableYearAndSemester[key]; From 5aecf41a71d31b1e3f8e31d0c7ea737de3ab44cc Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:41:58 +0900 Subject: [PATCH 126/250] refactor: make logic easier --- .../serializer/timetable.serializer.ts | 35 +++++++------------ src/modules/timetables/timetables.service.ts | 12 +++---- 2 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/common/interfaces/serializer/timetable.serializer.ts b/src/common/interfaces/serializer/timetable.serializer.ts index c54cddea..e093ff19 100644 --- a/src/common/interfaces/serializer/timetable.serializer.ts +++ b/src/common/interfaces/serializer/timetable.serializer.ts @@ -10,27 +10,18 @@ export const toJsonTimetable = ( timetable: TimeTableDetails | TimeTableBasic, lectures?: LectureDetails[], ): TimetableResponseDto => { - if ('timetable_timetable_lectures' in timetable) { - const id = timetable.id; - const lectures = timetable.timetable_timetable_lectures - .map((x) => x.subject_lecture) - .map((lecture) => toJsonLecture(lecture, false)); - const arrange_order = timetable.arrange_order; - return { - id: id, - lectures: lectures, - arrange_order: arrange_order, - }; - } else { - const id = timetable.id; - const lectureLists = lectures.map((lecture) => - toJsonLecture(lecture, false), - ); - const arrange_order = timetable.arrange_order; - return { - id: id, - lectures: lectureLists, - arrange_order: arrange_order, - }; + const lecturesList = + 'timetable_timetable_lectures' in timetable + ? timetable.timetable_timetable_lectures.map((x) => x.subject_lecture) + : lectures; + if (lecturesList === undefined) { + throw new Error('lecturesList is undefined'); } + return { + id: timetable.id, + lectures: lecturesList.map((lecture) => + toJsonLecture(lecture, false), + ), + arrange_order: timetable.arrange_order, + }; }; diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index 17a6f0d7..408d9abf 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -154,13 +154,9 @@ export class TimetablesService { async deleteTimetable(user: session_userprofile, timetableId: number) { return await this.prismaService.$transaction(async (tx) => { - const timeTable = await this.getTimetable(timetableId); - const semester = timeTable.semester; - const year = timeTable.year; - const arrangeOrder = timeTable.arrange_order; - if (!timeTable) { - return new NotFoundException(); - } + const { semester, year, arrange_order } = await this.getTimetable( + timetableId, + ); await this.timetableRepository.deleteById(timetableId); const relatedTimeTables = await this.timetableRepository.getTimetables( user, @@ -168,7 +164,7 @@ export class TimetablesService { semester, ); const timeTablesToBeUpdated = relatedTimeTables - .filter((timeTable) => timeTable.arrange_order > arrangeOrder) + .filter((timeTable) => timeTable.arrange_order > arrange_order) .map((timeTable) => { return { id: timeTable.id, From b4416c89b8218c96528466f17d18c7cc4898d3e0 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Mon, 25 Sep 2023 00:48:55 +0900 Subject: [PATCH 127/250] fix: replace class with interface --- .../interfaces/dto/timetable/timetable.response.dto.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/interfaces/dto/timetable/timetable.response.dto.ts b/src/common/interfaces/dto/timetable/timetable.response.dto.ts index a9a577c6..5df8cd39 100644 --- a/src/common/interfaces/dto/timetable/timetable.response.dto.ts +++ b/src/common/interfaces/dto/timetable/timetable.response.dto.ts @@ -1,7 +1,7 @@ import { LectureResponseDto } from '../lecture/lecture.response.dto'; -export class TimetableResponseDto { - id!: number; - lectures!: LectureResponseDto[]; - arrange_order!: number; +export interface TimetableResponseDto { + id: number; + lectures: LectureResponseDto[]; + arrange_order: number; } From 1e2f031111be71e8f1469e8807a7188ef3e8fea1 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Mon, 25 Sep 2023 00:51:49 +0900 Subject: [PATCH 128/250] refactor, fix: enhance type checking for groupBy --- src/common/utils/method.utils.ts | 24 ++++++------------- src/prisma/repositories/lecture.repository.ts | 10 +++++--- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 8ac5d954..756ce274 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -15,24 +15,14 @@ export function normalizeArray( return normalizeObj; } -export function groupBy( +export function groupBy( arr: T[], - selector: (item: T) => string | number | null = (item: any) => item.id, -): Record { - const map: Record = {}; - - arr.forEach((data) => { - const key = selector(data); - if (key !== null) { - if (map[key]) { - map[key]!.push(data); - } else { - map[key] = [data]; - } - } - }); - - return map; + key: (i: T) => K, +): Record { + return arr.reduce((groups, item) => { + (groups[key(item)] ||= []).push(item); + return groups; + }, {} as Record); } type ValueType = string | number | boolean; diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index bdcd57e3..c55c0cd3 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -117,6 +117,7 @@ export class LectureRepository { user: session_userprofile, date?: Date, ): Promise { + type Semester = { semester: number; year: number }; const currDate = date ?? new Date(); const notWritableSemesters = await this.prisma.subject_semester.findMany({ where: { @@ -134,7 +135,7 @@ export class LectureRepository { ], }, }); - const notWritableYearAndSemester = groupBy( + const notWritableYearAndSemester = groupBy( notWritableSemesters.map((semester) => { return { semester: semester.semester, @@ -146,11 +147,14 @@ export class LectureRepository { const notWritableYearAndSemesterMap: Record< string, - Record + Record > = {}; for (const key in notWritableYearAndSemester) { const objects = notWritableYearAndSemester[key]; - const mapObjects = groupBy(objects); + const mapObjects = groupBy( + objects, + (object) => object.year, + ); notWritableYearAndSemesterMap[key] = mapObjects; } From 12dc96bc3d96dffe45df79fd4eb122deca35158f Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:38:58 +0900 Subject: [PATCH 129/250] fix: replace unintended == into === --- src/common/utils/search.utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index 1cf2c62f..337fb4e7 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -42,7 +42,7 @@ export type orderFilterType = { }; export function orderFilter(order: string[] | undefined): orderFilterType[] { - if (order == undefined) { + if (order === undefined) { return []; } const orderFilter: orderFilterType[] = []; From a526eeea45d55c88e7ae24286aab46786397e0d7 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:39:37 +0900 Subject: [PATCH 130/250] fix: enhance naming, type checking of groupBy --- src/common/utils/method.utils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 756ce274..ca996f61 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -17,12 +17,12 @@ export function normalizeArray( export function groupBy( arr: T[], - key: (i: T) => K, -): Record { - return arr.reduce((groups, item) => { - (groups[key(item)] ||= []).push(item); + selector: (i: T) => K, +): Record { + return arr.reduce((groups: Record, item) => { + (groups[selector(item)] ??= []).push(item); return groups; - }, {} as Record); + }, {} as Record); } type ValueType = string | number | boolean; From 78fb8af9b5ac1802b41614a5df0a0df5c82d2cf8 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Tue, 26 Sep 2023 17:38:26 +0900 Subject: [PATCH 131/250] fix: error from return type change in groupBy --- src/prisma/repositories/lecture.repository.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index c55c0cd3..4242bebc 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -147,15 +147,15 @@ export class LectureRepository { const notWritableYearAndSemesterMap: Record< string, - Record + Record > = {}; - for (const key in notWritableYearAndSemester) { - const objects = notWritableYearAndSemester[key]; - const mapObjects = groupBy( - objects, - (object) => object.year, - ); - notWritableYearAndSemesterMap[key] = mapObjects; + for (const [key, value] of Object.entries(notWritableYearAndSemester)) { + if (value) { + notWritableYearAndSemesterMap[key] = groupBy( + value, + (s) => s.year, + ); + } } const takenLectures = await this.getTakenLectures(user); From aec46910ff45a466474efca7830a028cea53d217 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 1 Nov 2023 01:18:03 +0900 Subject: [PATCH 132/250] chore: fix docker compose volume directory --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 9053db72..336d351f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,8 +13,8 @@ services: - MYSQL_DATABASE=otlplus - TZ=Asia/Seoul volumes: - - ../volumes/db:/var/lib/mysql - - ../volumes/dump:/dump + - ./volumes/db:/var/lib/mysql + - ./volumes/dump:/dump command: | --sql_mode=NO_ENGINE_SUBSTITUTION --default_storage_engine=InnoDB --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci From 82429d9e689c0c5d17bd852128206b2ba6670d3e Mon Sep 17 00:00:00 2001 From: ddungiii Date: Tue, 7 Nov 2023 23:32:13 +0900 Subject: [PATCH 133/250] fix: wrong directory path --- .../dto/{user => }/department/department.response.dto.ts | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/common/interfaces/dto/{user => }/department/department.response.dto.ts (100%) diff --git a/src/common/interfaces/dto/user/department/department.response.dto.ts b/src/common/interfaces/dto/department/department.response.dto.ts similarity index 100% rename from src/common/interfaces/dto/user/department/department.response.dto.ts rename to src/common/interfaces/dto/department/department.response.dto.ts From 89f2e3cd712ea367e8646e9d827ca7c62bc00c69 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 8 Nov 2023 00:16:56 +0900 Subject: [PATCH 134/250] feat: Add status api --- src/app.module.ts | 2 ++ src/modules/status/status.controller.ts | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 661cf026..575cd740 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,6 +10,7 @@ import { CoursesModule } from './modules/courses/courses.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; import { SemestersModule } from './modules/semesters/semesters.module'; +import { StatusModule } from './modules/status/status.module'; import { TimetablesModule } from './modules/timetables/timetables.module'; import { UserModule } from './modules/user/user.module'; import { PrismaModule } from './prisma/prisma.module'; @@ -24,6 +25,7 @@ import { PrismaModule } from './prisma/prisma.module'; UserModule, SemestersModule, TimetablesModule, + StatusModule, ], controllers: [AppController], providers: [ diff --git a/src/modules/status/status.controller.ts b/src/modules/status/status.controller.ts index cea0f7d3..5fed763e 100644 --- a/src/modules/status/status.controller.ts +++ b/src/modules/status/status.controller.ts @@ -1,4 +1,9 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get } from '@nestjs/common'; -@Controller('status') -export class StatusController {} +@Controller('api/status') +export class StatusController { + @Get() + getStatus() { + return "It's Healthy!"; + } +} From fec034684ec68b44ca80b04c50ef28f2c0c42485 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 8 Nov 2023 00:23:18 +0900 Subject: [PATCH 135/250] chore: Add dev to target branch for ci --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc952dae..8d154142 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main, release] + branches: [main, dev, release] pull_request: - branches: [main, release] + branches: [main, dev, release] env: NODE_VERSION: 18 From 4c0f903560b816f1fb46760361d4c95da3d6bad6 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 8 Nov 2023 00:36:18 +0900 Subject: [PATCH 136/250] fix: duplicated fields in schema prisma --- src/prisma/schema.prisma | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index a7f49b2a..3b5a261e 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -228,9 +228,9 @@ model review_review { lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onDelete: Restrict) content String @db.MediumText - grade Int @db.SmallInt @default(0) - load Int @db.SmallInt @default(0) - speech Int @db.SmallInt @default(0) + grade Int @default(0) @db.SmallInt + load Int @default(0) @db.SmallInt + speech Int @default(0) @db.SmallInt writer_id Int? writer session_userprofile? @relation(fields: [writer_id], references: [id], onUpdate: Restrict) writer_label String @db.VarChar(200) @@ -240,7 +240,6 @@ model review_review { written_datetime DateTime? @db.DateTime(0) main_famoushumanityreviewdailyfeed_reviews main_famoushumanityreviewdailyfeed_reviews[] main_famousmajorreviewdailyfeed_reviews main_famousmajorreviewdailyfeed_reviews[] - writer session_userprofile? @relation(fields: [writer_id], references: [id], onDelete: SetNull) review_reviewvote review_reviewvote[] @@unique([writer_id, lecture_id], map: "review_comment_writer_id_af700a5d_uniq") @@ -248,12 +247,12 @@ model review_review { } model review_reviewvote { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) review_id Int - review review_review @relation(fields: [review_id], references: [id], onDelete: Cascade) + review review_review @relation(fields: [review_id], references: [id], onDelete: Cascade) userprofile_id Int? - userprofile session_userprofile? @relation(fields: [userprofile_id], references: [id], onDelete:SetNull) - created_datetime DateTime? @db.DateTime(6) + userprofile session_userprofile? @relation(fields: [userprofile_id], references: [id], onDelete: SetNull) + created_datetime DateTime? @db.DateTime(6) @@unique([review_id, userprofile_id], map: "review_commentvote_comment_id_e4594aea_uniq") @@index([created_datetime], map: "review_reviewvote_created_datetime_450f85e2") @@ -281,7 +280,6 @@ model session_userprofile { session_userprofile_specialized_major session_userprofile_specialized_major[] taken_lectures session_userprofile_taken_lectures[] subject_courseuser subject_courseuser[] - taken_lectures session_userprofile_taken_lectures[] support_rate support_rate[] timetable_timetable timetable_timetable[] timetable_wishlist timetable_wishlist? @@ -296,7 +294,6 @@ model session_userprofile_favorite_departments { userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) department_id Int department subject_department @relation(fields: [department_id], references: [id], onUpdate: Restrict) - userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, department_id], map: "userprofile_id") @@index([department_id], map: "session_userprofile_favorite_departments_department_id_fkey") @@ -341,7 +338,6 @@ model session_userprofile_taken_lectures { userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) lecture_id Int lecture subject_lecture @relation(fields: [lecture_id], references: [id], onUpdate: Restrict) - userprofile session_userprofile @relation(fields: [userprofile_id], references: [id], onUpdate: Restrict) @@unique([userprofile_id, lecture_id], map: "userprofile_id") @@index([lecture_id], map: "session_userprofile_taken_lectures_lecture_id_fkey") @@ -515,7 +511,6 @@ model subject_lecture { students session_userprofile_taken_lectures[] subject_classtime subject_classtime[] subject_examtime subject_examtime[] - students session_userprofile_taken_lectures[] timetable_oldtimetable_lectures timetable_oldtimetable_lectures[] timetable_timetable_lectures timetable_timetable_lectures[] timetable_wishlist_lectures timetable_wishlist_lectures[] From 6dc8cfba975ee07bca6970a00c802740d483113c Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Wed, 8 Nov 2023 02:17:14 +0900 Subject: [PATCH 137/250] feat: implement timetable reorder --- .../dto/timetable/timetable.request.dto.ts | 6 ++ .../timetables/timetables.controller.ts | 19 +++++ src/modules/timetables/timetables.service.ts | 76 +++++++++++++++++-- 3 files changed, 96 insertions(+), 5 deletions(-) diff --git a/src/common/interfaces/dto/timetable/timetable.request.dto.ts b/src/common/interfaces/dto/timetable/timetable.request.dto.ts index b5206dc1..0ad1ae81 100644 --- a/src/common/interfaces/dto/timetable/timetable.request.dto.ts +++ b/src/common/interfaces/dto/timetable/timetable.request.dto.ts @@ -53,3 +53,9 @@ export class AddLectureDto { @Type(() => Number) lecture!: number; } + +export class ReorderTimetableDto { + @IsNumber() + @Type(() => Number) + arrange_order!: number; +} diff --git a/src/modules/timetables/timetables.controller.ts b/src/modules/timetables/timetables.controller.ts index 82d96a38..fbdfca64 100644 --- a/src/modules/timetables/timetables.controller.ts +++ b/src/modules/timetables/timetables.controller.ts @@ -11,6 +11,7 @@ import { session_userprofile } from '@prisma/client'; import { GetUser } from '../../common/decorators/get-user.decorator'; import { AddLectureDto, + ReorderTimetableDto, TimetableCreateDto, TimetableQueryDto, } from '../../common/interfaces/dto/timetable/timetable.request.dto'; @@ -93,4 +94,22 @@ export class TimetablesController { ); return toJsonTimetable(timeTable); } + + @Post('/:timetableId/reorder') + async reorderTimetable( + @Param('userId') userId: number, + @Param('timetableId') timetableId: number, + @Body() body: ReorderTimetableDto, + @GetUser() user: session_userprofile, + ) { + // TODO: use user by auth instead of userId by endpoint param + // userId should be removed from endpoint in the future + // since each user should only control their own timetable + const timeTable = await this.timetablesService.reorderTimetable( + user, + timetableId, + body, + ); + return toJsonTimetable(timeTable); + } } diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index 408d9abf..13b22cf0 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -1,11 +1,8 @@ -import { - BadRequestException, - Injectable, - NotFoundException, -} from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { AddLectureDto, + ReorderTimetableDto, TimetableCreateDto, TimetableQueryDto, } from '../../common/interfaces/dto/timetable/timetable.request.dto'; @@ -181,4 +178,73 @@ export class TimetablesService { ); }); } + + async reorderTimetable( + user: session_userprofile, + timetableId: number, + body: ReorderTimetableDto, + ) { + return await this.prismaService.$transaction(async (tx) => { + const { arrange_order: targetArrangeOrder } = body; + const targetTimetable = await this.getTimetable(timetableId); + if (targetTimetable.user_id !== user.id) { + throw new BadRequestException('User is not owner of timetable'); + } + const relatedTimeTables = await this.timetableRepository.getTimetables( + user, + targetTimetable.year, + targetTimetable.semester, + ); + if ( + targetArrangeOrder < 0 || + targetArrangeOrder >= relatedTimeTables.length + ) { + throw new BadRequestException('Wrong field arrange_order in request'); + } + let timeTablesToBeUpdated: { id: number; arrange_order: number }[] = []; + if (targetArrangeOrder < targetTimetable.arrange_order) { + timeTablesToBeUpdated = relatedTimeTables + .filter( + (timeTable) => + timeTable.arrange_order >= targetArrangeOrder && + timeTable.arrange_order < targetTimetable.arrange_order, + ) + .map((timeTable) => { + return { + id: timeTable.id, + arrange_order: timeTable.arrange_order + 1, + }; + }); + } else if (targetArrangeOrder > targetTimetable.arrange_order) { + timeTablesToBeUpdated = relatedTimeTables + .filter( + (timeTable) => + timeTable.arrange_order <= targetArrangeOrder && + timeTable.arrange_order > targetTimetable.arrange_order, + ) + .map((timeTable) => { + return { + id: timeTable.id, + arrange_order: timeTable.arrange_order - 1, + }; + }); + } else { + // arrange_order == timetable.arrange_order + return await this.timetableRepository.getTimeTableById(timetableId); + } + await Promise.all( + timeTablesToBeUpdated.map(async (timetable) => { + return this.timetableRepository.updateOrder( + timetable.id, + timetable.arrange_order, + ); + }), + ); + await this.timetableRepository.updateOrder( + targetTimetable.id, + targetArrangeOrder, + ); + return await this.timetableRepository.getTimeTableById(timetableId); + }); + } } From df1aaa42cf7e83f012a127782e950d6e17d61532 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Tue, 21 Nov 2023 23:38:32 +0900 Subject: [PATCH 138/250] feat: fix status message --- src/modules/status/status.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/status/status.controller.ts b/src/modules/status/status.controller.ts index 5fed763e..773d8281 100644 --- a/src/modules/status/status.controller.ts +++ b/src/modules/status/status.controller.ts @@ -4,6 +4,6 @@ import { Controller, Get } from '@nestjs/common'; export class StatusController { @Get() getStatus() { - return "It's Healthy!"; + return 'I am Healthy!'; } } From dd370bcf7f74db5a5b88f060983f9f688a986f09 Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 00:22:41 +0900 Subject: [PATCH 139/250] refactor: use jsdoc for todo comment --- src/modules/timetables/timetables.controller.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/modules/timetables/timetables.controller.ts b/src/modules/timetables/timetables.controller.ts index fbdfca64..9560731b 100644 --- a/src/modules/timetables/timetables.controller.ts +++ b/src/modules/timetables/timetables.controller.ts @@ -97,14 +97,16 @@ export class TimetablesController { @Post('/:timetableId/reorder') async reorderTimetable( + /** + * @todo use user by auth instead of userId by endpoint param + * userId should be removed from endpoint in the future + * since each user should only control their own timetable + */ @Param('userId') userId: number, @Param('timetableId') timetableId: number, @Body() body: ReorderTimetableDto, @GetUser() user: session_userprofile, ) { - // TODO: use user by auth instead of userId by endpoint param - // userId should be removed from endpoint in the future - // since each user should only control their own timetable const timeTable = await this.timetablesService.reorderTimetable( user, timetableId, From 06f31707861f333f3a791e169c09574ed335faed Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 00:24:55 +0900 Subject: [PATCH 140/250] refactor: reorder return, optimize db request --- src/modules/timetables/timetables.service.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index 13b22cf0..d68be745 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -151,9 +151,8 @@ export class TimetablesService { async deleteTimetable(user: session_userprofile, timetableId: number) { return await this.prismaService.$transaction(async (tx) => { - const { semester, year, arrange_order } = await this.getTimetable( - timetableId, - ); + const { semester, year, arrange_order } = + await this.timetableRepository.getTimeTableById(timetableId); await this.timetableRepository.deleteById(timetableId); const relatedTimeTables = await this.timetableRepository.getTimetables( user, @@ -186,10 +185,15 @@ export class TimetablesService { ) { return await this.prismaService.$transaction(async (tx) => { const { arrange_order: targetArrangeOrder } = body; - const targetTimetable = await this.getTimetable(timetableId); + const targetTimetable = await this.timetableRepository.getTimeTableById( + timetableId, + ); if (targetTimetable.user_id !== user.id) { throw new BadRequestException('User is not owner of timetable'); } + if (targetArrangeOrder === targetTimetable.arrange_order) { + return targetTimetable; + } const relatedTimeTables = await this.timetableRepository.getTimetables( user, targetTimetable.year, @@ -228,9 +232,6 @@ export class TimetablesService { arrange_order: timeTable.arrange_order - 1, }; }); - } else { - // arrange_order == timetable.arrange_order - return await this.timetableRepository.getTimeTableById(timetableId); } await Promise.all( timeTablesToBeUpdated.map(async (timetable) => { @@ -240,11 +241,11 @@ export class TimetablesService { ); }), ); - await this.timetableRepository.updateOrder( + const updatedTimeTable = await this.timetableRepository.updateOrder( targetTimetable.id, targetArrangeOrder, ); - return await this.timetableRepository.getTimeTableById(timetableId); + return updatedTimeTable; }); } } From be87283bee1682b95a31469f8f516a038744d13f Mon Sep 17 00:00:00 2001 From: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Date: Wed, 22 Nov 2023 00:28:02 +0900 Subject: [PATCH 141/250] refactor: add space bar for readability --- src/modules/timetables/timetables.service.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/timetables/timetables.service.ts b/src/modules/timetables/timetables.service.ts index d68be745..a0b732a5 100644 --- a/src/modules/timetables/timetables.service.ts +++ b/src/modules/timetables/timetables.service.ts @@ -194,6 +194,7 @@ export class TimetablesService { if (targetArrangeOrder === targetTimetable.arrange_order) { return targetTimetable; } + const relatedTimeTables = await this.timetableRepository.getTimetables( user, targetTimetable.year, @@ -205,6 +206,7 @@ export class TimetablesService { ) { throw new BadRequestException('Wrong field arrange_order in request'); } + let timeTablesToBeUpdated: { id: number; arrange_order: number }[] = []; if (targetArrangeOrder < targetTimetable.arrange_order) { timeTablesToBeUpdated = relatedTimeTables @@ -233,6 +235,7 @@ export class TimetablesService { }; }); } + await Promise.all( timeTablesToBeUpdated.map(async (timetable) => { return this.timetableRepository.updateOrder( From 1f498356bf2bc22c15f81e0a8eeacdeb23833235 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 22 Nov 2023 01:53:32 +0900 Subject: [PATCH 142/250] chore: add prisma generate on ci --- .github/workflows/ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d154142..cfcb99f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main, dev, release] + branches: [main, dev, release, ci/*] pull_request: - branches: [main, dev, release] + branches: [main, dev, release, ci/*] env: NODE_VERSION: 18 @@ -60,5 +60,7 @@ jobs: run: npm ci - name: Copy env file run: cp ./env/.env.example ./env/.env.local + - name: Generate prisma + run: prisma-generate - name: Build run: npm run build From e13a51799cffa08dedcfac562c74cb78e4a08460 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 22 Nov 2023 01:55:49 +0900 Subject: [PATCH 143/250] chore: fix prisma-generate command --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cfcb99f2..441704bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,6 @@ jobs: - name: Copy env file run: cp ./env/.env.example ./env/.env.local - name: Generate prisma - run: prisma-generate + run: npm run prisma-generate - name: Build run: npm run build From c231497a6f8c9e6371a3b7d437cab01e1b375598 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 22 Nov 2023 01:59:36 +0900 Subject: [PATCH 144/250] chore: remove ci branch on target branches --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 441704bd..778f8ab6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,9 @@ name: CI on: push: - branches: [main, dev, release, ci/*] + branches: [main, dev, release] pull_request: - branches: [main, dev, release, ci/*] + branches: [main, dev, release] env: NODE_VERSION: 18 From 29139b31e4005050368ebc94f83b84a1e40ebd04 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Wed, 22 Nov 2023 02:02:01 +0900 Subject: [PATCH 145/250] chore: rename generating step name --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 778f8ab6..ae4f1b6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: run: npm ci - name: Copy env file run: cp ./env/.env.example ./env/.env.local - - name: Generate prisma + - name: Generate PrismaClient run: npm run prisma-generate - name: Build run: npm run build From 9ca3806d5c3f4ad06d3cdc2a9e76a6d8a5694084 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Sat, 20 Jan 2024 03:30:31 +0900 Subject: [PATCH 146/250] refactor: prisma scripts --- package.json | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 8a3be446..592b8562 100644 --- a/package.json +++ b/package.json @@ -14,18 +14,16 @@ "start:dev": "NODE_ENV=dev nest start --config src/bootstrap/nest-cli.json", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", - "prisma-push:local": "dotenv -e env/.env.local -- npx prisma db push", - "prisma-push:dev": "dotenv -e env/.env.dev -- npx prisma db push", - "prisma-pull:local": "dotenv -e env/.env.local -- npx prisma db pull --schema src/prisma/schema.prisma", - "prisma-pull:dev": "dotenv -e env/.env.dev -- npx prisma db pull --schema src/prisma/schema.prisma", - "prisma-migrate-create-dev:local": "dotenv -e env/.env.local -- npx prisma migrate dev --schema src/prisma/schema.prisma --create-only ", - "prisma-migrate-dev:local": "dotenv -e env/.env.local -- npx prisma migrate dev --schema src/prisma/schema.prisma", - "prisma-migrate-dev:dev": "dotenv -e env/.env.dev -- npx prisma migrate dev --schema src/prisma/schema.prisma", - "prisma-generate": "npx prisma generate --schema src/prisma/schema.prisma", - "prisma-status:local": "dotenv -e env/.env.local npx prisma migrate status", - "prisma-status:dev": "dotenv -e env/.env.dev npx prisma migrate status", - "prisma-resolve:local": "dotenv -e env/.env.local npx prisma migrate resolve", - "prisma-resolve:dev": "dotenv -e env/.env.dev npx prisma migrate resolve", + "db:push": "dotenv -e env/.env.local -- npx prisma db push", + "db:pull": "dotenv -e env/.env.local -- npx prisma db pull --schema src/prisma/schema.prisma", + "db:init": "dotenv -e env/.env.local -- npx prisma db execute --file src/prisma/migrations/0_init/migration.sql --schema src/prisma/schema.prisma && npm run migrate:resolve --applied 0_init", + "db:execute": "dotenv -e env/.env.local -- npx prisma db execute --schema src/prisma/schema.prisma --file", + "migrate:dev-create": "dotenv -e env/.env.local -- npx prisma migrate dev --schema src/prisma/schema.prisma --create-only ", + "migrate:dev": "dotenv -e env/.env.local -- npx prisma migrate dev --schema src/prisma/schema.prisma", + "migrate:deploy": "dotenv -e env/.env.local -- npx prisma migrate deploy --schema src/prisma/schema.prisma", + "migrate:status": "dotenv -e env/.env.local -- npx prisma migrate status", + "migrate:resolve": "dotenv -e env/.env.local -- npx prisma migrate resolve", + "client:generate": "npx prisma generate --schema src/prisma/schema.prisma", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "lint:check": "eslint .", "test": "jest", @@ -33,7 +31,8 @@ "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json", - "prepare": "husky install" + "prepare": "husky install", + "ts-node": "NODE_ENV=local node -r ts-node/register -r tsconfig-paths/register " }, "prisma": { "schema": "src/prisma/schema.prisma" From 7caffb6d43b1e2bf02a8ed34112f5f4586c07137 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Sat, 20 Jan 2024 04:04:41 +0900 Subject: [PATCH 147/250] fix: cors origin port --- src/settings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings.ts b/src/settings.ts index 67977005..d04f46c4 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -21,7 +21,7 @@ const getCorsConfig = () => { const { NODE_ENV } = process.env; if (NODE_ENV === 'local') { return { - origin: 'http://localhost:3000', + origin: 'http://localhost:5173', methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', credentials: true, preflightContinue: false, From 851bb5bee838857361a353a037d39566aae9796f Mon Sep 17 00:00:00 2001 From: ddungiii Date: Sat, 20 Jan 2024 04:05:06 +0900 Subject: [PATCH 148/250] fix: db init script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 592b8562..b677f1be 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "start:prod": "node dist/main", "db:push": "dotenv -e env/.env.local -- npx prisma db push", "db:pull": "dotenv -e env/.env.local -- npx prisma db pull --schema src/prisma/schema.prisma", - "db:init": "dotenv -e env/.env.local -- npx prisma db execute --file src/prisma/migrations/0_init/migration.sql --schema src/prisma/schema.prisma && npm run migrate:resolve --applied 0_init", + "db:init": "dotenv -e env/.env.local -- npx prisma db execute --file src/prisma/migrations/0_init/migration.sql --schema src/prisma/schema.prisma && dotenv -e env/.env.local -- npx prisma migrate resolve --applied 0_init", "db:execute": "dotenv -e env/.env.local -- npx prisma db execute --schema src/prisma/schema.prisma --file", "migrate:dev-create": "dotenv -e env/.env.local -- npx prisma migrate dev --schema src/prisma/schema.prisma --create-only ", "migrate:dev": "dotenv -e env/.env.local -- npx prisma migrate dev --schema src/prisma/schema.prisma", From ce0287fea55d00c08b141d34023cab525fae77bd Mon Sep 17 00:00:00 2001 From: ddungiii Date: Sat, 20 Jan 2024 04:12:16 +0900 Subject: [PATCH 149/250] refactor: add data migrations in prisma migration script --- src/prisma/migrations/0_init/migration.sql | 13 +++++++++++++ .../migration.sql | 8 ++++++++ .../migration.sql | 7 +++++++ 3 files changed, 28 insertions(+) diff --git a/src/prisma/migrations/0_init/migration.sql b/src/prisma/migrations/0_init/migration.sql index 2486e3f0..9be92247 100644 --- a/src/prisma/migrations/0_init/migration.sql +++ b/src/prisma/migrations/0_init/migration.sql @@ -1,3 +1,16 @@ +-- CreateTable +create table _prisma_migrations ( + id varchar(36) not null primary key, + checksum varchar(64) not null, + finished_at datetime(3) null, + migration_name varchar(255) not null, + logs text null, rolled_back_at datetime(3) null, + started_at datetime(3) default CURRENT_TIMESTAMP(3) not null, + applied_steps_count int unsigned default 0 not null +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + + + -- CreateTable CREATE TABLE `auth_group` ( `id` INTEGER NOT NULL AUTO_INCREMENT, diff --git a/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/migration.sql b/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/migration.sql index 04878567..2a569ab4 100644 --- a/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/migration.sql +++ b/src/prisma/migrations/20230511150955_reconstruct_session_userprofile/migration.sql @@ -14,3 +14,11 @@ ALTER TABLE `session_userprofile` DROP COLUMN `language`, ADD COLUMN `date_joined` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, ADD COLUMN `first_name` VARCHAR(30) NOT NULL, ADD COLUMN `last_name` VARCHAR(150) NOT NULL; + +UPDATE session_userprofile su +INNER JOIN auth_user au on su.user_id = au.id +SET + su.first_name = au.first_name, + su.last_name = au.last_name, + su.email = au.email, + su.date_joined = au.date_joined \ No newline at end of file diff --git a/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql b/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql index 0fbee3f5..e3dfd4e2 100644 --- a/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql +++ b/src/prisma/migrations/20230727223002_add_fk_review_reviewvote_review_review_and_session_userprofile/migration.sql @@ -1,3 +1,10 @@ +DELETE rv +FROM + review_reviewvote rv + LEFT JOIN review_review r ON r.id = rv.review_id +WHERE + r.id IS NULL; + -- AddForeignKey ALTER TABLE `review_reviewvote` ADD CONSTRAINT `review_reviewvote_review_id_fkey` FOREIGN KEY (`review_id`) REFERENCES `review_review`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; From 759e483a4af57531300ffea9f0a8942a8132eb81 Mon Sep 17 00:00:00 2001 From: ddungiii Date: Sat, 20 Jan 2024 12:27:43 +0900 Subject: [PATCH 150/250] fix: generate script in ci --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ae4f1b6a..42396333 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -61,6 +61,6 @@ jobs: - name: Copy env file run: cp ./env/.env.example ./env/.env.local - name: Generate PrismaClient - run: npm run prisma-generate + run: npm run client:generate - name: Build run: npm run build From 871c8d2ae0ff618b151696a14f22423568ee81cb Mon Sep 17 00:00:00 2001 From: doxylee <68041124+doxylee@users.noreply.github.com> Date: Sat, 20 Jan 2024 15:08:37 +0900 Subject: [PATCH 151/250] chore: Add cross-env (#64) --- package-lock.json | 28 ++++++++++++++++++++++++++++ package.json | 7 ++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d04bc4e4..777576f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,7 @@ "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", + "cross-env": "^7.0.3", "eslint": "^8.0.1", "eslint-config-prettier": "^8.3.0", "husky": "^8.0.0", @@ -3832,6 +3833,24 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -12296,6 +12315,15 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", diff --git a/package.json b/package.json index b677f1be..e91da451 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ "build": "nest build", "format": "prettier --write .", "format:check": "prettier --check .", - "start:local": "NODE_ENV=local nest start --watch --config src/bootstrap/nest-cli.json", - "start:dev": "NODE_ENV=dev nest start --config src/bootstrap/nest-cli.json", + "start:local": "cross-env NODE_ENV=local nest start --watch --config src/bootstrap/nest-cli.json", + "start:dev": "cross-env NODE_ENV=dev nest start --config src/bootstrap/nest-cli.json", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "db:push": "dotenv -e env/.env.local -- npx prisma db push", @@ -32,7 +32,7 @@ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json", "prepare": "husky install", - "ts-node": "NODE_ENV=local node -r ts-node/register -r tsconfig-paths/register " + "ts-node": "cross-env NODE_ENV=local node -r ts-node/register -r tsconfig-paths/register " }, "prisma": { "schema": "src/prisma/schema.prisma" @@ -78,6 +78,7 @@ "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", + "cross-env": "^7.0.3", "eslint": "^8.0.1", "eslint-config-prettier": "^8.3.0", "husky": "^8.0.0", From 3a9919334a7aeb23a653935c3f020461a7a0335c Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Sat, 20 Jan 2024 15:37:53 +0900 Subject: [PATCH 152/250] fix: a bug that orderFilter return empty filters (#65) --- src/common/utils/search.utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/utils/search.utils.ts b/src/common/utils/search.utils.ts index 337fb4e7..b21e7f06 100644 --- a/src/common/utils/search.utils.ts +++ b/src/common/utils/search.utils.ts @@ -55,7 +55,7 @@ export function orderFilter(order: string[] | undefined): orderFilterType[] { } orderDict[orderBy[orderBy.length - 1]] = order; - orderFilter.push(orderDictHelper(orderBy.slice(1), order)); + orderFilter.push(orderDict); }); return orderFilter; } From ae3dd773bd1c8ce9cc16f98115958b475097b43f Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 24 Jan 2024 21:29:19 +0900 Subject: [PATCH 153/250] feat: /api/users/:id/wishlist/add-lecture API --- .../dto/wishlist/wishlist.request.dto.ts | 8 ++++ .../dto/wishlist/wishlist.response.dto.ts | 5 +++ .../serializer/lecture.serializer.ts | 42 +++++++++-------- .../serializer/wishlist.serializer.ts | 13 ++++++ src/common/schemaTypes/types.ts | 34 ++++++++++++++ src/modules/wishlist/wishlist.controller.ts | 30 +++++++++++-- src/modules/wishlist/wishlist.service.ts | 38 +++++++++++++++- .../repositories/wishlist.repository.ts | 45 +++++++++++++++++++ 8 files changed, 191 insertions(+), 24 deletions(-) create mode 100644 src/common/interfaces/dto/wishlist/wishlist.request.dto.ts create mode 100644 src/common/interfaces/dto/wishlist/wishlist.response.dto.ts create mode 100644 src/common/interfaces/serializer/wishlist.serializer.ts create mode 100644 src/prisma/repositories/wishlist.repository.ts diff --git a/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts b/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts new file mode 100644 index 00000000..47719766 --- /dev/null +++ b/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts @@ -0,0 +1,8 @@ +import { Type } from 'class-transformer'; +import { IsNumber } from 'class-validator'; + +export class WishlistAddLectureDto { + @IsNumber() + @Type(() => Number) + lecture!: number; +} diff --git a/src/common/interfaces/dto/wishlist/wishlist.response.dto.ts b/src/common/interfaces/dto/wishlist/wishlist.response.dto.ts new file mode 100644 index 00000000..0289913b --- /dev/null +++ b/src/common/interfaces/dto/wishlist/wishlist.response.dto.ts @@ -0,0 +1,5 @@ +import { NestedLectureResponseDto } from '../lecture/lecture.response.dto'; + +export interface WishlistWithLecturesResponseDto { + lectures: NestedLectureResponseDto[]; +} diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index 4289a326..4bb31517 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -1,15 +1,18 @@ import { applyOrder } from 'src/common/utils/search.utils'; -import { LectureDetails, NESTED } from '../../schemaTypes/types'; +import { + LectureDetails, + LectureMedium, + NESTED, + isLectureDetails, +} from '../../schemaTypes/types'; import { LectureResponseDto } from '../dto/lecture/lecture.response.dto'; import { toJsonClasstime } from './classtime.serializer'; import { toJsonExamtime } from './examtime.serializer'; import { toJsonProfessor } from './professor.serializer'; -export function toJsonLecture( - lecture: T extends NESTED - ? Omit - : LectureDetails, - nested: T extends NESTED ? true : false, +export function toJsonLecture( + lecture: T extends NESTED ? LectureMedium : LectureDetails, + nested: T, ): LectureResponseDto { let result = { id: lecture.id, @@ -52,17 +55,18 @@ export function toJsonLecture( return result; } - result = Object.assign(result, { - grade: lecture.grade, - load: lecture.load, - speech: lecture.speech, - classtimes: lecture.subject_classtime.map((classtime) => - toJsonClasstime(classtime), - ), - examtimes: lecture.subject_examtime.map((examtime) => - toJsonExamtime(examtime), - ), - }); - - return result; + if (isLectureDetails(lecture)) { + result = Object.assign(result, { + grade: lecture.grade, + load: lecture.load, + speech: lecture.speech, + classtimes: lecture.subject_classtime.map((classtime) => + toJsonClasstime(classtime), + ), + examtimes: lecture.subject_examtime.map((examtime) => + toJsonExamtime(examtime), + ), + }); + return result; + } else throw new Error("Lecture is not of type 'LectureDetails'"); } diff --git a/src/common/interfaces/serializer/wishlist.serializer.ts b/src/common/interfaces/serializer/wishlist.serializer.ts new file mode 100644 index 00000000..e2893f64 --- /dev/null +++ b/src/common/interfaces/serializer/wishlist.serializer.ts @@ -0,0 +1,13 @@ +import { WishlistWithLectures } from '../../schemaTypes/types'; +import { WishlistWithLecturesResponseDto } from '../dto/wishlist/wishlist.response.dto'; +import { toJsonLecture } from './lecture.serializer'; + +export const toJsonWishlist = ( + wishlist: WishlistWithLectures, +): WishlistWithLecturesResponseDto => { + return { + lectures: wishlist.timetable_wishlist_lectures.map((lecture) => + toJsonLecture(lecture.subject_lecture, true), + ), + }; +}; diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 6eb60abd..4e5ca314 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -17,6 +17,13 @@ export const courseDetails = Prisma.validator()({ }, }); +export const lectureMedium = Prisma.validator()({ + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + }, +}); + export const lectureDetails = Prisma.validator()({ include: { subject_department: true, @@ -59,6 +66,20 @@ const lectureReviews = Prisma.validator()({ }, }); +export const wishlistLectures = + Prisma.validator()({ + include: { + timetable_wishlist_lectures: { + include: { + subject_lecture: { + include: lectureMedium.include, + }, + }, + where: { subject_lecture: { deleted: false } }, + }, + }, + }); + export type LectureReviewDetails = Prisma.subject_lectureGetPayload< typeof lectureReviews >; @@ -68,6 +89,9 @@ export type ReviewDetails = Prisma.review_reviewGetPayload< export type LectureDetails = Prisma.subject_lectureGetPayload< typeof lectureDetails >; +export type LectureMedium = Prisma.subject_lectureGetPayload< + typeof lectureMedium +>; export type LectureBasic = Prisma.subject_lectureGetPayload; export type CourseDetails = Prisma.subject_courseGetPayload< typeof courseDetails @@ -77,3 +101,13 @@ export type TimeTableDetails = Prisma.timetable_timetableGetPayload< >; export type TimeTableBasic = Prisma.timetable_timetableGetPayload; export type SemesterBasic = Prisma.subject_semesterGetPayload; + +export type WishlistWithLectures = Prisma.timetable_wishlistGetPayload< + typeof wishlistLectures +>; + +export function isLectureDetails( + lecture: LectureMedium | LectureDetails, +): lecture is LectureDetails { + return 'subject_classtime' in lecture; +} diff --git a/src/modules/wishlist/wishlist.controller.ts b/src/modules/wishlist/wishlist.controller.ts index c3b52991..28f9558d 100644 --- a/src/modules/wishlist/wishlist.controller.ts +++ b/src/modules/wishlist/wishlist.controller.ts @@ -1,4 +1,28 @@ -import { Controller } from '@nestjs/common'; +import { + Body, + Controller, + Param, + Post, + UnauthorizedException, +} from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { WishlistAddLectureDto } from 'src/common/interfaces/dto/wishlist/wishlist.request.dto'; +import { toJsonWishlist } from 'src/common/interfaces/serializer/wishlist.serializer'; +import { WishlistService } from './wishlist.service'; -@Controller('wishlist') -export class WishlistController {} +@Controller('api/users/:userId/wishlist') +export class WishlistController { + constructor(private readonly wishlistService: WishlistService) {} + + @Post('add-lecture') + async addLecture( + @Param('userId') userId: number, + @Body() body: WishlistAddLectureDto, + @GetUser() user: session_userprofile, + ) { + if (userId !== user.id) throw new UnauthorizedException(); // TODO: Better message + const wishlist = await this.wishlistService.addLecture(user.id, body); + return toJsonWishlist(wishlist); + } +} diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index e44d74d3..aa29e921 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -1,4 +1,38 @@ -import { Injectable } from '@nestjs/common'; +import { + BadRequestException, + Injectable, + NotFoundException, +} from '@nestjs/common'; +import { WishlistAddLectureDto } from 'src/common/interfaces/dto/wishlist/wishlist.request.dto'; +import { LectureRepository } from 'src/prisma/repositories/lecture.repository'; +import { WishlistRepository } from 'src/prisma/repositories/wishlist.repository'; @Injectable() -export class WishlistService {} +export class WishlistService { + constructor( + private readonly wishlistRepository: WishlistRepository, + private readonly lectureRepository: LectureRepository, + ) {} + + async addLecture(userId: number, body: WishlistAddLectureDto) { + const wishlist = await this.wishlistRepository.getOrCreateWishlist(userId); + + if ( + await this.wishlistRepository.lectureExistsInWishlist( + wishlist.id, + body.lecture, + ) + ) + throw new BadRequestException("Wrong field 'lecture' in request data"); + + const lecture = await this.lectureRepository.getLectureById(body.lecture); + if (!lecture) + throw new NotFoundException( + `Lecture with id ${body.lecture} does not exist`, + ); + + await this.wishlistRepository.addLecture(wishlist.id, lecture.id); + + return await this.wishlistRepository.getWishlistLectures(wishlist.id); + } +} diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts new file mode 100644 index 00000000..85c79dda --- /dev/null +++ b/src/prisma/repositories/wishlist.repository.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@nestjs/common'; +import { + WishlistWithLectures, + wishlistLectures, +} from 'src/common/schemaTypes/types'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class WishlistRepository { + constructor(private readonly prisma: PrismaService) {} + + async getOrCreateWishlist(userId: number) { + return await this.prisma.timetable_wishlist.upsert({ + where: { user_id: userId }, + create: { user_id: userId }, + update: {}, + }); + } + + async addLecture(wishlistId: number, lectureId: number) { + return await this.prisma.timetable_wishlist_lectures.upsert({ + where: { + wishlist_id_lecture_id: { + lecture_id: lectureId, + wishlist_id: wishlistId, + }, + }, + create: { wishlist_id: wishlistId, lecture_id: lectureId }, + update: {}, + }); + } + + async lectureExistsInWishlist(wishlistId: number, lectureId: number) { + return await this.prisma.timetable_wishlist_lectures.findFirst({ + where: { lecture_id: lectureId, wishlist_id: wishlistId }, + }); + } + + async getWishlistLectures(wishlistId: number) { + return (await this.prisma.timetable_wishlist.findUnique({ + where: { id: wishlistId }, + include: wishlistLectures.include, + })) as WishlistWithLectures; + } +} From a73aec7015bc90acae0b7bf52b17dbb1c6d0fa17 Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 24 Jan 2024 22:00:15 +0900 Subject: [PATCH 154/250] refactor: Rename LectureMedium -> LectureExtended --- src/common/interfaces/serializer/lecture.serializer.ts | 4 ++-- src/common/schemaTypes/types.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index 4bb31517..ed261379 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -1,7 +1,7 @@ import { applyOrder } from 'src/common/utils/search.utils'; import { LectureDetails, - LectureMedium, + LectureExtended, NESTED, isLectureDetails, } from '../../schemaTypes/types'; @@ -11,7 +11,7 @@ import { toJsonExamtime } from './examtime.serializer'; import { toJsonProfessor } from './professor.serializer'; export function toJsonLecture( - lecture: T extends NESTED ? LectureMedium : LectureDetails, + lecture: T extends NESTED ? LectureExtended : LectureDetails, nested: T, ): LectureResponseDto { let result = { diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 4e5ca314..300805e0 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -17,7 +17,7 @@ export const courseDetails = Prisma.validator()({ }, }); -export const lectureMedium = Prisma.validator()({ +export const lectureExtended = Prisma.validator()({ include: { subject_department: true, subject_lecture_professors: { include: { professor: true } }, @@ -72,7 +72,7 @@ export const wishlistLectures = timetable_wishlist_lectures: { include: { subject_lecture: { - include: lectureMedium.include, + include: lectureExtended.include, }, }, where: { subject_lecture: { deleted: false } }, @@ -89,8 +89,8 @@ export type ReviewDetails = Prisma.review_reviewGetPayload< export type LectureDetails = Prisma.subject_lectureGetPayload< typeof lectureDetails >; -export type LectureMedium = Prisma.subject_lectureGetPayload< - typeof lectureMedium +export type LectureExtended = Prisma.subject_lectureGetPayload< + typeof lectureExtended >; export type LectureBasic = Prisma.subject_lectureGetPayload; export type CourseDetails = Prisma.subject_courseGetPayload< @@ -107,7 +107,7 @@ export type WishlistWithLectures = Prisma.timetable_wishlistGetPayload< >; export function isLectureDetails( - lecture: LectureMedium | LectureDetails, + lecture: LectureExtended | LectureDetails, ): lecture is LectureDetails { return 'subject_classtime' in lecture; } From a6fb2fff9b8743074aed25b08cad44407739533e Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 21:49:28 +0900 Subject: [PATCH 155/250] =?UTF-8?q?fix:=20isLectureDetails=20subject=5Fexa?= =?UTF-8?q?mtime=EB=8F=84=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/schemaTypes/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 300805e0..e7eec3ce 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -109,5 +109,5 @@ export type WishlistWithLectures = Prisma.timetable_wishlistGetPayload< export function isLectureDetails( lecture: LectureExtended | LectureDetails, ): lecture is LectureDetails { - return 'subject_classtime' in lecture; + return 'subject_classtime' in lecture && 'subject_examtime' in lecture; } From 965f0676a2e14aa39aadf1450ededfabf2ed7cba Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 21:53:34 +0900 Subject: [PATCH 156/250] fix: rename repository method lectureExistsInWishlist -> getLectureInWishlist --- src/modules/wishlist/wishlist.service.ts | 2 +- src/prisma/repositories/wishlist.repository.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index aa29e921..cf7406c5 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -18,7 +18,7 @@ export class WishlistService { const wishlist = await this.wishlistRepository.getOrCreateWishlist(userId); if ( - await this.wishlistRepository.lectureExistsInWishlist( + await this.wishlistRepository.getLectureInWishlist( wishlist.id, body.lecture, ) diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts index 85c79dda..e8321af1 100644 --- a/src/prisma/repositories/wishlist.repository.ts +++ b/src/prisma/repositories/wishlist.repository.ts @@ -30,9 +30,14 @@ export class WishlistRepository { }); } - async lectureExistsInWishlist(wishlistId: number, lectureId: number) { - return await this.prisma.timetable_wishlist_lectures.findFirst({ - where: { lecture_id: lectureId, wishlist_id: wishlistId }, + async getLectureInWishlist(wishlistId: number, lectureId: number) { + return await this.prisma.timetable_wishlist_lectures.findUnique({ + where: { + wishlist_id_lecture_id: { + wishlist_id: wishlistId, + lecture_id: lectureId, + }, + }, }); } From 10c916658ae258e1754f1c669e3e5276986cf80b Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 22:00:35 +0900 Subject: [PATCH 157/250] refactor: Rename wishlistLectures -> wishlistWithLectures --- src/common/schemaTypes/types.ts | 4 ++-- src/prisma/repositories/wishlist.repository.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index e7eec3ce..17b0dda3 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -66,7 +66,7 @@ const lectureReviews = Prisma.validator()({ }, }); -export const wishlistLectures = +export const wishlistWithLectures = Prisma.validator()({ include: { timetable_wishlist_lectures: { @@ -103,7 +103,7 @@ export type TimeTableBasic = Prisma.timetable_timetableGetPayload; export type SemesterBasic = Prisma.subject_semesterGetPayload; export type WishlistWithLectures = Prisma.timetable_wishlistGetPayload< - typeof wishlistLectures + typeof wishlistWithLectures >; export function isLectureDetails( diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts index e8321af1..dd52f61e 100644 --- a/src/prisma/repositories/wishlist.repository.ts +++ b/src/prisma/repositories/wishlist.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { WishlistWithLectures, - wishlistLectures, + wishlistWithLectures, } from 'src/common/schemaTypes/types'; import { PrismaService } from '../prisma.service'; @@ -44,7 +44,7 @@ export class WishlistRepository { async getWishlistLectures(wishlistId: number) { return (await this.prisma.timetable_wishlist.findUnique({ where: { id: wishlistId }, - include: wishlistLectures.include, + include: wishlistWithLectures.include, })) as WishlistWithLectures; } } From 692eeee094b53f8ffe8c31354c4a443bf7e7fb27 Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 22:04:44 +0900 Subject: [PATCH 158/250] =?UTF-8?q?refactor:=20toJsonLecture=EC=97=90?= =?UTF-8?q?=EC=84=9C=20error=20case=20=EC=9C=84=EC=AA=BD=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B9=BC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serializer/lecture.serializer.ts | 29 ++++++++++--------- .../repositories/wishlist.repository.ts | 8 +++-- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/common/interfaces/serializer/lecture.serializer.ts b/src/common/interfaces/serializer/lecture.serializer.ts index ed261379..dafdbe39 100644 --- a/src/common/interfaces/serializer/lecture.serializer.ts +++ b/src/common/interfaces/serializer/lecture.serializer.ts @@ -55,18 +55,19 @@ export function toJsonLecture( return result; } - if (isLectureDetails(lecture)) { - result = Object.assign(result, { - grade: lecture.grade, - load: lecture.load, - speech: lecture.speech, - classtimes: lecture.subject_classtime.map((classtime) => - toJsonClasstime(classtime), - ), - examtimes: lecture.subject_examtime.map((examtime) => - toJsonExamtime(examtime), - ), - }); - return result; - } else throw new Error("Lecture is not of type 'LectureDetails'"); + if (!isLectureDetails(lecture)) + throw new Error("Lecture is not of type 'LectureDetails'"); + + result = Object.assign(result, { + grade: lecture.grade, + load: lecture.load, + speech: lecture.speech, + classtimes: lecture.subject_classtime.map((classtime) => + toJsonClasstime(classtime), + ), + examtimes: lecture.subject_examtime.map((examtime) => + toJsonExamtime(examtime), + ), + }); + return result; } diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts index dd52f61e..e6a42cca 100644 --- a/src/prisma/repositories/wishlist.repository.ts +++ b/src/prisma/repositories/wishlist.repository.ts @@ -41,10 +41,12 @@ export class WishlistRepository { }); } - async getWishlistLectures(wishlistId: number) { - return (await this.prisma.timetable_wishlist.findUnique({ + async getWishlistLectures( + wishlistId: number, + ): Promise { + return await this.prisma.timetable_wishlist.findUnique({ where: { id: wishlistId }, include: wishlistWithLectures.include, - })) as WishlistWithLectures; + }); } } From 498329c48b02e0e2297ab000a5d73fba55cab9db Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 22:08:50 +0900 Subject: [PATCH 159/250] fix: Handle case where wishlist is not found after update --- src/modules/wishlist/wishlist.service.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index cf7406c5..5bfebda9 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -32,7 +32,10 @@ export class WishlistService { ); await this.wishlistRepository.addLecture(wishlist.id, lecture.id); - - return await this.wishlistRepository.getWishlistLectures(wishlist.id); + const updatedWishlist = await this.wishlistRepository.getWishlistLectures( + wishlist.id, + ); + if (!updatedWishlist) throw new Error('Wishlist not found'); + return updatedWishlist; } } From 42883f108d981e864d1b3124c3d0a9cee3aa6a9d Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 22:10:38 +0900 Subject: [PATCH 160/250] refactor: Rename repository method getWishlistLectures -> getWishlistWithLectures --- src/modules/wishlist/wishlist.service.ts | 5 ++--- src/prisma/repositories/wishlist.repository.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index 5bfebda9..77293c6a 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -32,9 +32,8 @@ export class WishlistService { ); await this.wishlistRepository.addLecture(wishlist.id, lecture.id); - const updatedWishlist = await this.wishlistRepository.getWishlistLectures( - wishlist.id, - ); + const updatedWishlist = + await this.wishlistRepository.getWishlistWithLectures(wishlist.id); if (!updatedWishlist) throw new Error('Wishlist not found'); return updatedWishlist; } diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts index e6a42cca..2d753c4e 100644 --- a/src/prisma/repositories/wishlist.repository.ts +++ b/src/prisma/repositories/wishlist.repository.ts @@ -41,7 +41,7 @@ export class WishlistRepository { }); } - async getWishlistLectures( + async getWishlistWithLectures( wishlistId: number, ): Promise { return await this.prisma.timetable_wishlist.findUnique({ From e315a8d470876418fc45fbbf3a9b88075c0a850b Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 23:13:32 +0900 Subject: [PATCH 161/250] fix: getlectures API --- src/prisma/repositories/course.repository.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index c9877881..11aec4fd 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -343,11 +343,17 @@ export class CourseRepository { const filter = []; - if ('Basic' in group) { + if (group.includes('Basic')) { filter.push('Basic Required', 'Basic Elective'); } - if ('Humanity' in group) { - filter.push('Humanities & Social Elective'); + if (group.includes('Humanity')) { + filter.push( + 'Humanities & Social Elective', + 'Humanities & Social Elective(Arts-Co', + 'Humanities & Social Elective(Arts-Ge', + 'Humanities & Social Elective(Humanit', + 'Humanities & Social Elective(Social-', + ); } if (group.length > 2) { filter.push('Major Required', 'Major Elective', 'Elective(Graduate)'); @@ -355,7 +361,7 @@ export class CourseRepository { return { type_en: { - in: { filter }, + in: filter, }, }; } From 84d0c7c38f3ed4279fdf2a692ac4fe7f4c6d6b15 Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 23:36:00 +0900 Subject: [PATCH 162/250] fix: Wrong group filter condition --- src/prisma/repositories/course.repository.ts | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 11aec4fd..853c6195 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -341,28 +341,28 @@ export class CourseRepository { return null; } - const filter = []; + const filters = []; + const includeHumanity = group.includes('Humanity'); if (group.includes('Basic')) { - filter.push('Basic Required', 'Basic Elective'); + group.splice(group.indexOf('Basic'), 1); + filters.push({ type_en: { in: ['Basic Required', 'Basic Elective'] } }); } if (group.includes('Humanity')) { - filter.push( - 'Humanities & Social Elective', - 'Humanities & Social Elective(Arts-Co', - 'Humanities & Social Elective(Arts-Ge', - 'Humanities & Social Elective(Humanit', - 'Humanities & Social Elective(Social-', - ); + group.splice(group.indexOf('Humanity'), 1); + filters.push({ type_en: { startsWith: 'Humanities & Social Elective' } }); } - if (group.length > 2) { - filter.push('Major Required', 'Major Elective', 'Elective(Graduate)'); + if (group.length) { + filters.push({ + type_en: { + in: ['Major Required', 'Major Elective', 'Elective(Graduate)'], + }, + subject_department: { code: { in: group } }, + }); } return { - type_en: { - in: filter, - }, + OR: filters, }; } From 26b2d36c9ea4a420809d971dfaed709eacb1a884 Mon Sep 17 00:00:00 2001 From: doxylee Date: Thu, 1 Feb 2024 00:00:24 +0900 Subject: [PATCH 163/250] fix: module definition --- src/app.module.ts | 2 ++ src/modules/wishlist/wishlist.module.ts | 4 ++++ src/prisma/prisma.module.ts | 3 +++ 3 files changed, 9 insertions(+) diff --git a/src/app.module.ts b/src/app.module.ts index 575cd740..cfd06835 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -13,6 +13,7 @@ import { SemestersModule } from './modules/semesters/semesters.module'; import { StatusModule } from './modules/status/status.module'; import { TimetablesModule } from './modules/timetables/timetables.module'; import { UserModule } from './modules/user/user.module'; +import { WishlistModule } from './modules/wishlist/wishlist.module'; import { PrismaModule } from './prisma/prisma.module'; @Module({ @@ -26,6 +27,7 @@ import { PrismaModule } from './prisma/prisma.module'; SemestersModule, TimetablesModule, StatusModule, + WishlistModule, ], controllers: [AppController], providers: [ diff --git a/src/modules/wishlist/wishlist.module.ts b/src/modules/wishlist/wishlist.module.ts index 35162849..0321b8a8 100644 --- a/src/modules/wishlist/wishlist.module.ts +++ b/src/modules/wishlist/wishlist.module.ts @@ -1,7 +1,11 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; import { WishlistController } from './wishlist.controller'; +import { WishlistService } from './wishlist.service'; @Module({ + imports: [PrismaModule], controllers: [WishlistController], + providers: [WishlistService], }) export class WishlistModule {} diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 7233b0c0..026d13cf 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -7,6 +7,7 @@ import { ReviewsRepository } from './repositories/review.repository'; import { SemesterRepository } from './repositories/semester.repository'; import { TimetableRepository } from './repositories/timetable.repository'; import { UserRepository } from './repositories/user.repository'; +import { WishlistRepository } from './repositories/wishlist.repository'; @Module({ providers: [ @@ -18,6 +19,7 @@ import { UserRepository } from './repositories/user.repository'; CourseRepository, SemesterRepository, TimetableRepository, + WishlistRepository, ], exports: [ PrismaService, @@ -28,6 +30,7 @@ import { UserRepository } from './repositories/user.repository'; CourseRepository, SemesterRepository, TimetableRepository, + WishlistRepository, ], }) export class PrismaModule {} From 63a9ce3b8a0a2d6fe688c8668686f8a0e32d5f1f Mon Sep 17 00:00:00 2001 From: doxylee Date: Thu, 1 Feb 2024 00:09:08 +0900 Subject: [PATCH 164/250] fix: wishlist must use LectureDetails instead of LectureExtended --- src/common/interfaces/serializer/wishlist.serializer.ts | 2 +- src/common/schemaTypes/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/interfaces/serializer/wishlist.serializer.ts b/src/common/interfaces/serializer/wishlist.serializer.ts index e2893f64..455fca0d 100644 --- a/src/common/interfaces/serializer/wishlist.serializer.ts +++ b/src/common/interfaces/serializer/wishlist.serializer.ts @@ -7,7 +7,7 @@ export const toJsonWishlist = ( ): WishlistWithLecturesResponseDto => { return { lectures: wishlist.timetable_wishlist_lectures.map((lecture) => - toJsonLecture(lecture.subject_lecture, true), + toJsonLecture(lecture.subject_lecture, false), ), }; }; diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 17b0dda3..2faa6fc6 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -72,7 +72,7 @@ export const wishlistWithLectures = timetable_wishlist_lectures: { include: { subject_lecture: { - include: lectureExtended.include, + include: lectureDetails.include, }, }, where: { subject_lecture: { deleted: false } }, From e3f3e786f4a912187a03ef19ac5d747e1a01f8bd Mon Sep 17 00:00:00 2001 From: doxylee Date: Wed, 31 Jan 2024 23:58:29 +0900 Subject: [PATCH 165/250] feat: getWishlist API --- src/modules/wishlist/wishlist.controller.ts | 13 +++++++++++++ src/modules/wishlist/wishlist.service.ts | 4 ++++ src/prisma/repositories/wishlist.repository.ts | 1 + 3 files changed, 18 insertions(+) diff --git a/src/modules/wishlist/wishlist.controller.ts b/src/modules/wishlist/wishlist.controller.ts index 28f9558d..265cec47 100644 --- a/src/modules/wishlist/wishlist.controller.ts +++ b/src/modules/wishlist/wishlist.controller.ts @@ -1,6 +1,7 @@ import { Body, Controller, + Get, Param, Post, UnauthorizedException, @@ -15,6 +16,18 @@ import { WishlistService } from './wishlist.service'; export class WishlistController { constructor(private readonly wishlistService: WishlistService) {} + @Get() + async getLectures( + @Param('userId') userId: number, + @GetUser() user: session_userprofile, + ) { + if (userId !== user.id) throw new UnauthorizedException(); // TODO: Better message + const wishlist = await this.wishlistService.getWishlistWithLectures( + user.id, + ); + return toJsonWishlist(wishlist); + } + @Post('add-lecture') async addLecture( @Param('userId') userId: number, diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index 77293c6a..2d27d002 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -14,6 +14,10 @@ export class WishlistService { private readonly lectureRepository: LectureRepository, ) {} + async getWishlistWithLectures(userId: number) { + return await this.wishlistRepository.getOrCreateWishlist(userId); + } + async addLecture(userId: number, body: WishlistAddLectureDto) { const wishlist = await this.wishlistRepository.getOrCreateWishlist(userId); diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts index 2d753c4e..cefd5bcc 100644 --- a/src/prisma/repositories/wishlist.repository.ts +++ b/src/prisma/repositories/wishlist.repository.ts @@ -14,6 +14,7 @@ export class WishlistRepository { where: { user_id: userId }, create: { user_id: userId }, update: {}, + include: wishlistWithLectures.include, }); } From a429fcefad192621025f599653499f1a7352cebc Mon Sep 17 00:00:00 2001 From: doxylee Date: Thu, 1 Feb 2024 00:15:46 +0900 Subject: [PATCH 166/250] feat: Remove wishlist lecture API --- src/modules/wishlist/wishlist.controller.ts | 11 +++++++++++ src/modules/wishlist/wishlist.service.ts | 18 ++++++++++++++++++ src/prisma/repositories/wishlist.repository.ts | 11 +++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/modules/wishlist/wishlist.controller.ts b/src/modules/wishlist/wishlist.controller.ts index 265cec47..781374fd 100644 --- a/src/modules/wishlist/wishlist.controller.ts +++ b/src/modules/wishlist/wishlist.controller.ts @@ -38,4 +38,15 @@ export class WishlistController { const wishlist = await this.wishlistService.addLecture(user.id, body); return toJsonWishlist(wishlist); } + + @Post('remove-lecture') + async removeLecture( + @Param('userId') userId: number, + @Body() body: WishlistAddLectureDto, + @GetUser() user: session_userprofile, + ) { + if (userId !== user.id) throw new UnauthorizedException(); // TODO: Better message + const wishlist = await this.wishlistService.removeLecture(user.id, body); + return toJsonWishlist(wishlist); + } } diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index 2d27d002..48f2162b 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -41,4 +41,22 @@ export class WishlistService { if (!updatedWishlist) throw new Error('Wishlist not found'); return updatedWishlist; } + + async removeLecture(userId: number, body: WishlistAddLectureDto) { + const wishlist = await this.wishlistRepository.getOrCreateWishlist(userId); + + if ( + !(await this.wishlistRepository.getLectureInWishlist( + wishlist.id, + body.lecture, + )) + ) + throw new BadRequestException("Wrong field 'lecture' in request data"); + + await this.wishlistRepository.removeLecture(wishlist.id, body.lecture); + const updatedWishlist = + await this.wishlistRepository.getWishlistWithLectures(wishlist.id); + if (!updatedWishlist) throw new Error('Wishlist not found'); + return updatedWishlist; + } } diff --git a/src/prisma/repositories/wishlist.repository.ts b/src/prisma/repositories/wishlist.repository.ts index cefd5bcc..dc41db42 100644 --- a/src/prisma/repositories/wishlist.repository.ts +++ b/src/prisma/repositories/wishlist.repository.ts @@ -31,6 +31,17 @@ export class WishlistRepository { }); } + async removeLecture(wishlistId: number, lectureId: number) { + return await this.prisma.timetable_wishlist_lectures.delete({ + where: { + wishlist_id_lecture_id: { + lecture_id: lectureId, + wishlist_id: wishlistId, + }, + }, + }); + } + async getLectureInWishlist(wishlistId: number, lectureId: number) { return await this.prisma.timetable_wishlist_lectures.findUnique({ where: { From 57c9edc3a71a0545aa00e5b798f811c024f7f1af Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Thu, 1 Feb 2024 20:17:56 +0900 Subject: [PATCH 167/250] refactor: remove request, query logs (#69) --- src/bootstrap/bootstrap.ts | 22 +++++++++++----------- src/prisma/prisma.service.ts | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/bootstrap/bootstrap.ts b/src/bootstrap/bootstrap.ts index fa8730fb..d4095e36 100644 --- a/src/bootstrap/bootstrap.ts +++ b/src/bootstrap/bootstrap.ts @@ -37,17 +37,17 @@ async function bootstrap() { ); app.use(cookieParser()); // Logs requests - app.use( - morgan(':method :url OS/:req[client-os] Ver/:req[client-api-version]', { - // https://github.com/expressjs/morgan#immediate - immediate: true, - stream: { - write: (message) => { - console.info(message.trim()); - }, - }, - }), - ); + // app.use( + // morgan(':method :url OS/:req[client-os] Ver/:req[client-api-version]', { + // // https://github.com/expressjs/morgan#immediate + // immediate: true, + // stream: { + // write: (message) => { + // console.info(message.trim()); + // }, + // }, + // }), + // ); // Logs responses app.use( diff --git a/src/prisma/prisma.service.ts b/src/prisma/prisma.service.ts index d18ea1a6..64e6abfd 100644 --- a/src/prisma/prisma.service.ts +++ b/src/prisma/prisma.service.ts @@ -14,7 +14,7 @@ export class PrismaService extends PrismaClient implements OnModuleInit { // @ts-ignore this.$on('query', async (e) => { // @ts-ignore - console.log(`Query: ${e.query} ${e.params}`); + // console.log(`Query: ${e.query} ${e.params}`); }); } From 6f6811dea782abeba4b07c8d129db6570949c6d9 Mon Sep 17 00:00:00 2001 From: doxylee <68041124+doxylee@users.noreply.github.com> Date: Wed, 14 Feb 2024 20:05:08 +0900 Subject: [PATCH 168/250] =?UTF-8?q?refactor:=20wishlist=20remove=20API?= =?UTF-8?q?=EC=97=90=EC=84=9C=EB=8F=84=20add=20DTO=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EB=8D=98=20=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#72)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/interfaces/dto/wishlist/wishlist.request.dto.ts | 6 ++++++ src/modules/wishlist/wishlist.controller.ts | 7 +++++-- src/modules/wishlist/wishlist.service.ts | 7 +++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts b/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts index 47719766..834248ca 100644 --- a/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts +++ b/src/common/interfaces/dto/wishlist/wishlist.request.dto.ts @@ -6,3 +6,9 @@ export class WishlistAddLectureDto { @Type(() => Number) lecture!: number; } + +export class WishlistRemoveLectureDto { + @IsNumber() + @Type(() => Number) + lecture!: number; +} diff --git a/src/modules/wishlist/wishlist.controller.ts b/src/modules/wishlist/wishlist.controller.ts index 781374fd..a994b101 100644 --- a/src/modules/wishlist/wishlist.controller.ts +++ b/src/modules/wishlist/wishlist.controller.ts @@ -8,7 +8,10 @@ import { } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { GetUser } from 'src/common/decorators/get-user.decorator'; -import { WishlistAddLectureDto } from 'src/common/interfaces/dto/wishlist/wishlist.request.dto'; +import { + WishlistAddLectureDto, + WishlistRemoveLectureDto, +} from 'src/common/interfaces/dto/wishlist/wishlist.request.dto'; import { toJsonWishlist } from 'src/common/interfaces/serializer/wishlist.serializer'; import { WishlistService } from './wishlist.service'; @@ -42,7 +45,7 @@ export class WishlistController { @Post('remove-lecture') async removeLecture( @Param('userId') userId: number, - @Body() body: WishlistAddLectureDto, + @Body() body: WishlistRemoveLectureDto, @GetUser() user: session_userprofile, ) { if (userId !== user.id) throw new UnauthorizedException(); // TODO: Better message diff --git a/src/modules/wishlist/wishlist.service.ts b/src/modules/wishlist/wishlist.service.ts index 48f2162b..8f1b9a8d 100644 --- a/src/modules/wishlist/wishlist.service.ts +++ b/src/modules/wishlist/wishlist.service.ts @@ -3,7 +3,10 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; -import { WishlistAddLectureDto } from 'src/common/interfaces/dto/wishlist/wishlist.request.dto'; +import { + WishlistAddLectureDto, + WishlistRemoveLectureDto, +} from 'src/common/interfaces/dto/wishlist/wishlist.request.dto'; import { LectureRepository } from 'src/prisma/repositories/lecture.repository'; import { WishlistRepository } from 'src/prisma/repositories/wishlist.repository'; @@ -42,7 +45,7 @@ export class WishlistService { return updatedWishlist; } - async removeLecture(userId: number, body: WishlistAddLectureDto) { + async removeLecture(userId: number, body: WishlistRemoveLectureDto) { const wishlist = await this.wishlistRepository.getOrCreateWishlist(userId); if ( From a73cda6d897d3282eddfadca629ecb83054977bb Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 14 Feb 2024 20:59:31 +0900 Subject: [PATCH 169/250] feat: Add get feed API (#66) * feat: implement without detail feed * chore: add prisma generate on ci * chore: fix prisma-generate command * chore: remove ci branch on target branches * chore: rename generating step name * refactor: prisma scripts * fix: cors origin port * fix: db init script * refactor: add data migrations in prisma migration script * fix: generate script in ci * chore: Add cross-env (#64) * fix: a bug that orderFilter return empty filters (#65) * feat: add feeds module * feat: move feeds api to feeds module * feat: add IFeed * feat: add feed repository and serializer * feat: add get famousHumanityFeeds * feat: make random select HumanityBestReviews * refactor: change class to interface * feat: add rankedReviewDailyFeed * feat: add famous major review daily feed * feat: add review write daily user feed * feat: add ICourse * feat: add related course daily user feed * feat: add rate daily user feed * feat: add const FeedType * refactor: add FeedSchema namespace * refactor: add details interface in IFeed * refactor: rename redundant feed names * refactor: add Feed constants * fix: fix related course * refactor: fix typos * feat: add writable review * feat: comment out related course * refactor: move ICourse to structures * refactor: move directory interfaces * refactor: rename schemaTypes to entities * refactor: remove redundant prefix I * refactor: remove redundant prefix E * refactor: remove redundant prefix E --------- Co-authored-by: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Co-authored-by: doxylee <68041124+doxylee@users.noreply.github.com> --- src/app.module.ts | 2 + src/common/entites/EFeed.ts | 116 ++++++++ src/common/interfaces/IAuth.ts | 19 ++ src/common/interfaces/ICourse.ts | 26 ++ src/common/interfaces/IFeed.ts | 47 ++++ src/common/interfaces/constants/feed.ts | 23 ++ .../dto/reviews/review.response.dto.ts | 22 +- src/common/interfaces/index.ts | 3 + .../serializer/course.serializer.ts | 37 ++- .../interfaces/serializer/feeds.serializer.ts | 52 ++++ src/common/interfaces/structures/IAuth.ts | 19 -- src/common/interfaces/structures/index.ts | 1 - src/common/schemaTypes/types.ts | 7 +- src/common/utils/method.utils.ts | 5 + src/modules/auth/auth.controller.ts | 14 +- .../auth/strategy/jwt-cookie.strategy.ts | 4 +- src/modules/feeds/feeds.controller.ts | 20 ++ src/modules/feeds/feeds.module.ts | 13 + src/modules/feeds/feeds.service.ts | 88 ++++++ .../repositories/department.repository.ts | 22 ++ src/prisma/repositories/feeds.repository.ts | 252 ++++++++++++++++++ src/prisma/repositories/review.repository.ts | 12 +- .../repositories/semester.repository.ts | 14 +- src/prisma/repositories/user.repository.ts | 33 ++- 24 files changed, 804 insertions(+), 47 deletions(-) create mode 100644 src/common/entites/EFeed.ts create mode 100644 src/common/interfaces/IAuth.ts create mode 100644 src/common/interfaces/ICourse.ts create mode 100644 src/common/interfaces/IFeed.ts create mode 100644 src/common/interfaces/constants/feed.ts create mode 100644 src/common/interfaces/index.ts create mode 100644 src/common/interfaces/serializer/feeds.serializer.ts delete mode 100644 src/common/interfaces/structures/IAuth.ts delete mode 100644 src/common/interfaces/structures/index.ts create mode 100644 src/modules/feeds/feeds.controller.ts create mode 100644 src/modules/feeds/feeds.module.ts create mode 100644 src/modules/feeds/feeds.service.ts create mode 100644 src/prisma/repositories/feeds.repository.ts diff --git a/src/app.module.ts b/src/app.module.ts index cfd06835..9b9243d1 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,6 +7,7 @@ import { AuthModule } from './modules/auth/auth.module'; import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; import { CoursesModule } from './modules/courses/courses.module'; +import { FeedsModule } from './modules/feeds/feeds.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; import { SemestersModule } from './modules/semesters/semesters.module'; @@ -27,6 +28,7 @@ import { PrismaModule } from './prisma/prisma.module'; SemestersModule, TimetablesModule, StatusModule, + FeedsModule, WishlistModule, ], controllers: [AppController], diff --git a/src/common/entites/EFeed.ts b/src/common/entites/EFeed.ts new file mode 100644 index 00000000..7a730a13 --- /dev/null +++ b/src/common/entites/EFeed.ts @@ -0,0 +1,116 @@ +import { Prisma } from '@prisma/client'; +import { + ReviewDetails, + courseDetails, + lectureDetails, + reviewDetails, +} from '../schemaTypes/types'; + +export namespace EFeed { + export const FamousHumanityReviewDetails = + Prisma.validator()({ + include: { + main_famoushumanityreviewdailyfeed_reviews: { + include: { review_review: { include: reviewDetails.include } }, + }, + }, + }); + + export const RankedReviewDetails = + Prisma.validator()({}); + + export const FamousMajorReviewDetails = + Prisma.validator()({ + include: { + subject_department: true, + main_famousmajorreviewdailyfeed_reviews: { + include: { review_review: { include: reviewDetails.include } }, + }, + }, + }); + + export const ReviewWriteDetails = + Prisma.validator()({ + include: { + subject_lecture: { + include: lectureDetails.include, + }, + }, + }); + + export const RelatedCourseDetails = + Prisma.validator()({ + include: { + subject_course: { + include: courseDetails.include, + }, + }, + }); + + export const RateDailyDetails = + Prisma.validator()({}); + + export type FamousHumanityReviewDetails = + Prisma.main_famoushumanityreviewdailyfeedGetPayload< + typeof FamousHumanityReviewDetails + >; + + export type RankedReviewDetails = Prisma.main_rankedreviewdailyfeedGetPayload< + typeof RankedReviewDetails + > & { + reviews: ReviewDetails[]; + }; + + export type FamousMajorReviewDetails = + Prisma.main_famousmajorreviewdailyfeedGetPayload< + typeof FamousMajorReviewDetails + >; + + export type ReviewWriteDetails = + Prisma.main_reviewwritedailyuserfeedGetPayload; + + export type RelatedCourseDetails = + Prisma.main_relatedcoursedailyuserfeedGetPayload< + typeof RelatedCourseDetails + >; + + export type RateDailyDetails = Prisma.main_ratedailyuserfeedGetPayload< + typeof RateDailyDetails + >; + + export type Details = + | FamousHumanityReviewDetails + | RankedReviewDetails + | FamousMajorReviewDetails + | ReviewWriteDetails + | RelatedCourseDetails + | RateDailyDetails; + + export const isFamousHumanityReview = ( + feed: Details, + ): feed is FamousHumanityReviewDetails => { + return 'main_famoushumanityreviewdailyfeed_reviews' in feed; + }; + + export const isFamousMajorReview = ( + feed: Details, + ): feed is FamousMajorReviewDetails => { + return 'main_famousmajorreviewdailyfeed_reviews' in feed; + }; + + export const isReviewWrite = (feed: Details): feed is ReviewWriteDetails => { + return 'subject_lecture' in feed; + }; + + export const isRelatedCourse = ( + feed: Details, + ): feed is RelatedCourseDetails => { + return 'subject_course' in feed; + }; + + export const isRankedReview = ( + feed: Details, + ): feed is RankedReviewDetails => { + return 'semester_id' in feed; + }; +} diff --git a/src/common/interfaces/IAuth.ts b/src/common/interfaces/IAuth.ts new file mode 100644 index 00000000..21a0df20 --- /dev/null +++ b/src/common/interfaces/IAuth.ts @@ -0,0 +1,19 @@ +import { Request as _Request, Response as _Response } from 'express'; + +export namespace IAuth { + export type Request = _Request & RequestExtra; + + export interface RequestExtra { + session: { + next: string; + + sso_state: string; + }; + } + + export interface Response extends _Response {} + + export interface JwtPayload { + sid: string; + } +} diff --git a/src/common/interfaces/ICourse.ts b/src/common/interfaces/ICourse.ts new file mode 100644 index 00000000..edb07a41 --- /dev/null +++ b/src/common/interfaces/ICourse.ts @@ -0,0 +1,26 @@ +export namespace ICourse { + export interface Basic { + id: number; + old_code: string; + department_id: number; + type: string; + type_en: string; + title: string; + title_en: string; + summary: string; + grade_sum: number; + load_sum: number; + speech_sum: number; + review_total_weight: number; + grade: number; + load: number; + speech: number; + title_en_no_space: string; + title_no_space: string; + } + + export interface Related extends Basic { + related_courses_prior: Basic[]; + related_courses_posterior: Basic[]; + } +} diff --git a/src/common/interfaces/IFeed.ts b/src/common/interfaces/IFeed.ts new file mode 100644 index 00000000..4da99930 --- /dev/null +++ b/src/common/interfaces/IFeed.ts @@ -0,0 +1,47 @@ +import { IsDateString } from 'class-validator'; +import { ICourse } from './ICourse'; +import { DepartmentResponseDto } from './dto/department/department.response.dto'; +import { NestedLectureResponseDto } from './dto/lecture/lecture.response.dto'; +import { ReviewResponseDto } from './dto/reviews/review.response.dto'; + +export namespace IFeed { + export interface Basic { + type: string; + date: Date; + priority: number; + } + + export interface FamousHumanityReview extends Basic { + reviews: ReviewResponseDto[]; + } + + export interface FamousMajorReview extends Basic { + reviews: ReviewResponseDto[]; + department: DepartmentResponseDto; + } + + export interface ReviewWrite extends Basic { + lecture: NestedLectureResponseDto; + } + + export interface RelatedCourse extends Basic { + course: ICourse.Related; + } + + export interface RankedReview extends Basic { + reviews: ReviewResponseDto[]; + } + + export type Details = + | Basic + | FamousHumanityReview + | FamousMajorReview + | ReviewWrite + | RelatedCourse + | RankedReview; + + export class QueryDto { + @IsDateString() + date!: string; + } +} diff --git a/src/common/interfaces/constants/feed.ts b/src/common/interfaces/constants/feed.ts new file mode 100644 index 00000000..43673d20 --- /dev/null +++ b/src/common/interfaces/constants/feed.ts @@ -0,0 +1,23 @@ +import { Union } from '../../utils/method.utils'; + +export const FeedType = { + FamousHumanityReview: 'FAMOUS_HUMANITY_REVIEW', + FamousMajorReview: 'FAMOUS_MAJOR_REVIEW', + ReviewWrite: 'REVIEW_WRITE', + RelatedCourse: 'RELATED_COURSE', + RankedReview: 'RANKED_REVIEW', + Rate: 'RATE', +}; +export type FeedType = Union; + +export const FeedVisibleRate = { + FamousHumanityReview: 0.5, + FamousMajorReview: 0.6, + ReviewWrite: 0.6, + RelatedCourse: 0.45, + RankedReview: 0.15, + Rate: 0.25, +}; +export type FeedVisibleRate = Union; + +export const FeedRateMinDays = 3; diff --git a/src/common/interfaces/dto/reviews/review.response.dto.ts b/src/common/interfaces/dto/reviews/review.response.dto.ts index 0f24dcc6..ededf026 100644 --- a/src/common/interfaces/dto/reviews/review.response.dto.ts +++ b/src/common/interfaces/dto/reviews/review.response.dto.ts @@ -1,24 +1,24 @@ import { CourseResponseDto } from '../course/course.response.dto'; import { LectureResponseDto } from '../lecture/lecture.response.dto'; -export class ReviewResponseDto { - id!: number; +export interface ReviewResponseDto { + id: number; - course!: CourseResponseDto; + course: CourseResponseDto; - lecture!: LectureResponseDto; + lecture: LectureResponseDto; - content!: string; + content: string; - like!: number; + like: number; - is_deleted!: number; + is_deleted: number; - grade!: number; + grade: number; - load!: number; + load: number; - speech!: number; + speech: number; - userspecific_is_liked!: boolean; + userspecific_is_liked: boolean; } diff --git a/src/common/interfaces/index.ts b/src/common/interfaces/index.ts new file mode 100644 index 00000000..ac716c50 --- /dev/null +++ b/src/common/interfaces/index.ts @@ -0,0 +1,3 @@ +export * from './IAuth'; +export * from './ICourse'; +export * from './IFeed'; diff --git a/src/common/interfaces/serializer/course.serializer.ts b/src/common/interfaces/serializer/course.serializer.ts index a7e76f3a..7b526e42 100644 --- a/src/common/interfaces/serializer/course.serializer.ts +++ b/src/common/interfaces/serializer/course.serializer.ts @@ -1,11 +1,46 @@ -import { subject_lecture, subject_professor } from '@prisma/client'; +import { + subject_course, + subject_lecture, + subject_professor, +} from '@prisma/client'; import { CourseDetails, NESTED } from '../../schemaTypes/types'; import { applyOrder } from '../../utils/search.utils'; +import { ICourse } from '../ICourse'; import { CourseResponseDtoNested } from '../dto/course/course.response.dto'; import { ProfessorResponseDto } from '../dto/professor/professor.response.dto'; import { toJsonDepartment } from './department.serializer'; import { toJsonProfessor } from './professor.serializer'; +export function toJsonCourseBasic(course: subject_course): ICourse.Basic { + return { + id: course.id, + old_code: course.old_code, + department_id: course.department_id, + type: course.type, + type_en: course.type_en, + title: course.title, + title_en: course.title_en, + summary: course.summury, + grade_sum: course.grade_sum, + load_sum: course.load_sum, + speech_sum: course.speech_sum, + review_total_weight: course.review_total_weight, + grade: course.grade, + load: course.load, + speech: course.speech, + title_en_no_space: course.title_en_no_space, + title_no_space: course.title_no_space, + }; +} + +export function toJsonCourseRelated(course: subject_course): ICourse.Related { + return { + ...toJsonCourseBasic(course), + related_courses_prior: [], + related_courses_posterior: [], + }; +} + export function toJsonCourse( course: T extends NESTED ? Omit diff --git a/src/common/interfaces/serializer/feeds.serializer.ts b/src/common/interfaces/serializer/feeds.serializer.ts new file mode 100644 index 00000000..050093ac --- /dev/null +++ b/src/common/interfaces/serializer/feeds.serializer.ts @@ -0,0 +1,52 @@ +import { EFeed } from 'src/common/entites/EFeed'; +import { IFeed } from '../IFeed'; +import { FeedType } from '../constants/feed'; +import { toJsonCourseRelated } from './course.serializer'; +import { toJsonDepartment } from './department.serializer'; +import { toJsonLecture } from './lecture.serializer'; +import { toJsonReview } from './review.serializer'; + +export const toJsonFeedDetails = (feed: EFeed.Details): IFeed.Details => { + if (EFeed.isFamousHumanityReview(feed)) { + return { + type: FeedType.FamousHumanityReview, + date: feed.date, + priority: feed.priority, + reviews: feed.main_famoushumanityreviewdailyfeed_reviews.map( + (feedReview) => toJsonReview(feedReview.review_review), + ), + }; + } else if (EFeed.isFamousMajorReview(feed)) { + return { + type: FeedType.FamousMajorReview, + date: feed.date, + priority: feed.priority, + reviews: feed.main_famousmajorreviewdailyfeed_reviews.map((feedReview) => + toJsonReview(feedReview.review_review), + ), + department: toJsonDepartment(feed.subject_department), + }; + } else if (EFeed.isReviewWrite(feed)) { + return { + type: FeedType.ReviewWrite, + date: feed.date, + priority: feed.priority, + lecture: toJsonLecture(feed.subject_lecture, true), + }; + } else if (EFeed.isRelatedCourse(feed)) { + return { + type: FeedType.RelatedCourse, + date: feed.date, + priority: feed.priority, + course: toJsonCourseRelated(feed.subject_course), + }; + } else if (EFeed.isRankedReview(feed)) { + return { + type: FeedType.RankedReview, + date: feed.date, + priority: feed.priority, + reviews: feed.reviews.map((review) => toJsonReview(review)), + }; + } + return { type: FeedType.Rate, date: feed.date, priority: feed.priority }; +}; diff --git a/src/common/interfaces/structures/IAuth.ts b/src/common/interfaces/structures/IAuth.ts deleted file mode 100644 index 8123dbfc..00000000 --- a/src/common/interfaces/structures/IAuth.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Request, Response } from 'express'; - -export namespace IAuth { - export type IRequest = Request & IRequestExtra; - - export interface IRequestExtra { - session: { - next: string; - - sso_state: string; - }; - } - - export interface IResponse extends Response {} - - export interface IJwtPayload { - sid: string; - } -} diff --git a/src/common/interfaces/structures/index.ts b/src/common/interfaces/structures/index.ts deleted file mode 100644 index c1a5d427..00000000 --- a/src/common/interfaces/structures/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './IAuth'; diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 2faa6fc6..6e78fd82 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -8,6 +8,8 @@ export type courseSelectResultType = Prisma.subject_courseGetPayload<{ include: Prisma.subject_courseInclude; }>; +export const courseBasic = Prisma.validator()({}); + export const courseDetails = Prisma.validator()({ include: { subject_department: true, @@ -46,7 +48,7 @@ export const timeTableDetails = export type NESTED = true; -const reviewDetails = Prisma.validator()({ +export const reviewDetails = Prisma.validator()({ include: { course: courseDetails, lecture: lectureDetails, @@ -54,7 +56,7 @@ const reviewDetails = Prisma.validator()({ }, }); -const lectureReviews = Prisma.validator()({ +export const lectureReviews = Prisma.validator()({ include: { review: { include: { @@ -93,6 +95,7 @@ export type LectureExtended = Prisma.subject_lectureGetPayload< typeof lectureExtended >; export type LectureBasic = Prisma.subject_lectureGetPayload; +export type CourseBasic = Prisma.subject_courseGetPayload; export type CourseDetails = Prisma.subject_courseGetPayload< typeof courseDetails >; diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index ca996f61..87c248b0 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -34,3 +34,8 @@ export type Union< : T extends { [key: string]: infer U } ? U : never; + +export function getRandomChoice(choices: T[]): T { + const randomIndex = Math.floor(Math.random() * choices.length); + return choices[randomIndex]; +} diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index d12b10b6..fa7daea7 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -1,7 +1,7 @@ import { Controller, Get, Query, Req, Res, Session } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { GetUser } from 'src/common/decorators/get-user.decorator'; -import { IAuth } from 'src/common/interfaces/structures'; +import { IAuth } from 'src/common/interfaces'; import { Public } from '../../common/decorators/skip-auth.decorator'; import { SSOUser } from '../../common/interfaces/dto/auth/sso.dto'; import { ProfileDto } from '../../common/interfaces/dto/user/user.response.dto'; @@ -32,8 +32,8 @@ export class AuthController { user_login( @Query('next') next: string, @Query('social_login') social_login: string, - @Req() req: IAuth.IRequest, - @Res() res: IAuth.IResponse, + @Req() req: IAuth.Request, + @Res() res: IAuth.Response, ) { if (req.user) { return res.redirect(next ?? '/'); @@ -53,7 +53,7 @@ export class AuthController { @Query('state') state: string, @Query('code') code: string, @Session() session: Record, - @Res() response: IAuth.IResponse, + @Res() response: IAuth.Response, ) { const stateBefore = session['sso_state']; if (!stateBefore || stateBefore != state) { @@ -93,15 +93,15 @@ export class AuthController { @Public() @Get('/') - async home(@Req() req: IAuth.IRequest, @Res() res: IAuth.IResponse) { + async home(@Req() req: IAuth.Request, @Res() res: IAuth.Response) { return res.redirect('/session/login'); } @Public() @Get('logout') async logout( - @Req() req: IAuth.IRequest, - @Res() res: IAuth.IResponse, + @Req() req: IAuth.Request, + @Res() res: IAuth.Response, @Query('next') next: string, @GetUser() user: session_userprofile, ) { diff --git a/src/modules/auth/strategy/jwt-cookie.strategy.ts b/src/modules/auth/strategy/jwt-cookie.strategy.ts index adef7c76..e2892a2b 100644 --- a/src/modules/auth/strategy/jwt-cookie.strategy.ts +++ b/src/modules/auth/strategy/jwt-cookie.strategy.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; -import { IAuth } from 'src/common/interfaces/structures'; +import { IAuth } from 'src/common/interfaces'; import settings from '../../../settings'; import { AuthService } from '../auth.service'; @@ -28,7 +28,7 @@ export class JwtCookieStrategy extends PassportStrategy( }); } - async validate(payload: IAuth.IJwtPayload) { + async validate(payload: IAuth.JwtPayload) { return this.authService.findBySid(payload.sid); } } diff --git a/src/modules/feeds/feeds.controller.ts b/src/modules/feeds/feeds.controller.ts new file mode 100644 index 00000000..6492cf4c --- /dev/null +++ b/src/modules/feeds/feeds.controller.ts @@ -0,0 +1,20 @@ +import { Controller, Get, Query } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { IFeed } from 'src/common/interfaces/IFeed'; +import { toJsonFeedDetails } from 'src/common/interfaces/serializer/feeds.serializer'; +import { FeedsService } from './feeds.service'; + +@Controller('api/users/:userId/feeds') +export class FeedsController { + constructor(private readonly feedsService: FeedsService) {} + + @Get() + async getUserFeeds( + @Query() query: IFeed.QueryDto, + @GetUser() user: session_userprofile, + ): Promise { + const feeds = await this.feedsService.getFeeds(query, user); + return feeds.map((feed) => toJsonFeedDetails(feed)); + } +} diff --git a/src/modules/feeds/feeds.module.ts b/src/modules/feeds/feeds.module.ts new file mode 100644 index 00000000..c7538460 --- /dev/null +++ b/src/modules/feeds/feeds.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; +import { FeedsRepository } from 'src/prisma/repositories/feeds.repository'; +import { FeedsController } from './feeds.controller'; +import { FeedsService } from './feeds.service'; + +@Module({ + imports: [PrismaModule], + controllers: [FeedsController], + providers: [FeedsService, FeedsRepository], + exports: [FeedsService], +}) +export class FeedsModule {} diff --git a/src/modules/feeds/feeds.service.ts b/src/modules/feeds/feeds.service.ts new file mode 100644 index 00000000..7c40b7b0 --- /dev/null +++ b/src/modules/feeds/feeds.service.ts @@ -0,0 +1,88 @@ +import { Injectable } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { EFeed } from 'src/common/entites/EFeed'; +import { IFeed } from 'src/common/interfaces/IFeed'; +import { DepartmentRepository } from 'src/prisma/repositories/department.repository'; +import { FeedsRepository } from 'src/prisma/repositories/feeds.repository'; +import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; + +@Injectable() +export class FeedsService { + constructor( + private readonly departmentRepository: DepartmentRepository, + private readonly feedsRepository: FeedsRepository, + private readonly reviewsRepository: ReviewsRepository, + ) {} + + private filterFeeds(feeds: EFeed.Details[], feed: EFeed.Details | null) { + if (feed && feed.visible) { + feeds.push(feed); + } + } + + public async getFeeds(query: IFeed.QueryDto, user: session_userprofile) { + const { date: dateString } = query; + const date = new Date(dateString); + const departments = await this.departmentRepository.getRelatedDepartments( + user, + ); + const feeds: EFeed.Details[] = []; + + const famousHumanityReview = + await this.feedsRepository.getOrCreateFamousHumanityReview(date); + this.filterFeeds(feeds, famousHumanityReview); + + /** + * "RANKED_REVIEW" does not require RankedReview + * Always shows TOP 3 liked reviews. + */ + const rankedReview = await this.feedsRepository.getOrCreateRankedReview( + date, + ); + const top3LikedReviews = await this.reviewsRepository.getTopLikedReviews(3); + + /** + * RankedReview schema dose not have relation with review_review. + * So, manually add reviews in app level. + */ + const rankedReviewWithReviews = { + ...rankedReview, + ...{ reviews: top3LikedReviews }, + }; + this.filterFeeds(feeds, rankedReviewWithReviews); + + const famousMajorReviews = await Promise.all( + departments.map(async (department) => { + return this.feedsRepository.getOrCreateFamousMajorReview( + date, + department, + ); + }), + ); + famousMajorReviews.forEach((feed) => { + this.filterFeeds(feeds, feed); + }); + + const reviewWrite = await this.feedsRepository.getOrCreateReviewWrite( + date, + user.id, + ); + this.filterFeeds(feeds, reviewWrite); + + /** + * @NOTE + * RelatedCourse does not have Datas of posterior or prior courses. + * Comment out below until having enough Datas. + */ + // const relatedCourse = await this.feedsRepository.getOrCreateRelatedCourse( + // date, + // user.id, + // ); + // this.filterFeeds(feeds, relatedCourse); + + const rateDaily = await this.feedsRepository.getOrCreateRate(date, user.id); + this.filterFeeds(feeds, rateDaily); + + return feeds; + } +} diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index 36c82b5f..e98ac59f 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -70,4 +70,26 @@ export class DepartmentRepository { ).map((specializedMajor) => specializedMajor.subject_department); return specializedMajors; } + + async getRelatedDepartments( + user: session_userprofile, + ): Promise { + const departments: subject_department[] = ( + await Promise.all([ + this.getDepartmentOfUser(user), + this.getMajors(user), + this.getMinors(user), + this.getSpecializedMajors(user), + this.getFavoriteDepartments(user), + ]) + ).flatMap( + ( + deps: subject_department | subject_department[] | null, + ): subject_department | subject_department[] => deps ?? [], + ); + const uniqueDepartments: subject_department[] = departments.filter( + (dep, index, deps) => deps.findIndex((d) => d.id === dep.id) === index, + ); + return uniqueDepartments; + } } diff --git a/src/prisma/repositories/feeds.repository.ts b/src/prisma/repositories/feeds.repository.ts new file mode 100644 index 00000000..51719796 --- /dev/null +++ b/src/prisma/repositories/feeds.repository.ts @@ -0,0 +1,252 @@ +import { Injectable } from '@nestjs/common'; +import { + main_ratedailyuserfeed, + main_relatedcoursedailyuserfeed, + main_reviewwritedailyuserfeed, + review_humanitybestreview, + review_majorbestreview, + subject_department, +} from '@prisma/client'; +import { EFeed } from 'src/common/entites/EFeed'; +import { + FeedRateMinDays, + FeedVisibleRate, +} from 'src/common/interfaces/constants/feed'; +import { getRandomChoice } from 'src/common/utils/method.utils'; +import { PrismaService } from '../prisma.service'; +import { UserRepository } from './user.repository'; + +@Injectable() +export class FeedsRepository { + constructor( + private readonly prisma: PrismaService, + private readonly userRepository: UserRepository, + ) {} + + public async getOrCreateFamousHumanityReview(date: Date) { + let feed = await this.prisma.main_famoushumanityreviewdailyfeed.findFirst({ + where: { + date, + }, + include: EFeed.FamousHumanityReviewDetails.include, + }); + + if (!feed) { + // Prisma does not support RAND() in ORDER BY. + const humanityBestReviews = (await this.prisma.$queryRaw` + SELECT * FROM review_humanitybestreview + ORDER BY RAND() + LIMIT 3`) satisfies review_humanitybestreview; + + feed = await this.prisma.main_famoushumanityreviewdailyfeed.create({ + include: EFeed.FamousHumanityReviewDetails.include, + data: { + date, + priority: Math.random(), + main_famoushumanityreviewdailyfeed_reviews: { + createMany: { + data: humanityBestReviews, + }, + }, + visible: Math.random() < FeedVisibleRate.FamousHumanityReview, + }, + }); + } + + return feed; + } + + public async getOrCreateRankedReview(date: Date) { + let feed = await this.prisma.main_rankedreviewdailyfeed.findFirst({ + where: { + date, + }, + }); + + if (!feed) { + feed = await this.prisma.main_rankedreviewdailyfeed.create({ + data: { + date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.RankedReview, + }, + }); + } + + return feed; + } + + public async getOrCreateFamousMajorReview( + date: Date, + subject_department: subject_department, + departmentNum: number = 1, + ) { + let feed = await this.prisma.main_famousmajorreviewdailyfeed.findFirst({ + include: EFeed.FamousMajorReviewDetails.include, + where: { + date, + subject_department, + }, + }); + + if (!feed) { + // Prisma does not support RAND() in ORDER BY. + const majorBestReviews = (await this.prisma.$queryRaw` + SELECT mbr.* FROM review_majorbestreview mbr + INNER JOIN review_review r ON r.id = mbr.review_id + INNER JOIN subject_lecture l ON l.id = r.lecture_id + WHERE l.department_id = ${subject_department.id} + ORDER BY RAND() + LIMIT 3`) satisfies review_majorbestreview; + + feed = await this.prisma.main_famousmajorreviewdailyfeed.create({ + include: EFeed.FamousMajorReviewDetails.include, + data: { + date, + priority: Math.random(), + visible: + Math.random() < + FeedVisibleRate.FamousMajorReview / departmentNum ** 0.7, + department_id: subject_department.id, + main_famousmajorreviewdailyfeed_reviews: { + createMany: { data: majorBestReviews }, + }, + }, + }); + } + + return feed; + } + + public async getOrCreateReviewWrite( + date: Date, + userId: number, + ): Promise { + let feed = await this.prisma.main_reviewwritedailyuserfeed.findFirst({ + include: EFeed.ReviewWriteDetails.include, + where: { + date, + user_id: userId, + }, + }); + + if (!feed) { + const takenLecture = getRandomChoice( + await this.userRepository.getReviewWritableTakenLectures(userId), + ); + if (!takenLecture) { + return null; + } + + feed = await this.prisma.main_reviewwritedailyuserfeed.create({ + include: EFeed.ReviewWriteDetails.include, + data: { + date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.ReviewWrite, + user_id: userId, + lecture_id: takenLecture.lecture_id, + }, + }); + } + + return feed; + } + + public async getOrCreateRelatedCourse( + date: Date, + userId: number, + ): Promise { + let feed = await this.prisma.main_relatedcoursedailyuserfeed.findFirst({ + include: EFeed.RelatedCourseDetails.include, + where: { + date, + user_id: userId, + }, + }); + + if (!feed) { + const takenLecture = getRandomChoice( + await this.prisma.session_userprofile_taken_lectures.findMany({ + include: { + lecture: true, + }, + where: { + userprofile_id: userId, + }, + }), + ); + + if (!takenLecture) { + return null; + } + + feed = await this.prisma.main_relatedcoursedailyuserfeed.create({ + include: EFeed.RelatedCourseDetails.include, + data: { + date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.RelatedCourse, + course_id: takenLecture.lecture.course_id, + user_id: userId, + }, + }); + } + + return feed; + } + + public async getOrCreateRate( + date: Date, + userId: number, + ): Promise { + let feed = await this.prisma.main_ratedailyuserfeed.findFirst({ + where: { + date, + user_id: userId, + }, + }); + + if (!feed) { + if ( + await this.prisma.support_rate.findFirst({ + where: { + user_id: userId, + year: date.getFullYear(), + }, + }) + ) { + return null; + } + + const beforeDate = new Date(date); + beforeDate.setDate(date.getDate() - FeedRateMinDays); + const afterDate = new Date(date); + afterDate.setDate(date.getDate() + FeedRateMinDays); + const weekFeeds = await this.prisma.main_ratedailyuserfeed.findMany({ + where: { + date: { + gt: beforeDate, + lt: afterDate, + }, + visible: true, + user_id: userId, + }, + }); + if (weekFeeds.length > 0) { + return null; + } + + feed = await this.prisma.main_ratedailyuserfeed.create({ + data: { + date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.Rate, + user_id: userId, + }, + }); + } + + return feed; + } +} diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 862a3302..806c544b 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; -import { ReviewDetails } from '../../common/schemaTypes/types'; +import { ReviewDetails, reviewDetails } from '../../common/schemaTypes/types'; import { PrismaService } from '../prisma.service'; @Injectable() @@ -258,4 +258,14 @@ export class ReviewsRepository { }, }); } + + public async getTopLikedReviews(n: number) { + return await this.prisma.review_review.findMany({ + include: reviewDetails.include, + orderBy: { + like: 'desc', + }, + take: n, + }); + } } diff --git a/src/prisma/repositories/semester.repository.ts b/src/prisma/repositories/semester.repository.ts index bc9497af..b1dddf57 100644 --- a/src/prisma/repositories/semester.repository.ts +++ b/src/prisma/repositories/semester.repository.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { Prisma } from '@prisma/client'; +import { Prisma, subject_semester } from '@prisma/client'; import { PrismaService } from '../prisma.service'; @Injectable() @@ -34,4 +34,16 @@ export class SemesterRepository { take: take, }); } + + async getNotWritableSemester(): Promise { + const now = new Date(); + return await this.prisma.subject_semester.findFirst({ + where: { + OR: [ + { courseAddDropPeriodEnd: { gte: now } }, + { beginning: { gte: now } }, + ], + }, + }); + } } diff --git a/src/prisma/repositories/user.repository.ts b/src/prisma/repositories/user.repository.ts index aaf3b2b9..9d0df8ea 100644 --- a/src/prisma/repositories/user.repository.ts +++ b/src/prisma/repositories/user.repository.ts @@ -1,10 +1,18 @@ import { Injectable } from '@nestjs/common'; -import { Prisma, session_userprofile } from '@prisma/client'; +import { + Prisma, + session_userprofile, + session_userprofile_taken_lectures, +} from '@prisma/client'; import { PrismaService } from '../prisma.service'; +import { SemesterRepository } from './semester.repository'; @Injectable() export class UserRepository { - constructor(private readonly prisma: PrismaService) {} + constructor( + private readonly prisma: PrismaService, + private readonly semesterRepository: SemesterRepository, + ) {} async findBySid(sid: string) { return await this.prisma.session_userprofile.findFirst({ @@ -29,4 +37,25 @@ export class UserRepository { where: { id: userId }, }); } + + async getReviewWritableTakenLectures( + userId: number, + ): Promise { + const notWritableSemester = + await this.semesterRepository.getNotWritableSemester(); + + return await this.prisma.session_userprofile_taken_lectures.findMany({ + where: { + userprofile_id: userId, + lecture: { + AND: [ + { + year: { not: notWritableSemester?.year }, + }, + { semester: { not: notWritableSemester?.semester } }, + ], + }, + }, + }); + } } From b168064c35b236ed1521fd4687b75100599c026b Mon Sep 17 00:00:00 2001 From: doxylee <68041124+doxylee@users.noreply.github.com> Date: Thu, 15 Feb 2024 13:06:48 +0900 Subject: [PATCH 170/250] feat: department-options, favorite-departments API (#73) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: /session/department-options API * feat: /session/favorite-departments API * refactor: DTO -> Dto로 변경 * refactor: Not use raw query * fix: Remove console.log --- src/app.module.ts | 4 + src/common/entities/EDepartment.ts | 7 ++ src/common/interfaces/ISession.ts | 8 ++ src/modules/departments/departments.module.ts | 10 +++ .../departments/departments.service.ts | 79 +++++++++++++++++++ src/modules/session/session.controller.ts | 35 ++++++++ src/modules/session/session.module.ts | 12 +++ src/modules/session/session.service.ts | 14 ++++ .../repositories/department.repository.ts | 30 +++++++ src/prisma/repositories/user.repository.ts | 14 ++++ 10 files changed, 213 insertions(+) create mode 100644 src/common/entities/EDepartment.ts create mode 100644 src/common/interfaces/ISession.ts create mode 100644 src/modules/departments/departments.module.ts create mode 100644 src/modules/departments/departments.service.ts create mode 100644 src/modules/session/session.controller.ts create mode 100644 src/modules/session/session.module.ts create mode 100644 src/modules/session/session.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index 9b9243d1..48918376 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,10 +7,12 @@ import { AuthModule } from './modules/auth/auth.module'; import { JwtCookieGuard } from './modules/auth/guard/jwt-cookie.guard'; import { MockAuthGuard } from './modules/auth/guard/mock-auth-guard'; import { CoursesModule } from './modules/courses/courses.module'; +import { DepartmentsModule } from './modules/departments/departments.module'; import { FeedsModule } from './modules/feeds/feeds.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; import { SemestersModule } from './modules/semesters/semesters.module'; +import { SessionModule } from './modules/session/session.module'; import { StatusModule } from './modules/status/status.module'; import { TimetablesModule } from './modules/timetables/timetables.module'; import { UserModule } from './modules/user/user.module'; @@ -30,6 +32,8 @@ import { PrismaModule } from './prisma/prisma.module'; StatusModule, FeedsModule, WishlistModule, + SessionModule, + DepartmentsModule, ], controllers: [AppController], providers: [ diff --git a/src/common/entities/EDepartment.ts b/src/common/entities/EDepartment.ts new file mode 100644 index 00000000..25d63a79 --- /dev/null +++ b/src/common/entities/EDepartment.ts @@ -0,0 +1,7 @@ +import { Prisma } from '@prisma/client'; + +export namespace EDepartment { + export const Basic = Prisma.validator()({}); + + export type Basic = Prisma.subject_departmentGetPayload; +} diff --git a/src/common/interfaces/ISession.ts b/src/common/interfaces/ISession.ts new file mode 100644 index 00000000..b44a7d9c --- /dev/null +++ b/src/common/interfaces/ISession.ts @@ -0,0 +1,8 @@ +import { IsString } from 'class-validator'; + +export namespace ISession { + export class FavoriteDepartmentsDto { + @IsString({ each: true }) + fav_department!: string[]; + } +} diff --git a/src/modules/departments/departments.module.ts b/src/modules/departments/departments.module.ts new file mode 100644 index 00000000..02164bdc --- /dev/null +++ b/src/modules/departments/departments.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; +import { DepartmentsService } from './departments.service'; + +@Module({ + imports: [PrismaModule], + providers: [DepartmentsService], + exports: [DepartmentsService], +}) +export class DepartmentsModule {} diff --git a/src/modules/departments/departments.service.ts b/src/modules/departments/departments.service.ts new file mode 100644 index 00000000..c6ea9f3e --- /dev/null +++ b/src/modules/departments/departments.service.ts @@ -0,0 +1,79 @@ +import { Injectable } from '@nestjs/common'; +import { EDepartment } from 'src/common/entities/EDepartment'; +import { DepartmentRepository } from 'src/prisma/repositories/department.repository'; + +const UNDERGRADUATE_DEPARTMENTS = [ + 'CE', + 'MSB', + 'ME', + 'PH', + 'BiS', + 'IE', + 'ID', + 'BS', + 'CBE', + 'MAS', + 'MS', + 'NQE', + 'HSS', + 'EE', + 'CS', + 'AE', + 'CH', + 'TS', +]; + +const EXCLUDED_DEPARTMENTS = [ + 'AA', + 'KSA', + 'URP', + 'ED', + 'INT', + 'KJ', + 'CWENA', + 'C', + 'E', + 'S', + 'PSY', + 'SK', + 'BIO', + 'CLT', + 'PHYS', +]; + +@Injectable() +export class DepartmentsService { + constructor(private readonly departmentRepository: DepartmentRepository) {} + async getDepartmentOptions() { + const yearThreshold = new Date().getFullYear() - 2; + const [departments, recentDepartmentCodes] = await Promise.all([ + this.departmentRepository.getAllDepartmentOptions(EXCLUDED_DEPARTMENTS), + this.departmentRepository.getDepartmentCodesOfRecentLectures( + yearThreshold, + ), + ]); + + if (recentDepartmentCodes.length === 0) + console.error( + 'recentDepartmentCodes is empty, which indicates something is wrong', + ); + + const result = { + undergraduate: [] as EDepartment.Basic[], + recent: [] as EDepartment.Basic[], + other: [] as EDepartment.Basic[], + }; + + departments.forEach((department) => { + if (UNDERGRADUATE_DEPARTMENTS.includes(department.code)) { + result.undergraduate.push(department); + } else if (recentDepartmentCodes.includes(department.code)) { + result.recent.push(department); + } else { + result.other.push(department); + } + }); + + return result; + } +} diff --git a/src/modules/session/session.controller.ts b/src/modules/session/session.controller.ts new file mode 100644 index 00000000..4f5c8c73 --- /dev/null +++ b/src/modules/session/session.controller.ts @@ -0,0 +1,35 @@ +import { Body, Controller, Get, Post } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { ISession } from 'src/common/interfaces/ISession'; +import { toJsonDepartment } from 'src/common/interfaces/serializer/department.serializer'; +import { DepartmentsService } from '../departments/departments.service'; +import { SessionService } from './session.service'; + +@Controller('session') +export class SessionController { + constructor( + private readonly sessionService: SessionService, + private readonly departmentsService: DepartmentsService, + ) {} + + @Get('department-options') + async departmentOptions() { + const { undergraduate, recent, other } = + await this.departmentsService.getDepartmentOptions(); + return [ + undergraduate.map((e) => toJsonDepartment(e)), + recent.map((e) => toJsonDepartment(e)), + other.map((e) => toJsonDepartment(e)), + ]; + } + + @Post('favorite-departments') + async favoriteDepartments( + @Body() body: ISession.FavoriteDepartmentsDto, + @GetUser() user: session_userprofile, + ) { + const departmentIds = body.fav_department.map((id) => parseInt(id)); + await this.sessionService.changeFavoriteDepartments(user.id, departmentIds); + } +} diff --git a/src/modules/session/session.module.ts b/src/modules/session/session.module.ts new file mode 100644 index 00000000..441d7d47 --- /dev/null +++ b/src/modules/session/session.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; +import { DepartmentsModule } from '../departments/departments.module'; +import { SessionController } from './session.controller'; +import { SessionService } from './session.service'; + +@Module({ + imports: [PrismaModule, DepartmentsModule], + controllers: [SessionController], + providers: [SessionService], +}) +export class SessionModule {} diff --git a/src/modules/session/session.service.ts b/src/modules/session/session.service.ts new file mode 100644 index 00000000..5e9490e9 --- /dev/null +++ b/src/modules/session/session.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { UserRepository } from 'src/prisma/repositories/user.repository'; + +@Injectable() +export class SessionService { + constructor(private readonly userRepository: UserRepository) {} + + async changeFavoriteDepartments(userId: number, departmentIds: number[]) { + return await this.userRepository.changeFavoriteDepartments( + userId, + departmentIds, + ); + } +} diff --git a/src/prisma/repositories/department.repository.ts b/src/prisma/repositories/department.repository.ts index e98ac59f..30114ad0 100644 --- a/src/prisma/repositories/department.repository.ts +++ b/src/prisma/repositories/department.repository.ts @@ -71,6 +71,36 @@ export class DepartmentRepository { return specializedMajors; } + async getAllDepartmentOptions( + excludedDepartmentCodes: string[], + ): Promise { + return this.prisma.subject_department.findMany({ + where: { + visible: true, + code: { notIn: excludedDepartmentCodes }, + }, + orderBy: { name: 'asc' }, + }); + } + + async getDepartmentCodesOfRecentLectures( + yearThreshold: number, + ): Promise { + const res = await this.prisma.subject_department.findMany({ + where: { + subject_lecture: { + some: { + year: { gte: yearThreshold }, + }, + }, + }, + select: { + code: true, + }, + }); + return res.map((e) => e.code); + } + async getRelatedDepartments( user: session_userprofile, ): Promise { diff --git a/src/prisma/repositories/user.repository.ts b/src/prisma/repositories/user.repository.ts index 9d0df8ea..b88d8483 100644 --- a/src/prisma/repositories/user.repository.ts +++ b/src/prisma/repositories/user.repository.ts @@ -38,6 +38,20 @@ export class UserRepository { }); } + async changeFavoriteDepartments(userId: number, departmentIds: number[]) { + await this.prisma.session_userprofile_favorite_departments.deleteMany({ + where: { userprofile_id: userId }, + }); + return await this.prisma.session_userprofile.update({ + where: { id: userId }, + data: { + favorite_departments: { + create: departmentIds.map((department_id) => ({ department_id })), + }, + }, + }); + } + async getReviewWritableTakenLectures( userId: number, ): Promise { From be9cf4df65fd3e5c3cf2c1b4cb9dd1ea45aba627 Mon Sep 17 00:00:00 2001 From: doxylee <68041124+doxylee@users.noreply.github.com> Date: Wed, 21 Feb 2024 20:42:54 +0900 Subject: [PATCH 171/250] Feat/autocomplete (#75) * feat: lecture autocomplete * feat: course autocomplete * fix: Add missing files * refactor Co-authored-by: Giyeong Kim * fix: missing comma --------- Co-authored-by: Giyeong Kim --- src/common/entities/ECourse.ts | 23 ++++++++++++ src/common/entities/ELecture.ts | 24 +++++++++++++ src/common/interfaces/ICourse.ts | 7 ++++ src/common/interfaces/ILecture.ts | 17 +++++++++ src/modules/courses/courses.controller.ts | 6 ++++ src/modules/courses/courses.service.ts | 36 +++++++++++++++++++ src/modules/lectures/lectures.controller.ts | 7 ++++ src/modules/lectures/lectures.service.ts | 36 +++++++++++++++++++ src/prisma/repositories/course.repository.ts | 32 +++++++++++++++++ src/prisma/repositories/lecture.repository.ts | 35 ++++++++++++++++++ 10 files changed, 223 insertions(+) create mode 100644 src/common/entities/ECourse.ts create mode 100644 src/common/entities/ELecture.ts create mode 100644 src/common/interfaces/ILecture.ts diff --git a/src/common/entities/ECourse.ts b/src/common/entities/ECourse.ts new file mode 100644 index 00000000..f88d380c --- /dev/null +++ b/src/common/entities/ECourse.ts @@ -0,0 +1,23 @@ +import { Prisma } from '@prisma/client'; + +export namespace ECourse { + export const Basic = Prisma.validator()({}); + export type Basic = Prisma.subject_courseGetPayload; + + export const Extended = Prisma.validator()({ + include: { + subject_department: true, + subject_course_professors: { include: { professor: true } }, + }, + }); + export type Extended = Prisma.subject_courseGetPayload; + + export const Details = Prisma.validator()({ + include: { + ...Extended.include, + lecture: true, + subject_courseuser: true, + }, + }); + export type Details = Prisma.subject_courseGetPayload; +} diff --git a/src/common/entities/ELecture.ts b/src/common/entities/ELecture.ts new file mode 100644 index 00000000..a86282b7 --- /dev/null +++ b/src/common/entities/ELecture.ts @@ -0,0 +1,24 @@ +import { Prisma } from '@prisma/client'; + +export namespace ELecture { + export const Basic = Prisma.validator()({}); + export type Basic = Prisma.subject_lectureGetPayload; + + export const Extended = Prisma.validator()({ + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + }, + }); + export type Extended = Prisma.subject_lectureGetPayload; + + export const Details = Prisma.validator()({ + include: { + subject_department: true, + subject_lecture_professors: { include: { professor: true } }, + subject_classtime: true, + subject_examtime: true, + }, + }); + export type Details = Prisma.subject_lectureGetPayload; +} diff --git a/src/common/interfaces/ICourse.ts b/src/common/interfaces/ICourse.ts index edb07a41..efff5c1c 100644 --- a/src/common/interfaces/ICourse.ts +++ b/src/common/interfaces/ICourse.ts @@ -1,3 +1,5 @@ +import { IsString } from 'class-validator'; + export namespace ICourse { export interface Basic { id: number; @@ -23,4 +25,9 @@ export namespace ICourse { related_courses_prior: Basic[]; related_courses_posterior: Basic[]; } + + export class AutocompleteDto { + @IsString() + keyword!: string; + } } diff --git a/src/common/interfaces/ILecture.ts b/src/common/interfaces/ILecture.ts new file mode 100644 index 00000000..7aab58d0 --- /dev/null +++ b/src/common/interfaces/ILecture.ts @@ -0,0 +1,17 @@ +import { Type } from 'class-transformer'; +import { IsInt, IsString } from 'class-validator'; + +export namespace ILecture { + export class AutocompleteDto { + @IsInt() + @Type(() => Number) + year!: number; + + @IsInt() + @Type(() => Number) + semester!: number; + + @IsString() + keyword!: string; + } +} diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index e2ad2ab9..6e6071b4 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -2,6 +2,7 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { Public } from 'src/common/decorators/skip-auth.decorator'; +import { ICourse } from 'src/common/interfaces'; import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; import { CourseQueryDto } from '../../common/interfaces/dto/course/course.request.dto'; import { CoursesService } from './courses.service'; @@ -19,6 +20,11 @@ export class CourseController { return courses; } + @Get('autocomplete') + async getCourseAutocomplete(@Query() query: ICourse.AutocompleteDto) { + return await this.CoursesService.getCourseAutocomplete(query); + } + @Get(':id') async getCourseById( @Param('id') id: number, diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index ba4246fb..9aff7175 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -1,5 +1,7 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; +import { ECourse } from 'src/common/entities/ECourse'; +import { ICourse } from 'src/common/interfaces'; import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; @@ -114,4 +116,38 @@ export class CoursesService { return reviews.map((review) => toJsonReview(review, user)); } + + async getCourseAutocomplete(dto: ICourse.AutocompleteDto) { + const candidate = await this.CourseRepository.getCourseAutocomplete(dto); + if (!candidate) return dto.keyword; + return this.findAutocompleteFromCandidate(candidate, dto.keyword); + } + + private findAutocompleteFromCandidate( + candidate: ECourse.Extended, + keyword: string, + ) { + const keywordLower = keyword.toLowerCase(); + if (candidate.subject_department.name.startsWith(keyword)) + return candidate.subject_department.name; + if ( + candidate.subject_department.name_en + ?.toLowerCase() + .startsWith(keywordLower) + ) + return candidate.subject_department.name_en; + if (candidate.title.startsWith(keyword)) return candidate.title; + if (candidate.title_en.toLowerCase().startsWith(keywordLower)) + return candidate.title_en; + for (const professor of candidate.subject_course_professors) { + if (professor.professor.professor_name.startsWith(keyword)) + return professor.professor.professor_name; + if ( + professor.professor.professor_name_en + ?.toLowerCase() + .startsWith(keywordLower) + ) + return professor.professor.professor_name_en; + } + } } diff --git a/src/modules/lectures/lectures.controller.ts b/src/modules/lectures/lectures.controller.ts index 5853df44..f81ee884 100644 --- a/src/modules/lectures/lectures.controller.ts +++ b/src/modules/lectures/lectures.controller.ts @@ -2,6 +2,7 @@ import { Controller, Get, Param, Query } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { Public } from 'src/common/decorators/skip-auth.decorator'; +import { ILecture } from 'src/common/interfaces/ILecture'; import { LectureQueryDto, LectureReviewsQueryDto, @@ -18,6 +19,12 @@ export class LecturesController { return await this.LectureService.getLectureByFilter(query); } + @Public() + @Get('autocomplete') + async getLectureAutocomplete(@Query() query: ILecture.AutocompleteDto) { + return await this.LectureService.getLectureAutocomplete(query); + } + @Get(':id') async getLectureById(@Param('id') id: number) { return await this.LectureService.getLectureById(id); diff --git a/src/modules/lectures/lectures.service.ts b/src/modules/lectures/lectures.service.ts index bddd12a3..6c6ba049 100644 --- a/src/modules/lectures/lectures.service.ts +++ b/src/modules/lectures/lectures.service.ts @@ -1,5 +1,7 @@ import { Injectable } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; +import { ELecture } from 'src/common/entities/ELecture'; +import { ILecture } from 'src/common/interfaces/ILecture'; import { LectureQueryDto, LectureReviewsQueryDto, @@ -68,4 +70,38 @@ export class LecturesService { public async getLecturesByIds(ids: number[]): Promise { return await this.LectureRepository.getLectureByIds(ids); } + + async getLectureAutocomplete(dto: ILecture.AutocompleteDto) { + const candidate = await this.LectureRepository.getLectureAutocomplete(dto); + if (!candidate) return dto.keyword; + return this.findAutocompleteFromCandidate(candidate, dto.keyword); + } + + private findAutocompleteFromCandidate( + candidate: ELecture.Extended, + keyword: string, + ) { + const keywordLower = keyword.toLowerCase(); + if (candidate.subject_department.name.startsWith(keyword)) + return candidate.subject_department.name; + if ( + candidate.subject_department.name_en + ?.toLowerCase() + .startsWith(keywordLower) + ) + return candidate.subject_department.name_en; + if (candidate.title.startsWith(keyword)) return candidate.title; + if (candidate.title_en.toLowerCase().startsWith(keywordLower)) + return candidate.title_en; + for (const professor of candidate.subject_lecture_professors) { + if (professor.professor.professor_name.startsWith(keyword)) + return professor.professor.professor_name; + if ( + professor.professor.professor_name_en + ?.toLowerCase() + .startsWith(keywordLower) + ) + return professor.professor.professor_name_en; + } + } } diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 853c6195..a053c96c 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -1,4 +1,6 @@ import { Injectable } from '@nestjs/common'; +import { ECourse } from 'src/common/entities/ECourse'; +import { ICourse } from 'src/common/interfaces'; import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; import { applyOffset, @@ -424,4 +426,34 @@ export class CourseRepository { }, }); } + + async getCourseAutocomplete({ + keyword, + }: ICourse.AutocompleteDto): Promise { + const candidate = await this.prisma.subject_course.findFirst({ + where: { + OR: [ + { subject_department: { name: { startsWith: keyword } } }, + { subject_department: { name_en: { startsWith: keyword } } }, + { title: { startsWith: keyword } }, + { title_en: { startsWith: keyword } }, + { + subject_course_professors: { + some: { professor: { professor_name: { startsWith: keyword } } }, + }, + }, + { + subject_course_professors: { + some: { + professor: { professor_name_en: { startsWith: keyword } }, + }, + }, + }, + ], + }, + include: ECourse.Extended.include, + orderBy: { old_code: 'asc' }, + }); + return candidate; + } } diff --git a/src/prisma/repositories/lecture.repository.ts b/src/prisma/repositories/lecture.repository.ts index e4fa4098..20460e0e 100644 --- a/src/prisma/repositories/lecture.repository.ts +++ b/src/prisma/repositories/lecture.repository.ts @@ -1,5 +1,7 @@ import { Injectable } from '@nestjs/common'; import { Prisma, session_userprofile } from '@prisma/client'; +import { ELecture } from 'src/common/entities/ELecture'; +import { ILecture } from 'src/common/interfaces/ILecture'; import { LectureQueryDto } from 'src/common/interfaces/dto/lecture/lecture.request.dto'; import { applyOffset, applyOrder } from 'src/common/utils/search.utils'; import { @@ -314,4 +316,37 @@ export class LectureRepository { const minute = (time % 2) * 30; return new Date(0, 0, 0, hour, minute, 0, 0); } + + async getLectureAutocomplete({ + year, + semester, + keyword, + }: ILecture.AutocompleteDto): Promise { + const candidate = await this.prisma.subject_lecture.findFirst({ + where: { + year, + semester, + OR: [ + { subject_department: { name: { startsWith: keyword } } }, + { subject_department: { name_en: { startsWith: keyword } } }, + { title: { startsWith: keyword } }, + { title_en: { startsWith: keyword } }, + { + subject_lecture_professors: { + some: { professor: { professor_name: { startsWith: keyword } } }, + }, + }, + { + subject_lecture_professors: { + some: { + professor: { professor_name_en: { startsWith: keyword } }, + }, + }, + }, + ], + }, + include: ELecture.Extended.include, + }); + return candidate; + } } From 6ac0dc33d2d927160227944df3b13156cd3859a9 Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 28 Feb 2024 22:20:45 +0900 Subject: [PATCH 172/250] fix: directory typo (#79) --- src/common/{entites => entities}/EFeed.ts | 0 src/common/interfaces/serializer/feeds.serializer.ts | 2 +- src/modules/feeds/feeds.service.ts | 2 +- src/prisma/repositories/feeds.repository.ts | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename src/common/{entites => entities}/EFeed.ts (100%) diff --git a/src/common/entites/EFeed.ts b/src/common/entities/EFeed.ts similarity index 100% rename from src/common/entites/EFeed.ts rename to src/common/entities/EFeed.ts diff --git a/src/common/interfaces/serializer/feeds.serializer.ts b/src/common/interfaces/serializer/feeds.serializer.ts index 050093ac..82dd7fb8 100644 --- a/src/common/interfaces/serializer/feeds.serializer.ts +++ b/src/common/interfaces/serializer/feeds.serializer.ts @@ -1,4 +1,4 @@ -import { EFeed } from 'src/common/entites/EFeed'; +import { EFeed } from 'src/common/entities/EFeed'; import { IFeed } from '../IFeed'; import { FeedType } from '../constants/feed'; import { toJsonCourseRelated } from './course.serializer'; diff --git a/src/modules/feeds/feeds.service.ts b/src/modules/feeds/feeds.service.ts index 7c40b7b0..d7c009a3 100644 --- a/src/modules/feeds/feeds.service.ts +++ b/src/modules/feeds/feeds.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; -import { EFeed } from 'src/common/entites/EFeed'; +import { EFeed } from 'src/common/entities/EFeed'; import { IFeed } from 'src/common/interfaces/IFeed'; import { DepartmentRepository } from 'src/prisma/repositories/department.repository'; import { FeedsRepository } from 'src/prisma/repositories/feeds.repository'; diff --git a/src/prisma/repositories/feeds.repository.ts b/src/prisma/repositories/feeds.repository.ts index 51719796..e4df63c8 100644 --- a/src/prisma/repositories/feeds.repository.ts +++ b/src/prisma/repositories/feeds.repository.ts @@ -7,7 +7,7 @@ import { review_majorbestreview, subject_department, } from '@prisma/client'; -import { EFeed } from 'src/common/entites/EFeed'; +import { EFeed } from 'src/common/entities/EFeed'; import { FeedRateMinDays, FeedVisibleRate, From be4c5b119b2f6e12a5cc7e8c8b3bea04f7546b98 Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 28 Feb 2024 22:21:01 +0900 Subject: [PATCH 173/250] feat: add get notices (#74) * feat: implement without detail feed * chore: add prisma generate on ci * chore: fix prisma-generate command * chore: remove ci branch on target branches * chore: rename generating step name * refactor: prisma scripts * fix: cors origin port * fix: db init script * refactor: add data migrations in prisma migration script * fix: generate script in ci * chore: Add cross-env (#64) * fix: a bug that orderFilter return empty filters (#65) * feat: add feeds module * feat: move feeds api to feeds module * feat: add IFeed * feat: add feed repository and serializer * feat: add get famousHumanityFeeds * feat: make random select HumanityBestReviews * refactor: change class to interface * feat: add rankedReviewDailyFeed * feat: add famous major review daily feed * feat: add review write daily user feed * feat: add ICourse * feat: add related course daily user feed * feat: add rate daily user feed * feat: add const FeedType * refactor: add FeedSchema namespace * refactor: add details interface in IFeed * refactor: rename redundant feed names * refactor: add Feed constants * fix: fix related course * refactor: fix typos * feat: add writable review * feat: comment out related course * refactor: move ICourse to structures * refactor: move directory interfaces * refactor: rename schemaTypes to entities * refactor: remove redundant prefix I * refactor: remove redundant prefix E * refactor: remove redundant prefix E * feat: add get notices * refactor: move repository to prisma module * refaoctor: map funciton * fix: add repository to exports in module --------- Co-authored-by: JeukHwang <92910273+JeukHwang@users.noreply.github.com> Co-authored-by: doxylee <68041124+doxylee@users.noreply.github.com> --- src/app.module.ts | 2 ++ src/common/entites/ENotice.ts | 7 +++++++ src/common/interfaces/INotice.ts | 18 ++++++++++++++++++ .../serializer/notices.serializer.ts | 11 +++++++++++ src/modules/notices/notices.controller.ts | 19 ++++++++++++++++--- src/modules/notices/notices.module.ts | 2 ++ src/modules/notices/notices.service.ts | 9 ++++++++- src/prisma/prisma.module.ts | 3 +++ src/prisma/repositories/notices.repository.ts | 13 +++++++++++++ 9 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/common/entites/ENotice.ts create mode 100644 src/common/interfaces/INotice.ts create mode 100644 src/common/interfaces/serializer/notices.serializer.ts create mode 100644 src/prisma/repositories/notices.repository.ts diff --git a/src/app.module.ts b/src/app.module.ts index 48918376..c3f97759 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -10,6 +10,7 @@ import { CoursesModule } from './modules/courses/courses.module'; import { DepartmentsModule } from './modules/departments/departments.module'; import { FeedsModule } from './modules/feeds/feeds.module'; import { LecturesModule } from './modules/lectures/lectures.module'; +import { NoticesModule } from './modules/notices/notices.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; import { SemestersModule } from './modules/semesters/semesters.module'; import { SessionModule } from './modules/session/session.module'; @@ -32,6 +33,7 @@ import { PrismaModule } from './prisma/prisma.module'; StatusModule, FeedsModule, WishlistModule, + NoticesModule, SessionModule, DepartmentsModule, ], diff --git a/src/common/entites/ENotice.ts b/src/common/entites/ENotice.ts new file mode 100644 index 00000000..2639862f --- /dev/null +++ b/src/common/entites/ENotice.ts @@ -0,0 +1,7 @@ +import { Prisma } from '@prisma/client'; + +export namespace ENotice { + export const Basic = Prisma.validator()({}); + + export type Basic = Prisma.support_noticeGetPayload; +} diff --git a/src/common/interfaces/INotice.ts b/src/common/interfaces/INotice.ts new file mode 100644 index 00000000..55ff5b3d --- /dev/null +++ b/src/common/interfaces/INotice.ts @@ -0,0 +1,18 @@ +export namespace INotice { + export interface Basic { + title: string; + content: string; + start_time: Date; + end_time: Date; + } + + /** + * @deprecated + */ + export class GetDto { + // @IsString() + // time?: string; + // @IsString() + // order?: string; + } +} diff --git a/src/common/interfaces/serializer/notices.serializer.ts b/src/common/interfaces/serializer/notices.serializer.ts new file mode 100644 index 00000000..364f1098 --- /dev/null +++ b/src/common/interfaces/serializer/notices.serializer.ts @@ -0,0 +1,11 @@ +import { ENotice } from 'src/common/entites/ENotice'; +import { INotice } from '../INotice'; + +export function toJsonNoticeBasic(notice: ENotice.Basic): INotice.Basic { + return { + title: notice.title, + content: notice.content, + start_time: notice.start_time, + end_time: notice.end_time, + }; +} diff --git a/src/modules/notices/notices.controller.ts b/src/modules/notices/notices.controller.ts index 782412b8..0dc17673 100644 --- a/src/modules/notices/notices.controller.ts +++ b/src/modules/notices/notices.controller.ts @@ -1,4 +1,17 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get } from '@nestjs/common'; +import { Public } from 'src/common/decorators/skip-auth.decorator'; +import { toJsonNoticeBasic } from 'src/common/interfaces/serializer/notices.serializer'; +import { NoticesService } from './notices.service'; -@Controller('notices') -export class NoticesController {} +@Controller('api/notices') +export class NoticesController { + constructor(private readonly noticesService: NoticesService) {} + + @Public() + @Get() + async getNotices() { + const notices = await this.noticesService.getNotices(); + + return notices.map(toJsonNoticeBasic); + } +} diff --git a/src/modules/notices/notices.module.ts b/src/modules/notices/notices.module.ts index 7a1fe0ff..b3bb22df 100644 --- a/src/modules/notices/notices.module.ts +++ b/src/modules/notices/notices.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; import { NoticesController } from './notices.controller'; import { NoticesService } from './notices.service'; @Module({ + imports: [PrismaModule], controllers: [NoticesController], providers: [NoticesService], }) diff --git a/src/modules/notices/notices.service.ts b/src/modules/notices/notices.service.ts index 186a3be9..3d102df9 100644 --- a/src/modules/notices/notices.service.ts +++ b/src/modules/notices/notices.service.ts @@ -1,4 +1,11 @@ import { Injectable } from '@nestjs/common'; +import { NoticesRepository } from 'src/prisma/repositories/notices.repository'; @Injectable() -export class NoticesService {} +export class NoticesService { + constructor(private readonly noticesRepository: NoticesRepository) {} + + public async getNotices() { + return await this.noticesRepository.getNotices(new Date()); + } +} diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 026d13cf..7d347b02 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -3,6 +3,7 @@ import { PrismaService } from './prisma.service'; import { CourseRepository } from './repositories/course.repository'; import { DepartmentRepository } from './repositories/department.repository'; import { LectureRepository } from './repositories/lecture.repository'; +import { NoticesRepository } from './repositories/notices.repository'; import { ReviewsRepository } from './repositories/review.repository'; import { SemesterRepository } from './repositories/semester.repository'; import { TimetableRepository } from './repositories/timetable.repository'; @@ -20,6 +21,7 @@ import { WishlistRepository } from './repositories/wishlist.repository'; SemesterRepository, TimetableRepository, WishlistRepository, + NoticesRepository, ], exports: [ PrismaService, @@ -31,6 +33,7 @@ import { WishlistRepository } from './repositories/wishlist.repository'; SemesterRepository, TimetableRepository, WishlistRepository, + NoticesRepository, ], }) export class PrismaModule {} diff --git a/src/prisma/repositories/notices.repository.ts b/src/prisma/repositories/notices.repository.ts new file mode 100644 index 00000000..5a49b9e8 --- /dev/null +++ b/src/prisma/repositories/notices.repository.ts @@ -0,0 +1,13 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class NoticesRepository { + constructor(private readonly prisma: PrismaService) {} + + public async getNotices(date: Date) { + return await this.prisma.support_notice.findMany({ + where: { start_time: { lte: date }, end_time: { gte: date } }, + }); + } +} From 22f5581a3f992dfc25c8789b3d2be7ad0219b1f9 Mon Sep 17 00:00:00 2001 From: "Dugi (Dongwook Hwang)" Date: Wed, 28 Feb 2024 22:23:46 +0900 Subject: [PATCH 174/250] chore(node): specify node.js v18 using nvm (#80) --- .nvmrc | 1 + README.md | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..7950a445 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18.17.0 diff --git a/README.md b/README.md index a72f59f8..7ca67c47 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,30 @@ sudo docker compose up 또는 로컬에서 MySQL 5.7을 설치하여 연결할 수 있습니다. +### Node.js 설치 및 버전 관리 + +Node.js v18 을 설치합니다. + +버전 체크 + +```bash +node -v # v18.17.0 +npm -v # v9.x.x +``` + +(Tip) [nvm](https://github.com/nvm-sh/nvm) 설치 후, nvm을 이용하여 로컬 개발 환경의 node.js 버전을 설정하는 것을 권장합니다! + +```bash +nvm install 18 +nvm use 18 +``` + +아래 명령어를 사용하면 `.nvmrc` 설정 파일에 따라 자동으로 버전이 변경됩니다. + +```bash +nvm use # uses v18 +``` + ### NestJS 서버 실행 ```sh From 9291fcc5866e6602fd8608b7152c7e4f9e77a61f Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 28 Feb 2024 22:25:56 +0900 Subject: [PATCH 175/250] feat: read course (#77) * feat: add read course * fix: add course filtering --- src/modules/courses/courses.controller.ts | 10 +++++++++- src/modules/courses/courses.service.ts | 13 +++++++++---- src/prisma/repositories/course.repository.ts | 20 ++++++++++++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index 6e6071b4..ed99cfb2 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Get, Param, Query } from '@nestjs/common'; +import { Controller, Get, Param, Post, Query } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { GetUser } from 'src/common/decorators/get-user.decorator'; import { Public } from 'src/common/decorators/skip-auth.decorator'; @@ -50,4 +50,12 @@ export class CourseController { ) { return await this.CoursesService.getReviewsByCourseId(query, id, user); } + + @Post(':id/read') + async readCourse( + @Param('id') id: number, + @GetUser() user: session_userprofile, + ) { + await this.CoursesService.readCourse(user.id, id); + } } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 9aff7175..9d206f74 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -2,6 +2,7 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { session_userprofile } from '@prisma/client'; import { ECourse } from 'src/common/entities/ECourse'; import { ICourse } from 'src/common/interfaces'; +import { CourseQueryDto } from 'src/common/interfaces/dto/course/course.request.dto'; import { CourseReviewQueryDto } from 'src/common/interfaces/dto/course/course.review.request.dto'; import { toJsonLecture } from 'src/common/interfaces/serializer/lecture.serializer'; import { toJsonReview } from 'src/common/interfaces/serializer/review.serializer'; @@ -15,7 +16,7 @@ export class CoursesService { constructor(private readonly CourseRepository: CourseRepository) {} public async getCourseByFilter( - query: any, + query: CourseQueryDto, user: session_userprofile, ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { const queryResult = await this.CourseRepository.filterByRequest(query); @@ -32,9 +33,9 @@ export class CoursesService { ); if (user) { - const latestReadDatetime = course.subject_courseuser.find( - (x) => (x.user_profile_id = user.id), - )?.latest_read_datetime; + const latestReadDatetime = course.subject_courseuser.find((x) => { + return x.user_profile_id === user.id && x.course_id === course.id; + })?.latest_read_datetime; const latestWrittenDatetime = course.latest_written_datetime; return Object.assign(result, { userspecific_is_read: @@ -150,4 +151,8 @@ export class CoursesService { return professor.professor.professor_name_en; } } + + async readCourse(userId: number, courseId: number) { + await this.CourseRepository.readCourse(userId, courseId); + } } diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index a053c96c..39929766 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -456,4 +456,24 @@ export class CourseRepository { }); return candidate; } + + async readCourse(userId: number, courseId: number) { + const now = new Date(); + return await this.prisma.subject_courseuser.upsert({ + create: { + latest_read_datetime: now, + user_profile_id: userId, + course_id: courseId, + }, + update: { + latest_read_datetime: now, + }, + where: { + course_id_user_profile_id: { + course_id: courseId, + user_profile_id: userId, + }, + }, + }); + } } From 411d4240053bacda3f09011aaaaa70dcf74ff4ae Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Fri, 1 Mar 2024 14:23:35 +0900 Subject: [PATCH 176/250] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ca67c47..2d128761 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # OTL Plus Server -[![CI](https://github.com/sparcs-kaist/otlplus-server/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/sparcs-kaist/otlplus-server/actions/workflows/ci.yml) +[![CI](https://github.com/sparcs-kaist/otlplus-server/actions/workflows/ci.yml/badge.svg?branch=dev)](https://github.com/sparcs-kaist/otlplus-server/actions/workflows/ci.yml) ## How to run From be17a1f0d28b9857e1e95d3add19f5c277b0d65b Mon Sep 17 00:00:00 2001 From: Dongjae Lee <58449555+duncan020313@users.noreply.github.com> Date: Wed, 6 Mar 2024 21:53:58 +0900 Subject: [PATCH 177/250] Issue/55/planner (#62) * feat: add DTOs for planner * feat: add types for planners * feat: add basics for planner * feat: add serializers for planner * feat: add union type checker * feat: add union type narrower * feat: implement serializer of item and track * fix: fix typo * fix: fix miscellaneous bugs * feat: implement /api/tracks * feat: implement post * feat: add query param id checker * refactor: refactor maps * fix: snake to camel * fix: fix planner item query logic --------- Co-authored-by: ddungiii --- src/app.module.ts | 4 + .../additional.track.response.dto.ts | 5 + .../dto/planner/planner.request.dto.ts | 58 ++++ .../dto/planner/planner.response.dto.ts | 19 ++ .../planner_item/arbitrary.response.dto.ts | 14 + .../dto/planner_item/future.reponse.dto.ts | 10 + .../dto/planner_item/taken.response.dto.ts | 10 + .../dto/track/additional.response.dto.ts | 12 + .../dto/track/general.response.dto.ts | 16 ++ .../dto/track/major.response.dto.ts | 11 + .../serializer/planner.item.serializer.ts | 70 +++++ .../serializer/planner.serializer.ts | 36 +++ .../interfaces/serializer/track.serializer.ts | 68 +++++ src/common/schemaTypes/types.ts | 72 +++++ src/common/utils/method.utils.ts | 11 + src/modules/planners/planners.controller.ts | 49 +++- src/modules/planners/planners.module.ts | 2 + src/modules/planners/planners.service.ts | 94 ++++++- src/modules/tracks/tracks.controller.ts | 14 +- src/modules/tracks/tracks.module.ts | 2 + src/modules/tracks/tracks.service.ts | 20 +- src/prisma/prisma.module.ts | 6 + src/prisma/repositories/planner.repository.ts | 250 ++++++++++++++++++ src/prisma/repositories/track.repository.ts | 64 +++++ 24 files changed, 909 insertions(+), 8 deletions(-) create mode 100644 src/common/interfaces/constants/additional.track.response.dto.ts create mode 100644 src/common/interfaces/dto/planner/planner.request.dto.ts create mode 100644 src/common/interfaces/dto/planner/planner.response.dto.ts create mode 100644 src/common/interfaces/dto/planner_item/arbitrary.response.dto.ts create mode 100644 src/common/interfaces/dto/planner_item/future.reponse.dto.ts create mode 100644 src/common/interfaces/dto/planner_item/taken.response.dto.ts create mode 100644 src/common/interfaces/dto/track/additional.response.dto.ts create mode 100644 src/common/interfaces/dto/track/general.response.dto.ts create mode 100644 src/common/interfaces/dto/track/major.response.dto.ts create mode 100644 src/common/interfaces/serializer/planner.item.serializer.ts create mode 100644 src/common/interfaces/serializer/planner.serializer.ts create mode 100644 src/common/interfaces/serializer/track.serializer.ts create mode 100644 src/prisma/repositories/planner.repository.ts create mode 100644 src/prisma/repositories/track.repository.ts diff --git a/src/app.module.ts b/src/app.module.ts index c3f97759..3cdfa4f1 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -11,11 +11,13 @@ import { DepartmentsModule } from './modules/departments/departments.module'; import { FeedsModule } from './modules/feeds/feeds.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { NoticesModule } from './modules/notices/notices.module'; +import { PlannersModule } from './modules/planners/planners.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; import { SemestersModule } from './modules/semesters/semesters.module'; import { SessionModule } from './modules/session/session.module'; import { StatusModule } from './modules/status/status.module'; import { TimetablesModule } from './modules/timetables/timetables.module'; +import { TracksModule } from './modules/tracks/tracks.module'; import { UserModule } from './modules/user/user.module'; import { WishlistModule } from './modules/wishlist/wishlist.module'; import { PrismaModule } from './prisma/prisma.module'; @@ -36,6 +38,8 @@ import { PrismaModule } from './prisma/prisma.module'; NoticesModule, SessionModule, DepartmentsModule, + PlannersModule, + TracksModule, ], controllers: [AppController], providers: [ diff --git a/src/common/interfaces/constants/additional.track.response.dto.ts b/src/common/interfaces/constants/additional.track.response.dto.ts new file mode 100644 index 00000000..bd0f06b5 --- /dev/null +++ b/src/common/interfaces/constants/additional.track.response.dto.ts @@ -0,0 +1,5 @@ +import { generationUnionTypeChecker } from 'src/common/utils/method.utils'; + +const types = ['DOUBLE', 'MINOR', 'ADVANCED', 'INTERDISCIPLINARY'] as const; +export type AdditionalTrackType = (typeof types)[number]; +export const AddtionalTrackTypeNarrower = generationUnionTypeChecker(...types); diff --git a/src/common/interfaces/dto/planner/planner.request.dto.ts b/src/common/interfaces/dto/planner/planner.request.dto.ts new file mode 100644 index 00000000..48e690b9 --- /dev/null +++ b/src/common/interfaces/dto/planner/planner.request.dto.ts @@ -0,0 +1,58 @@ +import { Transform, Type } from 'class-transformer'; +import { + IsArray, + IsBoolean, + IsInt, + IsNumber, + IsOptional, + IsString, +} from 'class-validator'; +import { + OrderDefaultValidator, + _PROHIBITED_FIELD_PATTERN, +} from '../../../decorators/validators.decorator'; +export class PlannerQueryDto { + @IsOptional() + @Transform(({ value }) => (typeof value === 'string' ? [value] : value)) + @IsArray() + @IsString({ each: true }) + @OrderDefaultValidator(_PROHIBITED_FIELD_PATTERN) + order?: string[]; + + @IsOptional() + @IsNumber() + @Type(() => Number) + offset?: number; + + @IsOptional() + @IsNumber() + @Type(() => Number) + limit?: number; +} + +export class PlannerBodyDto { + @IsInt() + start_year!: number; + @IsInt() + end_year!: number; + @IsInt() + general_track!: number; + @IsInt() + major_track!: number; + @IsOptional() + @IsArray() + @IsInt({ each: true }) + additional_tracks?: number[]; + @IsOptional() + @IsBoolean() + should_update_taken_semesters?: boolean; + @IsArray() + @IsInt({ each: true }) + taken_items_to_copy!: number[]; + @IsArray() + @IsInt({ each: true }) + future_items_to_copy!: number[]; + @IsArray() + @IsInt({ each: true }) + arbitrary_items_to_copy!: number[]; +} diff --git a/src/common/interfaces/dto/planner/planner.response.dto.ts b/src/common/interfaces/dto/planner/planner.response.dto.ts new file mode 100644 index 00000000..231fdc79 --- /dev/null +++ b/src/common/interfaces/dto/planner/planner.response.dto.ts @@ -0,0 +1,19 @@ +import { ArbitraryPlannerItemResponseDto } from '../planner_item/arbitrary.response.dto'; +import { FuturePlannerItemResponseDto } from '../planner_item/future.reponse.dto'; +import { TakenPlannerItemResponseDto } from '../planner_item/taken.response.dto'; +import { AdditionalTrackResponseDto } from '../track/additional.response.dto'; +import { GeneralTrackResponseDto } from '../track/general.response.dto'; +import { MajorTrackResponseDto } from '../track/major.response.dto'; + +export interface PlannerResponseDto { + id: number; + start_year: number; + end_year: number; + general_track: GeneralTrackResponseDto; + major_track: MajorTrackResponseDto; + additional_tracks: AdditionalTrackResponseDto[]; + taken_items: TakenPlannerItemResponseDto[]; + future_items: FuturePlannerItemResponseDto[]; + arbitrary_items: ArbitraryPlannerItemResponseDto[]; + arrange_order: number; +} diff --git a/src/common/interfaces/dto/planner_item/arbitrary.response.dto.ts b/src/common/interfaces/dto/planner_item/arbitrary.response.dto.ts new file mode 100644 index 00000000..ac689ac3 --- /dev/null +++ b/src/common/interfaces/dto/planner_item/arbitrary.response.dto.ts @@ -0,0 +1,14 @@ +import { DepartmentResponseDto } from '../department/department.response.dto'; + +export interface ArbitraryPlannerItemResponseDto { + id: number; + item_type: 'ARBITRARY'; + is_excluded: boolean; + year: number; + semester: number; + department: DepartmentResponseDto | null; + type: string; + type_en: string; + credit: number; + credit_au: number; +} diff --git a/src/common/interfaces/dto/planner_item/future.reponse.dto.ts b/src/common/interfaces/dto/planner_item/future.reponse.dto.ts new file mode 100644 index 00000000..f94be0af --- /dev/null +++ b/src/common/interfaces/dto/planner_item/future.reponse.dto.ts @@ -0,0 +1,10 @@ +import { CourseResponseDto } from '../course/course.response.dto'; + +export interface FuturePlannerItemResponseDto { + id: number; + item_type: 'FUTURE'; + is_excluded: boolean; + year: number; + semester: number; + course: CourseResponseDto; +} diff --git a/src/common/interfaces/dto/planner_item/taken.response.dto.ts b/src/common/interfaces/dto/planner_item/taken.response.dto.ts new file mode 100644 index 00000000..cdc08b0b --- /dev/null +++ b/src/common/interfaces/dto/planner_item/taken.response.dto.ts @@ -0,0 +1,10 @@ +import { CourseResponseDto } from '../course/course.response.dto'; +import { LectureResponseDto } from '../lecture/lecture.response.dto'; + +export interface TakenPlannerItemResponseDto { + id: number; + item_type: 'TAKEN'; + is_excluded: boolean; + lecture: LectureResponseDto; + course: CourseResponseDto; +} diff --git a/src/common/interfaces/dto/track/additional.response.dto.ts b/src/common/interfaces/dto/track/additional.response.dto.ts new file mode 100644 index 00000000..116f6a95 --- /dev/null +++ b/src/common/interfaces/dto/track/additional.response.dto.ts @@ -0,0 +1,12 @@ +import { AdditionalTrackType } from '../../constants/additional.track.response.dto'; +import { DepartmentResponseDto } from '../department/department.response.dto'; + +export interface AdditionalTrackResponseDto { + id: number; + start_year: number; + end_year: number; + type: AdditionalTrackType; + department: DepartmentResponseDto | null; + major_required: number; + major_elective: number; +} diff --git a/src/common/interfaces/dto/track/general.response.dto.ts b/src/common/interfaces/dto/track/general.response.dto.ts new file mode 100644 index 00000000..e3970f03 --- /dev/null +++ b/src/common/interfaces/dto/track/general.response.dto.ts @@ -0,0 +1,16 @@ +export interface GeneralTrackResponseDto { + id: number; + start_year: number; + end_year: number; + is_foreign: boolean; + total_credit: number; + total_au: number; + basic_required: number; + basic_elective: number; + thesis_study: number; + thesis_study_doublemajor: number; + general_required_credit: number; + general_required_au: number; + humanities: number; + humanities_doublemajor: number; +} diff --git a/src/common/interfaces/dto/track/major.response.dto.ts b/src/common/interfaces/dto/track/major.response.dto.ts new file mode 100644 index 00000000..ec7925bb --- /dev/null +++ b/src/common/interfaces/dto/track/major.response.dto.ts @@ -0,0 +1,11 @@ +import { DepartmentResponseDto } from '../department/department.response.dto'; + +export interface MajorTrackResponseDto { + id: number; + start_year: number; + end_year: number; + department: DepartmentResponseDto; + basic_elective_doublemajor: number; + major_required: number; + major_elective: number; +} diff --git a/src/common/interfaces/serializer/planner.item.serializer.ts b/src/common/interfaces/serializer/planner.item.serializer.ts new file mode 100644 index 00000000..884d3fe5 --- /dev/null +++ b/src/common/interfaces/serializer/planner.item.serializer.ts @@ -0,0 +1,70 @@ +import { + ArbitraryPlannerItem, + FuturePlannerItem, + TakenPlannerItem, +} from 'src/common/schemaTypes/types'; +import { ArbitraryPlannerItemResponseDto } from '../dto/planner_item/arbitrary.response.dto'; +import { FuturePlannerItemResponseDto } from '../dto/planner_item/future.reponse.dto'; +import { TakenPlannerItemResponseDto } from '../dto/planner_item/taken.response.dto'; +import { toJsonCourse } from './course.serializer'; +import { toJsonDepartment } from './department.serializer'; +import { toJsonLecture } from './lecture.serializer'; + +export const toJsonTakenItem = ( + taken_item: TakenPlannerItem, +): TakenPlannerItemResponseDto => { + return { + id: taken_item.id, + item_type: 'TAKEN', + is_excluded: taken_item.is_excluded, + lecture: toJsonLecture(taken_item.subject_lecture, false), + course: toJsonCourse( + taken_item.subject_lecture.course, + taken_item.subject_lecture, + taken_item.subject_lecture.course.subject_course_professors.map( + (x) => x.professor, + ), + false, + ), + }; +}; + +export const toJsonArbitraryItem = ( + arbitrary_item: ArbitraryPlannerItem, +): ArbitraryPlannerItemResponseDto => { + return { + id: arbitrary_item.id, + item_type: 'ARBITRARY', + is_excluded: arbitrary_item.is_excluded, + year: arbitrary_item.year, + semester: arbitrary_item.semester, + department: + arbitrary_item.subject_department !== null + ? toJsonDepartment(arbitrary_item.subject_department) + : null, + type: arbitrary_item.type, + type_en: arbitrary_item.type_en, + credit: arbitrary_item.credit, + credit_au: arbitrary_item.credit_au, + }; +}; + +export const toJsonFutureItem = ( + future_item: FuturePlannerItem, +): FuturePlannerItemResponseDto => { + return { + id: future_item.id, + item_type: 'FUTURE', + is_excluded: future_item.is_excluded, + year: future_item.year, + semester: future_item.semester, + course: toJsonCourse( + future_item.subject_course, + future_item.subject_course.lecture[0], + future_item.subject_course.subject_course_professors.map( + (x) => x.professor, + ), + false, + ), + }; +}; diff --git a/src/common/interfaces/serializer/planner.serializer.ts b/src/common/interfaces/serializer/planner.serializer.ts new file mode 100644 index 00000000..e011f6d5 --- /dev/null +++ b/src/common/interfaces/serializer/planner.serializer.ts @@ -0,0 +1,36 @@ +import { PlannerDetails } from 'src/common/schemaTypes/types'; +import { PlannerResponseDto } from '../dto/planner/planner.response.dto'; +import { + toJsonArbitraryItem, + toJsonFutureItem, + toJsonTakenItem, +} from './planner.item.serializer'; +import { + toJsonAdditionalTrack, + toJsonGeneralTrack, + toJsonMajorTrack, +} from './track.serializer'; + +export const toJsonPlanner = (planner: PlannerDetails): PlannerResponseDto => { + return { + id: planner.id, + start_year: planner.start_year, + end_year: planner.end_year, + general_track: toJsonGeneralTrack(planner.graduation_generaltrack), + major_track: toJsonMajorTrack(planner.graduation_majortrack), + additional_tracks: planner.planner_planner_additional_tracks.map( + (additional_track) => + toJsonAdditionalTrack(additional_track.graduation_additionaltrack), + ), + taken_items: planner.planner_takenplanneritem.map((item) => + toJsonTakenItem(item), + ), + future_items: planner.planner_futureplanneritem.map((item) => + toJsonFutureItem(item), + ), + arbitrary_items: planner.planner_arbitraryplanneritem.map((item) => + toJsonArbitraryItem(item), + ), + arrange_order: planner.arrange_order, + }; +}; diff --git a/src/common/interfaces/serializer/track.serializer.ts b/src/common/interfaces/serializer/track.serializer.ts new file mode 100644 index 00000000..320e7dbb --- /dev/null +++ b/src/common/interfaces/serializer/track.serializer.ts @@ -0,0 +1,68 @@ +import { + AdditionalTrackDetails, + GeneralTrackBasic, + MajorTrackDetails, +} from 'src/common/schemaTypes/types'; +import { AddtionalTrackTypeNarrower } from '../constants/additional.track.response.dto'; +import { AdditionalTrackResponseDto } from '../dto/track/additional.response.dto'; +import { GeneralTrackResponseDto } from '../dto/track/general.response.dto'; +import { MajorTrackResponseDto } from '../dto/track/major.response.dto'; +import { toJsonDepartment } from './department.serializer'; + +export const toJsonGeneralTrack = ( + generalTrack: GeneralTrackBasic, +): GeneralTrackResponseDto => { + return { + id: generalTrack.id, + start_year: generalTrack.start_year, + end_year: generalTrack.end_year, + is_foreign: generalTrack.is_foreign, + total_credit: generalTrack.total_credit, + total_au: generalTrack.total_au, + basic_required: generalTrack.basic_required, + basic_elective: generalTrack.basic_elective, + thesis_study: generalTrack.thesis_study, + thesis_study_doublemajor: generalTrack.thesis_study_doublemajor, + general_required_credit: generalTrack.general_required_credit, + general_required_au: generalTrack.general_required_au, + humanities: generalTrack.humanities, + humanities_doublemajor: generalTrack.humanities_doublemajor, + }; +}; + +export const toJsonMajorTrack = ( + majorTrack: MajorTrackDetails, +): MajorTrackResponseDto => { + return { + id: majorTrack.id, + start_year: majorTrack.start_year, + end_year: majorTrack.end_year, + department: toJsonDepartment(majorTrack.subject_department), + basic_elective_doublemajor: majorTrack.basic_elective_doublemajor, + major_required: majorTrack.major_required, + major_elective: majorTrack.major_elective, + }; +}; + +export const toJsonAdditionalTrack = ( + additionalTrack: AdditionalTrackDetails, +): AdditionalTrackResponseDto => { + const type = AddtionalTrackTypeNarrower(additionalTrack.type); + + if (type instanceof Error) { + throw type; + } + + return { + id: additionalTrack.id, + start_year: additionalTrack.start_year, + end_year: additionalTrack.end_year, + type, + department: + additionalTrack.subject_department === null + ? null + : toJsonDepartment(additionalTrack.subject_department), + major_required: additionalTrack.major_required, + major_elective: additionalTrack.major_elective, + }; +}; diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 6e78fd82..78140211 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -46,6 +46,60 @@ export const timeTableDetails = }, }); +const majorTrack = Prisma.validator()({ + include: { + subject_department: true, + }, +}); + +export const additionalTrack = + Prisma.validator()({ + include: { + subject_department: true, + }, + }); + +export const takenPlannerItem = + Prisma.validator()({ + include: { + subject_lecture: { + include: { + ...lectureDetails.include, + course: courseDetails, + }, + }, + }, + }); + +export const arbitraryPlannerItem = + Prisma.validator()({ + include: { + subject_department: true, + }, + }); + +export const futurePlannerItem = + Prisma.validator()({ + include: { + subject_course: courseDetails, + }, + }); + +export const plannerDetails = Prisma.validator()({ + include: { + planner_planner_additional_tracks: { + include: { + graduation_additionaltrack: additionalTrack, + }, + }, + graduation_generaltrack: true, + graduation_majortrack: majorTrack, + planner_takenplanneritem: takenPlannerItem, + planner_arbitraryplanneritem: arbitraryPlannerItem, + planner_futureplanneritem: futurePlannerItem, + }, +}); + export type NESTED = true; export const reviewDetails = Prisma.validator()({ @@ -104,6 +158,24 @@ export type TimeTableDetails = Prisma.timetable_timetableGetPayload< >; export type TimeTableBasic = Prisma.timetable_timetableGetPayload; export type SemesterBasic = Prisma.subject_semesterGetPayload; +export type PlannerBasic = Prisma.planner_plannerGetPayload; +export type PlannerDetails = Prisma.planner_plannerGetPayload< + typeof plannerDetails +>; +export type ArbitraryPlannerItem = + Prisma.planner_arbitraryplanneritemGetPayload; +export type FuturePlannerItem = Prisma.planner_futureplanneritemGetPayload< + typeof futurePlannerItem +>; +export type TakenPlannerItem = Prisma.planner_takenplanneritemGetPayload< + typeof takenPlannerItem +>; +export type GeneralTrackBasic = Prisma.graduation_generaltrackGetPayload; +export type MajorTrackDetails = Prisma.graduation_majortrackGetPayload< + typeof majorTrack +>; +export type AdditionalTrackDetails = + Prisma.graduation_additionaltrackGetPayload; export type WishlistWithLectures = Prisma.timetable_wishlistGetPayload< typeof wishlistWithLectures diff --git a/src/common/utils/method.utils.ts b/src/common/utils/method.utils.ts index 87c248b0..866059df 100644 --- a/src/common/utils/method.utils.ts +++ b/src/common/utils/method.utils.ts @@ -39,3 +39,14 @@ export function getRandomChoice(choices: T[]): T { const randomIndex = Math.floor(Math.random() * choices.length); return choices[randomIndex]; } + +export function generationUnionTypeChecker( + ...values: UnionType[] +) { + return function (value: unknown): UnionType | Error { + if (typeof value !== 'string') return new Error('Invalid value: ' + value); + return values.includes(value as UnionType) + ? (value as UnionType) + : new Error('Invalid value: ' + value); + }; +} diff --git a/src/modules/planners/planners.controller.ts b/src/modules/planners/planners.controller.ts index 953148c5..2d5a9951 100644 --- a/src/modules/planners/planners.controller.ts +++ b/src/modules/planners/planners.controller.ts @@ -1,4 +1,47 @@ -import { Controller } from '@nestjs/common'; +import { + Body, + Controller, + Get, + Param, + Post, + Query, + UnauthorizedException, +} from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { + PlannerBodyDto, + PlannerQueryDto, +} from 'src/common/interfaces/dto/planner/planner.request.dto'; +import { PlannersService } from './planners.service'; -@Controller('planners') -export class PlannersController {} +@Controller('api/users/:id/planners') +export class PlannersController { + constructor(private readonly plannersService: PlannersService) {} + + @Get() + async getPlanners( + @Query() query: PlannerQueryDto, + @Param('id') id: number, + @GetUser() user: session_userprofile, + ) { + if (id !== user.id) { + throw new UnauthorizedException(); + } + const planners = await this.plannersService.getPlannerByUser(query, user); + return planners; + } + + @Post() + async postPlanner( + @Body() planner: PlannerBodyDto, + @Param('id') id: number, + @GetUser() user: session_userprofile, + ) { + if (id !== user.id) { + throw new UnauthorizedException(); + } + const newPlanner = await this.plannersService.postPlanner(planner, user); + return newPlanner; + } +} diff --git a/src/modules/planners/planners.module.ts b/src/modules/planners/planners.module.ts index 82449cee..18623ddf 100644 --- a/src/modules/planners/planners.module.ts +++ b/src/modules/planners/planners.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; import { PlannersController } from './planners.controller'; import { PlannersService } from './planners.service'; @Module({ + imports: [PrismaModule], controllers: [PlannersController], providers: [PlannersService], }) diff --git a/src/modules/planners/planners.service.ts b/src/modules/planners/planners.service.ts index 19a289f1..bfb610b6 100644 --- a/src/modules/planners/planners.service.ts +++ b/src/modules/planners/planners.service.ts @@ -1,4 +1,96 @@ import { Injectable } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { + PlannerBodyDto, + PlannerQueryDto, +} from 'src/common/interfaces/dto/planner/planner.request.dto'; +import { PlannerResponseDto } from 'src/common/interfaces/dto/planner/planner.response.dto'; +import { toJsonPlanner } from 'src/common/interfaces/serializer/planner.serializer'; +import { LectureRepository } from 'src/prisma/repositories/lecture.repository'; +import { PlannerRepository } from 'src/prisma/repositories/planner.repository'; @Injectable() -export class PlannersService {} +export class PlannersService { + constructor( + private readonly PlannerRepository: PlannerRepository, + private readonly LectureRepository: LectureRepository, + ) {} + + public async getPlannerByUser( + query: PlannerQueryDto, + user: session_userprofile, + ) { + const queryResult = await this.PlannerRepository.getPlannerByUser( + query, + user, + ); + return queryResult.map(toJsonPlanner); + } + + async getRelatedPlanner(user: session_userprofile) { + return await this.PlannerRepository.getRelatedPlanner(user); + } + + public async postPlanner( + body: PlannerBodyDto, + user: session_userprofile, + ): Promise { + const relatedPlanner = await this.getRelatedPlanner(user); + const arrangeOrder = + relatedPlanner.length == 0 + ? 0 + : relatedPlanner[relatedPlanner.length - 1].arrange_order + 1; + const planner = await this.PlannerRepository.createPlanner( + body, + arrangeOrder, + user, + ); + + if (body.should_update_taken_semesters) { + const takenLectures = + await this.LectureRepository.findReviewWritableLectures( + user, + new Date(), + ); + const valid_takenLectures = takenLectures.filter((lecture) => { + const validStartYear = lecture.year >= body.start_year; + const validEndYear = lecture.year <= body.end_year; + return validStartYear && validEndYear; + }); + valid_takenLectures.forEach(async (lecture) => { + await this.PlannerRepository.createTakenPlannerItem(planner, lecture); + }); + } + + body.taken_items_to_copy.forEach(async (item) => { + const targetItem = await this.PlannerRepository.getTakenPlannerItemById( + user, + item, + ); + await this.PlannerRepository.createTakenPlannerItem( + planner, + targetItem.subject_lecture, + targetItem.is_excluded, + ); + }); + + body.future_items_to_copy.forEach(async (item) => { + const targetItem = await this.PlannerRepository.getFuturePlannerItemById( + user, + item, + ); + await this.PlannerRepository.createFuturePlannerItem(planner, targetItem); + }); + + body.arbitrary_items_to_copy.forEach(async (item) => { + const targetItem = + await this.PlannerRepository.getArbitraryPlannerItemById(user, item); + await this.PlannerRepository.createArbitraryPlannerItem( + planner, + targetItem, + ); + }); + + return toJsonPlanner(planner); + } +} diff --git a/src/modules/tracks/tracks.controller.ts b/src/modules/tracks/tracks.controller.ts index 743df993..bcde01c2 100644 --- a/src/modules/tracks/tracks.controller.ts +++ b/src/modules/tracks/tracks.controller.ts @@ -1,4 +1,12 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get } from '@nestjs/common'; +import { TracksService } from './tracks.service'; -@Controller('tracks') -export class TracksController {} +@Controller('/api/tracks') +export class TracksController { + constructor(private readonly tracksService: TracksService) {} + + @Get() + async getTracks() { + return await this.tracksService.getAllTrack(); + } +} diff --git a/src/modules/tracks/tracks.module.ts b/src/modules/tracks/tracks.module.ts index 9bc5af05..fc9883ae 100644 --- a/src/modules/tracks/tracks.module.ts +++ b/src/modules/tracks/tracks.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; import { TracksController } from './tracks.controller'; import { TracksService } from './tracks.service'; @Module({ + imports: [PrismaModule], controllers: [TracksController], providers: [TracksService], }) diff --git a/src/modules/tracks/tracks.service.ts b/src/modules/tracks/tracks.service.ts index 193549e3..86e98b12 100644 --- a/src/modules/tracks/tracks.service.ts +++ b/src/modules/tracks/tracks.service.ts @@ -1,4 +1,22 @@ import { Injectable } from '@nestjs/common'; +import { + toJsonAdditionalTrack, + toJsonGeneralTrack, + toJsonMajorTrack, +} from 'src/common/interfaces/serializer/track.serializer'; +import { TracksRepository } from 'src/prisma/repositories/track.repository'; @Injectable() -export class TracksService {} +export class TracksService { + constructor(private readonly TracksRepository: TracksRepository) {} + + public async getAllTrack() { + const { generalTracks, majorTracks, addtionalTracks } = + await this.TracksRepository.getAllTracks(); + return { + general: generalTracks.map(toJsonGeneralTrack), + major: majorTracks.map(toJsonMajorTrack), + additional: addtionalTracks.map(toJsonAdditionalTrack), + }; + } +} diff --git a/src/prisma/prisma.module.ts b/src/prisma/prisma.module.ts index 7d347b02..35abbbb1 100644 --- a/src/prisma/prisma.module.ts +++ b/src/prisma/prisma.module.ts @@ -4,9 +4,11 @@ import { CourseRepository } from './repositories/course.repository'; import { DepartmentRepository } from './repositories/department.repository'; import { LectureRepository } from './repositories/lecture.repository'; import { NoticesRepository } from './repositories/notices.repository'; +import { PlannerRepository } from './repositories/planner.repository'; import { ReviewsRepository } from './repositories/review.repository'; import { SemesterRepository } from './repositories/semester.repository'; import { TimetableRepository } from './repositories/timetable.repository'; +import { TracksRepository } from './repositories/track.repository'; import { UserRepository } from './repositories/user.repository'; import { WishlistRepository } from './repositories/wishlist.repository'; @@ -21,6 +23,8 @@ import { WishlistRepository } from './repositories/wishlist.repository'; SemesterRepository, TimetableRepository, WishlistRepository, + PlannerRepository, + TracksRepository, NoticesRepository, ], exports: [ @@ -33,6 +37,8 @@ import { WishlistRepository } from './repositories/wishlist.repository'; SemesterRepository, TimetableRepository, WishlistRepository, + PlannerRepository, + TracksRepository, NoticesRepository, ], }) diff --git a/src/prisma/repositories/planner.repository.ts b/src/prisma/repositories/planner.repository.ts new file mode 100644 index 00000000..041c23c0 --- /dev/null +++ b/src/prisma/repositories/planner.repository.ts @@ -0,0 +1,250 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { + PlannerBodyDto, + PlannerQueryDto, +} from 'src/common/interfaces/dto/planner/planner.request.dto'; +import { + ArbitraryPlannerItem, + FuturePlannerItem, + LectureDetails, + PlannerBasic, + PlannerDetails, + TakenPlannerItem, + arbitraryPlannerItem, + futurePlannerItem, + plannerDetails, + takenPlannerItem, +} from 'src/common/schemaTypes/types'; +import { orderFilter } from 'src/common/utils/search.utils'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class PlannerRepository { + constructor(private readonly prisma: PrismaService) {} + + public async getPlannerByUser( + query: PlannerQueryDto, + user: session_userprofile, + ): Promise { + return await this.prisma.planner_planner.findMany({ + ...plannerDetails, + where: { + user_id: user.id, + }, + orderBy: orderFilter(query.order), + skip: query.offset, + take: query.limit, + }); + } + + public async createPlanner( + body: PlannerBodyDto, + arrange_order: number, + user: session_userprofile, + ): Promise { + return await this.prisma.planner_planner.create({ + ...plannerDetails, + data: { + session_userprofile: { + connect: { + id: user.id, + }, + }, + graduation_generaltrack: { + connect: { + id: body.general_track, + }, + }, + graduation_majortrack: { + connect: { + id: body.major_track, + }, + }, + planner_planner_additional_tracks: { + create: body?.additional_tracks?.map((t) => { + return { + graduation_additionaltrack: { + connect: { + id: t, + }, + }, + }; + }), + }, + start_year: body.start_year, + end_year: body.end_year, + arrange_order: arrange_order, + }, + }); + } + + public async getRelatedPlanner( + user: session_userprofile, + ): Promise { + return await this.prisma.planner_planner.findMany({ + where: { + user_id: user.id, + }, + orderBy: { + arrange_order: 'asc', + }, + }); + } + + public async getTakenPlannerItemById( + user: session_userprofile, + id: number, + ): Promise { + const planner = await this.prisma.planner_planner.findMany({ + include: { + planner_takenplanneritem: { + ...takenPlannerItem, + }, + }, + where: { + user_id: user.id, + planner_takenplanneritem: { + some: { + id: id, + }, + }, + }, + }); + const candidates = planner.map((p) => p.planner_takenplanneritem).flat(); + const result = candidates.find((c) => c.id === id); + if (!result) { + throw new NotFoundException(); + } + return result; + } + + public async createTakenPlannerItem( + planner: PlannerBasic, + lecture: LectureDetails, + isExcluded: boolean = false, + ) { + return await this.prisma.planner_takenplanneritem.create({ + data: { + planner_planner: { + connect: { + id: planner.id, + }, + }, + is_excluded: isExcluded, + subject_lecture: { + connect: { + id: lecture.id, + }, + }, + }, + }); + } + public async getFuturePlannerItemById( + user: session_userprofile, + id: number, + ): Promise { + const planner = await this.prisma.planner_planner.findMany({ + include: { + planner_futureplanneritem: { + ...futurePlannerItem, + }, + }, + where: { + user_id: user.id, + planner_futureplanneritem: { + some: { + id: id, + }, + }, + }, + }); + const candidates = planner.map((p) => p.planner_futureplanneritem).flat(); + const result = candidates.find((c) => c.id === id); + if (!result) { + throw new NotFoundException(); + } + return result; + } + + public async createFuturePlannerItem( + planner: PlannerBasic, + target_item: FuturePlannerItem, + ) { + return await this.prisma.planner_futureplanneritem.create({ + data: { + planner_planner: { + connect: { + id: planner.id, + }, + }, + subject_course: { + connect: { + id: target_item.course_id, + }, + }, + is_excluded: target_item.is_excluded, + year: target_item.year, + semester: target_item.semester, + }, + }); + } + + public async getArbitraryPlannerItemById( + user: session_userprofile, + id: number, + ): Promise { + const planner = await this.prisma.planner_planner.findMany({ + include: { + planner_arbitraryplanneritem: { + ...arbitraryPlannerItem, + }, + }, + where: { + user_id: user.id, + planner_arbitraryplanneritem: { + some: { + id: id, + }, + }, + }, + }); + const candidates = planner + .map((p) => p.planner_arbitraryplanneritem) + .flat(); + const result = candidates.find((c) => c.id === id); + if (!result) { + throw new NotFoundException(); + } + return result; + } + + public async createArbitraryPlannerItem( + planner: PlannerBasic, + target_item: ArbitraryPlannerItem, + ) { + return await this.prisma.planner_arbitraryplanneritem.create({ + data: { + planner_planner: { + connect: { + id: planner.id, + }, + }, + subject_department: target_item.department_id + ? { + connect: { + id: target_item.department_id, + }, + } + : undefined, + is_excluded: target_item.is_excluded, + year: target_item.year, + semester: target_item.semester, + type: target_item.type, + type_en: target_item.type_en, + credit: target_item.credit, + credit_au: target_item.credit_au, + }, + }); + } +} diff --git a/src/prisma/repositories/track.repository.ts b/src/prisma/repositories/track.repository.ts new file mode 100644 index 00000000..96635bd0 --- /dev/null +++ b/src/prisma/repositories/track.repository.ts @@ -0,0 +1,64 @@ +import { Injectable } from '@nestjs/common'; +import { + AdditionalTrackDetails, + GeneralTrackBasic, + MajorTrackDetails, +} from 'src/common/schemaTypes/types'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class TracksRepository { + constructor(private readonly prisma: PrismaService) {} + + public async getAllTracks(): Promise<{ + generalTracks: GeneralTrackBasic[]; + majorTracks: MajorTrackDetails[]; + addtionalTracks: AdditionalTrackDetails[]; + }> { + const generalTracks = await this.prisma.graduation_generaltrack.findMany({ + orderBy: [ + { is_foreign: 'asc' }, + { start_year: 'asc' }, + { end_year: 'asc' }, + ], + }); + const majorTracks = await this.prisma.graduation_majortrack.findMany({ + include: { + subject_department: true, + }, + orderBy: [ + { + subject_department: { + code: 'asc', + }, + }, + { start_year: 'asc' }, + { end_year: 'asc' }, + ], + }); + const addtionalTracks = + await this.prisma.graduation_additionaltrack.findMany({ + include: { + subject_department: true, + }, + orderBy: [ + { + subject_department: { + code: 'asc', + }, + }, + { start_year: 'asc' }, + { end_year: 'asc' }, + ], + }); + const sortedAddtionalTracks = addtionalTracks.sort((a, b) => { + return a.type.length - b.type.length; + }); + + return { + generalTracks, + majorTracks, + addtionalTracks: sortedAddtionalTracks, + }; + } +} From dae130cf4aaf2653afdc9495f076ad307f6e232f Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 6 Mar 2024 22:47:43 +0900 Subject: [PATCH 178/250] refactor: repository dependency injection (#81) * refactor: get FamousHumanityReview * refactor: get rankedReview * refactor: get majorBestReviews * refactor: get reviewWrite * refactor: get reviewWritableTakenLectures * refactor: get related course * refactor: remove userRepository injection in feedRepository --- src/modules/feeds/feeds.service.ts | 130 +++++++++-- src/prisma/repositories/feeds.repository.ts | 221 ++++++++----------- src/prisma/repositories/review.repository.ts | 31 ++- src/prisma/repositories/user.repository.ts | 21 +- 4 files changed, 233 insertions(+), 170 deletions(-) diff --git a/src/modules/feeds/feeds.service.ts b/src/modules/feeds/feeds.service.ts index d7c009a3..d6a5d866 100644 --- a/src/modules/feeds/feeds.service.ts +++ b/src/modules/feeds/feeds.service.ts @@ -1,10 +1,13 @@ import { Injectable } from '@nestjs/common'; -import { session_userprofile } from '@prisma/client'; +import { session_userprofile, subject_department } from '@prisma/client'; import { EFeed } from 'src/common/entities/EFeed'; import { IFeed } from 'src/common/interfaces/IFeed'; +import { getRandomChoice } from 'src/common/utils/method.utils'; import { DepartmentRepository } from 'src/prisma/repositories/department.repository'; import { FeedsRepository } from 'src/prisma/repositories/feeds.repository'; import { ReviewsRepository } from 'src/prisma/repositories/review.repository'; +import { SemesterRepository } from 'src/prisma/repositories/semester.repository'; +import { UserRepository } from 'src/prisma/repositories/user.repository'; @Injectable() export class FeedsService { @@ -12,6 +15,8 @@ export class FeedsService { private readonly departmentRepository: DepartmentRepository, private readonly feedsRepository: FeedsRepository, private readonly reviewsRepository: ReviewsRepository, + private readonly userRepository: UserRepository, + private readonly semesterRepository: SemesterRepository, ) {} private filterFeeds(feeds: EFeed.Details[], feed: EFeed.Details | null) { @@ -20,6 +25,102 @@ export class FeedsService { } } + private async getFamousHumanityReview(date: Date) { + let feed = await this.feedsRepository.getFamousHumanityReview(date); + if (!feed) { + const humanityBestReviews = + await this.reviewsRepository.getRandomNHumanityBestReviews(3); + + feed = await this.feedsRepository.createFamousHumanityReview( + date, + humanityBestReviews, + ); + } + + return feed; + } + + private async getRankedReview(date: Date) { + let feed = await this.feedsRepository.getRankedReview(date); + + if (!feed) { + feed = await this.feedsRepository.createRankedReview(date); + } + return feed; + } + + private async getFamousMajorReviews( + date: Date, + departments: subject_department[], + ) { + return await Promise.all( + departments.map(async (department) => { + let feed = await this.feedsRepository.getFamousMajorReview( + date, + department, + ); + + if (!feed) { + const majorBestReviews = + await this.reviewsRepository.getRandomNMajorBestReviews( + 3, + department, + ); + + feed = await this.feedsRepository.createFamousMajorReview( + date, + department, + majorBestReviews, + ); + } + + return feed; + }), + ); + } + + private async getReviewWrite(date: Date, userId: number) { + let feed = await this.feedsRepository.getReviewWrite(date, userId); + + if (!feed) { + const notWritableSemester = + await this.semesterRepository.getNotWritableSemester(); + const takenLecture = getRandomChoice( + await this.userRepository.getTakenLectures(userId, notWritableSemester), + ); + + feed = await this.feedsRepository.createReviewWrite( + date, + userId, + takenLecture.lecture_id, + ); + } + + return feed; + } + + private async getRelatedCourses(date: Date, userId: number) { + let feed = await this.feedsRepository.getRelatedCourse(date, userId); + + if (!feed) { + const takenLecture = getRandomChoice( + await this.userRepository.getTakenLectures(userId), + ); + + if (!takenLecture) { + return null; + } + + feed = await this.feedsRepository.createRelatedCourse( + date, + userId, + takenLecture.lecture.course_id, + ); + } + + return feed; + } + public async getFeeds(query: IFeed.QueryDto, user: session_userprofile) { const { date: dateString } = query; const date = new Date(dateString); @@ -28,17 +129,14 @@ export class FeedsService { ); const feeds: EFeed.Details[] = []; - const famousHumanityReview = - await this.feedsRepository.getOrCreateFamousHumanityReview(date); + const famousHumanityReview = await this.getFamousHumanityReview(date); this.filterFeeds(feeds, famousHumanityReview); /** * "RANKED_REVIEW" does not require RankedReview * Always shows TOP 3 liked reviews. */ - const rankedReview = await this.feedsRepository.getOrCreateRankedReview( - date, - ); + const rankedReview = await this.getRankedReview(date); const top3LikedReviews = await this.reviewsRepository.getTopLikedReviews(3); /** @@ -51,22 +149,15 @@ export class FeedsService { }; this.filterFeeds(feeds, rankedReviewWithReviews); - const famousMajorReviews = await Promise.all( - departments.map(async (department) => { - return this.feedsRepository.getOrCreateFamousMajorReview( - date, - department, - ); - }), + const famousMajorReviews = await this.getFamousMajorReviews( + date, + departments, ); famousMajorReviews.forEach((feed) => { this.filterFeeds(feeds, feed); }); - const reviewWrite = await this.feedsRepository.getOrCreateReviewWrite( - date, - user.id, - ); + const reviewWrite = await this.getReviewWrite(date, user.id); this.filterFeeds(feeds, reviewWrite); /** @@ -74,10 +165,7 @@ export class FeedsService { * RelatedCourse does not have Datas of posterior or prior courses. * Comment out below until having enough Datas. */ - // const relatedCourse = await this.feedsRepository.getOrCreateRelatedCourse( - // date, - // user.id, - // ); + // const relatedCourse = await this.getRelatedCourses(date, user.id); // this.filterFeeds(feeds, relatedCourse); const rateDaily = await this.feedsRepository.getOrCreateRate(date, user.id); diff --git a/src/prisma/repositories/feeds.repository.ts b/src/prisma/repositories/feeds.repository.ts index e4df63c8..74cd6306 100644 --- a/src/prisma/repositories/feeds.repository.ts +++ b/src/prisma/repositories/feeds.repository.ts @@ -1,8 +1,6 @@ import { Injectable } from '@nestjs/common'; import { main_ratedailyuserfeed, - main_relatedcoursedailyuserfeed, - main_reviewwritedailyuserfeed, review_humanitybestreview, review_majorbestreview, subject_department, @@ -12,188 +10,145 @@ import { FeedRateMinDays, FeedVisibleRate, } from 'src/common/interfaces/constants/feed'; -import { getRandomChoice } from 'src/common/utils/method.utils'; import { PrismaService } from '../prisma.service'; -import { UserRepository } from './user.repository'; @Injectable() export class FeedsRepository { - constructor( - private readonly prisma: PrismaService, - private readonly userRepository: UserRepository, - ) {} + constructor(private readonly prisma: PrismaService) {} - public async getOrCreateFamousHumanityReview(date: Date) { - let feed = await this.prisma.main_famoushumanityreviewdailyfeed.findFirst({ + public async getFamousHumanityReview(date: Date) { + return await this.prisma.main_famoushumanityreviewdailyfeed.findFirst({ where: { date, }, include: EFeed.FamousHumanityReviewDetails.include, }); + } - if (!feed) { - // Prisma does not support RAND() in ORDER BY. - const humanityBestReviews = (await this.prisma.$queryRaw` - SELECT * FROM review_humanitybestreview - ORDER BY RAND() - LIMIT 3`) satisfies review_humanitybestreview; - - feed = await this.prisma.main_famoushumanityreviewdailyfeed.create({ - include: EFeed.FamousHumanityReviewDetails.include, - data: { - date, - priority: Math.random(), - main_famoushumanityreviewdailyfeed_reviews: { - createMany: { - data: humanityBestReviews, - }, + public async createFamousHumanityReview( + date: Date, + humanityBestReviews: review_humanitybestreview, + ) { + return await this.prisma.main_famoushumanityreviewdailyfeed.create({ + include: EFeed.FamousHumanityReviewDetails.include, + data: { + date, + priority: Math.random(), + main_famoushumanityreviewdailyfeed_reviews: { + createMany: { + data: humanityBestReviews, }, - visible: Math.random() < FeedVisibleRate.FamousHumanityReview, }, - }); - } - - return feed; + visible: Math.random() < FeedVisibleRate.FamousHumanityReview, + }, + }); } - public async getOrCreateRankedReview(date: Date) { - let feed = await this.prisma.main_rankedreviewdailyfeed.findFirst({ + public async getRankedReview(date: Date) { + return await this.prisma.main_rankedreviewdailyfeed.findFirst({ where: { date, }, }); + } - if (!feed) { - feed = await this.prisma.main_rankedreviewdailyfeed.create({ - data: { - date, - priority: Math.random(), - visible: Math.random() < FeedVisibleRate.RankedReview, - }, - }); - } - - return feed; + public async createRankedReview(date: Date) { + return await this.prisma.main_rankedreviewdailyfeed.create({ + data: { + date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.RankedReview, + }, + }); } - public async getOrCreateFamousMajorReview( + public async getFamousMajorReview( date: Date, - subject_department: subject_department, - departmentNum: number = 1, + department: subject_department, ) { - let feed = await this.prisma.main_famousmajorreviewdailyfeed.findFirst({ + return await this.prisma.main_famousmajorreviewdailyfeed.findFirst({ include: EFeed.FamousMajorReviewDetails.include, where: { date, - subject_department, + subject_department: department, }, }); + } - if (!feed) { - // Prisma does not support RAND() in ORDER BY. - const majorBestReviews = (await this.prisma.$queryRaw` - SELECT mbr.* FROM review_majorbestreview mbr - INNER JOIN review_review r ON r.id = mbr.review_id - INNER JOIN subject_lecture l ON l.id = r.lecture_id - WHERE l.department_id = ${subject_department.id} - ORDER BY RAND() - LIMIT 3`) satisfies review_majorbestreview; - - feed = await this.prisma.main_famousmajorreviewdailyfeed.create({ - include: EFeed.FamousMajorReviewDetails.include, - data: { - date, - priority: Math.random(), - visible: - Math.random() < - FeedVisibleRate.FamousMajorReview / departmentNum ** 0.7, - department_id: subject_department.id, - main_famousmajorreviewdailyfeed_reviews: { - createMany: { data: majorBestReviews }, - }, + public async createFamousMajorReview( + date: Date, + department: subject_department, + majorBestReviews: review_majorbestreview[], + departmentNum: number = 1, + ) { + return await this.prisma.main_famousmajorreviewdailyfeed.create({ + include: EFeed.FamousMajorReviewDetails.include, + data: { + date, + priority: Math.random(), + visible: + Math.random() < + FeedVisibleRate.FamousMajorReview / departmentNum ** 0.7, + department_id: department.id, + main_famousmajorreviewdailyfeed_reviews: { + createMany: { data: majorBestReviews }, }, - }); - } + }, + }); + } - return feed; + public async getReviewWrite(date: Date, userId: number) { + return await this.prisma.main_reviewwritedailyuserfeed.findFirst({ + include: EFeed.ReviewWriteDetails.include, + where: { + date, + user_id: userId, + }, + }); } - public async getOrCreateReviewWrite( + public async createReviewWrite( date: Date, userId: number, - ): Promise { - let feed = await this.prisma.main_reviewwritedailyuserfeed.findFirst({ + takenLectureId: number, + ) { + return await this.prisma.main_reviewwritedailyuserfeed.create({ include: EFeed.ReviewWriteDetails.include, - where: { + data: { date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.ReviewWrite, user_id: userId, + lecture_id: takenLectureId, }, }); + } - if (!feed) { - const takenLecture = getRandomChoice( - await this.userRepository.getReviewWritableTakenLectures(userId), - ); - if (!takenLecture) { - return null; - } - - feed = await this.prisma.main_reviewwritedailyuserfeed.create({ - include: EFeed.ReviewWriteDetails.include, - data: { - date, - priority: Math.random(), - visible: Math.random() < FeedVisibleRate.ReviewWrite, - user_id: userId, - lecture_id: takenLecture.lecture_id, - }, - }); - } - - return feed; + public async getRelatedCourse(date: Date, userId: number) { + return await this.prisma.main_relatedcoursedailyuserfeed.findFirst({ + include: EFeed.RelatedCourseDetails.include, + where: { + date, + user_id: userId, + }, + }); } - public async getOrCreateRelatedCourse( + public async createRelatedCourse( date: Date, userId: number, - ): Promise { - let feed = await this.prisma.main_relatedcoursedailyuserfeed.findFirst({ + takenLectureCourseId: number, + ) { + return await this.prisma.main_relatedcoursedailyuserfeed.create({ include: EFeed.RelatedCourseDetails.include, - where: { + data: { date, + priority: Math.random(), + visible: Math.random() < FeedVisibleRate.RelatedCourse, + course_id: takenLectureCourseId, user_id: userId, }, }); - - if (!feed) { - const takenLecture = getRandomChoice( - await this.prisma.session_userprofile_taken_lectures.findMany({ - include: { - lecture: true, - }, - where: { - userprofile_id: userId, - }, - }), - ); - - if (!takenLecture) { - return null; - } - - feed = await this.prisma.main_relatedcoursedailyuserfeed.create({ - include: EFeed.RelatedCourseDetails.include, - data: { - date, - priority: Math.random(), - visible: Math.random() < FeedVisibleRate.RelatedCourse, - course_id: takenLecture.lecture.course_id, - user_id: userId, - }, - }); - } - - return feed; } public async getOrCreateRate( diff --git a/src/prisma/repositories/review.repository.ts b/src/prisma/repositories/review.repository.ts index 806c544b..67c489ac 100644 --- a/src/prisma/repositories/review.repository.ts +++ b/src/prisma/repositories/review.repository.ts @@ -1,5 +1,10 @@ import { Injectable } from '@nestjs/common'; -import { session_userprofile } from '@prisma/client'; +import { + review_humanitybestreview, + review_majorbestreview, + session_userprofile, + subject_department, +} from '@prisma/client'; import { ReviewDetails, reviewDetails } from '../../common/schemaTypes/types'; import { PrismaService } from '../prisma.service'; @@ -268,4 +273,28 @@ export class ReviewsRepository { take: n, }); } + + public async getRandomNHumanityBestReviews( + n: number, + ): Promise { + // Prisma does not support RAND() in ORDER BY. + return await this.prisma.$queryRaw` + SELECT * FROM review_humanitybestreview + ORDER BY RAND() + LIMIT ${n}`; + } + + public async getRandomNMajorBestReviews( + n: number, + department: subject_department, + ): Promise { + // Prisma does not support RAND() in ORDER BY. + return await this.prisma.$queryRaw` + SELECT mbr.* FROM review_majorbestreview mbr + INNER JOIN review_review r ON r.id = mbr.review_id + INNER JOIN subject_lecture l ON l.id = r.lecture_id + WHERE l.department_id = ${department.id} + ORDER BY RAND() + LIMIT ${n}`; + } } diff --git a/src/prisma/repositories/user.repository.ts b/src/prisma/repositories/user.repository.ts index b88d8483..c0588783 100644 --- a/src/prisma/repositories/user.repository.ts +++ b/src/prisma/repositories/user.repository.ts @@ -1,18 +1,10 @@ import { Injectable } from '@nestjs/common'; -import { - Prisma, - session_userprofile, - session_userprofile_taken_lectures, -} from '@prisma/client'; +import { Prisma, session_userprofile, subject_semester } from '@prisma/client'; import { PrismaService } from '../prisma.service'; -import { SemesterRepository } from './semester.repository'; @Injectable() export class UserRepository { - constructor( - private readonly prisma: PrismaService, - private readonly semesterRepository: SemesterRepository, - ) {} + constructor(private readonly prisma: PrismaService) {} async findBySid(sid: string) { return await this.prisma.session_userprofile.findFirst({ @@ -52,13 +44,12 @@ export class UserRepository { }); } - async getReviewWritableTakenLectures( + async getTakenLectures( userId: number, - ): Promise { - const notWritableSemester = - await this.semesterRepository.getNotWritableSemester(); - + notWritableSemester?: subject_semester | null, + ) { return await this.prisma.session_userprofile_taken_lectures.findMany({ + include: { lecture: true }, where: { userprofile_id: userId, lecture: { From 1c61d3b18248c78c235a232e67b65249863b2fc1 Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 6 Mar 2024 22:54:01 +0900 Subject: [PATCH 179/250] feat: add rates API (#51) * feat: init rate module * chore: lock new package version * fix: add endpoint prefix * fix: rate module * fix: add created_datetime * refactor: ICommon -> IBasic * refactor: remove prefix I in Basic * fix: package verion supporting sementic versioning * feat: add default date for rate --- package-lock.json | 4 +-- package.json | 2 +- src/app.module.ts | 2 ++ src/common/interfaces/IRate.ts | 20 +++++++++++ .../interfaces/serializer/rate.serializer.ts | 12 +++++++ src/modules/rates/rates.controller.ts | 21 ++++++++++-- src/modules/rates/rates.module.ts | 5 ++- src/modules/rates/rates.service.ts | 31 +++++++++++++++-- .../migration.sql | 7 ++++ src/prisma/repositories/rates.repository.ts | 33 +++++++++++++++++++ src/prisma/schema.prisma | 2 +- src/settings.ts | 5 +++ 12 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 src/common/interfaces/IRate.ts create mode 100644 src/common/interfaces/serializer/rate.serializer.ts create mode 100644 src/prisma/migrations/20240306130709_add_default_date_for_rate/migration.sql create mode 100644 src/prisma/repositories/rates.repository.ts diff --git a/package-lock.json b/package-lock.json index 777576f2..54763d68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "otl-nest", - "version": "0.0.1", + "version": "3.3.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "otl-nest", - "version": "0.0.1", + "version": "3.3.1", "license": "UNLICENSED", "dependencies": { "@nestjs/common": "^9.0.0", diff --git a/package.json b/package.json index e91da451..8443a4a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "otl-nest", - "version": "0.0.1", + "version": "3.3.1", "description": "", "author": "", "private": true, diff --git a/src/app.module.ts b/src/app.module.ts index 3cdfa4f1..68b6a9c0 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -12,6 +12,7 @@ import { FeedsModule } from './modules/feeds/feeds.module'; import { LecturesModule } from './modules/lectures/lectures.module'; import { NoticesModule } from './modules/notices/notices.module'; import { PlannersModule } from './modules/planners/planners.module'; +import { RatesModule } from './modules/rates/rates.module'; import { ReviewsModule } from './modules/reviews/reviews.module'; import { SemestersModule } from './modules/semesters/semesters.module'; import { SessionModule } from './modules/session/session.module'; @@ -32,6 +33,7 @@ import { PrismaModule } from './prisma/prisma.module'; UserModule, SemestersModule, TimetablesModule, + RatesModule, StatusModule, FeedsModule, WishlistModule, diff --git a/src/common/interfaces/IRate.ts b/src/common/interfaces/IRate.ts new file mode 100644 index 00000000..0994e93e --- /dev/null +++ b/src/common/interfaces/IRate.ts @@ -0,0 +1,20 @@ +import { Type } from 'class-transformer'; +import { IsNumber, Max, Min } from 'class-validator'; + +export namespace IRate { + export interface Basic { + id: number; + user_id: number; + score: number; + version: string; + created_datetime: Date | null; + } + + export class CreateDto { + @IsNumber() + @Max(5) + @Min(1) + @Type(() => Number) + score!: number; + } +} diff --git a/src/common/interfaces/serializer/rate.serializer.ts b/src/common/interfaces/serializer/rate.serializer.ts new file mode 100644 index 00000000..9c0abef8 --- /dev/null +++ b/src/common/interfaces/serializer/rate.serializer.ts @@ -0,0 +1,12 @@ +import { support_rate } from '@prisma/client'; +import { IRate } from '../IRate'; + +export function toJsonRate(rate: support_rate): IRate.Basic { + return { + id: rate.id, + score: rate.score, + user_id: rate.user_id, + version: rate.version, + created_datetime: rate.created_datetime, + }; +} diff --git a/src/modules/rates/rates.controller.ts b/src/modules/rates/rates.controller.ts index 01d34b0c..addaa2bb 100644 --- a/src/modules/rates/rates.controller.ts +++ b/src/modules/rates/rates.controller.ts @@ -1,4 +1,19 @@ -import { Controller } from '@nestjs/common'; +import { Body, Controller, Post } from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from 'src/common/decorators/get-user.decorator'; +import { IRate } from 'src/common/interfaces/IRate'; +import { toJsonRate } from 'src/common/interfaces/serializer/rate.serializer'; +import { RatesService } from './rates.service'; -@Controller('rates') -export class RatesController {} +@Controller('api/rates') +export class RatesController { + constructor(private readonly ratesService: RatesService) {} + @Post() + async createRates( + @Body() body: IRate.CreateDto, + @GetUser() user: session_userprofile, + ): Promise { + const rate = await this.ratesService.createRate(body, user); + return toJsonRate(rate); + } +} diff --git a/src/modules/rates/rates.module.ts b/src/modules/rates/rates.module.ts index 3d266852..3cbe1d92 100644 --- a/src/modules/rates/rates.module.ts +++ b/src/modules/rates/rates.module.ts @@ -1,9 +1,12 @@ import { Module } from '@nestjs/common'; +import { PrismaModule } from 'src/prisma/prisma.module'; +import { RateRepository } from 'src/prisma/repositories/rates.repository'; import { RatesController } from './rates.controller'; import { RatesService } from './rates.service'; @Module({ + imports: [PrismaModule], controllers: [RatesController], - providers: [RatesService], + providers: [RatesService, RateRepository], }) export class RatesModule {} diff --git a/src/modules/rates/rates.service.ts b/src/modules/rates/rates.service.ts index c908c19d..5b56ad86 100644 --- a/src/modules/rates/rates.service.ts +++ b/src/modules/rates/rates.service.ts @@ -1,4 +1,31 @@ -import { Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { session_userprofile, support_rate } from '@prisma/client'; +import { IRate } from 'src/common/interfaces/IRate'; +import { RateRepository } from 'src/prisma/repositories/rates.repository'; +import settings from 'src/settings'; @Injectable() -export class RatesService {} +export class RatesService { + constructor(private readonly rateRepository: RateRepository) {} + async createRate( + body: IRate.CreateDto, + user: session_userprofile, + ): Promise { + const { score } = body; + const year = new Date().getFullYear(); + const version = settings().getVersion(); + + const rate = await this.rateRepository.getRate(user.id, year, version); + if (rate) { + throw new BadRequestException('You already rated for current year'); + } + + const newRate = await this.rateRepository.createRate( + user.id, + score, + year, + version, + ); + return newRate; + } +} diff --git a/src/prisma/migrations/20240306130709_add_default_date_for_rate/migration.sql b/src/prisma/migrations/20240306130709_add_default_date_for_rate/migration.sql new file mode 100644 index 00000000..9394eac8 --- /dev/null +++ b/src/prisma/migrations/20240306130709_add_default_date_for_rate/migration.sql @@ -0,0 +1,7 @@ +/* +Warnings: +- Made the column `created_datetime` on table `support_rate` required. This step will fail if there are existing NULL values in that column. +*/ +-- AlterTable +ALTER TABLE `support_rate` +MODIFY `created_datetime` DATETIME(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0); \ No newline at end of file diff --git a/src/prisma/repositories/rates.repository.ts b/src/prisma/repositories/rates.repository.ts new file mode 100644 index 00000000..b03a3221 --- /dev/null +++ b/src/prisma/repositories/rates.repository.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma.service'; + +@Injectable() +export class RateRepository { + constructor(private readonly prisma: PrismaService) {} + + async getRate(userId: number, year: number, version: string) { + return this.prisma.support_rate.findFirst({ + where: { + user_id: userId, + year, + version, + }, + }); + } + + async createRate( + userId: number, + score: number, + year: number, + version: string, + ) { + return this.prisma.support_rate.create({ + data: { + user_id: userId, + year, + score, + version, + }, + }); + } +} diff --git a/src/prisma/schema.prisma b/src/prisma/schema.prisma index 3b5a261e..7783e81a 100644 --- a/src/prisma/schema.prisma +++ b/src/prisma/schema.prisma @@ -581,7 +581,7 @@ model support_rate { id Int @id @default(autoincrement()) score Int @db.SmallInt year Int @db.SmallInt - created_datetime DateTime? @db.DateTime(0) + created_datetime DateTime @default(now()) @db.DateTime(0) user_id Int version String @db.VarChar(20) session_userprofile session_userprofile @relation(fields: [user_id], references: [id], onUpdate: Restrict, map: "support_rate_user_id_6d69ec9d_fk_session_userprofile_id") diff --git a/src/settings.ts b/src/settings.ts index d04f46c4..0b77ef65 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -14,6 +14,7 @@ export default () => { getJwtConfig: () => getJwtConfig(), getSsoConfig: () => getSsoConfig(), getCorsConfig: () => getCorsConfig(), + getVersion: () => getVersion(), }; }; @@ -72,3 +73,7 @@ const getSsoConfig = (): any => { ssoSecretKey: process.env.SSO_SECRET_KEY, }; }; + +const getVersion = () => { + return String(process.env.npm_package_version); +}; From 1be7a331d08c3f6c51d07f3f6fbf41ed9c599303 Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Wed, 6 Mar 2024 23:01:27 +0900 Subject: [PATCH 180/250] refactor: get courseuser (#78) * feat: add read course * fix: add course filtering * fix: use Public decorator * refactor: get courseUser for a user * refactor: remove redundant include * refactor: rename function --- src/common/schemaTypes/types.ts | 1 - src/modules/courses/courses.controller.ts | 16 ++-- src/modules/courses/courses.service.ts | 84 ++++++++------------ src/modules/user/user.service.ts | 45 +++++------ src/prisma/repositories/course.repository.ts | 47 ++++++----- 5 files changed, 87 insertions(+), 106 deletions(-) diff --git a/src/common/schemaTypes/types.ts b/src/common/schemaTypes/types.ts index 78140211..7f68df1d 100644 --- a/src/common/schemaTypes/types.ts +++ b/src/common/schemaTypes/types.ts @@ -15,7 +15,6 @@ export const courseDetails = Prisma.validator()({ subject_department: true, subject_course_professors: { include: { professor: true } }, lecture: true, - subject_courseuser: true, }, }); diff --git a/src/modules/courses/courses.controller.ts b/src/modules/courses/courses.controller.ts index ed99cfb2..8109f3d3 100644 --- a/src/modules/courses/courses.controller.ts +++ b/src/modules/courses/courses.controller.ts @@ -9,28 +9,30 @@ import { CoursesService } from './courses.service'; @Controller('api/courses') export class CourseController { - constructor(private readonly CoursesService: CoursesService) {} + constructor(private readonly coursesService: CoursesService) {} + @Public() @Get() async getCourses( @Query() query: CourseQueryDto, @GetUser() user: session_userprofile, ) { - const courses = await this.CoursesService.getCourseByFilter(query, user); + const courses = await this.coursesService.getCourses(query, user); return courses; } @Get('autocomplete') async getCourseAutocomplete(@Query() query: ICourse.AutocompleteDto) { - return await this.CoursesService.getCourseAutocomplete(query); + return await this.coursesService.getCourseAutocomplete(query); } + @Public() @Get(':id') async getCourseById( @Param('id') id: number, @GetUser() user: session_userprofile, ) { - return await this.CoursesService.getCourseById(id, user); + return await this.coursesService.getCourseById(id, user); } @Get(':id/lectures') @@ -38,7 +40,7 @@ export class CourseController { @Query() query: { order: string[] }, @Param('id') id: number, ) { - return await this.CoursesService.getLecturesByCourseId(query, id); + return await this.coursesService.getLecturesByCourseId(query, id); } @Get(':id/reviews') @@ -48,7 +50,7 @@ export class CourseController { @Param('id') id: number, @GetUser() user: session_userprofile, ) { - return await this.CoursesService.getReviewsByCourseId(query, id, user); + return await this.coursesService.getReviewsByCourseId(query, id, user); } @Post(':id/read') @@ -56,6 +58,6 @@ export class CourseController { @Param('id') id: number, @GetUser() user: session_userprofile, ) { - await this.CoursesService.readCourse(user.id, id); + await this.coursesService.readCourse(user.id, id); } } diff --git a/src/modules/courses/courses.service.ts b/src/modules/courses/courses.service.ts index 9d206f74..46241858 100644 --- a/src/modules/courses/courses.service.ts +++ b/src/modules/courses/courses.service.ts @@ -13,46 +13,39 @@ import { CourseRepository } from './../../prisma/repositories/course.repository' @Injectable() export class CoursesService { - constructor(private readonly CourseRepository: CourseRepository) {} + constructor(private readonly courseRepository: CourseRepository) {} - public async getCourseByFilter( + public async getCourses( query: CourseQueryDto, user: session_userprofile, ): Promise<(CourseResponseDtoNested & { userspecific_is_read: boolean })[]> { - const queryResult = await this.CourseRepository.filterByRequest(query); - return queryResult.map((course) => { - const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map( - (x) => x.professor, - ); - const result = toJsonCourse( - course, - representativeLecture, - professorRaw, - false, - ); + const queryResult = await this.courseRepository.getCourses(query); + return Promise.all( + queryResult.map(async (course) => { + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map( + (x) => x.professor, + ); + const result = toJsonCourse( + course, + representativeLecture, + professorRaw, + false, + ); + + const userspecific_is_read = user + ? await this.courseRepository.isUserSpecificRead(course.id, user.id) + : false; - if (user) { - const latestReadDatetime = course.subject_courseuser.find((x) => { - return x.user_profile_id === user.id && x.course_id === course.id; - })?.latest_read_datetime; - const latestWrittenDatetime = course.latest_written_datetime; - return Object.assign(result, { - userspecific_is_read: - latestWrittenDatetime && latestReadDatetime - ? latestWrittenDatetime < latestReadDatetime - : false, - }); - } else { return Object.assign(result, { - userspecific_is_read: false, + userspecific_is_read, }); - } - }); + }), + ); } public async getCourseById(id: number, user: session_userprofile) { - const course = await this.CourseRepository.getCourseById(id); + const course = await this.courseRepository.getCourseById(id); if (!course) { throw new NotFoundException(); } @@ -67,26 +60,17 @@ export class CoursesService { false, ); - if (user) { - const latestReadDatetime = course.subject_courseuser.find( - (x) => (x.user_profile_id = user.id), - )?.latest_read_datetime; - const latestWrittenDatetime = course.latest_written_datetime; - return Object.assign(result, { - userspecific_is_read: - latestReadDatetime && latestWrittenDatetime - ? latestWrittenDatetime < latestReadDatetime - : false, - }); - } else { - return Object.assign(result, { - userspecific_is_read: false, - }); - } + const userspecific_is_read = user + ? await this.courseRepository.isUserSpecificRead(course.id, user.id) + : false; + + return Object.assign(result, { + userspecific_is_read, + }); } public async getLecturesByCourseId(query: { order: string[] }, id: number) { - const lectures = await this.CourseRepository.getLecturesByCourseId( + const lectures = await this.courseRepository.getLecturesByCourseId( query, id, ); @@ -110,7 +94,7 @@ export class CoursesService { '-written_datetime', '-id', ]; - const reviews = await this.CourseRepository.getReviewsByCourseId(query, id); + const reviews = await this.courseRepository.getReviewsByCourseId(query, id); if (!reviews) { throw new NotFoundException(); } @@ -119,7 +103,7 @@ export class CoursesService { } async getCourseAutocomplete(dto: ICourse.AutocompleteDto) { - const candidate = await this.CourseRepository.getCourseAutocomplete(dto); + const candidate = await this.courseRepository.getCourseAutocomplete(dto); if (!candidate) return dto.keyword; return this.findAutocompleteFromCandidate(candidate, dto.keyword); } @@ -153,6 +137,6 @@ export class CoursesService { } async readCourse(userId: number, courseId: number) { - await this.CourseRepository.readCourse(userId, courseId); + await this.courseRepository.readCourse(userId, courseId); } } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index 5f883855..ed6f1bb4 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -98,35 +98,26 @@ export class UserService { takenLecturesId, query.order ?? DEFAULT_ORDER, ); - return courses.map((course) => { - const representativeLecture = getRepresentativeLecture(course.lecture); - const professorRaw = course.subject_course_professors.map( - (x) => x.professor, - ); - const result = toJsonCourse( - course, - representativeLecture, - professorRaw, - false, - ); + return Promise.all( + courses.map(async (course) => { + const representativeLecture = getRepresentativeLecture(course.lecture); + const professorRaw = course.subject_course_professors.map( + (x) => x.professor, + ); + const result = toJsonCourse( + course, + representativeLecture, + professorRaw, + false, + ); - if (user) { - const latestReadDatetime = course.subject_courseuser.find( - (x) => (x.user_profile_id = user.id), - )?.latest_read_datetime; - const latestWrittenDatetime = course.latest_written_datetime; - - return Object.assign(result, { - userspecific_is_read: - latestReadDatetime && latestWrittenDatetime - ? latestWrittenDatetime < latestReadDatetime - : false, - }); - } else { return Object.assign(result, { - userspecific_is_read: false, + userspecific_is_read: await this.courseRepository.isUserSpecificRead( + course.id, + user.id, + ), }); - } - }); + }), + ); } } diff --git a/src/prisma/repositories/course.repository.ts b/src/prisma/repositories/course.repository.ts index 39929766..a61bda08 100644 --- a/src/prisma/repositories/course.repository.ts +++ b/src/prisma/repositories/course.repository.ts @@ -11,6 +11,7 @@ import { CourseDetails, LectureDetails, ReviewDetails, + courseDetails, } from '../../common/schemaTypes/types'; import { PrismaService } from '../prisma.service'; @@ -52,12 +53,7 @@ export class CourseRepository { public async getCourseById(id: number): Promise { return await this.prisma.subject_course.findUnique({ - include: { - subject_department: true, - subject_course_professors: { include: { professor: true } }, - lecture: true, - subject_courseuser: true, - }, + include: courseDetails.include, where: { id: id, }, @@ -97,17 +93,11 @@ export class CourseRepository { query: CourseReviewQueryDto, id: number, ): Promise { - console.log(orderFilter(query.order)); const review = await this.prisma.review_review.findMany({ where: { course_id: id }, include: { course: { - include: { - subject_department: true, - subject_course_professors: { include: { professor: true } }, - lecture: true, - subject_courseuser: true, - }, + include: courseDetails.include, }, lecture: { include: { @@ -126,8 +116,7 @@ export class CourseRepository { return review; } - //@todo: optimize goal: 1.5s -> 0.5s, recommended: using cache - public async filterByRequest(query: any): Promise { + public async getCourses(query: any): Promise { const DEFAULT_LIMIT = 150; const DEFAULT_ORDER = ['old_code']; @@ -155,12 +144,7 @@ export class CourseRepository { term_filter, ].filter((filter): filter is object => filter !== null); const queryResult = await this.prisma.subject_course.findMany({ - include: { - subject_department: true, - subject_course_professors: { include: { professor: true } }, - lecture: true, - subject_courseuser: true, - }, + include: courseDetails.include, where: { AND: filterList, }, @@ -476,4 +460,25 @@ export class CourseRepository { }, }); } + + public async isUserSpecificRead(courseId: number, userId: number) { + const courseUser = await this.prisma.subject_courseuser.findFirst({ + select: { + subject_course: { select: { latest_written_datetime: true } }, + latest_read_datetime: true, + }, + where: { + course_id: courseId, + user_profile_id: userId, + }, + }); + + if (!courseUser || !courseUser.subject_course.latest_written_datetime) + return false; + + return ( + courseUser.subject_course.latest_written_datetime < + courseUser.latest_read_datetime + ); + } } From 26a168d9e35efa1af141ca89a4aa512dc003703f Mon Sep 17 00:00:00 2001 From: Giyeong Kim Date: Thu, 7 Mar 2024 22:45:43 +0900 Subject: [PATCH 181/250] fix: taken lecture does not exist (#90) --- src/modules/feeds/feeds.service.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/feeds/feeds.service.ts b/src/modules/feeds/feeds.service.ts index d6a5d866..2330f117 100644 --- a/src/modules/feeds/feeds.service.ts +++ b/src/modules/feeds/feeds.service.ts @@ -88,6 +88,9 @@ export class FeedsService { const takenLecture = getRandomChoice( await this.userRepository.getTakenLectures(userId, notWritableSemester), ); + if (!takenLecture) { + return null; + } feed = await this.feedsRepository.createReviewWrite( date, From 2c1c80c95c457ad185102446a5fb36dad5f52e7e Mon Sep 17 00:00:00 2001 From: pbc1017 Date: Wed, 13 Mar 2024 12:52:31 +0900 Subject: [PATCH 182/250] add: share controller & service --- package-lock.json | 1280 +++++++++++++++-- package.json | 2 + src/app.module.ts | 2 + .../interfaces/dto/share/share.request.dto.ts | 16 + src/modules/share/share.controller.ts | 47 +- src/modules/share/share.module.ts | 3 + src/modules/share/share.service.ts | 153 +- .../repositories/timetable.repository.ts | 13 + 8 files changed, 1366 insertions(+), 150 deletions(-) create mode 100644 src/common/interfaces/dto/share/share.request.dto.ts diff --git a/package-lock.json b/package-lock.json index 54763d68..742be3bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,9 +21,11 @@ "@types/morgan": "^1.9.4", "@types/passport-jwt": "^3.0.6", "@types/passport-local": "^1.0.34", + "@types/sharp": "^0.32.0", "axios": "^1.4.0", "bcrypt": "^5.1.0", "cached-prisma": "^1.2.1", + "canvas": "^2.11.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", @@ -207,17 +209,89 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", @@ -267,12 +341,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -324,34 +398,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -410,30 +484,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" @@ -463,13 +537,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -548,9 +622,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -722,34 +796,34 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -766,13 +840,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -817,6 +891,15 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@emnapi/runtime": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", + "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -928,6 +1011,437 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz", + "integrity": "sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz", + "integrity": "sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=11", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz", + "integrity": "sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "macos": ">=10.13", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz", + "integrity": "sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz", + "integrity": "sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz", + "integrity": "sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz", + "integrity": "sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz", + "integrity": "sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz", + "integrity": "sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz", + "integrity": "sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz", + "integrity": "sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz", + "integrity": "sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.28", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.1" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz", + "integrity": "sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "glibc": ">=2.26", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz", + "integrity": "sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz", + "integrity": "sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "musl": ">=1.2.2", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.1" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz", + "integrity": "sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^0.45.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz", + "integrity": "sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz", + "integrity": "sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0", + "yarn": ">=3.2.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2296,6 +2810,15 @@ "@types/node": "*" } }, + "node_modules/@types/sharp": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.32.0.tgz", + "integrity": "sha512-OOi3kL+FZDnPhVzsfD37J88FNeZh6gQsGcLc95NbeURRGvmSjeXiDcyWzF2o3yh/gQAUn2uhh/e+CPCa5nwAxw==", + "deprecated": "This is a stub types definition. sharp provides its own type definitions, so you do not need this installed.", + "dependencies": { + "sharp": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -2952,11 +3475,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -3360,6 +3883,20 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3640,6 +4177,18 @@ "weak-map": "~1.0.x" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3656,6 +4205,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -3880,6 +4438,17 @@ } } }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -3944,9 +4513,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", "engines": { "node": ">=8" } @@ -4780,9 +5349,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -6865,6 +7434,17 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -6999,6 +7579,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8140,6 +8725,45 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/sharp": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz", + "integrity": "sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + }, + "engines": { + "libvips": ">=8.15.1", + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.2", + "@img/sharp-darwin-x64": "0.33.2", + "@img/sharp-libvips-darwin-arm64": "1.0.1", + "@img/sharp-libvips-darwin-x64": "1.0.1", + "@img/sharp-libvips-linux-arm": "1.0.1", + "@img/sharp-libvips-linux-arm64": "1.0.1", + "@img/sharp-libvips-linux-s390x": "1.0.1", + "@img/sharp-libvips-linux-x64": "1.0.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1", + "@img/sharp-libvips-linuxmusl-x64": "1.0.1", + "@img/sharp-linux-arm": "0.33.2", + "@img/sharp-linux-arm64": "0.33.2", + "@img/sharp-linux-s390x": "0.33.2", + "@img/sharp-linux-x64": "0.33.2", + "@img/sharp-linuxmusl-arm64": "0.33.2", + "@img/sharp-linuxmusl-x64": "0.33.2", + "@img/sharp-wasm32": "0.33.2", + "@img/sharp-win32-ia32": "0.33.2", + "@img/sharp-win32-x64": "0.33.2" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8194,11 +8818,53 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-lru-cache": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -9562,12 +10228,71 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "@babel/compat-data": { @@ -9608,12 +10333,12 @@ } }, "@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -9654,28 +10379,28 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true }, "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" } }, "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-module-imports": { @@ -9719,24 +10444,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true }, "@babel/helper-validator-option": { @@ -9757,13 +10482,13 @@ } }, "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -9826,9 +10551,9 @@ } }, "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -9949,31 +10674,31 @@ } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" } }, "@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { @@ -9986,13 +10711,13 @@ } }, "@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } }, @@ -10030,6 +10755,15 @@ } } }, + "@emnapi/runtime": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz", + "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==", + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -10111,6 +10845,147 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@img/sharp-darwin-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz", + "integrity": "sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==", + "optional": true, + "requires": { + "@img/sharp-libvips-darwin-arm64": "1.0.1" + } + }, + "@img/sharp-darwin-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz", + "integrity": "sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==", + "optional": true, + "requires": { + "@img/sharp-libvips-darwin-x64": "1.0.1" + } + }, + "@img/sharp-libvips-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==", + "optional": true + }, + "@img/sharp-libvips-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz", + "integrity": "sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==", + "optional": true + }, + "@img/sharp-libvips-linux-arm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz", + "integrity": "sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==", + "optional": true + }, + "@img/sharp-libvips-linux-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz", + "integrity": "sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==", + "optional": true + }, + "@img/sharp-libvips-linux-s390x": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz", + "integrity": "sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==", + "optional": true + }, + "@img/sharp-libvips-linux-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz", + "integrity": "sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==", + "optional": true + }, + "@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz", + "integrity": "sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==", + "optional": true + }, + "@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz", + "integrity": "sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==", + "optional": true + }, + "@img/sharp-linux-arm": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz", + "integrity": "sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==", + "optional": true, + "requires": { + "@img/sharp-libvips-linux-arm": "1.0.1" + } + }, + "@img/sharp-linux-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz", + "integrity": "sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==", + "optional": true, + "requires": { + "@img/sharp-libvips-linux-arm64": "1.0.1" + } + }, + "@img/sharp-linux-s390x": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz", + "integrity": "sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==", + "optional": true, + "requires": { + "@img/sharp-libvips-linux-s390x": "1.0.1" + } + }, + "@img/sharp-linux-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz", + "integrity": "sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==", + "optional": true, + "requires": { + "@img/sharp-libvips-linux-x64": "1.0.1" + } + }, + "@img/sharp-linuxmusl-arm64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz", + "integrity": "sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==", + "optional": true, + "requires": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1" + } + }, + "@img/sharp-linuxmusl-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz", + "integrity": "sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==", + "optional": true, + "requires": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.1" + } + }, + "@img/sharp-wasm32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz", + "integrity": "sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==", + "optional": true, + "requires": { + "@emnapi/runtime": "^0.45.0" + } + }, + "@img/sharp-win32-ia32": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz", + "integrity": "sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==", + "optional": true + }, + "@img/sharp-win32-x64": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz", + "integrity": "sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==", + "optional": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -11168,6 +12043,14 @@ "@types/node": "*" } }, + "@types/sharp": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.32.0.tgz", + "integrity": "sha512-OOi3kL+FZDnPhVzsfD37J88FNeZh6gQsGcLc95NbeURRGvmSjeXiDcyWzF2o3yh/gQAUn2uhh/e+CPCa5nwAxw==", + "requires": { + "sharp": "*" + } + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -11666,11 +12549,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -11963,6 +12846,16 @@ "integrity": "sha512-ewDad7+D2vlyy+E4UJuVfiBsU69IL+8oVmTuZnH5Q6CIUbxNfI50uVpRHbUPDD6SUaN2o0Lh4DhTrvLG/Tn1yg==", "dev": true }, + "canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -12156,6 +13049,15 @@ "weak-map": "~1.0.x" } }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -12169,6 +13071,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -12342,6 +13253,14 @@ "ms": "2.1.2" } }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -12390,9 +13309,9 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==" }, "detect-newline": { "version": "3.1.0", @@ -13058,9 +13977,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" }, "fork-ts-checker-webpack-plugin": { "version": "8.0.0", @@ -14586,6 +15505,11 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -14697,6 +15621,11 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -15525,6 +16454,35 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "sharp": { + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz", + "integrity": "sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==", + "requires": { + "@img/sharp-darwin-arm64": "0.33.2", + "@img/sharp-darwin-x64": "0.33.2", + "@img/sharp-libvips-darwin-arm64": "1.0.1", + "@img/sharp-libvips-darwin-x64": "1.0.1", + "@img/sharp-libvips-linux-arm": "1.0.1", + "@img/sharp-libvips-linux-arm64": "1.0.1", + "@img/sharp-libvips-linux-s390x": "1.0.1", + "@img/sharp-libvips-linux-x64": "1.0.1", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.1", + "@img/sharp-libvips-linuxmusl-x64": "1.0.1", + "@img/sharp-linux-arm": "0.33.2", + "@img/sharp-linux-arm64": "0.33.2", + "@img/sharp-linux-s390x": "0.33.2", + "@img/sharp-linux-x64": "0.33.2", + "@img/sharp-linuxmusl-arm64": "0.33.2", + "@img/sharp-linuxmusl-x64": "0.33.2", + "@img/sharp-wasm32": "0.33.2", + "@img/sharp-win32-ia32": "0.33.2", + "@img/sharp-win32-x64": "0.33.2", + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "semver": "^7.5.4" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -15564,11 +16522,41 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-lru-cache": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz", "integrity": "sha512-uEv/AFO0ADI7d99OHDmh1QfYzQk/izT1vCmu/riQfh7qjBVUUgRT87E5s5h7CxWCA/+YoZerykpEthzVrW3LIw==" }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/package.json b/package.json index 8443a4a5..3f0ee6c9 100644 --- a/package.json +++ b/package.json @@ -50,9 +50,11 @@ "@types/morgan": "^1.9.4", "@types/passport-jwt": "^3.0.6", "@types/passport-local": "^1.0.34", + "@types/sharp": "^0.32.0", "axios": "^1.4.0", "bcrypt": "^5.1.0", "cached-prisma": "^1.2.1", + "canvas": "^2.11.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "cookie-parser": "^1.4.6", diff --git a/src/app.module.ts b/src/app.module.ts index 68b6a9c0..57074bfd 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -22,6 +22,7 @@ import { TracksModule } from './modules/tracks/tracks.module'; import { UserModule } from './modules/user/user.module'; import { WishlistModule } from './modules/wishlist/wishlist.module'; import { PrismaModule } from './prisma/prisma.module'; +import { ShareModule } from './modules/share/share.module'; @Module({ imports: [ @@ -42,6 +43,7 @@ import { PrismaModule } from './prisma/prisma.module'; DepartmentsModule, PlannersModule, TracksModule, + ShareModule, ], controllers: [AppController], providers: [ diff --git a/src/common/interfaces/dto/share/share.request.dto.ts b/src/common/interfaces/dto/share/share.request.dto.ts new file mode 100644 index 00000000..584c4dcb --- /dev/null +++ b/src/common/interfaces/dto/share/share.request.dto.ts @@ -0,0 +1,16 @@ +import { IsInt, IsOptional, IsString } from 'class-validator'; + +export class TimetableImageQueryDto { + @IsInt() + timetable!: number; + + @IsInt() + year!: number; + + @IsInt() + semester!: number; + + @IsString() + @IsOptional() + language?: string; +} diff --git a/src/modules/share/share.controller.ts b/src/modules/share/share.controller.ts index b304478b..da2dbbd8 100644 --- a/src/modules/share/share.controller.ts +++ b/src/modules/share/share.controller.ts @@ -1,4 +1,47 @@ -import { Controller } from '@nestjs/common'; +import { + Controller, + Get, + HttpException, + HttpStatus, + Query, + Res, +} from '@nestjs/common'; +import { session_userprofile } from '@prisma/client'; +import { GetUser } from '../../common/decorators/get-user.decorator'; +import { ShareService } from './share.service'; +import { TimetableRepository } from 'src/prisma/repositories/timetable.repository'; +import { Response } from 'express'; @Controller('share') -export class ShareController {} +export class ShareController { + constructor( + private readonly shareService: ShareService, + private readonly timetableRepository: TimetableRepository, + ) {} + + @Get('timetable/image') + async getTimetableImage( + @Query('timetable') timetableId: number, + @Query('year') year: number, + @Query('semester') semester: number, + @Query('language') language: string, + @GetUser() user: session_userprofile, + @Res() res: Response, + ) { + try { + const imageStream = await this.shareService.createTimetableImage( + timetableId, + year, + semester, + language, + ); + res.setHeader('Content-Type', 'image/png'); + imageStream.pipe(res); + } catch (error) { + throw new HttpException( + 'An error occurred while generating the timetable image', + HttpStatus.INTERNAL_SERVER_ERROR, + ); + } + } +} diff --git a/src/modules/share/share.module.ts b/src/modules/share/share.module.ts index e175eb51..dbd8e39f 100644 --- a/src/modules/share/share.module.ts +++ b/src/modules/share/share.module.ts @@ -1,8 +1,11 @@ import { Module } from '@nestjs/common'; import { ShareController } from './share.controller'; import { ShareService } from './share.service'; +import { TimetablesModule } from '../timetables/timetables.module'; +import { PrismaModule } from 'src/prisma/prisma.module'; @Module({ + imports: [PrismaModule, TimetablesModule], controllers: [ShareController], providers: [ShareService], }) diff --git a/src/modules/share/share.service.ts b/src/modules/share/share.service.ts index e55cb2d0..e7ee9769 100644 --- a/src/modules/share/share.service.ts +++ b/src/modules/share/share.service.ts @@ -1,4 +1,153 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { timetable_timetable_lectures } from '@prisma/client'; +import { createCanvas, loadImage, registerFont } from 'canvas'; +import { join } from 'path'; +import { PrismaService } from 'src/prisma/prisma.service'; +import { TimetableRepository } from 'src/prisma/repositories/timetable.repository'; @Injectable() -export class ShareService {} +export class ShareService { + private readonly TIMETABLE_CELL_COLORS = ['#color1', '#color2']; + private readonly file_path = + process.env.NODE_ENV === 'development' + ? 'static/' + : '/var/www/otlplus/static/'; + + constructor( + private readonly prismaService: PrismaService, + private readonly timetableRepository: TimetableRepository, + ) { + registerFont(join(this.file_path, 'fonts/NotoSansKR-Regular.otf'), { + family: 'NotoSansKR', + }); + } + + private getTimetableType(lectures: any[]): 'FIVE_DAYS' | 'SEVEN_DAYS' { + return lectures.some((lecture: { classtimes: { day: number }[] }) => + lecture.classtimes.some( + (classtime: { day: number }) => classtime.day >= 5, + ), + ) + ? 'SEVEN_DAYS' + : 'FIVE_DAYS'; + } + + private drawRoundedRectangle( + ctx: { + fillStyle: string; + beginPath: () => void; + moveTo: (arg0: number, arg1: number) => void; + lineTo: (arg0: number, arg1: number) => void; + quadraticCurveTo: ( + arg0: number, + arg1: number, + arg2: number, + arg3: number, + ) => void; + closePath: () => void; + fill: () => void; + }, + x: number, + y: number, + width: number, + height: number, + radius: number, + color: string, + ) { + ctx.fillStyle = color; + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + ctx.fill(); + } + + private sliceTextToFitWidth( + text: string, + maxWidth: number, + font: string, + fontSize: number, + ): string[] { + const canvas = createCanvas(100, 100); + const ctx = canvas.getContext('2d'); + ctx.font = `${fontSize}px '${font}'`; + + const words = text.split(' '); + const lines = []; + let currentLine = words[0]; + + words.slice(1).forEach((word) => { + const width = ctx.measureText(`${currentLine} ${word}`).width; + if (width < maxWidth) { + currentLine += ` ${word}`; + } else { + lines.push(currentLine); + currentLine = word; + } + }); + + lines.push(currentLine); // Push the last line + return lines; + } + + private drawTextbox( + ctx: { + fillStyle: string; + font: string; + fillText: (arg0: string, arg1: number, arg2: number) => void; + }, + x: number, + y: number, + width: number, + height: number, + text: string, + font: string, + fontSize: number, + color: string, + ) { + const lines = this.sliceTextToFitWidth(text, width, font, fontSize); + ctx.fillStyle = color; + ctx.font = `${fontSize}px '${font}'`; + lines.forEach((line, i) => { + ctx.fillText(line, x, y + fontSize * (i + 1)); + }); + } + + async createTimetableImage( + timetableId: number, + year: number, + semester: number, + language: string, + ) { + const timetableDetails = + await this.timetableRepository.getLecturesWithClassTimes(timetableId); + if (!timetableDetails) { + throw new HttpException('No such timetable', HttpStatus.NOT_FOUND); + } + + const lectures = timetableDetails; + const timetableType = this.getTimetableType(lectures); + const imageTemplatePath = join( + this.file_path, + `img/Image_template_${timetableType}.png`, + ); + const image = await loadImage(imageTemplatePath); + const canvas = createCanvas(image.width, image.height); + const ctx = canvas.getContext('2d'); + + // Draw the base image + ctx.drawImage(image, 0, 0, image.width, image.height); + + // Continue with drawing logic, similar to the Python example provided + // ... + + return canvas.createPNGStream(); + } +} diff --git a/src/prisma/repositories/timetable.repository.ts b/src/prisma/repositories/timetable.repository.ts index 61f4814e..352b1ba2 100644 --- a/src/prisma/repositories/timetable.repository.ts +++ b/src/prisma/repositories/timetable.repository.ts @@ -156,4 +156,17 @@ export class TimetableRepository { }, }); } + + async getLecturesWithClassTimes(timetableId: number) { + return this.prisma.timetable_timetable_lectures.findMany({ + where: { timetable_id: timetableId }, + include: { + subject_lecture: { + include: { + subject_classtime: true, + }, + }, + }, + }); + } } From 956c23c96aac2fcf42c8fcc36bd91e2635391b07 Mon Sep 17 00:00:00 2001 From: pbc1017 Date: Wed, 13 Mar 2024 16:11:25 +0900 Subject: [PATCH 183/250] add: create image with title --- src/common/interfaces/ITimetable.ts | 57 ++++++ src/common/interfaces/index.ts | 1 + src/modules/share/share.controller.ts | 8 +- src/modules/share/share.module.ts | 3 +- src/modules/share/share.service.ts | 181 +++++++++++++----- .../repositories/semester.repository.ts | 14 ++ static/fonts/NanumBarunGothic.ttf | Bin 0 -> 4186060 bytes static/fonts/NotoSansKR-Regular.otf | Bin 0 -> 4744692 bytes static/img/Image_template_5days.png | Bin 0 -> 21305 bytes static/img/Image_template_7days.png | Bin 0 -> 24232 bytes 10 files changed, 211 insertions(+), 53 deletions(-) create mode 100644 src/common/interfaces/ITimetable.ts create mode 100644 static/fonts/NanumBarunGothic.ttf create mode 100644 static/fonts/NotoSansKR-Regular.otf create mode 100644 static/img/Image_template_5days.png create mode 100644 static/img/Image_template_7days.png diff --git a/src/common/interfaces/ITimetable.ts b/src/common/interfaces/ITimetable.ts new file mode 100644 index 00000000..3ebb2f38 --- /dev/null +++ b/src/common/interfaces/ITimetable.ts @@ -0,0 +1,57 @@ +export namespace ITimetable { + export interface IClasstime { + id: number; + day: number; + begin: Date; + end: Date; + type: string; + building_id: string | null; + building_full_name: string | null; + building_full_name_en: string | null; + room_name: string | null; + unit_time: number | null; + lecture_id: number | null; + // Additional properties as needed + } + + export interface ILecture { + id: number; + code: string; + old_code: string; + year: number; + semester: number; + department_id: number; + class_no: string; + title: string; + title_en: string; + type: string; + type_en: string; + audience: number; + credit: number; + title_en_no_space: string; + title_no_space: string; + num_classes: number; + num_labs: number; + credit_au: number; + limit: number; + num_people: number | null; // Allow num_people to be null + is_english: boolean; + deleted: boolean; + course_id: number; + grade_sum: number; + load_sum: number; + speech_sum: number; + grade: number; + load: number; + speech: number; + review_total_weight: number; + class_title: string | null; + class_title_en: string | null; + common_title: string | null; + common_title_en: string | null; + subject_classtime: IClasstime[]; + // Additional properties as needed + } + + // Other interfaces as needed... +} diff --git a/src/common/interfaces/index.ts b/src/common/interfaces/index.ts index ac716c50..d329afc3 100644 --- a/src/common/interfaces/index.ts +++ b/src/common/interfaces/index.ts @@ -1,3 +1,4 @@ export * from './IAuth'; export * from './ICourse'; export * from './IFeed'; +export * from './ITimetable'; diff --git a/src/modules/share/share.controller.ts b/src/modules/share/share.controller.ts index da2dbbd8..a5399c49 100644 --- a/src/modules/share/share.controller.ts +++ b/src/modules/share/share.controller.ts @@ -12,7 +12,7 @@ import { ShareService } from './share.service'; import { TimetableRepository } from 'src/prisma/repositories/timetable.repository'; import { Response } from 'express'; -@Controller('share') +@Controller('/api/share') export class ShareController { constructor( private readonly shareService: ShareService, @@ -29,14 +29,16 @@ export class ShareController { @Res() res: Response, ) { try { - const imageStream = await this.shareService.createTimetableImage( + const imageBuffer = await this.shareService.createTimetableImage( timetableId, year, semester, language, + user, ); res.setHeader('Content-Type', 'image/png'); - imageStream.pipe(res); + // imageStream.pipe(res); + res.send(imageBuffer); } catch (error) { throw new HttpException( 'An error occurred while generating the timetable image', diff --git a/src/modules/share/share.module.ts b/src/modules/share/share.module.ts index dbd8e39f..dedcd492 100644 --- a/src/modules/share/share.module.ts +++ b/src/modules/share/share.module.ts @@ -3,9 +3,10 @@ import { ShareController } from './share.controller'; import { ShareService } from './share.service'; import { TimetablesModule } from '../timetables/timetables.module'; import { PrismaModule } from 'src/prisma/prisma.module'; +import { SemestersModule } from '../semesters/semesters.module'; @Module({ - imports: [PrismaModule, TimetablesModule], + imports: [PrismaModule, TimetablesModule, SemestersModule], controllers: [ShareController], providers: [ShareService], }) diff --git a/src/modules/share/share.service.ts b/src/modules/share/share.service.ts index e7ee9769..d81fab31 100644 --- a/src/modules/share/share.service.ts +++ b/src/modules/share/share.service.ts @@ -1,52 +1,46 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; -import { timetable_timetable_lectures } from '@prisma/client'; +import { session_userprofile, subject_semester } from '@prisma/client'; +import { CanvasRenderingContext2D } from 'canvas'; import { createCanvas, loadImage, registerFont } from 'canvas'; import { join } from 'path'; import { PrismaService } from 'src/prisma/prisma.service'; +import { ITimetable } from 'src/common/interfaces'; import { TimetableRepository } from 'src/prisma/repositories/timetable.repository'; +import { SemesterRepository } from 'src/prisma/repositories/semester.repository'; +import { SemestersService } from '../semesters/semesters.service'; @Injectable() export class ShareService { - private readonly TIMETABLE_CELL_COLORS = ['#color1', '#color2']; private readonly file_path = - process.env.NODE_ENV === 'development' - ? 'static/' - : '/var/www/otlplus/static/'; + process.env.NODE_ENV === 'local' ? 'static/' : '/var/www/otlplus/static/'; constructor( private readonly prismaService: PrismaService, private readonly timetableRepository: TimetableRepository, + private readonly semesterRepository: SemesterRepository, ) { registerFont(join(this.file_path, 'fonts/NotoSansKR-Regular.otf'), { family: 'NotoSansKR', }); + registerFont(join(this.file_path, 'fonts/NotoSansKR-Regular.otf'), { + family: 'NotoSansKR', + }); } - private getTimetableType(lectures: any[]): 'FIVE_DAYS' | 'SEVEN_DAYS' { - return lectures.some((lecture: { classtimes: { day: number }[] }) => - lecture.classtimes.some( - (classtime: { day: number }) => classtime.day >= 5, - ), - ) - ? 'SEVEN_DAYS' - : 'FIVE_DAYS'; + private getSemesterName( + semester: subject_semester, + language: string = 'kr', + ): string { + const seasons = language.includes('en') + ? ['spring', 'summer', 'fall', 'winter'] + : ['봄', '여름', '가을', '겨울']; + + const seasonName = seasons[semester.semester - 1]; + return `${semester.year} ${seasonName}`; } private drawRoundedRectangle( - ctx: { - fillStyle: string; - beginPath: () => void; - moveTo: (arg0: number, arg1: number) => void; - lineTo: (arg0: number, arg1: number) => void; - quadraticCurveTo: ( - arg0: number, - arg1: number, - arg2: number, - arg3: number, - ) => void; - closePath: () => void; - fill: () => void; - }, + ctx: CanvasRenderingContext2D, x: number, y: number, width: number, @@ -98,56 +92,145 @@ export class ShareService { } private drawTextbox( - ctx: { - fillStyle: string; - font: string; - fillText: (arg0: string, arg1: number, arg2: number) => void; - }, + ctx: CanvasRenderingContext2D, x: number, y: number, width: number, - height: number, text: string, font: string, fontSize: number, color: string, + align?: 'right' | 'left', ) { const lines = this.sliceTextToFitWidth(text, width, font, fontSize); ctx.fillStyle = color; ctx.font = `${fontSize}px '${font}'`; - lines.forEach((line, i) => { - ctx.fillText(line, x, y + fontSize * (i + 1)); - }); + ctx.textAlign = align ? align : 'left'; + if (align == 'right') ctx.fillText(text, x, y); + else { + lines.forEach((line, i) => { + ctx.fillText(line, x, y + fontSize * (i + 1)); + }); + } } - async createTimetableImage( + private getTimetableType(lectures: ITimetable.ILecture[]): '5days' | '7days' { + return lectures.some((lecture) => + lecture.subject_classtime.some((classtime) => classtime.day >= 5), + ) + ? '7days' + : '5days'; + } + + // Make sure to adjust other methods that use lectures to match the type + private async getTimetableEntries( timetableId: number, - year: number, - semester: number, - language: string, - ) { + ): Promise { const timetableDetails = await this.timetableRepository.getLecturesWithClassTimes(timetableId); if (!timetableDetails) { throw new HttpException('No such timetable', HttpStatus.NOT_FOUND); } + return timetableDetails.map((detail) => detail.subject_lecture); + } + + async createTimetableImage( + timetableId: number, + year: number, + semester: number, + language: string, + user: any, + ): Promise { + const TIMETABLE_CELL_COLORS = [ + '#F2CECE', + '#F4B3AE', + '#F2BCA0', + '#F0D3AB', + '#F1E1A9', + '#f4f2b3', + '#dbf4be', + '#beedd7', + '#b7e2de', + '#c9eaf4', + '#B4D3ED', + '#B9C5ED', + '#CCC6ED', + '#D8C1F0', + '#EBCAEF', + '#f4badb', + ]; + const semesterFontSize = 30; + const tileFontSize = 24; - const lectures = timetableDetails; + const lectures = await this.getTimetableEntries(timetableId); const timetableType = this.getTimetableType(lectures); const imageTemplatePath = join( this.file_path, `img/Image_template_${timetableType}.png`, ); - const image = await loadImage(imageTemplatePath); - const canvas = createCanvas(image.width, image.height); + + const baseImage = await loadImage(imageTemplatePath); + const canvas = createCanvas(baseImage.width, baseImage.height); const ctx = canvas.getContext('2d'); + ctx.drawImage(baseImage, 0, 0); - // Draw the base image - ctx.drawImage(image, 0, 0, image.width, image.height); + const semesterObject = await this.semesterRepository.findSemester( + year, + semester, + ); + if (!semesterObject) { + throw new HttpException('Semester not found', HttpStatus.NOT_FOUND); + } + const isEnglish = language && language.includes('en'); + const semesterName = this.getSemesterName( + semesterObject, + isEnglish ? 'en' : 'kr', + ); + this.drawTextbox( + ctx, + timetableType === '5days' ? 952 : 952 + 350, + 78, + 200, + semesterName, + 'NotoSansKR', + semesterFontSize, + '#CCCCCC', + 'right', + ); - // Continue with drawing logic, similar to the Python example provided - // ... + lectures.forEach((lecture) => { + const color = TIMETABLE_CELL_COLORS[lecture.course_id % 16]; + lecture.subject_classtime.forEach((classtime) => { + const { day, begin, end } = classtime; + const beginNumber = begin.getUTCHours() * 60 + begin.getUTCMinutes(); + const endNumber = end.getUTCHours() * 60 + end.getUTCMinutes(); + console.log(day, begin, end, beginNumber, endNumber); + + const [x, y, width, height] = [ + 178 * day + 76, + (beginNumber * 4) / 3 - 486, + 178 - 7, + ((endNumber - beginNumber) * 4) / 3 - 7, + ]; + + // const [x, y, width, height] = [100, 100, 200, 60]; // Placeholder values + + this.drawRoundedRectangle(ctx, x, y, width, height, 10, color); + this.drawTextbox( + ctx, + x + 10, + y + 10, + width - 20, + lecture.title, + 'NotoSansKR', + tileFontSize, + '#000', + ); + }); + }); - return canvas.createPNGStream(); + // Return the image as a buffer + return canvas.toBuffer(); + // return canvas.createPNGStream(); } } diff --git a/src/prisma/repositories/semester.repository.ts b/src/prisma/repositories/semester.repository.ts index b1dddf57..5307c362 100644 --- a/src/prisma/repositories/semester.repository.ts +++ b/src/prisma/repositories/semester.repository.ts @@ -46,4 +46,18 @@ export class SemesterRepository { }, }); } + + async findSemester( + year: number, + semester: number, + ): Promise { + return await this.prisma.subject_semester.findUnique({ + where: { + year_semester: { + year: year, + semester: semester, + }, + }, + }); + } } diff --git a/static/fonts/NanumBarunGothic.ttf b/static/fonts/NanumBarunGothic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c31486832e412992e7d7e3c93665329e35ad7050 GIT binary patch literal 4186060 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⁣z&igL- zF8cC(mwcCfSA17}*L>G~H+(mJw|uvKcYJq!_k4f*?)x729{L{n9{Zm7p8B5op8N8B zFMKb3uY3i**S!2AbsAssh!3>Oc*kCQu8g4b%bZ0@*-4pgzz5Xb3a{8Usy$ra&{G zInV-V3A6%Q{}0~T|AnW)P@va8XSNe)1^NSHfu2AYunN!*=nU=!a)8m`5}-GD06YkE z)Xw&FP%E|qE`e)-u38uBqrf;|A}|7I3v>q;X-Bt%GmCu}7y-2T^A9Wp7X6bm1%n}A zAQ%Kp(48(h0+s_EptJaQFbo**k4Bap`JeoprX5?OeXr2^U#|iN0&BHB`j-K^vd#Y| zfAjwz`d>W*xHj?)+UO3~MsT7wO3P^@FOqcm&J^^T3fG0Fa|Jt)n$xw`f{j)7+Bdbn_Br)Ia*?b=kosk2%*LeO99U zyb=|vl&Gltqq|B}YG0!ApVya*UtfD4O7ZJ!swV%@HzlfHR-%SFC2A!9=%Etz>t3S% zVSn^?iJB&rs5$eGelF2~btM|uxI}}*Kl)dRmg--k!O?&8QHh4kDp5;?Kl-agL${S^ zSnCqC`u))hB^o}wL?hz==*tp~TvVb_HA>Wm{?UCUYVTa4(ZPT8dWpu2D^W-KAAMh< z&Q&Gqs$Zh9>>oW=qVC=$8W;IT|1Qz^X(gKA`=j4VG;vdjCN(e7Wc81pDbbX{C7SB` zqt8k-ZC;6{S1Hj9-5=dmqMr68>J9j#m;Xyt(+2bZVpJ=+9R8n(YCZpJR0GTYeQ*d)}90j#_3V9$eV~Nv+M?-7Z?TFv~D%k{)zG(bq{p+!DZk*@R=6PXMy{`T|g($rMs@X zrmbCG&{i%_X{(u=b(?hib^CNjbw|KXU!-Snx^24cx?Q@Rx*fXRx_sSD-3{Gs z-CdwR7z&1I@uWN06YK`|&=u%j=w9kx!L#8`U?un&SOtCvzXdD*zvFhx;{W&EZdvSq z=QU%n8Q2_b0k#BNfvv$dTI6pBw*QZ75v;5EfqGzlumRW*Yy>t2n}ALKAaDpcta*^5|J`2$z%k%BZ~{1~ zb#FSQIh51D8Q?5%4mb~704{2NS$E`VRdkKlax z9sE?w21aTwaEf-er)%G{G#@w`Sg7RzV}QlLe9d+BhX=p|;X&|VcnCZc9tIDGN5DDo zNO%-H8Xg0Wg~!3;;R*0WcoIAro&ryWr@_yE=)rT5D4WUL*W2gz#6lw-Fhgv`_p;l09s14K>Y6rE4IzSzvPEcp4 z3)B_r26cyeKs}*eP;aOY)EDXp^@j#P1EE3CU}y+56dDE%hekj-&`4+$G#VNMjfKWR zw_3ZG<*Ko1raQm$Yrrc4!B*6WRsshW0>vp?%PP=m2yOIs_etjzCAD zV_F}z6VOTMFX$AM3!R3}Kxd(I(0S+rbP>vfE2_bsTOI;; zfJeY%;0f?l>+$wn%VS;uFM(G;0q`1l1H9F;ns>l^-~;dx_yl|gz5qplwh<=q{lCmO z|M`g@z)#>8@LS7=K+pv0KnR3E1Vlkh%Z~_<1hqvXkO5hc)3PN26hR4;K?PJny_P!} zK|j!659mQXtjF}Yp3sweUN7iHy`-1*ieA<0^+vs)-d}IhoAp6@i{7TU>tpl|y;Gm4 zPtvFAJ^G6J%KBRRY<)w0SA92qPkkSKUwwc5Q2j9d2z`!zq<)lstbUw+yncdyihhQE zfqtQWv3`kuseX-qt$v+;gMPDqi++!OuYSM&fc~KVsQ!dLSAR}_O@BlGK>twxME_i$ zuYaj8(7)9e>fh-<=s)Q{>woBf8UO=qKn=8kF>nUKU@({rL52u}&0sgU4RMA=xrEa7-$$|7-AS^7;YG27;Bhdm||F9 zSZG*b*ljpsIBGay$Tj2{E*Y*E?iwB#o*0S@UkyJDzm0$qG~!0WNEsQUY;+i%Mz=A+ zm}pEkdW>FUX=9erXRKhXWUOqgVytGYWvpXtXl!I`Vr*(`W^83_YiwuiXzXh2YwTwn zU>s;1WXv&+G)^!cFdj4>G9EFWFrG7>H(oU687~=c8gCiz8uN{>jIWI!jYY;EewZKb z$N2GnHb1+c!_VdC_Dl6k^ULt_`epi+_ABRC-mjWpL%&9TE&W>g_46C*m*Y3aZ;Ibk zznOju{Py_m^*i8q#P5_}uHR|Dvwr9OF8E#byX%+l_rkBx@15UAzaoFYAM}U)X@A~d z_BZ*P{lops_-FZ-^RM7v$-jz!P5)Z{wf*b**Yj`WKhS@W|4{!N{|WvR{U`fR^`GNE z*MFY>0{_MSOZ=DmFY{mHzt(@f{|5h!{+s+a`)~E%?!Uu-r~e-R1O6xcPx_zo&-Fj; zpXYzc|Em8@{|Ek0O}L3LQ6}2Nn?#djGMJ1ef0M~%HieihrchJ3$!2n!;!FvqL{pN< zWAd8Hn97-|nW~#=nQEJ|O$|*=O?^%MOao0rO~XxNOk+*sO%qMiOw&y>Omj>NOlwT% zOnIiOrn{zlru(LR(+g99snGP*^xgE+44V-%Zl=t%SvD(Xz1e6EGP}*G=4^9Ab5nC$ zb31cSb1(BibB=kWd8~Pgd8&Dad5(Fmd7gQRd8v81d8K)kd7XKKd5d|6IoEvJe9oL_ zzHYv0zGc2+zGr@9eqw%VerC=$zcLq?Uz^{U-fK~x*0@?+12$x0{K8gpeZmYFg!3KFe=a;SS_%6V6DLHz@~xC0$T*O3hWp-G;mDd!oU@Q zYXUa}?hM==xHs@f;EBN8z`Vd~fp-J%1wIIT9QY*gSztln>%g~x?*fa0AzI4L+KxJ+=l;7Y-@f@=pi4Q?6SHn?kWx8NSZy@Ce@57PQr<^)d&o)|nicuMfp z;Az3Lf@cTM37#9gAb3gen&7p;>w`B0Zw%fMyfb)D@TuU_!3DvugA0Q{2LA~D8T>m0 z2mwQ|5Ilqkp+oo(Lx?fNKg1kj2?-4e53z-~L*habLJ~ugLOda5LaK+<3~3nBD5Pmf z%aD#CokF^VbPMSlGB9Lf$eNHXAv;3$gd7Pu8ge}3WXQRYypXFQ_d@Q6JPgSXc@a_& zQW#Pc@-^gp$WIGwF<62usg^X0$5O^p$x_u)-I8soXK83@YH4d}XX#++Wa(+?W$9}f zXvwjRw2ZclwT!b&v`n&Wuxzw!vFxxMupG1;wj8zOT25QeSuR*ETJkKHESD`eEw?Op zEcYybTOL{-Tb@{+TJkLgmXDTCmM@kf%U8=ct*a*(iiawpiJ?iMsiB_G%+PY7GNdF!V%dZs^U>TcJO~fG{|W3FE?qFoV_|G$<@0EGo<$78e#DmKc^2 zmKv58mL66nEGw*RSoyHZVO7Jbh1Ckn4r}&L|IjgE6T+s1tq5Bawjpds*zT|+VJE_J z!}7wegcXH-4f_%H+X`59R@_QhDJyMdtejP_%2vgyTJ=_g)!%BenymrWK&!a@D8iB^x*Yb|XpW6iRbw^p)NwpOz?vgTMvTE|$&TPIj2S!Y;hT4!75TIX4p zSeIH?SXW!uShrZWTDMzwSa(_vSPxo{SWj5bTQ6Gkte33UtT(N9tskwQte>q#)*s<; zI1-M96XATg9Bv7>g?qxwg_jSn6kaVnJG@?a%kZ}0L&JxK=Y)?A9}_+{d|ddH@TuX` z!)J!i4WAdjAbdsmmhe5{SHrJ`-weMS{vy0E{9|}g1P}p5AQ5x~6TwHw5vB-pL|{aj zh^&Zm5tSmUMAV9?9Z@%;UPS$f1`$monnkpXXdBT!qH9FAh#nC=BYH&)h!_|#C}LP#`k%mZPq<^F- z(j4iD^hTD6EEicVvU+6g$QhAaw7#t8BF{(WMP7}(8+kwSVN_~V^{DKqhEYwU+D5gD zni4fNYDUzYs3lQLqn1aljM@;jF=}(vmZZ=W~!8Y8++Z3D0X0`>`0&PLI5Szso zX0zICHoGmx=CC+3ofiyVLHnyY1!d)$G;n zwd~pUruJ6$j`mLWuJ)exf%ZZ6A@*VRG4`?cDfT(``SykO750_(HTDhmjrJY(o%Y@K zz4p8Id-ezR$Mz@oSM~z?Yx`UKJNsvQk^QUvyZuKr5RFF@(R4HuEk(=GO0*%`6m5wP zjSi2Fh|Y>`8{ICtV|3T(?$Ldt`$Z3o9u%DuJtlfW^pWVB(YK=SM&FNq5dA1RKl(-V z>*$ZspQ4Lm@EAVE5@U;T#JFQpW71;E#k7oR71K7RV@%JOUNQY*hQ`c@SrD@)=0MDg zn8KKMF&|@!V!p-v*1Gb74%)#xWUV)ExFf=0b2uD{jwDBlBh699k>x1oDDSA?sN|^Z zsN$&UsO6~bsO!jf)N?d)G|HK zO-_q5)EVxyIqlA9r^6ZRbUWjm3C<*EiqqrtI?FiAIjcFVJ8L>?Icqx`IvY8gIy*YM zIJ-IfI{P^XI)^&PILA82J1074IA=QNI2SlqI9EDXJJ&k5IJY`?IQKaBI`=t`IFCAy zJ5M^#InO)uoL8N9o%fs%oDZG(&KJ%CXQ8vm`PKQ;1-lRz?xJ0?OL6I4Mpuxll*{4@ zcR93<$FZ(BSAr|mmFDue%D5`HD!D4Vs=BJXYPf2;YPo8=>bUB%K)qpn=nY1cW|1y`Qyrt6;Ti7Ve#5DUbDv2ZLNOUClCLaY?4 z#Hz8TSaWPptR>bKYmbeIb;c&frp9_=%f*(DtrS~1wpMJ{*lw{sWBbPTj~yC2EOtcf z$k`yn~hTVu8b<=Lf&AA1)!EJN9-PPRH-L>4=?xyZ$?iTKj?yl~h?t$(x?y>F(?kVm$ z?z!&y?uG6n?xXG#?o;ku_ZfGd`;z;L`y+*`+@tB`-%IxyTJY0{nlOR ze&;T7e|7(e1LE*FB94lq;;cP{RH+{L&{aaZDQ#@&j05LXcQF&>ZSgY=64DdOBxEI&OQ@7kE1`Bm-GuCfdI?PvS|+qkXq(VAp;yA3gt-X|5|$*a zNm!e(K4C+`#)KUSI}`RK97s5ka5CXk!s&#(gsTZp5(*Lu6Tw70kw~Ny`9wpaG0{KK zoM=f5PqZZ_B{ocKn%FY2V`8VoE{WX|`zDS_oRK&)aZcib#1)Av6IUm$P27@rBJo^e zUSfV?L1JNIQR3Ic?}8Jzq^U_WlIA2WNm`n;JZVMJ%A^fR8^NkvItlYwL~8BWHN`D7tk!yl4O$wA4MWLvU5IVRbW>`YEf zu9aLnIXk&wa?9ja$!(I`C3j8kmfSPBZ}QOOk;xO1mnN@C-jaMG`9bo-hN@2>ol%iB7)sgBb}$isYg<8rhZH0gZxzke9 z($X^0ylLgq8m6^O8=5vOEhlYE+LW}ZX*1Inq%BEXk+vaiYucW)y=e#14yPSSJC>H4 zb~^2B+SRn1X?N3}q&-b5OnaC1F|8;aNC(rQbR?ZlXVTepK3z^%(@p8-^uY9>^it`e z>EY=S>9%x7dSZG~dP;g~dRls!^sMxO>4VaTrst$jNS~NKIekj{)bu&&bJG{3FG*jM zzBYY*`o{Df>3h--q@PGXnVy?|Iz2D_X8ObQ$LR&>uhR?DKc@dk|C#p zJw3fVeLVv`Ii8W8(Vj7$v7RZOm7ZMBY0o)Np69aXrstODj_01|iRY;&-&5fE==tRN z;`!cqOmwRlFu|kk{h1dlS7$-c+y0o8>L%E$^-9t?aGtt>vxl&Gt6* zw(+*}cJ+4i_VkYMj`U9OPV`Rk&hReuF7__L}aP9Y``#0a=8W!lo1Vi2KBQ@*(YGrf{XXe%xq&m?(-9q$2+Fuzl%s{|k$(T(^*`~_K$97vuaFEW*xZ`?OILoTNgc6XH&r8eS+lt=dC z?}-#5j}8-#i`V5UN+)$NA|c1Ajns4G0a_ESO}FQEDlYXY+K8AXFFi5&=YK;xmbpf06H~+Ef>6F!hxQW(rxH{lb3Z5Uvh)fqTj~ zoL0}G`_Y5wBlH`p@T3@I4j!37_phSU*aT(G+!HEW0jW5T{T6WuD-SSav@*CBmb@4d-88M$&L$)R-k&oETd>Qef^i>rQ z81F>}P=`2@H;4_SDbf--Q$DG*Rb503oh6=;ziDhFhu6Rd6K`n)J(PLM=5aVbR>%g zm`U6wv*|MGe7rJ$UYH|~LZXmM=tnFRkH&A}`Q&XfpSn*sV0&`|xFh^yp^b1+TqVAc z+sQfdC$*|NN?nZr2#JVDA~Fj_(B9}6bRT*EeT&6n?Xa$RNBkNQP5P0I$(PhgDv$Qk zBk7g&R{9{*gL%#NWEZlBxn0~rK9hedbQbc3m%?i?LNZI|hFgTLV<(F1^72wy(3RiF?1XD3J>$VC`%S8RH~wcE6tFq=vHDH znM$AKFY?cjFrW^e*}WeTj)>7qe&BbL?C8E0@S6bCnL`7mk3E#^;_)mmy z*Z*_ImpN8U`3g7Wsl@4G)>k-EO#5mZr~h}nFCHoNqPFp8{+;_3))te$_*}ZEm~F*Q ziRlQ6#3GHbFswGVm8eBAlt0~qUc@x#4)M+Tc>*Cmm7)|#=|CQ44zV-1^73g+#F~&a znM?IxQkYiEYUUtUPv|FH6PHW1q}9?@r6GNri{$&uKKVR`V?(jo1WlUB-L%Lh@Ovdt zeTkI8I$~|GGx!922LTXm$!PK{yHa>2MaZb~m--wpOAH|PAxlv!8jsb&CS$YkiTEn~ z7=E27MRXw!k)6pLas~C0*3+Gt1f~iziaE{txUt+?p5a|$TdAQOAeWJ=%FE>qa<2SC zX{Q`fjr3aPGTVslz)s>;@ghGrEjo2niHR|{$Vz)oz4lUur>AuX95;h$5%H!}$ zi)xV?=2y@`7RpC-AL#!Z~GU`t$soJGJ8shZnUFz z9c(MU5}4)8&3~ue<@P1KyL#o{iFfs83G+_PU>Vc`NR` zbnd?~iEd^>oC)_Q($`*2QTsFU2 zC@<6zEB>L)t;%zCEqayNSi+mj4gP~TXDQuz@O16xQag@Y7%eA9#jo#1T&tQ#k}M;iJirnk|1|d>#5r@f~-Q#rXPy& zQZJz<&4HU}Ci0midR~HML zqz}qgb+~#LPo;OVgSn~Pc(FYyNcE79D1)}33HlBtk2Fjxs&{vd= zYE1_)J-MOWMlnGgBmP!srGmO&vLZuK8tsIABXqIeWYg6H`$il6mB)2pytxk=v&xnYPvWCU4X5?-V?FpOe&4q%rszg z_e(Dpp|kaWO)u@IiEm8>G21sr*n+Vr$fA$P(0! z-otqE2Yrq|#pen`#J`mZN&(u3zRR{kpW{LJJp3Y2gXl-iqET%zvmw)zo6D~es)(DV zBl1EOS6|_~i37wH5+h$wA(VyQLH}TvuxkZMnSpl@KS)PWA3BSyLoOu`Q48qW^jmf{ z`A7@3U@!3GlD$Y$gyY6H`RWx3(P zB4LS?CZ$V0*&z2(aOD6}8|jFDqjISSTyL(Ax`?3Yifjm*%EfZ|LWsCRJgJsJYVy5> zEM*QFh<~CHdLMm={>XObr--rid-eu$8?BCQCQs9C+3#FO?v|LRtWJ3PfXI9l!dDUk6-#AMr)Zq{$q8IlUf~j@r)tsT z8IbA1Y+!eAX0fr9AeE7>$(@lJ$YpdOIvcM-^r6P{m~c`|7H3IbskS^&9;CKXH&b&E z12Px8j*r9-<44H;G|iH140~QMiBrTk@-C%@x)1)2c#xUMQM3$N0lk41VtujmcmSS+ zm&Q90fkYoNjr>gEj6c(xt-*KVmkKGue&K*{PWUOZVhyRS^hGwwL9#%Q!LQ@@@p+;m)5>e@)!PzTL@Tm7et{ZC z^IV=_QU8K}At%v6Xbw6RE5OZ!k=RT8Amhn&@)xy}PNCP+8|aPnCi)3o$X?|da>u#r zydUq+uN7dSg)l?dBis^Oi0`EoX{mHW#LK-!Zpc*R4tf$jg&~+7D~s*N9^f242+zSs;cxJt zM0a8`Ie>yFin>YNq5*m;{WtxAsmfeo$8pEFLhc>+idB@R^t#bTt1b*BBE?-&cOL`v-oz{ zGVBO`kMJkLh)%>p(nk&>pHt1L-qcX)9<8$N*eCp8{)K=DK4GO$DDIJJNYmx5N=@~V zT8N#%p5niV6O@yxL+zyxGfrj&ca*y=j#Gk_7Kj(Qh!kqbiXG1;-DD9ZF?HE6_7HoQ zeaAsuSDq3uAwsAr{3To#eu$SOM4Bjjp-Rbq#;`?)dNyBs78 z6ow0jrP+!K|3*90lNcQz!gu9wN{eI=J%YtyGw^2kBz!Xdlys59$z@a$4b#t=5T+mV zH&eu>aQ>W!%ix;wZTXq}BK{J8M_eRs6wgcjMU5^=PAPW7>K@QTD%YCDrG^^g|GOVuzmkzT?)=dLN;rBX@+G6UU(#b7?H z19lX*;N|gc_9$JpOoYi=bk@hN;$ zei#3a|13la)rB2mia1D|EdC|gq{Y&Gd4POGeyFfYd8MjyO1Y$5Rvs%KREyeNovO}4 zcVJ7fzi= z`qD^gl(boTCB4J?`_prn)~uDEA!=1`a$7Y^t%77D-I3|&3tYxq5PwrN zRb4Bk4d#CGw}gGd-(pp9w|Gc=E47y!%46io@^mZ@uZQ;|HsAyC@x)*{kG{@$n5&#B z8l>Gw96FY4r#zvzBjLzs0gy8KgVug0mH)bDr&d=J@)DoefMmMS+@UX52*QHXR9&6!ha7}oY_wWaWN?KiIWofNn(Xk|ML{*1~OMJ2ru+$I?=3X&>$rFCz1he9VhoA*V1| z_-)#O5{MaTT~eiqy(+HLq({-mHMb9Nuebu?mGDdS$V23jn(wb&;`R2ot8;g^;gg4ddI+Om%2>O!U$z601eT{y}SeXbWlbNdJ2pB7~ zCavN#o=s!lb7#4Wyvh#|Xf1CD5Qa*M-11KiXu8ryJy22yN~~u}u^{U#t_D@+qZ>*p zLaB3FKJlKF*h?ZNhVV<21?mj-8r6-R#>R==iz`L3X~ngo_#L7dF^P(!n$q!fD!rHf z#nfXKFejPY%p=y1O=qWQwWN>OR~*LWXg4|Hi>pe-Xlb}SL(4{5D{qyr|J0Y_$R?yO z8inqm2GOUPLTy!FOAH9u5 zV)L;L*h5^v`w-iSQ=~|~qQa=k)GzuNbAW|d2RnfuDi%uf)NN`3zJ$Kaj%DX6iA-Pi z1=oyE7ZmY=F9F*^9^p7n=DG>>hjV;8VOT!;59uBF9qk&VdZFh;6Lt}MiyOv$=5e0m zPYBr}DIO7T%hTke@^>XhIib8zUZQP?`cxp5N_V=gi?HfAfHU}5;uF=3sm)en?+LuHKNbrS$KUyAyguQ*g>2mE)kc>>Er`ytX8vp zp1Ppro>8=oe#&5423lXsL37!W>?kb{ear=EnP`XNYG(e6@Ive=#Yr=zjnWRef?P>H zCLfY-E3i^Z=~$enVmV|Ky-t`Q%q^~YMqXl%@ma-{&&(=zsjxy0mHR4j%9MXqK?|eF zVCD}0T>Pb+#JUhGiO2L}X}MBHxrzwrH6~qLtQ=JR)biwP`iuM=HIssHRlSG|K~^Al z@jApc(x1$u{pb~(m)kGY5a z*LB#PTGe$NS6$19OKBN#7onFhMvN4F#d)zz$U6CPaV@r5QLRzDX2m?_MhXpthC*BE zFT{<+qv7a6^eXxVE00rnd!h_6jOkFELG$@ynwTp-kfv#QG^H}d)!Xm~qz%#)J4E?0 zz2pN*U$qlb5j%jr(GcO;#g*N>Rd^_7$t>~}9bb}bBPnP(JYFn?q-r(Z@3HSVjmP2% zcrvk+c)|>0KCz+fY>wy3aewnyg^t1_F;Sc?9*}m*ymB9DhxWuWDS}F5-Y~z}>iln! zQZVI)dJ4~^C3-HijvI$>rrI&f_zC<%iC3P%UyuxR7&Zyph#kb9;G^;1gn_6`j-)zJ ztLf@=2f7b4pUq~wu;bYed?S9Va6-5zJP<31{lo?0Hu12OC`TwpWxR3`rO+Q(UA!@w zNUflrQD2xw%t+>~;3qkyBDsV5LH)>9;YUbomHJ3yq#5!QEx>*fCbBZMg?7?a=toQi zwii2stHe*_Z;N)ZmDoc(B@LAUIa}T=e^4H(pV2PpIXoP1L#`)3F=NNXusx1z_=`_M2S>NE7g=n%10GZQ8h??gC?N0Fa;Zfe<#Wj8_8K3c>Wg;@|}e{;y%eE z?UgGlin3q1paN>F`W_jFyg`j<11z2>O*A5>k|!xM<)wyG!>B3LH=3o(G1HheY%rU_ zR$_m0OSmuGSKh?i`AYmoem{R-a0uhY)8Zp(u(U#U%XQ@)@)gCdtXCeXyD5dABPS^R z@I-tZI*n|?4n;QL)rlU&9^wPdFp2C%KAOMBe-HwNqjGt z#e8X?G+B<8>&gA)y$Yd_%1E^f-;&>gj79FDdaNft6hBUtqq7;A>BgL68P3f&mKb@b zd_(zL?JGJF2q`B?iUnOpcc)|M1L8nz74ehGAzQI1CvnvTt2jc+lfw`SJ%oP1>R}Ct z5o8ClBe{vZN13Pw)M4rvJ%;{^zR%3&4sa*9Ph1gyL6|PA6P}2?=r6vLrfNPmL{5^g zbJO?;-YJ9&IT(sXU<=8vTM0y5;GX2>N>`S(YvvU==3EX^cg9a!|f?jwo zE|Kig09le-Y5sPf(nr~+98x|ZJ<$_5hKJ!_sR9n>D)T{n1tCv-C7b0`c^(B*6OlM< z0JB)Y<$lUwSMdH_9+d&rL#)8%T~eb1|8FLE8Xj4!9O zQpTxY$%D*3*2Dhb2)-6SSBT|z2#L~T4ci>6)>Ip!$#_rl0yUSvj@;Dt@K{8=Bwmq5 zisb7{52Q!PLSzkE38QcW;U=0AcgfdO6qQc3)i&lD%*5Ggv>o zH9ml7K#u25^54Zq;(R4YaiAo1gC8LMMpf(!aag>8tkmYm()etmh_sUR$x9T*4Ck5) zo8?-{9_6~W0oXXqgq_77k;mvajE`Nw`-FGm4%uHWE8kS2l@-crRYgNE9cCZ~l6#mf z{5QF$JVF_PT)?N$FPO5Np4-7M=2uCRq?OnxtOze62eS>iG;WQwNyg=lL?Ts}DI<&& z>qu)rO1jOG78ILGr8U3YpE4Jf*4M%lwYHJu{roKVi)m^+#r+^ zhKUQ6Eb;*I7k-)=g{>s3k&|f?9YNlGe%b@?!ayf+~6?TdAk?P@bwo z)s65EE}Hwnx8nQq(*?6QR<0q}mRrl~sCc>*dj}1r=BfF}Yho0APr@XBDTLTBToK#I z7IY_i7fZnP_zdQq&|DZSY!DvHaf+mlQ_mv@kOXusae=9YuR(ev>#%7206`MVsUrFr z<6zxfO|AjgiI3zH1)U%YWrU~VW4W7hPwk+7LetS^YB{M9{E0ftOhSg^y{Y|LmKMOC za)t<-}bUMaj?X?|IlC`mL zj;cvrWR5WB*Oc--_pnc7S$VBGhbUm%D9f-GxF7zOEJN-muTWd* z&y2uUX0LIlg>u>r+H^HaLmV4YJJ|XhBmI!aE3wKNixT5l3W@ z--P+%Qe~2|18IWxMf;-z(AOA*RmMLO6Uho>C9)sYiT=dsxhyVMSSIWe!^K|Wa4AwM zEw5H;sg>201WI+H`ZCwq^70^L4qBOLNaRzi=&H;_j^+U=P%2b2Rj)b%{mR?u5NVI} zLQPlO5iQAzoR1qU#mM)RP3S11DltS`3tZ1RxOBdo=ulfCtb7puhO|Q0W5L&Oz>=`l;!UY9Nzy&onQ{wyxN=1ujooF-$##`QCgMkl z@}z+(Pk&>+va{G#>_KiJx19f*e=7J3-z8P5D;t$mH4S(3UP)8~aVs(noq=7(Pmn#C zK(?Q-Uf3vBSE{SgNHkJ_Mq{0bY`TCM!CYdVF+bQSb~pP<+o}$bO!6xErP5Pvjev|z?EJD5|<8RiAs zgFVeY<0xE|Ma=C;%M(K>sqJu!)bQHk=m{A17DM-4M7a@PoO~Ix6~IY!}Dx#1k7O%93l6ZzlhmYlRkt-wuBi z`zSW*EcW|@^MfCl%R_GH@$g#fipU|6AEO7@Y4$(POYY}$ub%s8G#0J5uSkA1=Z-*H z$PAqmx+U~l=%dirk$rig-|p6T(TZqY^d39K{xx>KbFI^w*gx@``|_NDxt|3t3l@ZO zL#Kq=LXU*!MGlQzVXcfVjy@Hgw6BeC7k@92oA@eun;Q!pYF}p-S;x=0IOqxPY3>pJ zD*RWZI`UU^tLTn)ar~A!vALJ|SNrb{+!uH=@JVpv;MO5us4{Ygy}<5r+XJTr&Iq;! z*Vz$!TRT7TRPxlwv5Cin3nHcVyu|5&Yl53vcZZG)T^MeS9B0o-KH;7@cg$ZLzTfu7 zc1(h>cq?9 zlm2%C^MjiO_u#dLrkQE}7WRfc;q4*^Mb5Xkvv;(2vMZgivw8f8(bJamHdBk$%3xDWt;rp>50ph?T(M} zpARX>*DS-~l>g(v_&=dVe_=ee|Giv?YEYu0SChU54@ zYhHfy{{%exe*<~{C%`9x2cN`}9#35nW(->_*yO*!77MmmK%dLv?~O zPr-$l{O?f`c6q;4$-k|d&kM8Wv;P10zXIe9ywj(Hx9qg?(ye}8NRkePK$Som)B*7z z@gVVFJ+#qcixleQZ946el`Tbilax)4JB9g1 z9n+27Ibl>>@T3+=G52%|MUrIOZ>M&o6#(7GsQ=W-$L>;$=hyB zTEyNC#nO&N;+0*%JbOUeISq*IjOWfx(ynDv4t?&{EbZPW<+{?I?C-^Au^5lMF==mf z`>?-njg(LACHU;uA?@EL6)+xv*FjbMJD&~G!7b7ucpf?{9ab$JUI_HH6u+e-QZXLI ztpDSP0_n&s{-w|iV6TL6Sw2wf=n83hHlSbL0^L$6HA;u1V@xOodOJ1^8i4&{@jNaQ zI$=sGqmMFTD+Z+F@jJdtI>Chkn3T#H%g3b?C!~`afceSwKyC$N#jvz82a18*Q!J%cKCKzhot^=OK#kLTrK(h@0eU-w@eI7r%!Cr4?wM%L zoaCj<=`aM$tC?5hQH@7+k94*P9l&RBP7YK-3!puh`MK=Xl*5E{9`W-tf$;+Ry?|IP zz12=h7gj?L5WA=X7%y&;>d@8E$7*_A-5_0JK)rOS3;0|*E!8t#mMdLe3)H=W&*KXG zt{CSl|gv)r~MLT~i9wxMongHU)}+ zy=&QP%77Z_I>zfdrR&pyS~pa|wA7pm_%=^UH;(dB2jVxi!Hjfs3ADn9)M5g z9iYzZ_0S`|!T2V1-mC-GL;27G)OZW+TjkI#yAOr| zZ!#6ip;P)k3#xz~e{i8o`msiuBKIfOKaER2Pf5SjNz-`!N`Jqx|9g%!lP3Ma_$M|0 zoRMZT0R2Dd(!WJqD75iPifovb$2%jBuSFiCQXYS`JONJcoVz_{2Cx_EmM4rp(kqWu zCr`9i9=k)HSh+k-vpjL)NfV~!aR=m?(<;wgd^lfw=8>N=DbGguZ=4Mi@@!HsPpSc< z@@(25&wO;7r2@J%bPI@Wo(HVAsFf!@6Z+-ZlGP4Z+^$+Hc6+pxE7u{;ZN zVVG-B=G$4&E6?`%FecBU8eT(4d0=-E_Mzs!_44GSU6KXk^6W>Q{Tt;e zpuYnA4q*SlRG`*DH9(!het8b=k>`*+c@A~tDf*9Ac@FE6=WuE*9RR$F1>_dzKnc`9 z3-rJU%*b;@3gkcu)IbaLzzEF9b7TtSKp8YZH_*#b^nX+~5I>6eQPe()oDu`FpcrbQ z9q6ZIQl4clk~U* zSe}yvsgMuUKZ%}C>IS?|nw96|bSQ)hXog-Gm8Zf1d@33M-6}$#d1XJlDALG}QvNujd%9 zFNI!S;94P1b1t;Yb7P4-H{}5Hn_J{*sgY-GKCr%}N}gK_fV!>a^4v!JHs-gpcSpTE zZPaZ0Z=~j({Rl!26zVdG2L??|iWvMf)hRN4o&8b@;BMhsPc0kmm_BJ$cYC&r^6lH7L*e ze3+Ey=`neFIgV#0I| zd{QpYr`v+{0E4_i3UE^m5? zyj$kVyHyT!%DZ(ckdsjcL-KA@D(|)i(8soQ&;?`ia!&Iu?2tE;yv$ZW%el?FT>-So zyFK&mt6)&xMbyX=P=ALk_-`DRcgI4gmv^TWc{$&Cv+>>;zn$^lrBU8ptL4qXZ#TSl zCx4F&d2?$4&pny%NuPTaL7Tjb$y-c3FHhdRO=yvKANt-0{l56;{|BE<{(!tom@lb; zPMDT=KaOQTj$ywcdH2r-;sxXu;8j2m1^6CN2<sj|w^O;(CxwrB@S1NBGIU6SBeICCTM&<2i{t`XDjBWs4 z$(8rjMtNVO&)2E{W|h1{^uj%g_ie^^8sr@o;6FSq@4Ge7ColIY-uIg2ecyx*c}Mbr zTKv5BadgjguLId|IL8B-?H~zI&f^?wZgc(++%nr`{n(fp1yC9_lFFqllMoCZHoC+gS((($lX!^8QvU@9&xN&cGi9^8U%O{Mjb&UrqAPQtNN>{u!1} zneuts<@2S=XXMGpJ%%q(0b}w7yJ1v5vj9fq3$Y(+0`|hyFeqPSNIokUn&pd@$!DX9 znSkCw6UR3`BVU3V$yWK?9O#s9jtf=t%}odP=QYTe!rn$D@@*`rm2Zu6t{U{=1>)V(wnrsb=rm&?=T%Xep*e0Mdqq44ZISPp zY5AV(k#7S&&!c;xNWT6Yptlz*<$I}6zL)7`ph~`1@OU*7#^rkrpFwziM!q-jdz08( zE;Pyab_U?}PN#gs?ee{g_q${Ay+{80X)q+;2;LuL!=QX0;=?l&-^b*A+$i5CjGqwy zv{1gWGWkABm+y1tpU=uS&fb?6u>TePe?21KH+X(4`Mx7QnI+%%UGn|VCf|>}^8JMF zmrS6)=?VFML;D*!zvJ_JjeIk#|G@tb>i=0O-(SV@%~r_wcM(j<_b+?@&dTsehBs9P zKVJ+ZLxw+7Mu0IeB_lW@BV@`5r^txZ$*}lEQnX)&Jt_WcVPH(SGLq>s+*}!R3S`VJ zl`$_*MoP7ejrwG4LM#=p`86^&E0mE|A!9+CjLpeSCwI$i8Cy$6207a@E^LsoU6G9K z$ywAaBMbcw88UV(m$4J`Z2Wf~m$9oQBd1EnZmlwQACr+w{+{IR#XOH*_GWJ%_V&eN z3H|NYFJpi94&WGgc3>1T9x^DSC{4y;B{G(pGKza;9GMR@GLCAOQG#w6>!VX;EYFlt zO0UOs$T*hxajcIUkx|Ba#kh>)>Fs#(Pau8*b;{X0k=RMBPwIjx87Jd)GQJhL&?aML zF`zvq114pxBB!!Y#%U=qD5J^*j*0KIafSs$GR~}*aaK9Z$f$<1dt{t5ETabR^Ri@| z4;PSsLBEXJN*NatzX<<}^JLVG%2-X#rRmTmqkdM#Wt}oEFOqRZnv4eOHIR4Zgp4&K zGOikzaW#I|a9m9;6hMcJ>q=lq#`Sn#KOp0VY8lPUn|oy3i2g=u+=T9C<~O&?XlatM zmilX{e@h|I@2y2Lc6dXYb?>7_M+%_1--2ct50uDw5T6IfWptANP=kzzQ=wbNBW*IeN`d@G$z4YekD>3* zlJPjbJdXYeYCK7eo?#j5$>UkG@iaX?JtL#HSH?5tGM>fjxqKOY88S9dcLUnzM`gUg z*w5aJ)Od*+FW1NzAorDG8L!sLcnv*2UyQ+78LzYdW`T?$>c8d4csotTJ7|XSzjc%R8I|&HlOq4NcrGNK$(T7K|90rM zXT7Lc{;VANcj%OV$0GT6qL-c1pill?sIx0IcEf8o*1NaMzX!V95&8FQk$NI+S}-Ah{+RqrCgtBhP5y#h`47mE|3GvHwaH%y2jg|fko-mDAC@Qo;dSya z#gl6Y|B>nPA4Tsa=$7HR98D>o(=qk(^Bm8A+_?NJ*gL*k{u2h}KQUYWld|NmFy&wA z%6|%)RXy^bO8m5H`A=_^zlzW8%uM;unv%bo{?0+m&k%nNdFKtue?gl3{NB!gVWa#P zp{XNxb*KE7ra(DRr=I$kWk8?&mygJQMZf$F?eec_k^d^Z8zukMjMq5wU(4832)*)O zNAK6s&-EpM_YL&kTqXaF^mY@TH+Rb4QYru1GWl;QmH$@qT3hA64evYfYJ)qedlx<5 zT_=A#Uib9LfA5U^9qIDl-zNWq1@d>2_fW0;eE0p2(0`W!)AB!x|GHlJA7kvM9?zxx zPYlWb1_=WTj>Cr$q0EcxFh_CEU~^z;E5zSsVby5#>j zNB&O=<^Qxw{?D@I{~Yh}6quF&t4#U79+dwZYJ7|KyAk;(XXO6@-H+w+|CAyB&;9aG zSIGbCsQkYZpJ|c*Pip>EDgSJT{QnU9w_X9YD&Xl-z?Y|h(X2oqU4bC6P!S9%5GEc; zQNYRq*3kw9>>34PO$s>V$BA>^4sSy%_N3S@RF zupNDDPyV861+oliS73)q1$Hb^V5fWqvgvW>LIrlohH(XQ(C${M!0xRI>`|{kE_-_p zDX`cDdd`Er>17|h_pMc6i2>6J?2o>H_<<=39E3+9^$upAXCr|k)`z7jaCnmfOM4YK zB2$4Qa}_v>+C1A2EGt&vXnJ2xZYg`mv@38de#havB42^yEd@@|K(hz@_w2Pp|be3S8Eqz~$7sg1rX3 zu5@8ofi)8fT-B~XV~YY;)5q0luN82t*HtKReYXNP&`evkLIL z*}#hi5PvBhdK7pWpO?`NOepYbIZP_>TD<~;*$TXl{*6)v-W*V1s8)fuh;xn(yp84^ zJcf%Dco)rk)P5hY5i}p5|B&$`dK&Fj;NxZmJ{eJ9EK`Bc*!z51fpNUQELPy_JU}}k z;5fgr0R6YjzjG9rWc@w$e#HMr@_r)r)1U%BcPsD@~1>Hsk=Qb!fuUWyAE(JH5R&e7P1vg=yO78qD1vf*V#{L5I3y5!Cpx_p{ zfR^ufaI0(uw=PpKqg%mk(J!o3Ftc94?b;RGzE8nL^p`cP;EvSEu267i#$C|wTBP7^ zIe^dZg9_$SZ_geD7Z)m+*P`Iw#P%U~U&tRi0>9$Tv5aYG8Os8;a! zSq01SJP{q&_Q8{xugq2Olyn7Gr7BpN253*E=4tFzWhr<@hk|DnC|I4Z;5mkZ=c21| z6+DmF`PB+uz*t+W;DtpBUNoWL#j^_54JddCx=V8vtml|7YgF(G3kDUu65Sf~joAub z-JsyLCUh&Bq*WmRt3O3VEGhR2PD0nmTn~AM0R`3>dxArU8O5SaK3f|tU;2m&h zrGj_mDR}pYg7-KI-dnHWeLV_xkoQ29f)Ap3h&m7B@d&+eFCKi9{dM&77&(tODfncC zf<5q5fr9JX6?~e{;2A@~XR{Q1u2aFj8U;6?eSTcQeqt}BDERWEg0HkG`0A{JgVPGW zK@V@%DL8~5-?`vB6AHdd&iknfj^r!&LA8P(Qh!tma$g<%lyR(IL9T&=<2ed`IjrE< z=?Z>Rq~N!s3Qjr-eqW>Dj~NP1btw2V9>1WUrrvMFW=a(N1OLD9|GQAZe`aKQESWw> zrqM4mFvLG}H!d?gCex~sY1hh(b;yk8%H;ahbo*q^>6SUqfGL?9Wy{={y-nI>rq0To zpDA;*W|<38WNuC@JzeHj1u`?xZQH=#n9P&8y<{$`kjeSX+_6z+c9+auN@ecKxZ8lt zJ*H*uiO=F3nR}zz7oYrknM?59uS4ek^l(6`%mb@r^5@+=I78+kSuzhDmC5#X0;>pZ1m^Q!?~j}&r6Yceu2yj@U1PE zd10Q+i-=v!yslg3YWlx~*rl0(*JbrGFYlCj1^W%zGOuKP6`qacU)?728gj11x2av` zbqzAFACSp4rP(|r^G5o(xro0$*&%ani_BZ#R_3jJGH;udc}I=RHhR2sSmxcOGTWKo zn=13ZW|J>_xQD}2~(=!#?vRR?6@!6(Dp@oh@nP|5kQ)mbLcfvb+SfO2V6v}B; zX!kCKI0uCGoK;X-?NE3{9)Li;u`;NSy>8IX9E6bqdN!h8tR^h=KKbQE@)Ti z!V-lpDpcrV=BwGeg!!el3SEZ(<-H1BQKe7=V*{R7($kfUYp8ow3QQ=}NURaRtMe7Q z#)N)_u0`L(`Z^cbyS_`I8*-pcp=Rpcn5WQ9*)XZl&C?3CG%B<T+E z;0%9#c}Ss$sPS;0LS5A18BB<4y3jh}k2NXOU82zA)e1e~0I?^#6zXB0YrN2UOQEN; z73$?UpJDz?k3!GV-*c4;@!bk-ApSh@=Vuk_uTtnm`gkc%p_lP`d03%WsP}4`La$}P zq(YoyLT{8Q^d|m8)Op)g=pFL8rVG7`=Dl)-M(Py$piQ9<#}yi_R_NnFg+3iqXejs4;h<^j$)+zLz149Z;jwtj4wSLS}XsSq| zpZJ`9u2txlN`lOMV2f7sclkv}9h5pJ@Xx38b@Bd)^PnAOdmhf*b7c1;Z zg>HqtjSBn9U|L~gTw#B|!hueOgS`ryl?sP)VNBuhl)@2WR*O%*vVHo zPApNYaI!;Tw?N@Jg$mEjQh1&TXj3K>-l$9Ajq%uo`l+P~Z<-2|3eP9D8MPOn-JICw zGYY30K!01-E4)>i!dq7>oH4BMHu!9d&%%C%Guhv+PT}o~6kb#SQwr~prZB(b3GY;{ za5nL5ymsbzb{SN7SIFs8csF|HXF_-nG`STD?^&hrUM&hQCNHl+;k~C7-q%$)AFupb zh4-sec>h*~3#t`9phV$=EWoRf*uiZIAJU`np|uJZjVOG0zQRj0U`Ao?@xn(^^@QOl(k0Fo+vu|6|h;j^g0xiWlCuEOV5DqMr-d1DHnPwoZyTxcnLQMSStr;3+ND!jT` z;Y;wllvyaVV<#u zJ7*MrnEfuakFvLpI*&~#{CK{?Pc$psgZ8Oxh1auwx?1697@wmDt^>mxx)gqXQsEc+ z74Gj<_{AxOUoKU6pikjf^AvuqP2s^Yh2OyE&1r?-Dp&YzwC{{7{BFI%?;8q_lqvin zz8}ph{Be%LpQJ1NX`jMl|&<$M2~3Jw5+G{*S~tABKO% zce+R6--!KAUw`B&{1=|H{R;ns7w5z9zmxn+=hKRK3l;HoDZ+Ox639{{SfGeGrAW9$ zk;s4|7IC{u5hn#|VOWuPzaohyMUvf$xaEq>%~oVyqarEIifq)O$R-(zq-H9zX|W>n znQvC6NE*2d>J{07+;nPhRjSC=P52pB<&hPWg)LoTJDtt%~eQ zUJm}dwJEZDyCS*N-ILhjJVo-*?M==;SHq+tYtUa+tw>{oB3BnGa!tJ=*S0Fs zG^)sTBZ}N$0J`R3MQ((f^Au^pXKk+{x1eb)QslN;MQ+c68Aa|GRHTiXeAgm(w<&T@ zrXrk6Blndk(m|d3D-?Oag)v1s$$6+yk%v1Kd8A*FM_I440N=;(dYt(axr#gq+=oS; z8dPNckRnf`@9kCO8RpO7+sC+JN|6`373rtui|Ae^XP`)tS85b_mAbFZD)Kt(H<-Uk z{#&LZZ*#2gj4JXj{k(_&`vr=O)G6`-e2C9S)ELF{6GxFTaz7haq|C=sFzROW$622c%#3{8FpP^spkob|~_@p~wtg+@nSQ%2Z@F zOA*e4k$>>`w_lceWqFHa`6^@?4YK_8vH}CLg6x?PYLXQmmt~d7iq^@phh;g{vf|7+ z*ICIPS=_@}b8}?PBbV=^wb6*IO>$+WqTO^t)@CKL(uQPlUbD7nm6bjwYb!(6*6eSS zB5T_+Sqo=mZAYE$(Jx|u2ednm%F33kolRNX&sm(itliRO?OrKs4|IFx$=Zwl7I(?Y zo0PQ=Ir|pL;yTt^GAnC;S5^T%9ndT5AnF~QE$fgeS%+oFI($f0F|XM>qEOb6-Lgs= zWGy3SdAqDq`acH$V@G9`rO8^6E9-djPJk2X=Oi>IkI7nz&nbPfD)BwFO4e!AI=xF) z6|pnOKNC1FS!Wl>IyY4o_ixtuow8~fFKm{@`N*mx=aMv8mo~||tX9?)#IB^THT2L} zCX442)-}Vjnre6@AoCm2Wi^v~#bT@Z;#4)huH9ttoJfxyrceM$T))?fF@`o@v5 zqQPQCLsB%Ht!Sh|QL9N&J5|wGnWFImMH7>Xy6K8?4HunPuINVSHy%}VlUYSK9Z__% zenl5FE4l@K>BEX{Q!-46YtG)1$}?uaJ4UeTSW6y3E|(cQ8Y<-8Kj zMYot9@|f>aqiBAnqDv+e-M>iDf*C~*%2)K@JVg(66y@3~dKfciR&@EWqQ~M_mI1Sh9*@uQ#LDU8L}DjVqMQe!bq$KHZdCMAN74FP zMK5E01@VSbMXzjC^eS>1vlP9$UQzC~qD^>T*Q4kS`0(dCdgFwmH`gh;mio68Dtc?L zqPLNAd%2=_v@3dNrJ{GEORiU5Y+HymMU9hpE|>q9}j1qwDZ^3~hHFu-}dE z<7J9Ikps-1WWOgJrW9RI&iY|RpB_}S7jJ&fN1ts{^f~;V>r%9jInN-X&$IUedHt56 zFaF1fqA$VA1Bwo`Df$Zgua*M-ueB;VNZ#wzd&5xl%_2pI@PC^;z8}$dsP``OcY73l zuUOId$sgeuK0x!~jH08iq92zl`pKB0V>OEM{fK^EtLPVHijFrZ`X%wN;OlxtC-C}) zyl?UPZbZ>Z#_#d`fto+2DmwKa?Ef^a=+CW+{({$Zm7>3nD*79}{th!!ivH;+`WL;< zviEnFqW=ubRxYoyPLu65Wc%7=8xykqQ?dhtvV$YCL&dVgy|OI_h}l`PV>z;&dfD+7 z*?fm=cR=>sGTHO0Wp9)!dt^;fbOR^W^k;mTN zDKH^>pGKg@zJ<^!J0BhQIX2%td%s%Q``5@WV6TAnftKupQh|9PnnUnAq*wN#U9yYH zWgk{4`|u3eOX;haevc@XePq7uqfFT)^jOj(d$}RIv{?2rjk1qzm3=P?wpM>wpGqP8rJta@}swUZ$_?_Ay`!xFHzQ?X2|BP|jXW@U=uT`Lgej?6w}+chOIKpX__OWZyd|y93?* z+0Y>SfhyS#*1(kP&S}{X5qlW#NAhGpIwX4?eXYaeu~OOH@OX#pC-8f+7{+Bk#kiiF z-fG#;6v=+JLiTf+vitDkxrP0F2~5g^}-*|5+vbFT7^S<9ufS(>3+5Qn9$BSRz-kWVT{1+BvO?%_~!E zBPq6VgJP-mifzg`zgw|1Q?Ui)Z9b}4dWm9N_A0hD^Nc#hwxQOxnTjpMFSAIo?Xncx z9{nPG7WFH(g8^fT?Kq&=PV|u7so2hV?SlWV<%;DLDz@9OVtb&^EmLgIcE$GUS8Opk zd4r1WJ)_vZV~Z3!4($r^SCD^vuVP&5#ZGKh?4&luPR65x z`6;=It#TEstXAyQCdE!qQS1yj6Q62Rv9lW#JJ(UHhFa&1D0Tt5+EK;0M~YqCtk~*$ z#V#3BtbRzb%h_*0za|ryH=?=PfL_J;{>84HRqQ&vu9sprbSTDmFm_X+VmH%o3;VYe zDRyh6Vy*OjJ9Do4Vs|p$P3)cm#W**{I>@^}L$L=c6nl`~JL&bI|6uPCv|V^}4-{M1 zq}XEvian0@@nOZDVEts7Vm%#-JvE`&`f0_U9#^cF8qd({bLjXx9kC6yian3^g)YVV z*?*~2v6mYZ8yHjU)f&ZKD^_ffzF%kk#*AV^nToyDsMtFdiVgQF_FleX?^h`{!umrr ze6M0WD~x^0=P;I{*k^cuPTm)jihWtB*jF8jP1Gs&&8TAERVy}GquBSeiv8HG7|$SL zKa)RA?yq?KUaQzlpJIQK^VhIqv(t+GlcU(bEpj|{a(t=8LT!>&1Ua$4o^y>RwO zk&{~}XU|eOdyUG;!)I^i`}E4m&ycgERnC4ba`vB*Q^5X#)p8E1l2bS>=io^>hvHjA z&S7P84j+`W6wMLTK5|6PQT=k3NzTy)a+X6W>ti|2+0D(9?TIcMj|IS20=wC79C1r>5?yX9O=ULBsRXXRX4 zDyN>D%g|lXDyM<{D@WyAMZ6K;Yw*2xM$UEgaeb|vX5u&Y$+;PiwWgd~O60T_%i%eI zbNjHIwi-Ei709`pzV6A8b8oAhjzT%y_d5?($ayG>mmn6&d4zh8j>>tAb$5rHCwk=c zRLWW3E~ht5&a?2`kem&yUucr^qABO4X*mN0a$Ys$yw)%0b$s9G=G7sCa^9wocNpJI zm-9ZJBfWAyWPdbU&L@mx9Lwhea>l92wVLyFwVVlRe1rDedO6?C$eG0J`%*bSWXkz5 z1*kto&QI`*D`&bv&ae3Xo*`$3*dKWRNxeTOqM zEm3^_l;WE)Utqwf;+wNhH=$nfEzxepxOKnc8AFOMOa<1N^uW0wzCAvR9GFpj2f={i zJB}%yovrxJX^QXCu6Pa}yXPpr2Yu{Wq4;9F^O_XjJ6-X8*xMJs{3^wlj3~Yz>_4qI z*JbeoIGzLZ0q?>h#SgAg{E!C44<%MqqWEE!;)nmopyEr%6)zrA{D^ABkIYn@`=)pa zx@GAwsrd2~U_6Gtj?GZ~IK0ZxtRQv*^YTu`Ps&yNz zulVINiZ|pdekJoY#2V@4YV_PI#jkBryor9U&s6+|3B_;hRQx9Dx8y3mwnFh+$ZaiC z{Pq;Z?_g}3Qv9xQ#qUOQ4}ITPsrdc1ia*$`c&7#Q^l-M~k2pYn7kOO`ia*+{__`{^ z9~)J?8}G-7Kf(B9j^aJ3ia(VHeTuKAucylu?`8cAInRzL{#>KteYJ{j=u!LySMmN) z#a}8={AF?n@O*{ic#S-sO~>D8Q+x=`+r;0Y&tZBPo>Kh1G?-C*gnqg1ihq~|?0+<@ z_-Lo%AD1cqNv7hTRx3VMulQ#Jihtgv_!o7Ga}5^%lJTo@#lOx|e1cxS;h4T{QvADo zm{ojoNbw(96#o&=sXoPjno|6iLdB=iPfsiU>!jkpvHyFC;xjdh|52v+pVava&0plt zjwt?jzvBP&D*o@R5*|YdZ-ElNZY2!x_b3r)QX&X^_Yz!(CBltLL~4|;4HP z9yFEctW)A4bPrRbYgmbOIKe zO8hdb#ILDJ{Fbf6?`ZzWSK?1<{lz$2uEgKu|1+tiGL-bxD(S6P(l?-_pBFL)a+New zlnkXR8Lm_^GNoj+P)WN)$r$r^j*?0C=cFq+mz)$SxzVhWn{+A3c_}%6P|36*B{%O@ zatlkz^#ABpa!a&ZjVhT@q2xAoN^aYrDSzLdkuKmE5;S$t6`v?#KTAZ~*!P zse2Iqg+odnLQjWMzX;7?9ZDYFspQgOC5x$b1RT|X(d-SDapAfSy`*(sf?%NeMTmXDS76gl4n&a$)Ek?IYmmIYXI}} zEG5rJ!?jql7XORr@nSx|)sB*v)F{chCs|Ma<;)ujlw9Ki{#T*9s#nQIym&5G7bV|v`7`yR&!cp?cN+o;HKQ*r8(`8EblJ^YjXI&+qqkbRz8`_n8zFx@}nD-Ye z`6BTbrC**uuqU0DkpON!;tmSKUfZQ1=_^e9L;WPRZ}P zl>A{v$*F85f2vXP=Mg2R@%R;w-|(EF&djKif52bNXY-W&dtAwXC*^t?<$7!6`s(HS z)8z(o(Vt6ZmFZo-l4mdTwnA$Q)4+>OTMZrmm}m3@A1;(d~PQ3?K9*qnvk1SA$JE8hUD%@e5Z1` z+0AlyX1=Qd({ghL(6`g>si>$}LWpdqlb1Ba7vhl*wH-A$Pgt zmS)I3rb+H`cyOKPuIP|^LWSHDS)YV|1;@0KTC3PQ6;5OSboxDm-p(A6dseI5YGP-1 z$~~t~ZVi2$$9O@OT<&+=i!ETyJ&(JZ+Ly4;b2qm>U+!i2UEV173VLg(mV0Hp+%>~; zubPs3b&lL?@VK^8?sY|Sxz=-UAiudy?v2#DX+~}fJ+3X2drO1dTWjUEPRiwXp>CTc z_s%A{cjJE#9`|O*y{|@Y$AH`iQsq9_DYvsqF8BZL!}P{80Jn>N9<7wSj@)&`9-EZ= zc&6MZT)?xZK<-o2UOytYm)vKl_w1P5K6>9!CinRsxi8?~KOy%eL+(JX+*dfBS9|5Y zM(p(rxqNrrH}QU}T<+V9?~wB@{_oM_`yAUygWM0v{fPL-IdVTCe~f-UYnA)C0|Rou zn3DTtquj4XcCige;W@_dB zfybYHa{1o4e`m`5CtvQr?V2O-W@wJDM01Q5&GGkXPSDgGvtDz;uI5B~H7A;>Id+@o z#HKaJ8PlBjxaK5NHOECWr&)96j%ZE_IU9{?&L$O_liH*?^V2nFGyKx}HD`0?Td~1Q0HXM?{)ro zK9YRy>v~^T_t~2 z^_ULXjvbe+zD>4e^eks?1Lr5y$<|2k3TB_g4lAi&O-3`Br!X@{&S{2hE%?Q#Y-h~L zb{0Knr(`>q`E3!|&RdXe&7^GY zFyj_x_vK}~m73eivL&lzyIr!~fjgPopOo!x&hClJmg%fF;_p#p}4A};w zvOO>=+aH<#rykiJs+Mh--5%jQJtW&>%oypG?FpVgN!?Q=*+x5Ld)k!k8ET)&$d)1Z zZxymVOWt#pvSoSAQulnFY-_0YF`?YZGBj_+_-G7knxX3*(NyOK>e#B z+5R6HdG_DfD%&RJPLlUJ=Wq1MHpR241=-%_=X!_F(@EL5x7pr}$X4i*?LBsUe_pnk z9@##iZcALYt@M1Dm2Iw3wvQ)d`wx2*$^Dd_K4Z@Om~5XHW&47R63@SqY+ujG_6?u6 zlk-1Qwr|^I+c_Y+3bKE}I9xo~Z2JlJ=7=r!SwxbO!g(U zvLDhW`=Rt6X372|dh42HUs{m;NU|bi9L@9Si0sGC$$ne{%&wo1eOXp^emB^cQ{O;N z!-DL`Q^)TI`-${5PRqVxN_M^rvp23`!6%Hw-sbRZ%+2}dA6n~dwWjy zUrBa;XV^Q2WWQ)i_DiZ{?_}1crtH5?%6?h5>|N||InS=-eS-e0d3H@y_U0xO&?ozi{46)s$bNIB?6>gq_6^E@+kou9<=O4*d?&sA^RnOFDtjs>`|m4c zzn8fK%;gSdzn}a+@P3et!IJC`lx2T#M)skQ?0?#&DEmX?4CCPu*&iYMQTiU6l6{1} zCpdqCz9&<%KZVhp>`(X0{tR`0ZIV61>)(>HKg;~*#%1TA?}Y~0 zUu>8Cr4HHGEy$kZ^<^^t(Iz{0E&Hp3vj4w=?0NDxlJQzSin6~xA^RKjzd_bit?X}g z%KrAS?C)SYE&FE4{%)P@g`Di~H^~04jO-r-W#7_-lI+~G>>qOe;gswj@qUi8PpB=n zfd9-s&CCAZY1u#PlYO3jKJS%%Tchm!J;q+@ko`-}zM^KKPWEs3Ik#tI-!Uxv|3b2V z%Pu=7jd_sBw17;jWXzLytEphc7LMMRuT4j{RHY2&UvXpkIyydHq2_4!%=%98CQW z>8*{)u_PkLq09|)et44{b@VQsm*a?8IU==k92J-2XfmT+avU=#$8ppx>y~4Aqa4S# zVp@(9hU91r%duiuj+4gaXe!9Dir&@KHBZWM3g z$N$m)d{&OJ7CHVtFUN~zIbKT2u|6)x%awAxGA75wj2y3WmM3>pN{-1vIbO$`h8$Cz zzfJx-VL7IU<=9*!M}fZgc>g|gW)gCIFek@sl^k0K%u3GQQg{qheIX_bnNV`ef|R*`D1pstPjpsgkj8 zSjOV43|plP`-}`DA;U!-cNN3T$?#@m_~0imFeD?`EaO0Gf6yZ%#OH%io04$|a}I5l z5l+fD+(2GNUA>H@b25$`ka3hL{a zGIJ&M{Jp|hP5$apE zCgVJM_1?t|-Y!aCUX4jP3|x*!4b%G;(16wX-s=uS5{_GI|D)#T1xzLmUaD zFba0NVNS-46|fLR3%X?V7G>N-*3H8hM*#~mZmB^SO)~n(?IZWrDuiU*HVOKEOW$wV zf!`O#?d)+ob8lzv?aaNMxwq%R+&h?i2XpUW?j6j%gSmI~V+0eJm2szFA|j)|R>oan zG@)I_-2=#gx%bS=_+2ZyW!y{Nz2tFEGwvmi|9ds=C2yc8<9_zJKQ7}B?D9aHj0dM= z3^jn>A$tEr-b2iJI3eRNW0*!s#v|1-(mYQylkW+PG&3JdBZnE3Wjt=64$bJ0@dTfr zoR{%bm5kA(jAz(6!}AQ!Gd$1qVHo2m$oSiwjORi!vV+LVc)kJ_qB7PdWQ;Ay_VfGAtACUh6`Tx$y;NNQo z|9fW4(lgtDR*|jgvky7@kh5QFbr~+G@%{67?ShQvYcT94zP6?tOaXEihCufYF)52&% zJ9;sMF-*((b6#7gMh-J5%Xzi|c0Icp9q7X_#^r2f{yA|ZkdpJ}G{zc5c*pTxQYA+d*vy<9i z*UEX>74Ycg*Gv;N%YA5z^?m_Avr0zlL9;EI;>K>%-!3-u*l=F|32%;WwB#^==nEyxS4+$nBh@lfnq>;l6 z%5wh6KpmRVfj$gl90e@M`R5vh(S&yNVhCe$4p++gaGRXmU!2@uoN3O}oTsP3*<<|} z!31XId|WWWUXRD*9O3Lq_Iffc=V(;UXPA)*q8@Q1kisbPaz0B>mi{dLS>AJRaX#OI zE->qPW z0+yVUvvR&Jn1~>TPO#(a?D%>PGbqdXhJiXXqXT^y#yARCkn_zNgwcd{^kN9?@g{pr zQTrCVyv;6evkUhlC-)=gX7b-9zrgGQvkS~FFuTC)0?*##*?Y`>zhBN76A?N2e%tv$ zR?aPra?Vc4`C$Snj3SRYIp>25Z`wsMhy+2`>A{j+8iuCh+hV#=ZgwTLi zbYlP+Ov*V=&bC@Gb6XpFK*lyQwvkcd^{ZWY{}p*(llL`wUz7JWd0&(FHF;l?_ceK6 z7v)^2L=g3eBY_k~k(YA^89T_>LBG$j+O2>ExfbOyCs$%>BtcU_`DTkof~LLu7`? z43QZkGeqXWNx5prQNV&+hv3i}gwZ6|VPqXn*5PCw&VGltpbPyVdnwP3tOt7>nUL$~ zPLO$Y8ad3MEZ2_>)X5d)EXrAwvtu|rHVf8FfH^;9zn|8j869A+ zpR(6a+3TkTu-8d72%`z@ay8Y=+p_GGb($O2(-? z|M`?$zp&&wojIp7=ZunE@oKrw?7<+ipyq6H&Suuxz2N+8&d=U;J}*~m6+&o0E4nd& z3?@;O>zqmiQI9whNMRIt%*n-fF|Kpj<=iM*(1m`vemN{xTLBAlomV5*`JA86`S~N5 zkgJ`!?aXawZaZ_^Ghl8zb1z`-ub9=rYX|c$>cx;;mo%XreCCeix?~K~D9P11F4v{( zbXhfOvx>ri~GpBkF5I&V8;D52%|}^KeWp=NX{TRgVa7~A&M4s$u$&1Cz41bhZ&UR;x6O* za}U_%&t&|Wj6ahxoInbr$YV~fhbut#!x51AFqsdN$@i(Qhsk`H%!kSR3z>hZLo+(i z2loHVI0{&h>ya9S(S&yNVhCfHMoF%8HEQL0)RgP7MzqQG_>^2Db8Wx3WHsFUkup1sVomwEQ`05X_FQLa}i<@!gbTpQ{Um+RGex$^XGnnp>k z*Z7%Ut3@N)&?DDmO0L(L`G#Q1^(K99CcycdqjJ5)ytkP5RyUaU7W3Yk1oPfz9`_H| zKY9IU5X^lyD%X2ty=NjK*ZUJ7|6iQ_i?f+Da+pC`u77uf+<%k%Z*u=l?iTX4khg_A z{?6#y!aiHrXAApm$zx8g*$P;Qq6J;(#|W4?%gn9J+{*ip$oq)AkI0*&ZjQP+>gIU% z2{oUXa{Z@(1-Xhf2%`z@a(&9o&v^eC@8^dwCKvY?7xxzz_ZJuU7Z>*zSBZ?T;&OeR z!wkxDEf{irlffj4a&51aYsUyCzf1epBdk0#v>EV&(RV4jnF zC;83>w1N!oHg4`VZdbG1?soKINN$rn4|$%T++KF@F~i51#hJyKRS#xZ38duq&&$1k z8<=xI4Z?CCID!ex%KZbu1iSwrCUW-tXp1OMKma)UK3?@;O z`zMv4=O^`u%e{O;?&A|kVHA0}PbB+9vQO*<`<=*sCr+azcVnmAE2v*V{R-;2U%9zo zxw&7txnH@P=v_G|_v#QD(28yhfIXV$RU}j5R>~H=AOfhbC_`sGtOn7U$RfzoZRPCz(N!)=#u;VLAlo~$lYEe z_XV6^!1=GnFb#Syr1wHHJ4P@e_eD9mFP@dVllh%-xi1|+2JFWj%H7o`_Z3OG6Xae^ z{ngZRcXD%ga$i>`_w~ba|Hc6CZ=koA&o{^9zNH}dttpHm5B5zq$bEZS?mLQd-&u*E z-2E9atDm#GIJ=wAck}sfKHtOVd#JgG-R@zxdlGX0j-7tb^WXD)pkMC$XXGBtV@~b| zDqtas7Iew|U=nHMK<$HNx&O$%f2>0@I?#t(bJ9;sMF-)T*_n)d! zi$=7e2Ls4p5=FWHT!|p+5k~?kj3SRYxgV;4g(zCkg?@}+0<&@t3nn6np%Y2DAMTU; zFVsC!mOE|8{b&PP(JeQB7jus=Z-jY#f8-vWm;31|gh1WX)IGx<8O}1C{jC>6azDqj z=XmyiLDVBI_gaDZV?A=e!21_?{{p+bn8OUpa*s3rCEmZp`*pluSBGYFfIZg@%bjbK z`xWNB!n}W^<=!wS_y5aa5=FW5m0)hZ9&x!hcA+05n2`H53sJOyXRnj>dI$|@MK=aO z=Idm>P9}d3bH7368)Qx;-+|$gQre->YQMos_fH|AlVKX~yW{1tQ za=$B>h#-beB#}lAGbqblFi?kPbf6Ez7)L?w_n7nk5XLYq_rEy%*Mi(LHFAH@Bli{) z%-BlKR&qXSLOXgv-&{%VPlBkI`#zvHJDqtZB=Iq6sy_mDt2$-`MbM|J=-ptuMf*3lHL>f8F zpe%DA19fOd2l_B9le?L@FK7F5wl8OkdohGDOv~i{W!5CXjy0pmV@{^60_zit5J(aw4n!sGCiDmIP-Ak;mot^EQ=}3%k)+uga)*t8w1E-5=EK5N(8|? z{}`sh%m6b3ChfH?;+=K$s$z?=h^ zb0BjLWX^%iIWUd{QZf&s_aJ%?qW2(r52E)VdJm%ahZdq}L6^+hS(!@&6A_t*HlqW5 z7{)jXSdba6L0INt%s!miKN`V=%%$Y>_eOIm`AgYtDbJ7K`4Q}P#JtQSs}KVFM4Hf! zUJS`RnthIDpQG95X!bd}ALJfQ?$NU{qs{0*ABMp`$Fk?KF?1q{G;)}cc^v2U38XM8 zb6F1tk(K!qavLfUlzBY$$5VfNS>_1_>cFfMTV(QmnAu1z-*uTQs5vQw2DE~o^`rr0 zFe$Ssk2#quD`0`2WhEIayFkuLa#l`YR^}?fLb}G+KU66TNjm)1n$!r=h1UM zJ?EQHwvX_RE% zQiTv2(28yhAcIMe)kjue5cP;7ffPoO$DGVtD_|iC_Pdq+Ze_n)M=*g|nYRfB>d=f1 z^kEp|C}2V6Z)*@n6WY;>A&g-fC7H=;)S?k>=)oYen8Liw+pA>W!9I6#b|+_da&{M4 zcae1$S$C0jPZ~LyzvJ^j1uW1r(1I?R_Zud_StfTf^D*W=7D9u}5%wEt1N)5(%6xJZdCbXtig{0w^%Pl8k@XZ=Pj|@7FfYTr zXX*Vvo~@;SE&XfhUz^1g_*ur7^Y<7!kwh9f%%Cju1$KF%4(#;;xi9o#7~?2lLFS7! z2%`z@GS^jt+3V^NM*=B~B9B>_>je`LFn>Ms*E4@T^Vc(fJ@eNyKgawW^K;D4F+a!r z9P@L`&oMv8{Fj;kGV@<%{>#jNxfeqi!?etQRLGp*{RHnPN-|$L=g3$?``_trtfX~-lp$u`re`M9s1s3-aE{Dhk5TX?;Ym7!@Pe|vzeOB)NH0^ zGc}v3*-Xu5YBp1|c~<7Tf{6%X=tL4}J>Ozxj%p$^UHKp%!Nj)Khh<47QdQJFK; z%uq8!%?vd&)XXf%{GbM5G@%{67{VB)QIh%ZYSf|;ZRo)uvY5iW%q^7&q8`lN!t5=~ z=DS97OCEDF`L5BNwGc%My3mgiOkh^#R>4FBF?1q{G;)|hS>{L7%ne}-(=tD4MK=bJ zky&g)J9@#@1TDN{X6L2L4TS4GW})x%dP0f05X_FQRe?D5kx)WNFXJ1 zXBYZ0f(d!PGbhh?D_|iiPelfkD9W>2C4#6&90_?Awac^nG)nU9QH@%8szPW$E4ncN za;nIwBABbdOfJbMc!B8Z_ANu-g(49fECW1tSr=s+KaF^+;f z)p>aq)4!Ph#q{r2l&7W=L3wQ5@;IsxLIYZ{>x_LJ8BEIKWWH+(^YWNI7(^DFnVfm( z_t5X5-$TDQhZ&UR@v)mVjgmb6YShZJe>-|HgfZ}Zf1U?<9_0A}3-W}>43QZkGel;H zok9c1U=l@n4yr^@o`ah}=D}nhOlGZtIy9q0oW`xSsFFNCX3me9^W#1Y%X18S9TP-7s68fu z6h@Jk=eSmRmho&E&wj!l$2ZAyVnm)56|fLRi##V)%d>Jwp4E-=G?(Q$*+88M!KL>f8Ffcn#@=Q}`8i{v@I9?Xm5tO~Ik~T*M9+SHJ>0T+9v^v%|&ga4|bv z%nldN%5#ZeA|g*`r#zQ3|JT)E{$*KAVP2lDDtRs+Kn9a2%5w!fT)_@ku)`JXa3y(H z&7dsLHPl|q>-E%LPi+siJ=FG4+e7V*mOQ=8;x6jpF6z03nSBfL+**S$n&kQIAhMXk zygW&ENQTgWR(b9qr+*mZ^6(v^hwl(Qzl)*;UFgRMCctj@k~@&Y49fD{&-43vem~Fe z=lNhShA;;98f32rs!@wZc^>5RpG-vLc_=2&UwD=dq8@Q1kisbP@;o+x3?@;OXN1`! z%pPI(69($gj1Kf+7~?2lL7pdT)ebb=lJ&Fp_OduuZ~!0fHe z-pcH)%-+iEj}k~>6nS|*ruJiMKc@C$YKsQyz2s zOwWGw>_^Xj^z29ee&p{*{(f0ZVP4*vDumF0R&-+k8BC%mFLwp6vlB_A<#qGk&3pH* z_c?jJ^zogU*Gr$5KE5;a@|~I2SBap!{uXqhU*7%4QIPjQ6A{Ef-ht#DNZx_uh4_51 zK+VC_{BTy@T0YnExt7m|41hU@Fy|2F9Lk(SnR948;_@EWF7J6LdWbC)vrNNSIy zHbQNL+6cA$UiU^4@*dSH@6joYA}?>W4Luk{R^DUF@*ZcP4$bI5ABHh5?=otaH-f%~ zlDx-P%X>mW-o`1+%e$gV-jnEAN&iavSF+p6UJPLj)1Yq^eXD9g)+(}Ak-Lf=R zvR09`nyl3!G@upT7(fP-D9YPhi6H6`m-l35oidIB7UYdZ5JM-D@}5?MFq*(_r%`{} z5XLYqZ%ebhr}OM|o}EE|oO=HL=RK2oXEN_B=AFg7vzT`l^Ulu8dk!`)PgSbV+0fOUJ{nKa{w86e_aDUUq`tED$+J6o*3Yy4puBhUdiSo^dc=`H3Zuwl zPTqSeU?GYYd4Fdjf*3lHL>f61upsa6YY;{g+R=+4jA0rjdGD=8EgI2=9t%>%IK0_ii4-7^vS|lK0(e)XK~ED&F^_ zpzdEe%*gveGdj?RVNmly0SoeOsRPfq@O%r;x6-?n-mT2o+K&-TU{>A_1rrg((1|3{ zVAhAs`nXBn|5PD_2DG9Z1IQqcIeCi}u)w?`^NP$XGOsuS<`tRuDf2#M-lxp_lzE>r z@6#lh_bKx}W!|S{dH-vm4$bI5ABHh5?`I40&etG}CV4-fMoHdn)u@%XL{^Ec5?Lj( zz9j2Qvc4qiOR~Ns>+2Xg<^84#A$hk`zn%K+)bF5v2lYFs-$8wO7kbLfFEjsJfuG^q z2x9W73L!M072Oy>29qet_uXNP%U98eHuPW+SxjMGzTL>#jhyeB@-5=|?iQl*aUbz< zAMtS?@$FfVZ!dcGX_ar^cJyKhW0*!szWoyN)y$wQpS=mxIp*XuDqw+3=d64#$!8AA z=dDK^^m$YASrNq0iKKk{bG|?4`;Q_IvVvp<$qJGcY?1H4R&>i3D$2+A0zSSM@Et_% zLF67p|3UO0ME^nb|8N>5`D&|Ci$=7e2ZP9B3iI+UsX_=1V8#+=EEzxslVIK<%sYg6 zhcNFD<{iSkLzs66^A2HNxDL(eK%abvk$X6~hm(6axpjPA%IBqgUdrdC%;E2CzNO4r z%ABQ>D9U#PbB+-H18WibWj9L<~` zQx~N!Y9WdibfF(3@*P`;W^~ARTuHwAYSf|;ZRo)u$gL-L8U4%XUq=5j`hPNsqI}EQ zcR9N>j3N)_9?#t4nR`5QkEic=`c6oJniHrwabCX0DumF0R&-+k8Iavb&I)o?kh6lE z738cSXGK3oFo9Y5ekz!VAcjsPkwy+PD9d+}fjTs!1AQ3AI12JL4a&EY?3HA%BzqOT ztLR-tZ?h@iDP*5QcB~2Q=*1AmFfHF{lJDpBh|AYP_UTdi&KN{izB31qk?(BgpUwQU zncvzX-#N_xWk|lZ1^LdW_k4Q!{>8UuUcL+Hy$~0T%hySEr-=yIqmw-@rRFl`Tt>#_ z)u@&4ic#b-Cm(kuUxMceo+rq-nwi&3fxhl4`K}$o1ZL&Cj{NI$m_b>-9s}&!(+v8! zNBM5B z=iHlo{q=|=ffPoO$DDk3lY2M0caMSDcQgB*YSf|;ZRo)u$i9c{d&o|aogzC$c8cs2 z*(tJ9WT(hZk^Q?0ScswpUFgRMCNL}C?*$VP#L$T(((>I)-F-a2kLUOC{QhnXfIS8| ze}Ie!$QWYI5Oao@GsK)B<_t0CPbK*tN+2cQFz+9(mhUe)`O@v^#Sq3Y4W2*7?8oQj z8>vD_z9;77dy?!Y$$n~7zNdNqG`l^W202g9pe)}r2I}PdYgWF$4P#us=Njevzk2!B z3ML|mfsD0etR-WNSufD{LNhw#dvR92aq7pZAE*8$KCk2RIzIFLijVJCeCz06NB=td z*Rey6nYk(XUTKwYVnn`I2f-QNjrd+AKTl1524(p+(X)xqoA|tm&yyKUqA1_%l?b99 zaU_t!DDs$-?~Mvrh@u5u=m&G(n82)jZwe+N@=b;1dz;L6nD-9z{@IFd41n1MUJJWk z*`dG=@3F&s)W27cxP1R=m+u4Se88M7WNsmImik%hXQ|&x{Z{I?Qooh@4@>fWRE=6R z%J(rnAJg-344p_KjU3qN#cKDnfK4*u|+2M0`_?#U+XNS*czz*BkVH-PqS%WZ|(2iaVVGPsq zea+c7%=m^G-!NlG4+fFNlziVdq79sX%lWsQf4l2^UcQ}GvQ(1wJquB^pbPyN!31Vy zRR|^`vUaOS90{akEvf+hi|AiO|04Pq(Z7iPMf5MCzmon+`YY+LjG+@rq>;l6%CdGh zP={u8pikBw)K$?}MPC(tdozD;=I@=5Roy6SzpyMDbw&scXhk;$kdfu$vssN=S^WPV zSzhXV(r24o-Dgm&~|NEY`Ti+hfB(44G;D_|jt7IdK> zBbdOftR;M2!sjJ?Uc%=?1QQX&WQB8>L0Q&e2I|m^4)kFd<6y7D*z0iiIy{Ufw4)b8 z7{fG5vVK&JS~Q{!Js3n*)>7(^r2k0zkEH*o7IdK>BeJ5MNFt3K*e%L##~5I@W17){ zJ`981j+?-&ta`yj1Tm1sy~X0*VlAU)88yr4T~6Q7aCXA3vjP@m zomeBQk=GTxt_aKG9$}qC{mLPXVHzb_tEy3pMp>(=ZSKJ!va(LG5Jd~RWW}h9Q5S0i zbusE<)WxPSFYC0ltd=+uvQBS6E4nd&3?@;Obw(wEAo~om&mjAZevDuOv$EoXi3noo zL=w!1=P-k^tTPSNp&1?M!!X8Cz=Eu^Y7mxnwk4~z0j=nkbq@2+Vct2+J6E!PnZl^7 z^LRaP*J~bgvd*sny=&TKwNIlY>sK*!%DRyE7xl=xggq{)Lo?Xp685+>D(f;65m0}5 zC4#6&T-KF5zp_QvRas17Ue?uB2!TDjYh_)>>vgTN_?wM&!?diM$h(QWo5;I~`8Oqz zmen^T>o%Szc}yEwb6BKkbQR}+R%eRSt)vdKZCNY`^X+- z#)Abc$ogXq!e~M}dS(5IKJEk7Ln(|Rk2zVx6|fLR3%byc5lmoK*29wZND%digPcdm zd4!xt$a#dEG&yN<(&VJcNp~WNG;)|hS=OTl>d=f1^kEp|C}2U>V>Jk)3GL{`5XLZ# zlB~z8QHw^j$$EnKPYEU>vYzJo)0{oc^S@fM{uV+5TG5RGWH5=MtSry7JkRp{`3_ls z56XHmffPoO$DFM33Xr#s+;wf}!634j!n~~YRUmIYdF#nr&%E`_ThF}p%v;aATqT&1 zt4AEn`iEd5f*3lHL|WDccF5Ntj3%_B7eg4sG)l5IR-+b;V84w$7?d^1E^p*9C+jUs z)^xqB&Ghgcjm38~7T?iW@6z)wJ@3-P-)O9NGnhnCR-qC>&{tsJLINp_g4_bR?^S^8 z_o8S)7y2=R3CzlRUoa6t44p{I`d3-jzdO)}VOg_TOkrNu)+$+Zb!Y}PbJWaHGdGR` z7G(WrMAm=V;WKvlj2%8>hi$yy#`|r%-m}j(_Swch+o;`^!wi`Fg#q%vApZ;Uzaak$ z^1mSe3-Z4pzf^-Tn$V733}Fn@D9QS=8ntLd8+tH^EGAKu^;IQ;s7D+Lq%ev+=45?c z0Si&IpbPyN!31VyEeIweh@lfnq>+=gBa9}rqZdOM!!+2nT#Z^Zq76M5L>5z+m-W9Y zgwTLibYlP+Orj|3+e!pw?Oc#wH3*{#?dZi2#xRYN{NJfYEgI2=9tt*J1s=ff-dx91QVE*-zBh*i+x<|gV3-=ich)-s-O{U_t&R zH3-XpXbPiX&Y{c+GbhZPFmuB69-fhZDcMWOUK#`0OUYhJ_R<_?P?rA)19fOZJ9;sM zF-)T*|B=+$rQm_SPY6=~!!gR=ZTHBg6U z`A=f6rWSO`zj9XoRm@z?KC6TBHdcG6$U)?AFHN5Yp_gc=c9YhvWn3w;$Dum>}o|$|v=I^OP zv;4owV^01XDqzWfV;VWkfZASad#UZEwwF0K2T_kW5=hD4*Np*WFo~l4w^oAM+oJOS zwpRXRO#a)cy<-Fun3cc3M*h39n3DgVe))eljsh0s|2@xsAC~{#PWcDe@4gE8?K>%-LF)dP13UkzSN?~nd8iJ}@(-{M5Aom$^|4L?ty38=x>)Cox|19;-QlG6v5S(W@ z&vKsKbxux}oaZ~`A8SIp{4cQExFP>blPJo+j^1_juA_Gyz3b@B)uIt?=#l@G7|3`f ziM0F^(1wy7wXWA4*B2j z#sD(%|Ennf2YJlN|L+RMn^LDVBI|HssS zO#R2ye@y+y)PGF<$JGBPiWYRCU;a;b8Nmc*<)5c#o}PJn=INQIXPz0KGvjk+e33v3 zqw;@ME&oCtn$dwi3}YMxEXco|UAD8!c5=6qTdo3UWzNc+eY*?i-!ku8=6%b&Z<)7~ zc{_s&sGz`ihcKo5u#;&g z(@rLLo`9VKuUp75Y&aJ z3vm|ObvBAT<`g)n0v4iZK^OWlf(bC|V8KL0fhE)~p>_$iOQ>B!E#EfoeD(wxgzc8#Sq3YjgkUKRV(o02DG9Z1IQ?FY#o}>0kV%J z`&hD%EhtbQRbUx4%O+7&V0jG8S)N2%f#c^CIH3X-s6BzbPv}BFMigjdho8ogP=Mc| zfhNvZvD+%nSB-()R+SW3U5#1=n!^g5oWdybApaEdPa*#l@?-TNFGgOBx)^ma>SENL zO5JH>pGNj+WVgi7sle&dG;x$We(htPmlutWO* zGMGeBfeR`TL_Ok2fE_OwMILhs{Hg*LqG&-E`Z0nD%qnmpc^$iuc@dcxSECk<3S82z zKxavTOF6rgvr9ROw!rNewG-FMaosaUU7?@%|5WXhsM66nG$sG;)|hS%C))Q1>8pLqP@p+>TxhDe!P! zfpi=Rq%ewIXLAZXS^;J~%B)A3^=K!^f0X=3$$ymmN6CMT{Kv?DjQqzs(1&4+qkshk z9WyEv+S0oW^Eh^P`j4e zwbZViQ{aWL0^`gWXT~@)*4HWUGCRFI2zGjT3iArQQU!LJV5bS{C#avG{#9OI-SwIQ zvp4d5BhNQ-zLE2doNwH9&Q6=yX%jnbsz)3Nq%aEh*~C7tRlq_NE$BoNY2+}2vI3I^ z>d=f1^kEp|C}2T>*J}_)6WY;>A&g-fB?aE7MlBlAhHeZXgGmM63ZVh5;MrR|dy8jp z?Rr*J;O$BTQI9whNMRIt%qj3r1uR6-f-dx9M1g;j`ECuuXi}gsgR%ne84A4Lr@%}a zIR&Wu#MVn)NZ48TRVC&1oqj+K3}pA_n5#}wP-{edN7Er0^b;5#y8CP zh8f>5;~Qpt!;Ej3@eMP!Gh;h5wliZpGqy8hJ2SR3V>>gpGh+ucb}-{x`oE?BTl&AH z|6BTZ(!Z1bolV;RJ0Ucn72VqZdoAcfKSs3w_v_G%4)kFd<0xQ3`|n<@{rCL;6xx4$ ztMmEC@%OfFilXTEsOiX&JIS5jcc$o$vT}MRsG}&t339BnqKBYoE2|@{=piV|>4?du zh$(7nI_l`0IHw4L+TyIX9D@%b+FKeF7zXfNfc0)y|xxU zgwcrvQkcLD7G&RJRQ9?)3}amOCDbjUZV7cusN35>3!>=75XO+hob3C|%f4?FY-mPA zb{ly%@@(YU@}OpEHOR8ZkwgYr6j71gs7E8((TxF&U<$KXl-*GW3vK8^zwB=M-1NEW zbJORh&rP43J~w?n)_kn_So5*w+rCB?--p=!WckVRljSGNpT;B#D9awGg%4qLB7qbp zFoOlzgEcVGikR#n&JyA*A?Ajddq56zvNu-2hGs<2gF%d98YS5e6dKTk4#bf}23ZtQ zk)7{e><2ODAm$v@g?^+li2};9A6yF`!stW-DNJAn3$i!Wz(gxz=)^3cy6@w+-Pr}lKrq2MA0jIOC2n4#Z_Yf!7nZzb289y<=YXld55WbDhMwPU^)F z#$-Qb8YS5y0$CBVcrLW_TxgGw5g{XzMG+O*SCJK+zzh~-KVtx#?+ng&#;okC$yiOs zYBE-nv6_t4WUMA*H5or=*4Z^MW#?JX&aR=*_p^32XS+I%BskkZtL)b@ z|62C1qyBp4TtA9w*>7adjr8A0|BYj^-_(a;j3bYE*>A3fffm_snUeih`fsJ5XD|Ej zQnKGc{~h$-LH`{&%*mdrf=%{2$^ZQf7G%GxM)q_+cn|4G6lDM707gLWJz;br0dnt| zko~?k*)#L9-_IHTM9-h-87-nB`-Ampl>MPuEXw{!M)pVhFpP0<{>M_70B3lNGdy0F zeWDgVFmHl+6U>{SZi2cA>Yk{`{$xEG(T;8mfO9^{IiH-xqU@7(vOh)t#sbKFn%pU} zo{6DP_D!rko0NSE+0RXay60GXp1S9m|2*?wAnQfW{qnTzue8ekT158O@ei{9VaZ;Y zll_e<*|+lgPhMx4|F1a6{TF>ja*APajv}+)Y6ksp^1AYUFetnLsRyT3bHRyx4`QsNo0^kQTFl-7G(dNo-cU)vIg|< z9fO_k80-~8_OHt_)FtD)ri`jV89x|94s$YgsFG35>rU8ZQpRoxq%eUQ8N2r*4fb{~ z$k?-pij2B?G@>2d7{G{(C0#P=xvuB>he;VfYDElv7{)mAn3uud35@;7u`$!eOxuKv z{SCArie4E8y-qSs&TWp$@GQvi*1(hzv}9O089%1~$MiSW!YAXvIT;64$!KavHwM6Y znxjoVw__&b*rgcP2E}4b@pNi zW5{7n#xJU1L$i!u*2y@h9*r{2v(P4EO&m#Nz= zh}?_Fy_np!H84Tl+8FvUjB(^;{JKlVB^_YKZ>aeVHT)iHT-F5EFJt{OW?#na%d#@o zk)7zq07hh7N!^vyT}j=Q)b&ru;ODNvchSZG`2+JZ)>p$oi;Qd8PckRToa;+6Zjg){ zr!b2}8H07O&<4(SbCrxC?uWP^;{LXNq%nztjNeUzoZHE{opayb1kQ6i=eeD8+!>RR zW`5d0i;TOcWZWA@ClW}3Gu=Cb1sV6VH(CW7nq@pR4BpE_dGKETT$b@@EqtK%QF0z7 z=TUMVCFd`5GM*4P%M+aC3C{9V0rYL8ZzFvh>Dx%(M*60xdxrXFw!c!pX;DVD4i?&E zY@P*cTUgt|+7{NfbfF(<8P83~$W_CT@e(;Nk&}<155pKo9`iC@p^o3pjMun-jr$qy zUmwIMrcsjdj|CZp8klGWSp~8RWEIHT8kaHKjR6__95(nlY!taKa{pEy^D^G92IqOZ zMMkMn#yhdxGD4;CI4z=(hj7}twlB1gb9ogTB{hip~ne3g(-kI#3+1sU6j@|m?*nJAKSd?Rr zI#_ZnVcuTs@jHft-!U9NOv%xZlw)60j{T-llEWr6$gwmB&bU7rcIFw(GnnV-KwJ(p zD~Eet4llF4%=VM(AI3QHU@uTDN3cx}YXqDpM9u+YavWGE$3gTQ#PvZrFz4VZ*yL!k zJ9s8`G*4g#tRKqyp{yUu`k^s!hQso5w6vpJj>B_uEFY6& z1@|ksUoimAvVya$;C-#&-{xls`w&K_97nN#6#M*4cknaaaa=9fKaTz5*gr0T6gbCm zoa6WwM9~Z06W^mcPHaOL`jN&Y3Mk8Q5_>1HcM^Liv3E)hOtc~<$Eh|nBZ3|bVieOT z$#I&{fF^VxjwCY3qKJwdtLo7xM>H(Q>77U*CC3?@;|$JmChzM^pB%9nEXZ-z6lSp~ z$It6vp-qm?J~@8D`Y%}jWecKmbkTDzz2}n6v$ca~YX{HPj&mpE=&q7u4Sj36&@adN z%({SC7f^oz^%t6GMGRzLIE-=RF)zo(toJZ$Eob-@dwd`2=#3+Z46-PqBF825a$MSg zCUk(hz8Wy2j~RVrtuxSqD0(r3G2}2OM}pofrcsjPO3CqC_O2r9DzdI(=2gtRikVk2 z^D1UuL&h~^TtnS8WL!hWKox9gMg%<=#3;xfAbUO8>pAOs=B+1xJ^Aa&Ur+ve^4F8U zp8RX;(TH|*%W)mKNfWJz$#H!b`jN(@95-@(BiH=S;NW)#2fs5oZjOR;-po0NSi6<8 z-pW}wkiCKI;R!izZ<6CqdhTTZPI~yg!I736e_;KO%oOP^Pjz34_7$;|(oN;o-$r&eSoSboT{=)pfG@%1= zIUdiVh>9E&^>RGH9-pC(C)j%;i43TDf*O8LaZL8gu`z-kIi|>(qW*8}{f)h6>d}aH zbYnn{O;I_rDNJBSj?GoDp&8_CCTH^?Mlp?&99x72kiDe?oMj7V*}_@2aF*v<5knt_ zF^)Xu<#?Wq9Qir&bL79sIbP%(FOFbJj+e=QWloM6X3Q{Sh8Z)=m|?~YGhUyO;~!yk z%E9Naqd@LfYPM3dm71;8Y|S8xq8zg^aE@8dF-!d{^|PGg&1x8EK@`0h!WeSk4F9Tv z4V?8~5%kDWq<0&=+vwd!?>2h3(YuY_ZS=m)+_#IU$Wf|CBihl80gPY@vsjelojO=( zLl^py#v}?T%kge4duC1sj?X zkz;}TkLmk(UXD-6_>}8Uxh_}3KntSi1zGDM#Lx%M@dcS*^nkiAsQZGt zFR0^r#PKC(`-+;cnDZ5LzG6;=Is8uOs4%C(oCFojt;cjmfg zJML?^-(^wGUF%@Uxm#Gy+6m0axd-$2VE!J=-=iewp3L8q`E@OF{$C2zEh(ZRXMIf0 zy~mNqyqx<)iDBShrQnxs=SM>>1237UXo9XayM_8=67Crw5$D$9;gB z05w7Keq1Bx0R@!ht$T?d#`iZu$;}z zZYJkYp#e>x=g>Hka{iRLhYw&x&gD~b{*3G}=LxeO<~(7}A0{JA#!+M(P3_Ut9!>4h zvvRhv-^P9$`^U0>EHjQ}#<9#emKnz~GfX0RaV@ij2f zf+%`1gfZkWC+7)Ou%Q_d^k5L9;7liQrW1t*G@%1=B*B?ZK-c{7BqIVU&tLTl=8>KheF6Zfsa-PZhnXIp#lJn=>|6)PTvuj|2 z?6YGa`|M#kySg!e5m4VX3wq9}gM~J9p&w~XqJXlT=hni9FglSyO3rTPtzq68=B;7g z8s@EG-WujzU_&z^=)oXHF^!U(aiIZC=s+AvWROJ>6*(`gN28oQy!LE=ZAUi-FoG$} zqAcgyTKEt~ClW|u0y9{U^H()6(TW)QFpP2JF)!z@t6`u8QS@R6W5{7n&PyygFP%gI z%(J`>0(vifNSOyj*BN6FLx=^9p8MNzIki^tYi)&Z}!+$~nNf2Kq3Jad56{ znU$n3nM4Lz6j71$`g%EUjGzaDAooUcZ)El$vj>?y$m~I850WuR#x2dD=N5Wyq30HQ zZlUKEdWPt^bzaWfs$rl7QS@R6W5{7n&J9(tfxHdmZ6I$0c^k;vK;8!OhRM4L~&J43M%*rq;!>mj{(wGEuGt9l8x%V@d?@^rhGxvVx-p}0o zCoqErIUk_*0cuC79i?`Z+EHppseO>FhkG%EF*zS;Mg%<=l=IOdDsqn3qY>@s#sEg- zJ13YsF(Ky@TtC6}6Wgz6upsA?H8ACTiu|X@e~SF4$bV`S(581s)uR#Za=yUa7nu7(41E~J zIP#d6Ggl1*Er_BQLl^^R%gxF8Vijy?Mg%<=1ZR738YMYj5*p-unckP_eVN{u>CMxd zr#DY;p58pYd3y8o=IPDT`wG3U(ECagIuJ(^8DvpJMb202(TH|*V?fT=Mlgk0EXp}k z2McZJLO;@&L;+-8+8j~oOQ%4oRe#(D$ui2vs^Vz=s+AvP+yZp5f!<1otCS1 z6uj=ij5^kq%wR#Ty=q{B{JqHEi~M?O>N!U}=h(Yit{?VdNUnVwz%1JUMlgk0EXuXC z4i?(v+Ml`mGs9kwMzqW2pwH2PIFiVKGdies(C?(*NxzeRXBYaB#v}?T%jK$t4`Fm7 zffOb%g9W+F8klHB41E~JIP#d6%R>&|0lK_H7?aCi2Mf&hGuyJE84>hg5TlqzNvM-H?w|N4LH|ft#bXefU;aIweZPx1hq#{ zdjz#duy+J|%h_Ab-tw?qtrfYBtcD?1nCqkJg>()gJU$Glv>sFv%O19F{P15>VU z*1K81Acr}*;#FXFoY`?^$C-T*YZtM05o;H**3*duQkamdm)G9yuQT9mmymr4*_UvR zOE||ReHaGkxP*C^Fz>Q%aE{AHFojtx%C)WzK7_%Xb<9~u{yOs4k-v`o%gMi-{L9I| zocznlznuKb$-kWZ%gIkv!$1q7=*1Amki(o@S5(0!*Oikfpe)yKYvsDC0Zr&YTrQp& zT?1sUCv!cS>&aYC=6W*MlbKA&bz?UM
T5xH*dLO;?V|5oyECI2?^dA4)$Z0F+H z&c(Bxi)TC6hLT)7+qs6BJ=_Fl4>Nl>i43wRq9Pa1c&+Uc*kw8kWjL-n)W|*6yHbZTO+6;3a;Qk@%`Hs)^2)&PRJsv?1 z1~H0hl;nDhtjD`CfDue#7K?IC)WJdd`0{&r~j+sa!l$xp<~>@l55~977+-+Dz7FvNn^og{&=PZ6Rw5 zSzCHBgfZkWC)acpY-mPAuIJm(g?^;v;#tSVvySVhsA zf+@^mQRYr{u+WAs^dpT)6i}AAb1i(}96NU+ffOb%Ba`O>b656vWq()pcN@YOax!;s zmRZN%UcBxVK@SEoifNQ&?j4i4j}6o`FtdS~`;H@zd71lF!$1q7GHqDek2EG_?mvq~ znf5wZG7T~vLIax6fjE-L$aK}nG{=yW>0z#?S*CXe3o?D|`AoDThCZ4837Nr8B#@G6 zQ5T{vL|urw18U(z7}Om=-2v1cK;Hr69@r-Hpe%|qo02m5EH|6m(TxF&U<$L~eH=#C zPlqsu9Oh)URKbR3M9_mljA9xknTHDvXhH|#NFpP1c{iA~oLS46wVYYYnblecAHwKF z0x3*j1`9G*)WAe5V(7y##*xRo%%4@mKntSi#Sq4j!<@_`t6-BEu9bOIBihj|^Jwah zrtWC!+G=DTOa8IsA4~qRdCbdPN&ZUmSCW5RTITU>=#qH?Jss4Y%-K$kf!>qpJ$d^Y zy(iPlGl6*;vrl98Y0WbE+&B5$H&>NpMkVu%Mzo_F0~o;+X0a$UmX>)|KX~n=u9Ld6 z={cM0v$tQ(X?f^nG_hGkyNoVDbwC2uWxYoqAJ5XNNwx&v_}kwF$kRAlznqY-5Ea@O7fFu#}i zz0B`r{v~y=!2CKx`|UQ-1dnh^n61MFSfj&2OdOp=l8KpaV#H;{J&H8;?I zBmFnhek<5FUc^~=r zk$)fg_mg`+x%ZQMKe-Q(@cbC+`3!5%u=WgVn^@b#+9ux5rU;m|iCLSNwTW4qn3ZK#mRVV5Wto*_R+d>= zW@VX`Ey~<7g9Vw>H89bN82V&BPxcG!zrcQu{g=pkiL95%dWo!j4xHr`&hiRpd4>8{ zILj+N7?jEPH|FbOpza^rQTs+&=GI#H5Jo2wNXh)?IP#d6Ia@9B&29{UoHwUr{<|M( zOrij?ieweZDw4I0zPIRm%RmdF=*18?$6Gnf$$YyCHWX#P(}!U&`@I^NXhlrs+@j3) z>tLY`UEmDwr@4T$^D&K zEXw`eI=R2sh<0>iK<@81$h|`~474DMUeLG0nA|(I%DrVM{s=v*URhV z=2_6aq7^apVHo4cgX|+qavxQZ`{;VPkKwvaa<8OsrG++hf%z-bn3TJny>|B6*=uL- zgc>m81ZJGTj1!n~0y9ov#tFh%c`kJG zTcx2g$c~aeHz!NaednMYkF7FyNcdb^sb_J6}_wIT}AII=C5LYl=)HSN0}du zq8CG8el&+UxlgZxP3|+OiIEp0kMEY;tCPqei=y0}b+FKeF7zXfNfhKho4T%U49I=% zb|Z4HX+j6$Aa4zM7jU)<=HGZV$OV5~Yy0x81 zAcYCcU_tI*)xbn6V(7y##=*=>qUgmC#*o9D+?Q6thGs<2gF%d98YQ`ZBQ&519f%`| z46-PqB6nXs8qqHII?l6>^Q_}M>o`w>y##v+_7dF~zzC)=i$%GwsDp(zbfF(&UJ;?oFHwG{w_swM9Lgp=G-a_UrWZpvN zEo9z8=B=}G53@ha{_m*0o$D0YDKb-JrpQbUVGKFBe^34I7v<*fn(n(Sw4n?ANMjNO zl;uv>!iO+Akw6L)m;v)f=pCVVgx(Q)N9Y})_a1uhq4&NX3}O`1D9O!tW^TSSb7z{+ zfjE-LAd4a@a^GK%Mzo_F0~o;+X0a&upXy+t4V+~(A~*jZo%^8~EXX}Z%_G!2Ld_%8 z@V89&I633wjFU4?&NwxXQS%rzk2C*?W{~ql4+iCaioK`Udy4+2nDJCU(wLNcXX9nSD>H4L;Mie3z13^}>ynDajK-)H{&%>NH_K48uV7TV3tZx%Y$@3kbJl`##EKgNJo*xX$Q{9ek3}8f_omvn@uRJwX^6b(F z>UJ5IXSZfV(1SsFcAvs57UkKa4i?(bg?@SJ;_@sZZwYzz)$;tXQJw}H$Y~&_ft&_% z8b&cK&%X8Y@J!{|Zyb5d%VVR@W`G>NU-Q^{F@!PXFelGa&bgG_rQ|LpcPY6`$z4kB zQgWA;?lUXkIO!iFn+}yjF?Pj){+1@eaFei_%3N|z&f*yGShCIO{D)NM)@*L11&w*qe zNY;U^V9tSk7{<6f2Y1Qy6LNk+&QHiWg!)6`NFpQ8VPqWEiy<)kFlHad?4Q!}Q+f`k ze>qvp$yzapQF)G}@5n4T$B`9z!u4oGyF5qbF)z>2)iC5ahW$47+t_boe(fpyy0_&ZKAc3>M_+jG+(17)KuS^8BJ223q7fo4l@OM9?G8 zITN7&9Qx0#k*7Ne&ezTPx{IjDv!))6p!a;{$D7b0&xMmH$a67sFJ|t=!x#s1FJ^8J zbJs@Eiy@35hdFtERRtTG5kU_IF^XxF}H@8LYZ=6siI#~Cl-jF%Kqk>}ES zG@=b%=tmlpD4;CQZ))K~7@bHUg$c}HL7u)Em}o@|eHg|#@|c(BvT7J;k!RfqrZ9^| zc@iagt`Hi~gbr}-E0V|{iy|uWTv?Asw4)mXAn!`@t|aeD@_t(f3vK9aVUVT>b>d3mm_mgl+*ILGy4$YD;N8>(PKGa~50pgcDY$a7Nz zn$RK7&Gg(%&&~7<4au{Cz76#Kt`iBQFo78?$a4qvcN%Ds=lA2t%ai6cz5SK*{Gl4` z|AGBKMCG}=6*2UIv)@ha-PGPq?Fh9a)Q(U)LhVQ|hQN#w&NRZA?x}(e&4{2!o=g)u z5JwUjWKqPTJoneZLL0i!k2EGxKv|wY)xw7`I*~vM6PUq*JP*{sL@Q$G!!X8?$Gkib zvi2Zr53=?kYY&t4Fj)_i^)Oj~9zzau@;q7v8=4V8k35ehkwI3T$LW8Z%!z6kXh9Uc z7y?;;okmHXCxixho+N|s=R8l2g1wD#khzh}jb!rwfO+_Tz&uaaqfwqI)}~nFZp8NXTa<@q zEYI^6+T?j5Ay1CF+?+fwMM3{d^uI*^ORT@d`pZ?Yp&1>BBZ&;MD54@yz8;NeM>m+A zXLg?1d1mLC{R*>RVfHI+=t4izm_z|(d0wrB4`F#;BWGp;Ggy%4?@j1H97%Z!t%#uy z!x%>%^YXk=Ezj1JJhSA?cFOZ6=X|pw&%eiz!<;wh&hA#9Y4bEI&Kv~|sYvDr}ok$>s3Cv(Y-XGS; zyU)11KVt1ito?|!{a|C=W};PIdlhW*It{cSie3z1OkT4hueTq}4+stNTI5;e@wZZM zh^!D<{H@d*iphIGkGuzUV*n%a^4#R*xyk#J2-s^L#3-gwlJ`(D4<+-^CUnT#QYY_n zGMAItIw$XnDtV7&PMEbYYhmVunG^2Au)Ifi%G)-DSuDzX9R0^xXhWC0Cy;qU97$x5 zMG+NwPpp^sqyc$(HuCap8U|Xx-ns0Z%ig)$_i~t%_k4QKr}z9OF#CLFpU?Tu&w%rtUqnUT3+m;KGw7V%Nc$}&ZX>K%HE~yUD}C+yqA-4IT@Fe@mn&kZbO&6>zT7YDQ|LK-s`Jj zphe!B=)H;Fo9Mk|Lf+ekF^;^vzuS)b+o`{u`rl7s7K`%URR;^?^PPhCu70F3iGsX$ zlY2M0_YPtd(ynm~MCGWH3 zKTH0z=D<2}~qs$i3M-a;F?(2umdABVw=kC{w0BhB(RkK#TeXWR!d^^_5w@U&kOkf5J^6k-vF7zXf zNfc0)ZwY(*v>=LJ`Su&a7;>1C&&ez&vz*LwGRw&R`#2=tml4BzW)rQ<%k~d{;C38gj2; z_BE~Yt@Zp zIH-T14i-4y1Dx-HexxypS&%W>fM!I|hf&PR_aNC1c7U}9N3ba0L*zU(h#C1FCime1 zl;j(0#<+Zs80ZA`kK|C6@6Y7?nf*Waf|^I^dz2aDyqCYU%l9~$6Z7)@H7nl})tCVH zPmakq*#qh(InPr9`A?C*k?V~qOra#-(~aoIjC@nnOvS-IKP!Fwtn~dYf@=Cjm3JBkJQ_|DU}c}%`7)Nbhnv!;13(_~E#qafdN+&|ZXE=BI|2qxH$p77O`M)xul&oiU{hXNV<^vT~4lmADo?aSJ}o<#&;3b|NjmI}GYPEnv2H0G!dso{J~ls`nx zkDKH_fV@V@e_$2pJ&4?cTaot{n0r`(- z4$p@E6PeY)*-xVHnE zv%i|2vut4PtXcVg-hw&#JIVfqi3$17PGLd*UsChSocvu)NTVYEIWhTpe)OML1vd+)Se?bF=uqc1L73^Qg{zc?pl$W3H#QYbN-^2A<`qwh!R|W=AmjBmX zn3lh{4)paF<-dfyOS|R&4Lz5Uzpg|6%b9-#>sON3-z@(%jqTax;|K=L`Z>>TnX5_!E37p|JdNd+w^8Y>||6OFTcl>hOH{C{nh{|WA&Y?ObJb3bK*c~51*{>CP7_KkxeV`EwV zr>S|GwWq0@5@MK?|8G^``fnrhKg0Sn%@~q@Q(FEkdpu|Qw+zewT)+JMzdrt47=2(p zSCaolYF@Mu#Q-YuzZAzf=H-8x_x^G#SbLewybUS&U#SE2uN38fm5f(8->Yq)?p5ku z&CCCqU?GMO)@sx5<3F3mMGGUt(5i0OY=7f*J3O zq9p&j)V|w^Y5Cu?K;0Z`bCdG({|x!xPar4%f4afie-`EcpbN~I=ig?Y^?BAm>;QEi zk^NCw{{M2lP>X(W{V{WS9`=9C^(PJTe_DeP`OCbY@{Iidi=!m}XRLi*hX|(R=Q|Al zVjC9Z{~`wFe>o`sSLA(_l)n-MnO`@e4+Z(Z@nHxh1yoSrdp-rK78LkFS%Kp@7#? zz^Yf^fFT7A?owbG`G;|R_>=;zWUUxg;K*48+FBJ@*{s0vtamIba4J2gn+n9D3UnF@ zoE=x-oPq*tW)!%nQGuS40=-QN{D!Q{slC#sKtJ_Y4J&ZXqyp=E6}XPt8}bSal6}*n z0=F>dR$e#YckHD&8oTF_$I5M78Lw$QNgM~1$V%X?F#N3S8$h61@}lQxFn_^-{k}w>J;3! zM!}_)g8Ppv=*TI^=W5VDtDx1S;E!25xKqKOL=|k#DEQMh1&^pwu$9cPq2Mtc3Le{~ z;K~UF+nIL)YaLSXq>_S>Y6VYa=4mquMk5NIzMvqVSHT#$tNRo@i*s~R^NXy4zid&E z&z|79WSz$u*3>G4f>-j|&;8Y7 z3JxR`Tu(2b4Z-Uz1#h5!uuj373GFdf1Jd;f_FE7y}RRJ z&fV;fkblpxg7@|*cwZ;TypOf}W);j-f%QyT!TYK=$SOEm5B5f<6nwA_ zU6@qxp<3{M9vTH_c(@fq3jUc{j}0pLc&CDYT~P2z?)jVv@);7GDk}I4ubT`7vr_O` z@}6bZX0o@CGfmHPQ3appJ-lFn+!yN=e2Mj!!Dm45mArzl^1fcHDEK-xd^a5AnK<~5 zh=K)b-)K^h?;3*t`RM!T*^Ge%7ww=c5XK!TpzM1uN`- zP3|`fveYZzEf1z&W5a-8dxTUc7xhIbF%8H(TW5nW&K|*TF@nHNgc@JdDz;E>%FMiYfe^u6>JEDp8Arky=%}2 z>i15AwI5RVLjxV?#{}kO?L*c+)a=9iX=p_TC0RdeM^VY z7I1bOXIVNXYyT>Aqaw?o-T^0EoXsrDax>R6Ba7#4i(iT?|AMR_Gc0mK{jz>cMkD(N zb;&xInN3+)%b0UWhpgrSS%=c|)3B@-3v;sg9I%c^%UV7xtCjb=A};G^gR+hsm30*N zM|0m+E$dkBS1!nE$MHB}TGolZvO4HJxmMOGmaGW(r{c7ftW^bBrw__HgBh_2S*t6u z&Ki>S^B!59?EQlEv#I+fd*_5@ojWe;yjfXmc>m|)0-vmSQr1PhuZz27ttIQ%5m|ia zU|q`l`3?7dF#8?roRF z&kT#d;aPtgl{HG{gIqr>S!1oT9vMMV)}NXCXJ$T1&v>1z$Jl?Y0a2tdFY7PN`%4Uc z$Y5I5#xlC>nQTFo}l;17O?&#=bkh`-6R=L(Yukk8^f5A^|Xm@ z(DO9eQ}j*sU=Rgaf8$(#YXrT28<+JA_0J?^ZK^@1EPf_gS@N?3n2_~sHJHWct@SMD z<7buiY+2T3=58i?a}>R@wotc)nl1CPremP)IkKOdl=VD&&$nV2tUtdX>xDR`WaVt& zY%fytVh3hry<{PQQB-8T+>9Yi%gVEt=REmwV^D6USrT^7MS+CK{ zbFlSVN!AQ|Gt|$-k;c5N*E!egT>rfmT_E!xoyZ`EvMhe4T7@u1!Fk@G|BXpmTTPI+ zH4E1N=|ejPFfVJ?0{62iOoN&?JJ196|J4L${cBFvziSXdKgMP8oNX1kFLJ%jKp#r7 z-s(jb3$os>M=QvCyCADXU5V=wdG9oW_w`Or*1OcaOaHs0pzgg|Q1>4D@3H^hqAZ@V ztvSv*N8MZoGqT?24DUA~4%Xf;%KA?|sQb?Vra&*2dvFk!9*0}vOe^Ij1Pxo zeMJ99%}8Jb3$plZvHr{TLLIun?2pO&co6h|T$1$(HJ?n%`jp&H+mJ;?R+;Q_C#Gfn zuLflQkL>@Ap)Bh&1I+%6vwcR+=gi=F&icFuBbbx5$l78A{UB$NK0eDVzVorZ;0#|d z_Y3O2WY(9geVIW~)>j6i;QlM_E9~<(O{gqO4F=7lsu2zR(M5zF$=62My@Q z2=WT;U_(1Hm{zE|8T3|9D6}KjJI0X2tU^1PNPz2|+du}N)1jIa=-s6rEr?@Ap7ASM;sqYjOTfivter_i2c?#cb0WY!50aEAZm z`u}|B$GAdExL?wNF@^TBp%+Dk>X}u~8SBdm?cD&*zBe^{lkvkwP{-$bXdl-1Vdg%Z zx1kwiHn9F9dVbUcdiJdYJ^RLxK|!JYEVLtw1%+%)m;|$z)}RAvloi^ay8WjVvezS_ zkWmX}8N3H$6tfCBTEM+yQ6XmpoqDCFkf&>cn(IG1}yA&(Dj zpx;BkmpyM9+^k1gl_yIXs+(tZMXO8oU?&{u>Gv6#8*3 zTEO0q=|6z`1De790c0L92J-m+FVtwD9h{{x4RRY76gsd0tQ|Ond4&$*{vhrT%7OcX z$vT*JG0%JI2ABBU(Ym5&T;m!HnhXEoa7Z_F4rpThj`y zsKNj^(~5#ZKWj!eCKNid2AuIo*25Nt6gtWPSw}JFs9A-MriSOS(9tsr9aE1a78GhD zr!524k8Q#j<`h~<%}UO;lD(BBg^mlO2U&36-iS_2Ds;SsC`J`Jf$I}GkU(Cc6B`gm zPN5EFbqrxqp_2wMuF%O<=)wdl3Y|jjDN_nXI4{qHp~wiz3Z2>wu1}p&=rsOaPHRUJ z3kt1b#wyOYst5dAtzy$U2j(GrN%j=ZV?CeT?4K^sM%Q`Kzfti~h4X&sp@JHKowcYY@YvLY>rg_G4b5 zU-Th^1%=M82R&zxg8W}Lf$Lv#-PHkdy68El5v-q6Qs~?|L@|ttLg%%B`}5M6RH$2M zKn#7Lu6rDLh1O8JhV?buugeOZ&%ej{32>GRYB7LCh2r$b)5t1xA+s-xfV~T66uQU< zt}mkQ;&x0Z)YArL_Y@UcTMcT~Mlq$(uPiX*SIql$3wR&D&MVX#2J5|JAor3Q#8Fh} zQt~eCMnR$9RG|rjU}j%ExbCYcbeReAF3T&lj+%9y7y=oWbALJ43HlS9CBb{SB7*I& z3kqFH&Xuj`K|!J4a{XKC`#FDq2c|Hu&{dsCgBe#b^Xf(ngPg0$xuyZUmutwmhPrEV zSX5}hKsyFN)&OhkEp&mp^~}7s7W7`5zy!#Ul3A_Ke zy66A#|MydE9b4Plc3Nj!TW58)&bG7doafKBwXIFIwqxsRdYjb@U!s5Sym>Y7?EdCqm?Zy)HioaIC-dg5s z`^0}!4A^^9z4&jA1LK>?cXN;UZz1+AaRuvOw%@ z}_2?1*-SNl< zv3GZ3Nc{JZ=biwXK;CkZm-t_BB7jB=iT}lPR3L<5@wca)_@pr_5eI0e^7ym0>l!6?48Sl+TE4s!1Y8C>Z=BtC^4^bmT zjSw|LuZfa6Zaoh1l~|4kn{K>S-SKJkA-+$XGm!ulti^C#^6lymr$xKGQ_fL`(MWA8rZ_En+{#PxYm2=?}Mi~qAY zkngi{)PuRtiTRuypOfPY0sHxzkN*p5_s4*9>u(bOmq{oEabMBTSHyhPi6QZSod_tq%bNLHu{r`;NKqioo1=)*Nwz9uPNJjdt;W??eq)|9)8f zKa`;k-Qxd|96#oOa~NVgR086DBJWQf7!m)^X#o#s6mj z!{Q(Dq7c>S0CRukgB*X6W4{xu@%IYlJ<5?Wf;{0aSBP_~n#kZR5XD8ji@h%PxLBJ<-g((z-@Iy2a~{`k-jFCM^pv6@ zA7!XR8@T?d0ynZy2pF)T_3^)m`UTtN{`C7?p1~m>zLJq3Hxg0Vq%6e+7&qF0zFeJ(b;x2bXuqe5#=^4XK04ff=-w$lOn*;$1iQI5<(CAvg8Dg&h$6ouz+r63RF z=Gj}}nOoV#KAyRiUA3V8F7h882Mxp>-3;;^LyyN4fw@3DSP#%!fI5Ljbc%8;Jsw+( zkSNEcqXxsG98b*gO(4(l92dG#1@@efiE1>XTa*(yKCuwJqMYPF7C6t721F@}LjW8X zH6Sd?$sTZga=j?05Pu4FPoeIqj8A2JD%bqf7W9i!>;rX+8K0I1dODrB)5&#uNR%^@ zkcCq8U__J>;!0RQ(}@zaiEKAW|($x$jO0_RpbB+5CtVC|e*42yEE z8|9$i^J2j9dE_~dyk+DqW4^2d1EQRtjWTe20rfASuM7G`xiAC7mHR+{=koDRWt2R&Ca zt}Z|mIM-{kQHol$V@Q;1lfZdi%l>QIM7d4_JzhtAO*}ZR;kc$6J)&Gs&g-iX7Uc%| zzoA8x8?#W1AVQ+l5>rdgT5{av13lct{LPu5=bIbB+ATRC?iTvFh1$3Di4u%~2do8I z3$hk$MXxBg3f#yB^=_@ffGD@cp%9fI?skrE=lJ$2kdxsKZWrkL?s{~Ia*u|55O>e8DEAhjU6cmuHW1fP2j=f% z|9uVUMp%^lb5V^UQ66xB*aw23Mxz&%XcXl^@;u1#gVcMlLzLYfG=bW?$@@?~szBZ* z)|%MY#QeiKpr=PNQHT(z^{5NPJlZHqGr4&VSDMND7<(TpMV}~-$Djy|pKu}@#h_*j zds<3Ri+)j_B=*TXRH9dur^xpdd7kPJ}QBsQXqG$o;QuRG=BGb_QI8&;auFI>20SCE7sTCtehS zy`OZ8@@X8%_bJDpQez+a_hq0K^wCETeH!vnj(UVe`OJd~(EI0hq@xDp_n) zBdGJmuqgfX(qD!qQND~p0jfaESHyqC+E)#teC+|TUt8lYQ3eDY4{-bq<8Mk35`|}V z<=YNXzDq(jnE$R0ouUk~HduugQNE8sF4{04$`1hqL5?5j>qjqYz}gUf4AI9>vnW5= zkqKgd>JsH=57_&2D~3e*B^wpscsL#$4|6j8C8!6z|4EHM>p<*?4`t{U<*$5{gX^>31#0YP ze1P$R8VrakIp`JD=0*h?(IaY91}f1nYP1ICV`7ktW`so@mxm6Fh&tYjDzu9l>p=;+ zFeIuy9YKUdJ;;S3bYf7{2>~>UI?;}5kb5Gza!>_y&-3Dlt=QM4d*z(+WZS^dvBz-XW@kb90oULDYm8us6XPvv&q-GYY`*4C*Di zQ3lqW8Y)GdX@?i&nArj1W|3o7Ervv$9YCw7JX@RdrKg6I`BIT!Vy zhKuudF?Nw>UJ)42>k>7^1=dp9z&WQnkO^|8k|&iuQrY9CrkmXEQnZUYKMw4h-vHJZ zWS|P&qNb5Ejr}}3t7#*mdg#%^nx|9Lh2&pYfO_fX*;YK-vAYO}u z2lS$mM`JI~!>ZOVs!soUG3e0{WTFrQqMGb8v%$JaUnXYLe%Nh+_lQryJ(=BQy>zTzM zX00F#B_QuQuFJXtRH0SWgJZz)!Hl!mmsNoQQ4c9cI|fBvPmT5Tww@g8$-jXd8;Z~? zYBqbatI#6qMla}fV=dUbF)ZpPa&KaN6YHD$MBN;RbP%_>25lG+HOGM*RD!vjVNnky z-=V}ET8C~?x3G6h7Ro`sEzE6ofP7nvK+RkYr3i|;EeZ6!jreW#;Cda#++nOA#&|nx z+lk8))S??ow=w$2ZlvG zG95)|La(St5pz@qiox7b8#I4&lC zaRr7&JCEPAAXljpz~e4A#yl2jddXsia=iGhO(7WHh_&MrWc zsHNm8C2uKl=eUsv@}A3{bE$D|1=w?597@q3YMCAB2%;4OqVf!@o?nJ8Q7;e_q7q?I zFZ7^F)N*o^`w&1ohD5z612q^F^sJnl`VS|H(I;wEJlI>+FX~lx zq@xP0qW&`m`Jlh6>4E21^=kH1m!KX)qFzHTo@3Q(nnbL-$U(2WsM zZ}EVhZy_c~&LBC0?VyKSnZGq8>TS&5=0h>qcUxH0+sS=YW_lNsT)jK>fQa!1ylm)_YNaMzD4_`|hUxJuXy=danans6z*a zMQtFaf!qz`zR!(vu;+dag=iD?0mcu|`vdHIpi|UF;u-@WM#^Ji`2=xo8o!ISZv={V@U8@GRLjUiFnD$p$I^8z1g(J$%?9@L5Yq8;g|61AO}cE;`GX%AvR)IHSM!`hw} z^ojaX9Ef?T5H;X>y+qv0F>oOR`6vbJFVpwSy`pxIry~#4>|hViqAJg#D$k-S&!Xxp z9Pj0LFEM*V2#fk^COSa=kP`urGeo}EIG5L|F(T^g?0LOa)HkwGhIX*0lRcf~Ajg|_ zFn*KqTk&B07QMYSEb70C(SUAI`8%-Mm5(-zi261;-sbr2QZ%De)OX_GK^Exg9dfc=t2069Kp?qllpGS}-xA!-m3^%DVepD_1H9lAy3Iad9Yem^ZhC7RJI>OS`GBX(at zD$s~7ghlOhfgbuwKyQ8R7!dWdc%&nMDv;~59#KCRc#w-S)FXr;QNM5^6U7Lk9pvhF zfOG1n*Zyj>fWE$@uP^EA%RH2$0i75Y^{XUgfm~nJq7D6`ejNu51*k+5x<%#rSRL>p z59AtXgf%}R>NjrWpcHlJz@Vt#((kufC;{`|c7pitT;Tk^Bgc1~+h7KYQ6uX24y2<9 z)o2s-2Ri~_{G%82_2ZzZLltNSeGHNJC-VM8-k(~~FY3=4sPXf#sK2oP7xw)^+%WUQ zg{VTisQ-2&53K*Y0o|hhD)51rUt7^5>TfwH2RXy^5vEqS0!`=@^>+_A{+;n3#Qs69 zKjTo3E>L@fS|jWmA#S8!)V~}k1o`)~w!ae1q8=dEfdFdIhGEepAC+iEuV^+qGz3tM zR`iP&6_0FGfVrq4(V{&dE;@)V(PG#elZi5rFQ!klaWNp@IC6~__>hMljEENNMK0<< zKX%6UcF_)UqC&I@4rHMSHE0oSB5M=LH!&<)ToP*03Gz*HAs=lR6m2r=lXFmxCiIFn zB@P)VMjbjaB3eA>6VKjwu17p|;`>CK8V_QpQhzFSrqbKgAG9PeLJrXv3grGhASP26KtTBr;B9AJ6a_e<#@gS$tESegJa&(KPr6Yu}XnH<~ z*NHLc&&UF~j6u=N0NO=MXK#8Lm|t!O@ylB=Aliy-(8~(OE1f7p6;_&j+=)6TiJ*v^?_V6{7Tgx*>@y$j;zLzXh&6mS_O9a5CAa+jQhvb0ZH8=){Od__Ih19%|`3o7B3&>Yq0qS1F+C@1i19>kZ<|6W5Oy3t%>tffIhFIuNp6MQGp)OuJ<4t zZKB;kPdE6`0@iM1?ZzCGBP3cawQCvI4vKbD7Meu6ITJNt&&}+)#g1Z-FBk{v1Up5$ zm0oTwK(}bOF@IYI0tjM6wA*t~hc?mbSg#|#t_ba--4PG^x`T7RV_391U0{4CJ>BI5 zz1&p_V(U4sXI$Se+TGN+o49+(bx##q&@0-#^ms3G_fqfPLD3qBYiP!ZX!jL>*!u;{ z-(QR%xaHouciI0dc!a(FFEBl!QEx z@1b7NnyA^tc{WkMsZq3tS%0_~HKIM@06p`(u06v3M~Hvag92XP-2 zfw_-~`#2ws2#eO6jUWa@`y?Gz=n?Hx56Tb{ZJ!fGXceu`j(oI<_8H^Piotn(o`ec? ziuMKP_(eJTMCP7oH28{W;uJ-k?XaiZOMZaj@XsATDXy3X~ ziVo4fbD$6{q7B9%4-FU=?fWd$qF=NhG*qHnv>)A|{*UzXV-rS18{)i%IIkgMhUjIe z4Lzd$H4{>)#F(paKmb?pNl1%>uQ5 zZ5QpgIAov-)c9>cw6GJ|Acnv3YQM+82lD(*zrPQQ_J<4f@<$oS{Rj2_^q>^P{23N) zggqnlGtwg3UxIX$fSiAkW4{-L=n(CI8`M0|D7x6;MJ}4rExJuZK3dT$dQ=7~z&P54 zauDEdJ@)L=;T3DlfWi(%0x zrlSg-qVp`O$B{RV-r`uBM6OA!P3jSSvIoVW{**YdZ%QG^ImMbA5Ix?3OjIHy`c&ek z=7L&N$uW)m)5t%K{-zN>-HQ^mAS}8g0~P2HJ;9C~kUybY^cn1(!QL6{ox$Ej_9n77 zk-drRbyC+^1?tRnp_G(>yU61reqJ2NokFgZT$G^>oua3bE42-MqPrQpiJu<>^2}$?d}=JPgS`t15fVKu z8=PO-u;?CY@f@jpsJD>)3(2*R@gnLh;@`#WU0jW3(Y+ZcLJ<9;FX4Cz1FWin^BBP@D4ap^^<2YZ*tBOByf5eL>+1kft_N-wN`dqvM+ zE~8TPRm88Nr&YwSV*hH!s~bRXYYGt-J(IZ1Ms$k4mV9g5&?h?2llnSh`Ma)uum|-Z zN0uGb%3^<3Nc2NEzeC8eo?7cO(JlH0_G}1(^=#I&S-p z&8%%MMz!cUF65vb#2relLu=41`W82=e>u;s0gyX49vNVNZma0qINrv18!?Azs1tp= z4{aC_J&*M~;`4~f>k@qj`FGTyPxQm-_wahrj}Um#0P^I=Asr>?7JVmiJF7)M(urIU zbCd&(AWuOlnnd5lo?YzO#r)A4ib2k!i9d$;V}fWCJ&+0d2+-fL)H;@aj${2e_8(UO zavmRpDv-C(hdlI%egf+!uzq3&+C@Jp3H2Bey{H1cqMsZ9Yp1wC{Zj=6=o7s-8=az` zMt`RfbGirAID`6U&|e9$C6yQy{Y=i~OlqE$i4M`v_JUqZi7hPz{hve6=d_7_ZX8%U zmm24>c3z9mViMxP5fUjYiQgp$DGD^ok6$i+*VqLZV-mgD%l8C-3Ftt0Ye)z3@DxUojy1mBknm{U4S zF4{%E-iLb8Z-_?)hD5)SbGngwH#Ul1>jdXe8$g%nHwj9>o}1Zob0(V6C;BZM-@@@N ztlz?MFb?z|B+sqnxiuT~d~3hxw-I|=1vtLlg8;fjud|~J&7$AoLOyB`68%m=I_T|A zV(&^q5n4pAXRSU5L6HA$AEElZ^z*76nFxYBArAszUua15*Er@G zMt`jxVbNdrp$MGE8|-_7e&1l<8^fY^=A#_-qQA+xyvg1-tI;g_TMm?g*nfFZ3Hs{F zKoCQszfJ#dH;Dd@fL!lzp6|w^1k~%+Kx}td^!Ea27yW%|yib4cv;Tu!u&2iX`rsKx z|1cBe{BT6{kI4TKd{7DRZAv?^9y- zIYHb$_UvPSAG!J(Fe3VAd1w;-^B5GOL-a4)s6@Z${aI)b{mU2>phfhr;!ub-(Z6<} z7#*SyB%u_YqJQH?Il4vvRzod@MgJ~Obe>oA!4}cKC&v#Cu=mGO(TBX~75%4b(SOds zpyqKCPr;T&+?!^DSMMgN^^@Ox17Ke9p0pTzu` zFZzfb=@=0GFDJT0-!Jf?PxJ#^!vmQp5kox46T=pVbPS6T;Y7fEaT)k2xji5@T)|sGaOXzZk9z42dx>SBw_8=k#mM2h@}br-Rztxh{M^HMUbPk3RBpKreaB<fb-#dtPx->K%QecK9=!uF(?4FkEibO}l%igYlbpy!1*mmWzZgaAD`H&4_+;{*Tm)iIrjJwH2!j4j z)zAv^7iWU}#f_l;Y1BK7@#*A0y#(E2oI##5I>jg%10}P z#5g;EAVOl43er(0#yL(9e-3fy42W?qxz4Quy_}Z^>Xc=p800zM0rsBXf*vt0aH9;} zVqBO7a+Z_7yhe#NSYg zS}|_4qZplH)aHWuTF&jJbQGaQjGKwMxe(oA+~P%z7(o}PAM6+7);Q4Pt@UEu76W2$ zYZT*l`n{cAZV!o3ry+>27YwI829C&RgC+|cYl)@4+uP9y^(QaF}lQf(2Y8Di^1Oj zjNSPl-|k^C9&#ZQ#6CpKLm@Gml0eR;BJ_#za2$w#xD6aX!ZCjbFdnG{{XMFo0V85G z2QVbYW8`=&2hE@kzyCKLZvp$CVEzemJ;8hnz486nXrXS)pcqfagM3fY%_dy{Oja@!-sY;I^C#3Gy24MGYiDN z6$g5Jt3!-`dBDDZvEIdc7wd1kKu>S8_ibvvL+m@%7!u=M>b=_l_I5kKp6)s^-irr$ z-edm#Y!stQj1S250pkza#pvN0@cVnCr(cW@iTRLo_$UL+eMIh$3&EaV4V4%X;}gc8 zF#kzNj8C1&Lo3L!kDB|~zpn_jpvJyIG5Uz>V_#n`sNGkE2C&}OE5>Kk{;Wof&jpM> zXaDE)@`VfR`Jz#be#ZUG_g8^Fz6^l*ue>1Us}?Z-HOF6Ep)&w2Lw1193xbVC|<& zu=Z0Y$o+E+i0AvX@pHWxzr=xDzjTW+oDQzRzvEE~_Ww%Uuf+Wt7UMVa{MIf;*bRCP zH=#?6-!#?n3+T-9uB^ogz=0PqLqfN{ScCdd!J%+@bn1O2ah#BWW zDLTZQw1_!PkdJ0ipYQhO^cwVt>2QNy z9PCM;mxNr`P@mHH2X?-Q;rTpbYft?h|vq7vz~w-27HC7f@q? z2kc)^gC>N7jxyFNhRG}3EVrDv#jWRT%N6fW$q@xHygb)^Uod@}-LMsNu zJlKhBl%WwlVrJQqjv@pRLRid0Jjh2CTEX1;@u48tym>XljHQdNG z-N?^k6MHss{Wf)qx!H+AuxE3xm^nTWo6`X59?JDUG!w)eO5H=75EgR_y=*B3aa)GO z-0DIx>OkJDBVy)yQ3-n3W`~AqQ0uTbq@xCH7!Z?ZL32BGwll}GpqWQZUKW_kYr&wH zJCaa>cF@P+PLT8PUNMhwAPDy6Q!k&s^I6O97jq}$o%C@e^G6nod6Xa*Rbc)o>KEjI zyanXlMcrKuAn(z6AkWd{J$hKoW4x$Ari!L!wjYBpn(T))@i_=kxW(F4YrF-zH3T8j=b&!N^i4Pbn3I_TkC z#^=%VdBx}k`^)IDtQ7QfKI8L)AlC(Xp#Fu_y08+|yO26OKbqx*Xc6-w;xDQK@fSNl z+{K*7#e-sA5|3=KkLO6Uq8)u=UP``8t3ljl#9T(b%UZ>}+>078UzrJNRE97tCeM=Q z6(!*KO2${#f*SwGMZcI;1)z_rX7q}ARUC-Fikkn_P=P)%ug(JVS2M15g8r&Y(Iny~v zZ?mHe&7hy#V?e#z$y?_^KH9)J-I0q5G4B-k5I_fp#k|Xn26Ty8Pha(g=tNk|yGu}q zkeED=n)ei-O3ZuXkq!1V*ul9qkmEka_hq6T?7yEq_ZOjF%m-pXe-D&`o*K#3Sb=^q zA7tNywP;1Jn7i4tyBb4cKIA|d>cngku-4Qe=EGi8ftW{f&?4re@gVlmZZVsw-AvBr zVKE=e2e}_lLOJ@xd?FL{+(KV1h3FLXN!FjN1pA-L06jd#{-?9hgb^`Ysntr2)*w2- z`ZF$+Vo=Oyov1?y96!hLbL4-nRm?UA$lum0=JV8lz6)V7UvMK2#JuQ585+cF=X}~L zzW5%enN@b8o$vpHS};=073klR+^*%|fe~ z`{-?73CPh$AAJ=d_h(69{AoowK|1>Nn&zL69nC8y|V*cU<b>HB4-{1=I=;iurpUN>D9Pa?yd1ZCupn5-n3? zlC(<9vS(z1*oJ-n>1uRpqB0}FF+MeAfvy?Vr#d#wpSxheTtt2TS6AVJIdc|RM97m8 zrQ2eolgSe+v&j?9H}qIU$G3{Dmofj2>$S4RrkY3z9JKP}K+?+StbK9BN8 zh1i=cZS0@L-r0z&t6d5@f&54YrGMXD1MKMZd6gfea6XX;l zQq5FOm{YbS#;Rs$i}P&f7Ux+L&YV+XKXcxed1vDk`>AtInQ-#DDIrrFnT4@8O@8dHG`2aGFr@N zMWjKKpJn1)TjJETrO~>!I?B}51P=K*r!BRmO=XE;Y(lD@vS7NZPv&TDRATB>L)R9p z8$WLGk?C{huUhP!qpe@K#k0*7J1*tmMH6=xoOHyN zmqyvrCdQ|DSEQw_UOa2uwrw$qiR&a)_p!zjr)S>G z)A#?HSiB^YQLsHO5|+4j4~r5 zgVCnQdD~Q5>U3ppRDxr2RBFo7DC^u4QzmmfH%e7jb4<7Y%X-w&JNEC|p?X#=bT}5S z@+{1-{>@l8bKZ2jefqqaGhGh5-Qlub`M(52eL6A}Jz<`?AuVl#>2i(!J8$L8G*v-lh9+1wk}^Kmk4n1VxKawV+$V{I(| z3&3P9XR>TX^e!gOU~mbpi%hVGSa0O|*%+;fj1J)yyp~t8b#2#2W|A3gW#seQR&y&Y zNKF}UUCdCr6L|2nb>`H+#!t$f=t#Q$jIB`%&)zsk@h(hoFHBmt#yu_BIVoXbhG$29;sT%Z zxu}HwKO`%u)0390n47W7^|ozKd~!&Uz;$_K|LXu z3B1XZ!PJbgyDn|D%`~`K7i2DQxfUj*E}K1Vj>jGyGcj@goY`()s>@uOa?pZ_3unbm zNR9Nk&6aKZ)pjHAL)Isx)t@br)0Qw#xBa^RDBF#jH(PzIKJcdOstz#dcfbmYbsQr*@PqJ`}1!GBU-d>(ecZOde!RR`iQ$@Y~Zs7XRaM50R|@-VBy8Sc9$L-65KH25MPhXE3l12#b~*tXVn`I+z^!d0C&u(?_q&-)C&S%NmI( zQynu@#n9tz?(;6GICo{i8rLP~-L*A$Yi`uOy|0B@mmGb4;cI)>?|<^X+S>bUTuQFx z1qXU`zDfVDNQh!0B7ByjW|?pJQ9D85_Jf zHaK)_aNF46)v>`VV+o%h8(5boQu?~l!8ksM#>-|zu0;RXa?RNC8NB!|0n66KjpgD- z4y=}VS#s5^Pc7@+*t)m5AJwU;Q+cn99e=^XjmbwIZc8~Nbwbpl)zkFUza~TlXQxf# z+{HZ58#RG@Az6Z>Uy!UXL)JHxgCaM8^}S@u=rzffX`>CF7a4F(tnW|LtZTA&tj7R@ z5^w`V^CjW$AMvAXcoC61;S2_s;5tO^gcS@T7h<%)GrTQW?=jX7-ugzw$&6oRTW$OM zl{SSJ2rrT8V;>GjOXckN1inT4g3DV!aJTPR6vp-dQ)}2J6PN2C>$c zv@;2#r6rNeGL4ZE8CmaF1|u%V1TrLHx^+n&9nE5W3{K#DCvd(KMn4yqF<67GkqNeu zfxFYX?JgOsxOHr>G%_G3L0l#)NFv=ZXtM@Zf7gx;_KXbzV==zSfWFx8iCoQbd?6eC zwl?|&WwA|H$1Y~<_yt_*X!Y-JEU|otvp!R8$p>G!Aa5;ow7(cE?eDdfOw{Ae|s>fTA7e&6HGuSdVSY{2ZJMq!6nQO-e&yNjuj169j44$DCuCn!G z8+}`{UY-B_h7~Qlt=pQ8tQ*w&Oo`;Tnq-g@>6Ss>=-~hP@moJ*ZZE5;-PV9S*3aL1 zuj4&kx2aP{KawVLn@=?pY&j>LdFBr1e%mbDRXc3MfBm)o;fHOZ{TJD6m!)$fa33${ zKAs)*7N4o_j6TH7Ro@VCn?B?fgRqqGRTm+f;p5R+?@0 z+(X7k^Mlt9bVtqQJt2*^;wMJG>{=Jj`bx@M8t+NgtI&Gc^I}h7!TLtvw617?M}!jm z{kF&R0`C?nV;9c)nezj-?vG{G!202D8k<>To$Ba2x|56R9Q&y_+2rJ>;vBvEaz?|V z`8iwh)FnIbV}E}cGb5MFwv;c%d>`YQ{pT9}{ZPWYCr@Lx|9UL3B5gk>ty`eyt(+GX zH6dl$@_EMg<#SWl?lcY!7}HZXpSyk0`sDq!2@6-aJu4SXo90em;92QOh&pGgLp|cG z%oz)lr_En?q`oqcHGl1i7p*$<*7I|wOx`qc|8etqdzhykoHBo%f6g5B;K+Ttkk@w{ z_vv`+b7nmEXcX6x3-Mdz6Y}p5Sex}a&avXHi*?4>;M}o+_4Orku`Xhl_4yn5sGL0Z zA-l{PSXcKypU4Nsmj3h6yl8CZmB?W9L({syeSW?t&C};4e7)1QbpL6#FWga0>$g)d zTITZ_o5yG5bnc9e@_MUi{NR_sdIVZ+{mT!-`sTnaBkS{$c}6oMBaIQSHtVigPO$X> z>sc20PUPX0=HZp*v3|(b>&rvyp0QiN!!6+97O+p^YRammvt}(_m6Doa{hN`RWGtHHTxcXG8w;JY78yyI$Ejh^GM!$Bm{S52tiFJ2A zIyN|TY_ONdjmX^@U{Hd;-wv4Ns$0M78GZb<-j|KhJ5Ja5)rj>uY^F|*9{UBt|Gai> z{Q6+*XJbX>9W-a%{J&qXsY_S5((}@jQZsqI9y|Ja&9nJucvj5!tXMED-kt8TUaeEI z<6@^yU$VV)!we6v*R|H`^$=dK7q8lO>vHqa8a@*gJBGxbTEN_iHlGtt@8}Xy#XSd}*mwZkQhqz?c z=#R(xRoqnaM^h((e`i~D{(l~^{=44x|L1XQ!{3!_|L?~x+t>foflcyxKB|w7=Vd#G z*Jb26H_Cd>jgoPzcSdd#z6k8{`DfeI=;^8X-{$rIkY`(OdwsvTKk|KLyY$$GZC~;3 z5X*ZK-$=(<4{pQzkFnj2uhy>*tzU0_KF_7jiT`Jvzn`ba>R3-8{I(-Hb$YaFJ8?Mg zhkgp}pKt56y+$|N_+9D;Q9p1S>U>8Z{r%@6E>tWxQ5rW22y@ys!m#e~jHO-z_Sef}bS)BN~(^A{!>n)|Q+{H(2?@74pSM1LN& zpEtu@+)bmuTeaRY|3A*&15T2v-XHCAYPx%3=QN#jn(678>FMsty_0j;37hk>%jSh8 zFUleaf`kPLiW!w4h!{}>1jKm7KrkcX^Ijt;-g~*%t4#I#{!Vqx4&Z(7|K4Y5`ZrZw zRpW4GUO*IsObLiGu8U%VOz0`ZeUw>?ORKi6;t$Z@ zA~}Q^_ap!2a3X6ey~*YQC5Rh~1s^j=+#4z;9PKTkV#?8+z5MgX+lMc`Z{MMNFX&GV zE;U74z4gpJRa)GT9$Icnbl6z+WT496w!7OCuH4S678b8NtMkdncAd`Gc}C_ous;Dc@#vTWiDp zOYIxpxuvD=$nBfI@^~?&tDmv@Y_*Dv=wLHX@@K$db(*KalV=Oh6TmgXy98D#Dy_zc z#1qC-tNAp}e3kq^QcLBRkUqkk5h=tjV$#-O`MV=q8Pff4!y}(r zsr%_q`D?@SaY)xPaIhXYsD_qJXzrnDQpSRk0%T<=EU5Un6bL9MF@75RX?6Tr0Ky7B z2%s`W3KMXYX7z*$P()VI?G->c>lGhe1O|iyWZ3Aki~y8u31ukM!O#R*#7@Zx@My$b z0YU(XPsw~jF5!H2-}ugn<;j`rKD2&$%et~=CBMGYJ6=kZGL8PyPX4Y}I!AgtD__T7^R)CwN?R>l8*Cd)q~=R;(k~JCCj0r%;d~zcvW9$rvVPzU3TZ=R?~YU2 zUP-}(F!&JMjgW9C5XC5DZv;-@sSw#u0XVJvAwg^#RRj^B#J`BB$Z;U?5m{JO(kRuB z{1^EVkT1TuA$#H2`cs=*@;k4X89dZdt)0E3bI*AC+RHC~d#zzpGTyoW#*JHU+L!l5 zx9PcdLvr@KsSkbxdV}cwNx}1G%}JH9iEoJ76mlW_p!pG{IdS~|0j1|u0K9*fs=C8@u?!9RT zeMYYfeLNUxKN6ERV1g>lK0ZD6Xn>J)dyhZ=aA)b<( z+4J(1Y>)h5_Vy@$ZR+=v^7EuP#GH}jM!M*JB8ZYVQsSiwl?V|?w*CL1ltK|ahMd|P zDB32$JEZ~-s=%}g91?(nZXkvD`#7dZlNS?L&;j|Z%q(K&R{8yGlYH+c{>;?Nlk)Za zHPXFI(*(JCH{=SLaK$?zHLFI{idOR}oJhH0sv3&4&uNO4Ns=A}@Hjr=vE#~7QZ?c< ziJ3;`he@h^Zb^qvX{{dNsE06{nP}(3zN7Nl%9b1uNm;Y9S<& z51HR0wEW`uky78m+2-iP(TTQ__B#8hS$1B`Q zqM?M>WQ>r~B=J_#t;(IqxCv2z5F+$AiIHNVIOr<=SQGHgDYBr~90PC}K4iN@{-#Sg zv(`8XGOZ@5B~2Mm7iiBCpahbYBXi=EB3hM#a9K43Spt+_S7dljoC2F60~^98hyU{n zH_4|rZDQw=ePfr(S3z++!?G0_(mVj%Nt%61DS&VVBoJp|;u4rpm@49`{|y6WmBr>% zAWMKUEWvb==H22H{6q}t0WkbZ9dSF;n9BdcM(})_<~#~d6HF&;;o?j*sljvc% z>OCt*=9E)}@ERbz1_-ZFIQl^VkK-dadIo^FLtFs3H)vf^wPx5v9ZDw&6sE{ELp90F zMrsY&8*O=~rN!#)wOQ*h+W*W<`}XN|v-)bI%Q=wYMjAWmT%Z&J^EYL{lv^MsQXWB> zFw8{JL5iG`~b*AzOyo01}W!DcxWqz72*kuuw~X%lCI zhuDYY61#T0{5-hrqih$5Rl%7KIMWinsW}5`O0}ty;zcrek;3~U!ZIL(fv`-GqzM4z z4v_DK+bP4Xu-IFfZj~QnLIB}Az@p^LTqn20FRyL|*l6)AGh4m|pPXRl%UnsOB z&0Dej3vgxx2UBU;T%0A9sM5K}`(5sj-!cLl7&XiVxd)CvX&8)X@JxUqAKZwQLfzkOx2hfcmMGN@t4?+#>92x{sNtTWaS%UPC2Byj&dF@JWi?leU;47Me6g;H{w1odjC?>&_ zk0^j1VLeA!%F!~xHIkBo;>e0XVJowSF;|43V%23;mZk)tn2L&z`Y9-lM^#lar>c@u zD)4R<_?ik#s=7I?0EDl4;0wc7@Kq0d(I1MIfIz|Hu`*`@oEc#Pe=o35kS)GVelExs zpnM*hnd9TY)c)}~!W?*(Ytrx$z6KwG@`6~Dx(lG$!epbZj6y@a<@4=7J`f0R;TXB?FngHAnw^nqg_Dvyh;!O!WcH!Km%bCpb zrE}^xGI4%Ca&eXKO!t8s78h?k*wb_H#>K@O4s=gv7f%cgomk3dm*{&ji+K`XWWW~& zN z*i#XoQZ!0L?98&96XEjOY$rdfG`UaZTKev2JO1;{8;bpFxVL9~Y_fGN2XDD8fAQ4^ zd*<(W0|%3=5)aP^-R5RoNy3v;pf+}pr6E4XJnvN;MM-n902H&VIH;6jSL~6}0V7zO z^7*7J{}0^MN-(#YNFf$p6V)BZ9~9YDbku5J1pRD{X?YMz<8gch`AL-ss$>Zuwm+pF zc|rh6VSr*fMVAvbAplnR41)iu88dN40@!;VIp;&SZ2HMNu3pr;Gd9wi#`LTIRu(@%3+xGa# z?w-Me_T4&3+nVejX-tLvhJY#FT1sU{Tbzx)Npv0hyt!gyGT^ESruI#BuFt#u3QqLk zx4qyuz2^Jm#IFW6#BjtZqSVz)=u-^RYPyYxz3Pfenop^Y$Er`V>Ucb^o?7)uu2qjH zai-#Vh&Y&TL}hEi9~EFuJwjbN;#8IZ;-PERBTooG$-KZ&Q(gce4XR`zwr7*P!neug zD8G+dl`!aO@WEl!@co+iD!#ZA6D3Dq(SW1^TnYs(c<-0Yzoe;1On^m<2PB%=npb1AprD2FAAY z*%LvJZIjXIn8>wH+FgcCR&Ve`rmHo%e~djTkM?i%`y&y*e``Pcid-7opKR?qL+=xy zceUm*MIDg#KjS-*&aYU`1(OG^$ zx(joyXQZ>6;b+5wAlIHgUP-ah&g~9`*4=`y$iyDoQEY#Aak13auM$lkRP{f3Q z)5_5`;U^+Kb>0;qs~&k!{qb=XxJ(6JQGs0q5Zazlv302mtj2aCxkSI2R8Iv7AP4p( z0I%XB2B#5672`nRg93q2gy+?;;eV4=#R-70;W}cC3VlAQvht-W@R$lrDgce58lw>I z5cL9qpyv*dw_OcyyBgkhHF?`K1bB#q#nq&CR)jt{^0+vqTo&rGV zrx;BDvH&WU7sbB3l(XWW#PB45G!_n0q_sUZ**wum~v*vMX?vFk9k+igqEs5g98|Bx06|i6s;X z$$V@3<*LoQOtpE_DzMi05fg~qMV{r!{xLgmUwMsvSU#V8@ z`lxS5%~y{G1cd^k;;EsEC-g?8zDxsD#--qc>@@IUM^J(fyZz9iCnZzy^=}u^wOgeL zmH#4rj6Vj0=0?RjsQEkYOp;>3ht{=Fa7AKA9s1OS*hqSnf;V#fNe(M+z)Pqi(;=m) zN#G<)jyVod#g&MH3qPke5}uk$m*$-0F?StCD_PT;y`M&RMy2%L>N?1l#_rVC@S$UkH1Keum~t&WF8jsFe$ca z_b;D3G`4-+4a0kfZ}@3*^S6rKOy5)FkI6qBlt0M!BlmySAWO;8V%7mfOpdViI2SLX?uuV+&ztQoGr*%f3BcXs~LLQ&wlTRKxB$-~{Qj|JL zmi2swJtzghW@_&@juP#$xB&}$SoJ;IFTQa5T~grLkA3V}{Js|a^o25cf*LJ&k9|Sj z!0x+!P{>9vZ_~Vtdr6QEMbaf&M-WNmULHPjn792IEZ{5uko}C?K%_RdPGLwVJW|pc zAmcqmbW&BFY9@+0^98BKDtRYL(Z__Wkq?(rGz;b6Quv6F{t_G&mt0B!-EC4ml2ng; zP5`(F_YmSp-H}Q-f11pe;`6Tw_DeWAhfgIws0=f#j!sg6e-p#RGrQFzlj@PzRUoYb z7puP+R)L&)>Kql=B~B^%Hsn~LW5_~6a7YE@;V6nCXFrdr4Hpi(nbxI95uNBxFJV1| z=vid%y18?-uQk|{amzo`R;LdX_iSCPVhxFGt}!{(>fW*aQwDF7uXXt=r;)oKMQ|G`xucsqUIn(=9V9(SA7c-^(lgaq_ z+3T7Yf_1@h3PWA4)`_KfpJzP3Twht*6xkSpX$`=EMPND-$_GJd#TMBxr)0L?S@ad{M;yBzlTeRisZ} zSqP@KAb_oqyuHtnEQThR76#)zDTkK%7VN+f?J(qS#DA zX(KpV>DCbS%?Fh;x_D&>kR-{nR3%gGR_*R$fzC*ihL}D)=nzHy`jD13YMQ4 z3>2IFx_ghEl#lbXmYO%V)TQ_I_Usu=#7B0qaMk)nXSy%;ukU<&s%F<7cd({mBSyG@ZiyAge~Kz1bnzkwM1tW@VwRz#GoNg&;I2i8X5euB49c6&^E?N`4M8D)~9} zB-diW5#i+l)$ta!01~?r9UG(kX^^r>PiTB@VR&Zw z;eAVirLL}xUA~LX>Du6A(gy#){_*^LvMw|8{BW$);y!k0`~IEs#}6Jaw#LAeJ=eZB zlb)1KGv`i5Y_{o!YPVDH;S^#CBlMty>6A(aDK*N^RlK1CD*q$|pr|IQJSw%0O1w(k zNIf59X@o|stj8qZo)EffT!_8M2M6-rrUI*+DXT0>rE>g+>~D?WV5)J6Fy2UKi1AJ< zKhc5)HMkY5I~`3bMTU6E*udPo3I~=&26$v?!Iv9J$9uB1T*R_zo7Xt{}cRAqXrvb z&_YJilaN}mQeWT*1N{{6E3mK{ex6c~^r}Eo1-_vGZ$KmkrE3~KF2)1J{YnHVB3c1n zS5FmH;1eovK_&d8_?YS&7}x~@GjLfj`9!7Jn3@sp+GvS*+|j7p6Jheoi#+^kPc-Ur zN8mzfYUE#QUdEgopjUU0N?NT=Q?xBK)M{esv>FvFWlcOWFODcNA7y}Wh-#5y5@Ztv zAPc30H3<-iMBagZS95Od@P5&ln=gd2{)UZ*qi!0eJ33WbYP0ZJR^#t!<9(~c1ulu_ z8^QApn(vakPNZ4eazmaX=tW~Eo+i4j@^v*?`f6e6-$afhKm@V0&>B7JELW%dcJ;{p zDv(kDy3Oj^MPg??Zd0iNh$JMqlj4m^BLwwDRZvp_$`y(!Z4VSKo6+XW%&hwO^Q;5> z`pO~Zm%qx)nSTYF8h)qPAK*Z9Cvbqp5yYiH`T>KvtY zycRC(E99{#wM6nps3t?zdorv_8C0o1{?q7yy2~l4ONB_X8lpY1hw=xc#ZIcgYMJbm z@LPo1tAkO1!J^+CsdzJ#0Xt{uQK&F=QP>$(hT_&5rREeXq8#kkEU>N6HkdLmH+A{2R)sA#clnAzQh`1VhSMkkFu*+Ddr8p^yNlj-kQdzNt`Co^lYuX=93I__upIGBbksd(d<_#5N=tR+7Eed-M798AJ z@&~clsI+rk5WUlb^NWk~_+&D(XLt7CUj*2r%T}NkX_SA8%cw5kxLHv;BEtU*lLYXPz`X>Z{v$#+s+_W(1 zZlD73loANJfgm@mxtk&*>QOk8dxPr7Os!5~fR!CZ5HEwLQO2b0M5v#f?DU;daK7`r z^L)Kq`wP<^zG2Ck>I_XSFAT@~(heq1r?aOoA2>SK91qJ+OU}Qq$LaF9h*BEIhRKd__)sYmCRyyg)%|?}qc(@k&4LXzv zr>qPBaD*%s9Vt;mE_otl0+ioWj&!LLkEac>D)Dn_bzD?0swhw!Wn#mMBbMb)~32k5SA{e%)YD~rSe9F^WUxl zM^xZ20rZ6X#gSEuo>512NCk2#deSP;CkBjbS8;h#Ju<8UdsW~B0k9Vo@eopR*&o$O zy^R1GL`FG6R9p>Rh#51WWCrpG%S$Ai10ZPEs{)4!pgT;eK$ig4MmDrgS%@ck50Ls3 z(Tv?D5;)ks#t~r3iVr2SY0qtocl9=<`X(p#Zp|#FYf`f<&AFDqV6d2UV%1|Nx2JjD z7ih`26J~dCva2-fbWa#+0{&nu5wG_dywPkZ-kWwb`bHWQ9+1kV4efD1*T0D}R|&Pcx!HOG|fgD##IA+y+}#jI#RHdkls^2`kF+_~Y# z8>@Pp>XIbq zZ;9@xqlc0{!jmuKMwLkbP^Me~M5hfMS#82OEezV5?H!p#af_@9yiEmq1VE`k5ak8j zYBdxniwFQm`bA8DrI2uRX>E;&1w^`8EWjDqP#B<$7TI+7)?CMA*6|1%k{?-I@U#x6 zSo_M0NCF1?Hewp}hy%31hfZ^+;_lOSGK!ujkDID#741&`pXg8#-Y!jX6%GA_4?41% z?hE3EwAaTvd_dc86b6(ev?Kh@dO_5BTetM?KrE#4}{MsXRj=%$a&9)diJ&_&;4@K<17Zf`o-) zo;S|7q)u~n;+Lodd0YjqQvj;T*JHx)^@!Oubd>r9f&g0SC}vN5rp%t8%Ir(30u;tX zK|{ruTtcUy)2Lc59Emjvt<^&GbxP1rPpZL_L{5MPQ-i_a4`ncvKTzyAB^4E@;zO>k zcQ^%qN05O!vgqgJwNsT(p+g-S%&8;5%I{e|z5bS)=WpJ;|Mc8xq6vFU9^zqnoPAjy z7ql^fHX6{z$hs7JMCc{Ds5urTx})keaCHqmuQE*vLlqNMNwTO31R~TMngUk)omRU8 zPOHIDw+bi;0H(uw5Q{sm z<`hemlOgJ>Ednu=?@%Y976Gw>m34h<&+YuS-QRp_&&~YST~EC#zx<0|FdJv}&p$8! zC#DBp)yuyTvfZe;Lh)i7Alpjxp?a~9ZAGh9yw=mi;)>C$02hiQ_?e2dHTvjHsR=QG zH*0lSXm$9om38d}6v80H)KMhS`u0F=oxL{HV~+o7*M}PFZ`|@*QzYA)iphWMt!5IB zW_MKaki4_Gnccba;nZ*&oI$Lget|s-e!}7sMb=5qsTy~t_P-{7f!aSAD-8^d23i@L zH&jaO818C+!fLON=wTqluQvUFITe&#C;*jLg-=TByG7-nJu2^E-STtndifjS(Lwfs zkv@4h(cqTyKGgl~aFYjsYhqinwIV;bcC|C*XsMlmtRHAaTAu<0k^?HiS2jKJGao~b z8dAq$tm?-0YS_{V--RA@2pH&`?oW}N+Z*W3_r%)UV?FuafY+U4vxe^0zolKQ&{6t* z`=CCqA8h|-siVML=^wXtV~h`@maIihTY{Tk85^S<535vjdH~T#sEX`_#d&!8cIocd zw+J3fVt!3xeto!>q8|#E#QbXL9yOJFh#Wi+uS}Ab^jomUAI;4xbc(fwW`fuzk4&SO zrCphk*o#Qa^11(QZa-G$_RY%Ney_~!Z(?reGbc~7M}a|FDNoKYbwZHSOA1$Q!Cv*c zvFfO@UcS-^SioQmFsf|a(-iRM%~G{xU9=~=_7B$Qa3(@JR=vp=j-LU69t~&jC|}6_ z&YuS!>|lqS6+2*JYrLYgCauWs>@~6~-MKm~GshZTk*KRN%AS?2t}ef)&&eO~#$!HT z6gv!1{Jp#UDXEcv2Ng){i4rriL{Zs?1H*OpOV}Nc9)L}73|fL5v~mi2{z<4$Cy+yD z#dsnv*5lHT`h2?kdOpgvRrMW%IhRnY=eKmFOPGzAJx0$J{%%wlW^^Rr#agnzqY4 zogt&kVCbG&nCx!wc&oHdp9@<(wZ{F%Y#WRD*zf8KT3u%S;bM9|riP2ydLSqsVWrtDn!?Br$wgt+DJa4LH zNwuYqr)Jv1rMRy>Y9A~FJL9@4gZUfxn5=bG{=!Ua*Y04gp{_^J+8u1u%3(dMy6`{RRtv<6#SCiC7* zQ-j+dbu}zc4ffd6$%JJvm3Ifaqb|EKR7jqvHB?LHTBFB==#6WJ%Ac2t{F8{hdaz5M zLft|!QLMy)MJH&f%nN%U5=P<)t5{)uW^>Uasf(hiRP5r^B~8ameaD+GPVsO$u1lno z@rzOyH6JUL&T0Nd*Z!&I=BfQ%mG7C<#W>M_y!mA6WE>Y?f@@MSUGq7m(lOlNqIfDD z=g#J-ed+~WUHhh*p%+eo1S})J^QKW zwtwe4JD$6r1^C{cAO5gsFYjR^@^@KYenjE#=JFNn7VO_*((D7>QQJ+#iD-&6Qs!Im zKtB^WAZqq=>fTlU>t{|y8pI+3gA#a&42jq<)TxAA2?&Otv2}rTx<1tuj(a0^w{NjA z-5HDy<*==2#HY_jk}0EBSKSk7o3{F-Pkqc3;|^C-$ii)LlZBQ|J(bZ+qARL-Ca0qKHsM8sE$TD z$I|Jh)Ocq!dezcx$Jebpe%sRWt@M5C^5hk}ySjE?F^TWa&fQo1WvRKfzwd$z*Y$DM z+%%OB_;_pUuH9|zp`iS4^n2y{TbJp2E_d#sEBAEL_r#UEyTqKnP=1(yi+>ceYt>+v zDJ(3^$4GVP(S?(ULk~b7lI{?#IGA8%!3ni~V}n@m1$IS24N~IYT6u-tP^S$nv?ls8 z9-Y40n+>Ix(vG;np9vJk*%S*FCR6FL4qv@a{*yCkt!BJXbQQ9Gdp6t3#>bC2!@dlc z%%Nttx3ADtXQ-*sI-T}}&(c4ToyvRNZDY;ypIx2i-|B3Qeq%bRl^SEs_Qkqdy-tyZ z%gf8seyIv>2O4XwOkcyCHRAu@;sef=)BIc~mf!!}wenxQwvlDzu>kui`$<3^m){d& zr`Zhw@;^FIVV~fi!#y-sT6P@jknF{kF#nwVDHhf+7K9|8&6a>K4J!R1{5>W=%$D*R zI8({;HPQz3SX!Zt3WUx7w{459Vk=%MzliOBlqDqC^`f7%$CnhEFVT1Zv0FDzUbelX zu;a3^vCFm>3fnK^@7!>7*XaAV?(V6#_>+!pqoFpekA7zG#2p(q-f`aG;CXj!-1>pz zrQYJMcg{>*xu>gZ&y`b?_?9nbzkK#tUOPWh8o$aDb<}>h)|G~=?19yvkc_|_&|qDY z89vi^q^vjku{#!XyW??eQWdmVf+?3PP2Xw0Iq7jHlWtG)Axj|bay11kmOvBE1}vnf zpVu_=d-yH5Kl%c(UE-?dBY%*+PuV;6IXT0gV^1kN$jS#NKo1Z5i{?4W1>a7yx-}0i zx4|BkuvmG)n~`uv(wS3@P1&G({GDIk>NjV@{CSC0g$BctVl5kx7yvQ#Yl~>r(#WT_K&vC_~ao6a;_HK0ZY+Lss>GIbv zXTPX+cQ3Z@I9Sa&d;JQjBv})k;c$1-0^d_}2TQXU-ax<}T<34_$v^#Xl6$PGD}ROm z05(NSh0pBl>hUGRvvfp zb5?G0vCHJBi`T8Z=42W6<$#=$lL7WHI~I`7lg|x7cZ`;|NhAEPn1cy9$e>1pn=ox& zOkUZ6c6DFNNZy&tNA!|=Wm_x1Yvn!d(b6C@#BH^FV7ycsd}`<__D=qZ*S`^wdWKq@ zNhB5y)>(Cue24r}arf>{{`7b8l+p4|DOq_Qg1xssP4(+ng)IbOtL!HJ)z|FIOUw0nySJ|=HPU=O>&)Ngjd~mn!JwCPsDg*TV}u6q z(U>wa3FYa^F4JP_@MhKsY-Lby5m>eS1DjtNaAp-ha)+-k7;4TIO(tu&(GUyxJDu8E z=Rl-;F69rjTVsVtV$xMx8NNKTiaK_`+m#5VV@0MjdEhcP+G#d6S5J35SI4RgO^q#4 zN24<@w)8+eQ&m36Z{WXx{N%viYoZtl0R^HB-jUDw5iud)&>J}UZ7{e_gK*N=2hfuc zi@Tli_d=J%ZB5piYH5a5@w$fkfYsaL(z!jO!`;T1dvV9ExZBTf_a&1)Uo5ursK2u< zWeO)Pk!aFsPd8^A_Jq;dJ2V>d)S80Ef;(lj#oQy{-8RThncoGi3^lC@uD#dJ&0lj?*X!T|=!UOq_VKTB+EY)%^vagzaP*7(t51J7_w>`b z?>^n}^wYfc>F?sJL;L|QI;VWEWaM9iOwsOdxNcP+(T?b<_v>&L^%U7r4 z+kufyH=W&?Za>s~ZsEegg=_Z~Q`r-rw0X?>rup;6atm>`Q$7%nG_OBrq;oxR_xtig z{B!(%=sX`rNZtTFyM;^GSRLq7^%(o^d*2%_ChYb^(f@(z=?^q7l;W}e1@@f$Idh`a z(y}gTl@DIcU%T1UwQb$HEnOa>%b&~L{ImQUun`5^n;d$$!Eo(x=QS!)0@GpsNRL#! zf3siWw${E#!-*qCcPJB{4tCBoH;s4rs-4ZJw#-#YfoxB3uxB7wnrw`EU2JcCwtq5l z^n9+Zt-grg)3($XMwe5xiL|w2B5l|>ptCtkg+L8A_%fe}lv;hh*3wy_ zk z`V01h5rd)b^{vj~t>Ik6GCeQ^%a&(bTNYbq+NVOnhF)9B*Vhi;aLbmqE8i9DS!mBK z(R%zF8Z-T|q1nyjq0SVw`hi9dXg2ci^Q!?FAwy!9#@HG^K*`I%H9~B~zrXS;W(+3N zUVkbHMHEc3CXcU)cH#ezCZ8`6_xqY;r!SrM`BHJZ_e14<{2M$9d3K^JlV-0AKj?}jHkFLuZ3_6qiP@Rrl>6>0&p6NCFOy(=4#KSfl@XR$gm9OPb zB7YMUd_aw^;Pf>O8%`+B9J$S`q8t=d`8j`b{enA_id%A!IZQC;NG6*aWqE$R{A98> zWvAD1#CsApTcU^k>&hc-ZXb-x$e!Nby(4jM@O$4gc*`v-_xbaq$>dl*5Xg@ulcRZB zfXy{W%U_lZ$gNmK{2ZdEW5O^D_=wSHDFQOEo#UG~kIQ$CZrwTx&2}f-$y+YHbZq4r zc0hg~&yHRCwRaFNG0mOjkMWOU;{aF)?2wM^f)UD2>BsN^s!Y%xVH@nNxeiY{@2h5P zw5KoD5jIU9JUIR0i)_pvHZiHXd2Dz8&zN?0bEG&NdW8=T-F!2`E!>vfTK*vWH?gOv z2CJ-d?BCX}KZ{S&Ij;F~`CjlFb*MqlQeqZ{N$Hkt;eBW@uK0*wo@N(JW4%NyKHL$Q zafTBnQzGIV<*%$*AL7N89~5TWU9R@o!uV`7>#eKv!hNdJ{7>1+ujZe}z4gdkHex84 zj+Q=VgM_@Zgh&D7;aAVk%ima7fQMca8tC#yEIRfltP9?@v3& zdVSpATHfpzN| zKZo5gKYu~A(G`m!O}k67$d`EHaSwt>dN$Ks4cqrU@EFSQ@O$*MU!EC;8I+sZlDmOj zE_aM|TsqA@ww!sl{P+axA8NUXE#kW0mOsMZ1AGf#0Q@MfF&FuJ9$0u+{DFmQ*iSwn z?`4Z8vma#V$UnJM%=1F<-&6b`sFT3ckoy?teR_JEyE@V7s5Uj|s)lP)?3TWWUK=a)`{fhtKvQqb%b(|k)5cuy zfVYO%m}>5|At0i;K8{-Y7x>*8OkE3($kUT)gIRj8o!mj} z=={93&|R=5XZvH}zJ=CVTFaDzKiCnoaw*;2Z zzn6>r8un*J-jvx2UgRCcwVi#eJ9Gr^9|)OvwZEq$7&NfK_E0`yNAPoNce1)Fn(Ot* zw}!jZ4rxSc44`t7T$uD^2V(MX+5Zs#43r;{`YtD< zy?Sq#(ON(A%W1hheU$yD*Iu6rMb5kO@>X}C3L-}~Wq0{z*p43{3hhQ?m{1c?i;0?c*^WWHap=p ztKTh=#>NPJ_@nli$7J%vkQ!0Go#C+48Hr#%cbD7PV0i`drf~`~U@i_DsDPv_yaSO; zH1PilWqodPLF?;H=2}xjy-ufXuzP;c5%Y99tD$)G=2*zV>Kp27_2z&JX*t5xEBsb| z7jk2yA)zc6P;X}Cd@XPoI zfN#p7Rx)FH9Xb2t_=!Z>>YwblwXD|MTgvIp4aQhJW~?$>O`ok{HRirjPDjULF{9RO zF-whxK(#R(urqEp#^aHODr}dl|0l=5MPrDEUxq!>qj?0jOl+}?z@G7!7i{teuH4A} zbU2Wb|33QdZ}Y#%QFe=bl*Ww}W92XNpYeNPLA_$+m0g(}cBmLEr&j#-CcKIXCUzqQn0PzbD+$=NZ@-DPG<@-5KDo z%1=44g0-#p-{tp>_XUe7DkEubhM!iAXY27tB7}VrLQeiwzx=0r79VBTwX*+NUOB{H zy-na3dmTT_e-9ssqoqg_GuI%i6ymqaZualvD?L>_zw%xF@fD;3=)M=>z7pk#ZFUvPN z*e@-zncZrYwS43Hv6WA*r{_$UAC~gKIXy=T(fci}Gz+$CnPG$Q$LBZ6mu_BqoPSdO zBAZ$HUt%dmVEL<+W`hn*vK)Kv_mt^hru>2fB0X14wCz|zg@kFIkwXR0f_^p0z;g?4vk zE@ShZpDPwWclpR&8%O4ywt7P{;F;OHt7Y5Hnx^x3c4~K_`@+Lp1M}Bko8Go{V|-*C z;gYq0KgNI)svFR@Ab;Nco`O^rjxFYrb`Omz=&m1>?X5lvZryH=1;YIu}D<9%}SIqp16>R>( zG+V#}eub7=^e|b)t|si|k9=h5t4BX_*YY>U`6+B^^6JXP{2EL~(%g!9zKq|~e(P|1 z7^oj14#3B$4}n0TBEP9te!{E-nG|u zc7jXqC_l#k$nS*DM%f!8pXy#97Nl^WUQ_6oNbliq#EYnG8W{hh84G)&dj|XWjKo@+ z8*{y*O(T2yJn}wg%xh%c)>1TFY)RUTE^}>DHZU^S&F*eLd*6;^M_Z_GQ*q&e^_f!2 z!V^PV-0=+?7ebldsF@if-A(?Hu_0e!)K*_@N)uf*mz5ub?A@jCuEMu8U;gB+i?_(H zzjx`5c?-|luQgx+qu;B zX#e^T-HDCFjI3n>Ip0ql-P^j7iNhz;ced~@x`Zj$f9pe4<@<*%W4;X}Yg5Lr6PQc*G#<#D{%B;T)f zf@{bK*#e9fae>4+4RmU9!P6Z~i`yc23N%kC~^BXSYqZSKU0@yMMZQW{Gdp z^=~`p+yn8}c)l3@@z}A2uCRgiyqgEcj?KQ`CP~?aV?DDAsHZT^3}T?aAqE28AcIJJ zqE`-aZLIsw#VcRhCjaZFmR^;=#jZp^@l&Ld-Ys8=>&_{EN$TJq)ARu!NGB#* zC`W-j0sSATMuXM~N74zIRv1(`Ht_lJUqa7X z?e+eotDduO$zAmwM|Mq52RP^Y`ueKcaO=9%!in)9^3gQs{pBb5tNi0s2Se>iLcxZ- zU?iQK!2D{X2;5~7yPTd~=$$*z@8$<~r04q+5_1OQ7Wbbl_xSNf#^(7GBfVJ492z=n z@H5uZS%D3E4z_RJ>mNC>*tgu}9)v6|SUogZu(NgG_H&X#r->0fNkjD|WEn5#M26}Pk{vIEZj z?#?7$>Er5eE3%(GC&f#1GXoa;%wS>rXfmEbHoz5cZH%=}&dJxd#J%mKsa~aDbR4`} zU@t;?G?2u63)hi5jtnCCOla|;w5p_k)ZA#)vqY}L=ovQS`45%9fSBTb(5oLTM2{j%3l{ea z5GX)oi>{JHCA;i|7m4$z;*oZSTH~Yku64s9tz_}1UEYY+8%Z7*o8QFJ(?q{bgR)|u@=`21zL&*_~GF9Mc`=wwcj=xxfG#t3%&7LB>jnK&|#wP z0zO0bLn$CSc`%fXhpg>+T{?4xeMj?n&fC*%jiw7Rr+<0#qA%>Xj1Lz>U6W~hGLw(6 zOX`jAdDFQxAHx=i?s%rE)?(OXFiS?OduijeCEgJ%B%M_?W^#C$W@9;oePQoLf11WB z#y}}wh?~%W3SuQEGL1#Frjc=jOAhYGSgnyK|6sJ6O|{$%rQmec%-u3-uG3k9?*8Qt z7n3eHZX4|2@pK^OsDaE>TZ68@{x?4*Rh#O$-RrM2V3=&*!v~xmW391P&$Q-XTXcDy zWqpk~XbV)qv0|*Yn6rdp*#LuVVyp}0qr8RvD`mH|R^;asq%Fu~K}spChW@{HUXm>F zP@ps8*LEy!o~w&5B|3&8)!Kzy*b~mU8)f@gyI1}Z`&&N*B-ihgF>$g1o4{8+;Hz3> z&&URlX(7@WVa@%l2?-SJZU1s9*2x!~LRi!VBo&aXQQ^V?p2 zgk{;!L`@zhNE8{1V2~DIn`IAH>uS7ioxRp@)af@c?Un3j@`c{8MOVd#jg3Jw`v&2t zP=16@;vVqjiUKvUoYoq7ymS4f8`@d@LHW^NY=1)j2ls#HJFm+x;`epXe;b56X{>$< zuuuVn%u3Xdn1D{kfB54+(HrBc52k(2hMIJGCerM;*Egn9O}YNWK%l)fA2Bw1!i`2~ zJU_p`)@pAwrOrO*++6xtrY&{&!jql#J#*W)E_es+*`eK|fpo}YN){7-v`k~XC-^LT z3G18??`Z|YiPj&|!lcb$xpa_jBulJ(*61+R;Pv74E}J>f{49g1s?KP%G&BUG$!2UM>NV;Zg1UMu zl!o1$^=16YLc}70iCIm9LFY@^EOx6i-qV8eP?aqa_OIW#Je0r-)KeDo*wV(4gtoqM zJlGgrxN=vt#b$1hO!X~CbMc`f5;*AQ)od>N`7pm8Z}P@Cl`x^cXH8-3xvuJTJU}Hv4OHU{etf_YRQ{GIMm)A`hEJ35KPRF&TU?JT) z-4)gA+SiRVR!vxKnJkm^x(1IgWDSKI*f?z0G-^#5_A)B#L1-HtWgsfHG_2END!@7^ z?{>%c`x2X5Cjw4yccE>Dm3Y(i;eqrh_O;B+9PHh(mnCj|Prk2tUn<|()jjg=BLh|5 zj)}~~yUy-myGaH-i zAy-wS>0h)BzK*7b$cBUOn46s3_>LXxS^^E0*yi)zvom+jC07cc!H=4HD|;2oe!`ds zq5vvLDOnccSd!a*p6DP0{NB2zp7GS?9qG~S9nM(LZ^|v*$vaw`M%o(rp~AG0;Vo4y zjeBG5T%(^n0n;LNjk~2R+bcX z#JSBC_SkE4snqz+!u+PrcK6)o&5?UR;Sg_Y3J>Oj?d-Mc`r4W*-)w2(%Dvs^?w-G; z!<|h8>p#hwr}lRC^fgcJ$_)(Q*-Wzsadevf0xL{WwQaL>8vq(Jbv5IUa!gRjk2H2N;)QKb+K1ws)?$ev{b~FqquKJ`eK-8+j_`YYI4P>Rc|nsfN{=*`ETvQ+tMoH+R_E za_;V#Lz7lleZijbCC=WvWVbbF>#fH6{P5&Zd#%lfP?CJFi}|_i-%-nkg>aIME|7Dm zc-W*T1REsuMG6xN@HO-wPd@psE32c!`2cJ1wMI6ZHy6j(H*Yw#kmwrSR&erguG4nS zyWO8S@57;K_!^UK7@}3n!oB1BH;tV)my)ji9?MQ_OeBl-$)cc15^>TH`w8`zg~nHvQ1Y&i=zdU2~#tdo)qs{qD1V`q_}ZL(-Yt z=J!0qnEMu2BkykvT=H2BEB~W>fM3qjRH?UutAyjku_+(5iu6|rj0+;5Y(_=_M;|g+ z40XC%OM~8?>PsG7JRWL``5Nqgd#$9^PS)vb8g1s*k?kehtT{8+8{?A6-x6Z?)>*6$ zqjz1Y%MnRHM+R4ZEmhZiE^Hb|=*7%--`;yUo)Lu0|&-CGu{;qS+S`VWSHYk^o zhd#l6E%Ggjt3r075|d*@NU2wP#xZWPp%j@@!Yje2>Wnp2RKm!N*gV~_a3OBvp|(EX z{@_SgEE)1-Ewf9rc-_0-A1J0>+B%DY{W?@=Z*`AfwxgJBZ*B7B#+&-i-ZT-6FK*de zD0JouOeg=XCKT~jB}R92Hnw;4pdKY@eqNs92k_oJJGN>$fkF36Z5;^w^g5W=9DFBd zKdqc-k?gGoI9ie&Bb3O-R1%C4;eU~%1!aY6$rw>IQfQ}(aRhW1bYKtiYQ5GGj5Lg+ z%og$UdXwdvdP9Su&S7oPBOR(Y8fut3l?yYw$5ZW>q=3`Y)fVD4^>va|XRy>5sLFcDZzaD25Vhrq;OYm zoiAU{J|R2UALSEqrvv3aN9^&K(;1E9Er;y)Uz~n%oS!@SDeV5@_J+~dqN$KQ8|HZCY*VZP#diV0o>^8piV%7P_jvwN`nd$G7 zpOt?%GCVbcaY&kPm%oNyhmT^f7OOJv%55liN5qM{Td72cc2H^}iiFI}@={@-zq>Bb z-Rxc(|H;<}mfLNKOi%td@-O*@KMWN+dRD$@2vVGF$-L&qMn&=ky4BqQ8f4q^!%_9)#yy^RDuFsFU7_T22h!cL?f1c!yw6 z?8GhVL1w2OJ?<1Z(A&l)<)>>c4!5PvgY6HiIGR#l)?SN!xhDAItu$i=2JNu!4C+>Xau0R z0>>l$(mSi%k(AA5!s;4F7%%TjI(1d9P~1Gx((2SoydgH+<4?HiC8-KwYir((m`2jo z>KAINb-HTP;_iuKu85-nwoR+6+CasS3+A?FjgqS)9c%U0@mX$54Yr~U9e!dLay!1J zqR*3W_DQqc;PhK8@kG*6ogUiS?ZdJ7%} zKYm=;$_j%(E?Rg3DN1ro?^W@tXXW70j^E|q88`8X=;M-PE?+0&v2{n(eohqL)`z5$nS%5sSpB|CE`0pVM)^CEeZy7M~HDAk2Rysx3-$s z#aesAEQBCKS7R`m>tEUMEaK9xw%J*Bjxmr8Cf(X(#!-z8gY}N6CsmBQ8{}i`ute^Q zd?)|2{B1noK z#5(@ImUB*C-dCJz_vn_myQw?u7+>D9Fld>ZTRDLHZ$aHVh5J)p9m#j3$3=$R$~W&m zKD+fJQ}5j}b#&LQ{GJsXpIiAXpIZ4Me|hBrg+}+5KZ`u-XN63GLP}E&Ug>o4rcLrS zc*WU8tb0YnE|9O2H1an=qx%sj{unqEn(58m%`qi&N6{Oob$?`J|KQM}@pxk5;NZG_ zqcQf={o7k6+C84!c+0l4S$6XcyK^0TuHUrr`aK=_-Pdor;g00=v60~;)5$vo|GXbD z>`Ryz$$MpFgfD*cjQra4BG$Ssuk7dVr_aIy@z1mP{g3ebT8f;lT5`j5^fE0g^l-i- z@+^xSJ@34u&#qtp>>5 zfz1`k1?UI%MEiVKfX90#;>C%KqiRVT89IBC2A-ZhJ~DoABq%L0YtuO2nVdd4y!n!G znA~{pM6B8|sETPtX1$#{Lw>j=Z-OMRn3XU*v{g&Hswu zvwmeC{{a2w-tt}0y`QP%1>lF{C2RfY5TPyJ`Sa6_w)*s%@KeKX4 zdv_zR+kuLS&3%HK&-1(f2UCdluwNAmC}DW`4* zD%h_NUT|3UvgFj!@v-US<53nKKWBCl>6mm-NlEGT>Q%Lxl8R; zLxWPs@;O+Ww%E=lCU|t}yp01J3mz@|k-uxBnDbTOrT;(<6ZFL{fJ#LNta}yH{rBFl zKehjFOuzrx=O@`a(e(Q>mXJ@&m$DxD8w$RzFYo6+LB4``9*tl*Se*nq!^|wi95ajS zChXm6`R^Z`d*6Kj z%FaRlsg*7KZsjvS4+D$q&MNQ2b@!t`S%dWi%D>9cbASBw+$ZOn`*JJa>73P8E`-o4 zmx8~~1&{n%$OC%ypbv??VXyO$`HH8(dY*swtON4T|8LU11F)^?++XKh%aXOMz4zW8 zvMgENd)skrC(d5Xgd~szNWz8?Afb%XrVWHmd8I&0TUHCDP#~pHpo7se$|@9SXqPD7hn9&BN?1Dd>+li#&6!&V2ZyqM9Nl%ohEqUL1y0(x z279^&_^S#1jQ`b{r>r}zu=XCH&(QA|N(>0+KibBMf=_R{j`?51&)^xq+uD`lUmJPp z#WOVe^Iv(z7rC}|rNgLUML`a1j9$*aDcBHCk01-)H<(9M~zOEISz+JRXFI5r)}nBG^mz2t>TlH)pjQ><%4ClL(8kC z);Af5yJzEQ?ZVDP#h}Df(;_9+eNz#Q+GsUe!$U!*&a6{u&e`Fq@Amhc)al{+)}B?r z@amHr39+}V>PdFQkhMy*X8K256TJ^>GmajewGXy%0Rgd$F>FQM09)ND`adVH2zRHP z5GLZeftWV`$cFN&z7^SK_(S@;RyVgC-xuXJ3=NUmZ(SRox1pnZ)4Vv>u<+#5`_7z5 zWRAOhlKFP$*6bYS_tC$xai#EU{3-J7G7Rt#8`ZSno@ zz*N&$k7`)GPh+fZB5%Mq1w2TgsIX+gcmW3W!n7@dU{;XWnfe|2HDT0hNwl&;R~?yJ zY8xEtBpp7LV3gD;hI96l0Jwhr`e8(bmMAqk~NvS%vy){xhxJ zVo{4V7IV}yK2+Bc(tw{*=FW)?lFe7Dh(bXtjH&U@CRSRjI>Vv1 zqy>;rSds5Q&vQ3)Em~-;VA*AybRkk8goO#NKg6<83u1td3A6ar!qIQ|1NCuz)ktod zukVgjK6vMy#-Kx;9#uMP0(XBuTw|A!d7&1avAN3E7&Aeu;wR=vZQweU*{ODg`CnDq zjg|CvQfY#w3_b#4%%j`Ln}Q9N%~d81bbYXZoC0jV-Fy`dE`{X+ef#z4lj)u050G!c zUO`P-<`QO{;vw1&aAEur5p+$xs3$)|KZe{_n%mi9j`QKwX!x_ z%jD_v*N%?zCz8n2#VK+=EB{y1chg(oH)vz}wE)iH85cSjd;cP7O75@NbiP#Xwi<$c8|7y(cnsa(nx_p(t%yw6_^4I*YL?X!-bKPHwA>>Fs8d zN^3V;Dw}#jTB+LO_Gr{*I?S29Q2Cy4uOsAU9m*h-TcQql3L|ZFOzkUA|1zrL6J$mUbma zvMw?|SZ~p{q=0B=BBttrI^v6)D`FVS`L#Yz9QFg}7DX~-3^Ucc=xx~bZz4p~+-fgGzMI$_VLrn*ATFRnILR!!ecpc8 zk`3Eh1m_JR__+K9dj)tPSoRsHPl5OUMr7*0ZeJc6cHP`?lc$gR_$l(;{Ojav{AO|` zkJFmb_d5D{ANrZ`)>x#>krM=Y=;-h;{|Zi>AnWRnKc?Q-+5Hr{mq-% zOD7tO_h&n2f$?vlzw~!3$z+zc`Tgy9UDDwvH(C?T{y=lwY>7Af{mlvM^GzoVL?itt zHn*JEABhf}*o2@Sr#;mhiw~rojx-F)MD#rPox8~Etc|RX*nieex?y<#a4UJerJFp@ z*O2GOnI7h~=??lG@;-F&Zai9$X$#E@3ege5k<1VYFtJG_*qca=H@R8FN!6flc$mcJ zb#=`j>+YII_Qrjo-s75Dj_-%9`(=6^|G!JttXa5x&1%*UMD#4?#f=y@59WnXSjl;} zBp`W73hSSc54f-dqR|4p(EXU*d2O`H#UUKMzjM)0Er zdf*%_C_Y-s;53a5jpu{#N zje0Szfzo3o`GADCj%*)JG^O}(`;eMFgkRHSa$IOL70$1p3j2WpwSrGz0x;8Lr3vF2 z*oICnyliaw;=wnrA}8*?G*MGaUVUWg5`G-AqE<6g zUn~gvPy|HGlvRH9$l|H7H%7_Nv1$DL+;i(vb;L@@%K7tG(qR4-8sz`}WI7&)OC%M2 zjye53%xRg>qlKn10YNuYTHoVC5Uk7zf{ z%PeemyK)nC^G|k&*rjMcD&2`K=v{rF z&ec3L*o??;!vPl28R#qi{1(>1sit56pN8& zJlc$|q`;$L+7);-0rC8x5OnwvLWdSgy_wOv>|$_mZA-C3!YBfeh>3aN;NBr=`9Rls z+K54B)F~7?lT2pR%C85!k6dQZ%H>)kF6b2NBi(gQf+*QGmNaRcs=-;%`N8bcXk0!gT?-EXCK%>CSU+VKa+;(EN$o9SQ!%GB!br} zx)T)w#(S_Zbszl%C^sJmx1e3rXARGabQxND2rDDR!S}I2| zFR)_VD5fGPk69HmSW8gOQp8F8u^1=e#nA_Qksyq*nE^>iP>+36DXyrn>Xo_xA|<>& zlgDYG*H=^kFTx_%R@n9WYNNZ(V=@CSSacfbyN!#XUC@x}zJS6){Nl&lct9630VRT6fHBL0~gpEoK(r9J5vV^?IZhvQ@L!YGECTo*+^BfPmq_ zv`&Tj#}-MwXV!ZnD?xhfEWMe*_F(uP>=!HXQk3;^u`JAX-K-L3m*$&w{kc+keDTe1 zN*9i(V5TB8Tq2T8f1le9T@=IhVEA66qBWw;1z&eDb8Re`VZnnjOD*gv#ZVO!%>RPx zTyNDa)ToU?7YkhabyYX4p`9G4fXVb{QfrD$eWCr#;nO?BqoC)+tdI=B4T>j zBQ?w2{*cDYUIW1~VX?y8jY?@roipNTa4LUgIT!Em~G6N zj7DO7Sfdlm6sBRHMqgH;FpbbV@?!e=W>?%m)#`Lhm&+A5a>BdGnhA}RXual|1;T3{ z_u!kl;ysn>bZgh7xhm|ckW$=bu8z2+?A_N2C9wP4GiBjEw^SXd5$;mMFvI5QWweHv zIf)SKbVwYe*d+C*3}U6cjBAtlA)qI-O?D|)uB^C8E5wRWQ4h6}lQ;!97ub-P_qGs1 zNoz4kq0%Sj!bMh`R<4wZx$ZKRRx8y?zO}wwDHn5H(vU`5Mt^*j1f@#vs8C77@`(5< zDJ@q>@6c)GvM6Q&yi&-&I3;{9>R4=_E+|-%mp^+p8*;%W$FlxXoOMMcolY1p!H$^C|l5f#8H4Q`cu%xd=9FZTr?XkB`|Yv z!q;Hdd(Eu(6%-D_1>_xif52)B2JDt#{tEV&eIgBhhb8E4@@=@DE2x z2meTvbde6yW(|1lcCQyP%EBv|v;_hzU^)L?OTcddvLq~5KjVKECGGsrqok8`M){wU zcJO8Ym_7xOh97~N3dkRjU;-Qj5Y7Y%?%+GP@f~mXY$T)h<87Xe3y6&A2l!7<-M;S z40(=Dfv)}|v^WHu%2AM5gp-q~!~g)mxmK1DU_Z*CRsjsaSAY8o)g^jrquo^oiP+-u z*t7#$o7-tDE2}Vvt=YP=+@eMK*Qp-<{=z-w=ELvFq`4+oTK|(=*c}abEvgA+Vu4V# z`|NG8)|zlIYPHoxEaUC@j{x8^=Pd$#w`2UL1^Ob0sQ|CS@ZXN4je+QSfCj)pXI8)n zpl!+Fv`JcS^Z8x6alO;;v6hv|Z82v{12;~MwIlrJmav69zGe--Z_OI|(U-TDHIz*! zHkA&Xw|)C|wg-^uesVLHg1iEal^ACn11xMM052n%D<<&oinY<})90T3z3-lXPS$$B zSkChFB#IJChx{XWpuPZQ?3NOwpHYzA{jT)9b-koH*SjT-x;2}v*BSbC1QLSA0B zEFBMq64_O&8sd>qg8vS?5DFG9gu`&TLET#NFVTmP2V{b^Q9!?7is*C(LDT84Ct|V4 zj*FKq=k!1KwY2zm?IxFl=1#JctQUNzL=f27-38Q+^;>gW@k13mced_?)tmKCCsp9y zLAJhOd-imaDE|^2WNU?r#>q2e8NCqSLH1$avj5{m#)g*vlwR1}47&>W!wRrImmywP zgAY(43o<}T2!14&)hO*Iga+7^)qbaov}miEdLohDrfO}+8TIvB3vD2zS#*Bkc^&vm zIK)Co2{Nyh^YNsj#_x0lY7{7kMk751ZD1^0n#LtdmWjFYsW5D}E1DWLUc{Y4g~y3% zr~klJAXk}Alo55Jjo67xT64BW$iXHR#HpF)Gi^GCp9m8G)Zo*1AzSHmkhO}h^kkuR z1E-J0Y8IZ^D^SqCJ~h=5JZJNIUStmj?EqopDg+!%;9r(r^Xto~WGvvTTYk~J`4=y( zwRso7b$>Jf$CWFurfEMzt;R1pn6>{kU3w=1lgTA0r$byT+nLKzpp!JMJEQ6B={ zf#OuX*QO@G0;rV5vQjZuVFG%sOdhJmUFBquO69#bObwjBBFoWw;J~$?Jlr9wTiOyKOgS~bfFt}U>z0375PGvR22(!nWm6gsI|1TqHTKW?E zLmm!wE~>4a>Ij88rfO>!b%yw}Jw~J3Z8Um9_Ug`1sI$fad>Fh|+b7%G5p0j&jt+#} z|6FLle)>0D7kwT(z7`yCs$hL#mKPn8o?>M|y>e)V*_ma<=5PS*CfbgN$-|HA_)BZT z81b0O&Kh41q>|xASF1-{;TlZD`qB{bYqE%lcR?ojAGP3D2EB)++w zs#n#ml9BA9B~t0qsVt#;vss{4EBTL!G7!Mu_5X1?|HEH{PdGzvfX@C|dcQDYID-UK zYl``ov3fXUN?}8_t!bv zoAf#f!TuqyyyJpUN0luycmhmc0}-;NVa;e()zKqY>!gcZ4x-t5e0E8z*Wb1@v+PtG zvAS*WGXYLag}SFzRX@C@sq>6Qbu|mlz&yKd`WgBrXBFmINboy3Y@W?tlO`B05&xnC zuL6(eN4{iX&ilv0CjRZ_g?~?LSG~K6vzC@+>2+p#j^uxQ^UZX)KFxBfV4vujUc}WD zaXh;UXqktihO!NK<}54tfE;<2l`MAHn7;tq^NwS|%A5^3n(sXZu*@PYoETJPnBOqN zBozW^kEQwK2!`ND+|nnHiXMLODDxeVIB%-#YYY!_4=!8e7>4$zatrQyJN|Fhu~or4?E*pu&Mab#+~8# z7XY^A^07!THuBhwntxGh>Nkw(Q9QWw;p13(sji??R7$uq*hAYDi zY!Iz4j^(VTA1xU$g8rYT@6gfEn(sKOiBRm415X`8H^A_Iv@o%y{`%WYe=Yz2>#rG( z6>OwWQp)QoD32L)Tbvn3*+Z6`D^lBBtE+M-Kl-tRDh-t^Lfsh2`G@OD@VLj;Gglh4 zv^rD;+_ZNyn<&)+sKZqsG5Hx}ZmBQ+Jku9A#f5#~|1x)w{f8Y?$3*b$UEh5j5bp)} z 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

e;4Q`iLr&D^AVxwkFF@;buY7@gfZSk< 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 z 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

$!dwZt3i73BPG=mgT&&(-{)N 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%0AmPyInr(eRrhh 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%0DGry?u`}&@aIE>Q^)= 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

+MeA#%Kap))>KKx!8G_?&liyfV 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%0D2&`)D^8LDXB|HAr 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 z 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

KW)PtEW2(Ru?-zq)Wh6JK!*9a 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

pwd~m!c=|}|a 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ⓈHIm(BB8si2=O?hv^Khm4mUi)CD1W^_YZCv~gbLQNA+!sSo)(ms4r_X^|44*Vgtcj^~lO?)!UD(nro(yZ|1Kxhj@|B z{fMAeLa`>)jvNvk@M9i?_Cq5>p5W8qTHCrAB1lKI!IJcP5_4;ohn&mi)^~Zkmd#Fi z0!zKOlNAJmDhXNsfHKe((Ya<;t=h$fN10=O#I@8;mscOHpTmX8??|&I(%B}>Z+0G0sF{l=$!FDYi{W5y;O=2wu}1u89vS6!{E)wg3FNi6K(5Tt zCe%-(87696+7%R775F+K1N2DyKX7F7hx?c0=cL@b+AT{}8rEcBxSmvuDt#Btrn*f! zu@z;`KAq357jRdRJ&x8trpNv~Ha$&dD?K~=0!ycQbvf(g`eQ5h@bYU@1yAvEjiGnZ z(oit6s5h-B$v=usGq0j^`h?csAs0(glUxEUt>j?z)y^-nCZADzcvS>~anPB}w1u=C z2(n#$nl4RIVlo*$Z^=*EmR^0F-FfD=RPWkmK=SHa;CB&_Kelce8hmwdXox9vCFksZ zSu~xz^a`%Ex;FjNiD$ez(${s&?#m{sk7%=cLyzuZuIz6z_qUE?mT+=hqYwULgZVGy ziD(B~W?mkkhIPFDMZ`jp6^B;xkTgIH8d1;WfOClUq5cRTU^0{blhr|AVaUk5tW=$`23x$fIii)G_|h=tI-O+7(<|6_@5c(ZQsJ9C_86{=W>bSwk*q_{Ns5FV>9_ePZQQ-&{#s7+MlHW@g8F$?O?v zd!rneh-oDTU@T88sZAdhnmKFzh`p{aEVOmv4%tT*G>ht8k-o zL!)*NWyph~SlEbv^PJ`jn;GKhhu4f0d+x6Z)QTxR85w<;L)EBdVcYfhQ+I?F2ua;83v9!a*| z@pqHx&ayUiBlq^7_ffrPhu&L^9(rUM__&YH^rBKpd1HC;ZeKL6dp@&(lStXcp-v8= z0{C_c90(`p9pI>sXLjYWHMb-1gp;qD;Y>CmrVkJ4rf zh6&F-&V5MC>Yo7zA?kdI{Ozl+xLaa1qY0`{6|h=|(#0v8)gkC*K;jr() z=$>3U+ht!ItUBx7A6e_}_1D(plYyEx9F6L0lg0tOTTtqeT@69&bJ+H)hKG{d(e=VS-ZC@^6hPf%Bo0bBV6B`_WGSv8Vwc|D{^$ZN&bIgwK<(tMv zGiN-rZv%cRGaAi@#z*_G#=5m zZVC-EziQ1e$F@G_WqK0!{tVb42WdA{-id6}Kfv|J*MUPYWh(NB251?J zAJ50bOY^3GS%EV!VAN$>74-47TOq|xqFlvrPwE|}gxM|ufi9~N%$m3R8bAGmsSsR$ zHp^}89er)2w>PKB!a?;jKQ$H2u=}kIT7yS!v+9L!a<2r-K(-B2ZOMocyPI5tp5N<^ ztsBd}@9awSaX;x9MZ#u~IfJ*cz5{!Z*L@#-@HE5D=N%|wZ2`4L-K>Kq%hz_ae1G&j z_#dXffmY-q3rXMk6D~T)tl#r@7txmhvU-j5)h?~9s#aIMP~&EhyFQD%mO1&-$A6CH zgiI|%PS3~uah~O2p$b6dgm;nZm?ryIv5D6=|OPJPAxqr|U58ktZ*~~-CoA`{6MRbVK z;PLQ(=*VlneXX5R!@J@See-LOF+QL8xI4+Jb=ySR`q@)!kFxnhvHDm5{13O0)Ja^K zJVPF*?BT61s(Y$C#SKO*)k^C4C}GdU|1h83(|&(iPnv{YbhRT`M2&p9iynTOTWR|) z6oNVb_6HqCgC|aQzG{eA@|mTUy3(Y4gb}V5@v!2x4{^;=W@duxB~OxE^&wBcGhVrQ ziOW|-GPPtdluYI7Lsf1=C`XndmX+_v-AAzYv&e0Vc!sZzJazhTOtBVN`}vbgO$^D? zFKAMS9$NgxbAGYLX&Pk!4yGyAPXHFZ`4PATPRs9az z=;Vlnl_}-uMC87X?^}^H1vHbC?cl5I&XK{Bxg%34vQq6**5aqlR4jQ5ro1#I2A82E z(P@>e!~r_)>gdVQrp&5@-3mU8#q2~}iT)(!LwK(3iMO!rv}v!ccxYAx_XLRGp>6?m zDp9Jp`Ld}8o+6~XC#ai`&?!2ddA)^c@;G_2a;j|hS~Nml3E=?U=Si9qLZ{P$iz|meCf5L(?&RDnS4Na3hlaEBZGbs%TXapEACy`;mNFPq`Qp>} z?U;hr8nS$2A|j;2Ls<4G(1mI{^*)D5B$i1==%RDx@&bX>>@}1v zE1rGsaaX*+T;1BqOmIlt(ir_h#OM^m$>(Kw01(1u{xo6d+TwO7I59xn(9`v=x4gM~ z@_5&<|Kin=?v-esdF0tgaLzG0;n`w5>dhsea@Yl;=~ z(DKc>%7c}x`CYY75O&T5A8FKcqDbO#?rnj6y6~QSUKKf zJhWh%!!L-g-a-wYUL5nuzLDJ{FbQaO|5fXeCByHMr}yFU%5FTk7nUs9g-!+{O)=8N z+7ycA+QpoFb8M1%7|9RU#ntP`2KwQ8PD}N)pkn|z*XIAn*LwiARh{kQK399|YF+JV zO-q(6S&}s@FWHty;w&d2J0XOSKu7{4KvHIaP+G#?lo=>x?@h~U%f}w2Wt34Uql{80 zU7(x)bFL&OeEoiZ#foPf-E+@*$MZh#^P=9Uf_)rnV&cuJri^NCqb9R|l%&vYkldOw-WM%UFlB#%JMXGRsDEoHVc0BG$KI`E;!3vEzb;BM+H& zPv~O{R&1<)N|s+`_6b_OHha=+kexjS`K1xSc81!?CzHnqo&DpBvP&)-tU87lZR|I> zvWv$n;r@R9e0NDpkMe{V^P^naPx$!&@elV`;6#oj3%_gVv)v;)40SHOGkS+ zIm+B#Ka8w7ksQk-X`?a0IpCqHu$E0+xe@KgblJ$;gXY+hL@74y zMZ3%?nIlqV*ZBO!@$#i;AE}76W(S*A8gy#Wjpdi?cf&_2fW6O$PN^AD_!RPyM*RjJ zM_BzCn63Hx_Ged(&U1X(jYi34EfV1$#kdgX(1=UapX?sB%WZByo42Mr+>%i<>koHc z$j__U@*aPDqFV9T!TgR}^S#ULHSYz12&WHlzV$oK7<5)nJ8^R~yr_%m;7u}1fn&WA zqT}b0+sM95e3n<=kxH6V_Q?ec+wJqM9kE#boN$?}VcnXFF_tR$tXW5}*OeZ=dIh^c zRj?%HhaDjkQBFw2mZ&c_8RTzgUa|NJCi`fBuij7hWEC;oQjr>wdID#52&>Vw=RzcF zK>+l>sirNan5gBJgsAhtM1=VhQ5cQ3s>@*QG%FD<+ygc#XmH2nV5P=c1L+Ph)4Uibkae;(9`*g=*{3 znF#p?lG6yFF+5q)JZsR1X&pAf^nS`;F!nwpSt2H{#1tmK^)YAk4~qBoiDZXXzxLs! z{?rJxRQa!2?Fj~htbTiG^f$w$68Y}vqi=DraTZ;>_FHg?-RVFu^?0N|cs8a~Ngxo2 zK4(_1y0EL1eVS9dqfzx}c`oxSq>V@M4D}^a%<1?s^h&JYE;Odc2^!wO1Oy~Ri256_ z0OIdFNEr>prwJs}pMf3-lp2DdH#E>=0hc0>955Y zLm=DkoxS=P{@aS)=W!^DQm4=N+I{!&C*5%e>2=58OIE(yn?9~5>L}*Bw$BrbRW7%C z$;PAdf&PAsx?9qrvKi8W+TtU}<7-wOG~6NLS9Iq#ESs>HEK)@*YRvTxxPx4ExWw#4 zfFUDa3u{qB&1(|=LIW%1L)RYF^Tt{nfK3Bb$2x!n(SlqX)dT87Kq3@6JGo{s;U+Cl zMmI89_=Zq8eT|8BEefE}!Y_?GJ7XbJkFz%$BF}ZWx>9L(?(or$>QP;s-)4~Z$_!>Z z3mI#pWDu33*xLG^4(a>z0AjTjMVm2c<~ody;!`=_(sVSj=va)-O67ggj>%#>e`#6g zYEO9cQ{IwmR*z?RsALYf%B3F8T<9BcCaODfxmk%wp4nU9z^rWScX8VY#WGP7j-sPs zjP`H~#YZ85r1z9wn}CDtkL;+<(f*=?V4)AZVrJ>~A-&7(H|1PYtG4v|BgL3Y&Bo$! zLo7T0muL&X9K<(m>EzM~Z5ir`%|82-V+*->#cu3Ob=I$(U3;g7@p^rCjkCT;Hdss^ zx_S;*)wtX)jXn~M=u7F{#ZE(y(UdpEi}gL_+#!BnHXdRJ4aI|Y%fKu)L@O- zQ@?=8@)6i5s+BztwpRoNC^`p9sQ)$<%ESAw1=mV*(k2*&oRsNCva`RFt0D4$%m^$` z>V|0WNDD=vc+i-lWxr@<`VzD)H;AN48C&u@GMp|LO;|fEUCD@!bs9C8(uLN2S;{e> zvzejtEFfn)F{wyGPBrDNVYLUWHuqutKNyosXECyhK84ZdvnnihyIO_$*9?E=k%Qk> zk35px4Q9qs#OUg}r}pkOGv<%=$iFGx|4VMr0p<$0&Jc zG!m^EjYFY0m6)@1hPcf~W5SS_Y&{x%IxhYWHgPcXm--~Lt^V!vi7CO?Jh6xgn&F^PoYH~aDTMqeBxJ{uBE z&4>hLKtaHR)>jC{lPVa2gDp$Q8d-bgh-H&*OUC;JzmeVStYm{CM`G#13D=uU`Ylz` z_M_yE$d=RjW#oEhN!bUfd~=t{SFZ1^+WP0N>+|L8XJsmfj@h;vJ)DLNX(HYI;V-@j zPI6m|hsG-86>yc|e*Tg#cWzz^V10_sMQHp=~`C2!^k{<=x>@8C_d zNR`*zFhPnRqms1zn450mm)>v#InSHJG_TuvV|xi!bOZjriQgm=J@Og<{rB|$?S+=> zEc9u4gxX@W8~?w=t%UWXh*yKmE`S8Eimmg{HACuF5=y#vZ{952$?ZhCP`q~SX-u~z zol59)u_g8U=8pVP-Q~!4CymAQ!NhUgar~mWb6+Zd)w_=EX7RS}Fg;EF*!8_%mA@<+ zvxNee>^-cUoYiGf6sCf6>@egXK zkDifM2h?RxZQ&tht0z6Xk}?l?3#Gwmbwi@aJ3?J}W#^Ob*G8lBQMo?}Tu~?Nkqxo? z6l|`tZ9Oz;j;1!Z;azAnK|Sh>E5R3Na1u7q5F{a0|^z;i(D`%%;?#)@ku^qOOk`3QL3f%9?G;wjP~64+@JKCJ~Zb~n}`;+#5XfX>`onb4HW2(PV-&l#nzLt zKL33E@j>Ho&TLB!Yx`BPAi0rW8cHxvF1WM5r$67{d_B7{Nc|&$>)nX;CvcCcfQ6QJ zmNja$Xrsd>6iznYbB*s(iYx^~5BMgMW4cS}llc~{QXquNZH(SxQ^_DlQ{OJi^LzOB zYvj%+o8PpHe(=q+__wR%t`Yuy;t}(2lXm78FNI2&i6kP(R#3N)!UsJIF4JpP-@m^) z@taUt_#UM+(ZRD)%*6dGBFG1AL1N(l!|XhSzk3_)ry9kYF9H9O#!MN3QPIe0=!(y5 zW<*Pkqy-3K2jI^J7C{5!CU$OtC23_eO%%O>i7v_5lO~f-l~YAHZ-f_jCx-16^IUSJ z)Y$GCc5!i~NzZ>i`&L5du-{w1yE^eYdM7_8Ci<-N)he^G-|5C9 z%^g{P!QSCBES7`mX|`|shB@Ul3)L{Tp2{oQtIV_YY4Xq!mBYxhAjL}1=Y1^p)mu$} z#|f;Frsbtasp0S&a0>C^*wSl9_&_fj_jdoGY_5ka!@P3c2uW10zn(w-x?z$ShA@wm zzr|5obVx3>;m)DTohOI4+?D6Af+8k`#;!LcLCNT``tKwcdg7Q8{}55!vV7(v{+;;r zSkW-pb@BS6_k?Q3-J8m8W5i^R8eFEhw%Z)BBNw(HOXeg)$n2^Z_Sg!C#gba3T0SL$tff|JRUKS7SieB$_j%L>LuV%M$RFHo z(Lm%ruC*j=Sy#k_DA33kii^;9x*eb|jRS4K&elQi*FA$pP~5V4fr4UzF#G^Y?4W0v z5dsK@l0YV`L8^kX-GS|GQehcdzL_R^%sZ1ONObm?H*NMQ$I_tP^#Cd9umrWZmcGcTc&->G;Z$I&BN+U zR5sUa$)asp^y!|MSjn7GKklM}8g)y3GB&o(KM5pZ!_9pXt1p7r9Sb={%F~Ny6@G#< zPG2a+sV~HwB(s3q9xlwIg{CM?H?Y7hmARHa1FT6H`_IxyE@*zinWQuJR0f@r287l$ zIjtMVHbV!YZ$x0RQ6@%C052EGt#*A7batnA?9x8tG5w>Z=Spc~vcn_F#EVib>oK4* z&ycFD{{M)OC~h6Gak=2sfrm8{ld3PRr8s1=>QW?N>{Q*xF14P zMy*q>k@$`;n8rit&?JB4P-LMi?z1TeL|96bd%)`-bcV)a<7hW~hO3|z(`v{Y>=`E{ zXfdDF#Tkh`TJsE$=Xp8SS=`3$J4G}o%q2)Px*2FJz|ovd2#<3?YY^#rrRb@>yM;&o&D2NF}^TSzt9sQ9RKxe z$763$4o)AmvTf*?Y4SE2Jz}(9DGhv(G{y>HBC=?P!XWzpLwlPT8~W87XS&f-RuHSr z1~q5*njKu+Y=bqGFOohXXbt~a@9eX6n-khmZQR~tjs@NF?ZRNqLL&psp65`Q&k&R0Y-#t)8@Z*IiHLQD1cmkL9}KRRY}Pgmux&9+$!7muaH zwiE}uR8q!z27E(3TECw4YjzZOmNfi_t^|pbf#IH^hklCv*szfWuSV6;0w|MnW`9lh-~GBn^=HE`>V-kxMYT~f3s3+~*!9z%>ZL=8Rj zazj)6V@$}*dN6p95vgsKCybpYQ>Q7-LN80_wprv|ESl0#@TFs~RcE_Wq{ctX|Dtj4 z`}ge?ErNeOK($WNWH?Z$k%o;2+P6jyimS!##x8GtfcJtuf4z!<@z#k$C+g;S)TbKO zdNjwy$5OZ5aS`T~J;MKIhw$L9IrPwMh>>s!GsoZ5wSakm-{+WEwxM9?ImG*%?$Q2Z z`*-x7+RLQ258yp;Gdq2)a-lvuCU5|0r!lQ&wWgoI=d?~7eNB!0d_Ouu19|#~oJvlw zzdSYeKDqLnZ^+;O&fBJ@m>_=*cHKCC4OvN_F&di)I zVFOWg`#^U@7o1v0R*(apnN3IqO&e?8QV68W{l@H(HzQ;1TlX*urJSjGN#+u@C!BQ0 zbrw{@nB@|a+~p7Gj9MAGnj~tKrrpftGZ9(Dyk=Np(Ynak;R>6}rQQw&bO|}umdUKf zWADLu@XyVjZB8s>KH+~KT|L+*b9mhfZeE|OD;6^J%1tW%GS>ow9kn#jOw|S*r?pw2 z4X*+t7ll@N!o49(mO!;S&Y!|86KG>*T6s6S=G?Hnu;TA{l5gr?(sj%MFIo;>M2pWs zdogP;N;sU<0=1qktuRhXYiS2;yC2jr>Eh6ZqVI+Ms3FonmL?`je>7(E-K@HD`1-?2 z(G82=EKN=hzF)5&IW_t=xpHdiie<~L5dP*LoSItOdsgqR-aW;mDfzQXBswS87uM}8 zo>Sh1?_An*5U3sN$s>FA?CC{JMZRos8>Uffng#tqs&>1JM*A=paDGj*A#4Cqm}+&= z``ySm>EHz#QqcQN%}GO@M?g0Z$ZDE_;LLX^+ygV)+U_(86qO!OIUF{bDaq!B%^6KR zmC#sY9i7fzosBao(bVI2yBDOrGS14$LRqa&Cw5^RMtE){o>&yMbVi&akqNbSyIn=3 zU>0R18i^)sj#|5wBDFlNP)cNWhgB-o$(8mE5ztm>M-i^8cwfNs5Pj>_lcBR zquSHypp!1wOF9aD4omG(?{j1=hS#B7e`vk#xzQ(odyuTDzWp}2|57>Eo^F5eG#*}( zRVf(!0-|K0!+gsuD~O32lSyvXdoc3?AQ7QJ!-7;T?UhI9;X18k)<#)2sx_BRJFR|< zBMu(kmv8PC?ByspsTt-o!A{bCuo+#_M%M~uDllNB5;_7DI89?q36>PAfcMQ~Mv+c> zjCiWBG3~PtR0qgQC#%}cRyY6X z)mM|Hynlk(I>EP-x0y5Y>C`D>wp>U5@Yblw?=VUG4f#a8*D@rtKxof5H?DJP;&1y0 z4^Cljgd@Fu$8p^zrIRhG%&a<=ILPmt$DPPa-C>gBU;W#KxQ*D&ec(iHK)pADY;q|k zFCNjh1r`Rol_nyMlmu%tqlrb?;6l(HY(c~S*N;l+Fy#OGQJJvMn{5jl#9E!2S$<+z z<4@PRJH5qBREzF5P-QWI0uhDGtX*B%5?sU|IxNM^AZA>qCy!7)24>;5xUqk7K{)B1 zsFn3vgddHVkH{?AN@>!wia)$2RjK66u#A0ndgQ|z>f_7AMw6aN{&*tPmrGeHYDc6L z3(s=nKIo!g8R)r$>4MZX-6Ln4^&QDBi!QRVexcZ4#6LN0syJN^t15CwvYL*~_OcF6;sQ;-H*?wJL-*x=u?x*^XN-RWerH@>apo$`iUqcfSl->F#cs*s*dnzI?5WZGT zlurL^O!b`+@fHaOvQb27={mTOtO(w+xg%)FjK1z4IEo4pW0a|;-C#4@6gus~;q6P8 z9?IXNE`m!vPr`Jbe!5qz*6L(MgM;I=eeUa)tmJp}jXXEn*9U!z&)9&QlR|-GOah|> z`!4|y`qJ+5rLt^rQ2dAj8d?ft-f+K&99+B*?ZuodW{G5m)6PRm7Zv%tVpGf&NZk5) zFV1)s_}B#Scnz4;<%ZAyVf7bLXhZr1TNzi9rMneo918L+OjEcG)LtVEIq)jUg8vZ) zeZ0kwR8O>z+SmK4o(qT1moV3{-VTS+=#;6%D{3o;uLnKvk*SeC)(`})D_OKjJ=>`> zm+o6~!D@Ev(S|h_Ea6O9GyfM)$Rr)bc86Z;i~NOTBXnR6w{)BMqnZs^o9q9fdr5}A z^q(Lm)FU>f{P#J~x)OYlV09YFlEAGMYPrqex@oSOhyr{SO)>-^f!eqh)FUW^RS4Jk zF=~ftbi;hjUpeu6VUEuq+yR|iS^IiK=X7|7c4pXiy{_Ana%PfoO9hNjh2&&^3BjMs zoa^ncU$%JkPh`v45`z(rC6afQoYso_A=1hNNEMxWrnC@~5N|CTF6 zLiimOT{^{f*`VZ!PV(Yt!b8-0BZxf4#H0i6$@~grdGD{UAW!MsP6&Dx|HX!_T*%mS zBXc%nQE<IM)`9}XH)O`txs?k!wAmGq&z7w1o?{0bWZfnPR* zOGlfoa5AA0ivvnz_mZK1{*(XpA4Gc0B<~-vU78t5y~jWD?YCs;iJbqdE{=o_v7O>yh0jVowzt-o?Qf9a)r_hLM$gj`5cw~u1@VdAb)RHnvmzn$L-0JGjlQ$0vA88FLmcYfARk*Vz3K^E%JjPX8v|@4fequt$e*4V|bVD8Ray zYVOd3sa{N@N^52Tc?sr5z(1Ou8<_SYI2#+I# zRz*b;B&lP}Auelma6S{{W@U@uLvGG^%H|<`qC00xyNCL^bqB5Axf64|#N^~tj@Y2_ z&Ek(9tiAAUN5`gc_{F}y9prsW$z(2>00x!@)p9WzlM8UjiO^_OyS!d){qj^|o*Q@} zv1KtVDWlH~jR%QyqTppytRcyI3lsc@9&KWs4hk|m>o<|(e({T65VWPCcfK2S;DyjV zn1{(#ttxv1atC1%VG_0-<`>}BQla9OnZ*glHl-#CZdYK1QjbgvUv#mcazrEahX;pW z%#`%QY6p-7G4ofFWyHWz3%5%ua*bA}O0q7SMcpUEGz#W&=`)X*7xem_&}3HWyvXM| z%2o3f6I6kpSZjlWKBxiw^4s#>LrwXuF>{40g_rt!`H!}1O$LK1V~Io(P8Vxsi`xsu z!(4s(R8QFz?oG$cW$*ev{?AOO!k|;d`Ay8$1|LNNA9xOOFd1rjhat8&Mo{p|(q5Kk z`Y&j9LF-O{<{MX6VLBO%lA5{w%`Am30}@=pjtRU$fu;eYc3_qpZW=whIa(HuE)u!) zx%2S_H8Nx)Kasf{i+d`vllJ(RPmIa?A&VESB#ys1`y8la8g<|q*%6#t#TP{&X9I?_Rha`oJ$nOGM;sp=KK>L zlgPn(^_{FmsWPa{da;Rhmb(foz5QG!^w;Z3;Q?l<{w(>P2Vg+sj6JX&3V6E~=Lc3} z#x68IqBZ{JlEMl6Uv&cPDf*|;an!IS%~;KaCLifMG1)>S3&lqRR1=e5>OM02wIQ9$ z?oz76V?$#@vqm4+z79S0AI}+kzcyzMbJb~QXgjpJxOUdz`VKwYq2D-54KJABKR$$i zJ<&y*A%+;p(wOa^f&}~u>4aF=Rfk~pP7e%1_h|`pMEz@A+a$2IgW&flN9DA(vu4hY zu=R~Tp}h^poyPAn8ku5~U<=UfSVReLI7!WL9$Sp=6j6YVA83`~n+L5C>(X!FUo}1v zQsE%|U70t>tFPC_$5#-8^EMeqM_~ewC^KjqvYhYi+i>rnusIM%nvxv>IbvEBql?Dl ztf4d2W$yB#>yZh$HIYQ88BR`Q?TUF74z0?)VD(|$fznsi{!ucPP~=#yixP zHHcLbO-H)hVhdEuN$nftkgH^z@`i&d3xTO#!?a^etv0K&tHg+wNqOg(t&>=zf9PSI zdS}_oMuJ`i4U&o0%cUN4S_YSu!jEe4xQ4YQ$#!Q(d5+YGZ46}M1J>6+@Q6JCt z`qWN^zCGYl5FLVEnbX&2R!O8G8hpUSM*$qm`Ud%A;*f0D{vx;(JtoY>>PBhsZH z!HWJKJC&D=4v)S{URx~IcU-Pb=pWxS1kEoA|MBo!M@sb$(~&(@n=@g~ts{9wS(nK7 z`vZEL*3#*iSHEi5x~4X{R$r4&kCsie4reM4&s&wB&0NGkw!La{GCbR%>%B|wk9G6! zkUyXvDHSyGM$orlY<8G6`p^++2ypNLAUC2>iUYv3H>oT5nBs^MpaBA~{Wh`GFF;x9 z4glH`j1b10Kk~J4Gt+UDk+faUr^lJK8~OE+qx+riQuaJbXJF1B$ma)ov>q+qdiZc* zQ=3jEuF=-8k<)Dlwc*RcEE~baGz;EPcR>3e z4K(l~vrV4^ekkrsQ!yU|Tw(YRQhb`_cZXWmwpE7<;(juHeG)xm8I1YkBW6><=Qk!I z-Y5Cr%grW@jwJb)hq+*3x$ijg$Ul`fIhla`o<#2m+1ZrMz$KL~uM7o=`kz-+KSuw` z^CTlY6)RQ{uTEu=dJ$L{x~$eD8&kB$I-Cl#K|`)Cc70^ZhF0~GUj9i#Nb6a!c!9^C z3ZTA$)B^oi-mqyb7OMR_RzP`gin(NNZt^xEVUxENz?e&#sOsKgL`W=9CvMD_iE27A@;#q@G%rAsPv&M$4{{CLdWj zT9N7GHgj^klwkW&fviyl`S@p7+$!(MF%ctmre3tv;&qS!eFhLDzRBGEp|gjmCtr%->sm z;f0GZ+zGFJh|c+e24(`e-A*9AK-!3@IXVZ;KVTXOeFgvB{gbh>Nu*8kxVh;dCF%fHQ7LC(t5LrwC zR-=_8SSm9*JzGd8Vrf>ZUUaA&+OiQRD+S0ZCvzpHq-Kt2Lf}a&?Z92dYl*h#6fIpR zBgtrZa=2`bowGI&o;_SJ{q}7}3NC|$HqFcb-g$EU@nY?_qlE(VwKP+kj+%1aF}Va0 z8jTgip;RY!T*9x&tWTvD2fG|oor$I4GJpM6<&h$lxR(w{oSny>$y+C3s9-9D z++}fO{Q!StWNF528yO$9*NM|%>glW4G{KeYH?CU}@J*jzu#?-qjsAFF+v$3T>I@RMTy7}?XsJDp$cCAbcng;>p%39C4;~JJvqEDQ9gKst7t8$+EbNKK8Idfh@4XH zpI%XBjgmsXZ{1#VNY922ALj4XI1O&EmVvO8#;AUj|1H@JUYPHXzq--* z7%$b|ZE;r{STD{LRXjpp8tfwVZW831)L95N5T}RYyYxvP|32Tg>$Fk7QH_|zli#=D)Ol*5vMS`{Z@pMI*YbK_$altnf=Bb6gVO_lAV0&v zk4WSBz;wD_hv^EwKwo!QT~PTuOMx=$*Xez1zn$E?L_M3I?sJrTSLCuI%!8-aYCEgd z?E?dklka$mV7px4;4KHQy`gX*bXQ^g2wro`H8=2BtoV$9yY8_vk8;h3L)&2(i@6FD^YM{d1DdZ z>sA{KMzz{*Wtq4p5J^~G%JZ&3jNH%90h9Jm`CD&24)Un9{yIeGu_1P%dQJ<3m~t)H zw1>k2QoX~*96=P*8>R|TqMN}S!3qOR0H#YM7%ey-+*+X;iXYq062($9k|8ten~74I z`%>7OG*bD9|HS4s$cSW)sQbbx);&3A%1dN=-5VV28iZi95)Bs|c%??x^Kw*#$O~To%|72q9O|thD;lZ0HCKx;GYB$bO1=JdclCfDb3ZqV8 zmK$^mvBqIlsin4{O~bFTd(jPf;yhcH9dZqN#U_Gc^zfu zq52|nPb!!0?jjFDI6_#vF|6Hk@WG-26Nyf;XvKBHEIXJa;SIbKEEtxCQp4y55zYkN zFX(Wh3mI(Me&HD53+Py*O)`zF9Lr2YI~vxJ2N1L{M6OVDy11&%ro-rQsnZNOSN?xS z&N0rmKfvEl_P&+O>&-eoxnkrmMBYafYL%!cwQU$CDtSeukV|hF)Vfst61`4CuH<=0 zreqMa8 z(v^_wJ>!Gw*mz89$))`5?%0|HXUO%WnTNNY#Gj5ek|MS{MYINS6YY#z(yXeZW3L(T zP-Pq%;2mHzTHs70p=_vdilDmUCXJ2Pz#Y&B*GY2JD+nk9rD5ic*`RRx!dNaGJ|8iR zj@RB8-j)CSxf^d3`em+_8nwCh0oz5dwU_MX%3#^xatu`mZG@4@pS5sGLPpS2C2#ld z^SD%udn&e~RwG-ST-s#eU!O&OJ;lFHV)O}c>FJI^=0*Nu-@LBuygVBqu^hV95PBYn5|1-nQGj^Ejq6q0BOZfY) z9DEqyqX?Yf3z2(Uo7|nYAodKbd83Iy$ed>ujV_$9S8)6=+LNf;uKcXZpd{ z2~Xk`a*v!^CyuwpU+;yL^oa&bo?xc*5Oh&_}~A&|a`r%)en562i4lV)rkG zZEd6dkHV!0cJTmcXg^5g66Vkmx*o6|^j;#s6hdZdIPmZ20?6_Rr0JEn%qqRZOt@gt zZ-O$xe92Z}Y{8Mj{MO;4M0WmrM)#4J+^Jq(3i1j4zc&wpEc@uDOK!JHPxIM%@j|X@UFjzpjbFWO z`NTPsp+O(-)DwH~wigkLO zI5k&lakzADKb-|2)AuC{u^yw`6HQw48JF5=GfS)XT6=PE9=GQ3ZQB4_OURi^6NxQ} z#EXU6Z$=OzA2)lxZ)$4NqhUKcBWfP=2eh`2yXU#OyLLj%d8)^hG2yLn`Xi4#@=g0Vb8&qSy6xy7 zEs4-mxB)ya9rOt{wQXxV9y_RkQPac$0k5&eLTW7y)h%i)necszVPnN9G}Nj$Qc4PK zCTrRe0RcZS!9Fm#7R`NMsn@g0o{qe6P-&DrBR*E{4s}@4!7&>*8cd}IOotvN3Bh8j z6xkkENve|Fb+F`Ae()$_5NV7qBbzju>^_4M;>Kvy6Op0>)!fdm>bOBK4J}|Kb0uUp z|IpCz^TR_!Op-$Yq>sffS#0$7dii13Kqbp&f=85lx3+g>Hr0x|R5~522@PyAvu<5! z7nybW()*VfQ}F=ioinp!NPbPufWCdf+#1)rJnvsA%3_)QLhh;9a;a7(R76IK3(KC6SB8&-~9*Pi@(BguvLkl>U9# z#!Zht_W08x@?Cw`;K;LN^A%T2ZQuT@Q%>O@8yuXn!~!<)fMH3lJk9p2%B7sntIDNs z$!*9R(CL#hg1Zj6@cf3{E$N)vr{??>W~BZ)c|Choe}6w_v#z6cO)qNFOOUU}nsNLH zxa{a?$kXGO!8~`S5xc|ySs?iZ^P;t58rPro%>Zd(m?}wtL)szOZ&dICW)VymJTUzu zq$xCTes5ZQ0m2G}Oc64w?Pe`;#{DK%$}Ew`DFs0=BYj=t)-Kli{9d)mj$KewsU+TL+>o5e z`6RundA$X#$C^*wbWTEADU7X#Y1cnSV-AK*tFo5B{DpJ99kX4o2(S&{3gS7U#MTo| zF8RFkm#tnp7u{qAF0*;VQV;8e?9nv8aDo|_LzQ-F-71ww1HzS6pH+aXq5$+xW!3RND|E&# zC111!(1-P}m%`oAhOesOJWQge;NZ56nB;U6<`1WKxnA#=lmh zgBvdxyoM2>#zc~eu z`rk_>Cb;#Bs(TLGVKm0*>KPISe*RCk-CCxxzsjY$`-HK|A&Ci(EP1n`MDo1lg^5J|A5K_kICWF6YbF@IA;KDHf0h$K27>BBO{X&48#P2i;tV z;1HK1fNMINTqrA|Deh>aK`HBDr96)220Rwrl}KM6zYenl*>}N_OzXkE5~ktGj7ym8r#K1TTiJw zMyVAC3Rz4pOeyKjA>3(nL+$6}gFM=BJG4Qn_3!t8L{}nj#?>R%M`@>Jc_`Y`DBiT( z&CH77Y|1SD4YdA(9VI6Ao`B0U5k+@}R5qazGp;~48!_3eaZWGi??Ee;N0;#>RJ7-c z(P~4Lar>#3n2=+45gIYgpTBUcOSP7*XdO4yuN)eEiM+OB$Jxh9&5G0Z?%46G9Xn1q zfxiLXd`zpCJ37!#*ZC(li2D?a~^q8Zj?)9kwE>nR6&aA;!{#3F&I)Dgeui} zYoWuMNrp9`tQG@@^m|J3W3&;SF09+2yhz)jVR1hq9j%17Nzzg}Fr4Py6^ONAv@Vi!;r3v0 z>3MGG{Wk6btYo;kAB7|e`byw`;QTi%tkA(dbDL0I$9=$$3r{qC>KVk!1+7)jfg*sE zn(^n;U9LcSMc^0Fp)#ZPM;pVP8~r;8Sd4Cw8v&hVan z*ptm|i5BYCr8kbHIS`~Kk>cAw#D->+YPv%rdf;*JTl=~78xG8R_J56r5&O-6klB36 zpG|aXZNyTsN8ufqUow(Kl1Cr?Zi4>?GI7_6t|M|*zkqXLT#wnQl^Pro*J;W2C8|T1 z%kL@<63GNbV?jXiAmkL0A+*SehlXygpEz25nd)Bqe)(ykxXK$39F)ra`}t!v?K)k% zrqFlewAQV)X53zdQc6USFjK3gj&_T}9rftTYGbH=Z+>(1O#HOouMOvPD7HuS?|z_( z>h%#_p;HrL*`W69@aFtu{t`1?e~JVpBZA%&tFS@?|p>kQqhH2R`Wg?=nr{7P)YNZ1t8j+`}gyQzcy z$k1iJeE7_&%58|v-_-sIk;~1J7l^+r$jFc<{Xt>1dMAnRS5RLw{m(_`zi}b?%b73i zCS${g2FfbC?p3tR7F@KA%+9~=>3myZl$P2LF7;|5MX2Gw;TSDzkSYwC43YBx(b-ww z1s7hZy5frZUoN_cx!?kN?MlSl=OX4NLZ?SSP^WIN#tsqYCkpl1{r(Z@i#dqeEJigo z&#a({(Yjl1AuC@u4PqiQOsakmW$l$Jk9FxFIC6%RKv0p^NAF)!aq= zRhGleZ!6439YOt~=mO3oL{ zLr?sxYAZ`r3fV`!8YidANx_{Z1LvGGBCCi_# zWmVp|+~~Hvs*52Y(FgUQBp ziR=jp8}eJMQ++YQIf*PjoZ|SOzF`# zQfN)^^R(P8NJ1lUKQPW|vPmfmgZ|=98qiu~jo-k0s9E#fV&(B9vFvE!u_EW{u%(rp z-O1k)G9^0`SiD#=^;t=l?;d;@TLdFD&*<(xC|X??SE%ILuu&t@vwDeKbXtIsj7i{- zkj$)FwaVGeBHeRo%DGFKYZvi4^0!6B;+}cE%ZiKNj72B?eoY`8uJkBe{t!e?g6+PW zy_&!Xb7uYL-5c|+%67)gm-vTs?Mn)PZN-G?qup&r$vuUeAsUOfn<4!Ng^ZMGs=N~w zTk??BrgHTK0zdjWwIisD!Cws^FWk{~X4_BO&TYG>?J}&i4)P8h4HPMfAJ#z7M5hji zI%VYBK7m%*_#U+uJ~U;_SP&tUf*NDE58j({=jfBB*c{+H0m5%&3k~s18mQu?V(ML3 zFvu)YW!yc1Is$AsXT&F>0d3yo#grE{r!#dMG(%Ffn{p>|PMt*M2*jPAs%r+4^>=7H zSoQD|H8Q30YBVNZTT>V{PH#Hm(cG@BWsWf<(v^y*l-o84u4U(9V}(1~VMr}bDc!@I zT`OU9ocwyW$EJ~p3}&-5JE3vCir&xj?u&^>mOjD!R&$1{Ct!+&Ju)RaspgF6Olk@A zmQCwp!#$nmZh8E*M6U{mc-ZE4-?vAsCWP}|%700Eph%q4Is+Z9c%OdtWWoJo=TB^h zdtcS4qMZ7fDX!NO<^XKdV1U;=|Wo3n)(N zwOjk_32%={=|g$eADzRQJgh{g?2P3w!dE8w)vFr0R&P)#bZRO83K|pf=nn?_zi0cB zNSe_0XJjhCOe|1_NB7Q`^`)Yp9zi0v7dQJo zQCjzbN8X6jXjlgwAKC@e4Pncc!O;?!nU-)Tl4h7Q*r>)@Qji3D9-qUY5qdmuqwocq z%hAt4J|*;Yv_2;u8sZ4&1@8s6fmC8vcAWgD!_-w%3GKo_8qhD9~hkpI*U-K`F6o;QCzbhEsau(AYoLqGq z_?)bb6=^`70tH}Xug;~^x{wK*gF~yfZQFKNQA9Kry5#uNAH^ob0056 z--fQ)ZB6eOMZJ!1PTfX6LbookTY5)u!Oq3p~Usxqezxxi2g`+?k0UlQQ zhrj-s%v!#$Ey>rJJAUTu9Gaz#dM7&K%W{Y8=3mns7F|?|$5#h#|LD?7(FXu|&fAE1 zLiE4`KmR!qJ$~ywryqMCxp9>#D3R#+&rT}|{dyq4 zE6`sdwvde5eXY|8+!OISopCvUH8&zA?VIV-I25M?ive7LE>?4)DFyTgU!$-*SU*@a zEX)3dZP*v#ru-jYr??QsBxqPg-!s>q%0F--w1Q~La&i5wllg~EI`>>!COnVdIrP8~ zJ~@e0Pr0K0#xd1fhjw0d)rq8M+vOzj@WbK<9^g0Kc_+E`R_6TvTnmKi=RaCTentOogPo|Lr)rA%e8x6Y<*U3 zg?BPo=Vww&jqC+a$_}LOMOY+EY=C*CC9MV{Ot1wkO2v5)a6mZ(xGif!7TAaship&| z>8{Kn^r86-T@7ma>60^KRbfV8JZPZa9v6Ix9Pm50Aq{n&XRoCl}8 zHB46g5jj=X+j~N#@}r)fjeA@&gUY5sj}ReS=FOYetI_hE-Q8r~^faSQB$l_{_&`ns7}^=F38J^%bF|KK&(u)9^3RL$$nn%ohMT-0eP%0owp z)sn8hp54Ts;NMNs$FA@xTAxl7u$j}TuyUa`HR0|vaXH8EaT`~l&tM8zYCC%DWth(8L&bdm{}^BeK*>z8 zRJ3;si5Scd5vD1j+2)V+hic64Mjw(W4cfDQ(w?v>ma{f)>1-6c9_krlS=roKLFVQZk^zNo@=6D?=!2i<+Xq4@L9Vqos>m;lK zb_DZL{iZSI^U3;6%%Ue>9wTeVUw(OIN1tf+_rGTN`i3o#pnM3T5*zvd;P;AfeWyZ) zlGc?}U|9X|w_+_3(qSJ{&m}NI1&FMv3+X1zpX+yzG4D^*?`CGHa0vg z6&7vRoN`G1!RM3(`}G&56AtMd5v}|FE|IamaEB_SF;r$Ph(_m*_gPhLv!%9ZMZC94 zv4jXa)O*B@cwN+QN1OK0Z%_?{5`Z>(kfvIP#_bcK&z7JaA~HV5!um zBIOk52DT1!s_d`T1U{Msn8q%w*So@c8DJ;DBR=r8{qHHTGaNmP@PtXAB0o?8Kp;Ww zWY))gUcYvP`J`IEmRZ4%5o2tQ-B2rVUA9nUPOW6<*B5_08i7Jy!Ne&X9+#4vr4zs#xy%iLq-gE;KNq>`L*(tF_@^=7aQLW_wV$*0SxdM6jOHuzg#Y_vtY0hM z#bjeizHy4-X9VU=v-Nmpp=dCL<(hFm*pGBnC|ZLltoUDQWz1Wo{>w28Rek7J5;bRF zV;+;$i59OP)s7qe)h8dryNJkgmCNkrk7tH%HAPH@`D=FK@zim6Y)hp?%fG*l*Wmt1lsxv!iv07;EOYk`eotoFU;puw8kT+UVQz>}^ot=pdi{akvD zD)b99RLXw1#*_ykJh7;_0NVE^gfl?sWf@8mWB!Ty_b_Vy zOU=ux&*wiGA=fV4YktT;XTu$gov`Tp`$U@h6d5c|^i+F#s;3tDzgfc{yhbjVxNDHU zCfaXz8usl+!fP@j`aSu7-SsA*E1_&=f&4^wYTD9Ji<@D$Wf3Gdp%!Xr8%80AThsiE zhPpzINI?@JuNOR*;J+GpaVNn%hpWe!uWG`c-};J*Qyq&^?(va139-)WRJ&zdr$Vcg zUJMl!_BK5r^HGt;9&tbA3>c+oiHn-kT`~3UtF_Zwk2<0D1bo^Us_X~p#*A0@MnQ1# zYr;C8W=yIOU3!vz@|6@Lk&H9)4S{ax3Ev^I;J{>2Q8ISS&vjLfhA0^zszLBO)#~sf z4QEhltU;?WlJjYyU25NE3F-^VKrCggc-%dPfHt8Cp!qAV4X_*Ra|$V~*XL4YHC}zU z-7V>jjeUU+RRMa&C~q|ftx{UAHzIn)%%Fy=LgXq0NHirdq7KW=5aj48{Xi3z$st{X z9vsc%nGg+Ng_wfmCE*~FJxV*GrvTfflZbMo^~*<@Z}^j|8%F+K-EbYIIB(O&3=wY! zXDPfwlo%JJFtR$ypt;*3F{#8#$oDX)_JLzBF<9M3&Z|{<+JkJ$*rDV9VkDhviB_i- zYdKaU=AUNP)h{DyMtWpCD_UOv+|gdY0)rus(B_>eMRaoQ24B%pDrC*ZL}#bTRX93o zX*bHWVuhadX#yyExD;wmCDEJnc0(){)&U9OvV*aN%nEfF_vl#7SKr6nxy{uhoS!mu zZCbXUV#l~`GF<8DCI6O~6x+MI2eS&3WYHi!Z1mor5BvH)?!6j1 z1O5A7yNDVr3GNn^4VgJWIQb1XfdMH3yn@RSE`wGZ=;bo+*KZzUK7RgqjnBj%${2F% zI)+y2^2HkpDwee%q~|)!+H@)|;g~xrP6ph}U_;aQzRGJbIok za#WM2?(VFbifTt7;lBO$P?dG)bIhH}!R}%{U+kXbuj@x1FmK;gq5$(Jynd=uw_n9& z<{m)g0~pDlyNAqk|1goF@^bVBb4iYTZwQ4j&a3W~x{MX^u>5fteN?A(0Mxigb2 zir;^>4O_z8bI*Cp^FHtMHXcPB*7%mAb0)i(e0#d791PbQk1i&c*+xQ|BO32qbbY-@ zf+s%iA!iN0_ugWsUobH7mhXcJ-tKG!+fJLPZx0*jJ60lEtcqxM@ae0U*2B9 z>#l>#n`7SPZQSI(gcGlu^4<}GpV&AAublSRQHx6>c>cA%-MD##`CwY(W@c66p?^I< z9)I+m#svA}T<%vSp#iODjC+Br9y+wmmk?~7xJ3|Zblziva z;7vDe1=3GzAXMkO=?eyV<^2{1p&d2Q*C3)5kLET8-ps2_@zDaWmILG=OUeF}(1iLB zo}b9XXf>Vw8BzkCZb_fRb9{3qKCNNqavuxH2k$@b>QB46F1bV`7F(Qdl}Bo|=*fO> zF@71~-(TuqdF-*j!6iOT)5*>S+a5T8$4YNfuxR4D0&Qa&^BoO5XFT=SMcxiUA*J?V zs-uwUBN9fe6f^Rib6zs7&Ir3-OLi-)%Ew}zsd!BMXMCALri70FQm`B~ZsU|Gp!M*F zvl&h}=_Y~Q3PC5}QMB+#7KuoO`yttrM8itoJI0*JoHhNckNYal4tnJM$j7D$O!#*& zD;5=y6ZLH#hM~a$=E=h}o{R}$2WYkga12AS{ck?~G*7R7Sd z?%za8B+I~`2|~kp{z&QOlGoI0GN+6_JSF#5&aZYl3szg+*;zdw(FQX`fBX*AE9GD> zuLU;{HU%h_*N5?!Urf-TvZGD^PPJ|s%6~!G5qh^+JG22dAzfN1!AAS9WzHHQZwS3V zg~@B--b{DQ5~9g%p^z*C@F5~gUHxzuh?v3#y$Z5a5*7&RnyJfJ_HA?-VXBGOuyex( zM!Zd6v&q8=%nb9iT0Pn|8@$A+x270VU|*Rew#q*}e4_9M#KqVci{_nXcl z$p=QK_FMCp(=`xczQmUW5%9>GbD%*)fe$feB@RaHK<%Di0e`qaX;j!xn3&TW>V=Hy z35E_r4}wWSUwop--5;Na=+lx(Muwzj#^MWWg8^(6Lb!L;J!LF77S| zsW#3x@7=rwJ(OZ*@uG{!>ROEp2|LQuXHIuUmX1{va^X~9HR9yZ?2sZ|pI%QZQ)gx) zOMbCIuR-xiX=*$&u(^EBh?m4_=U4{pjy~%-HSYBg(pY9n?D);#7)lVc%*Hi(aeb1> z+-w?-(gH$@YD=HOCpC#Nye0m^Gh`Nwg2_kzLd1}Piu!EBy*7PEhhK>ydjb@^ZWa0J zn`d^#r{_D>m=Sr~PX*Yx%nK7Ao37kO;r{ekF(ku~r)dJ7 zWEjbnEb+~q-TM#jjFgRqzCrKw@2~3bW_ww458K`N)=(F5SFW-Z%$B_EstWgEX9@Sy z4u7&9{dApt4vPGQ1uXL>==4t z(+Nzfh=JxVzn43c;c`dZEMC8kY*{h!bJJO8o=GH7A~<;Pd@}pR7ae6KMzg5$TD#Q> z{k7k-LAObaK{1f+#{dP5QAq-Y9b4CQru{3{uL+mQe(q=)O8DfTWtM~YpdKZ zyk(}&Ju$!2&=v2}$1Giu2tB)Ia17Qk+!Pyh`^RvVw2DM?Hfr)xG(khJJ)ONO0eFkR zlqS>kbT>CH??2%QCg0Q(C)mjR`2$_lQnn?6HdI3uN~P#^r@#P>2y1TmVt8}#_qw94 znY~?e5BuC_txV5Z2SpGG&N8PkUb&xNfnB?fGTO+@aLBu4&B~x&ABlpQB+#>3;(U<3 zOdZf^or;;4lp}RlDRu4YH8-S-fz#^QZAGO;p$Twv1_BtXdyp#g6wC+8+>1U+tPo6b z9e+wNpZO3uSBz#2{KSn(N6`iNp7+MOmTnSchG+ssJ;0=krz?ayX1psj=rhIqvHmgh zph%*@;B{pO6Xt8cNXF4UlZz;_C{Dd+0%^rSpJ znTyxDRpE}1vU3`zt$e*g&PN*QQ!0G{Kl)PWH=f0>M*JmDB75x`SL;{#>u~~qT!?$9 zLJggE=uAFu{KPeCe);T>YD_jkNV;q3L?fMpF9U;Egriy_Cw%&eOKv#wtvqq{M)tbp780qfwZJcW>8Wm1&$N<^U zlqqJ5b%t5r%0$wdNp>prez+e_uCe(-!xtkC-iBZp;wRAQ}M0WJG$nBSK4>$DkhitfHJY!KW=3BW<(R1m8!9A7oRJ(q ze|#Fbs$nx8+_Htg0o%9lm)Du(g~z8H$9plH!9>j!>ZwLDQn|*EHX750YbxAR=Gymb zHRhdH%dgPaK(*vA7pwqYBc5WK;z7>|EJuivaA{x+gVBaW5q9wgl(hE|4a!cMMZsun zZ87DZ@z4y~kpE|f`Q0a+C~uDVZIZfUkh{)wVB>m5vRJf!{b}UN%J|N%{JJN&Tgi$d z*$jD)tBPZ3L#|S`+D7+r_x2k}ymBL(W!a4BhBEgj9d2OLcddf&qLaCr(}GbwN*T-o z6okw?iilNf$6cR)ap=?Z3c@jNt8#GF^tEr!&D?!1_pcFhYs2U~@6=NfHj0-m+X5ob zzle@(Ee9b4?&bcf+Y|abCj_zba_-FW!4O$cIqK}Un(NM^748S_zAN76*X{~vzJA8{ zr8FniQf!`<)AuJ(8Frr&j%lA^W(1Z!s))66kz|ir9h{1&*H?| zHOnKxdH2sE`|kSQ#Ivqr2M!`6T_S}sJo3hoBcm1O4 zqVWg3D%+_0Y($#TDsgg)vHzGUUc@9L=tJ%W=XMIA?wGnGtQ$U44nevZYBy_&2)uA> zn?p?gf0CCcO+~*Oa|CCadmUDDNOu+^MgiUx2xz)hkV_PsFrk=PcJIPK_2w01_Qc<{ z7oK(+)Xv1ro;_!huYOn8?HpnwdhT6PFa*_QHLJNqGj)6^#!ePunjxh-6t``D`Lxu0 zlPDa?+q%VHFLLu{S;#=&t){BUT(;ia$NkJ$#rf_${%y<-HNhkIfbE{AH4}<=@NSp) z#yq%BQ5g`Gz-6qo2=DZKH$fTtgqB3)vN9Roc`Vu@y=x}v!xw5BvxN@kx9plmo85RlkUQ5~JmhUYes{G(k zA*gUDWy)YQs`vJGcvZhvK7%=1Vj`5tmk0#{ zp+rI=BJMRzr4E?2HdZ4Npv|oDQa_8~H{QNdudz>IHk-anmVl|GXCx~`n2q!nS;5?! zW-(4hjizqy&qABOLuWA(wSp}S&gk%0Tw=oq3Z5MJbwIBVyRg_c@FFpr$XUy*yYcSzxG;UM!CmW)CRkYq2i^v+@;0F z^OZft1iBaj5cL%IRG5!1rM84cy=M_@as*f}<;wGDZY$2FNGZ(@{-47&$z-F=J7(T4 zGV5iFly-%|-|N0 z)gGHZ@rmv#WE;{Y5*VeknY!XiwOwuL>Ppy?*>%eoc9z+}h&&b#Fy-FeMf9>7Sbz+r z#s%f_Dvv3Z>Nb@1)7KxUr#okRI_C)oO(fg*h^cG_Z16~p`?V1}K!|wzQo&l_0~D{I zXS=DjLL(~bx|=0B#AzVZevv0XG0j1+wp3a^(ybi4jC;$mh@AJ3)FZt*cDt>RiBG(0 zKe%Bdk7}%0yO*r`6pu_XxMt_!KJNGFzV&@h=9k=Q`5Bt)D#sFi5%Z?Hhm^|uOc^*% z^WHM|g1^jYw&r(GKQBP;cMUXvb*))uQ;4_KPJ^1t7XV(g%AzwRaSxFZgyBAUCkD`% zdaLOWE0Kj~)sxvFJ@>KxjMKIWBuhlhx^;_W0x=|q5*trDz2Hlpx@ozed~;c2keoM& z-rgr?TzTQ4Tqd?+uz%QwRuh*|G0} zXt9W_UVX+?X4(z3WI#WdTgv6e9p*6PiWR8=KY9S}25w}|nZE&`%3uBtVyFI#YgaYb z)P|bwLfCieOMwv)2~|uKfj$b_D9wx8u~M^pz8!I+F#%>07NPkWE6tZ`D1QdVlZS4N z^f|l$Qn8`DLIpzlYUwF6rjEXu?PVOD@rj0U$EsCGTvn_YtL$T5m6;R^&I)+1*sRbh zyXOt1)IWM&BwDFz@70flm{4z_@hM~( zd#YEP%NA?Na#fZ4lcAz>@6gyZ@v|2%xh$e}sx`^}vF?(s=&~iOVgKfmxsrF5Y^Cvo zSO`Rp!20`6;0lz>No(7DPR1KU;0mqEKMgRbV>ih~yh826sqJ-A06NTFnGzO@jS z2aY{YE8%V92{^G`JI22U<;O2NjnH4iKUX0*076FO2`#jFA&HT!M!MbEm|t;7H)s98 z@}EoedM#)l^@zrxV>&w(vV^qR#ARH!JwrnMHZ&OFiP^12{mW7Uy*K>|6GFv8uTY~?lC1P}R_0cV)!N3dYjSTGZu3GBai<2*Y8feX+Cq)W=6V5v}zT~al3Xswr$&E{O7^a zk-}-<3JslBI8r*j-%CQJE374>xnR2-EqS&A<3xm2JbV~o6ReRReqcWAstj7bP-Dfx z=5Id1ZlKsh`Gm?WfBeCmqNbIHSp=<_7|?u$*}&azxlFujdUR-@g-%`kE6w+2AZ*}i z&7T89Py-XxdKrt$A&%R+8pkY-h}ydwL35(Eu;v&&Wz;cs4F)?J;)XQ??z!U&1Exy7?yv_JEEsc1 zfd3Ia>|B_NpSo>x*VUEn@leL6!T)hoC14zSiB=k#Z5upe z?cx|QRw_24EPctGGFws>5LL9)4%3|fGR##H;T}*8&n9QKiGcC(E6(ZXSOmC3G&bd9 zvL+6~-xl82QE9PeUwyj~hO}II8}V)KF9CpU8kh@$Ax{bfB$vxplp0iGgVmv79SXTS z(4minr@3_|jg&!ki;5*LkT5U)PAu2TEn!7nYIb;aQnO4W7767H_so*|Yutn5$EP^< z!+-()9h2KgYVndK%q=l@)Ig=jt&O9OnoVtz%JsIXUTr8GR2S{D(y@)(&d3&Wwkm5X zIkJV$B}~3|pd5*1@)VM#Owd>hHZGA0{%F)@jip5s39jb7? z{zYXn^=i770<7i5uydMrR0BWu-{mk~$$-yl5#coRndV6Z#e-*Y(z9E(8_mkFhXjTgXXfyT(TUfa4#e(YGIuv z@2%9&`g#3V_3{sYm?!^S_|Q1+br5mP3gp~=SmHj+b6)^ufGNRN&d494lZ3sNH=!Li zUvL#ho}kWqTs~#5Fl~LWHo;x6qC3AKG!ofAl1$9#&)RWAtr5cr5QW7gwT4_0RV1SBM zjUG-_ZIzL^Jw>w`iat@br5K(yyw=lR%k~+B1lj+@rVT(B&k| z3FP|s9rj_r6G^pC`MedSj+jqDFI0W2{)75l#jEeJL*~c1@j4@(jU3~yiGSG6SiJ^jLA+$i zspQHZ@DFD0Y%cDIkymHu&(v+sH`aBK=WG?TrDEf*C?;xtGPiOs>fPpy`Q8fmxW7ye z59bC7P}-vVkm|#4LJfTmI7G0te1(^$QE?`Ndu?FQwx^nM;6);!Plsiv%K}fN%p#Z++;Y;ctEGD=S>X z&Oze{clW(lT*0@eUUJF3L1#v1w=yoLWBN=?Uth3vOxrzHjY^a*n^BNAyS4GTGe^UD zM|E^XS>L596-+Az%5w~mlj%0h6=$c7xjWaao^R7gwMwVmEPlSUru5zK;?sKb!LtnR z!g#)07uBP$Jf0sf0F$u6UoA(hMrVNp`MvQU*gALyG(v+NZ0?aS!q!fPX%t%{xxet) z*sG1#ZxLDLbp;r|f$1H0ALO1KB0q0PO$WAaC2+LNrcE2jb=;Gr%#4Xnv)&7QLzt8yQ?YaP#GUx-lm|Egd!dTZ&- zmZ>=ZsPAMa-EG`hydoMRWLq&A?lQGtt!>_Jn7}Ro)J4N8YC1r}#NRYO{&p`xHbWkI z2tyN75Lw%0?jIcs#{(n%S@xfg-u`8pH82o-6)zPt*IjqdyB$a7cP=}Y8l>0N{y5!i z=r&>sn*}0lh50W;W)5W8tR|AF_zEPGqjO(-ShmM#ikouW&kN;^&Qj#8`FpG1t3Lsy zQ4w;>i+KG)7w}lxLrCi%^ktsBqSnpl|SHDtHCi;AqsrJK|vOZFPsMrOa_P)o%jc=5-HKigPo>l zm@Wiwt0sNFeS~qsjVHGT{5V4B-cXj_XpEL~C=iRCQEzlSY3OpdYM%q#(sHQBLx z{o2S^CT4zhdjGnSPGQQH%GV>KH7{|O7q|y(_I~$*@(+(vdnp9p>dS%}G%u;@5ZyCV z4DDkKjhhpz)QUZE`{`Oz%^~D4ylv-qKh6z3AoMtl{*mo92R#{A0MwNQl3|(CWoBxO z&Sa6_H`us!Gu#7Yl$mQy>$BF3JvPUZv0Ag1*~;E* zRM0K3`og+bzH;+b@4s)SWoJ6B!k?(=)LJ8k}3nQ3r9U&ixm3pPZ z9||h1!HhwS-dgV4HK{{g(fO3A=t#7%TSNjxf@v*rlhrM(xQ= zQXcM#D8pi%$Epday%x;a5DB=y3}f1v#d+pB8jPcxX~vArLPa2NLR9xK=uxP}>*;H#>snLpDH;_Mb-vakwuzZ23!piMVhvNJ)_lscV zp=tT)u+=W`@s{$l-J*ypFwqAt7`K*hQf%%{{5SPW)H%1kaPw-AM>Y2W-N=|bLq}P})WtJ|^X5Ifh^%`;ME>!DDbk(s z2dfJ`Qv>VEA#VkRh-cqoB%IT6#>UOkd7@J{?~s#)b+lQMDFwG0w+VYYPnzGww+Qq*IZ)RlI3Wg zdn%MB&(Fr1gpOZ_I75ysA;ouKH|_1`E-%eH3Tj{gXMRzEhZJQFK+;&TTfv+m_cV}JM+MoYi%i5A%K9c6Pk&MHy%em$*UL5wDlF4{uyt1gw zcIz>UxxA<%uxzLHRd@V0!75-!0%Sl<{WIKgug)OxiNml+zyRoE2(+-#1Q5It>QLZb zn)Pnpp#Co~u8mBR{p7qAe$hZYz9wRd1RPR{+3r*kkxqx{mA#!hn_ga&m=%G%^*tv2 z$$j?~_BKq8ee@WjEVE|K4zle%JjmsAR06kP2n18L4&jkistN|ZGNQuN8j={W7ka!5 z>nV6T0xF^}7MB+g+akWn1l%wFyL|}PV@>!qJ z(S#}iCN;;f@(tbm&c?CBJ*B+@lvnV1LdhgsHQ6LL?>Dta%uEA^QMj^@%%ZhRF}N0y z(0E^MU})egnpc^a1`(=EWXho!3|<3*LGQBCA63>8FqrJ^O-#2Z?A*NX|IpGVU;U@5LzS2@!m6-Fo;|0`c@i zI;qX46TsOy@3Yxtfmq{#Qq0FiA$mJqqr`w=&`1PAh^DyVRkAc!|8PzGepM0>F8&UJ^ zZsnfv>-$WQHez|I5vbI{7KL z;*Lwv8;`K(>Z|W3JGxv6gQeHmX@~e=h%G5RTD4X5&>+dmZ8o*vWgp=Sr@Biet41P=UG4zJQ89`X z3sj8AwMM16HxZJC=FaSAV{D;+z!jM{qt8?_q)Yu?Q`8h!b;J|KGWS{~NbHrJAVND8 z=8A1cg==`rWMX<|W^?VXK<~_PARn}Ytd7|PQ+Q+1P9sjBm{>u&n_4^XL`KmZU5y{6 zg3aLrt?a0sJ2lNyd;J8mtXzt>!KAZS}hoY0SPJ8T+%wUD)@y5&QRyTcfcbUQn<=7MK)jhxHv^B2-d%Yb#F zyw+B=*(HMrO=@o_k6f7?-3|fDq)XT?sl7rl=a(LSJG!-Y=MZLICC3U%n#~Z zx{9GRe%5@ldjmU{yWnZ@qlR0wRjV}>aT0QL9TBZ9&`(X=lh;2^9(q=T9~ zmAjhklxQt7+uZqd-(b(say1O58ihyntDNM&)8A~JB}r37j6Y?Fj*+<`W;~I>oj7o< z$ltE*>7I{(+0sBskL=#KI&Q^NdPT8W!=l;Sm z!-t$%6I3hAN_$N93qx>ak0i5#gACD+p5nODu2P828%;T55Krm4Ytb{Z6tShT)l0$8 z(D>p#itw8cF(>oDyzT#({38Lsyr@~zr3Usxi7OJo@KO7&Q%_?gOC@C0s-46mVD`fE z%z^*m3NX_c?Yj$5>@OHyc+XeHDJ$1q) zQ@h1S2WX*h#upSWpccOUE3M7eVRNFwY#-9e&bBy;dhkJ%Lnz1}<`zSj7s^omi^YD2 zb4JqcEIAwjW;%s%g=FlB0}6{SEkS}N4(<*QMvrh|vf+adP{YFpWzem&kGL}#g;Y2s z5CmQI#Nv3w(p%{7AdbSS;)Y9~T7niogb3fX^$xH`lcXS&s#J+s{9!h#XFH9vpDMab z-T<`j+)DfPt}}~`ZPf*(E^QD>p_*uE0mX(WkLfbOI_w)aJRDVhY)&mdsRPPi>PbYR z3G?wvB*qiN)~KWgkk3h>k)>3HkDkr&XzS9do8bWpP`IBcMBc` z7Y01z9VkQ(9rWxfaL?3q0oLndL*|k-*FToB5To>z4cxzne59T~V9ps4TArEXo^@9~ zbVkwe^8)#*rR?{Wtq)#@b&-NA`*m=s9EdKd?(8V|gcS4NiQPpjAFXr>*UhVQ^8x`# zBKWA2-%Q|CU`cp_4NzkKZ}7EU$mK;8fvM8%gtz8yGB!68meCw+E|y?^hb^kR;5Waq z+w@7bTx2lnF&p-|=MJ(lTe7fZD5)tMiWjH5Z1E0{B55Dy3^_yC(qoHeI|VjhSPzlC zfOT@}CC9{f^pw6kv*oH=@yF2ZtEa2|QYJ=f`CJ`%>YrB2J&Th}ZT{)q}?NOwa9+!!` zy_YRVdj#%|PVW73Ur`q{umN4MuRP^=<*z;GIQxR0LB2LDnPNbFe<^gN?WhtAwI;x9 z!YY40p`$4skIK;%rpL9l$h?Z)$>RtVlQn_Q2Gj(G`M%~1sX;yk`E^OE%AVbN{KS4CZetOPuvLg8s|=Xd-P{RA2<$e z*$nh{DTHjvu?2X@-+r5XtBU!qDwSKkJG%!^Q0f-uV8k(X@wWaM=dLY_Y>)>v zgmku?JU?yhb?$XflmtQa`<OAOz9G()9qARs@6+OxoWohIHav8r{_GuDa=Rc z%UHwDcA@5&nr8UT=0=(9TPG(p_-XSOnvp5~4C@A1g(rgYPL?k`HDznzX~SX(L_bdg zktc9o<|A%@ozXUamR>g2ZzDpCKvomAC@)qBO;NMg+GP-^FxcaoYrS}+w|+Gcjt%r{{ST7N^o zwj4+MJJ@}=f30nJX`NsgC+eJJ+Q_MeoKpr3>u0TfLc!Low5|S5R1Zwx<19&iJ-t>EOoHfNvzrV?(bg6QsT)AM0 zg+20|KAtH$OUrzDnbRLO6w3KxPVG?9cc-#ZEYB{Y8i*$M;_NarAAd#ttAyv@j0>hr z={ivdn+?9<6oTIN6O3{Mb9ir+!2UztohF*?AfKMOHrPd1;-r@l@GCco`_W!iURav> zBlo**4-rD?)jAO97>ntH3*w=v9wOCiKQ!5!^Z%%tJ9h^;Ylxzl@4eSp?bt-Am-9qR zm(G<23_a7!Nk zB+Gr0S7Pk3piZ=AhZ1#1qus`@s~=e48t@)yoIC@3{neN`0HBx{y{;xaid{y@s+1#w z5Ew_dnKNMD0MX-_y&#i)K^AFp5HS)gbNg4?B%)T_%&T;hhmfEH*OW_K=HN7s-B-|P zjcS=t#BfiJ95c^ye3!eQ+;dx1rPT?G5~WhzIM=xcIk*TNr5iUAa{4O+QjC?)OXM>7 z*1Aw8Eu%GB{LKM{Pg)acG)i&@FQ8DGsj1DF>9o6~XdfS@rc?qMo8YWago%tB2VY;1 z=YDI)+}yar$a*~9EXbGk>Q2BuXn)^PaSTtbTLa}Mjf^iAS8I(Pm#0hXo)uA>^Je`PCx(jER3}_pL=A8CGT4vbE%FIw{4%JxAj0561V* zGmQtUI=9Df^!eG2pj%c^0B*R6TkS2(N50)vxXzLX!`FIkp8KmQ%fy!5SIPDD_R+H^ zo1#XIXclZy5Y>={EyS2=9v-6SuZg0!`;aKpo3~MDA;w-o%^60jbtq5hZX@Do@`HOJ zI?*y>%{j|BjR^K>Xv?2VQ|t2S!KI8<`VY3h3Z#u=pw$cIYF1s-n=wU?x&Uz_IF80ulRl$mm13bVTq~7)iLSohn3*B+#xLp*JaFvT?YE;)CnUGue%*C< zfz)v-_cFn3iUne{tGx>8z$lG8ZiE`-Z1N2E55hXry}gcvHIc1FrY(_)HD-NMZ_!Gb z!-e0?nw9POG?UhZY4o4Ye3r;^j}+@ge&mV{PnaF?RPq=;5c^tytxgw6TAHs>-ttf5 ztv-b&__zUPJWWHa&tHE#!=l%SMw_M>&g8t{Buk)WpH6yKy2;vDB)b1ygiez}Obs2u zY2OQOPRML>Zn^I1?E??I{u;k$xO4a5@#yyL7pvx-@!jp)xo*eyWy>i6k}O&@{3!1nGXA|Y$k2Fw=5U^a=Q%wuYcUcv0ma1&e7I=k9klA!CroylVY4HhN0 zK9|himiwBjEV(7i{T%fzcjWssj|2@gn{F{YBH2%aK}=#B7!~#iC97d z61=tktZDD)78T4>sAN(*+OO0~6wnBXqQPFEwPT`=QDG=W<0h}oq*Qk396G03AUo1mAh6Dy>TDSl?`dYyEb zJIuoM00vISUbYj_IR1A|?iEyERgXXZp|iuNXIZmz$$&kR2r1ZTv_os@V3S%DoX11m zhG0kBsrJb;3X@t>PUII;si1DdxFK(l&Ma%Xd*Uiqrqy)F$-W+KP^}4Qd!D)BhI_S1 zQ!VHM4U(yXccD{uoAUY;0s(bIAs^x{%f~YaEM+EXCZ1<5;BgfTuU{htceTvVC2i)% zX$p#*TyqMJ@O_Ddzn`?61jCGbgL(q6JbnZME$V)OyGDv)pp#2l9)}F?wv0c+H+TPf zA$wHCNHr!5c8G`NHgirL8(uSLSa(3PiQIL%Ty23$H6#EUR_#H+F(8LAAiLga*u%!T zzY{b4AU`f{D}vPs?t5u#kz1kmxUA@i5(=b2^UC~;ZX+3%7w3>3?%9f4gMJjLKnDRA z`&0u20JhuvX`}e|3io$&nLLB(pRW&PhIxA#I(`po*&p!CE;^Nl?&?*rm$b}uLbMRW z0ZfqV=4)`Y4#RIezQKlX{%_h(etGE02O|7GHst4g&&+JOV}lSvuGWlAB{7;Z|YN=8;Xj!jpIjT$K_}S8yF8cw9V; z2l>en`>L-i?GTt0_X8A^-;-V0)ipb-?=>9s8Etv)d35Jx21%6r&0wa&rnsLXP{ybg zeMpBuSs)wfo%UmVU|pnBloU%r&+0f|+iiO4bEce+mEl#H>2>0SK@9@VIgF-*aPt5| z<%!R2+vfE1Eyh$j;lw$m}!kyodid-hSM`PDPvj93E z+Xq(;+;QWLj}VbmEO*!pOj*EMtWvR*di5!M;`=VAdHC8Jh_G?ov3NP`>$nKRy=IeV z*W#hvj>mUa;=$}tT4bwIYkE1(7-w}>j7X-*GlclnVz_j2Zf~kbnHyc27+zI&GCsyt zURh6`ar&m&y^KDl(|74JUrr=tRz>4`$S<>%uQeN=?yPVx+VkYvM5^c7-k$XJ_~7fF zcc8z50cKF-*-Q(t!Y2`{wk2$Tg``Bws#0yTR*J@-OfTx6C!?NLK!oVJbrzWwf>Q){ zGN%aNd5`B4!=%BtyrzH5yCxMJ+}*|f+g7ahxiPRN)nj_>ZSMt42Y0`Ryg%^~nfu^( z_+P%|R+7JtTMw2oKA3ZQQpsc*j1$a~#Akg-ljSgWQJu5S$=Q0kLh6*%;tCowaXRuQ z&OKBb$gAmidUYOCz}5{V2N2z+kKYXqHZ^jEOZkZ`l$qCJom21G%nazTWTd0W{ox$2 z4tP!j#1>va7l9V4S_v!7+b~oN_Ke4@c=z4}3gCGJK?>aSDTx>`0rklgQs7Ia`29)C z*9ttnM&{*|+!qRB>TNP*>P*bC!mwz(>9ANP6L>q#vW^3DMF!#M*%_HAx~d=sy}*v{ zQVpXJ>7ucy)|*=y+N1Ru{D!Ws2&m#+ERot&2lt!1<=R@o>`WO>lUk*$PoWNY?c7kx z|J(Kc;ZHJxXIoz#*%;20RL* zT#x6_Juw@hTj1_sV>3MJpu{{_zySD262q#{!6q>~+#0D~0!>nlFs1Jddo><)N)?R6 zOx=bqqd!v9hb^IgWl?4~*yVPyEo)Z?{O-$+IMY^ZPt-5h2^A(LhFyp4= z#2b}gU0d29LQj1|b6vzjcg1^|Day0_PkxoMAyEvf)>&5tpb}w%`6yRei+)}y& zyx*fQo)^?`N&j{Phf~8$rIoIp+Ww&#$+4mx?6C;5c)i^u>OP@-w zR)~pSW-=MX8!e|cHIpOmUc3*|Rmi?ph3)lZjO-0q83W28Yg4uH+jx*<)yw{|>Y2!3Q6_ zrk)-p8;ytEyY@N`VJ(EfyAA_`Q6cXc0^W5QPPd<;4R9~5GyUIF!#)_D4v3xZ(3CtzJ3+YI? zZWA3TXR@m$I!8yCyO^j|bO>EIhI%wZUZ5TFeC6D3NqZ}3W}X0COTTErl#15<)cV@k0JYAU+vybfwm zg5IVBheiwD;HU6Ld)82cGSe{)bS>LBIAT=(t$91!N{mcJ@3CY}KK<{sK7B^#)o#kj zEDoA{pO2y;eVs=4pIRO>W?cC6>Hs+EUGWY*Z?vk%yH@q?H!Yj@n$KVQ=)TB08xDR*kWY%PC zx()-zzgjb#!B#5e%z>_r8`p%b=3Fsvs#aFco{Az)Bpev+jLit89ZN{h4}QSCS2Yl4 zdAFko=>q4@GWWi|T-{;!vT}xuP!0uZXTYg}Pgi+JE^lY)9BvOk={T zQ|S{Ij0k+2@$*ztx~0jhM78Zk?xHIfk!9R9YMGo#~v)4KYtz>TFm54eZRq4#y zl+CL5=u}FnC~WVp4PE5OK+k74_g7-YYvAWliY+d;%Hj#DrDE=_GIpvFdLf%G#wYs3 z$Q*!ZWlwU<*I$ThQi0jY^q{pXeW9^t??!i(ikXEVO%mxbR-9Kh-ev|(@rl1zYsC;5 zeMRMVSS3*6A!Ir}F$TqanORY+Rms1*l2N*Mov^RVpm9Sro%>F38k#Xw3jz9nP6PZe zyGUbrz_?g*8q~Ky@&8gHX4VPDgwH?*c9HP8F=nRVtC$P83NS5B>eu*|mUR;v=^Q&`FMQr|RrxgDedOxku*>_`At-)l@B6qkc$_nGCB? zn^Itv7SMT6&7OiLcO%@6D&bXHeg_^H#x4c%96$VVQ$7cxru^?CX5v$x6K)5)71|tr zUbqGlSIs&NYSsKmH7ZBY@^xP374G)opQ`7WUYN7g7{ye`qPoT=-Ck$GvN3MV8?7?% zE+r_`i5S=D%xO-y$Pwz)`hr=1v@zed6OtW}LtCokyo`*+Nz46{akk5=VoyPZYdrWa_VI{D4Qh(jAQ z24!YMLh_(C^3TT0Z#~03JVc%y;2tJJ+@C)k*s-JW9p|n!Ye8k>xoMl3eK)B)qF})% zbw2fF-|#3q^=wenWn9pkfoz;U$!456wnLp18(3DN4QV62`8+2wb&{`gr^1~4Gx448 zoHORF21vGgl8;v9Ui8pnj2QZCH=`yk1H!!(zJ^ZCLaiEHEX01TP=%g68nwgdq3TTi z4H&$X*Gh3BG@UnHbt@&9oDZ}ri6FqX)Bvbk0j`97cycFF`*(s(+^SLIphE~^VX(We z+ow)16Z}}$LwfcIVbmNRkJ5jJv&3Deu)EzVcS`3@8H!$8N3RaMhY{FDP8sue&iXRy z{JrP*xkL48-T`inI*~8ity;g&tq|*FN=(*`EuK5g85P-F4yni>*0^=tg=7Qw4$<MkkBPr2V3I#nO`fBntV_1#x85>UJEoMqa^t$IiJ?(mTTg@?^``gn=c0=J3mp|+F}kHZmB6z(+c zEyG+L_x-PZO?2c4d2CMM+;abQ+=vtZFSP_A~?I0tkWzd@>Y{~>C~;$ z4}Of>=cgfpK8G!hJ=$6^9%rGo)yXBtVKR?UwQH0}A0CujLh%7ZTCS4MGStnNUA}MM z{{2@s=0!)=m><&4>DlG*b!U3Q^~{kO{**pDGMQyUC}@?shT@&L2W><-Lxn`*+LdY0YbUuoYKc|?>Cghq#||Ci6_ zFfSTJfm}Y%^z*-tnA?oH^Gaau&3TldyVQUx?m) zx@dxQQ@D+EyvdhmNaLU64X#42Z}_a+sMsLZW%K6!Gni$kp?JCkqLvMeWf<7Ci#d`p zz%GXM8SV&~$=%0Iy!28v?;-K(AzRU6E7;Dea)0Znew@oOXT5fQtgC}0jvZS^gJTIl zQ*jKlM+>m&qd-kJf|YduWLj#;;o0~-&hK?D?&7TMfI0>K!{KISg2_l+O_`01yq7Gz)`?H5{WNB6GvT3Bx++c7cm>tCZv zHx-&Bx?iw?oGX3t)xk{EmOPKd`;<0a&fmDquyuS1j)n;Qi{Zs{7?!t|CAzTVNy_v#JQpLna!`+dYNbBZUEMJ4m<$_(BKJ9^kg@ef!c7K3@jm^dIYg;@SiRATI*D`mP|nXrCCB7 zkZ=!9fy@7o*f0ByZL+>ec5QMujS^ z)u#$&ZcE74W$v`}Oo!YcFD5q+0WOV{7jpsD#VR_LU%u zOJNMk3Qu$i+U31$U~r%w@Ydd4vEu55a<2+ATr(Y4&q+vFqd^*xvIgD4-rny}OiHxh zdZE%GEvUM)MVs5K54f$?E_DdB{!R|eoD5u60hA_uV zhC9>+&N!V@*Xs4b&gC~JcOv;z`Epv@%h1#CL^ms5coY8+6HV(&Dq|B|8o}`w* zrA}YXi0NmHm|+?a8i@VvubQAz@5Hnik>E~Dpd}(ZrdWK8`4DR_!bAC0JQz=i@dSN> zfV1cD^b0e|)ETw<&P1;@Tbt3H8P`U&+K6^>=GkXI8GY!Hdk2G^+s-=g>|ODRZ)S2? zFw81&H8Q1AC|XQ9o>w~6%BVV<%`!jj?Cd-eieemAlb?8@U@mIlO}l7s@rhem3XKEl zf>E)1KK8?N$s|OSrhMQRU?yvdniyc0tw6H5YpIcFKjYgP;A~AeGgM;dzkweTdWj&C zChu|qa@90S{9VjV8)gP(hopf>Sf-35de|@~;EJq9Rc9=shFB5GU3#lVE|3vP{mL=_ z*zI*j#`K&$;+t_eg>guo^RwP?F%i;TNp@Xs3|KrPjo0gM>b9(3&qH#{nM(@#uvQz^ z7k+f}&70C3xBE+v-=m3$jaG})+|}t*#Y{P;KW9)V1wzpfA{Y^P%yN;c(~}!ErF7HE za+Ne*(WeZ#gh(m!22?#_oyDckVt{auB~E1AUo_cFO%E2rm2A$4_bZ_ri1~Uh^n#Bw zuL5muPWPKUd#0)0($Z8jz!wSdLGz+Xu?X*{CdZ0&OVYvw{h*K}_0IHrZ6Y519<}^; zF}`=n%tnMvEIrkBvpSbt)Qw!KyU^o?~<^_&&GJjctoL=Ux&D>rff_x)$N1-=; zJ3c4|D@U)xV)UP;!N{R(oSpo1+Qaa_f>z+%P9~bsnUfSq76%a<3(++!=gFvzO1aZZ z;$ymYEQhaDMUO^uEepWYn|No%m(sKNS^N05*MyuWV6@IIci9_PaUU5EZ9$77XotEE z&!Xi>#dzF=A@B1otA9F6IDh_etb^zj0hlYof0MhPx^4gvoUa#r^3!$Z&S>23^$(Z} z*WWU+V@F{Ok84iB15*wk>N|bY+TK{t#!|8dRI0MxJ7Tqt_}1gVzox}tukh04i>4+- z8m|sBY%{FNr|3QP)LxZGg-AvTiHUTYdxf=1(~6kWXwd>Jmw*szAg=U}avzs7)%)-< z1$mwe8scM!f1BsIIUR`VVoyEUS<#AiPFAzwndnSUD8caaJx|!tW|l+0iv#q82*G9N(=@@IEF`sfe2S4X%PpC;3L?fv~#E0uAdR+?+< z=QK}qFR$X>x9;A!2{ZN}yP;y22gei9wO^Y~)H;p8l(AgCq*OXoshpQiGrN)T>P_hK z`{NT&jHlCh7k%X`%dtG?Bn_ELzsrlM8q+#v8M}!xo&G!bcSEIbz(zu~a~v6)E$cW^ zYka4`&IT7R+r55(s5ENE6gKa0=9rc9=mTdmc>HTTFNjvZHt>8PzRK8S6d>J$O+(F) z=Vs8YCvMVtnn5(Ko9;lPpD#+IvcuyIX{>oW>uBy=O84iL0B9c^C}<2{q@-h;z90xd z%F*7ocws`RG79K35z}>dfBbQi-=pE)`Q(#7{NWETKKDFSb+uA)PoY<)7B!3;WtD3M zXvw%?M7F^%P_TM)FVtO37H9<^V*h!a%;k1KbMqBqN97R?qXSIs(;H{X7f6f$A79@A zAXizg%{RTzoS8G{Oz*w-KC``NH`&xpvb*WM2NGK79Yhcj5CsG*fKn6zv48@i;zi+N zFR0kAUKLUNt$X;N@62uzxc54nHOcNu=6vNX&-=X3`vP8nF`5{txgZoki$*L>a;Zzq zVqqm8x-y&$rh{nXfN{h(@wWU%BCAXmOaX=o8Vi#ZVSx(4gXPzcW@i*Dbta>HFPT{Q zbbYW+K?T>{1@Ul6`>W$>Nz6*N&c3?1J@_H8{EG zr;>BA%tjGhD~cKPpq?yEiji?QpQ&P>@XeEi+{HK_$^MchU0QbH{Ugv~^r2T&F0;bnb4hNSoo!F@7i@D95g-MV=Q1XO%o}mS)H8XfMrPG>d6f=d+@fe#NQ z_&kH|JSf52TIAMNvw0W(V_42JQg1yCEnnzd;xDwEK+6g^dP{~Ee5zlNHpW}#gxkn& zqS^%Z$uV+BxUsjF9O?Oy4-HOD-;aA~3_%bxe-5)K{)wFX^#2yx;-PY}$m&w!-ypvt zLkmGNCfr00M%RuNW!ACxz2~Zi&t0u|LgX+g0N?EC!E_#?#*nIhrN!sy(X%F}QeKL*0aUQ7PYg@ew6AJ|fKB`^+;$ zF)M#gFprM{46$-nO-BbnN+p+X`+q0KXIDfo zyt~(z4?A@!jU!wP+1tV9rS)Gj5c?@vj(q^x23N!SD8zcta%fmtP*L|HKd1H>n1s0M zZ;SZF(jpB|@!7Q)aA%8+L2?)Yte|w^ULZ15cSpV+w{rP%an|3$K1pL??Qg8365}}k z+gHG#Jzw}w%M*6Vb?s)e-89E&aiuAI;F60!`#DXcA)MEldhWTY4&hfcr_hFpNTdSX zq+fiGNgyYS?@mz(r!l+a+_VSaTA@&D9J^s)`${4l`XShEYo@pxn4UD2D~eODZW0t~1% zkOZQ7O3?y9N8j{2lvYl5WSD3b9PyHCq;C7#n;*A0!)v;q20rB}0xI;lZj8y*LW1!+%?LOKVJR_$wf7_Bhr)e*Au`c^)SBY? z6#vP#@O-56+;|ma7$yAt&Cns$<4oC6$EBE$sEtOEEHg5a(KwziQg_E_ zCfn0R#Y7rgkT!F50d)Ga;KPY~EPC-@|6<{%zZJeo@)9|<0*UCtddcex>xk)R62ni4 z?xBv>sjvQO<(hcX9Fvf z*+MCwFBOEBJg$VpeI#4ioC#s{S&vMjGi<74t0+U-Y_Grm=`G?J@Z;XkU?y|{JyZ?! zv4AB7N(CCuDAf)o9?=I){T5>pdNLL%7@&01$3akd@k_f-b$xV+0+P^hpf7*OJRf`lar$dnjy<$Aa3rZSN3S+p5=(WOB)3`h!NV z+pcC1v#EeP-weOUo#a(-1p54mGakiL(zpuEU`T60ucoLA(kStvPzb^Ix)`1xJ<@ci zuxa9_9B~-ZtCP0;)SnRJiIx7MNL~yq*5PQjOBGS6J}qshHR8kq-Y$x8NB18+?Y0GQ zt%_Bph=UVJUY{$(11KErVeGaGW6-fQ)h9YJqLmW)Rt+6vJj zF*V0{&d=5ikxbbYRAI&&JK#v0t*8+a=v{tEnnB*3rDqv?EFM`@2`GYr11hajzJ*vV zz$uqzywGzTjKmIHc9dw-B*-|6sfbbdkLlg!4&O zxucu5ZH`ebLi30wRv(FTr9#SBvE~X{i)U>4%Gmh(`|E+(!xzdWC@H7B>Wv+0@TeO6^Soi?(0cc(B~iJ3>$2IYmUROTM?{>fM5Ms>W+ zZV;v=uX{&tjgR}){!l<;>6us_NO8x$G@Y0nYC8t?>GraeG8m6&1O35NWB=h3@?5our6{jt|_Wfh^J)r@OKR=ja^OXwfv9-4@g08y_y}l(NYr~5tlcG3X z+e&>csI=m76=C9&-$6+M-vLgE#Q<+Yia!v^OOfJbw|sa_Y}d!@n`7&v(ah}HW$sq# zbLofud}CyFZu`rJ<(%%w%WGychmxr)e>~Al-klKkGFvQ(c+_~o57Zpbskim)k(>zh zA6`{d3`k1B^WAwv&0OeTnGX+pg#Lhkptor&)U^7zUfPJ9aHaJv-|c%+6`q(Z7wUYG zgjKjhX|Y(8Cqn2nLp)JJKjb9h96eYiqnQ6UOF1Q{$Gu|jt+=mU@T!|P(9K@LdEYLK z1#$?!M-z{w_ESUD?-DjcW%K8tEf!lQFpb zF^9F%s4u)c%Eb9(u(z5tw3r~d^RsGbycR=|Ml>hmT@FRs6O+ugT?jAPD&uS~9O^`7 zise<&W^g*6*pb$wxNfX^R&U*%=gc9E8*{2RPK`uunM4p1k`3erTiROnOmCP?gdvlU1L-I&Rq)4T^-rD zc|PtNxved?+U#maC7kk&4fpWB9hUs_uEU2PKX~vFU^WTiA4-i}?SLe%y;96b0AG!a zRG6TJ4Vv)3mXHZU2cLibN9XGUI$P6wykmA4Ws+Wn!L0K5eOd!=D68G^qUVCgKTY^KR$(-?YBM&5JT zLHv7V)T1{_zJbpB#d)M%YeWA%d~{(^@%R^D z0wZAhVY`rR`7;O*v48H&-pob!SB#x?hk8>(N7mMK!b4;h)CHu9h++xZFFe)I zI6O#Jef{K*D{i^`Ky-NHuirO*?Rh)HBcZ*Q-@dA?Yeigbjzcb4w=KL>W0DyVB0?MR z-soE2g!iTtCn1Z$T{onI#i4JktLVOz(_twP#nOeRmRmYmsqUK_=h&eQd#c5r{pmzo zFWgVIp(z2wMxP@sscN&5fRis*qBY_!`?6emN2F~Xo841x?U@;OwQZyM^xjsFDV2wO zP0`ltbhmA#c5Fkgr*k-+M8rnlUjlw*9)10VrL%Bq)xeIVhrgTo5+y`8=vLuS%vbyN zt{rw+N9PYU%Y6se5Ab+jo9S@H{;OKX-uK+}u7NeRTFvrZ2Q++tL2v zbGJ=7hiyZfFIm&kr0Z?F#z2O2e8|?e`_#_9W=`7~zHskqbGrQoiPA4!C*07PN$>9DdbcN1<34U8S2)t+y>NYch!^f6`(z3k`L-!*ue&p0 zw|-E|89&pVT?i!mO;CslIZlFSuZXp|9$QZ|I#+FMi^Us;A?IXd_W&wYg_PPc9)RN+ z8IO6K4c}U=%k9*#9e!;~l`dtqI2Tg%y4`^JW(s&3EjUeJ)+*`fX~gBMLOi-=QVnkRz|XYPE%B6GYZ^rI=!!5Xdg&t2UvZ7IQ_+fEP4uhMbAX8f>VNFwZkl(|Mt^T(wRnQ=3b*H9lX$&}*!OLaUOI z6~R!Q84C9KCel-gxk^}rX=us~Q}2qZG%RKJb|7$k$D?;AcfxmyG;8r`yLJ`wlcyOY z>V9#vr{k%eTh=(OYj^EWMRQwcCL9VdQ7B!AD5;|4nDB&DA?F>T4%-tGuV#Q@U*}>ta zrZdcxFf7VE)X}CZ6?VE&ykjG$al0ML{0eK2#qIXn98>AY;Ko*fxN6Q;l%aEJn~ssy zn+k4k$(2S71^mYYt>g93x)@*V( z=lk($xRMrk2x0`06(zEj@oPJLrrZ;6^DQs$%rfmnUomWGX}kvFEA|C~&9vP&%vv=P z3j>vVNvN>V&twkIR<2PWeNgzx5a5|*GKtkf zYVFpgci%1iE7l|{g)ia#%fYL^4Va7r*;82548&9<@d?CkHAKdzZ!P=*t*oMV8kiLt z%|&W#7pkIdne=hQ?h@qVkSRHGS7w)Ec-3qso?1EDwEl^(GETls%b>z6yk)A5uU+^9 znSLr&*__B*vW2|xJ)JY|IY5poULN3`gYRiBYE`}JV7KBio2_IcN{`6uyHS!rk zOge+|b1$OyDkG>la;BA5^yOZMdLh~Wtir1N*AJOutzmPnxia@EQ|OFEv(8#6%Y2)B zaf-V72Of~9FiG>#Ph*ds-LKNA?v@+LW0ruWhUPX-SzXC?s%(g_F=HNS{4{_-S71M84c3YCcmjBl>7d z7_(Jmfo$47)x8<+hrDAkcbYu zzeYwD(xm4LzW!h=Ha*^JgWybDWtNXh)hY$KRd|bSjjmddl1;RJj{hHwA|>e0lTReK z_VDFu$!cS=7EtW!z1EDQvZdMF;^1@U9=6msm2NsJ4!6ny{j6qis9h5D&DjPjIjH9} zW}CR5A@Frq0kgma9&nDJrVyrq4g!C%JqCYV;u(qat8h2bSaVuXiM*hKXJ1@|?q#57 zMST8~Xl2(A((@9h2{}!!2)Z--eSd{Qy2hNZw%iZ_GkS+dhcSB!61*C6@W0cCdjm2? zEBwi|Z0&r;fAACiuBo|QrNqdg3-wS}T9*MVSf}uOLy*Lwofa zC=4qlwz@f^YXJXb-Kg)H==qTW zo45|^8Gr`TBzln$_oAPp>keoY9lE^SWf2ZLvckv6p6>9A3-7y?;SW9fJyVYT%kKx27Qf@{>hh{jJw&Y0Rt&mq zKCMMNhyZdlCD&=y5w67V6h66qdcAgxKfES8Uh&B$i7nlU^l&Y+xyh5#tP2CGEd@*W z9{FK6X&w^AEjj_43A>J4B=T`2=!lb6D=mWZs2D`xM3gN`ke%t@XowvJ)JZ>aR$xA; zk)iM>_{~Mp_TtM}32_Z6rh}!DFD;dLI1yDO0L`e(UYot-X5<#$re!%DXq#joQQPye zY$r*!OKz48$u+5Bkb$-&wMR6 z?({`;14_Req=c4)YNX^WElWJ&*Rr-nn{@?xJ9*3@D9~;rtPvd~-VM)|{1f`!tU(T> zGiu5gR}17dm}+{e=vsl9kRjyYTsSL%NVApd>&f(HGZ(nxPO${5yU03+VU;pus;#$8yqpfmzM}MN}vu0>( zcEHUQShi?&QyZ3h>jQXxEzk}+Yh`ZHLsvb}90S`63!$J91xLegdJL(-7O_C;rj{P@ zq-!SfllJYTWv4%cV9YNq6nw+Mc%}avM2Qje4wEq~H}{yWdpMRGD8{o@hSC3xEbrR( zzJ;D*qGN44o05lxPnp}(TPyZmPxY5Rd%hLy>=C>0N%U9BH_1>X{cyXyCfLZX{lG_A zO#ZWK5vD1YYh*UZVG z5F7LTaN8T=q(7E;B(_em{=)ZMuug7xZ|3I@xcU;F;)nyo!rm<$rJs_x@cl>7E@e~@pTTwFd}p-qV0%3Qh^|wSarFgF!IR^Mtl3(B zwB;z96r9tgYhj9N*3@uU_%?bV>rEnPX=R+t)7Z=n+z$hEk!Mnsi2c;ggz4rPq*j`r zoZLQmBYBiQJ)WO_QoBMCc`OD{P5R)}E8$GQ1cNXwrN0{>cEfdK;veM{BgcP{{scz$ z3J>@OCe{`uNJg4lR!;<5Pafy;^Q(qz!X4ynOr7~TM-*2^!{eo?(X$&zKcGQxD_cza zrNxZ8)Z1fai2_m*n2vhH;DmM(qqei;GcBc=G0IF)gFdwIHDh@Dp)+@_u`4*8chjMB zk8B~6OxUQ<>$EaT9@FX#XQgWBXOyuVL$sdEKyKqkOP|satwtKUs?*w|JFn(HJAKx~ z7m9bPF*Y~B=2KotqX`y?T%sqe)2$}cuBuOARC0Z8yGQMhhM@^24~|^W!O5dkU4zf0 z&}dXj>Dh9l9Ga3IjY6+dxdPzR(%k1=(rM`Xj*6Y+TM;)LSX}wj@x3^vJwi?mBFyz%3UdnPlX-dY}$dBQGootD-7{g=94Vhm>6F?(%|d)KSN zYf^H-J-2D~7ylUL$Ul25-)PMxJkm?ae~x%D=}6Y6u}7-$Xe(hOLlV6+ z;jJ{tNHJSW)lH!k-kv+-G9$#~Z02w&$jTb(h(A&ko@|hDyH)nV;*q<~;RCU7l2;ta zL*Bz?|6D!~JLNyNKHhYX|Xd3WC(nP!6~KZ53Bl) zxSB!{^b8mAe-uBYE5h5aPQTARwRT-JICf+4r$nRSRLdgd_HV=vP6*%dP6lrYHHJ2h z3%87GBZ-93weK_2!u!aE3s1oF$;ee#hSM{Fl-BNaXkL3-xCKfO_>`y`flZb8KslnR zo2D9dCTHgc>xqHy+B4R)Z&G;7AA?$qR;!ivn8&L1)pcWtVZw&`8sAVbt>)}D&5Hw7 zk?$+T{IcsXHzy15${~LJAk?|9FZk^zEsv& z%3SEN>0UZ|vQFJQdiTUUru#d>Q(8O5aYCjF8BTy)i$75$=hO{RWAslFyYTpcA;rd% zJ(ZHTjH=gh-;n>qv1Pue?B(V_G*HRiY=S3`JJpw^NZK;B93dHddiiq zxvlPyjs-NQ_pkb3_)AaY)y{ZZyuUW!{)NfQV02t%AQy#-^|Y<-9!LgD37@`YC}%6H z+?BF3?%_2(P)u~>3#fS32kPlaf+f=B3bfzzL0gUdjea9T*Qx~@MQ0!+&o~bCpeu3L za5)yAp2kM>%uqKVdI|AfiT4PJ$zsb8_!e{p7DH6j1IfvPfD0^(Q>}4G1#u<2f2W8| zH=+LYh1OWgwe^G9IWAYMc?=oo*RCC0CJUSA)trAs>;*CuC&dyM7FS z_v-y7zlY!2dM+jTRD+MY8PcPf9f{WCZml}V=lQhOCRNHuw5?9Vl=gWIoJRPl5dF~2 zFZA|)?Phx^9aKi7&c^&met$yE+tB6Z@OU&Dr_-il8f<0dskn1ZDz_#K6h?zSL?Tj`Md zHXb;y6E>t$DUZ8#PNE#T$@y$fk6AX_8)|Z!GO6^Y8Y->Upk;0(DXO%)cdy>&XN{af zs#F;gI<0iK!THaDKGkp`!G|3NvhR(Z5GhzD15yj&tltTr7<_ovfA9;V&gJvFiplJT zRby_@r?zAK7$Ej@B_Gi!{5{2>tSr}ebQNPSROgw#j?!Q-X;%%(H1a`-PWYQw#jw25 zP&H*4jCQJSv3V^j0=+VqL?&O z@T7i-n_n9nDf=O)!G`OJCfBxdEso}B@-s5f-dTp+e@Qn3$SzeMpllS;>41YmWg)1~ z>8_rrIv@ga)Y#6r3T^)6lR5VqMf=EIt!`F1Xv1M)#z@LLG}b zGU}V;^pt|@-dzPEy7BHb$G5G@NZz+fKW@CjUEv;3SR^u^uW0+`3orb~fBZvG44JY# zM(Z|njIG{m*qyBt`B%_Tsn@E>kb^w-{q)(wht9`v=np)B7jZBAVO(4%hemx&i4!CYeu^EFXeCPRUy9>2vc@pH0#aB4BoKAut zObTb2T_hy@>NlNS^&|MC+zYDpIspyNIC||+2{~m+#T5`+V#RQ8(c_3J0=Vtci3gNc zSD5QPyOU~PP>=38exl*doq1@RKX))2>gR%PoA$Lo4-7TQuLSK->Fi>rpdx=ru3s}9 zNX--*#rbG@xZqX{$oP0WZckg51(Q=_qmlN{oX@vkH0K>dcT$-x;CC+c5^aQ!i~xT@ zE-dcZskcVMdAu8(Xl#=B-os)=qMH(8dry1sbmzq%0q!FDi;h&fvC!C_b@U8Rgrkv( zp(da1=ZBeEBvMfcPm`fY$)a`o!q)5oVK&FQ*wEZywzb1;$}r{uy#v;CZl7nwzs{dG zKwQFZV#CEv3X{pCV8GDgOzKiOy}!rPDyNJseZ15OZ2Zx+hO?euKKatc4X*6pc+J7t z%=p#<-&tUHm{5TWBaCKY;w$Dh*^Epvy^U! zb@Ae^@5Vd^BXVR~m!q6o6b!{14A!lPt8}j|&5r*4GDxnO`o=dNAzyg=AeF$+FGFIWb2KprDDw2Fyu7IO!~;h z%_p>HQs9Xc-VY7K^cAeAcvg$~W@G!Y; z-#2F%zKBux(ZihjXa|| zAm_ayGvifj)EHAiboQ8=T>iU`a5N&k;KOh;^q|Rk5QGh^ntZEs(RoL6a)4I4UOva? z=YkboC|z_IG0QScu5Uf7d!i-0s0kUu8#ZqPMIY;t#(GRiS?Cdr(7DIN-vx)??qX>< zu;`alH_|mdOL;W~hP&6Z8`B#RvD2-EqTwIhUW0TiSugT!$k@WuL}@aRKMB{T$?u=j z*pPtLF71T8Bg1WLXy?(hE8g7Ued`^G9SK**mNI<(zsibm;>;rW@)jkz$q~9A&1GUO}hf4p2p4(^=X5w))xvJ zyLP7{&Vg}=x^t9&cpAf>rfN%s3VgY1s!y}TO9vTb3!G$a_fgA|>pw2cJ^bvm>G3#I zo?Sg1k0yG8FA5v7j=aq})F}HVd~A-_jZBWL_K$gQk|+$U&R2Op@6KD)My-;hglEu^ z(CPeDDetH)F1E_q)xtkIe{FbD=JL@@#k6UKme=-K$h|$!m_C&_`@-WfTb6uT_^OW6 zhBj}X^L3vq41VuM#0>@Lje$?~jyHeO&rtm1bQ~4I0Cg+$YM$~u@AR5Q@$h%?e$gyR zH)eW{WGa`gNUlD=9BR6on5gY5>4ooo^ob{Eca`LoSEd4Gmwm|ZKPt?{xfttSmM+-i z0iVg3)SKISJLa9Q+hQAczhB3B%uKenUhQHqxYz9kls%OxPP66SP1R25U137++_=H~ReZTzVHQkg<)FL=GWzo>m|^sL?6D`?sIuJD>Zq~j;&cO!(tvYe3zmtd=yFWJ%mykc=y_@cM! zHbc<5GR_UKTikXUzWf`9-F0Y7K?{*?%|?1FDYH4ADSLCCPBq7j8k5Hnu-Nlv%>1&L z^pX)swlGrRmn7g5o+~?QuE2^?u{G{sKr-#q;q)l?9QTcfE|qFQh4qb{)dLvUAU8x! zoRd6Tan)M`k!XLb>dNz-=^Y(wV9S-e8jWj1vh2XJfvnWwo>@O(YFLFo=fZuS=1O15 zyR2!jtIO{2`VH$s&Bsk29XzyUZQMUazTz4j>gCl=ed{i|HVT}f>yb-Jz^ISlu61zN z=p;74Jv6t5EGYFQP>@}0xWmYrZl)rN~P+6?}zUb=r9NXY-`8S+>OCian zLB&mFxOifX7qG6eqvC8FLO$Ds=Tf9V>Fdg%+vr$>id>zz;y}>d({7-hc$L}fu&Pii z8YLhUOQc4#SwTMNNU~fU1AHTM^D};RZri4H!q$$af9I7eG832WTXs%?&$HHaGGeIN zmKTjdL&s*DJ$x+JdPsZk6>n^^<;iQpPp~`Tb+emjNgwMN0q=0D17OlL_Oi_#T3ZlOQ?7^#6B|eCsm`3-2)6>g|p@ z+d5WCoZsV}7|2RunX@aE0})H9R^wd*BQN}-r#COrEWG9`o>|j5tVXGDLS;1Qw1A{ zt^^0U7wQE^>B@>nlO8TyM-jXfRq1GOgQ0-kaE%s&PxlUsRQ&%lBjK0sv{btCx1jZW zM=m2OE*@aBaW`=pqS2s+cN!7zkXzNk`l?zg)XD|5TFA}6=K&0kmXjBSs5BIjnUQ@b zi~+_sok>JjIU#OtK#Ls9C{}K;kGR)umK%%)g*D3=twxo^tBs~p#>wkO-97a*#*~m1 zV7f~svS7Bt7k3p$&)YMXY%q}<3>W-W1O#2wXN^@q)J3nHVYBZ2ZrxMts2 zL3rPZCim>y8fkt>`*_nmy>^8|hY)sV6S5Q;@Q54G3Tr>ZA$A0fVio;ZDKR{x2za-i zgN)^EwvV3FrAR^atBWCTH$Gf0ye`!n(ZAy!{q?9e$|uu(X{YLT#6{^SpWr{!5)6Q}o>xkODZQ zgf$nI#3wvSR!zOHH{1E-xvg89d1uSvXgUkcTU*=j#t0AI;K*jPj;g_zsDw?>iQ?mH z=5{t3_nB|G?3IlMFUDHDs^*RT_n<^X_c)8WJnO)v91xYuR$-4ZAC1PjG$dMt>|lkK z;#|?!VaredSVHoEzxa{ZEkQC%P=n<6!tYY#?k||KuKtS#q61ftWcMCCTsEe6Zrk8@ z4Lahr4VZ$JPQC>NOIqB3C>DN);u}UfL&E7MqTTb!XYmq#8Vrni?KuOv<=nx#uh(Hu zyV`-g+ZX3meNq{c4Xs^W@*S@aHhQb=TC2{a82qZYj@6E}tG!R;^$xwc>cXB=F2ok_ zsi+Rb7;+%-VHd3~<<`@OJ!x>UtEiE6K~UO+PH}jw5S6IH5+RWTn6l+rbH(B6?dv!r z;}p{ocU~b4BD2L5tSf)nCqcSrFdBlG~b4TZ%mbu8X1xxGR_6{<1 z@4dpsJ#v$URe6TJ^gM@ww=9?Z3muDf>?yL+;>n3Lr_co?q1OL1nuFlTDgR6SXNn4C z8-GrI{rS7^epztmj6tKy70o-#zU4lo!}_s_$qn8K?}c)kpUK~mvBViYqm|8c$VV+T zj;~sT4U$iR)ApSn;fc;I6-SOSm6|nc$-H?Q`_;pc!@WVWvv%6a+P=ORk+7 zbkP3G5^(Do@FG~JXKytQ%17GIkT3ZHKazo>Ij zU43h?>Rnf6T>6;DziH3zcUB$8%$$C^Ul)~qK{_|&qmvvrac+2*=KqKRy z@?{ycwFzI2MVI@+LG-!G&^vt{>^$w)$s>CLoP)mTlL+&o4gl}~amf+b(F(AL{Zq^e zAGE^qj*gyFE?W_UX+|j5^iFN-NUFkZAJ>}YH9fha z{*3N%d47Cj&K~l*&4@9KF)^TMd>0WSfKTcgRwrDknc2K-`|~D`sj7nt`M$sRlZ%8s zDNDrWn$D%TWYn+a{VdZ_*+4zru+u#fxI(7XT1@E9-0}CnFZ`pS20o_bE##^MG%~^y za)N2HKQ(&Wyq|0K4=lWek!{xr7hhC&mAK@#L>Vx2jyGG469LcGLx)l=nj0P2wWHyw zKm1#XRd@{}&W(z(M-UUxIUqMe<2!=e8C~qMN3#aCGT;{c-!?^z>6hvc)Q2u&U}aKV zN3L2Xg!87LiMDAu3xPoon*nWpU}81D%yk#%u|>(;pT*b0>uHV4WmD=IwG0Ek78a!K zOPj7D<1Xi*BE+qo(zB|jjy%}L104SEgM3c1`YWxc+h3G)glDB{jaDApFuM_6pPu<3 zVw*Ye;q0Opn4o@dQJhfZNSuED-xl7y9gC%Q1kGu{^p-+FBDwy~vEPl~_WbiAZS7?t zU$N9Yf#Gbqu)=1r>zKCQW-%!??DdQXu2<#*d>=XQkAD=}Q*s<=CF3!*BfSy4B-O z;rnE^enCgyxbo`Ds^QYX7I5buwm!1zVZQ42x9UxQHh;m8XUpMZg+yil)|D=Eu~y}L zosEyaHc?BHpDz3*6CCTLm7b)9Y^wVU^!`1b03LTlo$`mYC*?e_q z{bPZChnBNB%{5QmjySmypT!z9;3lPnV3Ro$MfSIYn%wZxut(=(BSPhAhZ(+?*3 zCY<`y@jp@WS6m3G^4|e~)TV>{DbieE|LJiOFGBZV0JQ(|1;R7uUwI{Zzd0G9(-Hcv zu7uQXk6UxIfI&M>#@$m&`-a_ypjO@A8C-51bzT5)S7Iw>BHCUBhRI3?4GBY1&Z-Ql zn`2B$$Lk=J{1W6ra;?`fn+H$>i#FXzu#SR_UMjrR`hAVhSQe_AU{+Lh3Qo1^6Kil^t7MZ7JUlXeGz^8_{lpLB=TRO6C5MX4V|#aV0bMWNyrcvuYfNp~m(JZVq?IZ4f zh-55^7tt##esuBq#k_^0b(BAY<9zznrIw3S2T^wUHL(kyd%3zkdAolm`+acMs4CMI zVIoBS_IYF4Q@Ci*;hkCr#`WPd&#GDL+vjFdY^j*k*c$yW{vjoGRd-c95iJ?)jP{JT z_B*e-JhZtr(HZRonjrT3Oi4!*aUG{{g;=?CNG{QUH)4Y1xj(qOIdx45x=gmZPkg?2 zOZTCE+r){Z749x0sGEb*^l~u=#aRa`=`+}*^ z?(-&{l|s@u%BG9WKz8)P^w+<)S8g_&q>V(y(5JAfR)g7sJmt|xUlCk>Xs|3RW=g$0 zhBIgfI`exh6Wqn1;LA-KmBDDaHEv33bw&)^84XNN4O-h=t=;1m9w!5#o_ZPmEjR6J zyw?!)@zO};%2A8A$1%4;nl{85_H zVnyMs#nf#H*y%P?zY}0XUPlkl+a3Pf5@UMNt4sgQM}zK~r*N#!7dJ&zR&>?d+K4*M zipj0MKF1~Yjzu5k-KC$f_LAM~l}paJo6Uyt4_Em_@knX@2j>J1d~w2nfet37)A;GX z(#zxID}u)z-xP5dv^VGG+~%0Y*8@z0Q7qdP>~sFVWg3q;*yBq&N4&v<9b&q~!qqH{ zO@{B)`9xLMqYe6@3Zj$dd=h6UW@^mYhCDS}a>~J`zh2O~jcmnBo(vB9u^TRZD^#}@ zl4!7S`7oJQD|5Q{x3_Z3+EuN~#J3#_yEH+k-mNW06i#12-`r{&Z>0O(Y{AiRc36L1 zN8)cL^&x|`=7t@uqc%DN{x|KK8&WT3Fcd_}#K(rDZY-aWPbZa=;+<30* z9GyR8^)Y;3Gn47J7(9%+w>`3)A9tNVhps}-sMz52V3Yw9$$*RS;4l-q3gT-Y`T+)& z*BP(5!5T7VbH>0n7$5Vbk~JI1rNJ1`!XcTOZ}iU%LvGaG8C{u9uAb=OI*}WXx7XHK zx2}G$R0+@aXiciB9{vm$Lz*9-&E=*-MmGjM(!$^0c;=bs^|Nc9 zAaDGB=J|nIepE;&v__p;;aMFkW~W@1q($2tS+gZL5WGgpyA9rJOVD=F(^Vmx3&d=5 z>9mix?rgX3Y<)_5;^1oLb zt>ojvZy29BG&8%AQrd8`(r;ZO-2pDW9te6FI1a@+X#Jf&Fvis_nO)ieFL`(Cv&{XYCywkX zJ6q(#-(Ohy2a*@QqxG3%v-7iY;W)*(=rbu1o82rOg0G{RrAa(h8+u%{Mq5TR1U~;y z#OCy<9D4U%9s-qv5Hqb4D3+GUOF}Mhj2X3X{#>at=>T$L>|MKYw`;(4l|;unj4Gtk zw=|f9LB|?3ggo-?F|upy+jvPn(rzyVI-OOczJ{62W)jAhYi-UD(2a%3-R*~T_w-+R z(b0_B<#9?>!V6fg@RnWMqQbPd0wJeqa_m57Kc1)zuIx0p)=_wI+Ou88n?sB#A_$m9 zP2HOm2UOGv#8<1>MKO*NZ}{8D29OIrg(pbMl0E-9wSD{WDm1RS3b9%=V^hx9j&Ar~ zb$O5QS_E1^&XvW4H5u{g%n`GtxqAH;cHDj$^c~GcHM)#H*#Lu*Q>aZkrR2jPz&zO& z&L-DHY>k6EHz(7v<*Vl^!5%*u!MDEZPN6gK&YCUC6t@S8hG?eX(7Oy1esWz4@cHOj zd$w0q$h^sa3O_^2Y?9lj=62@s>=Ep16gYYUTp!BmTk<>q+sTyj$fQLUP!})(TC#La zt&rnl-dUrd#5Qu4!}w-54&*_QLK`aZQC{Vbl8rk+z}{v*Om-k!-$_;-+V^< zg!qgKi`A-<-1x7TeRavz!mF6iW5lD*?<@!hs(dVw^R;G^>4TCFEc}pbjLwwXt1WrZ z7A$Mpn=W6vyVrsX>=w_ts~h)V<`DF>K-D5*UV+wxuF@Pj6{|cfKOFbss^LH&15=7F zd{6_>Ysc2CFky`DaecAd@hOPCFL8zg`8uOM*{IjL%2E8X0@tK_wUCXv-IG$t8 zUM(N4r$%g!p-3e%Y4hhiT3Me|!UUYiYjjducuPGamGr8EZuhisUq`M(vkq4a1HZ7o zb%k^ub6u1;QCFOCJ#G|TA6RvO_lvhlx-sxb}JZiO-oe8PxaCD$fOZ7)?5cM#ICNnYfa67$i`}T~z-anbPum9MDqhteH8VDlKnMls!FoaSn zf5MdF*>EUqt()TMtabYC873O?oO7%?(=obD5(8tBSvZ5g8n;PuuHKy5rdi{Bid2r( zelekCb(VhYO&R@ft1v9X3M;;3?M_BIiv#0foaN}Hq`iEnyXaEHNPC||tM^X7MPt^J zMq%4mue+A2rQUMOE5eTvtAF&PKM~0H?z&6zK*A9)yOtMW3wSU9Eu9rBx3FWj%ap8F zV|VbMC_wTFBS%eIIhpI+*y>nvP+v2*TQ_z%{GRPx*KS|e$y#!MtWpuwU4fE!uBi7? zD|cxN_~@Y@9#BCu3a0(HbTF6Pziw_r5W2Ea*!MNy->8wP1s8qtNOxv}XuxnX(fy}L zl5XSQVivuW({y=93fU6$E-nHEQAM2UZDsM31)8Af+7Z_vyr(tsE+R9X(T3wOL)J6) zOgd7qG}VkmfuSM4X*)}%Hk-Y{)^p{BhvJQix6b%*-jQ|``9hB;)WB>Pf511K|RO4_$IWSW!J7Sfc^$2R*bHcF{Df@;HC<&`Roxjqbo@xX^Pu?y7r$}P5Rn)UH4gkp_>9J(O>Ew}ISEX!68%5A4m)ga$$PF)2gQi$?x44Dy&p2L~fQ*2odtfQy9)+dXiL3AS z+l9}^Eorl3MLFrrg%o9Al+GUd(+E@c{g-2Ehe+ZnsP&J$plFUyEb? zJ+-XaIX|XiwL{bVm%po(?ij)#MKJHzR>&);fBx~icL=q*J!LL!iWSV6Y{p`6>L+~U z8j5KR9NoR6!Y9eo!p}uy-n(M`=KR+@O-EzsV9@U78hrzPP*U_(Lt@`(qu84zIcvef z7OY=>r~wBIWdY#Avp6fh#YyoOit~Nx4eE|s!r13(1#SS06I$M>@@U_~spyt+FxOlp zg<^!mQone&^i4C2V7aS~qAdOoGxm-H*2N0J7_E=cesGNv@s~n7KIUEH_WG3|^{R(g zkKS)@3$Fr#k~0Cf-tAzeMop5j@>(>GLx@J2}*hdi36VZ*90*)s#-I#P0NBKv}dX$d} ztkv&mT>j6R$;0){CrXj+gXktryP`82HYA!4YVSG!wbj-Td01G`Ms@z>tJcJER!iWX zrh(6cB@dp;pr{9jWRAxA7D`m1CC;vXs05=!k=j66_nqE&DeHxwhROwQEx!ndovg6j zP0m427U2SH%g%ZVI*kT0AOAH-?iE%CTw#kL2skj6ALTKkkm;=3u$3LRU5@bBV$|5} zJehs{bq2ymHu|~n-wgzloKlP*-}viag@D?k_N28~nh_9jCA`a}s=p-3373^ISjt|^ zB~3Zc`hwm^y$3Kp-KR#5?%GnJ#!j;B>N{quv*aw{R|>O*k=vHf?}R{_3|dv!B2Qqk zCiyeghzK>FhY}LNNE9uX7ze_tp<5Wq!eZ3Y)s;k;^FQj4ryV=2(Bgdu1oRqM?_aQz z%fDb$Z%Z8G`?Be|%|`zg<8S%paXI6!rc3dH#~?!-gMI&^aQ%5ntyAF|ugB~C7ITm_ zw=^~|bJuNg4STMT%C#(Ga$G`75LTtbAeW?@M_c|O*Pha`#+FEF_SFl7m;BXDLoPBn zaD4yvd?~(u>)vMl@XqzY=EsDc6}?lH-;ydtwsj{U#*rh3Yeo)j zj6Xm;Xi!XlVjEqf8t|1VsT?QhFec01ek%6k=_-j)9(`7H*rQHc<*f>s8Iy|BX~j4NKQ206{BAw1LUhWMzB4pAeQBjd2wQPQKACz5J<<+3KS%8j zgp5j7qk$g29L<(;gHDIj=Ho3bFH{F@5{*_Z*}8Hi=jSsF$0oE&wG=$EJu6ola~8L& zw^M_}XN;YvtzVK)3egzjv-*aM@$?wa#*9WJbz8YH=Y;^V%|<5k-m16{R!$;m2ZI~Z zf%y85&s^rURqHi-)G;_V>I!8|R*6l+@d>#^$tDd3sZQI>*gJfQABgMfYYz0j+tG1- zBj2M|$t2@w^rHxf@>x%h@1EwRDppliJ3IlVVsPm0xX)5%*)sbvp;_hQ*82Kb(Laar z=$fejjP=vHM@P=uwXMRGkb}P_CQ2ip*eTlJ5I88SP;2mG#!dzbd}p3uby656`z>m?NWW+69)Hf0Hry@C=GsKO) z6|F>i#)o!KQwPYURke0|a3X%D%LR^P-WW9`$hIrZ1^$t1j>;9XOUQ|rh_puutqD!q zZ}ax? zwUMf0vV&S>kKMLn%bqMvps)DOMpu=*_;*9xeB$|o&R*M3VrxS`R+^Q{v14kpUM+8B zIcF(uGunLShvAsq&05ZEa2ZXdU~+Sgm@<|^qt^$FGv&Cb9bO$5F_kQQ-JIk#s4w=O zaS%+vfl!h_5<-Unh7JPKMY@85N>dQz zLqHHzL{R}1P(K7ziin7Xx%{7VXLb|B-}j&0+1c#QZ04Txp0_^l^O`+&-4C(p)m zm^4@^6vPkM{3`?_tvosaj4YZFqsu0!gK-_$A;xiT6i&N@f$2*fSsHf7$;PkeY9z)WY+CNorQctP}A3FW~4XKtw^80(TlKLZ+lphxy&VftWkd%NQTva!zw? zba6Q8o0u4OmQOxuUxBJrlHapqqu-LrB-xHS9P=N%?!BJy|2X;Ne@Kn5|32}1_u?it z@4AbaAAekY=dQb+etNSR121|#j+CAWZcW}=EINxe6>oQ$awum3dL6Ni%ysN!QpKlY{qD1ds;;=c;YQPFX^#E>=7JO>JH(+9*h_1SP{D3^Z6oR z7crFp&w{%UYtf}iUJ}w~IPcOEp&VuC7rJo3Ub1mHYhrWNI&oCilI}|4l&tpqYQ`kd zSi*g<`!~|mw@dt`=8uEUE>FPZv|IBLp$eF?Kj0pze5I3Vd{5UQ~R@MuG<4dDM?@Ni;1 z5gOR=D+!k#lOiho5G#(Iq0Kb^cL7`)3XVg+5PPb{b4Pwd< z8A_{g_bu8u_t@g0y}16#jk{oaf1fY0r|@bCw$Yz0z`^&&EIT(Lm7#ZH|~oz zl2+Lu+(M(}Uhzmd%W4?44|Lr|JC}&M^;zO9t*TE69vLQ(lg7PABk1$y?Tc@@`rM;? z9eKfCDi^Hz^pQCYuWsnc?Tzp2AFAx!xua~)lQB!p-J4i`zxW(n4C@rl9RpczjfZ(DWUQyxP>U5Y4 z*M4nyZuH1?YpB2Vl2Yg}t2NAkc*$^Oko;TJIM}f-0mBX*6hYeS z;aW?HCh8_hQLico5Gi7R32@L7earvd2dQf5XuJ^12-kT5S}IHY*qA95!H}IuM06K_ z)iL3Hc-xg%4vR046j7~Eh_`D5k40`lLuASjW4&w95ZOr^A_F$IXJpj|=a`Fe?AWnO zdBQg_!{{)LcrmCW1jwA4q}-{HU0IYFEpCpSw#6~ge5di_AA`d@X~yc3J9_t@dVEG| ziR`s!%(>Y}NgwITIZZCM79?M&L;i#<^{qsPFI$(2KhQ*sk=etxN}L^0V1=f@wP^&; z@mkt3Mo>yz_<*2L;gagKQbPs2OsWL%0aJ}!0A0Dyb`c(QX(eZBJ^{mgAYO*)ME3xh z@d7z+?V1}dRNGWw8ke(0gM7(Qxp&`zKJo{#x08=py+i3ldYI=sICD+sunDU5TRlUb zvt%laGEyUPcLxBFa8A;)sFrEo^LhozDK6~~< z58YY>J9h6}tk7|I%IIOI0-Z-3wXKu(4K(%~x3i*g`vYjCeO1b~xKPvqAvLW*hLCfk z^PMPmV+(Mz$5AY~WO)v9=14AO0c+A$pHj;A5O6JBtsF9SpU(OAC_dFqFz-@ABT~~} zkS%^WcFJJJT`6>%MukG7*BcLw_7%B@e|hRsu$`@xkw>IZY1_85-xaNxdc%5_RnqBY zeq%z=4J!03;xGBKS=U710O!%g$?7 zpK$@wGH>3cI90Ol3vxxzAnieDWun^ZY#yE|lV!#80Ep65f`eUEhCI6X7XxIi7yt*D z(#9HGhNwxNJ&|>?9i;3>t`_RcJf0I^4fAI^^KPK0s>kb5P zMl<5o4|KVK#o_&TRm1gPUo~{j(L=J2AGLZIb@LPEURl@JY_@n<%;eBl4K`hBO{l01 zbaXpRHeDs`S$*X3L$=G zo8evVlWIO!Vy&b=#ioLJg@jRb1$C5RVyW**tu68-hqyxv4i$a|g28#I`?LoRs0H=8 z=MzXU;uISx!TsP(WqanmEjo)qDmjs9T4*$CT}E4J34i=a3>hXT{e{k0>Jp!2G_w2n zDl3#-p}C>Z@U}3Y#c=d^&(R@!-00jm<~4)XMQs}^q-^o9M~5-EeE;gvWxnws`PDVX zkR5$@@iKs-7NngFD)L0x7S#>tkV5Lpbf0zMIT_YAzItwE^6V;aHGvuZ%8JQttgKDddK{^BRbML z9cNNUH^j5Xcq%1uR(3!~E~z}I{knKMkUYTa9wWYuY>ZK1omjuMTkG;Qf_6vP>v*TA zH)&)!23@PhpSeBdkSkmP<5Zu=>+GZY0^FOQTm@ThKyJ$b-0?^|8a*9+NS9zIA>Z(N zrRloxk6JTosFiQU^FR=y4SzlhEhvGIkr0PH44kc!qUBMw(l*j@I5aOPfu68~RE^A^ z4EoqoC#W!=MQ%w~v^Kk4m+^Lhrbi0P-3Yk{$JC6y5OxRD=v=Y292K{;r zWt9O@C_dk5;G;I@R52kWDF0I!Q zm1rXb0f&~;DM_AuU0m^YoTsEY(e$`KWlVI&^dUnm5!p&yoXKl9>g+L(%n?c1dCCTfZkNJ~y=y%e~T89tHiTb|aqyCJhZ{-|-V{En6FOZuc%3@Tr3i9%xc;o2z$>Nwf z7V>G8ygrmnqh1*adNeAEs_D9Px^wp0BBPasjvYvj?2gI|D*sG1I=m}!5-IP{SarrI zYjQfArmT0wYmO%Kq9x0EjP{{ySE0|Mw;I$#8lE%AM^~5^yH6w-r^A^e<2^DRa&j2* z?ldtsQHJ&`Z+-UjpMSP_NsSH1;^x@mu+3v+6r*w#W8zJ*c$^#FmnmdUU!%2ax@ST~ z*KAJ9t8rqA?wLjfC@81^kI~@_*o%=tXQYu!$#d2a7oCY#0^?bOO_kUF^Xxe8UO(x5JdCTnVrd!32zS1=qb!gpQ zk8abZEhG^MRtkAn_O!aMwkyGU+%|R3_hpJ@iuD#0_?IU6Y^n5?r_XLI)r+h)b#I3o zlPjk)sq~bSPe`dZD^hQVc_xGB$W&T0&?#Q$&e58XH%j^Tp~`X94OQ_Ra;98ose)xg zzO{OsxU8(TI((LBUa0HyU@l9gV5X>_2oM2{5rIXMPKRtE^pH{WgUZl&#uN^^RaLFs z?Qg!x@(Rw!8ABai&V)S?_3F8pneSUXvdTH(y9oA&H|l%_FmnC&A^yNALa5s%*8rZa zXXX303pY?)f@`*5prcZ2N~^~&K7d>E{fs$np)3@-9GfZT`Jkn{D}H3C$77Ci&JsAz zv&KZW;52aBQ6sszcAM_n(c`ymF5*Ah^xaK=DsL07{bM9*BCuI-DJ=Tmkt4RjS&&`GNkaeA#h`0} zOhsYd08nvlDI!R;L}cF)gE^8u+adLjvRJZxr@tI(s|9G?`nG9_7j3gUiH7t_oJH;;!@7%B~ z0UNmJ9q9pcBMVmTguqO zYli)nj-D)RtA8-`zyoJZH($!>T$o$gRW6{39uZC-G`CSv8+Z0Qk7BgEL$5;XAGy3* zJ$+>4bm{BJh`1-Iv+K+*l0E5jxrS$X@uwsxzVZ`KsVi!z83Nq{pm@xU75a<)4ve+6 zyV!hceMDK5o6L57MsVx$#s1TBuOfEklB?qwW|uTr)!m8U+S#?CI=Rnqd(TNb4~tNa zA+mhz(f)4^K01~g1epFKol7@x+bS9-bpxxk9DEuE@B-7h9MB-2?l4qf5B}3I&O0zL zxX=gO0^DCZCX^Y$3j-`GaM0rIO+gBknrXUqI5O1zpLbzN;SbUX=l8{tL66QUxcYOQ z{t*{gKh*ubOQx+8&Qo-LeZX*xcQ63%sPH**G-=Vn4jPZmXJkz(=3F`1vuAc-Z~wa8 zyBWony?ezWz-t9wsW+$?W>-ZpCQV$D6)LwizjsT@7PM54NEEHJlPsqwn#i@)$MpB_ zc;zTV1k}PStVbMST`t;?;B~2F8054}hI7Z7tvd2GI~y_-Cf@XP|8t^X2(f?N2;l3_ zWLk_|jINoPiD4}x=+`blAG?rC-;9`?W|~{>3H8Nohveua#enw+t|)oXhPYopFy`#u@(u;<9gefNoOg!7yQ_5AOg ze%_PTw9s)@od=Uf+FUz3yzx8lp#{>x%N2xKB1e+XB%DoqT7O48BR~D=@EucZAmGus zOXy_iF~qwvHj`gh;>qPb_Zhx?{_nRqOXR3cFN!at+i1mirX^bz!`f{CE`1pgs5DQ1 z#-elEH8-jQTF$eSxquM0l{S9FVSeB8YiAcpGTScG(q!*v3PrGvGW#xF?BtzQ)|c5O}6 zH{3CkUEPt1E{>;{Ml*p`{n=A1oJymXeJ-|)95ZlHy>jU=h+~OsaQF7Z^QMpyTszA{ zMdx%H?qkL{_vFeN#J?tfqz`jbH-iqI#kuF8uB(P{x+plO@!T+3tcPO{3)D<9+ za!|I*d8ZGLRFEZyul)#3&?+D-IOhwFiK4wXR6Wo=f{Kv54dxlyO8IWZa%L}zM=Ka+ zFZ$6|G30=#k^5qLv*w*=Dz#dIJXTt|H2s~|UmyOtGQkFoj&bmgfZ5M$)C^3l-R>Fk zl3$OETsSp#q4ZU}wF2ZJ0M%;dgwfHlv8pMLxkxsv8oI@*!gn@R)pqJ1_kqg9vc9~r zJX5|Y+UzWzv2i0QiqGi1Y;gUSEiiSk zbp@>FD#*4O)30L^m%~!9%FyWpSebSMz=9(I?MpcgB)35(X^(ky`DYibq%A&Jy z@hF`Dq#Bq#_lqm<{mFA^rI2Hgvf)DGYI4&`;o69?m6<~A2;9MzrVVi&fi*It3kjwaj5KeGcl=%_>$0N#6g2dN;n_Ekus&D(Q{+cq$!3Kx+p)x(&u`FM zHAO@0=$%JKC>7)AzGJpzg&29=7&aP%TYE7of;=a_qIc*6E7s29@Tw%MVC2G_-%wc%&pOV#XPz52*BW)SbW{`w0p;QiKYrjxgZ)#SaA z(upUQMhcq?JgRFc4&Qt|c8Vp+VE9 z$cWZy*ILl~yS+N*kCQt$ZAvb?ZS-e(IYJ2~mqV8`&9!wSS3vuNj5zf@g}o$p4EpCnzOwxQ@a^$z#T_>$(`k{D zvv!M|$IzT^jnT+yebdEwYQ||w*z}FXE9P9o?yEf3e6EX+nsdbhnZ393ReEc_T@k8+ zNx+;P!|A8rXO8pc4)c9y<+PD-B9IWTBPxYPR#bx2TEDwgoYe;%IX=wF#ap&lWF|+* z)@}4Sc;=kOsrz=N6&4Ujm5erl*A>==3XZv~(WNhk$T>Bnt(zlNh0)^VvL?KMe9z?1 z=DPFbUh#(-pE0~{(_xTty~HI|lyaXo_^v)+#5igxD zWY_gSdUUt=$nM>{BLl|3_jcDktX17-=(44PRbk66>1>R@-N5g06SqW7E`xJ28%vD~ ze3&y;DIc9`Y^8P3d4>c?)0m9L^UD@czJL~oywlZHzT(+uuXw6}+f(80?%A%c+3s%f znTx|?zwqR~9&~g$-uZcQT{M+DFka^qCN9Bc#1-U}pkxzxsJ-oL)f7%-Ln ziOpL!C0Y~+#~e{I@FtEb7h}*AMcp8Ub6^8k$pH8|C?=m;zw^;6a@nFQ7hSvPhW`_9 zMi*zk2e42&^sLamnCI1}kJ2vDosyhinvb9^FSdv3A_{>*Is}}TuLpUDiJ*b-{*)LwW zYuDLl6U7&veDc8f_}gP+2dL?t&f6Wj)aH0Twki+A(6~3Ub^DfZ?N!|ile;!=C>h=4 zX7K}~gLR-No4ugOb)c_=D?WO|4JNHsqqb>vR&~BJ+gY+_1eMLk%ep5V0aLE~^jW<} zx8G41?6s^mcsveGO&^YTnoD?UUTe|b{l#PJwc3sN7jzdvjCZkYCG!XPaqX;7yG5rR z@di+XZE-16CS~*nz9H9Hd3_+{*QwQNZ%&}-N%8Y!SL{n-g1i-78hVKwOZvr^xoF6v zQm8eghk;o8FVJ1qu+|;V_w-ZUNfwPlX41^N@XhJ}Pl3otcvBnGAeh?& z3xan*+p{bY8~KCR=@{y8={z2n#>k65a+77Q3&afhw{IZu1Zl7soBFS8NoOGPHRu^< zWO8@-S0|63`29<2maO$BJ5Lz|hq(*2z&XsX2~jpK1s%^ePa6ryfRavX^%6i?nHH#| zl_+CTdy+;uBC16a05W#)ZIu86zS-(x$kP-}O-5#eJ<9f(4IUf{_4D0h4BLRm@ zP&(Xh&`>=n{3ta?siot+q066IYI21IW^HJN$G14z{DsEtFavMS$Rb@yjmJ_iMajwH zo7Sk$0vHG(Q!=;%3>Y8`@v-m^cJ!Ku?04>t_2RlxutDpX4`J0&!dpPl131V;X$1l4 z3#=(PSCPkSa}ZJ|GeChd_{0>t5@`W+V>nIifwhNhKK6xncFAfC-UkL>E70NN#N}9R z9U4$Ig1(ZRq95oMRms7be8=`(s;kH^5u@sLJY%qI6~woBw|T&=(5M3u!62vHYk@J$ zG4#8u4t1eQb~1emRwk6dFYQR06!g!Hfpk-*HCj!oKqAFuocHwa*)(A*r0+bk!V^}b zV~Jz4Mf6ENZ8;LsQtoH%aGK1KUgJo{n;zI`|TX50H zS~l$`#C6WFi&mWM%@KK)oI-o9mL-Bs)K)*!q>^fCk^J>qXk zEts_*|34o$ld|&E3f~_-X7%z34|r&;_TJD~=QqB?`Q2u;zgfdBrIJy&onNk93tKS6 zo;6#`^^=Ze`&@c|T1Oc2)2i&Rcsfux;}sZ2^Re(D@XaWA>hawaMf z4||L0`^es()$Ev!Eo6gv&*l^MpL}G{Bp_VzijjIB|iM4qQ+{msB&OIvz>pf z*O{2xas_Govd{QRzzK;aiT)omQkmXmp~q)Gjjj*`WjJpv>pk9 z$U10<7{g&d?RgIZ$3yvz61Y;N6%M9krR;axHIPy_GMXR950KG+15h&uvlVCZ^2!!WVk?_2ZC-WG33&*8U-`TsP#tezZa8KcX*q) z{HV>FHTJkKCc`u_rPA)SU{Kcu&fA;=ul>u_AkNdY4vkN4Ksh#+K2#N^QJ)bc+B$~E7Q#5*B*%WB*gE9IvqN~3OvS1N;!IgB^`y~ z!YkTMJ$&tJj+{;I?Fakd^1CJZjUwh|1ms= zs&zQNhvvShM8kF?gMjBDa%dgDy=5^pGfJyPv3znlSQ+<| zk@&Dhyo(Hf@B#c?%%5}R&1E)SsyaRpA93eAKXTQ>x0Az}Ejxs|m^j{1<}kcXy_6Ug zYENoyb(4L9csscsoeS;cA)&gXE|}70bJ_&LiIP2MNM^F;su1RcvUxv8dzuuOfp#Zs z=D#G_PXkY1#+A3OIn**jarsfEN+}_o31!V z`OD)CaZ%6T$OkJXZHd&_j2t9 z@oiVK;51qke0PN7)kM6I>!8kZd_|;*wKOAKMnM89UMiPYtC0GBUuR z8tkl_-RkwVpBo7VtYyZ#LDIr zyuitgUZzP-r<;$T zdoJh_oq2~%I=mp3y*Rvsl}I?zusyqhz&F(nXctu)}e#bLmh1=BY9xSF_0Q z%_KWde0Zp$3v?tc(W)n_Hfi_Ob0$D_(_F6JJh69leYCK#v){R5+unLHu{0Xlz+8OQ z&N8xl&*igPt&CYgD2*d%Lx`qpApgK@kCmQnIr=-Vk}YHY1O#j!q-l>7w?LF&V<9>C zgecHqlJvXwl0n{Vkg%LYbRwG{08Zxl$uZT|Dix1tdW(9F($YY=!Et20Q9y z=M1quq0TWa_oDyvk!XNVdF+QjIu|G(Q$*~;k@5x%yU;V2oD(X70mH*JLL;7nxg!#2 z-mA6S5Y@QYq)ww%Fgl;lCbOMvSn{)v`Ml%UvpXubu6RJxqxHwre~N$@#ilf2>e5#9 zRVcM&Q0Vzw#Wy2U$tt>(uW0fajGdhkRqw+}6RZ7%&&RklCXj!U?cbB?aMvn%;uYWJ zq5+#srXc-LLTFb~lSOh23hqyQ`TT~pV7c?O?g4S8(_9-I_V~QR!+p@1UC0A&gUsn9 z{NlNk?+iQ)G)pYSb<|^(K5NmMcrRf?`SD4KADSRxG(fGdkl z!Al8JDlkJZya}QV()yjm>+>1c9eTL@AhjCbA;&@S$iVUKKr^<*4p*L#e&EvN3>*p* z(_yq~oJXvV#RhXB&fRoQ-BbS$>L^ckv3RFQ7I0 zvw}|lkm*^^BzP z^vSosE&gf;7jh$(m;lusx4~7n4GmYg61&gftdR>xBw5#dasYPhHT33Y79CBI-VteJ z6{0X!llRmHLZ>$XGkw#rSJXN@7b{ZIECI~ zG=~LVAJMRiWBJoDg!-GmG8iLTrCfZ6m>r!6DGJVtd&@spH2;_J{OBl>+r&rIdWJ#Z z1a5RKw>aNb&a&NP%~iQ`Mn}#sM^d{-FM8}R;;B9MkZhYh?L9_qwepZ`%x2a)wd1am zBT>kE8JT?koCbfDa?{;fp(w+Q80836O8a7Q?)FY8Ck>mMVIgzfE5)aN0VAN z$a*v%!!z4yMHxJ6{3QuDDZysuJ#6Mj2A|IB1G_I~tUJ_{6@SN0OZk>Z-C57tz2XIB zK-`oCxk?H1JHoIwwLjpJsTj^`RiP1Ow!XP4*A;=8X|Bp7hK>N~ic%-fwz zIKxn~t7M4t(R4XfHCYUG49C#P63O9_#W_=Qe5gNNQfpNjRUXwm-O4QIFs6C?H@@ZR zX7N8VJ(z+(h=Jo(w^vq7Bh_Xtx0%NinJl{;Y zW}f``71?@m&d|HFN8_mV)Jcyn%58mg%h6x#&TC@%zF@pxO+MhgN=AwLMwK-yMH|Oo zzROj1LtEbGvW-Mt&Y0IuxC-mwbwx(UJKl1m&&FnO@n8{g2Ee`;^5m&66$Z9o4qR|s zq*^Y`+7@y$2?Pe;NlGcvv=X%o&{!pG+WfZ%?JK@(tF!<1vw&nAsG!iljI8^io-`GW z|2Rj8$eE9tSB(!Di-+aH+41Ow=bd-v4SH9aV*_?UtMIwfCe{xIypVwQ|4y}4t8=h^ zZAhz2*ez(7FzY&17QNo3_3DB;wckk8%yE0k@%zqsp6?a!Fxm{kNW^516$SLtik~B= zgbLy_WVgHG-B0#Bf9k2k65wmKM9T>4S@V#ZowYPG+6Tpc{wYC3WMwfz@=t-i}WU>0#I2=msVf#)& zV%XC|f;MV7vM8aplRj-1klD4zam(bZfM*3@my8jk;OR)eH;8v>r9vLM>wvF6D1M&{!^e{^ z*AT|Vkw{{w^VizLYc`tJlkkfd%BGorW0hKn_hW!bl4csVQ>X_^JpgjRo}!42$V>W= z;Br`(dE@-4M_{9|V05WbqLcJeE4}oeDjucVLlU{n{XPDpzjWDUBbQ%(-DXe2m;2Gs zB|hsNX!H+?uMQu>4-L~sw{_s9kZq*7RdU47e*J6a2jb=aIA+IKTsfVAL+o&ZFerY7 zJYn~FuK+T7|9${%FnylcCG-?W3;XsJMvFcCvN4-JdST}QADPYC`q>WF7%}je!q>$a z(Z?2Jzunn+Z!#&qR_ut;(JPZkQ4$9iDt1M3`m$zR&4df4xQXj96|jyB>X)}b-bB=P zhNzU$GcWP;Ln~t{4-TjmL>5x-dl5Jw@Y%y1qKd zo_B0jL8#c@`JdF8uDDvMmLUsZ^MY>08H6Qu02hw)!y*mo^BF&v9E@Jh@`L)m&blRO zx{eYRGvGbA6c{NJa$?=>YdSP1#oG%HFiW@vZ}Q+WG6R$^MUt*Af|Nb zY!yEEr{l#(y>Z~IWMrv|A$)*1d#8l71%RO`@s94`(&27dJh7xFj`tlyzxM`kn{cRg zAe-Eljs?e*zH9ijlFFyWQJMpyCZ2|-hYr}0n!%Zun$JyNh)lXBf9H-$^*{ofX zkEp~sufcU;?B{>Es(`oEm);7BXb^Mgb_AGrn>UXV^aj!Kt}E^0-M*#kHg=b~)-D@% zPSx++l*(+GTj3M$rU3|j%2DK(=biVskL%`zF3$V-4cQGV1}r_Ek;N;MIPImG^SXM4 zo@JZLJ-{ammb?W65M_%dz{xlR88$*{K7BF~PoNbH;tJ2H-O)f`INS6cEi4K$=!g|S zqTIt^y9&%tn=g)#oaD{dnlFFLs zQZz*(AtQPE>Z@Py)a=fx`-P3?zBk<%`N>H=whVBbdaaGMWz5Y#k5$Jt?!~L8Lmp&w zLIcs5e{^)vNpoRzF8NCMz#O_vLO@sTSh$u$&OtjUrep7@Q%YJpLoY{iktw82x?EXl z;YE^%OGm<$XcCGB(DNQH^H%d4lVqt(iFx&8GE^0MlEsdi_+-iG_j`1iaODG}vl%rj z81-(}vubHwhAlD6lhe_lJDuuuFe*@(MV3$0`GLULve}~9{Tn@tRE|Q4!0j*nHkW2d zWi*<|eOF)oVoHcvF;TDcMe)93cvo+CdGp6bJ{}M2Gx2^5>9(7Vk+26-BG7(>Pc&FN zqsCqhFW60QxEfBd>E9RFwDZJDX85#Shjmy$b*VJy*igW&><>52DhPp*p+3k$5a%t9 zH8dl;jAqFB6L)aTc)+5f^3W!0JXnYh&@c){<*Sm`ldZ#oj3&e#`XqQEr^G#z&cR4> z{l3H<%=v4@J>(+tx1*2xiW_6at!ggAy6-qFyfiF+C7Kca4R>|m>Mb?#uMbk$96*hX z&hR#3N72RlpRy_K=BMUQpjQqjEkrZE)LoK-7+PqO{8;K?shC%rcaM|h7^8+`Gm&Tj zR3Sc~t(-D-))U6C4P+2Lr#PdQ+hch@*I{-vLcRlMvUPA&#YDX#@kCdof`!%N1DLeBV|lFLN5XuCO~&|A=FUV|mlxhzQ~n^i z2C|xI&y(Z8mghq!v3J92wUYRWXrocz-^kXiqC_u*W&gYjb>2TE6hsNfy7H>fu=vDOw}5g#y!}d zC7*lxX+l7pV6|qfKJk+<$Ui5l@jZPpTd9=&`=8NSYzAmmxxxT`b~Fy^4IlLOiVyY4 ze1*wwUv70@6e?Td>A6$}ECu$=gIa3jv%4n4yQY1O)Q|@xZVQU9gE_x)ip&44aWlD*Jaq5Z|LCaN>{a_a%|FKL%yHre(XHY;OmOFKcH#e4 zF6u!os86zkA=HtR@G9nOZHHKCBxG9eVBv`4T_9Yd{wS>*&`0KP&CAEYm7$_WaPC}D zK0y*vPM^5Oe}%UWyHk%5OLCnj~Y=*r=6_ zcVli6Wo*TQRj_L~!`1LI9~UsvcoI_r#G4fci^<%Pu10!+?GI^BV11asXJlp3d{9t~ zD^<+eV^lWnPL3!4-n8l3FqaZA2Pb@O^J~g*jC}O{2$&6+VMcF#Qe55UHQ-e&NInu# z7Za4%S8Yz@CVCptqL3?=oQH8fqnr}jhes!urc`{0AG8=^uYoWPqtzRnW`}=G2+9^8H7aDWc*x}EZC&dfK!5Y=kv1ZM5)K(HA)44>)iiw70 zH1${iNJnUSBD8$f^shd^2+z=PM`Ft383+NpdjZNU@1A+)cWnimJ?r?c_?ID>Q6;_- z1~O7>lJ{vGsFGUi?oiEBHy8USV)i~;zq@nPE%@xl_Y--GwenjoU^WN1zUy(;BcI#{ zdvCxsn-?PRL$6x$UZ@VGJ*LzPqb5pP@AsQm;B3Dkr_}4@)^(K`#4X8BzJ<7j$5}=yVBSi$Tqb%B@Du4{ zo_ai>qQ&x@^}YUM^7Mc?uCy+xsayd zqiEoFo`L_n?OECipN`O}r-@N2^Cu2UFJQ?@MqSk&9VWQQkRk;lL?)PbCmNSX5Clw*y{C?+2{~3G3J?n z5d}Oy!DI}0=}?w#Gti?n-}#WtU<*1Lo~T7d-hZ2m2Cc9{I|s}HT_oDc7@mGN)CL3MIY_2mX1IWgz{Z)JppwdP1 zXx~Cl4eK+gj5y;3@CI%`zMJY>I`sfu4xc^a5`&VI1A4k``MTk}R> zo;n$B=RIR&qUGC7MSrFbTI)w;l7(YyzLhhpN4pia@aC->{He{Ucy;kpZ+9OcP4Rab z^5$z8(MiX2?ht=!u~jNL6B_`;`|=B(uo=T&idi68&UOJgpj74 zbAW^*R+DJhC7THX0vj#CDiegx*rr*|76}2a4JxtCN6>O;T7ISU7oc$=4&XccBBR=X zJlx1=^TBauBifr&DW3127J2OsNT05_%JckP9{s20=Ld2D!HXu45EVU18ho zQlFCTKYu!$S~Ak>BYNU4)`ydhu4SXWo*y!fKLf6V$r+Y>HpzU|TCrLxw*UR|m;YD% zCy>+efZo?v>D2Wa6PXI4ug;}VqJ%70(3-70*%6W#K{=}D&BjcY#$ONPB^ zb7mFhY2}KvbppKkg!!;}@i^H|6rc>BZr({g5DlHoe(`O!*EXGA6`D)ACXbB)JZe|o z@MG~B+cA?0R&evZi3kc{%!SQ|aWSr$nJZlA`r3p3JA9>k*fsg&hTL&okquqsGI5UFO75hP++bL4DiY)v||I##`f+6x7I1uE}m z$h%Ln7)T(t_1J>!D=2LMz2bHi2wlRo_o#KvgkBZ>VE*2`c#_N^NeeB!LHwurXT#!i zqqmx$A#XRInoy!KNz>`7GyV-5uE*d(80_npZx?$)dGf;cT5Vj^ zlG~8r5>z$5JUZR&50CBLU)?YH*jHjsG}T3PVtYSkeoEbA3;QAY*ivMH9csIYFdPdP z0~w?h2;>bRj8fVRk1V0{+8O#IRz{(C^Uq*@(|mHAU|KNE#Ws4nw%*x4Ida?Ko(*5= z74IecS~_~K_^si)n}5ZTz<7IIh$oG@GYqy5lQAiFYx*xf_ry*Gt1Irm@FGIEq`}}Y zazS3_VGJjod|zwh?rpx_@0nZt`5%Vh*>lm}90TdU9ezpPMud2kTv zl|ya8y0(L^`E(=(ptTC@0N$d6la&e#)Cjj0biOYa3#vfMN5TAwrndq8ScCOi66mU| zPX!NO92+`3Dz`cu>H&R+1{g83^7p@Y_n2&DTgO)Mg|f`z_UMbe!yK{IDiH zvNo?@ewu$~d%MKM zh>E0>bWIff@?ql0Oy!?5>x$0p>wUbRHRp_TFKe{h!7rpTfYDiFlGDT!hEklU^LSmF zqmEKJygoxqCOe^L=&W9w)N_=hh)V^H7*Gks@kA6v13fBaQq38D5kjH=R74V9Lt0QN z^lP7K_^n>Tg#BTI0rkD+C9=p)na(D-i=Oc4KSs%c@ee;FJ}Q>TP|d>Tj+dfipRYJa zmQBY!(+3J~Hc{G;k@sHgKBE)Kag3JoIbST7-{c}er&3K!{xk_!&LZz!^Q9N9T^3X` zetJ}m?M+*gLA$J~s3a;ZDxxuCr89#IRW2$ak2(O%F9+{?zRPu9qb?kp`7COPdbd=M z!WD#TOP2vjNJ??j%K6Q=1|lEx>1D(btvMnzyLJGU;nVi-kn52!-&BiGZGkE;6NCzFU);je zpmb@hj%P`8Uhz+qE8C?D(%S3=wX*P{gQ`YW&N>GCF;gt!ABWpS24xDWW~RhPD~5oO zxB8ya=u{ji5cH{XqYzU$8oj+PyQMZb62R;cC0ThypxSrFq@34*;tD~WL9J%QbU~hwdz4RHt_jn<}o4%3h>1qBUS0RF>P_4P@oBhS)5kjF-viA1=-QzV7 z))RO6y@i++(mRNHegVE|DQu+5|kBPgzUNS4* z#@JWgI8|KoJnl4RPoh@dswvfI|HOZ)J;|Gq9c0F6L7=2fZIJ*=?-30m6dTvJ=~N=- zQ7SOfZ3#eJe-p}K?NG~;F0PG`e#>Ncm!p`DXzqIC{PSs3<(@syK4i%iD`IkZTwSfE zQU%4PKc7Yvi{({pJ+AxBtFQPG72AaHylBs-kFAUEew^Kr%9;D8miQ|>iyld)&7R`U zN^J3PnY`Zo5{YlTsFF_XTUp$2jv0eHGQ#4W)}qCV6onEwf%Bm=b@1m#;m@tb8f?ZY zD6K7Fro|81@ZRoaYzckq`lK2f-9LEY6faAO;w4v4^2$Snd3%hPNk2G(EOeHC9Cn@)!YPfPsit&JPktpoXl{C=Vkucp8Q+B(s*J$5rxq_T-}B};Nx#KJ{_<6N`{*XzF0xJ^LBxwMc$$xyxG4Xu`1(ho zq>33~lrp))_!URZS=3o{*&)L^@y}#wl2pW}lcaOJGV~Pg587AhTK+%~c5-zaqfkYB zb+7`pa2_%KgKK4`Q8tCHicyo&suNJViK~TbJ0ywzYV+Z7@Bv6ktD)wljQ;l|CB888 z&{F-;*Y__ztH&{!PWtQl4t+0CX>@Y;L_)k&mVH$`mz+fJH-)n=LOEXw#Q^k$_paGcvoxZV|w& z)iV~I4J0Ix+-;jl4v8717zK7uN{rYRu9t4kycg6Swo27E74??$xS+>dTA!L*mGnnw zimau#;Xf)>l#xK%>3RP_rq6TWv~ee`)R`P-kV%Cz*_=xoyk4g+Z)u29zMRO9Jkn@$ z8O&a@MG@mTz1Tl-+G(YXw{dDlI{8A`Cv-c4jtWQ|;<11}>8e!=mQzf;RxaydOPN=| z@cbg}uMx%X;zn+d2PU1da9`<~tA7G*j@k3ipWmhNhQLS?n%ryvE1XCFmvqSH<}~P? z97ILfwRdmkRR>q*OYYBc39~uD&FVsCZ`{-&B%BVT&+F7?E%9j3AU6nhoj)HB`{n7W z?7(BVV;>ZY0ysOXrFb^k?rZR2q6*L(E_w?Xe>F}5h*EB?Jw@@Il( zS%cj)7^)beCg!i%N~tB@p}<_adoWpx@Jv53g-RW;adyN%8>PJBa?DerHV*m5&sh3-Gj}lN z_EIOA`pNS-vP1oVc0wkA1Whj1&cj&n*h0i~5!#?jy%i<+OUaV%XThRa@pL7Zg%t`_ zM;Ofo4p)cMZbG@`2BAJU>hljD={h>HD%xqz7V?&-Z~wmRZKfuQ%J*-1SGCdxf~6c4s;+n#jIyH&nNlHGjb2T6Jz`PzD!a;j ztY|JOow1y^OdK7>Vu$$V?>b7sO03L!bUI2JLit5$U7y-N%Aqs_+|=IBt`#f;6eA1( z6eQ|aEd&L=lSJ~MP~((ScNS%2u!2eMQTumvNvV?rac>>}c{fQZw27C2xVU-*iD|_e zn8?-Z#P2r6pOWq-8CnLsrm_7R3^R~R4;_lgGp(cjNU`-C@ zo0K8VCXH(O`rjwyc0RB^vQq8x&`v6r1W&Zh?vug)N_N~YdCm&6jAI?{dWPTfGtF&3(x*>@?MGMbVm z%SOJyn{(onDa7i7(s~xLo@*qX7?5}_DZ}??WDht1DgQ%PGX%VIi&dU_5DR`~YfSim zTQLP*L8&8JaOog$ z%?gTzM3Q%Mr{x^&E3Yt%PCoNt98n+{9}r)xtt+l5msfngCO#HS05Z~Kb~n!Oknt<)`^>V4v<;cmH-=F61W%-(pVkEkY7o>Mk%&e&%{r^Vz{rTkjPl z-siT9K_spWYZoI$=a3&bkT{2Qaqs~C;Fk4n>ACqR9*=OVZl!LO6dx@40vB-kCeSx1HUYo!)o0XE&SOP45YW z1QJq!P^6bcYDnlMKtO5$0YwA_5m5y3Q+iQEK?MW^Q9eb*517mUId^80pngBU|0I*0 z-Ay)g&pqcY&-=X3Yg=%|Y;!W5<{1NLA*f5`j73wnT;`Qpt(qjJ{B<%5Z3&6>Ter1N z^Y*M3;Y?#lLEmlNsBU;eHDDfnLgyFWO| z6}KfEbMsTB6xZb`OYbji+LsK@nY8s8d()e3J@DL&$!aEsWU=nG{nfDh3N2$bd?n>CY%J)d7fcxNP_d)fV`NRksR%PCWpaB$*W94qtGZTu?Q?t8 zdzIH{ufoKhPUVPxWOAD}-P%5ew=OyS@H~FEKJ4S-E*EcbVl=IS7tBNu6xh;tDpWe1 zjyXD;&s~k@1-VqQr-(e$iyGNl@Llxid>-CEh3GIkO$-sB+-@XmgO_PY_XYn7FDjE9 zP(Mnede(_WRN&6brXS}Lo9>If(KFMT;m&C%RTBSo4qyPV*R4=N_Ndn{om)BYyvl_O>Eq^vy|*W#_ea)9 z7tQU?Yv7gUP(aSk%`Jm#jaY|j71G(NwBMkufjoAuUC`Np>wH|?Qh^hS%9t&K}La$gob-<@i@B7Gg$_Bta9O6jqDnH&)@ksgol`9 zxZ|k4PHFNfJY~Po4Lq$5?g6z`ht1lAsA9*z`UTk>!NQjXJ1!H} z2^1OH6D5aXXh3X}&jHzj8!s5SE#A7dZ1%^pp~+oSYOTAd z#^AqZacHd^KVhaO zncd7Jx$ew+x%lX82 zT`mJzrpruio$W|1o0HdE!MMZ7pc7)nN&Y($iIg>Vy^+@uolUP7HRWS(e-mH`AG5r9 zyY$yW;mBffL!ppctb-mD=j(RyVksTqpi{89u(*NH&=?)alZ}$zk+%2pX*<@cPsRXg zU2_>$=@?8Fp%}uyoLJeM?Z*k)X5Zc8`Ss z&$>R6egS=IJQ@C!%YTX?Rgi7F@3lUq!OUsDd5Jg7qcMXp6VwNwV?lq?*D&|Th+?%# za2Q54ebT6&}qwm!y=Scq#0KT#`KF8uIx1 zMMXZBPa#Gu0&{H2wxA$u->sC@9LkdjMP<)4fdZEo=a5oRpf%2Z9@w6gl@r$61-sAH$;+;8jIHWEqE|phpf8N+GEA;h&jYK5mH=Kzcf~T$&u6AIYQ`ugE+v@eCWZ@+zk#;EC;D_uJ(b7B=_-t338 zzVEHP?Y3!#m3}LISAW_3`AdlY#MP_Mk?!@{vzc!5BBoLgEl!)NCzX8CchrK?(Aykm z^wJ^ZmYFAcPR|+U^Za~+Rj0QYOoN$%#;l1hx#B5Hn8UD{Z=9@&^cFIMMtpyPr>w1J z3t9Xws#>o#h)QqKl9kf!7!2IUB)nm*gVg|+B0DoV%n||zs~6n5dCX_X{;@aPGIMR^ zbc%y~vAq#3$?f2pxj<n@kirk3`35G$V<{}t}E(M zK#pRX1!F%NBKro<7pem0ubww3eW&Og9UHKv#DS3k91GNDf`}Q`pvToFvrVAOK@o?8 zD{6GOlwlW6p(16KJ*ns!sr z!UatB=3m35W3hcR*%A=JJpAt}y!RwnAd^tE#ahnj`=HW}bwl$8<*lI@h|r~dMk%8M zMM8P&9ry~}fU@h6Q(t*w9yroaYhnIJ4cnX$1fPOIO@f&G9=i(VRdU^RECrj_efHkN zx8E-3ANPLa@tqAw{Rr9`+>X%tzVOq#@0Mq!-EzzGc+o!m&wPD4*mgyo$nfww5xpZ!eko!t17+S0(BDoa7wr4;l-|$VR*S0&746EBaL$Q_!%2rwB5-+2{xvXkfwP9efARgJ!MEzz?IT@` zFI~BGi%vAGF@^f=F4HBK8a>@!vt6ao>uP>9RX+?t4i(PJR_PCeFf0Z&rg30;hSny2 zJT$;!Bz9yV+HF^F{P5^uWS~1i)oQ(dk7m<@7WCMss6A21b)rL{4LAg*PO{jwaVWvD&-@JPdQ3)^jY-H!4h0aR;{3AT7yYK$=hj=tA zbHt{)NCNdD1_xUq5?z;mt93dAww6&&R>s3IE5j^g4Q@WCb-J9|5byW-$?J{MU=iFS z9v|s-qX!B5Z5rC5K{*#_!X9myMW?~El}(d~L*)wt3-6z;Q70iISRGqANJ+QYq0rYs zSsdpO?LlZ*#s-x=L|e#{2E#}h+7KP#v52fLUdMbJlYzJT%@#q=?z>qwMk5amDfK3k zx&efwpSb-J@&HT7H|z_VKp`bxbu`d#K(Vm`#W=%>h?9x1nOf$1FIz(%JJJ+pENwS z0{b+lqD5pJS%eaFeDF*MySypU8HR&9V-@g`R)F9wryOS6FX1NN;FtyoDXma#mh1Ji*wd z@i$J6%$7LPY5aFt;)o{xn}j+&(_R}V&_h|^9JJJZg_k;rC=7p^6mcxN63e%lm$`K4U3o`Bpdvq zI}Xbom7_NLl1iA-QW?zwnD<%_Vj}z=W|O31#+S#x4d%>tsMrn)DebML7oHB%+@N04~ zAd^e>hXpi)EMp~bRc%vFF(MkZ?~hv%1|aJ4dBkqft#)`^8eYG9H_#I0LYZTfbCpClr*AkbO{*=>-gMKWUyAi52YMT^O}CwW_V>uc(i(eD z)U8xNJc&}QyglTG=Jl?M%UN~a0R7gOF`mlUyArF(;yv-(T$c%D5j}vHT`uNDG4HsH zJm9;URI9Cf$93DvORGmX&paczy1KM{l!eOK0kaJNvt7vgfZ6gmIZ-J7wWr2!#A+RM zbs%e^3X(5(ra|r>x5*$zCj8arU#lxxUj*J-y%lN!JO- zt|ZSZ$Tz+bOl}MWp^>JOo*iyX1%Jboi1N^xj9SjBk1vjgHgB>oDq8&@D^G_@-KIz+ zWJtQl_tZjJUD=e8zP@;P_L|yWe;hSWq8tW4xoboxXlmtXRL#y)1B2Cz(KTI1J8Bxt zo4+)h%67{$cd1U|_3R4fA6UgORZ5vrFPIU9R?C-8^}5<|;!ICCyJEyyDrESPCV(G_+3t`UDcC{; zgsj;a5SY4m!0BnWUe9C>IpV0Mw{+~b&GO!Ff&(zg{1xwwdK-j*og@L1%&D=HwO3^m z$nSr1a(dtC`eoV4s;f8E>nfKHm0l)+te7*|3~A1QF~&H!XuxKqlTt%#BTZW>-`5jc zf8XA7%7eAb_I;aNkPjmz^roBZUyyF^sY3jK%xAS2xosg6u9D~|Nr#kk=dSc;7S0)z zjvKKLAG&=>a@o!!p^$n&9-`aGftZ6^iDdDcPNWH3i$>uzHKs8TrU{@| z)7RtW915>1?c%jWQqKvZv#3%l+bgjt&!=)HH*v?-boZ1_$|v>qj~*E%<71CJ!l)%5 zELSjwjAI0<1U`;@xAi!)GNi*e^ZwbG`gus;CiDx7W&4d?i^I9p(Y*zoT?z+ksBV6n zaNnWVM8Frn4tRIP(csL#JXYzFN9ecg}s|oS|k3Kf>Eo27ME%RHu~s^s0?nm4qMad?LVn!_Ho_??)W=-0cz$Z)7sn!=*GUkrB(Zw-#@K4W8G zAbi~XMc-ObKLlgMAdFGq9U0N&^SX2yvEfH@u7Vvn6*g1@1c}LR%}aMQL|wJbl18wAJNBAH|Gln!y(NpuCgi>D&7~P;kbGFkh;;%ASh9d~eu3 zFf!x}+xka`Ey4JLd2<5E*|(56O1)0Qi9R8`YW)#CqNtU-2v|l7anw~y0ybX5Li;t+ z`X8;kcdXdo)ksnT(rsUrTU7yzoEj<|apZ_Eh=m{{7j3(&yh{gO0pLn(hoEu&OK%QGJ*~KYF@O`)LCcB zD=TjXId_$t1&TAh^I!DmsL>!}=V%y+4To9}6_VsWQCZSBd_iJ(?KNg=UG4IDb-jF{ zb(`4Db9S$nFo)eUUM`+-{_fH0PJ5FV8sg3>>Y19&l4KAWUO;OTGpo`^QxoV^SENAN zKgSc}yk7qf*WU!cCB%c#KV?*U0v~z6=4?s7O9?2li7|VH6aLv=M9VtzHt zIt%TNq!^^emL?BSErUIQyJmhSsr2sNXd|4o!zW_Y?zK~rihM#c<$;rqJEmIeJ!I{= z!ZFWHK%IK)$M~5n^bjutZuCM&hYvQbT{fdX7J)!V;(Mm9O9>auI}`8N?%Q4N+q|%% z`;@@Pe1k0fnAv#JW3RmOs^WF>Bk7NQ7eC+`(DlqdY_Pt!ab@HA#`9M;_Tv59pff(o zydvWpRDB(db@K6%j}mS@tY;BfB)t-LG_rF0@(TZy!s5?F8{RUf)~Of`vu*MbV}8-` z6H6aVPq}6!7&* zUUVAR1zuz@$I&OR5;Yq^Tq7wEHS#2x_XWJ+ZXFNVm;NB2&D zWxD^Ae(C4go;Ay+y#DdAAy=yRjE8%xAJ0DF&`Dp@oUaO{O3_wxibb=fV0YQmKFRDN zj#$Rw@iwx4=A(0PjXvb8qs*JLGHv||W$>Vh7+!)qNlOB~+W9MoO`iloqs zhAoGVc4s5~M7q+R@L55SQ8CF=PT%59rjI%0%sz$Iq$TSiJf@{-=LBNNbY9Z2O0639 zdc@JAS8JgJN|^J<==F^$EO7W~XI*quopV@sG$r|zO0aujLuAW4pA= zmtdNRpj2(<)g_3X^;gS!4k}g*Jm}71TU4X?st9F;vT5T{EH#?L;!NS3Y&>j=s zZ92Pjg}u_(zp3>x(K~y>gYh1!CwiN7o!z@_b#M1zF2;TNau*qIeF_ETX7h?Q?}<^P z5f!+37z%{(k~~?*p`wxE(nZ&extqcRrEc=5ck-G&SB!Vhz541s)6-i`()(YwAOGmw zVq|o3dATl<$aY+-3LJqt^8qxqa+r(KLn_1xD>%I-_cH_ z1$ZIIR+M6IQsWK=45Bk?N8LoHHIVB0qam-H1M*gtlvq^Hr z_~)}ezurH8Zl6JJKbt^!!a7RJhi;$TzHNObn^>@7eSP-TXD(Js?{%*l+d*DBzV(A} zfn=mN-Z`J{S@h*XU*-tBe-V*#p2qn6{*afZSMvKsI9LqIye)(j5EPaTA#N7ED>M&# zl5lOQlL6@m1On9N3F4MM{L(n4o~iXzzn(A;PC{WrDRePMQi(*TWF~(mXG4R*mK2(s zr3a8oEZHn=>n?B0#8<3YlkA>T39-_z63Z_7^1002JEWuTr0>;;^Oa@ZK@EXwGAzIe z1Bwv*7m&TI5}?12)&;uO;Tc*ALfQiU8+=KLuhX;GKAcUafeT`iS4bD{x#=dV7*B3G z62yy9X=t`=8VPwAh^PcrqN&zruqsf|G`qXJqronR0k#C^km#V$a$e03tO7#5-rCVn z$6=?A*-`DzkS(DJhd4JReNF^-&H43n&t2)YXHrpJ|CU3Sr(>yQhivYTELt?(7h~xC zV1e&lfSS$wz>}9liwQQQU1^~2we5!J^0V~94n!ezAIYD65otIOr@(F54tyr>J+buw ztJP|4PLFvw)~i=(u)T1OuMs5ssH|T1;$0&Q^iuC)G+2?ZFluxqjb8tP+?{l~1ZPS9 z$27KPOEx{xU-hN(rwqkbtX`8$PLxCJXZOU54?v<_%-cpk%3dWxH7hTsR-oeVtcuH1 zVgcg@oaY4pHY!%^_~I?B6XY&>?H0@sAA(l62fQSz33tE)0%_^&JlsHv6~J=#%jjfK zO_d-Jfyp4+jKqa}iHQ~}B|42(aCof)g2!goXmqlS9<#4?J+VLY%xm_Qjf{BugU%%|&1s;f=? z%!QT8PJ=$I@3D0EBu!btr_y28NuBxRNbFe`;+F;ReQJ33#q^F+wHV5MB<%_?jW8(q zBkxAcEultFHhi=~M^B&)WBc0anv6wK#Bslq2M~$qv`Ow~l*;IcmArJBJ7`hfjRDJg z#aVoY-O5V@ebB|}n2)uoii>KDn`Iu~T?tyO#Wh}F~1iZGa5V-}P>180nOPyYHE zGX1;$@)O2Dz-LIs=fn>ctU8NmNZD-p9v}13(E!E`iZwz%?z0jx&u(@C*dU7u+U<@! zR7}dE>?Lp~)d!aaXPR-4xOSE(EL$QPQ^JrU!UXXOub8W9lXdCQ8l>9`M#0MefN14y zJnQrKbLXt=T6%hN%vKwjN(2_2pMK}8Mm|f2cQM;r&%hrj3>l^-ImquxJ$%0Rh;XFo ziCDef!02jw8QRn0s=gJcgd4Fh4M`smTVSZK$oF-fwnF-DdF~_ImOi@e=kD?8x!$F> zFkf3s_pt&!pO{g{yalC$DOf20iNH+=8o=c@JClo-5X&IZK5)MgCgUqK$L-wj{nh^V z2B&*^hBUzrc{!VsXsj0ZY_HRuahMS8N!N|3%odjpEoY@(szb52^>rL+T?mEIlsU%1 zxPb|9Jw!m_=APd4($*)8DlYA%0$32!JrkTimGq1$nGCD+ia~f!vk6?1JIJGIvnlnZ z7nf%bdv4wQuO9hEcp|I~L?foOIV6Zx(NPh(fE}N}QiZpEyeLmOV$_c90e z-+wVQY^7~x*w--L9p~RhT@J`t$m#9D7Eiv_auQz*(*g#8Mf>@gGLi6BfF{bzuY6wm zzBz7Rom~@IR}S@WTr%c6>Fd&6p3@G;ZPvLl@oZ3s8Fo4}X~SgS-MW!}V83!EX|?`D zcHByC#sFSZ1j+*zOVm(bUJLYzt8*&?WoyIPm_B^)p;Ya#VegZMu%^CtB+iDoQ?|yJ zuQ{ZDg!duC3WmO|Pq6+ehwOc>671nNx~vIpe%$^Q1%j*!nu$ zUp21pJZM(`4lzBQO*D+Xz7=&SHu$S-31NI)+gTvMv>r)Lq)yYh+!}>F=LN~M*~HRo2q0AzEVy5$lUYu8KpvL?&?W$@k2Lm%4U}hB-n?|i*6VlMU9CEwz{18 zJv5J~pP!kMODlQc*z=f%(N6DhM(9bA&kAloWsFh;3l@P|L*P6}Qe{kBZaTpBK~I=$ zX5`QrYX10}*fmjVJLnI=lUB1RMTmZ+pPOm<1^4Ljz89!IIQhkf4ZnC*`h}O=c&jmH z=~|SH^sY}PRvoe`9vHfD!W4~0jGkie`QPxI_`(Y{3$$94=9qI3^a+bni~cnf7{1!t z#|W)IG1kzfc)Yr6*Xvha`TDM1J9kcMV$0*kfPwsEfzqPYnw1MO^FrGby+RTr1Tb$k z&RJcYmej3wg&wj|?qIezu_HK7Ypo282j}frDm^t#g9MAS)Z%)GVcA_a%oI2L^paL9X2ddABP!hhEMp~4f zN)H?8r`XDLeQg-aK~HZHn)KL$6d!@a$X4r0a?HMIdJtFk#D~Vvyf8WbO1WnsR=JL>k-k4pUYsL6M*8WK z$#kv9{P}p=(`AWT^pGraM=YjzJgl#44QBP8i@Ktvqc^M!rzgMnUr#P6_y5Cv*!I)K zBepM&FNM}!ga{9vW214% z6tViuVVyxSrQ(bRk5+}#2qNvbrRTZ?;*lOzqG&StbL$RqHjl2@)Ve}XWmDQe-q+10 zBLlgx*6Yy-`Eb~#u7{*YGrFSgQ#Ipr^kI^Ms$@N20v?qR+ zHD=U@P+|5XE^IO%$}z&Cf3X24!wPIisMOw%v^qvtwY{=!;s@?ZyLyU~OY!n21C$mq5eT)QQ7PE=xJL zHk<67ScTyMmc#$8Q;TMc1rZk=0pD|82Hlmd(nphRx?Rc(c*fgJifJQ$0aW(3{v1 zxGJr(ORR}v%@$OcZBBFDIgwx zaL3PfJPDVVFA}j==aq@Dp7GX;5aR{@_gA2R$`5I6iXpGI{+OBr^@<9DJG-=iS?3yX zx%=ISneMRli6VqiS#aWRV>hxcS+|dBEzr1Cj&NX30Cja%HwHYj6B5WVfC=)Jth{a* zutneB%+jOSyZ>Dsc*PD$kMS{A*54g;8U_^TMN*JJRIRgE^6^*ZPFOT$H~ec4_v5#n za}K{UW>zx_&L-*}=UfmYWu%qk`*3lfyQ1qFjX7z0i40T2Y?<|W1h)^w(q?=$smyrC@i8cY@qBj}8!FnLH)53B=BUKSlio3x8D*w9;76j~pV zGsT)+l-_A{@sEs?H$;X zDxSTdXUVC>XbqY|C6B*ol3v+&|NR(rpk!Wtd0r^zGWdcaOLUX8Z1!a%bOD%{yy-%6 zMudKjsdQ!9)o_lL^6T=U(yCDR;k}LP`+Dtlo4sbs^j+`i4|@BXHAj3d`CJm>q&Bvqaix0bT5QI-;P-D@9;1qvVJ438s1gr4b31Ew8)sJ^*VG5 z&Cu04#9kWE$T1BVNa%n@Kmk@So#smJH_pzIKyr?BOd@;ikqh}ZAm)h9p+9IKu8&dK zpsUUKfQh0<;IL>&87=hrq+7&trNnGnH995rke9+keE)zFx~swZ+H*URx~ z4k?R#5mhIb;`tQ6)oU*=2?XMrCNYTt!I$B~KIig(I9|t0XL@~8!1z+kyQn6Ykk3F- z1CrSEV&L`iCI+9#K+_ix7ywOqe7jw4l*4{r)~`pNPXSO`HAj9Amm4I%Lw^&iSOE^| zg!JMBtcT(RM*Y@>=CHZJh56K_Q=_AI9Eu5xX0J={@wjwuU&LXsXqByRO)$SDJH)E< z>Qx3G#u8xkmf!G5H2X4AR+~dfCsw=*;ypN46|zMr z+rT~DQb7VPRP5J$+1Kxt?oago*%jeyh0{l>AKZ`KwhD70GT=AUxyv&OAG2sm0foH- zcY}-Ww=)0!Pyyn{Av`!NX8t67ICv**sJ&B~wR;eq#+c?HLti1#<6$9B->~7XjT`Th z|2!;`X7;TVUZ{U#-9Q z-g|OPRs-HwW}S%1QXSpEK6s}h=$@dJ(J=Er8wJ`o_Jw!rr6*0^f>=v4oV88Qn{z02C<;(Z*FGKQ0hIsZU1JA9oTHlD=}ZeoAmTvr_dU;P{r@&0@kX8TC2+p7_kkp}$(RzDC$cU-I0Yh7S#OYiUAMh zc&eHxYeRq}ZNp07`OhHl{s?9ND$#8l-qv@;HJA6f=j@#h*9yH3rtul+zqs{b`|Q0d zTmQG^GMV(fk3S}gesZ2dW%Ubvyq`A3ZEJj`U%I;3|6kaeXcnK|VWVO~wjI+VWVFiS zBh1)W=>29ff8jFdE~rt5r7FD?d2b(knb)}A7*Z>5gRZ4~;`Vbd{*5D3f}zV?v~NQC z`{-Ri{2|Im@LexTy0I%TN1I)tV!CAkkT8+Ou+EbHho~9hL1`>pB2Pcqzg#Oi>>5ka zx~$(MaRW=qXR=|m)g97RaMCrKypp96TNDpD6-KQykzF_+J!CrBS2zf<+=GQ5V)I z$#L5?(!=KS$W?a&hape@kTux6HiM|qX(YoXgN%BfGQp}5qTq1>8~R~=&2)A}Ph)7|HAHr$epIcHDb1?ZKC;-1>ECQG2RAH=Fqe&&BXf+9`oIx!6b z-yp$}g{ww-(%!Pn4_d!(Z@drWi0d7Cz{q54DT4c;Zy*rFByr|r>G?_N&&2c;dG7^c zCx40*ZfKkR-gRxOzpl4!^>=M8oZ8=iS~1yk(#Y`6hIGNVzg<7Ej^A`YcBAiX0$Nw} z1TCl52Y2fr=GGVEjxQb^>b~)g>G_gn_T+w(4j+vEJA9A4!}*sUzB$*E-+0)vuxHVs z>$=046Sgeo{sNjj0?I!zYN*=%hCs$^O#1uHq~|N)fZiVr=soH{B!o6?Y4RQBH1fF^ zZe(M|CYQ`Nqk(2QZ5}XG$ESn&^C6mS&-1Q%LeY*BH|^pJ)H$3Sm0s`bdm~sfC=|>% z#iJBzcdYi;zrrWrnnzJrU5GO%$_fDopFwWstkLsFvC)}?=HN}5=Nj1T6ny0fJ$`52 zH72!2zk&k?=kRjt`KtyQ<+PGcLjlz^&a!xYy3|6q+s7A61F=E!D^k~rpr#8I>(PCZ zGcm;k1=(6i8<;*TW>{o}))Qp6-tBQ|g}NvS#4r7d;tq#`!{r8ti>hYKc)9<>Zo@!i zy018-tujzW%^fUbo_VhI`fMsO$b7&k5eoiEz9p8?)~934#f+=Z~8_6ifScEr5p24r_TaqqY?=dqjlz-s!Tn z?Ci61!6P&wu8Owj7abH$(Hnpj=$tm(9eR)cbBscE+(GZvqmTankB)qy;OGVwp<9@9 z8+k+0k6s0_F_ahMxMqd?CrsdV_1A^G4XsIq>aq1ZOFDm~i?4FgpjY=1IjUB}Oh?i^ z##m8I6v}q#7{(5@6YR#;AIM$=T6VC%6!2M8Tb|Bu*aW6N(QEmBcMuo~y3$&Oyb%r(j#E?P@xL6sLQDh-6Q?=>>Nq=q z&MhRWB}Y%|opD>WQRY0Rh+!chXbK*D?-A53)kcrguBz%hU{GoVtqF`>B~!!f9|KU* z7_5aC8j=BUIrLf;S-NbQJ?KnBrXp$JR2zq{K<6=zZvyM8ViL^g#*G{8A+MDg@>^5s z9*Z}=vRf&7{l==!roP#ojCZ-HHb6o6T3s9%o9%TpG3zg88LMF9KjGikJTvo{I5$kuz*rj=gr>P?%IU5DR0WXtmEK&tAG z4xEv`a<<$j`;n~C`4?mY3Nj)+2JDMO-v^o{1%gO5Ytsuglt2OZqjz(S$CM zS9Sx|A%V3)1|XF$mWI_bVj4kEig4*)Md@uRW_GfU$;(Y>c^wool9^ol;^mp z#f4cUT+(`cUB$8_!1pmKl{f1!**Tqb>E_MlzEUHPSil6Ru~F(PGj6Tj&MWnaw(YtQ zGpIaJO&LK)5aw*l@p#8qW53F;)xhN)s5f-1?Em3VM>`9-B2d~K z%N;csXl&@x@;s*$V~%8~)Dz_f6JK_e++4{OIqZhvAN}Z(OK!adft`}Mu~ay&}fg+E)pm^4IVc}*@Ong* zP)04fiQIk}^EY^={c1a4+sUY42Nf3|otY97>Jvg(Z{tB&ne zch5ew5zQ@bM#vg+;YNga`i7MmQCb4h7!7@?f&W6}yY)l)G2iU)nI9NCe0Gm%R28nx z&ok-PieY^;j}lU^r&54kCyMz8mwj%jDSR-bBFv^I+|QgpYJNk zjWko8l-9~#o;(1<_weET0_n}(Mqbg~KQ~ludKF{=WIhlg5u$S>!=|1tANg*nj&5Ka zW8MlfmyqN(6Ho3eu2;a!PxM=61zdXt_xlLekE-lyAnX_5oZv9D<-$S9>zo%#E+f?D=9r)D}(W6 zo=~4_)$C+-Qn-LyeB|u4PpNpTMUm!{iLkNM6^B+Hq&9J}>{!&>tmmwyW5y#RM`i3u zPGxtwb@Be?uBzIqzSdPTbJa*>L+ibBMnKD(uONOoJi?z)8zx8J?kQUwsD`}C@j8Dj z5I9>qcS{s1-VO7R@|oZrHZ6cyHfjMsz}i#MZWFXxqgkafnOml0IOS2VKx|8My&_h8m8_d62iRXcxcLJ|8*mvbpKO^Di0~FIkobJ2VHDjo zh=XOOqX;~+EkF;NgWLnev}Q}X*+e;?B`?yThP+0TC1PvslZ6y97;UO`8sokqkKVIX z)X8-7<$6uJ4UHAvK)~z{q|hd$CemfBv!zPpH}zz>T&>Pniuv<|1eBl!(M?mP0`K8D z%&5w8(rLHseHoqV7}jWd{MqcHh&)!pr6G>#br%Yk$GWuTS3dZHam=?-lft2%NS^v=8yWdjdUj;bC{8Ehj0B^>PK*O@QLyiC-AaB{aSf$Qb8Tf|JYS>b zuCiFm4DXTd?JjCyYX=C7%>*{ee|fuz{&VuU#CH#qmfqv@8k_@mR70vLg`k$u`Z2jk zY&cw1>4W2O*62L<4J?r-G)&D}hjjAEo^6W1~nD*o$V?UU2P<|m|$!=YFxT+I>rQIlivO0lg~aQHR;qB?Z2lF zRGD)-c^KOq@0oAufp$JOFJY2J_0MkIS0l$ky{XUF7@n64S`y-M*0uGi+KSrB2Kh!Z zOkdD=%Lt5rj*PPvagDTEie3Lt@zNK}E_Q>AsvR7Zqe?FW4D|AFYC0i1II256{<=^}Ug9FcOZD4iU zWV|l;Y(|(8{CfwMwHa+@ zE0nOczqu$f*mG7yI(~xrB~dD@qRXiF0M$qCrD9Z~%dMr3=(?Wdj<=PkB02!zG%o#c z1pj;?;`h@TH7lZQkkcC6sjLndV9=27MVR?lS{2L)BNPZIL5b6dQ@W6Xf;^S;ZbZjHb@i3sLPY@bWr)4z>1wn@H1ajuvsSy%1c< zcs4C7(I>gfRrCHK&?KOM=#yM1;8Pk5r_DZf^h;>ujP!0ge7X1W`Gn5ak+&Q32AG*F znfzUN)y8d=(C|qm>AApkm^o(lX{SAQ$|;YYZ~~)28QNQy^ofFoW#*uTmS{a2zKh3m z}JRxGce59*6tz(?mJ zp7g^PHNg2g8EbPO!r6b>@^+z~9Op?6=HaB^$Pb9o%BeFfEiZ!EL~{UTlm@45@80(9 z2cJyj2&`hf_1`FyWF3*Tw6yJpnZA1d}O5U#!nV6&2JJ=$!E_#I3Fb2Tj( zm6PCNT(>B8b8(19b1AE|ry&&Uecl=uvUzK{Xf1Co)T*M-S|99}9*SXlWMQ^}1Vl-) znj!(GBFM&yeTDFEbBsF@H^Yn%rPoBW{gE<7O5 zl-Ps_=}T=Zrk1@CUC}mad;js3?ODg&$AFW{Te1`0qjZ3dO4uzL2*7OhQ69UzMZpSb zqrE61&W!9v$e(9^*81r%+7XoKfOUezE>&|;EM`vui*slX2m0>7WB{LN_B%xZT!;EZB5X<>q%+5g|l zFU1+?lO2?7(62sSzQsjm7(yBH<1~ttFuiUWVo^9Lip<|97 zeU$ut{LVY~)}yIoPdlr=;nC^O?)P{Y9l9V6mx^6u-!tE*s@9EhQp;S2`Bf|(CCD`m2M!Qa{P`wcTiU+F1?yK83+;09AY zeDE#71jY_Rf-!?McQSL({yV@r4(&{!=s`8|pdV`M#^-b?nEz`11w$I3UiL1`^-3TO zzb2}sD(PA9sZGObPWh;($X7-R&zmCiVb)=RdTQ|uCb1-R;`({fB}Z~Bd135=@pMdoNbJ{!&X7)uF;DOB>U5kB!HWy1Q7SQU0k(k+D5S@AcQ0ejR>RD4JZ^>pI4g?&1mF9f$rU+JN5WvpK| z0FEZsl}DU(7}nJbhRrFn&H!?;8@Np;7VLPqe~KaGhC^E3RAAh2+ksLyfIb2Wa{FlG zB?UZS+34cRjV07YP>5RYUZbHET}YTWET$U%18EKZHa~xv6E}vU<2J7OC zoY|zqh?OA)rWQ=QU&}K}Qo*|9EWE1kF;h4ifvFj@%)vwrwZ*Kzo(jUK(c^p`vVQci z$hEAo4r+)KEcfI7tB)}e>`rh}=uXFmMihtGPv%I_A#D(jqk#-kXBy?uuu$$?q6pip z)|Y_{!SKIC&+YSYC=AnzlG9M!0XDIvbv*gQ2922TYuze~-k?z_4V+%tdU6z-{yB27 z0S0|p9bIRHSyr;-EWir(yNeQsGM+>Gy^7vtFu3%U=kB;e`otdh@kn`w5Rw2nxG$4bBo~5dtVpA|-vIa=UF&eLT>-ELPeY z6Wq+Q@drI~1LUajC-uIkT&4m>_N7AgNYR;4?$-O0RQjCxog5;+kJLy> z97+|P7b0jQaTXEIPo|HK&-ITmsjO#lg#^jsvc5-p(Ed%k%VqNdp|+Y#d`Gnxnrat-JdWaqehO0)h;>6MuE>wLiYF z+!$~!h|f-*{ry{R`LXnp+T7aJp3)ZVP=ml*0BQG|8 zi2l{kf#PxP?MZ&JKVXZLDT1AjXB4mhGontnh=`{gkiJX8r`;>X$cNGj@-1oOSEZK+ z&l_avNC;XRRWcshyhzCQ>#nP1vrl(-lT%R_e(cjvuVH65TE+gW;Jw~x{VdhT6r2rF zY`CORW`V0IVz3{YrXF`w-9ziq5AM9+Lip_w^lGdE*EI>eya|M3Lr0wyC=n&VA*w;v zBde_Vm@=#?ZSCsl8shq9G$NpP1bPTXl>hUk@{~yhWJ$)-$V}mzyhSz>Mgy6yfRhVY zpwjJT?dS#KZD6}H($%NfCY(=WGS12CE0}##HhCuN28*C6D|y~5Ju|d-P$sgaWF#07 zzsr%7>5t_q zRK~+|Jl??Ueh(8!WjLQHla4SB$?bIZH$F_4fY;A;#M0rUXz2Dq1Jq=2sIRzP z>m>aOs}6J3_P$m=M$x&lqF(V=tH{b^Uj zi>Wyo&dv8qk-qJ3zrDSWY&ogCeLJ~A@+St#-#V*(0b@eC=mQBf=+}dnd=|>$wo=<} zH;{WD0{(?lMx?g26;PBN3DeHLZ4W(=y%3E7Z1N$a4j-SCX+VH|4g3j{CuCyOfjn_0 z9_u)`{Y!bE>JgQDT-!SLY*{Pt29MK9MC3dM;#5n|&L)pZe;fYQ@Z!bNE3t}e!!GEf z1i0Q!o7N}1_FS&l+C^+v8^g(zm~sa!(l1S6Yjp5(tSy+BU^b#=*oB}LLZ{AoN~77N z`nJIxy5<^-#bvju6f7CW{#BTbuSlTOOMh}carX%g^6I+SXrf#N7F(a^3g45 zR;Kyq0P1Qq_T`}-Sf8~KtOHm&xxm_4oVG!S<)c>q3tv+f<)X(yUn|>aW$K?wk#tYP ziRNpNP$n72hTPR*SQQ6GTu(^ClG zeB26?-(_tmoyoqg?qD%$V@@IO+>AL-VGX(w7&6MLTR*w9ABAoui7`stfCQr)gPoOX zV->C&!zwUlx+Z;Enk*Z=CX?4#o-A=q%~aXwGvar7wyq#OBS4ygj|F#RC;Kw?x+#?I zOZN94?{+X2y$OPMqR$@gXS$#mZOsYNd}cx@anQno^4|kiOgzk4TYrW}@qT_GBKle2 zBW|J9?wLp!K}35E5i!sgG`T>I4^U&j`XaD189l?F)Jn)SZ5j~ozacX>q3wZTLS~2q zLBPQTreuSRqrEA!M-e+LRRrQo_w>yz?pYa+&Yv81N#7wSzWS>4{4=gMF4LQIWg{QzfKZ~` z+EFz(is$X@8L?H=5HS~&rJ-_vd8}j;jNL@=22GepAoSR5y%;>qud$Dn#!3U_p^`FH zATN%M(Y>if@5?3N>zeVZ2Q}ZOT>m+0)@8H4g*{5M0&Ju`bp}Mk zvF=`#(PUKSOzy5Oozo?1jL~4);IP~EY7EALKoYzkp8za28wgr_Id@FWdAmdI ze1K1z%)NruAvmmJ$nTxzJmr8MLtDHWzrWYz5wqu~gp|wIXX{aLzTS|l>gO;Qw;Qj0 zfnvX)4}w&v_s)@S-mu|@8y1hA7%T9lzNY)lpSf$*f~{)F)rW%xXIT_0j_2ZIjMG-O z(hBParo`t^6XRPyC414dk6LU)kkoV^Pz~o@*ate<6VM5+8&L&s*IqG9LcXIg`3PP* z?h~rHWJV2_MxxO+W%~e_h}-s0N3Px0K|8ytXQpQlKNi&i8J@&;l1X#0cJMX$PuK1*Wbea34m-s~Z5h5pu$g_IZ#4we&|e$*5}#zChNhE2bL z)^7zFlVGq6`q;u`EIL1A&5BRO(LU&O>!5{1Fvv;6Y#tpVwPvr;>vijSyRT2Iaxn+F zaI{n!l}>cT$fdOkh5^2tuqP}vTmRTZAbbd|DyAVgo3Zj4Yu1{&TP9@-ESHc2H@e zBjN;QOg=25KlI4qGa9+D`>8q9TcAD$Y9R$9{}16K3Xrn5CX@ea(^jpzWXV=@?-kpajxnZVdNB|P)r8P7frJ)bs3C-O2qBO>l28)TfK<}k z3p@PZon6W1<^3zIdYQTR+*7~v9cy~r7PR#9t5z*vzFbGxF+}D%BZ68vQm(QYn(40$ zvXlHNGc&WZ^EYHw30p4LYwb0svN^G9@S*_;(-eR+&7w`1;+wd`=Q5ZDg*1&o)Efd296kn#gFLpW*UbtCO_J#@;oj2Vy){09{l3(Q-23$ z+@{16xECtawDYp96M>3}b+VdmL8mVJ5noj*SB_PP9`im*I^L{1(E0#F%{Isx^e>?q z?R}{$My!1kjK2xu>2W55f>Jj!7_uDG{H4=x)5%t?BN8v%h367$xFj0C^{sFH#0vOd zx60~H8KXf#777(@b~Bh=!O9Q=dmAQ==!j8m$O|D)uK^<*eBO-75VyR2%rWF(fN@3Q zMvpZfv|k$x0wE83V{;bT<(&d(ypUn%_b$!lHs$l;iavgDeB3*9upZ&N-#O@;nx2VN z)lMg`L~{$W#A~a8HJdk(P(HsQpC>b(AtAN3wBtO#&ZuTd16<3x^5CG&6i;*;Q~FqM z#j6T(maHkyW$b*?)N4J)o{OcSQ!4w}KX!s4~?u+)hmV}Fp&ty&;LB?$hTVmTA!To*6{BWi0%uY{@ z`{p|iu!}oX0TlzJQ8&-Wkgm`mQLUjxZ4FWuajQLMX`O+Zm){OvS=XDr>*gkW1!w=* zRE*e%O?mM*mnlwH?$CAHy%~=;6c1$dXp_{LtNt$vR3-7TO zns6P9w3Ss=(#l2)vEDm{x=rgcXssOYFnA)0qCBnwVw(5)voabNWP|Gq!;qTWOyVI@07CJ;Iib zw?lIdQceZ$BmbYjKzJM7W&Ac6Hy7%Pi;6)~5sL+nNJr<=gcj?y`^L8GQi++QHB%lo zjh4)^a80|WLIJ^$DVqMVKVeI7;a;Na#an6TK%rQUZ+>JSUi zgO27-iY22-6{?=wKWXbDKP0Z!)!;FMuZQxvjJ!ZS`_|ROPYy>@!!F-=Cgto7`HV(h zBiAWErE%p2?On(ywt=&CFGF6kA27akQ1p>UAQX2n+% z$!IF0p=-}}RpE~qnGc|8EfSM6yf3=I3M;y`fS;oub!r5X{*=15=|~fpRJbIp1|Gvo zx%jV1NSpW<^n?J;DN|c`w|UqX)8=lc2E3P{$xHxDOkv9g+%QyGG+U-><*1-GGqb%kgAZJQDW@pqJ%Et%G(w!2=vN2Eze;xa1l26#c@;Rij!@ zFk0OHii5i@tRDq>`g`c-cSo3pV40RVh~}_?Dsge4|rUY-hg+Mxyq=BRmQtx z^Gk=Fp5CaS+)_Gq>q7>2!et*^w!Aw&*+^ax>D{t&%(48wwf?DFrt3HC3MSUBo(r%1 z%qG|JyQad^(@PmmIa(L;flAyvy<$ap_}=BgEqASmu3Eo7A^xUm>CsnoDN!>8Nn_I0+V>swY1j!lR^+PZRZe1e%0pA1h!r7A$3=S(^V`+^)};gY z+%dA$GzgPch*Zi1faWsEO%x`-fhRDE(T{$DWa10Bt1g~iB2*o{%qS+ee4F`__#!zW zIKpfm7--!!f^*Mc9iC&Cp$A5b>~$AS-qCx)FM`zu;sXx{Z|U)GpB;P;A_Qb&Kl%Q5 zh`Mzb(LVd@-0lO`|NgN|$;wxwbjO14^K~(T$t{9DxQXm-ir;870GMiQ`1!$xrQ4_V zYjrN8qnB$4<4eYzBWF_mLy)hzk*$Eo7sJ-2DzDOw0Y}pRLahI4X zfAkP|nJ71%Oy$DLx}{Oypx&1WulIG?!#Bfqi?*=JUTe| zka$w>y+c&zdO!LidJDdTzZAeJrYCsOdQtxofRm$ku>IY3f&__He3ufXmS^+CZ%PP)})PBDf{f z8{56_jFP>)Gvvicqd)dDH#HiqJ^eo|G&aV-%%3%)=t(XcJGO|^Zm`M!xOPzi;tm0-~+U~`VGP7`VQAf^>DVnAuy=R_D_UBp}4lXHFfo6 zmeVk&YGuWROCepWKl(B|#k_<*!ZwEsmDYsR!z+PFsbu2`<(8MDu-c^aeAy|L9Q?xJ za?&ugX4j6jzEqS+wO(b;T_*ZuI^IeiafTg$Rx(znaFY-+b{D*Qsz(?mQzoDI?tpmG znD}+8QxCp9p*NmaX*9TwRk)66=4(J2b*=-&PufYmFsOk7V(`+w8ajhGPq~d_$fiuo z!M>n#L_MON&slkak)xE3sU}}zE}IhN3Y8|NCC@p%NVf(eXWRXpBjGo*T0@~Xe^|`U@eNIQ7Ma6 z<|gs%9`PlQPbLE`5GaFnoO8%c{{0ik{`QZa0teR*Ao&s4FkB5zJCO>+67L005}iRR zEeiGcsFsyH=jA}?HI|C0dt`vw{!al>CHme_Q<3*S~&^v)ep0XpS{f z%sJv2p?`WX6V&920_-l3_uqZ@U7CN1LVjm3vu&d^E0rR;7xR$#*Pv`+adNN(F?tel zWeGWeg&0gG`43bt(xgiVlPGa~eEbt?3F!6mIMUSjltb*ycSID4Y+M{i;@4TH%;Ecp?@g&UAcI&|m< z;@fY$F=7bnf2+d!;4=H9F*!z5V<4?Yr67<8dc!jqQ*ZC3>h2Vvl|XOlC~NF|3Cd zP8q>EnL25@fJ8$|YYq@$Dl<}ble*E;z)pJlB%!AcxAZe~QKg))R6y!vWaJXMq_e0; z`}H(?C^_JmUoMq7*(FL=l}~bsbjB7>k)HPqc0H!(8g-mb$uc8%-uZWAa4mx06xfi! z_p`q;@sw-Jh?ycFRU!=l7JeRfl&fV25?SSHYc{6H3{3d{@D8Tt(W%qllcoaRd+*O$ zKkP1JX6^UBM?Pc%`j{VGNbnqRFRCvWJiz@>1%O(s#SBLATW2;BH+)?>od9Bf^bd7@ z#)zM3onBW8frz!wjOct>%^J>ns#|ON2ROi+PthUkI;9iNA;T&Sj7Pf^FiM8KjZEnBO9tZogT;cGB z%*=7(-Oatn@5olYjkOnUCug?)RU41n)M|8fxsW|4PmAZFd?Lq1s!6Z-MSsz%GRjNh z-(SXFC{5&4_|7)rBWZ^_ilM!~64JXp_=&;5 z$p6^m0JIEslLE{SlDR#Zv0IM`&R?6)tSCncd#mY&JMZc7r01Rx1r){*)dK=g)X|W} z>p?T>l8dA{3f&wSBS6d)gX75|=$fP|h;@Nh9OnZs5k+Y5yN0bk=p{L ztR!OeOh}Xj3+uIrJCl-@Sa5btsI*2H*x8+(a|ykUg32KXTD{Y1WC0da2t$wq_(V>R zS(p>=>*izj#A)EW9_-6Hz@g*pAKH9&Xe@A&qv_BEZ1w~hK`Ou*=7*pjQ@qFU&eS)T z5v!zQNwD=VpHOhx+;Xy~-&%CleFKV!5E_r81t}KNn!4jr8h@+QYPd?-w9}LD*0^p% z&l0XG=Y){M=+!i0cT|qEt+MBY%;td6BVMSrXae0@C3?3pLW=POFULwpMKInNVg|gD zYv%QCQ*hQv{H%JMEBTLpY zRsW6n3d4yvV3?j2nY+h)Wep=Mi~nLS5eLY>H<`=exU!%vgvJa_*oCd|TME!3v{PgO zl;1fyu%Q6Q(kMZy#~!5?VMmqu2>K+Y&ImvQ+8{$9tp8Jwuv=dyJ90|=_YyKKz7L0Ksh0#0c#NGZddbh} z(-cmr04kiMU?)ZvHr*_Kh4hQRBFop44ZE!?#CzA1b5_?@wD+i6s-<(tNspqRr^|xu zGom0G617zrHJ(yuN~nmQ9r~GM16Vp7G6y?I0iTNp6u;9$K?R>2|6V-$XL14!2M9U& zqg3YS0AR|ARi?3+)E=)xhG|S7-BzpRp5O+z^3l4I;Iv4nVrQNz9+77t@!^e@R8yD4ja^P-DzMyB8c7Lk(;bU4%& zJaw4%kD2?UtWcX@rc+(PY068p!YDG2Ev5oyzslmUsw}$oOO}t{Drw%kM8o5w$8pob z1*7->bMF58b&o%OMk)mRKZ?2l10JmlS{E?qi*_cmny)$>RmZB(asZ~gJH;bSdJh4V-6`{(le?$d#&<+j7(l_oFv_muDg$r2S&YS9<8 z6kMiBaf1ByaJ}AAdonD0ig~m6mC*U(XP77M{uioOkYy9_S8E{4ec*y$3wikuqzPPL z+SWy799{O((jyj;M1&@65Q-cjy+2CE7G^`xRQ3yJ02nMIud$Tl{mQGZBuT%~^6vM($MBSiB4z|64P~R+ z=jNaE^a5PWpuP>~Qp;J?$BVxq_V-9&{&TIbWT#&}ar5I-9xh?A#m%moE}c#5#;^b6 zHRQvSaNi@?tK)&uDF89Nse>{=1`@d)-auI%p^GsQvVC4VZ)uQ*qYRS#Jh?DYymT&R~cg9rOf+vY_N?(6pdc+8?zm zP95+fs!~UN-$wA8&^=V`Ah43O&VoQKILg%c;SbW%2Xn8=q-9yP2IVI*BGVY{rX3!4 z?T0maFyHV;$7hsx+$}YV6dC25d=`mSpaAL;{N?u6#3=KZaq(}m-x7`8Y7DroBoK)j zImLbB503qjkxx%gGt*N75-BFTL*+Dte72Zt_uY5rhLcWpSv6fKyG%JNKwd5oq99(t zd!@taP+Lkym&;6fi#S(V{Oz?bzHz6Kix|GZg#&^Dx{R#UBeHSpFQbULXaMVXuPx`d8K!mQ1gutivlF&t`a@9F)G@1=i;%mZI%EP`Bq!?$P ztL(@D^=- z+=0N!@7#ay+pRB{LteW~Nd_@$*DM&;r0MJJ^CI2J$Ir+Df*ALe$CwNBxxO_<9)UF= znm;Th7mG+6+Ra*r)*y4D?U5~vXGaj&p_^?#Ik8Pa!c_bEt_Pj?pU9Z_ybIG{|GTF` z-W4Nc)EMyC(9g)!WJGV`WMs0ng}GBqF@{+oY2~|xS@HFW;&@TQp~--eyb1k_CR*`F zq=Y;KYP2-ng8ZRWm{a16OTLbT#K6G3c3BkxAoXwHrj?3pXW)GA|Dg<&QdmHgxPAIp z$ouc99~CW2wAWjP`npS_R@-bP=0~PodF7`Rgy9rhWTMn6Bw7}W{#yUPB`qZRSO8t$hq; zuW6%n|3~2WtYH=SC<=Q)(L0KBi=3>!Lf_eXR=1jZQ9^N!3z1xWpk zD1~>1cuQRD9aS4>888t?HlpPe4yT3DkM)e~#SsTelw5dNJPAZSprU$R-Xn9y%fXyJ znoNn=jKZHOd-JA5rkBi9Zn%Xf6B5rt_pDPx*4M>xi(pV7ACvtD?l{8mGb->kszK5) zV;G{7pUwq?oTbE9T3azuOvrY}4L&bFg%RP7Zhr#AC?00(#>(0XB~b=P$S2TxrNc** zJ8lqF|1N^bKj;tZ)cBPYR8RL>k{Z%iGIxmisV4~GDnhtAk!3s8Bpn!J{3J6=AUd6D7lNY$N6hWsgsI+?7=)qB~zFw`xdMvzJ57hEOa_+47eUcXM{o-}kNjTc8 zuYN)_vcNUyeF`45^%}LTGMH(eAffHgCTaOGLTPrpE*LQc!$CuoXpKgN#;B_9cwuFz zw10dfaeVgMqjh3l)!I{ESK$&Sa2i$6O+JiabUd;UgRs>^4;%oRw>MzES%xtU0yJvN zSqG^8(4fcgTC5k5ql_*1~(q@KQOGk`;7q zjxswm8AMJ1ztS>tVEiwC35qX`k*|!MfyWom!b5yS>r}9+m|-+GbQ+C@&Qv?%%+s}+ z_}c5Q-?6*(p1(jI6?c&B$Cq~zE#6@4&h0El*O(k+KwMT5{~Mi|9>zPu!Ri;xL*hP9 z%ubWratS-I2Am2ZU={~qLHA46Q%bF1Cy{ZaS%TQn#**UYq&x$V9#jaVLm?SYss(Lu zDWu$^RA=f4Njvk|PQyu=C0Gk;j2EM54CYqbE$*fVtUE53PN$Xs_{V@}$;i$(tA;4J zZbGe>?!EFL?by2V;Qe>Y$iagTh$ouAa1dW&k{-WMb2=2>fSc9nUm5<<7<$8KPbRT2 zsb83&Mv>1SrA?^}W3bxQuaZIyq($}~YpwXXK=-&O;2Rk)P8KYt1ZPf|%!SFKV2l`x z!}e-z#4=ShMGPVuqT$?u`3E{aH2%gLU;eitXyp6`tf8tahZ@{g@Fllp!wAWk22=T| zSV<_2g}@1Z8J)z`MjGNwEpQ{zEO+OKA@*EYPpL@@>nSyM(LtZk(2|yF(*Oev+&Nwg zItl&?*+&jf0YspuPerXTDE?(cq0#D;O|@R9B_}f)gDPk|*%ryl?1FpUlJ21y-fkeL ze}TrM%r`Gn8had=%*D2TWHreZV~he*Y9n6#M0)g8bnMBQ)5$$#5Mvn)^QHM$y*qqM zd5fF3>0F$X7evueu$!!5$E)QH;ZWXK*M{Bh$!xXU4p1xA2RM7k9MzJy#3z(m84sYZ z_#M`W-B9V6sQ5B-i#SK#8$*^7uVWHk;cDn>1J<&wr?&&s(gln#j}0v1hj`XFnaHO2x1hl`LFWZH0w7j_5OP;5<-)+zGLN_LjLmYHFZ06|t9 z*7|xtR^;R#x)=?*HIBH}XpfSY{qTy)bx zaTR%xKA)674O&8r;)x}uBzGfoOS#|bM{m{)Ccs>))Q$&+ zcK`;XI5z1X5F(L*?h&a4f_d~I!lJiTW`Hv9wywOW$^kX_}O z@EB?fNEVGgc&_b}*V@kh9c0$hYk9a)j@5dTc4AKF3(mmMdHn`2hH;whNg?PTx0=i{ zjb7_BdaJI8ic|SAT?Y|^ENsDh4z&KjY~cAK;n?EkVV3&={s(ZUe$MC}a)2>fFkDyb26+c(U~-hvS8 z-{c+DM-nMpC_Cf1wiFnMR2`La-puWNV{3O|L!dV?+`aEo@i$}Sp7C9HJVM`yuPO~H zr4kho&aSdqj6^k(89qhobvudt+>wsDl{Mc);<9rbQ9qhqZ3C6sy!*rp;kU{y!J^3` zzv^OPPiwz7K`s$5BSV{t>p#E~!%fg~$C#{E1z9fM81B|%WE8=M+#wp6%!nB*mwC$w zyxFqU7i^MpjSC#N4Xh#cSK56hM* z5$AW^)Ab;gEt=nMvyOBQX50P8nWV>7nTI8!nt_!c;rn5aPI|WORGYR$N)g7WJ1DK# zLXNGklPm4`eMphh`s7goUq|HxSP2+N*d^m2ptNapsONK` z%U}|iQ@CU*ss}9BCaah$0Z-9bG-W)t5|2rJtPXRg66X(x`#-e%mO3rEa5S)=Smi2N zK_Bjpn-faA;M6pbCO1Y64Y2pw)yRhX1!a{{$bK01f`^5XSuv>y^$%YESs>E8#6K0y zzSS|4A(=^tU$u6JJxUcLgJx6^R^>6APh;?Zl9DN;H-wDjd=Pco8u+y$t=%ziB7TKu z0okVcS?C3tpC#`t7w;yUU`U@6Un1LJrzgl$!^Ac?DE<~zBep9Ae}6Ue6Zoz!$O^R# zk|#n@ibwyQ1+*;-+-WhNHrLIm-lF*alz1&U89=Bf@W)SXW%KS@DWz)|GUa}9bHiR~ z4*Igb!Fu6t@d~oPpKPkv#k>30){T{+VIkug9d1w?#Q>{x1!|&3$#3q8Q2!6-6j`{A zh)ShJ8}3JXp(p_I?`iRjbBONyo{?B_YFA*uGPSXjT!Vn7%|NC;irDtG)4>qaw94aXN(Mv zF!`aEa>H*847}AZK1}9|=~EuA4%o^=Q{Ba7r8g%%>0{DfL%PuCb-nDC)}jc$AC4AM*c#L&bxeUW#}aA!g2a?uy4w_|8O3?oOo0||?7lVe+-pYz<|nBo5*-h?#5 zGc$0~2E|YRo;*`KvEc!UwK-|_G)}C!K%Svfg2kGiTfh{5|s=K^~sDcpsihuxO&H!En92&W64vNC$l#N&^jN^)mB*?M-_{r4X@_m*2FK9M`_xZvCe_dbUQd9P~ktJd7EdZX$n z)okAT;O2!&_?PnHAL)lDyr` zmYI(r@jdj!EWj@ofpIiQ4HPXgc^l#mS|a2~SwP$^Y*}sM`m?qHUm)3Q## zS9z~^t9y3mv(eOb%{$hgSbysqx#qFV*TkLa^XrWzlnidUnq~P&*6k|iQwB0N)XFd4 zI%R(OiLo^C7R6s}eWxmJ&R*gb|BUN%pg%i{oO=~>&ASk@KoA#Sp=+V3@mgo41JXGo z_yS$`_JRW{0ul_ibN%qjj@$u0VYA4m)0qiYt78c$g);$Osg%pklvy3Ze6uvP)Mn+_ zOE0H6IFt*1ZxFxc+pzU;6fV`J1J^HGI{5sdSj`r*GCA||O{?tXjWJZ@QK+5=*GM?* zpN@yu%nce=-8Z%LqI|A+=E%q=r<*5ODps_*7z19XLL~8trTV8o-2jOOiABWMW*jS@`0yEpDasSBQBgsM;ELb#_WI#aLX*r<#0aLa(NbF-@2k~J? z_9zMq2YTT%^ek9V(6t4Mseb($8&1An11^wN7|Ci| zF|@rKUtP!dX>D>TFFDnEa$2I^;>S0=ta(;RWcOUVM&F2%oJwBFg>H`;*B2 zZt*>C#%4~XGZw~(iX%G2--?)j=zS-=KPJ9wnzOl=hRI2mvK76jt=obr=71ePROZDS zf6(lVCVn92bKOQ70lR? ze}Suk(ni-V#7e^aKhmcFjjkw~c4&E($t8F#&Vti@1sWoOa-~%RL=ZlOdmgFWF zt+L>ZMbRIQQ7HPp-jYA<){{eMs?<}CPObKCLpNvJZkP`U)sQ!6a2e_rzgA<_8p4)> z*5~tSM;W!MqJZC~GKXaH{4+lyvfzsr(NC(UMF$=TwjfGO>&+wGiD z9TlQYuCB1UgBD9BR{(ph!BRdLpYWLg;F4^K6}84e)Pp>dm1AiNo(e)g&C?uRJ0%is zazT605!e_35j`(eNi9pVi3*O)wzfMr(cfe4 zxZ@66Q||D1wF1lr#)Yt^GWm&TaUpLkeUr3mXbYg?LG`*_gXY$mTnfn1h#?Z$vwzl4UG8e ziB(IR=D(nqn~s_%g7`14v1FE6Bfiyp+;O|ozR2e7n?hu7fXiBuN%pt4MF&4UEnY>A z>z-RW;?DS1ZrYltH_f!6(cG*@wroSr9M{ex-!K9H#U;&Pj>#E zyK9ICjDm>2CPhcn2Uaq{q1Y;3NAC2LT{k<7_Zugfon-!jH9KFPOUyiSV&S;$Yl3!6 zF19BucCmSH@PaqYAwLgUS;DGWMr$;y-lzk4lVL2pUB0I#^c(NAn*|zR$+}#q8;u}- z_epuEt#qHPpoFHt!Xsy_y(0ieP{{_4k#c#parTlGr^=KnVkwCtsnjAm-(as;s#4)A zu_LYR6auLM^WLD|X2e0H9mHf(YGx(t6)LS<{F0pacO!$UQpp8Z>sfLlnj{%hDjnA|=W=ULK0PzFV|G04b2rB4^Ap!zczg(q z5|(ar>ue#QGP+Ex%D8;jaq;_l`qzz_$rDOONF< z!^7luVJW!f7;+w#2xnXm4z*>dJ=rAefP@@qTjL|D2BWA0oz4U*B*-dL-L$xFaCaH~ z->1ag6QGi%uy8&DSFT?%?x56W8LL=)UE0qs)X7$|7VIaTUA#rwPpXnS z+X>NIyei-{5hP&OsIx0Y(;c^1DxpzGq2vNf?k`VM4C5c?u(BEv|s6%K027 z>@3YbPcX{OsQ7Oc56j7~w{M>SAJq7oM!3FyvKerdhi0<5?A%b%`qfvUhX3^EAHBuM z|9P0)4;VA^S!Sny``$B4#nlsaSIF5vy|q4f<7rD2F3gmxJC|`G!zY_hbZ15i-R1#H zvTr1n8Y?AC4HGJJ>3*flX(i3&O+(mp!SW`t3W5@H-34D`TEeGPyN0AmPi^=oO`UoP zHTzTz9XZEfu4xZ2fYcX}k6v7*g&ZRd5g`8bP++Zqvi}h$ph+=gaH#`9kKDkD|AS#; zlp*+Zd21trfSw_D*rr0i5gBDv;4KGT#NYZYQNHSoy*Q->QH{SC_iEw8m}M%?q$6jG z*SY(QN(nOoERjCRk(pYW@3He~K2!Vmy62yNVy-88%)SEyb2pDz(F2{dwtgH=tN@$o z5<*(9l4q?^W7V@{b{+$9R0?9x#(h+NsUD{MGDhfO1V#U;hb5>Hfe_I3=xn*9yr8oH zccYjN+7c*xeD$^ORaXMw?5Vpv!e~@~UFZa$pI4&oMb;(z=zQ3`5Uf5$ zzyJw?z)_0DC`y5zElQh5FRK`8$3Fk5vE+!@q*|u5byABx?i06!&(ZPUcJJ5~tqteX zqxXgcOuO<*@%jtUGn7w{I0AMZJOvz2g6zcx?9J+ry54;AXOZyy{FG<(=GmT+Tl-7> z{2ckOVA&B}*5jF2Hu>xa)<(b(4EdOIHgi#OqgfntOj2xXqE6X``bko@?}$XVw|Oy^Xh-917rU({+TJl6>XEtp zezgkt3T3`h=f(iz>S( zYx4P`I;cuaojT{3Sg{V;4s7dqZFTh@=qDu}{z`)vU!tGf)F%(64MD$KnKKVgE%ouJ zWw_M-EFv&9{E!vEbGpz?MW+x_4noM%QH~^pDIhho+EM#mI0=aTaUvFUI6VT0{c!{! zQV_buL@T6c3o*L7!2%cL^-$zkiV@`ow7abrUmO!(CE1r>24DlaVHLQhOyVD3d4*)| zzYLG>T#5(0&PV%qtXkHc_tpm{;-NDyJ~M>b!1juxwfv+L%Qcc|^igb8)Y#V$zgO!c zdqzqVU%``}Z8*iK%~9Lr22K^`ifVM4b)v_ZiafIC)bGSAz5#dhXj6c`X6X=NJ_D;% zWTY<7j-9~q?`QxRv(N%?7)7M^$&tj2c7Zb2ULbz{qN}fVG`*hbTgF2wGiQuiugNJqdrX!TmP47#Kkp!RXb$W}HOo}V7JxoTBZ3~inerj3QY4y8uW=m4Zvd9)_4 zqT=Y^a@u}R&0LOJD>_g@$PGq=JTO(|R_)kMir3Za*VT@dgGa{~Dza*&Qm@!wBlFyv z6Zd7NPF_9Y?e$d$rn2LoIB;CZoHB7KuH~DA?+>e`w|Ov=$K}!IG%mLj_&vLT)h*OG z$JY5?-w(@N!EuE>Y;#U^+u~85#sQo*@&{OJWtaP-bJ#LCL`E>L;CR$HIxMyA9;HRE zpSAS^22-HELb&cBl}%Z5k=gqLJDM(Uk9G7UTFt2sS125JvUQr) ziVkeE8!q(}rTZsn#Qep6bC0ka^*|XpTZk1;!Q%^i@yN=JT31OcMFKP!Fj^hDu{;T* zC{*fR*3)N9`d!Vw$_i(n*2Rf$1+q@;3+DF7WxUI&V#?y7(!LY72J-y$_EYQRMr*=i zNm#!hKrNg~HRmp0F;bZLGM>^J^T^{aWgR%Hl&xVIyi(eU1?=OZ$9>dCZQV~-7E&8l&-nddSFt5IU)|gsXSp9!{<#e=L|xs1~5*Abf$&A?!%%g6*g8A%qLH&4mSI*R&`fiB5=n`n?gm8iXWr zvW$X386<4)l>cGRo-Y_v*5l*5{1e&k%<5%LyVB&gYXg2K%e!K{N0Ys1#5Z?o^M^nD z>tA1biB*3103PCFVRz2w6>7{yV|UF~Pdi~tES6ZYZd-ZRH>M@_B=Zt3Y`DC7r6=#$ zmERVsSStL$(v_)~&A>fS{;o;1)H8n29hS`vOSyYxeY!f;Fhoq}P1UBaFI&3}1$_t@ z1_P}v0OLnE{$=1*L-_wd)bG-@!eK$3H%Y2YGf^?w>-=;?&Va02cw#>V5hvuRNce zoh#-_*}TfC#OwCbiyw9MU3A$+eg4wf2M)l-fhP>3;%>{9a)wbAGFY_W?*5Fta`bK;fYFKR2ee&{k`+UJ(jV%6mu_ z)5gxVHpsyc+UJj0AvJRn_<*bs--dNy)NJn<<}l8^`-Y6H~^|7P#BpLmNn?EnYw9mblXt3 zZg}dy)?MTu3hf*5uUWs^AF%YA#dD6UZLEvO2?8GiOT&@&U_o!x-Fsz)t_czke5gW8ZBtsz^sVuG~W`Hy?0$EHAzIncTeg|Lsi)PAnl z3NCt|IA0(}-l0LlV7hxrVxaiRmGuC)K&^4JzrH~S56khZ^Gj#i(gP;NFmO}};|f}R+h7Rh5;0HEL#Ooo8M0dK_m z)^hldavO|r(_Ww{D(YZwXm>Eoh#;@~lVwowH=Xr^b3$y@%B61qlIht<^q%eBjL$WY z2o`7kg_lKt3?=26S#0&)meVKV^SrV&CRTPcnVuZs*LV9UG>3 zQ^aJ78e2cn>A7CBzr=ACrmi;G^qkYAt}{svG+JRpiK~Uk#_n3JTfB$FQhjMqB=KPo zw_2@OGSuw#&?RdTV~=6Qwn}U?CxEMMA7yKk2%b7yy`XuigKoo_z_X*JrGwJ`xT84` zierJ=N2SADi!-!9BSozg)gx4=Ea($TL5aVaXPy!~L;fGXad>|Ic;Dt+*jq0o^^?0s zwTXP$8MYP*J=__Go@0&9kUj4Wm}CSf(M?E{&5KtGwj{qxYx5L$`F|k(?Fm;A4Gpzw zk=V9up;PLmx4U+I?vtN<>M7=mq(RV@%C)`aGka!*iYb*V@Xvhz`!^dS(Xg(rc7+p; z@?dq#+^DywXKrp)fjov$dYCX#i>nRFWnq@>(*`Uz)Ra0|Nv<<;;>(SPYo8r_qEQ}v zqEvgBuB*IDhg{ScxHtTmM%j(kMZ_nkFcEZHQ`=3;nQ%Zslto=9s)^VIU%V64VxggM zBv(LE$MEJ+NT6h1SSi$5q>>9I^XlW63t^c#AKc0w_t^Te$2?{Cm?x>%$P7M*2I$^j z-hv0YyR}8jhn+GGv#k;dnzBNY1KjmwMe9$RW#;3CZ`sn5EzO1I1`4A;;|sk*piyuv zjfLvm|yEA0KAdxW8ofJ(DTsZ+}s$Fj;&vRV9WZP%8~IXQ@InSsxoAfMX%iAi91 z>=o-Z^Y*%UAOH2<@%YN&{J`$S-s74)6TsRi&;vl{9XUIl@z=vAVkHqmp1Fj(UDVNF z#Fk=qZb4EOCO<(LA?qP!uCREJPU-E!ghIr8?Jfd(h!yw{2OCMO1wy+vHVSkI$Y9rq z1Q@5%Dml2HMu&&ZYa5KFXs9d$)L*q8>U~%1>^0^w=kX)^@i ztvK?$${5rc6l54~g)gu)?B!S1BBtP8;9#luMMFr&7>;#=T`XVdH4_k<^_n=<2nfN3 z)>y7(t`JYD?_M_(i8r3wEnj}_&6CzNXGvOXz}^(bRRiL8S`($oSQEJhYtr0I%_c@h z604$PYMtr>0IaM*!D8=?yZniBD`)hU1UcFnm7!Fx&C+MZBzOhth`Ng2=W!|$=*>Wx zIB2l>`)!p6wvADFRd#8RS6PGFvbM_soa|CbgPu*R-HTp3F#KpNq6yPJ3nl-9cR~FL zNr>6SI9*Cx&|K-_9ujCzx_vBlOcaaVnN-pC6?s|$qkn?#iS3mO(9b0!2afX=B4!z5 z_k~SECn&>lq2FT|x!+rL448v%i>0-VWtF|DF|*fUrXBB6PGeg;`#jLPlJMhKT@~Zp z@ezwJpw}ApJw0L8aHl`}I_VOs(e0*qGQlz0l8&Pkc`s2Nu|?dnNHEr-QND%*mLK&|>0MJnf!)P(u0MWTXf9 zf=NC0n)5e-4pG#&2~AH9Y>unU_*BVI-$a3&$FS2V-<<({C9clm8GjyIds!^FpGK_d&>tdy^N%G zI+L~@9Vi;DLa-d{F^Bm+@%=r0`ed={8C>hBa0BT(nkV)Y1IG+HA_1>Cr?*%fT;CHa zlP+Xix{};2e&Mv2wg=P4@7d&&jqJI6lH=l5TerzvZM~YaE*o}}FE#|~15LId%rR`SK9<`lg>h+-5 zy^x4#e-WQcgvxM+q+gbn|A=QP;maw#60~%ic#+z+e`=iRuz^=t__z%{2e;iuFqDj0 zF4j*HUpxEq%Ow=_WfzPnoR*r3@@btVK(H@cij=dAg!)^H7U73(*w`Cznbm z(6;hs{e+YDj|G~0PdjglgyC^o66Q+lf4=_py9y26Cd(eh@!WF5KUQMhv>zRSKP^Y* za(0oI@-);3k*VZ6(=6H=7b+I{0(!C`a1h~+7Yzqmaw7umqz(P%(XkyA1pUFqrTsq> zQ{%TIG>|V-$(lrgs>=nKj{IZu;7~ypa`dJnnrlexAO8Rh{bzss8%b+gTjaKQxCtjj z&meXu+Xzk8kfGKb$%1PH0Ac3tJBjOD8iu@o8y=t6*|jWj8@$BkuqchZG0{`@s*6O= z`>nY|Z~V`HjrAtT?WCADwLNL`!#@_?IRqk>gem7PG6!;*!VP#* zdE;=_*FoOgV0@z9Xq(luU00wtHt0*tOU4|AXOK zAn~I>EV|fiKxOvv{+vSCsM9OSS&Cw`>JD2~t=1KwO|kjxgWU;g-IhvccdM8hJ$Uep zGxqKUmX{?LUwr!Mdw+S_X?ypI?>vHs%o@gA6owgB5RP}M<_1rRXWWh9B?)pyO#H*- z={q;&ViQlFBkS96&ZHG#ixrDeZ9Q_s4WRCF4Hoo%gCU?R42tiTE9BQVRj>VSvoHW% zsKPv-%OpIc8Vn%QSfR7Py&}!@k@CREY_#*ZZ4D^7F)X}7egx+KNc&n|cl zNU5XbEa^T9nxq6R)a=koR=d-M^4L(iFArhiOhNWAED@tj3C*xGsk)rA+0<#Fha|Gz zq`_Q?rqe~M;8tSZip6a;Dl5qAJ&`7IEvJh#Aye@G8OAF#wI=vQ$Q9BEV1TH=0eF1t z+N8Z?DJflkFToTYwMlQxI$WNp3Is^MAGk{~BPX^*ITCOvv%L(Y++E1N3@e4Zg6=;x+q!<(2Bxm73ZO>cT(g+I_7o5?w* z)@)w8OtAJ@FeXm?SI#t=aB-P**dv}|K(vG|SayoefYqY?oU9eIjN*86f#dR)D%k=D6iuCv}~UnT3zhQ!lk=w(U|(0<6G?ZD(W_@-k>q zZR-UXcmsTcqf@nHVV7u_AXUsI!}Pz(8DJEm@fF-EY$IiX?$|-vVlE|a;k`l9m3c3) zSnZ5QrnAWu)~bv#A1)KP5ylfqg-x;tv+DwJbTl+dBXXOnR;cN+UYEP%VAMez`#P)A z^V!xZ;2;7ks6FUtAk||)>KhtobGt}i;N00|K0`F!>+oflyKO<;0AZ|olQr!ThDJ}( zI*k^OxVvhOnI5`ovmq?FBPDCqJ@9&>;8(hQUd`+sdh{74{HE@Z!0@@OnKSKGHNKPd z*NY>*gmrm6vO1aMQ|g`Z?HFLaJ+@XOsER5Nw_B;RD?N5w&|x4?A|rfSI=yY%rbG`v zI5i&|yXL^2kOeL8DeH&-C>cs_odb;vRkhzC)G=QxZwQSDeE2CK1-Jxxdd?6R#6Qof zjGD5>VV(`;%|i}-FyL0mo~oO=6Wyk0RtLe5Gt10s73M6@gb*RBy4a5{0$#-mU%j_$ zPU_vJIZVXW@Yvgq1qFK?Ra(GdYb*PsbvpK(vP03T1GbfdmnhRZbx7dSP@P5<*ZYFdT>UIOShnAne~FU zal(mBjiA*ET8+aX)_cU?T78Nh)kk-+dE|KO zAIrp@iqk?FT~X2M90Wuwl>HrtCl)QV8Cj3QVMIIr#zGO0s(V1|q-1D&mH(H)lssyx z=@$Yc(0RkpZqF>CU!zav%MC^-q>{t;m^;NV2UM3|3+|d=tP=4^vqRCr zeW-mc^n@OR-mPo89!GS&;N#-Pu`qo$2_sDN3dOty(KeW55OBb=qZG*ae&-pXU;ql# z?RX%x9E-rxCgmgWe!{iEp2}tNX$>u=HqorbueuG+Zpi1l| zN=!mNVXzvMC^)H&R^2((M0e?V&HA36(&1%;Y)>_(Fu3`ykLK6W2b1}%@?r6|vy=y~ zC9-kmZt;J*uZ&z4y&#XSrXJQ{u`w^`eTJaDn}>e6SpgaYFz_Ut{f@94W(aXB2$EMp ztF6DPN$co3POu_nDagR*M2YNW3Jp+p79~kpvZ=7zsfuQE*1wliBg#aePd$+;_mFk1 zwd6biYKw@na=Cw|bDK-0o#k?%`Sq_idqHlmwy4Da*(p85&&LuoevizT=($txHYSm= zF=J{fAT9e+XMbrrJb3uniAzu48Zsx*(P?RI;k03`+Jr&Kutr{=)@kZigM-_pEy79G zFu>Q)dOzi`n@6tOgFH7_7#9n@`GuO)k(4avoJ!GXJ|{5&LD3-J0(G^|B_;p5Y^Z0(=`Y&*;mtd>I*VSp*V6={wN{}pIRfiRzpbC=`+3j_{R!g|nzBN; zpL6J5Yy5@bYTg0+50r{Mk4>ce&`@Vus@3YX)!y_lU*T)X^xl4ly?_)8-xwJWq`jD+ z#$ldOs-Lcf?V}seyZ9HZ#TIB5i22dg(T@1zs}|fdWUu{t#JIwr!j01ksAXZHV6Um9 z(n343P!MG1+-Jq9N1uPbu~OrX@7TFD5>xn71;@AC!SePEYqQmpd*m89=M6;cx$HRa ziW*1Nf=O*QX_?LLfpc!W*IhKPoO1LVX)l;uZsLrx(AwPmP36iYx#CN;+L!82BXLwC zYRF-g(He}3uhqq4m!aaWQmMlsxmsooc)g~IYbX#sv2L!+@uuR~@}5$Vcx$G-{W~U) z6Gfzw(~*bE9}TPYpdnGfl|;@zgtgg-oKjDxmf5L=w3R`}d2TBMsu1wZ*>fc+=Ab7Y zFLJs(utt(xEG!U}Bx!Y|%w1j?G_WAJ>_p`lj7wq*tOBg&OE13oo8OGR`|el2`ps|t z{qN71dP_MD#N^87mbYALHxC}=4epX9lL#treb8C+ZrN?nGU$7DSc0nuSKeH!O=>N& z^!Vy^s{-8vrHtKDj;2f=7nrP*TIQN_@F4G9IZ~Ubu3cN5sEst1)t1))5iIe}lH;1% zTk+vgZeP8U_N-nr1=`u6;42nQdS+@_GMdmC6*8G-k{)`QLcuvP!lx+|G9iKMwOFBEB|GzBCqLGvjMFt_?@Z$*`$!vNzG>O?C^XDI5Hp z&9G0!%4^1WGH$&7L79#Wd(OCC?)H1f3NyD~xb`Bnl=PfBIr7@j)YMLIj=8>d!Td5B z091qRV;TlXVXaO5K! zTkA6f4XqnYcN{mok*suPgktXrmrj3ES&qimCQ`YTet($!qw6Ed!ThQehrLTaELeh^ zc?tP`@_t#c=t$)Di%*J&$gb6=#bQ~@xIP^SZm9RKq{9`n{EF4KvW+jKE zk$D3hrMPZOJMwPVEvVmx7m0-lmJz0KF^L2`=f^I+pRD-Tzr^n`FJO8TBZ_3(hayvw zfAGPQmsElJx}kXY(t1KAQh=NaJ+@y(q3-VOm7T@n&c0(RKG0k^Dzu$Bw`#OkS64bR zOUf0eK*ur(4u=r8LB{kE?Au+H>~ATm#ly;?&wo;3Rt%dDn|Ua8aO3~r}QRptLIR(h2-RYq%DRyGCP z9NH7Wjjv$046Yqg8{)=D*rzEdOlD4r*{_K9_M@yE*84+IOGu*-#j;Yb&FggJQq zc~F}~Gamoc8r5GR7ieZ?o~6>k{QR;LG+|C@G^m-?) z!V)0PO=)v!U?SpP-wL`Kyw_7a{JU|q+KuAmYm7$uvy`<+`~gYn6eUe4kus;$c5qUR zm=HpwxiK!o=Z$`^psKU--t5HS3jA1I-#HkC}U|v>K8CVgBF4 z(}F$_L5ms-j*5%G*`h^7iOw%x>aOo)wFWf0(zXA^+z>bVeJ*Xv*=(JK5pftMGjo&R?*9Hax!lXm%>B)Ly51Oijnwh z&F1$q4cJ2-{DeK|*VI65VJmvtuRrm=AitugyaUl0z#qV0&^I=W^l-}%WQcDK#}1MI zKj0Wx7wT$g}JT1Z|Bn zi`{EBx*VL+V1a` zx-j=i63h?KpMdj450;c-wh%GyVB{#U9lz+id7Lt_c>=NlRY?LqSS9zStIejiGRyHWVhT4B=4jBR++g;D zV4tzv*cHANz1cy1resM5`icSO6=*9)sJgt^Ga-iv8@8CzQK)Ug%d()8k-jLLcv|L@ zA?c6=RQ6QR6k+Y2kRizabyj%GKDBbyv%>StL%5{lJ29*Eg&#Zrazm(@uv32hI`Ci_ zx9@!rU%mKz7rE4aYe#tFCbIR`&P}lYEzFr^plhKT^v^AJS4og_!q_bWU;_+{zM#cL z3M!blK$`*`v=6NZE>e%i76RVlzH}n4plx(7swb!M$k)9+v$ima6`;vn;d-XnUUB^AVwW-t0SZ8Dpjvpb>U zs31>_U(IG(%Zj<32OSS+#=_tG&2L3{N=)ts6XCfpzs+2F?AWsxUU(GJy&u&+xJzYG z`x167BoL{2G4l@XZo~!Ek!_PDzV5qV`@Eh&Te@k;NH z>pl3OF+}2>PhdX5Ul2neeHDEdEF1d$hAm)7FBQc>0(o+0D77_8V{;mtLWyMMj1+Q> z_nPKzT6*XAbRo7C>j?6DoPP#L#VEOGz}JYoVjY*ohLR)L7Efy?d*6ATREmB_*ET+_ zV*cIR-xMhv&Ik8@kz5(QL!YZwt^Rf~s#XCuQK}R&dmzr1M@Gqe1@)vSFw>JYSQ;2DvMUzVgs3<+dfKS^6r`C41y%;*6=3ur@+|(+ zMbRaC|QdNs+8v!;UNJzizPIUqg07>UQMTv{Z3aHTa$^@V^(l9mqXCT?^Ll`N28q5)Rd%k zPgD5aE!1`dpf^!QEpWi(9oP;mBNp3(-W)XEU=8VlkwLCHxEb`~im2;A_k)IZCrnCN zZt^*-Er@Su+*M0P`1_o-9ZQ{6%6Z_Q+<{T<6@FqBVt{{sNtN=p51v0cJ@K6I5?Oxu z$3GT+^k2@u&2p)zTOpU)f*u(_xAsHAhln>g9gOv$+rha)4)2P{3`Fh@G>nZ{>b?iv zSH66N*bg*O45IHR3|qJicU=d6N!i>(-!;(30n|&oU$NbT21$w)i#oql2XSySP=Ucf z3~C+7P;HxL@YIS9&xc5UP>^jHPK0{SkD=FxNe>d?TH84qpU)|?yvLdz#x zx*m%6Z=vpSo@gV)P9(f< z({L$7kd%@;a3HWiG+?E81=K@mVkO27V*i~4xRPk$sq&|orNWT3sEHY}*eG8_A=y;X zcs)*~Qj2K75HyygT1{Qe<6X36M&( z_ZfhatL0{!tN#|GmZr!~$6dunD3tz6me%-p2Ax_#}6ST4DJ=kEN9%eR&!8b)F9+X@<^ zyuN+&&USRo{5TnPUAM!Z@k5#qMqRSpBsHmvVMn`>)s0(7=em~g{n$O!*ThlZod;Ge zM};>ATo9}Zp?z;d zCKDcvoe%>v{06ZUL4OP7MALXf{2u?zeC=Lcg11HPiWIkoU8`fU$SONm;9_eD=W5u^ zWuIq5|MQO+<1C+Lis(6zNi>s1E*-WLr^J`av%v^lQ2%F^38PQPsQQ2AM z!$HKMuucPVT~OgaF>vAk`xG&9p^Gi4N~L;R#Kn5dc0*WYa~qJE7H?V_jICKQ<&H!z zo(S8k#iZ_#VqB+FzA3y;Hov1K)M88JnF{MQ+l@hu&85dFFWkB=mvvk{Jnad1VX4aGadpm^)zqP6 z-jKSAr_TfDjFC)4TjD2UD;{=xdyc_oS{3 ztnOwciRQS=;NXnX$i-4>ovU$~ZD*}U?i3!w)Q#t{TrZI``hS+FS)-bBg&p<;W3$Hf z7Kd36wt<4VT{l|#7^>V2>&7?iSXGmt){zc@fy7FT3cJUvXYB@rY<;>BeUj$ zj~Xu5m8aKdy|t7JsTyJwl)98MlRLyZ$Ga&>R~1;lX|3<>mhgwW$-(3QcFQe@9;m$w z02^=MoP@z=*^FtByKq`y#i(HZpnsR{K7rjm=?&-s7;*?HcZ+7*;!_63j~*KFIpAlA zKrvk_ERuqj=TLAhOByuNQrdHIQ`qd`lVKNnpP17XKZ5m{7-~1*tAcMd% zJ6Id4^T(g)lp0ixXk@}6isCFB&Jdy$ig4l`ic4{7x{o2D8#>C znfUq7pCX@l{H6Y%Knh0Rh{^A9Hr$?gn&o&6jZ(?^%E`pNkNipUkbya8`*z`-_3K}u z(-1#(4n7$BH}D}yZ@(RQc|-WhY@Iaq{`^GIJ=V#qG3a|OkR{CM$y?kJf52AJlF}9R zzuivOEi7#R_|odkzvGkE%Us}|Ze?B--#b;%wV*oL1K;dq4o2+?-Fke|-sTfu#WMRK z`NDKG=t%?QK#n5D76V(dh<7j69sjXt3)9F64)O^hMgChzLtmF;V*Q(rVer^Q%$8Cq-njJPEKRH+Ex7laMi`xgXZ zO{GF6l{T}HR6o=detKM27+;eO3?Cx7=}5=^Pphnz-RSffEx!F}EPMqYlE30;25Gv0|Ml7*Bb>&-^vfm6Q! zlLWe$5IJ`lgKk!9&>1vHl#!yKRJe)h@<*@y#hCvjS;R|2txyZ61(qAWLY@gh}xqh-s1q0Z^NGHQ1iM*vI6{c7nsx( zVab3?MNjiKWEeMN^6dw(d+(ZDOWgtWm)Ha=PY2vu#7YG{;&k*a+VUwElFBTK|Gzl) zwkU4eDNlyK9ky8^EfJG2T2&K6LwW|NVFiv-9iUAJN3vx2i(yD4ydgHRPq)gy)q}bA zMw3xmw>8QOMKy$x`)~c=kJ+lqspdY?U!0#;+TA;lIA|gV%(&*xLAh?K;;E zA6J&>je2Rz+bZp;7*mMYOl7TEohK^2p8P-|4`v|kT)D779uF$+`+&M8Elifo`xv!G&Fpe)kK7{(Si9xFXS2fI z-Bz~9lSDQa6YFzpq4XZN`FM?S{bBF={S z7JHyz=ZMW06yBCMgYkv}tO4mbrc+{Ss>Q5vX-fRRvx&mZ*HERQ;x>!_|HzoMo^VjqWjD`A+BDiaBR9zfbsHm{_^%$M?G3 zW-TBj|9AjE%T>2OA9i zTUF~Fck*pd@girvl++enV+^L%!-BitIU?DPStx$ktF<`miyn)5EqqdhY*Bw!#Kt(l z=L34l|M>{|JD{Gv_y>NExo7s+v9r!X11~K%+;`vM!w>ggoqAaH*pVZ*-_AholU#P$ zdFNeCrsn&urFbk)X?K3m2USq6jGiA-@tjX3KYxG((6Y?&ZtWVTE#*ERF zHhA&vcuDy77n4kDLu+N@dSJOqysz8Pcj6s(08q8ax;TGrfS2JF4tHLBm4l)HGAzg# zQ3r%TPYm6}uejJ^7&AByboXgih6jf!{yWL<_~htRaBj`^s(s;(5h(h#USrr-$(Zo> z<~_p0AH>Hi_u}K+{(aNTpWprk`Gr>ai@g^pT6_98*pX>sdiyzIH9~MYGGgvkZ@JN( z@>vyQvUFNni@f}Dq$UmLi9T{kG>1>=#TP&J7*S;+q14_w@8!aem!FHran7ZvtzxE) zL@IjY^Ot;#GVAFJ4$_xOUouButr(BM)trQDvB!fg#+#;zss{rhM8OB@sqq&-vceQ0 zki-8BO`C!~5KqLfrAdR>+=hRZ(i>KvwCFQUGmB?00$?q_)UE{DTc^-3ew#!%x z+sepIk_n%|Oh!>OOKO}Lyk1m!)jw3Q%5zWG79^&rsJp;{rK@y%)Kclc3JslFMqloE>qI+INeCogR=CCSfJhhGjI{Ammzxc~5SCVhmE$xX3 zcW&--;jvcs=2gZ0R|{Y3LPutGp}6mEXx`??w?>bib6U3JUAA!EG$@Siwt(?Vqk^nH=zGs1BLPIppJ)AIy`@VXoZOwDx?jg!O|*@r)jP|=m$~r9t=r3~dJ4As>|Y#S9xk;sATfc=Q#3l2Snc20gr zE0wU5Sb<1I91qNi$Sb{7SPBrj@MwBfC=xgPcJV7Bi2;BV7PC^n*uf-;hIz@1%w%%3 zUEp1r6rBfG$~awW!>VaF17?lA=l4V#9+_6cCVk#emIr{y2=nCQz}E=vvS8k8$=Q?M zyfb`E_?1Lz3YhX-*$JFm;;lQg_GLk(FFDxP$OgCs)8^xXtP;vUR zcY8ppWFu}Mz9LlbFelsO@hsp3l7y$`^-iS9t1gf4_D;ouv+?}a_g3oDo8ucwSv35O zdxeVLoJ^;v6#?bY4s-xi9;7&STv^3IcNXo zp24PRDLt3Am3qBS*_P=HM&@Vrjq$|NNTvIcox(4R+q2P0cdK#VZsED3o8n{cu48=7 zuDYa+NHLjWTb6hn%Jn}bY-?|}ZEa30jkf}#`!ohx;cG^+Ze z+cOz<1g1imHXRBXoCc`WP~;Q#2XTmKf84mk7cBu;@PAk!3Gb&|ZhFB*f+9dq4CsX< z7#0v@I-n~&dgQEVk*m-j4O;3D^FpF#*rZSK1+ae?;}C=rH2MWPGbr)VJ)$8BlZ|^@ zl`LCMp0_2s;<{|UaqXc*cI(<{N5(a~ZtK&+kJ6AxotF}D90C|9m!G!nJZYV0^Y80$ptV`R%^Hm^d9|u(NKD zr;&Ct+GPbp!IIJ%V-8jy@NjWHZ>;OvyT7&5TdTDKzRJFC{;JE*u%8XhR#QS>?+DMZ zX^Y9F4tJ^rN8K7t76S=Wibb}m6LnkFIP*LvH`JEw#4LNNbpXpTG&v_uyrfEryr+15 zx}bCl>EMx)Dj8IS21O#681&qt0!Q=of&T~ij~W4Guu{?$&C(?WN6i&%1WUa`m3d#* z78p$zW25!5qyN#Z%P`*#D>pZ{ojlH$gTXbGL~gEAaR|R;*q}b|MB|k^Vqn$64*^Tb zWlD!{#B4KQ$&vXPc8t9?wqpnLN~q`ZC)r|P|D5n|(W=dpchuNqz7;uEStuD}MpM*S zTBv+9Js%ABoE;k#&muqXGu|@Xy*1#aL{+bmdDJko^PEF_LgU9;F<*ORHXS)|?vaHN zML)+!h+Fv6_pTcFSB~~@As$9|4N$K!anb;_83Vsczar~~1wUaV#NOh84;z$^#XKJe z6IL9@{9TXz2ZMqO;E^y3iTeI%F@IorXxXt?na?zqXL2SVn2#Yx#gYtJC9Bsn=;R{H zmSSKNmnyBCXnWCL?CDLf5q_Pqcy;6I0CAJOMr4bwK9Zh3 zUAUo|yKzM(G%-H0It#NYw8;kBL?myU-?}5&ybu&GzRX|P+|1c0gq0;*Yiea$Z&77e zO?SvSd2iM()CZ5}#y9M%HIG@#oVCm!ZLViAHaduv@*wtH51Xrj%}t6i2~`hXvGCRd#Ioyg#<$&U)THx@?W` z&ijPRk3aR4D3bFfJ|!LBe@VL(U%6qo@R3q4BD}!gQ%uj2UCWZeGtS2R;XgDqh0drO z&mE}=KWW>~URwxFbqnOWW%c^9x=kmJ4z|_%c2t~4&)<=2@0xEB_lMQ@3V)ok-x&DS zuk07H4RYW@dPbCpwQqorQNjjVff!UzY9G)WH{dV6`@#+RJIJJ{1%q!t^}-=mrheuG zMu@0qvE53dwx_syE8krRZE#G4{iEJoV0Nrw?zhh|&3r~IQa-iDbRDVsrV@q2W3lFG zo0oco(9*Ae{YG;5-fsxsH0&|eU&ROWvcJr?qV?d`p76`a>ZreFu9@o-bHVY(zM3g* zgycbOU*mg~?Wy8g-#9n9X@5od+0|Fq#xXVcwecFW7ux^--KsPO?>~q;vSGO2gW2Qx zAv#PAGEV(s1PT!3#QUN}WNK_I!`mcM=ES|Gpa^xKP=8uvSQ}yKk08Gh&Z<#zt!9O7^P$!!H~s7ao7!p%ZP^X)H)MS)lg~UuTlw_~b1WV;IWGz(^a@bLMga(DZVIHg zklZ{Liq@-d#jG?1@T6(VE++#`z=7)$-zVjzVZ{LTEcPFDM6TD#v>U4=t|))P-iYhl zcndK3t7r{ZT4MpeRtQOWZ7Q2UwaG|12oLM7JA{EqL5$UqGLLiET-Emy>C0BI%T2>GhM2$+41>R%Yj=09hDmAd4wdXH{IhlFfsWCRc8>m|up+ zt|@`JmG~`onC3o1zoc7Up@x1;wXY^4%J9=Tdsp9Pp@~Qtq%^$5ERq`<% z+LJ#V-keNMnp^66BEGxw1HDm)scDGNSW7P9+R}`iJCSye^&0&rrmf2puDH*x?U^cB zbE;T%cD+@1cXu*bAnym?^@D82(U^YZV9Jy(6o$Bw?-YDi~XVVm&@?W#eRn?hmareP~HsPpOGKO;G^bJ!)>vLq& zy?oTtf;KBhdbiwi)4)-MUPeEfzA5KiuF- z)uJT@T_X4(H#GEV+&>1CXR($?rv!};ag(3<(h>Tx-{5V)&0O)2xFIpwL?Uu)6MvudmRhl&^)~q=&wMJ%3kLNPW z=aribj`<`a5HFWaT=%7t_p=z zHm6I&H!Q(l9esk0`faH9juXt%wVJLI9w+mO4J)S|#o+a8W({OjBXY2l>>hqZP(wg0 z?QC{FvL}*Q`4Om-H7~{o@>L%GYYloCROs}GQVyAT!w`$0ZUvNpE*V_#z+7{SvHgh! z5RVRXe=@eT5VSXoA>qc~fA+KACBlne_`>h|(xjzOELfV+v)0X-qn?zfUC*0GlxEh# ze5~!MIxE_s&)&xbi+4J&wcD?C-f1)2YN|lK8_9G||4{!=d^LcXBgaHHnc0i=& z*OB}TbLPQLP$UtCA-y36n8+cuZl<8iB$O3AlP;Wws?F|O)rRWte#ZHRoYY-x>; zyW-xdiH;Bo7Z(cQR{S4 z;TGuZR7+gh48`b!)3a%|H`X*YRCcGG%!cvm+IFuGp|AD<<^?z6G6 zjgg9f$HL68^DhYN$(h10v1QmZ9{D_4G{v}mPV9OVr?JozIC@*jU*{yE$9tZfe}N zsj;z6zECt|8YBLYx7Vp$0_X5P4QDngI&5oVCJ>N%qmiGkY;2_19IaKKiQdi?=>Ojj z<*9+Kqh4{*InwC!UD({IZb{ZwUF zJYbu1At2(jcHtx?%Hdh(r8Y9nf z`mWv|2pH~?fdZq-`6l|Zczs8rQrNY5+EQ?bl4JFPqiQOXdp~XhpV-c`WMAH3S1ajI z>6|aOD$M%rtg>TirE@j5sc%HwU9TaYi0SKr>B&)-Y=ZcGbM98?!QvhIkj|6OmjO#m zPL4Stx~JBvi+D#(a99ea=Sh{E; zz46-IluXCi+hdb`E@5xAs$4a3l=x)GZ$SwFk?A5let8croXP+DKY&gGCTU3I+xNF|7zH{vZFhxROB4hdvrN zaB;oBfTq2{#LAe0qin(LEU`UNK=hh1bII+jm`AM8U`bs*YAS)#V(ytUtTiq?Q06kJ zsG*fye~?&z%a~pw(*B`oHE+z7=6%G>u`-j3xeqx0t-kEqWa3~xnqC(4kEVh-@&6*R z^D<@mSU~G ze^eWU=y4lc5^Nyl}`$B@*e0&R=kk14tuPHLJFoAXTl2p*&5VCpqdXZUhTxp zC3uL%od!@K+FKf=4kTSDU0KYSDOe)b4p3|5=&d=?qXs!j@ekQUp6u5!9J^WLs`x>MvPHwTQI%!C^^C?gnwpa{fDPR=?vE!ALZ+q%IhG%rUS_6 zC;2DR5}uo{YZLX!NM`!{zhOjb`#L@qvVrnGqlDG|m@yU$YJ!y+ubH&X34^22$O$~T zF_)@YX1AVJNW$W!NW9lZ1J}SdUn$v*{wEIhV-yyedY)6~cnthL^)aHi49n4-=K>Nr zK;Z!tm%x=-JREROCxRsL;mkixqqHm|k3Dw$_-Ee!WxTq_Uyq$mZU%3PFy{1pJ2x?H zdcg3n;Pu>g*WGtBvY$`rW8TR04sXloyG4*_p)8HRHSpdU$^;**f%Z)+!$w zpIVw)e#3=(BCWugzUadXU3Z#}R(7GH|pHN(elf{z^s z8+(DC^I>DxAaSFC04=0KVt*0m#sNPG0le#|cYu)%tm!`-^-UT{ea)Vnzn1hvt&Ml+ z$_T#A(h-?j?wSY)Z*CTKdrw2VzLY%o+#mn=)vvmHBi%lqvKP`(eI>bVc24i*Q?_g# z1Kk+2)ynsXN}{poBC(i>&*w6hQefMjJqgx>65%Q{IlFleZWUj!9{;Jmj{Z1%qpZcv~NHez@ZXhE4?5G>-mmJI*_9&yqnNY=-L<8EEtUGirA zys8I@JQbrvr=sv?f{#M+v)Gu#n$2eKnu25-50kQ!8^8 zs3W-Ks$ewaZ*pPl$XKCs>kj%ux7?I-HC4WBJDQC)(vkivmM|+d`YXv`GwG0|;`^%6 zxmH}pNi&^srz2~68$G&gfpfP$Z!$0jZ73Gj2|9AWGh*#3OLN;nNRxuUc@6xt9y!w# z_%Fzl#q~V79^&1>G8Xlc!JIi7zKC~+F6D4HkQEN@pJaeLEat#;I~J`DeGa5b)5{Jg zCejzqmx>$aT0E4pK+y!4PHBli(j*3TplRr+YzkW?7!H&a>u0Q~oDL3bhd{;h5)k~?wzZk5!5DWsvUJr9I)NtpI(FJk@GfnUN&9Ig*# zGz?7^kbR4&AVHZHR0%*NdSc~+i;MZL>x)rw!ZVfvxW1?Xj@)oVS;0X$uWlKaYP1^3 z6Kl6@*|cf1`FV*WsOL;Nxe1z6DA>-9_kW#D?2VL-$$a@7AXVBTo6YB}9c`dI+R@%2 zHW*p1HR!t zR?b>17cS}lhCFG`8X9bAbagRkAE$R$4tsX9WE;3Ov_=vZ@%}C%nW2&?3Ro~Z5h)gxyy z-*L`emUE0uj5}l1qosUQ9|}hdQNGp8X{zMHH+*09R#bY4qvvFs-Ddw@GNF%q!_-@O z$dkXqhyMvn#%3!pmmAz#o0lmX^39&dg;)5ccI3=%x_e&#euRD@v(LdPI`UL7Q8)Np zHdRHND7U?&DSWwQ&ZFZuH^LiT;9@)`Xvl47qiuB`*&km&H(i^3)El>0vRJzW;+78Z zqbP1h9#yjXFqR!0eq0N&IQTyXjexH(SSZ|*MOrVtG5_n8kTCCk>Zu3E-mK1AJ5jOs!JJNEpTWy4cFaz zNHCJ)T;9>;<`?#+QcR)>SO@Q&_EpUS)1L*xK{@efKwpzqz$vy*8_rJgVX&;CX~1fn zbW8uscSDm~R0QQVN6WL|U>Eat5A+{FDpbv&zFs2Pz;`VYOrfup%j3Kk{ zv|VT*%B76$#D+v;LlF6WzT|Yxu9y!*qe_F)^Qb9qFhx!4AH#?VbJFzKW>juXF~ik! z_f7DzHL>RW@%7O)tLA-m|K^Fz*sed;>lx%I%Us1?RlSSNnusN3%1_rbwoqhKOv|Y( znGHgToNI|&>bB8kD^5b9>_c?%9_$hJVR0|SUSDx9L?C#$ zE8-Z5Q#Vm0>kNS?AO;k_!S)QYS@E=slf6VgN~}EO*MDk>|SUmC${={yIS4if^M6743m&Q+y5lt1v?_IQc7J7Y$tO& zb{rPIY`g2=!HY;oxM`N?0@jGFl#S^+76+5q#<0A`jGmbrA5J7binb49)G&RPA!abf z3}?>hVkT4cmc9S7z*nmUb0N8qE^m+2gZoF8Up2|cz01~b&9d2r(7)GeSGHB<-l#R& zx>Wd&$;zy?JThWkU74&_Z$TFKK1>Q5H#MhM#zK+W-lgxK^e>&C2g>Qjy}-;H#PU>; zItOORF0gJcS#sHutCn0#*Iw+15Lar^feuAZDae9Q0?RiHZ3jhjT0h6%L5)aHplgN) z;_q;)=n%EROc2Tu0d3)=;e{gL;vT`eP?(;6GSlA>{NF+;RK7||e$Dn27CJ=|aclpZ z%tT+8&h@?gH4in8~~aygjKAF$Y84Xw}#k) z%T+K(ay!4*YLQe+>(8{J$w)ny5Q27QtWYy>s=?*e%wtMZ+V{(595xt9r7Ijd7CGpIrms6NFx-tNX2JBD03 z@kg!7AT$4x&xW^LL}V*uw>%y=E0o76#~Yv2IJBQHs6rmDlPN`NoV}O$_-Z9RQYIPkyIAnfy>6gSAF02u?lS3W`!v`!ldiG!8|i@;~et-Ar^{4VxFRHx{}< z*iK5?#oxs%B&p*5h$n*SLH&f03{2MwQLhi*3#ybopN^XkWHNF)hJcGa$FZMM4<#0*DWji3Z|MV$y~5ywSu?tN^`;F-3TXwY1SL! z03uAuYa7NiWS$f5X1yrrg1!;A%U$bc6d=7hRUN5sy5O8E1;QIPuS0jq!B{)GWnp{V zQOPF_o#>ied1bs5T&Op%o+a5Xyq1mJ9)>nEpz(qb3-M0mGdWep60uEM_|EUy~}7no?HyiOmIx5vgQB0m~rK z8h>ZE%RzJMKR0IaIC#w@eqZo6HShR%$B`Vp_^*}9Y58(}pHTA@te%M09(R-D8kgIt z=3BgQBUJK~Dm!nCId{hs%hxWntbuL&&|XjHT|NfQGdjh=0^|Y+otSjveJp;J;F!4> zYKZab>5Cu4ca+FSO|=*$aRW zj@AwX_tjAu5|e4D%;*d0SA$`6lMs6;8_^~-xn|D|Ju3xM+O~SegBpD}rukkSkgtNW+1d@doI2*N}fd_W0EYt1_e6D3z;bbY7nIjW`@Z{6?SC67pE3Jt^-` zIY`SoYPXN^!e7#7T=l`7{f|a^53e%^S8o7yL$)OU&cl*5%uk`ik^)|_0USGu-Io0l zdhb{(B{nkEib!ln2NvDo_K9U0Za+n55xxy*j*CukKzg9`+A&S8Z z3dZPthI1I;tt5<~?CET1!W}gx7{~Q3;bqTmw?nGZD4pZ(ICQ173JCmvuKygm-rH5q zUpzdLPb_uAW&6WHU&6$@jPg+K0AFFPC4Sm%)mU6+h`~M)w6!};&RY_BQF7E;K8|$% zC&&uQP-vKdf1w@n1HKEuOPmPwy$_q4pgu9MI@HwQFP3pAg}I1u0e7f+2hYZOLj9-$ z-RhzDcSFfxc#Dyz@OHU66 z!?HJ+>sQwJtg~#Z_78V-F1uCHkl6rtPF&=@{2Ej`xnR~MyarWeICzNc0mQ)cz89Tt zEz|!~P3y36imIIDos2rY!siO{8nggdLQW{!5V^sHAb|hOq5GXqPZQ zH2KwmNJ#DWH*~C4_$^^Y#PCYt4{ezRy?F(#%VGV`w!~oO)J2VzHD5I;jxD@;(!?^O z3=9+bq2T9pEVx4$1_p^e1qA3m-nojcvRv7EWk>j9-de;B30caO{AbhVQoYKC%=vQZ z)jkd=*R}F(VJ}<1cDXt+Gd4o+T=1PoQTIpf1d)6akvy!drHmLHe-^LL074L_R-*i| zXm0^73~t%Uih*1t7ctNP8yuA@5L(|x&J=5seQKf>W3w{SH>q(Jhk|P~*Lnp#EZ1x5l?p)sy9spQT zub4CTdL{ebk~x)(85;35H##dRXE1UcbPk7xud$~&V28rmkCn{jPS5Q(kIs(M_nmp? zW8kuwfQpB4m*z1^V2Op!5-H-{1_sorcP)WfK!RCbbTbqy)f21$+>9t1rbkt2z_YI6 z3SkLEOZ`ViuG5mY`Y$_O+Ox@N;%<_Iq{|jv4PR0Cd&M>y%mybOgs7ubqAWyS<)R)l z290c#BNH@pFImw|-v3(@<3d{2Ftc#3({GV?U5Pw$i2i7DW@g)doQP!9T>fr8A=T_1`cXuEsReg`IH@Eqe5Fwxe+iRTdv0Zh#+uWVr4AC80R)BdX+l)ey8hc+8s?#r*qJ25A4YM!OM!9`YV`UduJWa zS>Zt&SL^gV`msxCZ0&(g^Jbh?9=$D5AWDPzQ1B5nRQHhBDz8DsCPgo>$tIMgb+}nV05XUPd6bECDB&Bvv;-YxL+VI-l1iT)sDPRzdis z%?)iaI$ak^%q;hHr_U&xlW3i}e!r!40{y8gFs_AJ^U_Pg4_?;VdQHjBrH2AH|ka7>uF1^7-1stZiVs6StarnzRj6KCgC@Y zo%fU)-4E|fZ(cL&s-*7UT`!$pZ<|79u4C2kb=%u-NOXLQ`@DL??PX3|p525q;C|;g z;w1+VQX1KpmUO^4fOHY@(^!be=$3Q-6OD8T&=*eu-Zzzip|rh0z&NRq8CX%MY%-ftgcBvDVhnl%caD;}(7yBFP_@6TdTDS8GR~! z0}z_uB+ZFr+!T+jUQpZNZ{2CF)oYQs;srZfq8hmgbktZ43N5e6+1{VjSG#Sqiw6`Z zo~J0{uT9`Vj(}OdX2}I2p2O;;G;e_z30BP`h7nZkYZ!LYQ${b(;#YcjP8>log|dnP z8S*IFr80CCjHsktX?lDGhOT$I7zDwg`%!~`xA|PFR!!(j2Tt3c zZ+Ta3+mk!`os~`ZifwyK6Njp0@5J)WRfjyF>t}=Zaw&^qQlVVllL^nd6P+_7Q!H)| zsbzPmXw3vPX`5=P!$;I=rNtF-ekC0`g7GgjsFN=V!57Uke--(s2XLB?Ex8USS}aFn z;Sp|73Nx0T>R4cb#Wi0H=y2?DmjPc6Qqdv2Lr%JUXJWIh@*t+U<5RT64BovR;h|CsUYcAW^834r9pgP|oZ@eMQmIc3i_=D;Nz3%ySa%fWcUVG=grC$C1EgSBg ztOsW1*Jj!zVG5f0n$cXLeHgiSJ|dZt1o7T|BF=jOkd$ke+%B$w2w_Dl6w5+tvB-ly zkz!C7{oP&%4;+{a@x-DBW8k4_6VGBW)fNFr+Ql)Lx`2$YR5_8h4W+=sBB%mQ%Bfgm zt1rHx7&&bs71p&$%-(RYEq8o#v}Y=Mny$QXj!ue3KBd-YMHxwJDKvWC$mnT)90pfQ zW#u{Lz6%|rw)OnC^C|~g7s~eZ^-u}I;myRqXpMnn0U31IX^GYRq{ggM!T}1dy2)lX zDBGq8lRB>P+xV(Q+X+s0;Qy{&!RDo6jld3`wSSEud0DVxizQ+u6K zW6(P_YD!wzxal;XO=fW0WDf3q32P#ib$Du9nD<83N4)EE4`_UPTdh&G(HPGK%y=E* z+#VuaR9D4}a1hyvm?9mUg{2>)Gz`Tbaj5AZ(a4D1nWAx)DEwgxTMn$uKc+UUT(VC1 zkS1t6gU)68x>Unf?Bm&`ktAKC(S8)I@-xc4L3iCYW^If)Tkw7dH-^`L#~9K zl(iI2?NT%w%a{ws(P!Q>Fw4@Ld=X300x8Fc@GVQ!ZwKFpnWqqp&TLWsUI>zxgwx4{ zyJBsISFB&CGy~&7i_{eY_OelCQ0h~ev>_B9i}klitX$j5H-$CU#vLoPD{mHk9go;) zgT#!y$BsVfX(*)+Sc^l)M(ruBM1YG6CJAVCu$sfgDPtl#T;RJ`LeA2D96U-c*^rpN zHpf<4U2icwKiy`#Cayg>CtO6F>v*dwl!$7L`z-RuCmtd{>3>mbFlf*)sgt*rymAKf zhGbWdsdP#SGb%NZ#~bxKXG6=EPPi(Ll{*fW{jT_$WutA#=-iu$DPh<~WhCtTpzu+$ zp-iq!LB&c+bkP)6J~8R<*Cl$k%ky1f4{M)Tx-6g`Jr0y9i1=wEv~Fo#*(v6Gi%foz zCr7KTi?{Lwq%t@oI3^Twl0;hs(@#!yD4s!BKu#onivmN7Uzv{xi5cd!)0*&wm|^Hn z3U3yj;JD~R(dhMzLZ>xGZQj}G4$D(nUl=kPb~7rAIlPc@1`rqY-yYF9Y^<`4A&7RS z@-=)2uRn_ql6B_D*Mw!lC&E@xh3($j8K;+`>mnIrB%atJg_?=M%v0GfpbegoSs99l z6i{48Z{1-7r&pjOQYmx0!SuZ;?C6d(Ih(#UJ;QwSjP4QQ!+&s8uu?W?7H^QaL=I*c zEX?Htr4#r7g5c$(vOJA7DQYYMXH4WEBjogg9wS048Bq%bhRsdnECur#qD+^hJVb`6 z52mCt$;upCu=KCD+`oTnD_PB^?Kwwxv=?mf4Oda;^SM4LwC0#CZypI>bfZLNK_30Q z*9|RXe9)O_1caM!fhDh{)2WECRKe+WE?rmWaY8vYCbY$RNV!ImNtd(I@rORcLCCp{F zyX8z+s`av&SZ<(eB?sT`PVmiCxL01}XnEAAC~tw}>Bu#u^egAGx9>3!~%-`Pr z1JIy~#ZnfwS#|k|4Q1`>+c*B2z9;uP_ae^?`x5~JN>B}4WJX)>N=;56Mm9(js;VZ_NSm5tMfa_c=(R-eF|@QU8K|TiWKin!PZsQnrF?&#MCPbF>`h@mXYI`{kEs32mxE2Iz#N;q zFvG|M3y>FC{O6+bO7-N$`Y8p&&~rg~*VLO1+MHbYZqRT?_xqH{=tLAB9XeVX0wEw0 z4F>&3`s)_!us~wP-!rfnC(W#dt|r(Fk~YW!-uNp)2UrJ~OvY(lHsdEDAo#SFPFI<& zvsp*cQ5G&X>!SYPj;Y+tg7<8r*IEE`A)p$8Uax{I*e^K}xBwPKrBB5LpA+dRW*5kf zrq8R5I;~u(5Ts>|-DZ*36r9ce^Rv~Q>P(3iQxB%~7PY^Sh>#CI7H%gw47G^MAI9Y1z+ouR&!sd>DtoW$fL>3IkkFg&L*+&HYL};;c)&? z(S=NkcX;;Dp8T{atG8%mkO(%E?B7Xp08D^_R9h|PIX1!0t9;1$-V!zpKpa-;l;Nd-Xg38+45n6<*axPs^ung#G2;`2et5Iuo9D(oHNmT||6f zU@4oIT3<0jqs1Y5i}3Rk7Y%RX34Ctk;oN4Rdcf zL&3LPg^b`h% zxrKU^T5_NVdP;6%E}GfMEEo2Zg1xA(T1MCIF5CQ>pr`+O(dP5`__)>U#?0`vC1P`W z-O9Whg4FQ&w_>OlcwNdi#`BZYR=R7GPod7U{E=QJYpVuD_^~NgFPUPr%z5c+SH?H4 zowbk5!@)6_gQif#%ME+;^26(m_EEdA-IXDin-gpyu=lKkQ68B=Nc*dOtuq)ax=NH7 znI0Zbd*g_c=Ot3L!{tX$b2rw^%S+tIM_V`JME3 zl5=vBlbrP4dru~r-e+ffUzV-31rcci3(^sUtDp#oqF_bEf{G|Mln?bE}~cP zs$hZ5;d_23$?k%F|9^HeJIrQ>&9A)Wd7t-r>FjrOZoZ6LLzxy(S3wFjgvKa?gC58e zmr6k-ap=epL042Q27f%r7=WN}`PzdIDrn%NkN)UPd!myRg*3(oV}0HOQAaA1ex3Z# zjES>a4Q;*CX_vpB;)1rGS<(*J_t#Bn&3ZMN*O~IR*Hn5FfBM1Lx;>m( zO|JPe(QViK_j`=S9&171-~T}#(LJkbn_cX(GG6?OX&Z`ZL~XE;uf+iz{R&yIZenY(E<8I(Dq9pV#O-!#4#-U3j`9e^{_Otgfnw zaqaS1R|&{m;I+0XdPHl{kgZ*l+pe;5R*ewoF)RIR7lGfQhyQA%@CNl1xHkv|e!GqwUH&Z|%m>ED z{}IdYj57wKNmJR<|7)+ueEHZ5Dvc5C&n9tNJ`;|9X*pz$tgJ46EKn!kk{8HT7mgzf z)kFX6ZNTB2h(hg%aVEhmqw`6x1pj6DFH@>>)X>mei@GlA5Ah}CBMsm-?FfydH*UoF zQx3}rA0C_)KT=Z#Z&p$f1)2veR8gpAa0$$h-?~Jy@wQI%dd*dETqOB@X@fV2k;fOz zCba3+lpkrnLu;E^IebZcG5m4&c%XTx9IlCROCS_@osl&s1mBj;(`LbmxeD4%uuTTR z?ubU?u5c8FnUOV(K+W3Z%FO1szEze|uByxEu$fiQrn=-;a`}arHIvVBL31jfBSOo7 zQ)w)2c8yzn#i-T_7`5m96hQZwpzYCm3w$i#|zG$O9Uk6pUhADaKr5 z1eSRK>k%dt(%WoT$HRy6p7QCK)A>1cSvV$0Gya$tA97G2zQu-EH{V~%PKBecp}iEE$buy@9NuzO0^ z*J7O9+%uz(9;nqxD2HF2Qf*;$SEXYrX(H zC>|VZZwKF(OP^W`Ws$aH-(2V!+XanN9e5E1AYF$s;cw*W2}ZRKfskjYAfiq$N*L*lC1}og4!Spbm z#<@Rv$(5L(;Y1{gOpO{Gn3hBgn)lT2QrI^m}Q8gd#`s>>Q^&2_Ij`B^{(vop3m?; zTgU7&EieGBnODu)Eo2&nRLi#({Kls{dNw6K3Xq>4IJ=~jz=qA zjDi8WOtl+vfCl^)Ozl!?ZZs1Es|Pj}pF@t!py!z~#T(48(w1;EYKyPk4^i_#kj-CQWCnUAL!%YQ6k6o703*mo~G*Yb8$@eP{?YdHh~ueD8r%7IVaf+J%AT40;DI z1S6ZaZix%)Kf;)fJ@>`(q=m`1S~quI+rHZk8>Jg#5zFm`je_z7d@=2Wpz2>^v^W@0 zmI>2UXjF|_hEfE^W#Bo>rORL{fTMNiJceIufiN0bG98%m{%XR%fE8e|^5zIjC_XfKwELO`sRGv7Y;PnDhqerETie8}lrTwM*BqHAl*IImXB z0Xz*HXNulbke%;C2NdGG0aC8aHdSowaV8I@$)LE2xMOrUMsJjAgCf#6o{lQ^0C_z! z0mQT?6&{!eWX}?F@$UBqSGz@TAsOQ=v24jbUfC;s{7cNY$ZwyDYCie33D)fmgPt9a z2j!o(tS+~Y&j|sK*CziqPA~sn1aG|S@rX}{!5P~%JnB4W>1`HE#5LuJcm(bDL*R1u z|CfvxmmoMFj%6gw76}=f{BpB?0R5(y7lAQC;$Zmg9-I%c z2PXz+HALnqz(cVu`|;$HW>2uV8s(B4?{^t|bCB<%q(9(bkE+|u1E1ydA$KK2F(Uca zX*L9re^KC`TM(@J1-<#SMVgW_Odzo?9R%5Zc1eD5iA$oj>eiN&7le?r-dW>U%)IUk z?j^>lVZ-5&rEt|mN{BMMqB9ZilKkeMlOIIu+v5=~Un)E#Hf~+iO}~-kkNsZd@^<|G zad{_K4oWpaEngAKkhAoxrfXkp`ewqOytguO`y%HpIXykX89lXP+L|ueX0=8dr%?{s zb)X%*sPG`EUNo)NIF8FbDR>8#WAx5}cPP11!~ZfIgCcLVV#8eaz6JRYOP~1Gw+g2x z+?RfLEuY<%{HE-hQ#;uf=Q*+fnN2No+mwj|V{96AU>kE09cfEGaFcv~woUH7aq{5vQ`@(!Tm3b5*#SM`{m|>K zz`IVM4}1SW0dMF+k8_m}s3T%IfkT}53PunlZ0IHqj>SM9guX|L?IhAlc^tDo=&)iM zw<|>|#cQkf|2^{RmGrJFtB*J*RyLFJz*gnOF?qpF~V?~q8oiPc54hy6E--%EiES3s6ZSq`iH*?L-*z(M{*t2A6 z>xwb4ZFUHb_hW8}HkOfp zoN_^B6frfUGI3vbNH)p^C;ew86gFH>Xfi2zg?wW4{93rksCU9{8XwOW55^P8J=Q>a zE*Wsf!cmAPu)cggw#iL96waT$aNQ^U=5t zB0S5xP40$c%3gMov_ETj{q44vQROX8C94LE!B&%H;sN(YztL-8`rlq6kmqHto!6TU zln|)B7tOOTrpln(sMV(4^xue|P@^ENwjoF!MaKr9Y-3u4%V4DZfGpEG#Vqb-vk^ z_2*-n8O@K9FTNc(5`(X3SHKc*Q1t!T;d{Y3)r1r%6AV-=?7%ytLXkk_Wl#}R+=fFz z2>zusEFhqxH9txo$8I2J0-c=FP?a3&IB@s;dUkJOGczu~E4X>jDVbzx_okK5ihE`I z-dz09ds_0t-=9eaYj)H8TkpARCOCfcd zk@L2-4+a6_ckmaTj+Wrk+<2Gw^8Wv(OQ#iLLbY0MX7bx}{^aJ`cw7pU%g%xmz>rgC ztMOe27_geCU(2!|E|j;|qxNJG40Nn2kNdb8b>k}TA?^R(PCYkeGb&nEAVLmlIHRlx z6eWbT3NR1&MOj;l&nXcQ4)e?XR6XvW(uK(g3V+9Ojh?>~gD;B9(G;{5o&So)?c`fs*Yp?zK zmHvCKi7(mB8<1@iEn7HWzJ~}i7ne-DzN1eq9G*+~{%~mgRsJ{JDP8fySG+?^PUj^? z#TuLkUI*8vb+kpXEuZUP%X3?brUyQLumyE-#4-VzyMP-?^^2$i7*zs*J|mr=H;nR- zRwJNSoEt0@JoLZAFGn_+oI^e)Pt2%HET?Zd0>rf>zd$r!Bu_l{=l%`Llp(8OUNdiC z4I03gsAQfg|BCqOliW&n%J22M1;`88eYpej+kW(;_Q5tj7*8Mbr;T1eBoQX%b4Bm` zGBC{Wy459e)6V)q?5PM2+D`aq3mDr?)b9qJT@*_g#T5W5lnov5&*OF|=G@*BBSK!b!uch#= zhM8dOOg6VERi1qNscv68(Erb3*TEU}8+eV;kP5ET5q0~)2iwqH>nAXYzG)X)@&QM5dTJ`FnNYYiR9Ely;GGaK)LQV+v^S9Y zp#N7Dib4Q%{lFp_6rt#7KwJnb&Gi0#nFX*5>bl3|x6Ob3kw?(Ypdw%V;*Y;!4|;lD zZzO9I^z?9eCx7^RU&p)e&;1J$VDQ@1U9)H$IIc_PbSON{GaOla%Uiy?+;mwI92W=q zaQVCceSQFQni%yCqnU+QJwPcmGh23eTZZrU$4={I8kfE;pd>+MbkanjXrwM3Q_lX z$qjKEGI`Z`Dev4=#WZiLP0fcYk=6OG==;|~yXke% zjO1}&rj;K58x#c$I;8|kLdw0NP05gOS5jI9Egj*=bkGAy#I>}FRMQM{-T}9p-Z52# zUOIe?avBA-Q*dkiG3p0O^@BQ~VQNfGYzn9RjMVS$1eKrzKMKmL-S8YUF>;GSJrnGr-G?`GSpd-sPM1`>H9gI*^%5_{Sv( z<~bMA;ml+qXu{|X?fvc&Cv@U`zEbNyw1Oa-xn@=iJB#U@%=rCk&groP6HG?OXf^8K z{6x)G4xKt}nq@v6y2Gk>I&7+BeoG`<)V+f8Pa;9C+=hqaJVDm&N>1h_;>vC6|D$Da zqM^{6WLeIrZt6IjIqD8fh9h0EBDUr?7Mx;=x81gV{t!K$Pzg^H3%&CnY=xP=sQfg!_9q^GzBY!qNY==@&Xw&8TCEE{-MPSLZ&YFoW-4K1>aPBmW0T~3`F+eEj`dY) zv)3ybks=&&7H{5f+`Qzcl$;L8~>QHW)uigoz-#F0*_d2TYeA$4lubn>l^s~e~Vy8Zux zl7Wg`xnM1Nv!Px+!%hUr`w_9keDbfNZVGY%$RTjqmamvVb<$&SiF}IIX|aGxX7x)j zkfGPI4v&R(+6=ch#dgk?uQnyKN3@X=m|^ph-Cq^k!NvJ0sniuZ;(RvJa-3hd=KcBX zmUJ?;_9v1QAPSjwU;xJ@a)zAiYKTqG(&inh$a4SHu6#@^M$`_gqt4l@fjZW~!CHc>>h+;TR(r*P3V{@7Q(`}2# zE$DhWr{raNU;JX=m%o%jpvTI(5}{)3$1c9u}H%g z_Ekk+1jBnR>SS&!SG8gIS66bFEo?sdaGonwD}qm~H)_n+wmxtcIUAp7-Wz`L4#e&W zoNN=ay^f+>b1vpdjWrY`nC5m|2)zYRxTksF$UwftR4RrNmDJ;0-`I$Bg zC#+Mp>uocRK+YTp_#W@NCcNWlL-fgyzcFYy(3TVZaBViolQ_#(C5^N8eISbmC z45Tl2%|1!gc65T<`xN=ve*2mnChwH*{EJn?TCEx#&-3~Zmwjp0Qv%1vFY5gkA&#LH z*+NMSJH!ItD(mfnT|O;eJW`B_l}d5XDUChLUeHTitfmwVD=jvEO@WN^Uea#Alf`U53lI$=Pl zY?eq6(9fj8|0nD8DYeY{X@LGzC&1sy&q?U29}06as! zmG>681?Myh#pPnsc-~b~*YDbMS0fRhbl-TR#XT?EXIPU8lq}|r32SIB=#rXJzk{Oa zge3Ja0rXL^>z2AMd1|jO8xkRHqFR99o6o^q!A{*4S;yMDH*Quf-HmhVK@PM7aUX|@5uM^j^_5OhFs)(yHvpk1 zuaTm{3hIlc8rJ^tyGEJvK@zliY|!qNN4q-pK`%|)sizt0_^6n_$qy`knI<+*$QP6B ztLOCoXv}7an%Q_FDx2n27S;?>irL1K5Rm#-*yhmkQyKwRoKgRRVf!~NQUW@;3KVRs zX;NeVUQZ}wBl;Ors*ocOe)J=M*b5nw$99) z$M0WV>8mj-&L@@1EY%$WY}GLF0tybHc$7GlbOz$ z(r<0V${5J^e?-AzM4JG;v~NF!wmaxK)>bHEF0`aolO>(rkciCOJQavB|4}#lJx*A$bg5;GJ%&4@4yu7(*S9vt#}Z82Zn-uCkH&y-$?b8aUZ({w9XtCT#P zXa#7B0a?4SBYHdkWIfgltQzTi`4iQsA6{c#rJ3&)>axgi&gZpW*;Y1I3ee7nFLmE75JF*3#Hti zQlhw**;dGvpk72{uM}*+HrP!I>hK-Zi+7_EPnFeQlJE?C6io*dR}GnFrKNM2AW{Dg z{DYoM$_0XXK=O!VKMV>6K*8Yn4?=x_-DJy8Xdeant|<|1JGEAhgP98Zo!VI>wOV2J z&n0`#L|wL}0BkLyo3#d1rsAh3h{?ujiIwLydJZs&e(7(2gD|j~{JQ_P1$2XJu9~Kl zs0j_Q{SBQ6U*v^6&W+p^>t0FL8rC!b1Z5Ri_a0!Qhrr*VEJj7ugQN#zp=m!nyv(qWHds7d@8j1WF~LisCDA{m zN-2OSB8Y)UQlchYeML@y{;o>;GPZb7gyM(OAB3=;{68JN-6zm{<)`srp6(mtb)5=* z_h6~JdGc}6?%$EICbL;S71?%SL6t6Ge4n`d6@5XJ9N_iAv|8IY3kBX@6fSfaF+5zQ zGFh!5JxTPxuR0_@F26P!*;bKU?qglK*;A2DW3^owNI)x^y4FjQ|yb#2wILS0O3Y~;d4Dtu8|KNzyQ%R9!)k13g zP-;GTpq#JlPd@aUO(GxkRvnYGx{kH*e;M9q3#-kQs*m4bc)t6`pf*5Cfg z*o%Rj>x{qm??~Cgrb!)W#FS^tTtBU6L6e$?{1{7)*22rh3(hNT50!me>aA5Yi*a@< z!T3v4&1}_eZRh6YuOGI@f({_0YpDC;BD+jyj!*U)rW$vyX`Bg8OX#xs}zBCA7K@8KMR?-Pa;!AA@D2)4XU_ugrj;9*6=NBcDP21waf~GFoR) z4BE@1r2)c4T{p99nU)hk9@e5^?uS1_JDln!`8&|6qfe--hYZsin{HVJQI1>C3uDwS zX!w~&9_el%6K}=9L?O?y<6GoMH+0Eu%dI(b)toE2BNL5G`uZ2EG_Ic8-31BQ(Ouk- zFl-z4cTrunQ&2CYs*me{&Yq8HtguRSH%~S#co&NAi(rT|h4vI+9F^4pbODPrq$MhU zuQ5__wc>Dy@Xch{sWJ2nI1s~fJ)^W)!W)AeEPmhvzxoByKx_NCzrA~T>9;|&)k++B4OjhM!BO$&}P;f zdHtjo%^Yw7+i{UDrG1#{X^q}OzBAF7Y_c(vCBil*FKS;lSqD%6&bZIq&9-?l?&VcI zO)N;GaaAsKVSTbO+n$(c&wiw$Hi9d`Ra}g!q_Jv@k|4C>smhuQ;iIGzsV;!aCCd9n z?*ct51B;~_GvKVOQ);p)sJ_xwrWu}M`-kiN((^*kjDjmre|mh-J;efP@TYLnX+rp~ zv7ZKiQ9;Vae}2zBU#84yHTlLj-u>>UWYaW__efJ^vDwHIDz(MzsRu-pn-PLKB0n)t zKGXj!$md(sCZC01w$}rF!A{v!b&lx5kBJU@Aj{O-ybsd3WS zvh~dK@P{-iZb9p0*UP;jt8e+z6-`(!1E0ba`xXspP zppR?7oV&=*tS7q~?(b)0S3~mDp7~5Q>NJ< zJ$p%a+OScdHqF3_jf%jkbwqD$r#%g+J)MrsxLhTxyp7z4d0INde)Q85)m41Wp7b_c z;S1zrrm!Gnq_Vr}*76Rg$;6`&%uKZ$8L?`1yPWdD$Ck0njfXC)u{ zG^&6)p_czfA%g68I~0>x_lKdlhYL*PT;1%nbJ~U_MmBIwS0rvT)uLOQO=*2Hf8|Wu z3uP`HD<#Ms*pkb8nT)=JP@_iRKX+)6w}P ztEe?kD|yK!Ky>dMyAQjDP#obd`t_*R2ktC_wSm^hAhM(OlZF)oB7+idz$xk!rV|aI zhp7i*lpz8!WB}qYDD>h%vjwE`;7N|RTAajxQjUNI|C7O?QB@d~8ie7fUo48=NW_As zXxhO;DwbG%v6L>&<|J)3`pWst+yP-y>vjvIsyFD8CF`ul3@LST<*b?)-KHk(OZ`Yg z@AL$$#Xx6&K7B_j2Dzl|pa|-1hkSOqmjeW0(@g3m6vClxkJ8f&Ct#ieM?enKoBdPn zn2C9ZHr-x~O5IjQ3z4k#CUC~V?zcK~sUXG$Y@PAdJ(DZji|5{$DJQR9ptH|NR&Ubh z&TP3*+H>psM^a*=R9 zMQHG3kEeI~`pYV>(c_a0_HooGI=3uoH{I|hsUQ_QiTGh49CTmlthc?)F@-;nQ7RUz zgKEvo3KTE1+SFEoKTb`v!YUYf`GlMA>5+yffwKDw(nZoGIar;;yL68nLimA}2xHEdYNj(S!1G z@{JW!z|jaavS<&pxNMilHsl}t#9QvV>#onqTGXQ0wjO<`XCtyh5cH-6EoU{%Y3$@T zRFe0ii{?v=0Gp9Z9zOdOWn1aA`1>ty>t5PB+PSI2V8+9SfZG{~Bp*12=5MhKwF!B* z(_CHLQ8aJ8^?^$!@G{`7bmrPll@>c)28PuJ7Cr-((GkQxW61kYV##O{z+?Uud8I`u zB~{Zvo^<%mbQm4k7-6c4*3U>!Zx9NCdXA=WP&nbh6|1V;Qq|6ieKwv>&dQG$tfin| z{)7c(S@K zALhTBi$moTJ;KD|`LM&QMOU8eZv_+j2{zhlCALKJ!IfQAcUKBqXSL%b+CWnVZ!dAp zhWt}oCh23c&Vbb{L4~T1w4F5y#&k#kye}|x$fAVT$QEBTPz(P1Z z`~fholi1JHEg?I@`VHEqPjo+F+AaO*IAO>@{3P`1h0p(!`HTFwugqRU^5%N58OTN# zO=phj ze0|^NKY!{sem%b3|F=Eu_MX4_w~zmJ=@L%!kmt@lGOj<=Gk%4)Zh9|c9d$LBNJ196kd zOynOgkca!9r1D0HjxJp=TJ#J9B{iLyId3%jh`DUXhh{p?$)$CX%3=5FtIDgj+Ujgp zpmnRDHj*pKh-5(;fl{(sqxOUX_mR($^^k~TDfIv{NAh7?aB*SIrwOiGx8UhjCY3d! z`RX*VR5~S+u2Tr>v`L8_X}1nl{XhPh;H)7RqYI`~0%*1}j1h+(cyRg#845)O=;c2- zTUBsEmHG0sJG)MM^5~fpd(Qd$>H8+P?I8yFj=8tnm)*oXCEr2L%+Y>#gOHPwzPt;n zaxwoB<^s8+?vf8hKY7jXD%;1|kPXo!_!viLtmauWx$fhShu?8?`ayhtQ~HrFhu(cx z|Jh)UJbFM_lUK=6`KNzSIV8y-Bpn#HF1fQ@OP_Q(B1rO5k|XIM*Uf}tdlKp3N~C`} zBfG~v-nM+XZQ}ANL-{6po(y9dir+EM!p>Py!R+EDUNTgdSL#aCPbqI1Z~X)V4%c*O zZ(g9Vg~=cUygX1C{~hI>A!IK=CwXKYSOOUv50&#BRgZ}E78ynlMU0828Y>iwdEV`@pw)-S#&HY!p^P0znc4RX>}+gr?0_8%Lyu@D`t@mT$_mt9>DnL7dpV8; zP`fy^ibFs0Qf9|VcUR#xlXLHt)`A~fmY*Xg<+(~!?|=XI$X~zv;SbCG>kE|2u0k+u zSwzr`WbX1w&dy9R0$PzaAMtDejOy9a+$PsMyE&%<+4rmX<7UZuUc*`E5-P4p_#WD1?HX`(S0)iYI7nmj;wOFt*C&5U= z)a1Bi@$o_%ZFD(Nu^fpM55+M?EK~?OfQ@{OW|R6!G~ECArxb)FPpPP4=XX4E#}qM; zclTxQbTPPgVf=ft)oqy3xU}S5m`0ZKR;0T8pVx-3xm0b`*&v7U&mKKvfPc`m|B#7e zQC@>Ot&wUJ3)+U(E=o*9QMx^M9*-`UvqP|zN4+-BcR$FcEZ@6E%t%x5-Nlwr5}lT` zwg2O6Zfh={-D2C9-6lx|J|fo7rh*rFE}^n|Lh?Ei%!gHZDjd1P7s0aXIRvq>EH z-+!%95bTDA4Z;<=X+6iBp|Ic{|MDk4`K$gLRXlG&3BzVlcQt0#tOj9|_N~uycGV1E zHVe6l?0~Zf?{04IKhrtAwc8enhAc^EZ+g<@GN+Av)^1M=t=+BDJIpUPsW6a$2>D!+ zmAG^|X@!~{an(gvO+I3;UccSsSy~4{W{T}Ppf{9)PV+!-Xb^pOf$yG1>ki-zCa7@& zDXLtr4N*mh>Uf<&19OkESY#BGQHui$r&Mw%L@>ygP8Rwb#Nw1-Gt%z|*ClQ9c_h)p z0`sRa=;QRW{QbFS7f&BPt|+rmIy7X&DfuQ9YhzVVb}*?R=xi{dLWvL^zW%})BO27m zEW>@W5=C|?Ei>f?nmCzFjM|@MPIXU;;-u7nn*840bUGV?EV9fc{kOUp$E#ZxHm-iA zX2gIzu9%!*-VG5FotClJT1|)DUanRh5Y&Cq=!M1sx<$S6sWxeO{i?^Xa<_b>!c7>W$}(y<_bC$WN)88+yQDN1uW-pvefnl6Ii=Gzi)?ql8p> zJ#`Di^c4nc=pks@ss#2_`ES5M7-YVP-&6^FoZPwTXW$!@W|dLjCT2<2yQc)Cy({@` zyIHUZ=xQ^JZEO2%V=!5e@1KRTgF&a6!+|sCwd7zAOk%+>t`{5*d3TY|uuEERB*9l4 z1)Qw=KQ670+Oiwg)};exT5GuC3ieN#K*Jx4HXhJWnfIt@&Natt2_5e+(Q!P8`lyJd z-BB(V?GQ3!WYY2_Y+bWpcM^TGa{1EYmBnV^jXQG-abRDz2p4E+Ynj)S-hknL*{f~p zaG{zHs4S{bpyUdTI+V@ePnu zOzN|{1zx_c9;kRL{(M0Q+eII5plCE$^dOK*0h`Ii^3ad32pJOx@*PeUY?cE$diTZ3 zo6jcL$L=Og;rZMu7k``A_*% zN#A%d7MUl!!Ci>wM03%}S=FkW$fSH>#5bPsC1=SEGxkKV9W3;*x0yoGnYR_Hl|QFE z&3ci`C63%slG?#kWJ>rG6zz~Ck zvEK!|-)*8;lCEh5>qs|=hVXZ6W(xDt7kr3NzMQ~nkGx~Q~%{macx(7V#;4~bma3H zDH=8Lc5Etw1&vx452<~2lh-5axvpOdQV~|99WE`M&heGJErlVXzWhGeK@;rYo3N+B zF+Vs#l&`gZ$eq3%TC#6Y?l5TS$AyvMf~k9@mzVafgMgs~!pApsC<{3dpDim8GBPF( z3KdkP0*U)c!gePZTnb-($ly|xPzReIQ+~E;d(v4dWO0IvhjYH{jtvXm+r9yuX4;t9 zx^urA`MWh537Ujy5^0~aWnz`I+U|*9Jvb|4ii_Q*bvhjymj=<3ntA)elW%|f+sVG% z8Ohr>sjQy3M}8p)frA>zUjX9Yk-0 zd~C!tsr4obQqRa46PS8fh`1ne0oC}rTnPW4F9`R`*HaExBDDrx>mOnUG_SDb=g}Sp zac)ii26FMKg~Fj~Rer8;c6N^kb92N}7{y+$WVIEzp;#W5nh4r6qFD44`D`vTq5NdU zcUi$1+^90ZqesAu9-t;WQ0G0ORC*~=iv=8Y5}epFB?do!L+xmPSE}U{I~+DC(Y?Z` zGsVFd3?Ng=7QLTw_;l1q|sWPS)Ymf zI#&7SMU7x=bK>_H2I?Gnf#-s1Eb)Qar=}0!As<@-f`{a8H=pL3!;gUT~o?oxPKJoqPvtQBK}guq1v?@ zBYgNsEaQn3Hiq1*>3nL%WsjTvRYx-DRL!`b(@csLp(z#RFGK9p=n0`i&7+ZhMRLJ) zD2ZP73WJw3auzB9p{mvaYL`5vkE?+8n9>ga&h7JNhr_6_9CqqdZhv~Q@LVlbG99-aKy?|*;Q8LwotVJN$(u3+{xuU>{x6wMv?crdaYsJa)D zk?mo~Z_lo6jti&ttNzOA=~(d$QqUOmHZNy3g-i!~cJlp4go=nR4TFxDc_RvC^7nG- zC0{Zy?@&AaA*xt4e3NldQQG3-D$jQ?=6K}O>Cba>y8>mz} zVDvAYLq`T`kp^>MLT$0TZ8o21W4gMqXbi*>oM%od#tuvnugRvbrVn((-Hr{&-;Y~d zLC7wJ3ru*nHuLUilNZZOWVgqaNTj7?ce~Kvse)HU_X|F`<-=5FZY5+1udbt#MZg36 zFWv>dJ$dDmCIlgNvAaJj1wyGOq<;#XONtnx1fe(X{}Co1)xrBFEa> z8eEL$V_aifyZ`%=Cm9I|QQyqf{v;{LKRLC=xt)T!BUbBBA+^W-e9UKbTa2_{2rM+v zR^4uh8|w8Pp^!_MQt^#phTFDHe!g6VbT;rgKeRN~gDasLX7zS-H7S!ukk@k*{YPn7 z`CX?3RUvAeDennl`vX)CB{kX#Ls=3^$#S5Kc_Ld=P9PF}PyyEeYG&6idEc+5_w2cf zybJRw(4K&b zDwAaU2Y>-KZB+7JK2s>%y4kQ5Q6<*Hi~M3IuwE0Y0~>Ifb|6oqcA28+^yCa>a`1*> z41qRLEFESSnwnUZ5mc!{HP0MhW&Pm!yK8{ z6C@9c$V2v&ex{^K+C7ReA3s%*d%;=9{|O~as(eDf9I$ukrl8@3R;HPMYT9W*hO^tX*TLi*eEn|`#vN_IYGAUc6xH5a;N|EtJ zLmK{~2POl%G?Q_I2i53H!~-9c4~^>zF)r*Cn2t6Y5$XXwq*PVKz)DkNQtJbpUEr*7 z)*9iAl8aNci8PGM=Y<-mCmPo2%^Gt?XmXJ`2q8QdDeWnUn(X-0wn)y-m0_oy(CFW& z^1#Z_e#ui&Lpg#-=bcKVqr>VW6&vc9)4jk_=fK zaaH|?Nrap+Db}P~u-bnU@dry%*&h#dKEbFpdYvgH__l4CMd)Lomrzfov5>?&qtOJG z7-T|OJ#NF;3jGAvCeb_ZWPVVxhgr-%lzS$RSxh)NOTq!gI$SrK);}Eyu3Nt@)V}hn z%c_~wE3dh2MVfL5liqgi%9b^iFFG;AvQ^@^n8}244y$pS?rydEf6Qi2!Kmpi|NXVE zy}ll;xhhgMVwXhGCP@gF8Le99fg%}k@c@i5S$W)SS4IsGh7`4y)s(N~jYgZe-p1?5qDF0t$6qJ9%_^Q@L-n+f zl8TAd@#tk=aIANI^HEoFD%EpWj3@_?{*8Gfy1;ckFkn%(-KAx2o#L&`qJuf-K=WW9 zPx;#+w5XcZ*|{)JbbQDo_zFReaYs@-5gMnRvN>w=apU&(j!UvI#clY1E*@16I*oj01x-K+`mCQ4_MJj0V9SkC zW6B8|eeWg7sZ5j6gMHi1&K1wQR|^qOp7fxD@9RHYFxYK?>WvbhdP=juZo=jylSE^* zk~_#6+P%cBjjjD3<^BI>VrMkk1lc?5_pg+?XL+v6pg9J`{`70&JG&pTx)V{SH4ze- zzb$#~dBiPY3gj=Vc%fqljDNbb_8%LK;pIUeBIT^S5p@YS=6?)o-#u8EgIKA?(B4yd z1jQO)p%4O6$34P)aAx4X@% z(X!a^{nYouq9r3un0;OsXbcRwPre{6EBDe&Ge#toQ5G;34a$w0_;P zl9Mu*&Z6Krpz^&?1$g4nj;F8K=8~q5NWJ)(li^8kvwv44^8Lo1SlOCsE#=l3aXb(_|Wy%ze!FOSW9pHD#2pNr`SX{o+=|(mYG|ocykLKgji&vqig@N`~et43o z2I}cbZ|flDpcw*{JssAB6dy#uV8Z#r;7?4TRBq?cwo&^=`6a^_BT5`)8}tU!6L}&^ z9yPMkk=28s4;BIKN}MFfPdLM(nE*Iqq{VfsLGQ*p*8m_9o!xFAklQ%8@LlC0e|%o4 zGLj#v!(t(uuq6{4`=83#!qy(*Xcp6(Cxd*>b5|s=YBv_KRrPsEYCnjdPni z(T9%dSep4p${AdX`^>RK)Qs^SY8Rwv8}ch1me$I)j4`t~JtMd4)_SbO2K^G^Z3Z>P zixixf)`==g7tuv@8Z}C3BF)kebYuFb5{Xd@F2g+V$P6*aoriXl9y z)QfP9%BLzqN+%d*gRSwAoG!<4{iBns|5k>t$}BV!ymHPSYoqsF}t*wN$yP7 zT`8|?W^vAq?FpHDtXqF-#}<$)68cWk*gqYCL)PZ0yPXbJh>?WaW>@*QRe*c z6_74>D8E#tq%EJ18%p|cIx9b?`R8+b-Y=RXtY{6ePW?}Qfb=Grn}Zytk@;Y=r1wRl zY{C|g1?6kbiJd3^qUp@WecFy5^QTE&{$0oi3NScFTGsmOVB7@U#haIPHLKq%nQD#+ zX1#nqxrIKzS;OR&gehT;M*ZZM8|CMBdm{K>kaa2p;hbBDcH>)5`|7$_c;n7f3Qtt~ zts0llC(Su?ES)u;8sBnR(dZ9FZ2>No2+Pk&{talY$A^P;ShSg{$6pNbwwxuJ$%~QP z9-vf(NvydUnz`>(orQN4hsB{&D7Imy-PORu|6}YnsFA)!sSkp8Nt12V2jT2-z!m5e zYdazfivuYUBs)sj{BM3&)S6+zhXXyRL8nTkG~29+G@U=5YYxm0=tqdp5(DNn{asaL zkq@|?YL78u5p;Ji-ZKB`da}DieugZD8lg9tf6)JK4zs*`P*;eD+{`&m>L2w*-Y>cP zH~HB}G{Q>8a3Vo=m%!@svjro%;rKr}z2Fux8kAu<*T+0Dy>^SyVrul|cHwZi0{!~D zxt-3NrvVCWyBm*R--5@Jfh-HCk1V2iBL*+O{4(;MY^^ZgwpaKIjR%_+_+CTVgz+!^ za>asV-<%Vpp&%3M8BiP6H`O-5A(tx{a2v+I!XFHNh;;{fH6)T%Y@D^ltfC~s-ti%4 z(eLy8tx>*kGVht3>dG$`Q@bMJ%08wrQzwgGpr7cy(W8I#IzV85#@w~R6y8x?W5B#S z*&>CgVo^-^7f-YOKAS_OMkQ3l6|v`#mW+6RIjlZ^|rsyq2JLsrE*?~P!{}oa&&t7 z(sujO>FKN5ZG9`at@A%m_x1(qu0w0hEiatY>74U|Wucj9Wkck>uHd)_0)&jfoUH?-9M#tgx)rG&)8?izB=};vHu$T zA&vfNXX1(2o?=HR%~VjO#aYA=r&KPb?5ad=Dhi=sv1sl+q&W@B-spnFH?-kA{eh_a zVcD>JXltgSFkQdIfN3#E5%E2`*vHApP#iqThf}>l<<%$;LvB#X73n1yjd8<*Q%A0f z@AP^%pvgdTa~^$CD|ubi8T>?_wQ3kHWL2qgzGH=rJ~p1oIWxXoJYe-_P2+@h%y9;< z&#m==?xhtZKU?)R@?+3h3K`=1$6|s@0g7Vh*?` z(kTFg=g=rE!C)phli^ZnBf!D;nI+NBA4!Y#e zHLN)w`jrHAO=snuY;aw!Y%B6oF%{6cqklqiGMBT5VjIXFeI^)8xlKU9RW^@AtAdOT zg2jgDx@aXly|SzQ16tw*F`Cpd<`C6z6^Y4t`I`l2P;y$LM!V>Lj|ticSvw{~*EvjN zce#U7v=p#>L~pX7U|e>l<10bZ_K&;8?zc;o3Ych!E@Z@k< z8Wc@H<%rI`Qq1JP|2D27BCz8S(FjLESy?${gMPY~1bme6Iv9*a*Q8Bn0 z^0kw5>a_zM*F~5J>l0KFO*ES_-0V58zZr$&L`(<;7UCsW*yA*Z_;Q+anG$J}BY^x1 z{R0&{avLj}Q4M;X!|BlL*^Dje7O_pKJz>~G4|HL6fG0Mn77kFV*v$g4l}p`%Cdc=P7a?3IO()h7w+jhr;KHxaz#10TMzdFjH!4I4JxpnTr2 zLB6VBgh;i1R_`<-sl~!yIs<(-Ei((*H#5m!*f=emU0e4v+RygA*oIIpv%g-OY;_wm zjY_!Xs5om{GguDGE?v`+;TzRrW9EX^Mcq%%JTUoCw>3#VxZCf|XEJVIW;313U~~1H zF0_X_qtnxiX?&BnxJLD9DnFTdXKR`o@eqBOi47oF&#S01mT$be6Qvu6a_PjJNO*vPoSi zA^(?Mw7?V*%@$~nt6A=`a2OQ|S=-dRTuyDvp8WAg@gP45BrmkrczaD?93HPB%Z7YT zrl>bU!5dU6lUeJDp-=V;!Q_QPjRSFx5j?(sd6h-yiC~Pt6`fdDbGPRxTZ&sFv6!uY zTTV=+lFo=T9*Yw$+A!&vd7$VTzwcG#9GOo*S2Z5*2J8XWiy6s&UXyTfB^!(|1pjgQ zoDt8B1vXbM@xlBlhsWvh1 zMjCq6HG@k0dlh=rHS(z%D>+?$9ZF@IwciseMvtJ7G1xr9LPTOT8#P2@mIMKZ(VG=ZORNUS6jZ#k%>6s&bL}p7VsgjHrX@DJAY;^Qkuk1$@vaoPNum# z$VA-{Uvma{m+0a!hRqCSx7Q#{9(%sw*geZe%;uzXn#$rKi*msZZi5{hX?lAU-K7cm zD@9|3YMv={cVxL#>Uw0-sEMQ1HYE^(CsPz&hxd@8q)MwGt+oC8QKz&wWkmdA?zvfZ z|HlJN_zz1GL{1=w?fTGnllY3zW#uGoAibI!Ox= zHCElzi~pCe?*MS4Jk#D8b&WKdk!Cc~sQ2Exw5#oXy)JlNaRH3M0n-URV0sIk0D(X_ zItc{G<Jv=cZ&p@no*nf>>L7ea23Yvb=;wNX z_nO7*;3=?oBnSQfAae&Rb(BLFBip1Yhg=>*EyH%oyh(PccW1e$`ES9qyfg~l<#L6Vk+vp(jVRukwYsfSAL7n729&rE-4WZ z(M_18pr^r!f^Mgn#$3w}Vu2k+2};!k`mDLq3^|*mW_k^Hv+Tfe&x~wFkMq#T74Rw} zZ}kHX(zjIWRBAjPcL8kN6K!`Zr^_Xb=Lnw!?Yuo(~buao4 z1?3vyKzF?K{0tCsd8qt2F5%L}nkSlDo@~nA&dh2)F?LeweQYr~k!thBn9a#faR!%B zmmW)PhVG~x+EdCO#Jo=)jpt*XYQc4Wd^#FgDaLo*Jb9$CHB~-sA>28%e|JvN0`4FN zAiJnDn6#k22H*4BXUrCZ2IFU-Z4HQ${&HCNGF2kuDd?In90nx zE3S@vvL;SwuJRqw7Gg_cF6j56F7qz_QghYqiTh>Ss#I``S!ab0r^=!0Vl7!p+N*)x zOLu46l0V~Y+Tzv8G;NzO+VttQSke*#yM1q26Lf%OlL!I(=2uq2*2o6Xts@4=fG>Qb zMmG{fmPsbpPDh>KQta8)gzb#Lr-rEy={65~W2mPLZAc7Rs2XDR2?^INKTHkkITcYF zGDN8g4Uo@m3|+vWZ-D*Q4PJNX(TSZR;TQd%GY56yL|5{I=M2;X@%iblKOP-#RU}GJ zjf$XzmMguV&OH3^HP_sCpIW1Q?6K>we=u=f;JQ1}mFKca<&Pm5g*77QXca#%%8UV} zO|H$z(CBF*G?srqkHkZ}i#pbIgRrcAvMSDz&`ZazBo40XU*5=JltTg@s&;EU>V~%MH{ZrT_QZJuHUHFO-(Cz*&^8$d5{QbOu27rM9qLEmp zVIYO_7f5CBXYzy)FHuauH6nyEh^dYNX_35x45E;n8GmyO`5b)(YP%nz7BqL#@aa;ntga5<1x0ilE-J!)~o`m(RVkLoATvT%1H^cuI&S9 zdZw;`nMUB87B1{_k{?EELE#wDr(BKI{M&!Vr!Cv)xTYxH7v01QX z5-=YCRyBh0$p7Ss*jS=klgz=N^&MLoX)jRrFYUkUIY;L{>{djxBdH>EkFW3_mGKqlR zpxt29b1ttnvN=dO&wk>XGn)lR$nF_4P1IYII9nZqDndi!ch{|U-9q((Zh8Czc-o!q zo5zd`N2pefi%-Ne&bYmIkw$dXMX8GDMnL~taB#+`539e( z{2E!c;Zw~tun!3=E>88J*rRd+^#K-SX-NagAqri(GVn(0r7`ME>fw1%`w@CShjJ11 zhndyY+c$2!Wp$OhHXa*qHGJ~q!b&VQeQhh;5jRoq@RXvij=yro+dsvZWlyX3(zHvU zXQd0EMop_K?^spVszreuI`7ms$qTFe&-x`ZYEWHEt&;7HqJWFhf6?`kV zYe2?=6Wm`h!tI^_%9ilS4kiF$b4fc0rZGf1yDHgm0suf9;YMumUUN)Gn5?quut^d4 z?^#(?y43#5S-i~?i^E@)?z|{lbzd}^Sp#rT zQz2KSl;h;7bRoH9m$Quc<3JfW8c%$S0=0s7-T1`gYE1e9b>66>;H?JB$^qqTGt`G` zDeqVy6rA|0d)s+q3n6C$V}!kZR!yYRu0*Lvz-(b+MVqZLIXjv&glyoh-;7MwjLyXV zlHG{}0L?9PSHmA#J+o$sh(9(2h$s{DL)3BK!FUuCc#p+}0oWOvg zgJv9V8@$pbY1d-hlU}7>4Nv+!bHGk`q3yOExb*;T5<%EruTB_XGu0?aEy5q&?twYS zVg#rH2GBrs4U>lFnC~c7@tf8c4vHr<5VuG8&z%Ri2=VJ z6bJ^177zw1Sd_qVBL+#u+>u@&mPVBf?c>>Tdx={>B#RA0N%k0*>Qg%<>ILoxul?;? zpO7O9tYQwb1gJu%y?0aLIo}mGSpq0c>)mF9X5J)${lw!j@pdDv_TQ5AVc7dCx4%(90I;hd`~0P2aZfPfve;vPS)$<~XY_ z7BzUdVm^Z7ijueB4Orh9oEmSt3h~XmPaU1CdR-;4cZ0^@9rO7|y&adllK#NS#y!g8 zn?_eVx6_~A)LmP2){k_JV@F6oHjWvn9jN<>n3f^x$A=Nu+%)o!BQIku$%+gXhy*35 z5*SF#s9Lyw+XD@6QpsNbBDI6EUfCg$J4V;~hq&JxhdCQI5Gf754PJKe&3(Kj!cx4R z%3v_a4uFrA{DdkEy_aEnKxr28p;5QdYUM5C?xbJT&oKfmcYl?qZIZ`gi}Eco6_E|I zw8hF$`WUq(K7QWm2a84v%QIu1n42>$U^dQT5V|3XRDM48vE0V#y4-Tt6UAh!=Pih( za>3CG7BV^Nk-9~6y7^47{As=2A)4k{$>A`kxcX>EpdLdgsq;jwwdsZNydfYV_1+4c zw$W|v&W>9A5^SBR&IR0pt|jH@7DWBroaB^j1+g(U=5csxjJGZ{j4b$+Fiy=@yAvLV z9uQmu13IjEAh%0#&S`g868`4c47x0yL|zn<))&x4WTPD4xfJu0n%|TX8_TKE0v&1? zJ&8&n9WBRwio3$OWxtRNXQ?k4yuly?rbZf4y^OwPh<8?Uy|3^h6RZMuhp-o+Vl=E3 z5D9a9l9K}9CBluPt&&L+@5`XBlHtRZ9XKxx@GIMagJRG}?z1eAc=!g)l&qtdHE?E) zAsZ6uco8}tOqIZ`^>r`R{uy=@+Z;;t3wJP!M6IkGr3e{Dz=JfO43|X0gF}YX zQE3x34CsXnPlracy=szuK5GioroL^;Pd@&#QTRunb5dh+gxudPhp3O)KL0wQ1MJ(FNOR*;b^U%M zEEtj#qMCHAY>8ppmDPp?+Lne%b)nr#&C3gb$f00mh)FMdmy)9i&!eDD-^WG@^XY4d2_^3rkss@=e>B|YPA@m zIru7yI#sB!$jF01SR4#nxgN<_6WM|@ii$R-8%b@@`R2XQzcE4?F00Og%&91&hen6+ zlw=szKsSlxoX4_k!z!bxs#3ckc#8Fd7h;bGK@76~zv>;Z{GNt0foFwm>hKrDbhzIIA8lNfJzb>fIs%%NO<8SJB3IS zpYPIfI6kDXEIt^H3B9#~H*gzj2&*23L}(D^AoxK9(=SM)4=13sAHpDl0Zw`lv*Pb- zc#=BxFd&AnRm*+Uw~aAd4pkTn{YLK-Fl7^GR3HF=LxCFrBaYpoS-~6%$>5HowA2RL zU^Sa!*_=J_N~GZOwca1PjKgj> zcOBtBGC3h)af?=JWy`xac&BO@zBI}#<6#&-SP(I=Myd?734IUBrQw}2V@7IDMO_P= zFJ-p~JVQ@tImyfMZo5T0L3<>jC^@1&2US~M&G@G`p4go^^}rcRe2TZj4b>ljVtc)Q zsFpM^to~hBb77W=Qa`S}2RB*yd?_;KD*7h3C4^`+C5NM%5Vvxex7>-i)eg?etJHai z`?3FI+xrEi8p_)%g$3$KQ(PM3$5!KZiH0_X(hD6Pr*Tw>az#I+q1&o`dIZa{7JotkCDX(n((oq|l`4%}K|!-qhEzBq(xIZ4UfudaIEWA;aY$QEHQu!XpG z_=Eaq5?58@h>An&fLzp`H0n4JHZjrX1XjyeFww_2hyKO^IEj}e-QQy=_0&^9A7v=j zwBoeY6?8;=<=~TADCO`0>y*$8>CB)T1&NWSqvIJedS@~VMn3D!#p;3?VG8wq5}1I^ zvgYuM7836QzlX_m(7w@6eywJ(^5%@iVKbe^NNmZ;dHp)GW@d)c%|kP7dFN{t!L2W8 zFii1E5Ioj4ZCC3w&QtoWu=(eMh1sB)01F)bVvBNk0&Gsm-|X9V(rM+&c?;t44=;G~ z9BbxH7&--0I}2VlYf=ujz2)>$vU~H@hl93-liuEW+e7u7Z(?~@GqQQphS8KRjd))+ zJ6n9R_X`i@OIKV7##6q3RK72Tfp4W3jatesQ0DqAmNZf!wzQ|Nyy>W)l(PF;)eL>n zMlTQIYzeV>R{b8MA|p%^V8D3wOYr>B^Uzmp%RTdrKCd$8Ag!>b{twL_>rolhh;}-17|F ziH4rXXmDDwR;@lX1KN7g6QFm#D}1V}#K&_Nwgsc?bsI5r6V*srdc=ale0B=En^-(P*F*k@#kHrCpGk*|S^Y2lEA& z{A;7t(D5BuVtAd4@|pvMcyR5?SMhowzbR$*1p^OPLUh8xXL!6tIAoDvZn9ZidO7Kl z9|f-s=&4j3XO$ws0CG0c-#4gH0A2v_4`N%u^^NziJ;aFPqxIsK>I&2> zPmLI%ul*D^#Z!XzlhXjgc|Tl13ZlpI{5|7D9ZE8b3+P zXt@~A%BO+C-MD5ib4=21Ny%Af%B**KgSJAT#bI2@!g87P=o`vMKj+QTBir5G-j<{* z6^}cEzIZT1J(A=Lg(MWi&5X{GNyn8VslaG30ZqYx>~zI=IbaYIp%z9~99f6Q?81+B z31*3Y&E9qb%*dEMvg>(kWO;cZ!1=&-teoXZom9=pX~?TSq_-Ow2ZH)5MHn~aVUdn( zO-Mzdz+ghgWvXx~gu+IM7nI`LQ7=7BLDq$sZXENq^Yr&fHb0mvxBzH1bXtcnGf<HYQwc-yUT8qvgJ}CPcNq+@t z08)={U}aOl@1j{(9C&GpI%RtQGADEZ2nq|h?hF>R2|8N30% zISyg~|7VSQon8(n1+mo~bp-<$Kq0_k3W{YyvsK2=gn+i9X(h_+xY6kiQGdPSiXDVX z>goM>&^I?5@!7Bgbr@GCwYFn-v01khifOw&?GVyD$fA8&2D$w>P&yRLbJ~+mIzVmc zeIaax>Er_OW%^`@(NN7osT7@GKCTqBMZ^BymrFWdIB3d~3W83~A_C;Vra~TpTtz~S z#+KxbCN1Lk`er5HA9J$s+6ZHg3Hfvg_FhK*E_^;l5U{rTJHuD*Jy zI9h&EQ5LDY7F9M?Fsk;RTrlvgX;v%H2O8}Hy}y@%%2*p(eNx8g*CEsln*Fo+WEc#( zW4?~vB}(mX+ga9f%tzl_8fU$HJgX@0$3uIu?{X#S%~Si87am;x+{{x>h2l{4uwxOd)i#Y8xb7O5p-(}N^;}ezNC$jyLEciFK%|1~VYosOk|nB%se?3PVVlV9 zSa0GvRF714_OBY%P&1Y;I_p?&I4s;F$pQ1I8p!pVhjmsLn|86)v92rb8?6`k=fAC@ z3xcZ?OSisiD>WLk~x%hWHNwQ|Z_v4vA5 zf9sGVgL5sM`e5j?7LXz#rW)LwexxAyW)~KNMi0b!sqM!hu+me-r8wBMQc(tQPs%-p z1Xp=RCN-uQQ}OmBt~eJ};zvi`Kk^(R&W~V!`gJ|R+>Id;LRLnM3!yC_#$@nR z!+>LBP?BZTj(&oQ8R~g@9Mz;j2}n2i4h)Wfnnx`;khBGt18?i71y!!dzs`|%OcQMV zCs#Bb4G2?>oX6>{cwJz@@Imnh+zm>d`px$~`q7Vl?5a@{XKZU2#;DXXmLPQJv*sX* zG}|V0dRV3U0V)Ibt$LpZ@jM# ztt}7(F-ccs_x2eEJP4>U>h~gb!L$_XsJGjaXxGy{Wz?0!1aF$U_*(TreMlG1H#}e+ zcNvVDc@W~Fffn-lMy(VGmdbcM>Gn4rA`=L>s4FU#P$Xbd=S-AI6PJhuO=dP6jVM1) zcoGqyu>Gt5rjbHkzd$(x{$Ripn#?+AXD}9&9uH>bgTct+t)<^3loPd*KMV#oE&ijJ z{;veV$!dY5Ow5Y=%QziSs>Z)VrxiUx{>e;eUnx*Hk^V`wTq%{&H|5YbCG~{xApRh# z9;@ielgTck?y=4G`tqb5gIl>@rH4a3o!$wCtCk zUDmtUDFZ_4-t&Z4MmIzF8P74WT5p1H*?iD2APPWJ8z~Dj$#NfC0s&W^RGs45QDm6LYe||8r@;psK29sSXcy0ky2CcOr5sD>Ne$d+dElm1$?G{qFClsKI=)1$Hbq~6UryO&G#rfsVCA}y-{OyxWUV#IDMF> zCCMj32dnod4ksD1=>4i5%s9pz1^TW`sg$W&11uWeRps_-`u5w?)tB?-bXw_T(yQ?# zP~5S#QCEno-gh4xxT}0KC4ftX7cE-e7qyFJ+*peoWCfia^{{6Ov2AsKX}=nadT~cr zzz<6BGd$S9GVrlPL3?tbU;~VQt)j!T--1C-sK%K{7)UpUTul;{s{YhKd?_v_(b$B` z6m@t?coMx$@?KN_!4H%_eCu1^95uOxn#B(Nl)wGQ?5}_QPt-qs{6BgV+d=iYby~yQ zFpUlto#%Ib;5cgj!V52)J@?#mY34iM{jT!0aPGK-U(Uv(%9fjNZmv*i|;gddR!-l$85u7El{y++k1{bo~B4`TQY*DuHg+0#5uDCC_Dbw2p zRqd+aEGwr8=F;4bBD3v!rP0(0F1LlcSh?1nhv}(D5@LLUdZk%z7gg;*6Yy^Ls(#-N zo1TX~pF_WI6*lMix5lj`3B(FOY=}gx>qdz5-652TWx~Z&qpHCv5=lHjEI!VOTI471 zN$5rptEUHyi<8W*h|=4Ddon$z4qEis8>Gz&;R@< z<>P1J@#2|y^sb&n)~}h=GIY6jP(#b3Zuh8soZ#M8b|;q0^}P+DEIJX_?5*Fm*WmVe zjJ?I$RHaJTg{qaQ8ntEog^3EDIU%^Xv=B5e--@FI-$v$@iB<`iC2?cMRIf(j(hG=Q zs(J%dru52?5gdr9b(;*z!U#Dkqzs484*MB{?nz!nU#>UHq34IJ44gp!V+2FyGwJ_) zb?#E*X8SGPNul6@Y^=xK`^n|X6L-DueYRXCqH~rG@13{!%#m1>d33Jh$au@%!t*-T zE%2?Gg>JzZkU+*n<{l_iy%GltE|*zDE2b$|*gDNb>BAsx!b3U#OJ8~=mZN@u(7si1 z{4(7+uNaYNXm=DGLCM1#G&)FFO2L@pC4cSIaj|{@eb>zR%*6E0)75o0L0clM`Z$8?>jF=+ z0hsYMFuI%rKSv@6G!F-{B?{5}uy+8&{}?(#Hx@K0VOGXPleZD8Oae$ z{Lh!W0m)Pi$jd^GddjVn{XU~Z_waj<$3uDGa$3JpN8OsTrakgRFdCV0#^yp9J{k>L z0~zMy7eXP*VRD3jIsJp#9eDiC&w9-blT`=VKLA9o95-vCkd zy!wgFTx>2J2o{}yN^(+LayOs|>KdC~h#H!AVqF>JpG1@853u_-6#+<8xk(;MxFCs^ z7K}Sqwtr@^kiSh0HyxiU$tn5ts3tJVw=39(q z;@z{)5|SYo+VzV_-=p?(pMLuM3F^~5k^V(s!R4M;E|te_Sh9}arX1?>wRBSmdffys z=>g7kRWkzq*kLqF_+GlOf2+vZ50Qv={e~xwA#_I8uG%(|oDZMJ4%-YDbT}f?pJ*bO z(}4*+nyU`iocLH`JLuk0@73L#G{+ejO&$MEmvz!28mXJxn{TO9&aG6=tk-`u{D3;E z?ydPP4OH^BGU%RYd zxsC#hL~$)8$%~QRPWsP*uH@?WjOP5tBpcs3p5l^Om{ze=OcT3m97%v1e-HR6Nf**N zB4fSDB+hl~C=x1$;aas+Ib2QhUI$A$fI%jP2oRMSMHM(f0RXNa+inEJ~_`q_gA0xxi>}gpgmxrqbD#~3ub7u?6ztdMOUU}tfC!Fx)l~+>d zfq>WVveqW&A=u=TFe8ifz`(JV(b=xW;leyj?{^JfS_H_4mJDVyz=ZYj;17O4o$jK)-x*Z59kAo;d{e+3M5R0c>iS)`HTgz|rKKI;ZOXP8# zlnS}^TAX4~TQlLX&z7=S!xl!c5#k?Yp(Y{XeY_BzPKL58^k)bY9(YXkQ17kRn#~&W zX+Spcby~W9!)Gl%E8aePLrG^Ldq6PNH)7sEIR+U_7?byaL+fI~j?#~*k1?-(r`|Xg zYYpeG)*$;8W&{JoPy_G-el1LFg7i)WC+Z2zqdhD*{x6teHP0Jbj^?$Fy|2&)44r@F zp!+H15q7T#i}2XI@^i{bo_EyH@)gZxXX@p+Cnv?^;$bLZYK*+k^&zJV;#-gnMUV{` z#bKk}s5hZMtIQ`^iS00~0l)xggddr93NuguVqYC|$E~Agl-8+#Ywv4Hc?YH$n)}-K z?c1k_7$g7A8?AcxyHRT-7GWdt*;G~zIrDN#ODuI-CaGsQSzHbHsCi2Y(k;p_9I{M( zQW*n0EGAE+Qk)!JI59Lw85y(o3V$OI`qaHzYsRL3>>iyBeVpgtiwTkIsEgvtw`Qpi z&J)(J-mW>l*`TGSwfd8xI%yUhoNm(Ov>@dsGX~Nr_EOX-AX$?9`C!LWDu`@;cOiG+ zl#{cC(YqdeaL&;z9GsAd3b)=>3wLTRRxgQfCyKBJ<$^+CEua6UEAZjxu4quRoIJg- z6r!i^rb?iwKp<9cxV_mu>E4>g>_Tmf1iavO#T?~64F!9|tLjVd1Ulv+l{@f#q|bh| zRx1tcH7VI5yZ})Rsl5XSL8`XMkp{|w06-wpz=arW2|iLGRzN-Ais%#l7zHI;6-N5^ z)ve+DtSWwmuyA;H5<~Yfa3{#pYASVdqK2?~@T2|(&{9I~SB7%ygw{%B^DT$lZ}_)- zzMC&lzzZ6|dVDgQb|$q>%o`_XU(gA>#bul}Ivh?$C$VOu1||pmraHR~v&VU!Zw3{y z3)H|2PfyW$qu!Ws+e_s<8*?Ls(QZX?$muXb6U_*~0QN6YEAf@1}Sl6AZ@ z939NTz$a=@O;p{8O|Y7RVUNZ+#yIU3_>nyn#|xceyi#Q?`m2sm27sv^s)=b|(I!ix za^}HDAARA4+i!nRqwKSM>CQV}eDTpok2`_}5T>Nhr-=UErJp+Qyt#u1-*@7PlsV;$ zxuUF75Vk4baT3Ku_^u5UsBeA(2?~v7TyM4qdVgw3QKoKW!Loa?zOt}2k!mJov%!Q= zZI-6kKqWDCihbv~ne2S9>YdAG4>VgTzKOf#NcB$0BsPR1LNpwr-?!a$W4shE6^vC^ z(^$br@f%&+OK9`*F^+{Kd4esa&d=xb%D${GD<@dV>Acp&JFOPCKjtzlSREF<(e4u^ zZ`#ND!_l2t(F3Lgf{PBl`IH6*0@E@%?Db{f5dDzKhVX?!R~1lwOlBZNA=MFb%@L}R z=J&8ChmA)en)ks)`SHZtwSWG2oKJrf>_D8c;%ZwKzY;CJq8%!57el6dm8W(`OPwxa?C4I6q zW}VRUqQtbtgz}U$?Ii=-6lG6M6}`GblI2XAiQ6{B_ukhr=<1ixV>mglwdxXQw>;UF zWaM;u4s6)m{q^YdYprH-fOwb+*{7YVL%^X*Mz}}(^48s_xafbSY z@(VsAXd#qpsxL;%e+sEJ#W4DMRo2hAI#84FR}<0{qm`gcT7W5%CyHjLIg({shHQ`# zb(~Y%fid<#T~jxvvAIHG(JC|0E76Ng??Yu@P0kBV#+$Tz(D_6d<yc3Cs2*Xcxm%I)NRj2!|hJB=L+rKh> z@x?U_WM$eepSkUbQ~HfsYR{g-y|=jlO?X>l!sh2I_K?qGX$PxfebdQos1|oelXlIW zhG?)2$)vmOYE%6Df>Ec9ijK<3HPKiTM;^7?|D284sOChi!I zclRWUwm>B5YV~%#^iumez~o(&XMAsoUr5;?;hy6Xt?S!#(iUG#mZ=M*vXJJom4+vT za>09gzmJu?X3a*6nD8!bJTF^}@1Lh8U2@ISJ4@pe#wB-G{LJN-UtU9x;8f1LxVj-| z2`#DON`!CfT1-M3RJ7FsH1iIOT#HGcyPy&Cz%l&|tUPw{zxOu=CP4$71=;1HLjdpK zz@CS6d;}C2a1?k6@G1;U2q_cckP-0wI)4D#_XET>UZBU0VW*})bi0082S^tyQpfLAAD;3LDOMlJ3-)f{CzzTe3#Qe2TJyM$MN_dW(D-(+YMVGI(BaB^cv@ zKxQq3e{HTr2i2cO?wxKV1#HxA#C8l~>z%0JU5Z^JW_wV%Q&B7AX5gv~wg)#3Jx8SX zq=46tsgc%`tEIZ`{_P}FLu3op1_XQnF~B6cBMs=%z!j_q)AWy&_s%>kE(*Whbh>-Y z<1LIiy0(m*lnS<$oWGjZTf#xNmfL*Kq^R*HvWU1ErOM(}-sA47rLQ^OTUcmh_&0tJ zW)kd^?N_<$dpjreh|{Pk4SR~l3SCa0ZA@o28RXh!9gZWk<%01tcc1Aa}{EvXGT5@>vrtg zsfe;CiA>0haBJM^4a~%m-KtgibhZSS#`#VA2H6$C{E8eX~Pvmv6z(;qZ|GG4o z2Z?EfT^xKVr6Ljk9@d8Bs2^7!9UY-G+sdvyJ1N$ECCDtvy2Wj@VUvzN?+l$cn)-dV z6D_1FM%Kt{!???+D|&LN`S4k1HWRVg4}aaCaUZlAcgUfikINYms(5Z!?=Lm8S3k?8 zycI_}>d`?&#IOZ*zs(ytHuLMMH}A~^YES5`OgjCFl<;wCv5?}V=Z!9d4(y*0Bx%__ zqTL7;Rw|MUZ;Sr*PnnI8ynA$JIn^8&!H!yScAKH4g^8y&$?cbl8DNpeDKpL3KywqE zb{9h%I+f)}ZhJ|pikDj%ORD$LU}I-EBovAe%}he^S$U0Oqf?Qb)Eb|QH9A65FuP^h z+-{UO@4RwbF4gkogAj}I`D6oRA=+}+)1~;S9Kd;aH@5 zn4wJ}aw?&oFb*UK&H$_*i=hF`xZ`T5jGn}^^`E$iYDS7A#(-yR@E!(^_@hCMOpS<< zx{BD_;WyUQBaj%--_mIu1uYlyG9Dg0@>Ylb(8RW>mB~+Adi4IkU3Jw}$|DzCaDj4o z+(eKXqdI1HmI)eP|05m$%?~Hv+kI%FWcHY5R4O3In7tB8yP%;?BT0qt54vvr9UlKh zrJK#>H;TnWg~B2A_pO3=W^UH6YurHvx`DuC?5f#HW%gemdj0i>#zL`WZ*R^__uL&> zZo?LVa|SuYF4VabYTs=$a!t}rxC$7}7cggxE*$;~s_humuvNtN;DoEGeGGYj-|F;f zlu6D>KI%IYlHd>PhiX6wd!!>PhKa1Bxdluzfm96H(NwoXFgB{U89E#Be^HbKZ>L&O z*X%0mJ(8mk&im6qw5OBVO_C0rvs#_iSO-^Xh-s>l8c!%cL%CYFqQm&!25pVf0p5a+ za*#@Qq=H=WGh4^%}+WTP+ zbRUWQb~-d>NtWBb$kZ9nw<;B;5*=e2l~$>wyyL{`Ug|RC<)1@EWy~?YuoTSNCzNH2 z4b*HgsX5B#;i}A9qG^d49SeY1+*4^G4b)*KSUIrww`VDtxCD>ZU|U~MaJh3pIx3AM09 z!VturaFC?pikqfBhn92@bg0e_gf)6fzeW=twZn(scE~DExQp&2H^WuDwd^vx&jOIc zESjJO+RJ*F`E2%ZDn-2mLlPRs?iE0{Yquaz<1nj3t?Apfj1a;w@sf#R=C8N{!Pw>R z$VTU!Mc1tI!B}!bFc)4`vXchJsF~pD0C6G&}?$mfcSvesuZuVrs*pm%a zdu!AOl+9NxetPZm2>^4#v<(p$Dm-mi>4A_C8tACXVZDb>*g``CpC|S(rp6(p zx6&YGKQ$Lv%e;jFEpe70JpHf{EC`Etn-0(pMQ*4v`t&5(yN38TvW)#~QYeC9UN1>5nvT8*mJ zyhn~Wom00>TI%mos%>fBX|0Q!X459#81Zf@&ITYbo<4orD{YI_2DT5iwqIf~#?mRPH_Gsgy)D`6Yx85iuy4t?XpS(O%O^~_N*H&SG!=VV%0vD{ z?49&C>Vs{Jlz1&wPgD6!6%gBwBl;f;r%d7kAt*tqC&!iDX?Hn$wdW@9{|Wi=d9~`T z6QuiOufd?1)tDJ;Rw)#{SxensNVlNWO9mVSm*>9#xxjQ78R^VP390DdDAJ&u;+<yOL!FiC z8&t7h-}QndRU>29uFuq-$bU2iT3cQmAaL$>z{AMjiu=dL1-UbSq0s<9J|l&|uIBvIjbuMrk>d zk5-+^N1T@~EiEi;-n^gMLee$D1a$qi#7An8S~L1_4vIMjla8p^0Zp&`ERj&YX%Gz{ z=YY_fjW3Zx!tz*k^@| zluaD02WHq2wCsx@gby%(0KcPn7E-?yNHC}J_6 zwk3U=Q@!IgoKO~ova*K^NiBy4`V$0ue=FwH_5aNx6UD8QRI3bIKwv6IPXKTm1gqFj z#0gq}pn8z;9rG2(rrM-xGW_oU*3ue+>d?L2`1;+#r~momAOG0LzN1XdLm!%>bFi6l zX5#e|tVULM#S4V=0kjW)-mX42yjy)JPZS}UHD#7e=-BSiUk!B%lMeD^CJV@&u2#q0Ap1CAXjzxgO~I31>l3c##SW5)jkHSV|>)ebUAL@>YoD3$o2 ze#L?$Wi|x%gDa;NJk(_bVT5XUhc%63!7-{!MD{|$Rn;IHR6{$AR{Cl^R2&H*DXXB^ zRwKy*X<-3LGqAJ?gBsNmN+;EE8l-W`0i#d<{y|5?l+z~#%!3)JQG;xLr?+emHBOm< zx2GIi8yPVJ0JS*~&pNXcTaWVzSqv9tzEm{;7iG@#ZqcqxUZQ;E>|1Uj@#^i=Cp!=z zcH8Q5?2$9&C`};RTI)P|yc&%&z(cN1R_^`Q7`0XT+XqgcfDnTfau1BneimSSKX-01 zCn#q0mRn9YR?YXH=-x%og^T)(uAUIH37^gd>N>8;9r86E95LK5*8iyEMeMV_ z!2pD-=^aV&q(NC_SRCtP2}zhUbm@QpO0ezfF#(I9MEpETGa<~j^m8FW>mjcUz|SyyAl-nS|D@4xrG z?=5v$m!YLGTP&YzGIsF(maI@hR6eqA_GikkZMB(`n6boepK~?0B|KU^cUsPwToO;) zT3WN2(NZwbR1K@7kPKHLy#neNtIbIF{@mnQb3=n<#oRI2 zK_1X#-PEc3_EGN&>mcc4F^4#ULbEv->A7hu4Bk%)PpyRsBTD45SG z-|;)Djk@SfAD}LtKn$G1EZR=Yre>fuF{XC0&l!0;@C5HzSDScg~a{ zKL-hnYEeU~x7CN$IJe(Kg)(e{*c4c7{Ou5Is3Mml1mWBlha_K1OwQmPX{|IOD2>C+ z44x3n89HYPx>G+1tH2<(m1zqP?Hiar_Btbh0Lc(d-+PSxSVH0JhZEFD=WPRbJIWj83;$pM$r;m zipSGCg8{~E5dyEf6YjWEYPHI-U;Zjurd*XmUU}c%)Gm{cjrhf^+vqg8N}N3_1O=2+ z@L(BRntMELO%;lwH+ulbVI=qF3!p^mA*urt0jWeJ1{;nQ$1ds;F%p@f))7z}W@^6M zkaXDSK`MlgNP`{Bg0os3O4!me=-v_$NBZQ`&#WdJ=Nvwe@@07C6L1HdmSIlQ(w5ic z@mMrI8Hv8%q+G=Wy~WMaWO`>MG#QfvMvRB7avqmtO^ZQSz6AKiWGio*Wzx;*==47< zc_-YbI|^1VV?TwJi*n6bm8+HsdFXl>3)oW{GyMs=1+#U`STS@^>dlUMJET#ZQ zV*Ntc`hT#GBj|rpJ@JHMqhI8~y?`t-v3n|>Afy&vNRxmJX_NmhbSu|rol!5XjY69$ zU=3~9x;>pc_}=MIlKC}yZCV||Ejb39CRz95j=%>hx~? zvP;iQoFo-bFV+KKqqYsa}*G-UBQv#ig}Q6uz70NA6g zYAlZxQIj)?^gsstuHwtdzK6U({o?ZCf2_tEWMx2C(7&Aq1Z?X|g89?_l28r$;ZsYr zHySovPBV7NCKf$nA|UB=XVsJ5u~x<5$(oeEQq<@F*&K_`heKxE7j(flP&6TAq^Xwj z1>nX3UE+&`JZ&dJq_CKojzJnTfhE_+)=k>ecnrLXy{zpf;ninClDDpMdaF z^uH&J{&0|qSVEz|RSbwn+~{l;r-kB0o1-gNrGq}b@)w3lrMl^a0b~W}3jwJh-Z8z{PzuTnlcAWz@1u)F&~uA*d$IkYXT7UiHwWYK6ZWsUg={(kNQO^N zInSsi_h!n`-B_0*YNj*5WEy~pA}rm*pz`Q>Au+ppjet8NSifNuNmhg8WP=QCeMvMR zwj|%(kM(hj(1KY1rUu<>TMNEgIKKu48Ha^UN>V!JXKaPebfmid?GcT~N_c)Sv-~i~ zM9{{}D*uX6FxnvMFy8IdO`qEhF$1VQ+n#Oei0aSqO@P){2rHSta2R9fJ4RRG7)D( zKU<`{pddt1rFT8%Jrnkb_QCv80|vHGWt>hNQE2^ltYT5i3oK^#Jd&q+LRUH`KKo!$yEX4Uv(0 z?bVt+oWtPMiiVJe&2j{dp0R}D(c_dq=*>10>xV{U8?@ipBAY`n3W8CG%-+QDW}n}0 zk+TAusnpytsanqSR)IB8FW-7A)XUtK00!G68N;RAhvl!n{)7CS%tw#kbDYN=n{vHK zCR(w!482yfMT+Kqba)tifORR z7)^c%fO!*a_L_yv)_2q_BI>b9iFyqMnVsYd&C2$v6KQ*>8f{NZU2zp{1aJRd4SuH% z(f`!o^WKV3xFxl7$Cij^c4;x_-TCxCs2(ry)+TEz;Y<59wVS{_p&68r| zp?wRv-6x+l*$t_C$YAQz5>j3Tr(L>`4&Zg&^wRy$J1 znr;TiGQqlUfr5m}3H8>R81X#o_Er4#u^z}FbVStgS|B+3S#xP+ItJB^aZ!^CsE zcSkERxy|Pb>XcFH6Dlneb;OkLC4i?9>EPOLG+th)J3D4iAm)Ii5Wyi)8nm_VS)p>v z?|PT=ZI1e+ZZbLVHd-_~qr8~S?ufLL+Zz{s>4a{VD{>Ik=z{jPYVvvnD$`wfVJ&yd zana!F+V*5~!OobRULzYqJ*r0SP+p=;&nkbMUF-rcz`c2cW=<1>O(aS>T|q%^C1cG4mVHr)gtzC}yj zcH4(^CY^E*MO_Wit#6K5h;M-;Os_5^9lnr3a7&$VW@EZl*i$cTm6SL5pik5Tv$N5F zo9t#N{|TQzkSN@C!u%Z?i~-8_h&lsGum?x zt})}rd!>#Y6FGNVN13T>>yApJ<%#*GrYGFdO>VaxFsf>2%m|DzcX_d`g)`i4>Lzb7?3R7;Uf z3r@mBO&~BT)B@fLSTYr&-Ve^yrC09)Er`R#@B2X91=Y*-9ilqnPqu8h&?HsY#2R|1 z%Vh$Mlh@rl572$I9YvYdQcoXPf#%>=J@qh{Npx#lPkW4YS?r9KuIZ8)Kj#%KRFyJ{ zaj%Cu1;sX}({Q%-uz}X-q5BKb@gM7cq_MHkQk&+h5ysA2M3c^}n=u7=KFa%w4yocV zUiygoppSs2%I`JjO#nOh<~u*L^%VFD$Dh8zH_GcGjnFn^j>$$&hG5Y z?DXv|$tIiLHp!-vLJ|TAB!Li+-c*Wu6#*$yRFEb`MWhM=L_ySh6+uNs^om`s&f))j zXJ$76!T)bJ+h%tsd%p91Z+YJ5ecqM8YR>~7jZX7CNis0)jCjtzNHwXDr0atfrS^C> zfRLaUX;;spBRC2$MJ@Q{M6ZYCr(zAryl{eG%8pz9*MMJl%hwqe^)~X2Vnb*5cX%}U<)@8R z7gZdVw8fe-J1UFRp;%C*)G5)_fuQ5l>8iienu)pD=DUpt8uvA@{D?ei?_DqT&uAs} z@2gL`2^$$(%jhu`5(Qo?Gag1{EhRhnl%Bj3 zfOUM`zKe6wH~k4gnfD{oYtW`k1GmbvMO`!= zRE8Y2dWi>0-qW$j9V6cE{;%LB1Jkw%hSS3Fp@!qUdMnjI%K2$#98nK z)`QzY`|w*+3y3+Gsd^!1y#%$F2!cnu5l4yo@&*3pg>ua0a{q zC1w|$hqL%K=`2bMC7nfpM|45kM^WM(R#B~OttsL+blXU})vXiRGN2Suq|ulX1`emo z%1bg4Ef)t~F3Jw{wBby_bRu48ooxI()*m^9 zbi6)r{l)BMwna9*tXCNdpJ(??BhFCy?Nt-6SIKT>P?8%Ul!?C%&G9E!#!%tFGPa5L4eEu=GN?1ILspLct^V$QTKyl8UN zId5Mf;pr*XBINE(MxRdSGvt~=>F|C-0{VBx`XrU|N|@gRfXXE;mJZ8;Q9Tto&>cBk zV$N--sU23KFXvKVt6Ib_SIk8)RA=qDC6-Ev?c0xgB^hYiPA9=e)FR_;_SUuTS?hGP zI=CbRI`ICVq8@WLj%+ajTBzHc9cLp*l<2OZk{Ge}NBTKy%qa!8SC>Z(e2X-@8 zcWZ!e8qz4d2bz!Mn1bKxRzuD#@AUP%0vX~CM>O#y=X2SVWkW}xyO`BL#Mq_LIJG*5 zCR^+_XL)@f95HQv{cyQZ1i9FpHWv$Pon4%z)3v6&?(55f3zx6#2ycFPjm&I!>Vn#+ z8aT<#f7((GYd36qbPGjDRe!&Axl$cCz$`3<9S zrb0!39P9-w&-k6Uf4VoEzV!NAnfRLLdtX?Di7W=Up+d}dmzv0Z$($WC9vsl;0%!y* zkd?K zWj^R2%t1er!Z~UyGuomHr!cLz#n({Cq^4md4j8;t`{$@#iW3a4w^dwrN77(c9UMP% z^vp4R#0lX*fm5PJQuy+Q%*x3=!SiwPryplVoA-jqDYA@%{^UWjN_>&3sP$-wYEscmHEek=B~!CLRU8<&k=JAb?`Q*th@ZnSf%$|X}%+vk3LkY%0j&55Z%#gypG zIY<5TG0dnDmF%Sw*!@xPGw5!PV;{7lNz{#~xWTMBk{n!}#T0Sj`1-UGlTZgy1QkJv zb%Uc%WfXD&+Itc6vMe3|V?RLmIgJ$mK>nC)J}QHrzRF+{OhbvZhDE8YzkKfb=ay5o ztFFE{$233zg;cR%pTBDTicxDk%=C&zCC8D|I#OmFC7by(qMH0YDc($`19#l_{cWnu-+q`+Ipa4hOz-!A|vq70?J{c`oIE?0tcRY2w-fB>C z-nbxB0i=Jg_=Vc1YBj2nCc|1>j2e*!n%D&>V#B^gXr|k?Y;!p-8)%g&JU-es3iJ;~#>kIN5Z@TAhz!Wl~Jc~SQ2tlq% z-@Bx|h@9fvKN=ZZu(&g`@P?(MS5J1YNkawQqUnb$ltNaxc)^0J%&Bw-S6n^TYePEi zO8AOZD8v-|iiV)k5JZUN1%A63I(*%@dVn!BFhw^q=7Ryx?m@6hkz4xO4p*sxqvjv4 zxh_m!LGMuc+Nn`!5to8w!gj?y3uZ!x!-g_3H#$ADC+itRCcEG7Emr9#6?A9Y5Rj z&!abu2FL*`!$pCEu;Ic`kPoUcMN;Xur+KwnM%H|DowIk_#`Rgi!8b_pa6dEkY-mZk zN0zJ%y2M{)>Lw`5la(wA-$u}belfUO7&JvXE74}Hi_379G?%TxC;CvAU&Z_t8YD>S zF%gAQ&G3&xxsbdDl#9b8Z`EU@Z%GQ5Bu5)qX6rGnO(qowK0y>R)T;WN9$$d7X?{xH zX@2#>3o*eUnKZ;LW{=z8HlFYK!pA=j+Ps`x&RpEQfzR-qRi$R-i&dc8FsIk+pT4JO zApe@xq)+t77rnmpVi>SyB1Qs(TI&Fhn)z?#@Ef2H;EIbI8q zrx8}m*_*GgT7?VjNODmN=XRqH?PT+z{rgduQ;;p26x=f!%;S(!=!3RIO4mI*F%J!8-H2c)Pm$JiaBExKd8xny5vX>VZPs_v zx!1FIb(Zl>?<>2$Gf_`_ROcNr408OGSk789$)LLCTtW7Om5bSW9#0KZsO%oU!G>5H z;m8*lkEggV&b9GC(qhrr_sO=L6*LAJcBVc_!Jv8CdRn|daGBowpYBOBy8n<>=i21AH0)KUJL%Pxh+ z#A@t^bI-lJQ1XmNvlBwYR4)|I=qsFd>W*~TyP`V(^H+T=SGHCC-*#l<>u(+D8f2b( z;RW&C`Bx59FCBOz-03ySwF}UA2Lj*s^8>vv*UCD7$gibZuewt0>-hoLf+#famZ5H& zpyvr$Io%#oey@;U)QL~ z9baKpjQPvizMenYa~*Dk7|aw#cxeRTx7~xeXKMYFUOta@wFF zchlOHpBpxWv?HHeTTO4sRhBwS0wRaZd!J>u1CQ!L#I+NC!!2Ql3LqtHzU@9Gb!u1+ zYDg%(9Y=|tCeY)LV;S(Zm^0DZ9<9YX!9t=ED1pXwd9bMLc4!${eKud89yBC5*v)d{ ztvhpUu&d-$a|(;qqR^UU3L+YvJ85!z+G%@~;#bhv=K#sfB{$En6P`!yQQ&#rw@J_+o%2j783;`L8sh%=to( zAmnXt*TrwdYt3H^U2&`@!;B!KVBC?{vIE)2%9|X$n5<~uRK7ipB55mMT)_MheLiF0 zHMT0Gn1~_S-T-wUEe8RMgSLBojj~3iCDf3&1bEwQ_<^jp2fG7mtj9}-?>|y=+l#Il zC9$vz0Hm|v+X+uO+(z`tN2B(f-R#YoRe$f#HxQz~M{0<( zCgiM)(VH#m2gSX5r%tcO=q1j}F+GWy?R$#7J7<>odmWQAdn@GwyVixov443oVLN1C z*oAVr%;2=WnHlJQu3oWG{Uf1L|4LeJwip>H-~S@J2szj=dg@!V3J_}Ia_O7oprpVb zlijeCttd>2#-s@b)I@qsEF7{!`%a;@q}W3o0;oqu}8)@Qgr;wTwSy;cCJ=jN~4c{jOo$wif^ zi-vmq)%s8@v$Fsa9gaBedp7jvbo}R9w!{U}%5y^=;c& zt&Mj93{sdOT4}Us*-OpW9XP;Xr!X69CGV21+!6><2VyC^BbDj$hPu}U)7w(D8*4oR z22PfRT!D~Z^-pgmU{h+yI5rt;a0vff94Wk98+JFGj(+!04S8(_ zws#xz4`8ol%X?OA@qF?ot@^W{#rS49^U%QmnM=d-!dION^$DO~zp@uH!0G7K zple<45Z=s=WFPKdZm-xKCFipK8{(Lm7n)kOJhAr9fnx2JnOb32p;~n2Y+&0K#NXA@ z)5|9u%*x{KoRkCl5#uam{tk8H)|3S>ZE2V*6{GW1@By(ruaMgJ>WnntzO^#A=2lE| zg3o&2sl(Es!VTe+9J>&s$f^@R>F#wY$k!&tHyMztzU}nE9?O{Kui;+g;fyYxM;7HU*w${Jp=p$!|zazZ(JDOK9$oH;bBd{S6%#@I>RS{Jp zG^0g$BrbTRF1i&ED>+mrkjKyp20}P`mjQA8+g_0B5>__i2wPKv(e5!~$_?2uB);nz z2^KRkOFFzb`>8)SpIWJ&ks07ix?SiI-F5zfeRLwv>T5IoC{!>bAam&~f`+`> zbQ9T@s)LCT6xpqXK#y9Cm&ngm7qc1ML@ zMR`fgNqNkuU5A)IMRzkj#4W-NwFk&+aNa2=0ecq=e&mmHIuVi;kTN=kh9sC*S0}V& z)27kQZEPz$Qmu8KrSo)#Owa*$W(9+S{N#`NK)|a_4ek|RC5t>2?~NhhLVI8Hnx#wi z9!)S3f(VfVL#5EKN7gzIK)MHyLaO)Y{2z&)@tC9ywTVP0z0md>$MxWKM2O8OTl4Y!lO_6|T4|KU4c-tO>U z1KgHTnq1aFt3%ITNHn2=VxmxXvc#f7$rLh+)$Yb=ne6U?w6|97u?C9fK{9C{GAcd& zDZWtcYd*GSje-t6_3)U$g;@eSOoz5_rD`)+s)_q$7Q0L5$ue=YI~x5?PGfeMo-R$# zt2xT%#^Ra$-waBOFiPCL)?C@E^ zIwDgDiT$yc!sGt$)ptPM0(Hgh^*3ypWWp3dm5|!UmiDLy-PHS$QOAz?8&kx?6VacA$`Ng)Gf3zM&OLuQiCS-LBtns*sE zzr$qq1dZgf6`vUx*a{Km9mB)dEf6O;tA^DYES+X@&%K^O{~J7S=;%b`Lv0K3#a{J~ z2A-_1w@QSSbvS6uNge2!Tnr2?4xaTKBHrFebXxE1Xpa`k3Rr}CSc;a!==VUM`e@g} zJUMYA!C)>Gm(UKQp~6H{Rh7cso$YpqmX+L*B}zoXUU?%#sFico{v5teI+@^IrgYkiP^@=oI%F7&S9ZQu@;=tC}sZ@={9O%ir|{l zSaxo|K^eSdkR|Dx6Z6Z~bGIxqyfbs(eq=9LHicd=n_QR&#z9P$)v`=4W6+~}rN{4r zR9a6jZ4Sp7_|!f)KKf#I{ldwS30BF+L;uM2Adkk2jG!Sm;;2CQj-&I^*v>8n+$pm6 z&kL!>iy_Wi+-|Ma2^TiAfl3D`8jXd_Dn+tya?yM*fPT9YYrB9pP6*t>yB96_WUg~9 zW;riQWcN>07AdVZD|8ucyz+9jQ>Pf+eA?zAHWU)<5sYCCm^0msr)walbSV6lN+VqG zj0{)#_=a^WeDw(qjU=7ixcI93AI@ylg(JNP7#{2Qzm*t|Jy)O7IH6gG`9llq_d8%8 zDF#i0`r4k=tb0TTO&qfCEEXh9+D(p2u` z4s*6p_QV<+qSk;@(8d71bolDQj8pp}9rD0j=BRM7VgGsaK!~ywVu4M~m)5Mokl$!V z4-Fj`J=!}hM{u-NkY?EY^Gh$i_{-{4#GBL(*aoxKG8gd@>;Z?F+A!S@V(7*(lIA=4-j|k_2|67OZA1es?}Bz zChOg|l{>cQQahx5PtW@_YDsnI(cuv~CQ_QvOmW2aKBsBFl-8cWZVljj=#;k38bh26 z$|{L`d?7yLpTy#5qb9TVe#GNN{qraBzVr{*4pfJ`F2p(yK&?4Zi7u5O>u!vFFCB@RGH$( zH#zk|cwX_M_@EAz@ex=)vB)N`M2WJaG9p!=>#NP=cJsZ2T zo6}xJAYE|D$q$YZ4QDq|60_0%wl!=bzajd_kOT&s9fjLrE7C!daYvV_dc}5H5tK<~O)6-S^~^ zgpT3Bel-PL0q zUb-P$Iiob@$O9H~j+V}-7PV>xyFfvk_uGhXWi7aHxE+a4gIm_6jd^KpH^W2F}SWJZqWR3PJ=Eu(R$ce^h=d{}BKJwPtpx9{OSdmfhFUmq4-1W9K~pXqb64`O2goM~eBq+G=1;d_h=MyYbnnFUV(fcFwqep<|N zs_6^wKj)y2_kPU&<+%?!Yw7+3aM@Akq4HNRxzG~Rg%UgT7NQ5ieYy~LDoN)&q3);b&8K&`sl{+ea znJn#CGCAta#m`+jPfNDkneFR-6IBJY24ie7aulTJPT`l`LtRf*r!8GpG>}bKOZ)ci z>pghJnP<|qbV2)XJ-BxXr~|Bkecaw+;^Qn+uL8-yAXWE6A*z6yYCtNl;_O=jEPDPw zxM&i1`tN6=$ObGdE%^s#XB4$R5-^5WZ9q?rTxapx3|@4Y+ENjRS)mYrsUJ}q^;+55 ztzmMdb6)eRfdTZ%@+n>r;#xiWozApfdFUXBQwnD9Q4ckv;-BaUPqSaiSEYWrSDW{4+Xh{L zl*4KdX)(8u-EX@Liq15{IFD=-e@Wbo{2_6?qd}f0OK^LvMcev{>b`J)^baKo4hCXF zcf=dXp~SJiwE_-U-oCc)cNCeBom2!4vmA9vJ^p$R^41SzSR@~?K}nSR0w7%GxM5DlF8!zDf|4`g;L$i7ITE#|2=XMHtv)-0A zS>)5+!<#qLeuvfMubG}b*@V4N>>2MeW=l0!_^^00D)o)Zf7OmTIt8K2@oeqCDrE9` zPbKs&ANASj_8pZ+(@*&8;h)2K=WIeZoHwpDgcv6)^@6k}mY&qM^SDLO&T5;#cK_#z z0nCZzQX0ZUBw_*f-LJ$yjNX`-h(6GKjzMED)EO<%x9reZjQdjvOJo z#Xk^^zU>QkF~9f>e||GXPI;TB5-A8I7SeZC^KXj7mFMc~v>p#Mr>l6q($4bOQ2hC64B7G)SXZ2sKAuf?*D{y4fQ5wURn1;*wOBaX0Y` zG>FStq@BqGPXO5|NrArN+ilj-9Fc-;7fRbt4)N{bNO~&jTb&NaS9?)>G%F%#2&uXh z4sX!p85i&ARkFNTWDLCTKeb;_^tPQqIdTZiLhswbh3h5Hn`Vl?rpRv*r}~G#oN`PH*YOzT&`D z7=}G#QSqSD*nlqt(9qDLPan^-X?_)~1K|t{!q!x$g0e0~LD$;w*OC6Zb_M9sQRN8pD+JIEf|HLWTZEsgcC7`f5kT zZm&32*Khj)R>ut6c{1~kq_+b`3dRGqIST*TILdL!@|KIhXOgSH$NxKWM5g6Aq2{qW z0|vE8tGv*01Ip>t-5n+C#D5W)c(k*Vh+z9HnvXB9X}&|={c>U`@q16wXN4FUSm7;0 zpB_zptI_8fwh2R?zQ(}!-(enZ)E^Wtir!DjC@ip}tASIRFv({Sr|%>pC5iYuXz)wV ziF7*yK%nR1-~Y&@kyEUF4LUqS94XEF^Msza`yJ`jNFio8f`L+3wKyj!kZM|-lWqKA z6kI5&W(&FU&wpmF8rk0^$|Jqx0v-*fLL<0r*9A)|-+m-85O|B{PGr`+5g83V3ua9f z6cb^(cD;C=bUjJ%f))S^Q=*nYQP*}Ys)en#u7{e7*(=Kx+dCEe(~6aE*_Jl;PH|T} z-o~I$D8GEbXbQ~V3PQq}bme!2i|eB9CDZF;-sJSk`F3j;XH4}#hc~vMFDX0Y2)fqR zC{YH&t44fBu2Koz4wJ`jQ4Cs3AwxXV-MmZdD<*9^PN!9>^-6YyWAF4@*jk`yOP8)- znTt~1nk(sSG&2LywYfmO+b^psyqQWUw5%hxZ1K3O9NPP_OY4nOgbZ&@+gW=cq;G^5 zxf`n!7&N>f>{|InsJEtKB>7HP#j9lIQBaZ9yM+JF40pX;Ux?mgpWZd-1WJ<{r28WX ze%=i0z;u-j(1mX8j}}=6@!aw5jFxwt%?69J?b#q$6k9MEy0~GAy};uj+5o>x0|!{~ zxwe-N*3RE!f+|JfpB%V^8KjgklC z7B6PeS`{`^Sc~zzWaIE6qO@4}vHATvBinp@%N9_fTuEb0+LqA5Wi}d5-MpESJJ8WR z?p>8lxfiaQ?(i!;0cdAG5UlYgvkF3cjh@%|K5Gd|c$RK1!S|~jl)F>3q~rQzCZTCe z8DMee$r0LQ%LT0)%)Czfi$<^Af-Wr9$nj-?+;J?~pMImwpHeMgRYYNQT3(J0#@{%; zy|K3$$xrr48ci2a3qvC>>|+Yxo)DePL7Nh{1e#e^(=u}{6(Vh@b^yTzW=K1PIh?crFTH1cOv3h5+@2jt+ zewsfcDa(y59_eC$ek2Ax@%5WGcUBHt^Hy7raPZ_OH@ioMOGZq2lEy&iI}*$MLl+Hg zxbO4lW=zlk=*^&#)g{L;&tc`UeI@w5=zG^fV?&3!c1c1hrFrIbC1~{uG#i@JAUKh% z1x^E{pkgs4(@AjyYBF0X<$tPV%aKX41%_xH4nrgn=RDq`(}MXc;$JjQkJreW%n;4b zrvmB`Mr$xCNQsaqE*!)(r-AkBwQjf2Yvt`-Mm3<|)16lyIl`itOHLui3oamrp`D9M z7L6XK9HW1HrIiiR;Jb2N7HmA6#x)x^C2g``I%8tO#gXx`AH?!xt9Uzk;J(0c__x+{ z)Qi}9K1zI2iT5X|(e!h*X*=jSy&y7v_F<{McNJm-2AK{x->rCa)&jt#S&w%hx0EG;~p#?mLiMs1kweVcmjX|2rP#jmzTGhVzMs*1Q+hcyG9Paw5Pd#1(D{6IrKO9? zvaCQ6pT^;rv%TOMB{6Miqr`=mn90&vrCCzzboE3fQX{+#-90#CAvFF`TxNFP{J(G@ zXeS6J$7oerU!vO^_D0Y=s|1bcT7}K#S(Ht=;y#DYYC+sHBmQze`C9Wkd-lwd9xydf zZE<%=q=)_Hi%vgXB0Zc*PM31X*D$7`OXytY@kJ5#i~wjNL9e~P(WB|voami!7L5*9 zz!qMaE&uBq(JZ-CJj!hPhP&bWnbkw74mwJ8Ac#Pe64l}5$f*B?+6FVFI`Hdj;u~*B z*y6{4JJ6n?dB7I2S7sBj)<=p{1A}P4Ny=g^mpuzFw3kleLen2CGM^fM<&{t1{8!yFd^3PcwxczqjqKG@TV)>+}J6f?HJ$m+efBReI?8<@4 z!3zEzz^CW4YK@9%Y*{)UtoZtd=A|O_@GYh5RYqBbHQK!9PK#ZAU+L3cDc-Q5hiwCN zczhC*|HOP>x+03GwFvxF5$r_Bgc{s35xTvE67$}lUABmc^!_qOzBnPiH-6I(e;A$4 zs4}~E&4m1(W%-{sFW$39V;9VMpBc3_nN6^=tl~`brL^LPIXy?n85FA^_uegj5;y4J z-IXsW)it8A`uGy(HhihF{Gni9Dui&Huq8PSUkQTChUop6Dac1Tx*-YTl3 z{l4h@rA*}xgp9VZM=)ubU;YfPm1XGwl5* zsjx$dGXhhHGDYakK!4zc`ck3FTdTqnnwz^&r`!NsB?&}m95Vvj*+DCZk~j_@pyeJn zcM+`Pzw^o1wymJ;9&e*k&vD?x1`%tAbS6$kPH|m)>GpjsER4NMU8jb6<@Qre3NpaMoO|nsY%ldR1TFRec#p zuiaU+XZo7E0$pSedhnvpCoNV;k9PKx*1 zj6Vb%Qb875qDU`?9H;bv9`b>h=JR5Eeyr}i3qjprFU?R;2!R{7At1*FW)+&8~8@Tt{RbMvlB zg{=Ln#Q#ZTP^yxO^zIm<>CTsH>ssut>Dv7%K!I}fEPR|@jambp6p6cC_7HC zezz_*^Tl)eItEVv$4{XE<;F-=W(v48p)B_2!i~gt8Y>-iM5AL>2@88VE}hvJiw3 z03*<-m%=$A3h5Bq)O&nSNiMbhCG`<>q`CA_D(u0#V282Uq_w-J$Ij^V8d8}Nhjan$ z{2TjNt!!|K+OD}lffUwX%_a0|Z!l>1{qNyM@tD`K-o{v*Zmq!~UPku6chY;|B~gq% zn=Zt9cO)PBx!R%G?5sG`jp=v~-@)&f8BGTHh*8iq53njq%ToL@dU}!1@<}GrmmHH?y{& zGKu_-6;hziMUgY9g8*Mk|3YoRrqCc*^dcT>0RnT4*JzE;SwU%k3^NP`%8?OC=3ciA-`2ncmrN#!Y?=f)-)J# z_WEOyiQ$^#kKefrn|X<1AL9&##7}4~4kMI0c`mFMxOI**Hg6)Bph?!OIhk3$GrPSI zPOpqsd{v)Xuiyl?vDe~3M`XrQBxXgbWXpAu2{=BldvnElJ!Z_8ZG}q3RoPN?_S^0K z&MK^h_{dv{ZjV8R9A$wVLn(g~84EoD+fH?29EJTM-`?+v^p%|EbvtA9YTA0s0YB8^s2#f3$Rw?nGyzofEQh@^yJc4YSTbz z#DSG!Is7DE+4N5L*b4-i2vW=3W-mxUhNWuoYUs=X()trs`+E5o(li3 zVD^wps(UM=I!puUFbr4rR>c=G@gaYtYKG)WimQL8V?eKFm*|vo^yohh%H^jY^wj)+ zs|;z>=yH>@I*0Jv_+ae0@4#w3`%B5>Uv58RN_y{~S zqqHn=oA1cbVGAdm2pSKf2}8=1KWZ5$SV~`6w5TyUA?y%e$6OjZO~^Mg)aUFRxqi~@ z`*~Y(GAq6{PVQ(vyL-1w0PUEr1_agHt3iKf8@Wh)iwN|M>2dLvxZj!yKLnQz&@QXA z`(pOq^bp_WvFJgf)H;Rcl2C$tNnFEhy(dtO{HZ*Ad{ushRe7>JA0kr7kLQ=08*502 zTYb^%P=DgUP}@M6IwTLz^S+%TNCk)1s0oTJV3BZaU}|YxBq-78KU-r1DGg!KM_3AK zVgwu^=J(>)#*bk@xtw`A@iA@K&UJJ|bcyhSNP5ePy4)WfAMW#bhkcI5{B>uI3^vHp z=4GR*g^XHmb^Ey2 z+aqz+b+9n=QVaon%R<#!B+RjuFjBk`^d2cO!K9t`K9hQ#-oMY@2b{6%=`e1E!aYcMmA^MzgwR@$XPziaV={6-T0ZM^7fE z*XUKuC*Ah}!Tt4;CFTGsdM125{{r-ad7l4ChoWg#AkBPfW5 z16qUM=TiN(-P0k6&BmpZK5Zl#P{zirb%iq!<3mZOjt!oLry;AwKjrg~UYx{@BM$!? zsiD+M^{tevLAfe-yIS1TfRr1(18+gkzI5^>1|p6#){W*#w5$p48Qq+rHbzd-R+=%v z#&PuMw>E1l68q@GPwpqXG7rnmh9$Y3YNt17?##{;)SOYvHV%sBWmQ1UGDA%0!{Aq& ziu_#MOde={c5)I4e>iK1@#wpQKF3DSIq(wn(61zaE|4YeT)`!kI$2iE1~E<xo4^oM}Dx-HfdSrIvvla1t z1J9W>s70vL9!H1Y!W4+vpK_*_n$KDw1cSd|9go=atEjxC7qO0I^^mN9wo)n%* zreG|0MaL3!}DH3*G)}!R@2>VF_yPn5)_j zQ=kY%V>m=)?b|?O8QM|Y4(I4MTTV*46KKvp;ZD%o;H7xxi2%=sQp#E>0mCzN3~@o| z_n8-5*>HQhJbU+Es4!KJma7{BhOm)yDw9}vNOJlNCArgpiS~S9|E?>HUAC1Qlm@%W z-aob=;vH^2hNEr_V&H+*>~=$OW;=Ii`xeO$?p#dPS$l1^qD_2_`~qWht4t)&!y~N^Axe`k{V$RWU;p|c-MqK@tq~{m$O`F#S!X2~`K+Bx; z4R@dadrnLl1?`k_CEc;_gvWi~ZS2G}XV7VOV1Z@m<+>dlH6x-UEv)ES*y&O}i$oM) zue|lS6bgZbi>#~N7ebG^l=4f406~DX-1rS?OSg&%?Ka&HQifWllv-gb4~b);l>QTD z!})w(xc!_RAljcv&i)~g*#V8hJTGXFO%RQvBeXqic6NcHvyG*)eR)D!Je-mJ11 zJG55y_?9gwGT6c{Gsd#((0h6^e->r+EtaoKE_PL&dt4R!_%{X*vTF8X<_gRh{b9#a z|BvvCGn>smd9~B(?n&5<4nKF7DPr){N}VR7%gE(I9b0<-q2aZiDqj5%Seozf-RU6s z#q0egLZPc;SIw2N*UkG%;l=UR{=I@-0{-|QCUIVfAe1^C zsu9piF5Vwxg?KuCnL?3td9c9vj9Os2xTx`-;Mwp^{A5dDpast%G5$}ki(S$c8-}bv z{=2d6MfJ1+dB~GbNqoT9UPH$j@Hy$$gSzpxXHCkmN4c|7!0#yz9o(hfnp0DpVQRRB>6v=*f01IA@+=psc zNZr2%Nh!14fQZ$nL((LI4vM@WG)O_f35gEf;UCU2ZJ7kh0b!S0LSv%?Zc9Au*I9bg z-L9zDrbQ^l&e!lNq2m7rx$8?0KO8xw`4e#Pr8*DgmAmvl<4*J0w51D#%3b6N@nf3dz28L+iiSW&gYk*LUM#6dilfsBXKX$f1smR^_uFhn zhn+I0$`X{l5w*o^9&lOh0j?C!y49_wT$@m2zj#k@Yb!2DH1ev@*KF@Zqq5|b9QY5H$~3uC1?EY zZyxb!Ql@X@HDVC|BnF&eyHNq+N*y7ug**LwjD6{eUa-~n3NPq?v9aCWYZVIi?Tv>& zcjtoMMf5tu&<7ktziS5g09ARaOLb8&V`;`Oxicv~qZMOHJNm$#LVG9#C@A5YBI2|9 zrlrNd`(1+^CC{()2b?|tq$N=IeR-V{6#ncTV`FAwg; z%iAm34OFy2#p-A^sDQ+|apMXmJ|z}nJzAwwHU_yU#$`V6m%sd(X-t*-EIk;3Xz5#< z-;^m|F~2nRD&97_|2W$Lh2bJh!2hez_y?L&WGA`byAT)})qJ8AwL^#xq{u+xFJhy% z#$e(m!cer(YFvHWZH1_xLrg&EdbRd7u$0`a_&lwyQSz#!BQ*=IeV7GlMIk`gBn z`OdS6in;AR^SHzdl#73WUI~#OVKmAwobMk?LGj=JmA;GO$tA%JBt8DOzg>rF3N<#L z`OLe`D{8uNM(g%M1=Z>B+BhSySjuY$7Q2I37Rj{oGh|wFrzyzyYLoiH$yUY;%3XmA zntCy^xzsc6DP(6F2i8L*rXb#V?X{)lKxcUj|HUWd&-c3O3>_dA~J8NV(qwKGMbwjEIIpF1Irf%7ryz>g!sFO+n;`VCm)_a zf5hu_Rz1IOereu38T3E-xL`&1z1F0WAxPb{QR*{a-D(ggPnR77V-taaOA6({*yM_C z7qP4SV`D?VSS`NkbQ0I<>KaWM<0~xMlGY;MTqXK%V3z$`_RgpsvFQTj0JO04s(&E# z-P#%}7{nQ2bxqvx$(GNu!`{qeIjQe_Nvr-O2SAB!B&`pDVn?*f6shTGNyOV)XO4D= z&AOxaV6<)FDOiWEP3pK-nPdyixI)ab3z^$yTWMApaxoypi^Nk#BwLTg~PM zF2L8_R!7(bO%vu!!-e}#m-=nZCHu@Yxl_FV#+w*$Eq05~Y!7z+E4Mk{J^H|mYw7w8 zlR4(Si=73ht7xz9I~e?ZWl#(J7ws@`CBn~=^Aca}JK0%xS=MAk82#o^;1-WS+s087u=TPR9)`-2)KbrzEuxIY2mrw8Bk)iJB+` zl-OeJ0nT#A3(58u%R;wi;2E(1f4)iX+YXf|A>9(=B0|r|-7ciM1A@p0!@#*z1%~gerGvf-9aD?t{dhRb~S0Gjx zLjOvu9|(JwdW@FeKt2n%Nl}+J`ExE2m^GoZAL*8ss#@|n7y(@{Z7=nqS|pUgMJM_& z(~s0@k39Z(>0nhCTC{l57c2-Gw?E7!8;h*{=uXkH=#sqTlE)sq)EE`eV!Rx(b((e^tJ3O~l?48l&vm+TH@JzM&_hZosy{F-yjLDaYSw~99r z=G@-UsHfx{__mA-dW{`AD`VoVDwp=Z8Cmm&wQC86n+RbOr*#_~su^zI$tP3a!|c>| zrbnas@FMc*QsIK(`B&ugU8hv58?6f}eOpH>74g*0o_$@>o{iu75%4_?s;jiZYH+PS- zP!Ws6tJhE31{C|V)UQjKrqtdHsOyB9Anj&G1*|Bvml49|NMfl4!D>@T08(Dj!dzLY zrGQdyGsyDo)orB`|0$!AD(iSk^1^GLs>fL-XUBrQnD-*LIo+CUbiq)`Jg9XP>*Mpr zs%7y_k`OA>MQ6gE(>a{N_qq&TuS=6w1Nhz{_5PbZ!o5~Oi_{&k$4Wwnt;3;!x|T9)A6&c+ zJ=)QsYVnR+{2wb?v*LNNj-`PR#!khqP8l(-N}JFG!=X(^%n0$?bgUi|5afjb*U9lI zb53pL&{D6_0ZSwIKjQB5y#(H9A_*vRK4Ml^>}jNN&(}_qBpCR8wdPX+E|ble{T*wl z{g6Ye1osd9GlM7XIq5V^raA|h7~S=415Wop60sACGwsOhM6)p$fk}2p36U@fh-~F@ z(m*h1nVdk?o%NpJg|(wwi6evKz^*%_@mTEnq?bv=Mxx~#mN`7b!wtb(RM{GZ>%L|^ z{Y$_8^&NK{J4UEh(f7W8Pd@*;jTD>LEL#S^BA^L`gU~s#q4uvduW=oiQ#twADR?<% zwe`E8a{1-Jut(={SxAr2X-ju0swj7uOg6T|bGWzOTQ1hiwW29(1aMQVomt%1Al`do zmGqk+@%aoW5Ho`i8DTJdxwFyp-TDS=w*^(f>AI?3EZ>FZ7`?UN!MetP7c7BIF-jd+ zE2a5}I0kdCu+gXt8;GO{(_*%?dvCF_AG9Ih7JPW6oSI;o8L%#K16e`U($O0E`Q9!e zQS=$*K7+}uX7-Nk8ICi`=4U4+SW`3zYA6RiHm?Cv39VR_SxTP2;f6P_xrQm7TbwA2 z7tSe&SAHg)G%*9%?2y5>oG!jj{BQsB!F$Niqt*f86<24}0oY)If`IX7!{dRM8tVa9 z*>l3W#?x!pu7zEo9O7}{B`j9JfygTj{@4DKj>0Y=uZhfx9|Mk}C!e&3C4(+Nqq4Sv zZJP|35j=!QLjtf)G_DjT_=trek|GStyj$xZ5EmHYJ9cjH2g2J=-Sui8(HTvOy4H0| zL#|P)*nUQ-){u;Nc|ZBPDlxDpWXV_R?zpW|?J>A|ImCF@ya94rep6^y^Nj@y7`4q} ztGKN~g0twhxX-0~Y#H!DGIE2AqZL!TjU&%{ZnL4sNMW=ab7u7IU*%@P>5R_dnT*&C zv3OW(f(%pm-Aga|_T%CkWntLEg@YbVMQ-izUVQPJ-~4Oy%FUZCVOP{;hX{;D zr(zN315II}Rl+bk$;IOLvCMcIfArDH0#d(0C1ALe+K$6&E-w)uUr-?r-xnH){;oWR zn!Ciy1FPz%k&*DR`dZYeoRINHscvmOJz8$f6N*S2R1Nl*2UocYdrR6rIqa}D!vM9c=q0PtGOlujl0@AG(2x^Uy*&(QFv8rj9j;dP^ z)V5}gI4m)>LV#9KgZEMw`(cp^G8}=q5A1X3>D_kQl~;a6dk9Qm9O^4g zcO!r}>*#ssG4j8#8jDFA4!aqnHe(i4o6P$+Zi{(v9lTSOofHyc6UzaCi2d|(R~(|S5Zz>Yf{sd3@BVUa#V6eeXd)V{C; ziwLI&qa$qwib+by)4v~!<4=n9p$QTErUbFq!6n1*!>p0X=OkT~U&-Q@R5GeJ#F9yK zj7uh?I$IJ`opoASS7V-~&vrUrF#@}ZyHWn^5YHXdx;djo@9IfM^;KQq4M_*HQ!w!% zbp0sEI@iH1TNo9^*j~J0v8b-HSomRi`;;;k(VwYV$x| z=SNGu8Q8M63e*yH#MLQ`Z#S_2A7kGE;6{0E?QhiUXhzbEH0otlS6Z#K>TUb3+q(B| zW8+4*X{HAQAyfwlgcJe+LVy(Fgg_vj1VRZ(AO%uL$Rh{o6%_uO-bChp(tnsgN0*-aZ(!Bhl%N(z;i2Gq|g}sNWry^ZR6Z~6gWG!y^0m<&~Q5t;#(ug z3e=7;i?!K@6GJxiD4VQMP{ZS~hWuAFS3u-=`vkNGX4I23)+0+8-7+MiQvklIE1gbE(-lBPoc!J`wHgJ-I0;FELX;L z8a-JAelBBjiGNOwWxm*~`C0<{Bx}vX2Njzif-T$!Tunf{F-moXlrxOOe4O>hi9DWn z+oLA}WbD1GNWv)AVF;ODH;lt|&?=n$jxNkwSqRm>e)MfmpnDa4^n~?H&;I5hpjJw( zJ^SpNuGTQ;oO7jo1$*>epy@v`e?DV`-gprze2ms9@G7lghj7kGCxPIIX`*DfAPu=? zf%zlb*B3Th!_hwW2{t&!H_mRBpaJZvNTuf44N1%i?)sVbN_)(8VO?_O#E*X(iXgub zP*B5+jcL$WP=``WzMo~L(oeQl1e;!OGqfDF9Oxy}`GM%cpgi0H>S#Nm{_tOR0;!1- zn9xBu9Rom7458GUR{^jZ)MQHBQaHKqU^wT}5S&!9{6(b~=S4B&OebS(A-?e7dX>Ru zF^7W!kp#cpp<6RSE}VTyh|mfkW5@hJL3g5f!C7a~;tq4-u01Ly=T7#8xUz2r8TEoPFIv_jtvlbrlQ;WybSxRNQ_{m29( z&xXgs&o=f@dpzXW-FPI}kgv_z6PaQ#R^CNkyp?8kz-!l`-qQ!R<7RNVPRH%-^4*VX zls$F_73`;b5sx#R@U6$WmgCMOasXPH?Bv35LdT3}FD6v2%MY&!PdkR1W8wb9;<2jp zd%s{b5X|}IkN84;WcE(SO^-IEwlJ}5ZK~n3rfgi2 z^){kQ7LJiOz8Y$W|1-~*@QaXWBFl7Ytp+XIf9e~Lf4{m=5qCkDA{iG|Pm{dqu-D=V zEP8*9j)JWLH|GB6_fALs{+V#pM2XHpHXIJ%{%Q~}Uxiuf8q9ZzLaTXYhp7x9d`c^Z z!-f&0a9KJcdwGPZD7v3&cza9Fk6ws+aw!EvJ8`SKCtTW2cG}p zV>ve0oQ|bdFKWtH4k!0DW%=Ljy|I>Kus)rxd2K0&BW3f};^VbEdHo^Ji0`|!YFR)y zLIwD}u_u$$5rm6#0{qI_X3>YT3}@I0bYd@TBkhkaB5!*0GAYFtte}$lQW7(;8+vSy z%YBa#6X)ubR9>8UOQk0Sq2*3IfG93|m21tDR1}bWcXi+f{UMB@vn2Y{whVD4Oa9oV z6%BRBnu|mh^#z7~_Ti}uJ~S{KBg3;dEz~Sk>GkOOfUcxV5@{5)!o442A(|Cxvh_aK znc`j1;QR>Z){!e}w>8AhVHFy;)s7aH`gLx9z+9svoS>TYJgH3K8f0EIIQ}oOPs<67J$l zA+l-Hy5H)(5;q{#M@RIJ5{=2k1gqC&N9c2ef6I#$a;56C?KOJzC9756I|MbDx zQ>y5Bdb&zxe(FreyyzJNqQ9co^6^C9aPo=vS_%5Ub!koeli~4y3@+=F(p)aMbGp%R zxG?M$4Q7JL=QM}>BGMp+;XMI%y*XrMX|ASGw5q7qShSm~A&bF0-;M+URsp85lfckr z>^-rZ?*xC%6#<=8|F8F5&-%3{D>A>+yR^HL4PZ`E5 z@jKHwK(_)jw9l)c9(pF?bQ%wW%hJ*FQ#2@JxKXqu+5=xHQrfKtc1<1JvY<$t;!7}Z zJ=L1G6VL8UdMGQEj?M|9V(e6{jIK|wxT@N$GwMxY>FYt*%rmCEk>TyWdmb@4v=c$n z|9EiE1csxVr%%#4-otZ9#hBUeR1KqQ44>9}0vLWMq)aA=Tb*aU@&MYaR>Jx0`DNNU zl{|ouQcVs9r?*lV>a%n;$E31ZaJ#)atA4zntg;s~r&O9^+3Q)-oIK4x3}8`y$TP+n ztX5M%B9A_4t2!SK3?(GcZlQ!j8JJowD19+7>i=)s>j%P51VAw}GWm!f}K;UH<_N2W}@uFdX&$d})(5ra*L{V4h@0s;&{I|Jg8aRVP_?O1SR*Y6ZW%7c#xYuX z&HM+Sf0kfU@DG3Z^@W>*+h$)PY&7ajp;n5K+fXXMSi1G_VRSKQn4LQhk}IGkck;>a zsj@CT5Uh`&7;35;c~dTTQeA%ijrN9k&R!Z_mHx=6|9*a{f>h*o}J}Ru|U@=$l_2cSH6ovJ5f!H zmm!e=WQR#HtjjXM+1++Xx~jL0-mwjjHwdF|mh`-dci41Vlh$wD&L7ymg#dwvLc@aV ze-bNm*6NgJFyb3KHFo+nYQ3gqwB|>bq~hKhyLf4R?Z%dKX=BaiI=NWhCmSmRaE0DB!uvk3>43QRGY3m+dA2i7lc9Q$*qU8W6wnv2Kz>L zro|{%^=+Ns)Z6sD*S~PGYN=aOd|dwC&wc;?wfKzkFRjV?k+*GTX0gia6m&F%NUj^u zDPge^&GiV8DkxcqSQz+KIMOaa@uv5vb#z7$%5j!qe}H&mhC=CqP4$xLaLXo_Zr z$UWKl=V2tm=y+f-zo?$#zVxe<2WHwiTgg>vPsS=61~JdPXpn*tZe*zGto!TkoM=F!w|>yo@8H5#qafJz zg6D}Ba1@=%=Ip*$6Qd0se@HY4hh7ejgud3^ zjIl9DUN^NrgZX}i7B;P$b2~jK~RIYG+IIqWQxo~!9|Jx$?P!*I#>BPq=Wo`q!C@okZ0H$)fO32GW z{;Nx)#S+0=zEjXkDK&^~dVl)J#pFGW=A?YUxhzFyn)#rk`2bi9+0XfMCGUdM#Q}4;>UwA>b7%n)Np8y@QQjx!)|N3iUj!p|AU`V+2dIGMo z%lw1%Snk=@HVkX94?4EBK9e3Md-i{JNqI?m1N4LGeCk_NsPW+UZ6i{nnNvpvO(AD> z?tv1n!??gGAr0y(p}|0Pqj>rj3(zrH$M_{m@8g>gfn(lt?wIT#kEZ0K8c|D@16NX+ z!hKu{LY7%%`6v$%Qqu>sweUcDrExsCXEJjYwoEL#yKm{4kKm**j$sm1_dq`FO<{7q>+0vdGwhRm!F`jh_)Y>@euYCc1Wa-SL zn9f`{HFGGG3#=LU z-Z8(lNV#KC^c8JZS-|I{ERFLN^b@n}wOJ;PWL{~4p@}>dWmE!QS_ene&l06T-doDK zj!NWIJz_B(G}HCKs{eh)I*EX$7{OtrXRy?ng`$e8#-xzI8r&H*9|>eo{nQUn^6BR8 z=%|L%pCC+1h35xm&Km4LygszUmtk9b%! zR8U~KdIPzwjTFf$?Kr~}vYyXm<)dp*zR+se{3)SYx#TTdT+vEKe)SbcwS4n3pC-g& zzTUdoqYcmIu_b#tcm>l*D>_JtH3VHvMlnGfta;nNgTBg76o>9>C|?e1vmOn!l%Nt&~_g*FPz5f%xnZ076dWk920%)IN(dvcT&&kpi zu>7=rW-E!QcS+@CJJ?XHuicj>R=|ZOyK!*(LnGl>If$v1?jE2Cipvlz4vlUB<+cuqx9*K7| zvmW!9CYP@5qY7+1n#q22+7sW`>%MWWB zdhN_Jy%A5=X9r6T?Y-&?97is`P=Qa*-8xBbUwDTB^GX)!)fRMU02XoSg<#5S<)Cne zu#DW~LN~oB7>Qu$&m?3}#C&YTwcCIRkbe0WlNOJZ7(WFPk&1XH74Rf~zdbRU`dw|> zpv7QrNQGnK(@%2~gAX=Wc!wov*t?>60of~mC}vM^Yv0$3l;SQ(P%~t{2Ko<}!ej|d zwex0Tx7e&KWWID&vFU}NWHz~`sAu)xE7pk4DDtJ;$-@^d_|7uA&eWICIOMN*FAjb; z)gayg|Eu6A6x+jUcT&@CCjnL#kx7>$jAPj)Y0V+5Z(~d;Kj8QTmz+Pr*d}gKlWVT| z>}OwjW%BjcKmF-zuVr-d6U&xqftuJ0Uc2bF2{d|!1UuSY$TYc+X04yuhX-@})nEU{ zwLY}MmTL017u7Dfptgt%)=FrPz2^eb)?Sy zmD46mQ(wcA{{C6`Qb_(on|?ELuv36{9-en~Hxt9*p{Id{AQaG~@os_6^Tx@bEiE`7 z_&kM0=#fGMLS0dZsaE)3^3}({5DbZ-jWAuMkPa!9613<|rUV3~V%K}CTG}_cJH{7k zO;2Xzq^LX1y08wMQhXwLVaOnI1ne(uX-{OkyeLh zFgQeGaoNA$Kb(82vCTPz0+X<{@yY)7waD|t5wcwhHX?3!pV$4nvW3-Xm^__AVtWeW zYY|VRDn*30&+lm?PxjKer79lmjiPcgmB_FUGwi63>V-K_7Ze37zLWAffX<<&h>8F4c&FZznNszQzUWw3CKHM0jeftR(Q6_TRd1^3 zQS0=W4Pc*KHT8hn!j$bg(Z$Pyix)1mND#ww>D?2Y8szJ4qv6bFx6;RvLH4U3YYlVE z#(I7BrzCAo43<2x)eG`OJ*f(nM*W^_BJL#QjaOC6G^VuRTC!w#*>!!xDfzeAmWkGz z$C#x5?}KB7dz&YsmkzSgyGl3S_`RENe)5`+p6ATN zlkv=o^e=vK@y?wm-ZvpHUk`nBhXZZR64KTXOZmmhybic#4YPX1;#!^jkT|50fivsK zskL{Jm#U{4&6<|l=8)JjD;h4S%E5Ql&aTVRL9!+Mx}(p|y7jatikZQj34*bm!VjV& zeb2Y|E9!#6zV@S@o;|xAbBW(TtQhFV#nh&CV`F-^BAqf1@>%LA-c*yI#oD*#SED+F z+uj3|=*>s=@bP9WH63?+jWj%7{|Dz@Pu;#$Q%L(@+9S&9$!tHyGuP@s){y99dGuT zQ@=2J&g8ihUwZjv#is8y^t+S3LC(A3fPbLobu%{fF8O@&`v|5qtW=Q;W{<%7vqAp? z4Bt-Ct|5FT4Gt5w{^2>tmcF#l{18Vx2wU66^$*fU3^4k+IG(7nNkAd*!gKa2P!& zp(u1wMn=4=$2PaJxLykP6f4XE&*~_GDnn7;>N5641mG@oeJQ%v;{mI7hUZ^V8`?7* z@#Y7z?*5u%jGX3NC`j}B>Zi+>kL&gNQLT;a49X*pe}3^%1rvSv^9MamOVI0NW^Y&l zB~hCg;P{x+DfM#>!*+>wn|6Y}-7oY_upz%Yb>P6mhYoE?h<(U-S)hZL=YJNOh4PCI z%#Bk4$(lskE3m%<@At{pF7ykFC2?o#zU?h*U#ef;x_oQ~QeC>rv!)3nHV@b7|QxV~GT-^P5Z&OVnL& z0vk#8x)Gj(j{v?_^|}C4d(!NmKeVR@1aVuS$P2JKo2H>Mv4HUhIFn?6 z`)*9eJT{F$4#N8I8;53!5Yt8W+;?FSCEaXpsIW#xkg;87=X} zzn_^Hc(%REQ9`evu(N$%KefB47Xv?Bpb`;9PId1AcwjU(Do`~A`lr{=tB4SFXl^v( zDe5{~)UzHm>ZI@YJ`4JX!f$w|pr1N;3STIOdF%W6g~C_mJIF`njpSCUCE4faq5-GM zt+Gp)s3$Rc)t}VMmAO9hH$k&Oy2$9h%SHVux62&_V^GKJ7A`<%5bdAZzV!rhw)|`2 zqR)rPU-o!rq8J?(V#AH8P2s4UF!i<;?7m9 zwsLxD*j+48k^;^sJ*TkXd4Zlz#5+o)N{=ipCeO9I_CiyXB4`Bkrc?ap#;Pt6g3jZn zLzh!jj$f7g>O}_*ocoCUV9*kdge_;Baq#o5WIRr;NrdN5v_$Xl_+%*N8y{^7$ZrCM z$~OtM%cr>8*2v0)6NH%AzpPlkoan&E65AfpmEtHFbGP@>bI$50iL4;1U|VFX!wue% zC++H~)g3i|15FaD-FTn83&qhl{@5`4!+pHH4^!G2I>8g-%#lRGRwWMrb%b!fywsLs zv#Y#p!0Teh9udYR2+GZ@uXqIG4PRsAn#C?nmeRR$cv)= z9&<9^9BkMIxrj-AjJwaA%D3|kTh10S|Al;Sz5L@Ta&-2o|5ge)!GB3tDP#*;tba_R z^vQgzR+InH2shO4_U$r8#lZ4_(1%M7tVo5R zQq_|RNsVWYlM0c)x1>H!^P?R4dUk@NGzg6GLQMJl)V!nf9>MCscH*xx@4O2gDb`fE z(L=Ff!Rcja;}%W3k4KLbZ`eDR07*LNU5c(*M>#;zEj|WC;WT%Q2qLgIwW}6Ull`v{ z9+#plc1CdG#B-Pr)Cp-+5Ta1&1e+~pwt^-Xhfasu7}X3q1h^e?C+ILPG*5tbHx$k` zoSu_YTCX)t(zzjmvTaZEyT_V1M9~Cxv z<(ut&jvQ~MS&?qcvl-&t7z9A3CdVw~@s-HFS)+k9Y30A4e!8|~^09+#fYEY-jgD!< z|BBTi81FKrvRPX!uSwd&ey;BGruC0AMhwjwor4)AibVoi%{fI#sy+8yeaD(5@vLX@>b3D2shr{1B0pY>$zRD7%=oWP zsdUgtkccrklD)6Bn$OxX}*a%nu&RI&cL7 zh%jql`Ax#&|F6nL&wkU!Sjq$L_TkKx);c;oF$`+!ULx>sdL0`|Hu5$EA?4>fnV;xa zXg;D|t~&E<+Q@Z>!iYRye$UsWlG`zm@wa2~&6lOdcw1$3!XF(@L8@<>+&EvE+z?Vo zL1_#@;O#!l60|{6qXXlgz?{Br-P*M^Cl}=H0nXWbTa%xVTG4QOZND!s4i|1dp)cSY zu4W9wq2z%4!Elx&Eu&L)a{pNDk+0r^$B)D4C}a#aH}9Sw_XMk6hk!1m zw%9J-$cUnAaXmCJ>~wIakyYNIkj$ewDJwZ`QSi(*awly!@o&5aw4(XKhHBWwmdASL{EdT^=0rV3WRrx8KZM}gNqI|l&Hc|mS z%>rfPpFZ`}%d_{Qxk$yB>_Jf(<4EN;cCrU3wE6yuxOBJyYgBPL8nFlZcn$YZm6 zbr#*>l?T(Tixam_T=qqKp3<-{oBiz}axoiCB=~y%-Akjy?(rHci>gyK@~6qA2GbSFnuG2#}s! zraOKD@>+=adIt~N(T#3!G&_ZvUYw}hf7RP$mK2Da0@TM#!8yrgU3xQH;1V6clhlwxM|KN}Pqh7+hC*GBu zPQTI7Zy5wWu^g+02AROi`T0YSw^s0|#1tLNTWby;l-KRRxir9rUJV|M3B8I#^M;{8 zupcXU(Y(9o-Agq#x^T=}pQnxiq!C@GdA#EwyF_8y!$<){Re&fzq^oPx3#gU)3r;?! z1tF4DSenYAR}e`B8lUscN=uXyS00Ce+7ayh`fVs$J9lg&zn+jEp19MsAo!bD*@7Nx zONqm@^N0IgIZw(gNs_QoqtT}m7y1+MOyIX`Etc(G2SenCTBcmA=I}Xfq_tgbX4pQP z)w6$0W6-T~W?4%dvSw1&=)|B-t>6u?S$~z~A{L}HiDcsy^s}g6?oBYHS{R=A_Xegi z-*2wPB8esEn&u<%u@ij#xC?b-DSS0WY@{N7j~m`eug!MG(D3`l}2%1M5mGZw7# zIhM=VJw_4#H=@HRZt^6y52dAKJVkERaVT|IxyVHhorSZ-*=S9)!3cLnjpv#cA zB{>dXv|Dqr)$((g3U>>QGtI#0mZSHdRl0lAKxP&~wdO;(HMjuB+Zu3bDSC&!DT|;` z^uDIx@O_Fl7!<3Nc)f?ppi8g&JqiRJ&*I$VX({wrXA%8`@?+0Vy)K44-le(JWAZKz_DlPiWeP;77cT;I3gn0-zC~)97g?9v=(!!$qjbW=4yF zWMt{=^%dTwuW3BQ!}*ggt4AY%Wp2_y{VOd0gXn+CkDPPXIU_!?SS|`E8P}kGrNT6B zkHd*NlV%)&7^L(~$PjRk?2kWQFi94R$5?nS>RM5-r`PMQu)gQ6C!RoetkvQ%70!}x z+5e60;r2s^)Qir%e!e~CaP&E9@|S#(i2@(rDBoQQhFRQ2G7dQnmWx*_!0?I2#us%a zgN9U#l`6SaAK7@z+OV8fcYZ*TF0HxZ3HzGukup|UhbQ7^WDlymk)gWiJ)Fu zu?gMULjKskDps{q+@eQ@=D+v@=T=s2)7e=b^N8)(6hfMejj=`?VTaFTak~6MMhu9& zk&`$mkaJq~>NSjRsg^kxf)4-zAPuBvFcfIF5Q#al8@E+qykKc47^lvpsj@<7I zW`u%|_hmUrzL2~N4P`^Fv4u;c{J{^_VUVK7xQJtUsCew z0I)iYxJS%7tS|`Z6ovnTYh$PI&vBcnI4TMnJ417{ivJ6h=&=Zx`!!3Tc)LV(-4PnE zLY75?so}S4{>c@Gr=xw#FUazhk;z~>GSx0}FaPl_^6@W_d9&AALP1B&AxJ@Ibv=eCe?vsE@yi9!b$()FBay~UW0C=oal{slB6EU=c+e`k+06Mr# zq4bcynj=N|socJQP$CAZl~yug9-lC#H0EN6yh`iPA`Dk&7Y|v_z%^R8THJY^p%Zkd+)DCAf!f?;~AU z`Z5r9Xx*X{l_IM^3!ydF)G-!-GvFa_&Pkd)v4fILPX zrBCJtx7+2aaf00;*zm7iwAJK4C(3u$FyI@|xE;L#vWbTa=O zH1SqFQ!xdTF@I6e@Pf;jLSdBC=~yz3Nz_^u*Zyox?bcRRCZl0!AR=guMRK#v#A^_wS{ff1dW4;5o3G=;N+BFme=1t8>Osz`NFe}8c@ z?ND9(E=0R%ePiT%TP>ZhHpGJrLuXiRbe@K~3OGnxm`vCb4!JRUX85wK&f@(DM64gH4EpBF@}&%ch^-GPws+-sQPwI#BlxxF-gjEuYVAfTVxMon!+3q}!`8 zY5Jy?X`{^uiL~VRtzLEYHO}J3emFNw5M$525Wnp*>OhM0dFp_pB#M~QMnC<}N2_`ip68t5G< zQd;VSzxtIqHCS+1Gkf=+n0A}iPygyy|C+rPZds+{ zyn;0@*d({bZQd-Mjcg9|B{Dp`g6w|c3G&0U&;BIY&L2$JGEj)OCH6U2e{$U&cgXi; zgGH-BrC($PFl9}ZOPKmbb@MBX+TwDQRY6m`R4TvnM`bX|u}lt3;g=KRsmGfe_#qy2 zyA92wp^=B7g-7xG_o#MZO^?i@k>WKf1`Cx^VON!;p$J8vGQ+4vOZX5c>Fm+tS~YJsdVF3~{(>yJ zx5%_-$BGq-TH@GnqfRNURias}CgbBRty2`V6A|YRdgXM^C?68w{cK_rgr zaNO%qO~KAY6iuvSmJc@!*h!&=eWDp870&wquZ@wxm+rh%34I=V_;2!`*R5WSEmDzH ztInAH&YmSpz^PJ`)oWIRYUtw*S_2Y4q2UKsPWhWtF*EZ%rv7ass}>|dZDJ9#OsI6T zudD)&8~1WKn}hd3KzosI&$@M#n#C-cSw;R)ovv_c^h@%U>8kwi(xNg%iCM3uyr|@8 znHHBVn7iY*lqZcv`DwdDqv2zrOY+NyvzDeIkQ+|5+h=%OgxE}0kIscqee3^68O(rw z-s^#v=;5pEh?SP2im(g5>VwGYJ1Tf(s5Xg|V2Q;=PEf}2r>a=Gp2>33Ytl;~x?vN& zA-F^Fj^-d02mnNd+VPxL3FRGifkDc8ew%(6YOs0`f${^fcd8{>Xx)2_ao>=<4oj+4 zFJ|;Zi}WVlV!i1FPHoYwrB!-{yyr50ayZj!bJCj8%=mV0cWBpe(i!%-%+q>9DL2E7 z1;zvdVRsYf;H^x_8^5uk<)C9$;es-XJPc^lE=z(}B#A6LZ3j<82Roz-+wDa!)*(&C zs%vVNHUFl@x&()*;^=3l)0RLmU`|MlY=e%_F=*M-7qS6<*zCE*35fR=a9cqZyt%pf z%tCc^$H3%CnNs}l`V(%=7i|7epKFcH9A0w&Dt4VP>r61doPEY(h(aF$r&0Ru41h&4b`G`0y-|J;krJ{wm=JT;qN=&9Q9$#rK z&F86p_c|4eUX!c`PU|YL)v8a$vy1u3pK`3w+6}rRTy$xfXf?fYj zr63C~lNLRQWI#>6wNkoq_DT8i$3I6tee|)%UZ1^c{d$N-I|eZPA&i=vPPLgk<)r<} zYgd0m+UXkJkH=@I=qCALWp`P$#d&*_bCq{jW?wFj3_*2U{-5~JNRe4`G%^hfo)CEWai?q-T^zr|Y_fV@NE` z$=?BqWm3_a!{OH(93j2mlthP<(_~gL=a0W`GFVjnU-^1s6A0QXG*{gpJvlO9ja$X2 zbpq`tUmVg$0%AK|306ecNaDWLIy=Yl|D+uevYg2fjW(3CrtQ4fXO;MqxeNF2S2X0- zkd5*ceM<_pvzxAfe4g8^(Tt#N$7*(2M!rsdXg2Z2fYelH;Q!D)&sj1sFAT!N;u%rO`Y2Zx**gN@e#$ZF^{yo1Z| zoZYAz)H&=0PQj1l&zDqHE-YpwL6R&wvq8PYe-gU;X*#~0;bW1dK4V`hX^ARQX+qTE zd{`XgOexXY7wxCVI$vF` zGimZ%)nCij_$Vf#hgiMfavL+-tv-{^9}bz)Cs|#Fip66)WaCjoP}xipF#yQ%Q&})x z6m@I;`D|K9fcL~k5Z$NlaF6)jsI)9-IT^=mtRCsLcsuh*W4$9Uii6_X2E_EZoCg(7 zr?yD56jN|PxFn#*aVBV%ME(V#;;;ipF(Xbq0zRfy(Fe$)rb0UxJD31feLNp$3)U^v zi86W_E`_FO@BnCl9+!^qQc&vd)Iq=jetJmWDwCz2OF0twHk=8?7SO^KBYe!r1#{SrnXd*V1bo-Yjyte*KoGkn!_SmO07-sY!FS;VH1xLc)Y;UAW zD`nTl_Gj$F@>Pz^vY0EnW?3e)z<*dR}cY>6uCSpHHKUB?1A4 zPLAW)&z%p26{?!IdD99KUSJA@01>srjZqL~x8AcEkJHGA+G55?Kw+@liZ&N`c3!G8 zplQNj_c^Lom*vQH!Bd-~`x6+wYc|Rcf{}9e3r?FgmFkiiys>Xb7X-fB+{IIIXnt4o z%kJST-+Qe9*Kdoh_~eq}iXY&q)L^cJzB%QJW>LrP;4&Q!pVD7Mr>j##**SKdgG=om zwMY~hRA2@bRu;xmSzpcnZ{eng&h&g2R<;bS(VNFCoHjV%hUekiPJW2WYNF#EADhk~FTLgIe*Wd0(c^B^wm+_4NwXMdvd z;l%pn8s$Nrq2sn>y*X?W3qBz$)~p#ZvbfLZ8})GsU>td#F`|1#6wBq3Q!0>4W$#+9 zp(Y#4rE{KeaL1O|6MqN=mZzGha$56&$SApKyik4b>heUHYFyA7S0C!!3$eZd z=v{0^h3kfSx6S+LypPSh4^~2PJG93h^GTJw0t#D-qbS0Q=-&3LyP#eBz=;7W1|1ZH?pD{<#!dG7W26B zdADOjvj4>!Y@*5`+8M2usQz#pqA4Kc44Ul006cW)qXw@~C=77KY%wvh4YS{EG{DRc znIU^fl{wkn_CvdO6AgO(hD}lD;9wT=yBU-wu3NH1{=>}7`+)RXh~MA}I`pXwQ9oMn zaRBmFDz#r@vg`S`{E|=OpY)V&`q0w_C|I6?d)luhWG`WQh7# z{X3^jyl&Ci{nk`{rT_~1`rXn`|A^q}@o$r7&el6^p#wL7wga(!iX_}~O*D7)2OeiV zX2)T>{OyIr8VXFg)K1Z}omrSbvCfZaaeIB>v`bm73isHqxv7YT?SfRD{p8F{rCq5O_ZJtH1-_4WM0laR2p?7}&@bH95@VJo8=d`? z#^DL^1T#kclAScqc>nNM*m%T)kxmd2TL>_c*>sP8H28)yp9xa3@)9+b=SO4nUy~E* zFSl0P^O%k4SlvqO->>-W5IFc#@Y!_g!lL6?K65w=b;olJXB4ugVXoq1JDY)xP)6}~ zC@MovV zVU7n59;B}KpnUgLd>Vtx)V{)^p-6Kx`zfwIw!hCiR$tRszhkL3nlcM0Z`&;<)T1W6 z+m|h)Jso8J{Ke$ZnDSuuRnf%@ZSv~u!T`C|UdM%%O|@;!6YAt& zFT$D`>{eavNP)B`YAs5x#!0|b*cI)gk0KS+u=qDy#n)Y@cDuhKFPc*lx~a7w7o-%!2!iQH;v7F$EseCp(?WXPD&rfWu$!>A;kMavpk zgBYMSX|os>^~O}G>0PxdN4QV-jl_Si%tN;sF$^8^T*RNI$NIn3TI;Gig}S)5RZr-@ z-#3uD08i|@5xS$7V;0gIxMM63w+1S^sQxKv@*V?Pu$-(b6W(170uZc5_zL)#2zItmx-v86VL?+%j|9z-0 zVxlDC*tEi3-a79Dcx9y~avara&bZ9^f}S5hB-QPSr|1m*3pVcm1`<2kMbx6uWl@%f z8ul6T+&5GYJ@o21uFGEf{qHCK`OlZH6;6Bc%U>pH`Dv(EGTLay>T}r4HnUOZvu?4U zzGVxFCGcgd$-R@4myM5KHar}3?sYQki!a&?E<>qa-dJf=Z@Q`4sBA3POL|FfdQcn@ z{|1H+mDT~$fzlWQtm8L*Qz5j9uqA-{EK=6ohttZ%Fpv~Dnj6?Zo!=MK6K~M zs^QJ^J}?)7ehTZOXxO2XQ~8a7%PPEOAl!LH^c^;Nj=7A3f*^(3iEgte&5$T{je61U zvlEZ@Oa|Vf)(v6CEJKs6xmq_46NY~&K9m}LXQ#$Z`SxOq^sIHyAoTKDl?8Hlo3&b< zA2QAY`iH-#=k0o=s!(?JWP^j7f{B@o7@zPvf|kY~{B_CN&j!ckdq;lV9)13O@B7AA z6qU9|zIf!ww{4M>!R@lESRu-pIr#v&O8z)mEx%xC-1PqIN|K>6I*iy-{sr0l;XQh{ z)fSMSUx~*JtMRx2Z&$8l1_HiGOG$JlEipqNmb8QIw9ly%MQG65>`@;t|Fde&iguBy zGptoii$%UBiUT%BVEmxRb1)nET4d1bWm%tP5bqAi?+HcI=={NN1A-kv*}WJqq^fF_ z+G?$+bWn-R5L*3Vs~+VGo`cB$G*c_9+f~CHUPmhtpxld+hzK-P4aN3@idf zIV>+_BVfnq>Fxxd-3@ya>G&N}W4b+bOXyp24Ox5mrP+VKNM`;vbZ#r-s#gpA{P@6}FzLy<#(M_L1D*4^i_CoUn_E_|mcI`t>UrjwKYs;} z!&B=5RW>Fu^U%%j}!UqC8dj&7c-cs`cd=RPzvJ8!N+TqwMMB8Yt$h!QsO6uxG31Ra{6%tbReSRhf^oo zy#c>_!xr|t^lgJp|Kpl9B1sEVzRa>na60FXPdKeUv!1o2fR(9Db};`qyGbA_qX}{s zKSpc&{Znfu^a9(L91dM^1?~GFYbZhO@Zr%luj5ySN1D>}SXxW_8+CsZ}MHl;o@N`F<&FtMR#@FKI2C`rM#6 zTismBm*dzF3WXYG1jsmM!11Q#dW-o1U+@yW-8vL%rTdC($i|`M9=6%S)?y%#@MR=# z_CQg-Fg4UqLmM;)K*^4zYUN6fl(j5dv~tW)rCh@vQr(m5RJ&9zoNU{?n}FTkPi+?E zjsf*96gyj{>9$aSh2Uof-zE^GOReZh;sVe$r?;UOJMFsau>|goFP{?8R z>uI)iB0C@qbMoul>eK~OKe9chG%%*!k&4}(6MR;$|-{m(o$8gfB@f`L#l{#bqP7vfXVZ#36SO}DEht(VdlEli4@ zp=_UdNFVT9!e*n(*x%+M_SJ7cBl%1;ZdXHv+=!Xehy4qpp?G!Ja=QF?GLk%imO8$l zZ>7ynqs4CxgEs$(K>L;O{N%u7KrONNYXyI)~#Sp!W z#EBilrYOpSU50v=fd+8*BBB^buZ?mS(Ke&trV56EtXr8qiok_t6fL4c)I&ArX}1!E z06R?I|$%m(@)Wz)U)=-#> z@h(?{HCPPlZT17FVBjH;ld-XljC7Wxo)E1jJMuq|O{21UU6Dvd8qB&}=>@snUs)A# zXS0Ps>6Y#5tYvPXT=xY{UgD~|Tg7vV#5@>a zwww-Qmc$<>CQ{F}Ryi>Yy@qa=FN8+H(~=NRu2k88R~3;#_n2-y!`AWiGzjQA4wyvT z94c!w=T+z`V^^TVq(FfTmRQLcV$|y^e>xn_&Sv#&ALVQId<%2a``#ZMH>lnKg za^D(q*Nkwg9KN%yci4)N5JTGkp}~))BubbG6E^Ydj7Bieb$v-6-?9I+ zy;~yj>GxMj2|D0s%CE6gocze=Kd-s-PV%2(WqP_&EN(6FFr#6vw6*xS;5k=_yE281 z@!LOP5!lD%@1%sRiK>fE>4`;eaGNlWWDpmoi2I^9v4$a*R~5^(3Uk%gt@hCmkHB2P z0}JR0Sg&#e54vgIS8br=>G0WzpCtjuL zKi?eh&)CxtTu}=FMd<*AJslHCa=c9geZ$!F*(uEQjO`fkIt%$Mr!s1sBf%h_PQ}@~ z5SS8;M$4E2&hdDPF5pqc*MI-}#60!bM>Y2_W^*tUG;``Py$Nt_u2kS*MVS2)+S=ZH!Uk4 zIB})8g^jT+hES)jUK=yyO(qw95$v^O;z+;-h)}K8sBMDVtaDU-c~F%cK>2PfYJM)i z5gZ6PpbD=-$_B!OptcU}+n%2)Jl(EKNLd`e~pe22mq3KvX0#6l+PY#EVD2D{n1B1WL+Xmk{t;aL%-vDzVhXN%-#T@lZY@V z+PR=j4yPa|LGVgW|CJPt_5Vj*ul99Zhv#ijSr~+uY_F5k#~EH^u(n zII4QAnFw5O8*n`*)T5Rv6}FC&Lobe1d_p&%MOhP9hkh{kSsfZE=Wr&4FZotDQwOq8 z@}PGto%a9>+?4|JKeoKs7nl}}_HrUF4H%|=B7fZ^xcz)IGaNFD7Wv$RAI0N^*+ZK*qp3ZewkErcc$gkc<@a&Ucg(&^d5~N8VX#`( zv9K_lTpUc<+P;$fFtd}FMA0(j9V;%(%mfFxwikx(Vc8WXAzO$HNkjF~xKD_iPw_7+ z)=JG{yUZ;Ag10BqjjpDSNcXp5(~)mAdLrG8e=<719(tQ(Y9mo1SF!yC1Xuegdx40O?tOTAx!NANJDfWiOki^#{7bIy_ZP`6+`L z^u3|fpuM4UXrL|lt$#qL>$2I`PCW5l@;#`@I0aKU1lFX4X&RtQ%I_v;(XlqOLU_}j zQ+BTpN)s34NmBj+Ij}LA+y!k`v;aRmGjrl+KYJp2iqE$>dAl`L+)(sbQ|v9p;=|Wn zM`jj$tX?EHmu5E&iZLT*){$wTJ}$GbjvhT-6UGg3n4!$s)s1qYPL8JNgSZ#u#|o61 zsoe4Rs8g|?0tK;-~JD=NGSF=|=F zCt+$tiqQdv5f#o9eirI)ctvNONnD9!u+Zq>Q|tq!8Deb0F(|IbICwj}rz^%p$fN#M zgMD!fMzh8Pbw~Y&3LEpc{k|2BS}5kvIr=fdt&xPi)vD#+w+s&LFyAt}u`Vq><{j8_ zK)%40bq#3E3p5sVj<9CNENOQ;MN8NkGP{Er%z1r+JiCj)wBOvmrqZp8GP4SXN`Yz^^e~;IZl|Onr5f9jmLe zca~xc1`D~B&>+$wmfeYdwsrF^$8L8zCwlCErDTc?p<71pj0nr!c^=CeVBtF%MAxj- ztV4NH)2|Yh&Zaa7@11bBcb^n4(eVskpz1rnXiW~5yoErklC#M_DO|oJ7Hn4s?N4k{ zX|)i-pOyw) zT5l+z*Q?|sn1uQ&ar&0^v#Is#SI7I})1klp4Z@$BT!mbU%{hna?cm~5gEeC~o%dAw z5A0o}c4;L?lXdG##eq^SZi-s1eWv)Ow~J`d2-!;G57tY$Qn7^4SiZ177=d0a>U*F` z^Tud7S17184Wcpg=AzlAZ5DE6+%Gzl`)bt|;2j(=t&>nu{R&oFr*PouO;PR%ZGu;* zo1Hu6!_;UjJFq5)79kTAD{q2sfzJ>fUe>*KxRzAufL<*kqMEJb5h%+k+u>LBQJ+gM zXve?M+eialrE*HK0le(LZkwv0j7of~8l5V(GSDwoJ$e(98mc__s4yYldA`fXLdI^1 zhM2>Ban8r3`ZEqJhlQJP>cxOnrDt8_-2PIZkjZiwUtKXIyiwzFEYw3)AOa!OiZy-A>>;QMjzU^rB!!|UK z{J>q}hxIw1RLsT9mC*i5d8aR}k6B~sjMJGN+F2&sKMiUB*SwjKlXgkWAkv4lmLPpU zGoJf)b0~}wAC|(3D`zz-?fb&s~xKYfceQFBMsO;k$ z3I-i48eUO;X*WK=HY@wDzyz@(-CPctPDfA8sv1N&5U0UUO*&rcjC2_|G+T9cAXS?D zD1MDH!tm{gVu3Hv$u;=Kx0TOvGLMdoM4~LC*5s#_CwT@`O;?+7iw3XRbS+-+{3soDeR0`yQ-^wq^ zpVo#l760He`HduS%wQ{)S|T-Uqp3=p%&$dtx{TE&`5ZxCzi9CZd7EJ7J^CS)YOp3h z*k)!lrl`tj)Wa7+EGAn;CEX3p`#kB*2)RiMmSD~$pQW)zh^Y)>-y1|Ter%89VK6X z?gJ}>6R}8Ye#UjXKe*zRi}84Dbd;z7ajv>$9UhGKAy>omyJNbn5X~jX?uB1O$3jmv zH`{105x1#1dtKQQkN&>UIJf2xeLZpC+^#|ysWkLvuwYuR4(k^b7ZLSdnsY6 z^Qk~4?JF_Ql=9V&6y=Zh4-Q;~C+<}ST9I_!=`6_t^yhop4VPlV8|Abh_RuI|F*H4i zmo;>TEFF_GXNS9pr-JLy$~r3dY@Q zpPAhRz5BiXLxyZNyPKJB`PBF4{kEq4S!cs8xHw0^ua&O0x<#8>&5S@wiWtrH+sJ*1 zS65+QNLLA_TfP~b@%(Fdu{Yha*nP&z7&i;4ZBHn%AGQ9k29wr| zdKZ(zAaOZs3YD}ty7t~*GM;~b?+z|+4v1+JYq5ShqcF0ZKH&_R&1MxDRw&p=#E};j zTIPOB)xuVU=6OTT$?MwQk@3l(XYi7ykg#}nR-8fuq^d^LNa=KwhWn?KFJx#MGy8{# z5*;L$iH*U~+R)yc44%4Wi#&a?ZtW1c_4o24ehV9PB>u8{_wB!{77Eqh-98#|ro2H` zv~%my5Gmz#VOOxNHCc5c>x{cl=unwdV2KO2VBeXR${%8#td7*tc(f)&Z^TemT7B7| z-oi)BeuL3tu==+ro%x8h%EZNid!oM zJVn6c#Y9(3@IQW)4EZ2;M!*eMGt9JORYI|Dz2uaRJIbx`RJ495{?yO14=Qx5MIQ_}iDS;J zmp)21Q?_?55D0PBwGVCdCMIpa`V|<6;#m-Nb}U7AEIef2vWKXk`nF?-#-3pyz?lyO zU17t3K4#Cv@`kCc;J;TA@J}a9oHeY-+3?c9gcLW}O`OLDjUUDmwCg<>YjzpzKC8y2 z5rQNH2$W5ux9hWJ9xpput!?x`Ke^J5cuKj9Sm!3Q)gfsPczqs|LJZSofFJ49Qbn*7 zP%3_3(Pm=G#Z-;F66d1qu`^sPF6G#eExG}-23pHqbQpwz1F^2J=*aTtp5rJAnZQiA z>@bJS)_@s&^hUWRvjceg0=SQ+Fz2vmwOV|~nrGL16{iT5NSuK_GD?oDx)gK&_mxc8 zi8_dV5RwBRPtO`$Z5`$uXA7|vH7R{QkAB&!AC9m3S$cNN5T`kzM}^3XhWIq}hL$C& zf^t#k|Jl`~u4EtBQ|QTvlO z@(!qlQ{EbIycx%|Hk}5;brralc-9o>ZEmN@;W*;Dx<3v%Gd;c3v4_k}$RJXaLc*5D+3$MWy9 zyx;5R!wyXP1yio9*ZJ#Ti=jVf^MxDn{D8%-4aO8kyUP}{7R=V1S;yNj7-$!G4Y5cP z^)|Ua$T$%DujFX@i4&8Q_qv9pb(zpYIFMS87|nD13Scs5G)}Q8yJ26h1F!V0Ywo0R zf*fMWBsjh55t1i*v8hSv85xW^P_uwf@U&1Z8w5FvhVzk&p)0xa%I_;~V6_@bzXjIi ze}T93BL^Cr)9)ngUnz$1Kc%<6CuLqHnIGxARyHgoCdFFH6P_9$5CUpe?HvsNr*|$m zQ4V?s8adNlcbs|V#TU^*OU${fRo;2$`R6~feCzD2)nzU_Fpptib-NwspAR*q1=UXS z*p402_U%_t3UB7@DpzLNioN>z`|cz6-6wrR1SB%xD2#C-wrS1|E>v_b!yfQ)REtB} ziZ{#Gb^dsUuVhMviot0xxbz0M!RRtn3Z)F0ecIdc|7X6T*Xo&3B!fy<_?6^P@}+^j zd|eP~!rp;sr`>)OUyA(Mw8kOpPigzLJ@+bJh$3bvw*GSL4~%P%ot66eI_)8>xLN3F zV2fn;jGNb^O9sM={ExzWv<2SZmq7;Kbpj|(N2>p~zhZtrDcxu}xB<(yU-87t@|lE^GDxW^Bt@)b(->$-~1Ph){kPe=;z`Z{Fwd<<8OM=7`6&VnBFUe%n3mGb!Bvu?AR5uXYMDZGT7-vQAwVK z>hlNCyNoMA(+O zK+0vU*}@u1f=}{&;>F*;^a;$Sx{Ou5NBZk0zWCC&sv1>$_=tJ8hE?gk9)a=cxps+w z{S^cLDxJVt@@AjcrR(VPRu+-~7L%PT=%Lm6lo-wMHkZ;R)&-+chVp!jZ1T@ej|xKP zmOI|l@{0olbsLFFuaN`GOw-Oof^p;A9C3ahY%MIB6L7-JC)DR=W_G;{GUR?WXc_0cSSz``RlL$zLN-M z&A0xKrlZjDTFeYtnX17|4(2f84N2^m#>SGe{Wt=$kG4g_rhe?WRT z@AaD*0)1g(<$bkOEs8=1!_?FSWHdFUM#Utm=^6>Rql0mAtR!;~z6aPp2^uEXta)s2=7J?@!Qm_izuQD;eE4}A+t>x&9pLK@6h>6OM`uLj)zU^iC*wIaUj zq^PY|#-yjQA1eZ;4*Vw0-3m3P8BrF#p*Q$R!DT`n=aKf|SN>z>wO|Jh*gc%fVDN&A z$fq}R)|g4OTAbDZtMVGU{Hf~~<~Nh2N7&Sev}IzL(F#ts%CmYG;doSWHwve1-!A*p zjq_Dw!kJtj7TpcU-kr?$d9sbShpb_*#$(dk7Zx)Xfovu!i_e|f;<4C`%8ou*-`H_& z*kzk1Hy$&X1(Y&?wKzfpyp<=jN$=7d9fmk&qfBmf2rvpGUYprrF+0s6LFv+0p8s#VqI)knvfI)#~+DS$YnFi@d&!>c&ar7%MO!4;?5`&f4SiqK;!PW}3KK7hwhu)ji(_d7X# z^QG+?$ELXPhsDs~s62*rFzZfv((LDKb(83DS&376T^rq?TXX!a-`5pR zw@I+-YF5#jvSrLccMY`wruZP&68?xO1(t?Zs=1Y-%Ny~b=#z~_IzCdg?P@%eOo8nB zg;X+LXUl%PT!L zx{NE&9)THRUnErkyY!em;xau`4>tn=pw%k|G%u}+^{;rj4;=WPYSVD|)GF}(C#|c{ z4b$MsbdzPH*J&eF`|qXK-U3E)vKEbQjmNjAQg5o%+HmBZe%Fv9KfW>UicdBo%FD=? zuTmQKm<^aPm%dE8tIyd52-mSuClCd8I}1+13H!Fqn*o1OGvi|m>VF$=w$h~9WktjL6)V#e|B)Mh* ze6Oe?H;&(p`E~-%9rPV!SP`tFj3I+_#YfcS;UioO`M+Kq>Luvf(<$K^`S(ZM9d~R8 z&~xiH7JcRIo95!%zkH_S)K4vlg>2lk59r{#2hfj) zG&tHxqc2g7OwQXTwbO&n&hS`Z=;pz)4O&8Zt~B_q+Ucq7YfyT;Fjh^(PRraz{(shl9J_E~~)@|)O> z#a#(^y_{iNY`$7`cJ(PJe(c_6>MmuNdmOq`pGE%T8QOH$Uy}6KY#KU_VE@yypY+?Z6cGs}p0d?8~V2u*)GbY{s zXtHICrb_-`B^|N09Sc(%?i>+P>U4Jd(xIlSejqip=b6o8JD6Kuv{rcM$VkId+dP=i zYKU?H%-#%yzr+0Wx?%Hz&$;fD?eW3E%QxRUJa{i%6XhB!>a@eC>!g9>qAH>NQ*lxU zOQuSfPw~pBSUnIJ=I>9 zROLV=;nR05E**(2|45!EzHWj|_;T)6HDzR@7LAQHkyoEI$xBIc(*t673%ab&O)wF^!1; z2^@E9KUBftAk}_$s@Rnc){9x8dc|x$GBeub5_uLF@lL1|b!ewmvIJXeQEd?dq9a$V zOIsMFR;>ej9p@PLib2uv=I==B*IL$B5FnL<+<*6jibN_DDYh(uSk~3t=or>{;|2HF z_0wWjC}z*R;KG`VFIOtUVB^rz&TOC<^L?4IIy@H9Wkz6tnlB`O0%Yq~yV4h>zxV`( z!M){DKo9MHaCYkbbUkda54(U#iz6EW8$!=M^iRTxWl`|`ghCTU(N7-c4YMeV^lSnR zBNe-LVHPvt44*zyE}oTX+%=nv%*~EEV^zBn&BKxQddIlQWhC3)ddd6X_Y zcBRY0U2>iwV$@FG-WdlYEZ&En@))DPp2Td&>GHnzo3a0JlvnOKm8dHBd>*~%a!y0< zIaQzQ)hDsDG#I9~TaIsW)MfLxIagW=iJ4r9cu?pNxQP~khNj)M{~aD+}bI>omVAe8@BFgI17hU1ACrcs4g%e?_^5dSa(X? zJ2_g>Vc!*G9m-SqJ=1L4KfnInXKV|Vr|zEFaL+_{i%=EBvT(}L$lUswKo``jSUakh zxr8~8Jgfo8TjVL#{u1C$oVXTnX*6Sm>!){u#(Fdg0MG8*{6)_|;_Ik==qeOTrRKh< ztyrr&E8Q~yUD0Wc3YE>!7D8SZz?9lih9V~ax?XJy`=UD~<9=f^ozk7)Wu8 z(#(79ws@`{$~Sk#xJt9*<|iJRJ@3H>8SPFD^RYkOXGw(ve(83=Qvdr2>2_hXGk*KL zH(|-8_a8nTqz&5=1H(slpMqY0JZNnOH`F|ZI9P%7i5hwT6P+!-DYtjhx4C0H_WseS zkKX%x%0CkZW_}KOVM)X-qfoRvld{99G;%#wj#(%R%}TRd-fQX=!LfMKJ?M>)BNhM` zuMC~|J01Y6n7sFL34(s}NoHa$bJ~C<-yHC!M~;TQc_g(!&AK8kyM71;65Ri5HJOM# z94{;@z9=VbAF*U?(TE@A0Bgcvy!t8d-hK?&l{wJQkle-oqI~6SO%u2z4)2+ z{z5Xrv;m8$LXOm0XgmW6m|WJLvZYe7?Nw_km*=x=s!)_(p9)X-CJ#m1k)?4F6*s}y zfylCZJQYk$#SFf1gnYs1HImUY%Yzs*#sUL>KxY;7@VOOK#V?@RqP=^zYGh$*`cAgj z&RFS!Hm(}6$0I&+g}d2+2GyaTWf*5T5pgM@BAZTq^lwn| z5_LK)X1A3@#|p+j4lX7<;0Kvl*q(Ky2F^;>Yx}B&&EfXq;D5)%2g-g&wOoKr%c73C zA6RuSR{Cc6HCj(QVbe}No}|aQN=Jo#J@gbUDFa(22Lp1Oi9+pYv6+@g-fjR^cW>p3 z@jEsS`g?VrGA7`UJu^stmiCPYZIxCV6na~ej&YwqJQHzL>_vOQ?(QB`nVlRDIvpr} za$2kUleXu>@#|d!!Bk7$h5{DRqGmERPg5}aJm|!O@DxRgDjVhP zRZmWYv_(Nu%(G!H$1t;KVFGLAHjfES$KFO{B2vvAY}HTo&c?QWZczwtNe_&lwFe%m zl#T+Mvn^NN7HeoDg|>h2>H$YllQTFBm~jY!A&_|hIa4jTpQDR0^80X?E(dqur@ya%Q^ zIcx`KB6bmk(nw&D1ki24$7nFg=1QU1Kc>)HJ)&zeoC^+%-nF%?BN>a>`~`~zn%{-E zTQ#n+8-97sc`8xMo03kK`(^11Ts_z-Z{@}rjSl>x(K+oI=P??Sz#4-FaFwvel!Xq0 zKdYWp>$PfT@c>8ix&zXu&7W4hu&9FD2ai#R;E}bt>53slF@w=h^x2WaJw zx|zT8ma-|N|HOAoo~D?D0_MZT+LloMy17(na=hze9d-+pC5(L_)o?$aB9o3W&GIeTPiU+S};A;3;EAD7-r zxrbcQP@B1=8t6ER;^6XpE54ZN>&)txG+#HHVt&O?*lclPOW^wbV#MxNC?OcP~?bNsYZMW3e=!B?!*SWFr zP~FwC*IXrHpp8Q4^0dPopuj z0y-ZE&S+bcQXkZ@)--kPFFV`>qFKd`d|_+AUT$_gF;BaZM;(=-VJ(`jFXiWT6H22I zGqkD!Wg;EkeA?{<0RizFB3`S*tXV$r%$;}A;u(3*O^5>x8T^EydXPvm)R5y*5H^7-i%ltIxM;#toBsA4M z5&GHt!L9}|FRd1?Sn1xS#y8<}{g@E8RwW-;cu+Igne*wjo=RX$da9-KMv{EVmH_?T zc7-eENO%pRVWZullYTh~g>7U(!{dWvUmqW2qAFj|HImE3#@x0*IN_?)7JRNC+Ca>p zE8!P)gG37|`=3gGNNGhLOejZH7G`@ZwJn`2%wFnrR4RFU&J@d*f3W=T!4%XC7;lv^ zGmO(go?8BA=Dgd5hJatUOQCF;Ed27xC&|GbpWNIyH8GIhUGtT)X-6}@G&FeixY4GF zq&98e-{RD%)@ZQVRyB?_Cf+?|2w`p2;Mceb_gRlK)?U?ArDyE_y*@z|@@Sem^0D@AwOZcfw#3pop;X-%#$X3pNm*YpBC5tQc7};vy)-l~ zy}{26eez~<+O1Fg{9W>3k|FI6_@wvVD?b?1wlD2$?GJZ~OKB0bN?a|ux7oa4(BfCu zB706dEu$Apg^X=@`Ra!Uht1@L*8UcLsq{vJK{s-FYvzH`gN@Uh7kY7~0&*?I0RDh+ z)Yho~mUV7U#IYv6n-1s zv0_)guptrJp2}3_!d`H**mX5eCg9M)`xz}Lh^}mjNOiyht zvR<9r=hHj5l%3T+H%ZnK@0Dt!+NH9vXyb@hopkZBW1;8psCQDkYSo>-R%kt_l3))!xt2_3&G9VQ#lukc$DzIfbz(f{nT-t`#qttSfQ^S?1< z3977i!H7V}K%_gKdyf2M&nMTHcce<$Q_}ez?z*_WIdaW<0~9TciR|{p{S7gDG*hm5 zxwI%|Id|>N=bx8eKZxwu2yo3bxTh51wfum6PT6Yllg>>JXNO!6)wxC|#$2AUnRPLT zTAuf;Ox){f>8#=Uk(Y9{|BDBw|`*-vjF$rCicn4X?`=w#O=grGeVD>r*l5 z7ruHSW-@A3W3*XJjE0Ha$qKLqVVZ9prZ}UaZt=TxK6<;fyNjsei|ViDu6@_v}J$XR@3+B_3T& zHTYz@==E&cw%`QuV=}m9X@8cBof3MSG9{c3Jpo-fQ_Mznxw_BD45Pio@IJ_Orec0= za?`pIF;l#1Bselq zCcJ)-UJlIEqrlZ8`e9zkd77*(pYRODGSLyIYa|s9kNW(1Yw||$vx2hY`o-JyG0~k| z9(|3P3FdoX^%);~_F1#d85VTXSBJd~`b)amDQ6|HHWZ!- zw4GzAp{wWG|BVC%LBX&XY`t1NvsgHtjJJfmAm)VDpPqjD%C*binLw-^kN-xxk~}3n zn=ZSxr@CW*c>R-mWE)yI{xBvOHSou45#{vwKu@xvtC1cxqW}=nTaI7I237R53G%7N zyQX%58h~EBy?XUmN?|=Re;8EY6zCzvXjR|k_lRob^;|coi+bH7*`Pv*RwLbESBDHgLiFKKD6B4f@09qy{)U7L*T5 zA7p+kef7;Z$=<6DqO8RxwYsSE<2`#m2x!Ch+IiV<(K1H#u5>6{)DI}s8ht3BarwhG zZ;Fq2+;cfQ!dbY6CDV!%}vhI3C$m9138&01a-+Hq@%wHK|i&o-Nb&A~SF zIX!PEju=hz%IWE8)Ufi$-vuciX^CLkZC*TD`%TBWI6A;PVIKdCY5g%r*zq1(l{8 ztYg%rvl=`stJRncdcE>gCE2*K)14X^N9$QdesWaB8XRDERa*@hV^K-0I4cCEr^(lr zzr!3@;G4XyWV07-l!fY8@xap7n1Kt1)4sML)trbG4-_1UNYL6gM-vG)H6Cct7vqYJ zcw=3+H!OWX&lzknFN>}KGmD7>h?6>;T5>-JdhP1uzj-6So~+`-qg(|$nRgbQ(QUhS zopJD>v}1|J4O(DsuT~sV7-1J0GOIY%&^ZHaPH)dGfhp^mS(@a~tpQ~c>Wlb;91Jj( zD4k`J7o2)PnrPPh2VcZD(l4UUv~QK^3CF=N<8vhlfTQjrBmSU&@DC{`8YuW$#i2-k zqt_VE6?jxqvk6NyW@N$L6G*wu%5j6q{9hZi;fxRoN3S?rW6`)&W*cv`@doMChemc! zE{;6-;x}X&i|uSk6*GAp7REJubT=N4QgS|>;U%>Z#AuK-vehaHrCt+G#7zdIvX5DU z@w_)ay4G^fm*q)}mmzRG7O*Ab0exNT3TNEoSIt5SOkX^-dy}8fo|5ex`re{5;uaXK zEyiggYo`Xq$mVU^9>_~C4VJ+hlFe6$Eorl*SYit*(|U(sA+E}oOIPZgLe80ewrHulZ)zO*jo! zLm|2Az_GTVOtptS!l99e1{;nFhl6C-)j1#M4Qm@3fzvuway1*&mk$k}T0V`1CSl5Y zS~+1$aK7=e5w~~S($0@p%C-07`Jr~Z{g^A~1F4>BO$NB-!wPdhhn~PKTZ3Y;tgF*^ z6x2|y-W9oWj5X}-k?f*z4d?}ff2E6Sm&NXCJrU?$#EEb28_9mRjczN+Y!=W>edd|_ z@Bhe>!C`Fb%?6{+dv0nfzwhJs-uuB12EF6{Eoc6Ck{q4<@sD3s=@Q<$`aNTjQEy{w zyE5-Z?5WZ+9b3pJswcp1saL*U(!^td4KEH3xVP@=);i6OD=P*p(0I29SGW)1&$aHZ zExyK}^pY4OobT5Q>mn7 zV9yJS!{<`Fq(i^y8u$#_U#=iK-i&$occLOsCofOxfArEBf+q8-(||QWJ#p1CktkhL zEJS}06a0HC@jP@pR>}}?*fLaBUOwv4WhVi?G(Jq9^nlYfS1hzsgI-T3-il5^ga{Kq z9Ui$AGa>m%;MI#^*i53?Zmr8c9rsS=i*p}V<%7e!sp5`^^{3AmH&g!jaMMnMJ zsXdLbwfhVG!Spx0E@($%b8J zhb@_mn*aF58*hB_;)^dv{vO0xUWXn@6rJDGkuiOC%@@}EGa|`;4T8Fg{z~E_>bvRo z02fXF0rLWNek=Jedoif2c0gqlR=QM(7JwT-R8i4y7V>2>(Vqb5>o-1mRjk%8f)Ah_PcZ?mDy_5EMc5kbvB!0i^53EPibrI)@*=- zhPg?vRx9=oZLF19Z5~98I%x z+s~VEcXxr)Xu$8R7SrYz6`AYL)B{N3lsLdUcmCFV?XJe%XhB-^o;oxZBEqs@7Q zhHG45vY3_T`sjq$H*|cBD>&}tS*Si=MWRMk#S~4V7pW0lZhgrNv~z|n+R8#UFlK|Q zlk&BcfNZD>!2@u@TCA$aWqR|UPuh|TPOC1FOW${n#=`r>Hn6R{YKYYb(`kcOY?Z@- zFwq%227ZPwtZOH9V+_yj3b@-^f3oOow#aqCVO|`RvI?bQ58LOlsG**?797__WFbq) zx8Dg)qtEuU5F8r(di$m9w}feecXFiybqjn({^}m|7=P-YJ9(S?sM6I$vqy}8Ym7rd z4;np~z!>-bWJfHHACD6$-}^enA|qNsd`V(G`eg>J5IDn$Zx6?I?B0{9?S6K{_-^klWE&;EBjmLEbir&Z9bB)O)I|!d zKzN`WHxAo(O>h4Cd4pMZ$K`IjvxDWshxVqu)l7iNXLoPk7@YbH_1WR$_drix1B-_l zkUY(g4eNGN_sqcA+MKE@ME5UkF@s*c@B~DF*sgG7^%D$&UqYm5$_Rs ziCnmqQyluv8}Uw(Xwt%WdL$;SP4Peq7@p@Mo@n;(vL$5OeborKE9zaVocHO_Q%~RE`jVu>-Gms z6}`hLYOR*%&y~gA&Sdsx!vp?=zo8izco`+nz`#?XQ8VWRnq%1VrmY4*o9zcI3E9&2 z;J`JQ6oi1(wVk1NUw(Glq(JwD^Mz|x53xH2$3{K79xksNSJ0WJ+pA~IqN4YL7;5u@nXhCz?q?Z`TO7c)=#8& zV0K5RvIh#GWVmAZHA+GZ^Zi%fcmo)E!&9w;p@nTb(xH7%FNAmO+n|F5uYA=+aEe zc-0_KA$ZSt;^t5(2(}#U8_1K-7(&Xo+11`@>`!LN2rc;w@KY3tl`!DKE=6Rp{12vq-g*3{Hd=}(Tc z_U=7OA~Rhw-X)l!k>2P^&on~fy29>DGdWvrYI`j@GgP*OwDH<#*bUVf=fGYr56}m< zcObBCem*jAfNB4*`zv>QVZ{5l?hmO96W)6Ym<_5ytOMR1BMXQ#GJ&_g0$l7vEFI+zNsW42ZJOd@J7MK(ws zD2|7;ti`MvZISz(gHGpwOFANqT-Qj=2O1%|2WnZn>;UYA4#;~N8#STg(?gKpKGRq8 zHh?rAr6&{&u6?ald`R{9PX9Cinmi(Yj^rB_ zf;uMbHT(ZHQjarJ`ecZhd$~}$uy-(!Yv5u`^W(w8# zFkjRHgCt!ky-b9eu_^Ltp^0L#DD6oMy~!t+5_)anl$UFvhApoWz5b^|*{ubyIa@3) z-$o`qm3-1tZ{E4J^*WSG#Iob{)^^T2pU(xlUJ0s~bXBlVyP)kxC&LGUBAWzWZXV1= z`@jOQiWkQwY3NcZW=)uH#p}<2|O)f*AA;BOjuhYo9|9f19->hshkWX^J zNj~%MKr5-qx#v#2>b3+b5s!{nfpdoW5~D#KVbCeC&GbyL0|d+xrhD3JJDqo}{QBLQ z^~2^6qe;fw-ej<=NCbwwVLs&Zes`Q4^GtZWqh9F)(UFMs2$>ouhow|JE9w-3n7_5S zgeiBs-E>5Amo5@_G(GyBtqu+t&UE0KSI;`@EMhry=+MKL1%}yjvg#}an!jiS5PGm~ z2W6)9V1|AHF?R1P(f;5e)Map*Dmey0H2KHlv_h63{|*<^i@I^}`nrZaNJWn|7;Ab0 z{RIO7>)D&bL&x=FC9@~xNd^_03?%u)a8}GY zMxE(Jg*Z{+kZmUKVW7ZPl3Ne5*QR7Ykm8{AFQfuI>Ri320vSp5WV`eB zo8I3V#UtdXbjNsN$EJA#2^8jjnU`tjuIasm(TRExl#QsZEUsV>;hh$gJF#Ny#rMmP z7ww`+Nq(3$di@@KB3wH>{;>FYl%!N-^0|V>;R{%jMl@?x%{tlGChMA91r=GID?_Ns z-jqJot}8g6WmH;)6_Nu2@RJ&JI8|z15Oq5TPR~S1dGdw1?`)91{-`Y+&w0qf7I?; zjH^qNK>6D8K7}kKM2|3n?zcrvtJWDcKd8aOY2hoV3G7uAPmcdJy}vFi_D5XJdWADZ zA@It8jzQ5pJ362;+95;ot*TBCd2P{~Idl9={LA2d(=g{se}yEo*XnU6gN=OrzJxU%@#`YNG3nR; z@$+~$^%J4VaSg|}UET8s>``0Q6eV+;rT??3@wKltHj&Eah70V*Y{BMi+%!>}g=BFI zweS&z64*6pVWF5K$Aa{(_F65l@3f^T%Jc#_pv>Gl>1RqksGB3>RP`8;a4{h^ue;{L zWc1Rz2e0WcyU0zFiTrWmjO^^?qtW3T?|AQ=vr4#TgT7;wU%#B<_3R(8lsH55o#Fh&SL6ZWD0(X51s{0g>=?TMf8%^0Wpn31sGo8U zfBKx*sb8L3|H3iPsh^(Y6W(WHzTtM6ZHvvJQF7~y^jD=lnD^z!M)-+y&VJ{7aOm7K zjzO?K!(3l8MH6vrhD$_!{y@aaWjt{)&!yHo#{=6c?RDM>`)Jt~c6IAocO>o1irGX! zYX9wT;qk$my%~GqA;{ryTpM*vCD}bd@09|z78=_q5!q1ejeKV0CMvb=wBshv%*uKP za`^@KMlKTe_7RsSsKDi6zC3lN8Hkx7-p3nJ&Rck7yd0QYSnDBUQssW7!DP}rG`TQE zSY4aXL>!06`g0c+$U7yL{BH7^3l7B!?%|2a!1#w3?=eKfgS0!(yf8rc=+sD^lSYH1 zWYOTz=lHez&L8YZH%UK4EL4KsUBsS6WiLM`Yq_3y^{dA$PTg7W#8ajhx>^78g~xrD zO~MLk0IkPSzs3A~a)(-H*04##xQVlv)B;D_w~FlA$&qmCdc^L&!Ly0zy8-)o>>Vi&G!B%rfIb^4Z`CiRT_U2H|=)Z0GtuK$A!|26`dn6gt zfK8GiL)WiQibG?gF2cX{?0!n*HLtox_7YpSZmJK0dSbw6v)ZI*TUOu?3xfe-q8`+H5YryjOt1U_RAN1>_4W$n?r z^g#1ve|CS)>&~Tfn<|D}bHEh}G%6M5J(w_o7@&NHV>k=jkeiqg6JtH>C%<1FXeN1e zdPjn0%qupBE)OE!o}I$M=pP#Se5{trY4ch>2>jGT^qqc$cqX@^nZWAVTC&y{@L+UK zm0FnU2+`(cWwK`ZJ37erxHK7iz&s(W&*U8?wD3Rr#V3xadHoQ0drYcMXQ+10lmE<| z-E^_Y*5a(I`BzCGZw9AlXM(ju#cJoCM?N%LnL?AtWYssD&lhYp3*3Y*mZpU$v;wspIoJEmr)IJXAQ3~kIfRDGZSsAjY{c}ae1;LomdyJwkzX&f^#yM zdoQ@S!nTOJ=5R8@){@Sx9(IjZ_;>0<-<&TQhFRy4syP$Xp=3diD2P(c3R5Cm5Rz=M zR<^&iTq6fS-)gyDljlFEeK!;>v$Jti-eU>P1zb+)&spz`$a|;Bh$D56^<(7j<-ai6 z(QB@FXDh3<8t0hbx&h@G@q9`-xhZWqCw8uT$|5j#s$A|evwm~Reaz02gTgwCpgh1{ z>`Yo*w&pI=R#qhMF}i%s#N3v>9cQzgGAN-7q&4%VI;CS`-rJV0Z(tHT>|||4G4RGd z+eq@5+G%eo>+7@L=C>7vVRc#@doHOykhFvH3cj@rOj{Q@DD|y?t}uL%V$rBW4WSf- zJwR`h7JvG#NdEBT@|L12ok|Dq=7?5dbY>$$B^Ok1%5b(|bNMU~qa@NF%&qwY_2SkW z11|8dlC_KmkVkTaNgLCJoMrybDPOl7lEL@W80BIZZz|81kJeAQ_Q*o8nZIr4^rPDb zChZxHOLLQW%}Ug_9)*?~LCt{jvQbNQQiXs5u~)2*tk;8^h`5Xbc;vT5QNp12s8gsg zc;9;l4y674%iXJuDJGMhU186k+Ac{aPS6O|zNIQ`6S~bk+AHfM!GoK?LsaMag)sL0yo~cc{ zE8IkAVz}}1c4kYwV9RCW(pv+Ky@{q!t>&4|`!%DxkCiy+#bOo5F`Hm_H_o-hqke7k z?9&fsi@|LNj~zQT+Z>VE?d-##f|TnikAPRil7VA6c)^i^*^!Ueaof zXJ1IwILXCK$%NX2G2tDbor`k@sLC6bzhHG317(JE@yY~i!==>aWj5b z$Q(UXcKfXwSMtpE(6RcY0b(7^jzu0@MSp`kR2nN&#Y^0mFdeQD6Zmwpw#_KQ~f%rN2CY}z(T~7d*Xue5Wwoj@R>DlR- zbj%n}Cyn5mxj1*L26g!5k33G4Y6Tmp#uZkIWb$TA$X%6KtTP#%%G84YFB&0dzjO=0 zj4JXzCK2D_OUBpDZ!HOC91H96p;GL?xtDZRT9x!lv@<)vk^q~sYwWJDqk`xef_iQ7 z%G{mKZnw#_-y2>(KOgfq@?p@v5;6{*BYn0Bsqh^_b4zmW!a_NI>gLS8J=?;~?I=0e zOYC-f{n3{QL33jgG0Okv`xfjNtSm2%(oMO@%TR%PI@ZwMsu*;bajOp@ zFa#iwd8c+vgVSrq6hvrKIOW@Z@KDO0oDHW&?BqtH)~HLm7j|q9b4I`4XB>27IcL*z zL3s011D^&9jhYEw6+X~TZkTFw95<;lm>pBuz;HWfI{ycIs-EdhI|^f0l-mdGWlo2# zg6<&lP{kTM&g=-Vp?1W{SX~m7v)$EGyMpqjhj8VSCq>9K^p&3^>|s_%vFUm3_3CJS z2H)BL=6?B~#!_;pKrt-cD zO8eMjcii!`l)Zyo0DGzCLiW1V*LfG$4fBoW`ua;37))b_+8<={NKG zys5HwPt$4$qMEbZXkXL5D&JJa?4#@E0yb?Z8qp7-b^k`;2V!G^qPepnpc0a}Ue+ zUru%93TexzD9&&fkHCk~e*A2dUW3X+);z4VTDFJ6-QB2lO) z%X^?`NguNpJQY5d3TnCri<(rDVd(+e!Qh6wklHE96MqUm7|ywxKAp5`}UO zAr9=EQma#gb&eTSeScJ*iI>i0fDl(}OF6a61%Yjy&*xTK>|kdn>y*$u6-Ip-kBJ;Q zhfsN>ccK1OfEUutVN45}H6~Y@*%+GkWw@c4^&yuhYm@dC?SrSGPH5vI_7<9vvB-2> z`i|()Y8068PG7CZIGaxIa=Z2W;NMxG6IDu|#mK36W%P!h{*2EFLXn(*w`S_Vd6l8{ z1{(cN5fBgcO9R-ZP*Vd_JGBh`ll>1~tzSp#8S&Mv@8w|B;Lsjg z|2ENKuHG%f?!gDp(k30)U$IQjKWxjSwJw(co;ioxrE!Q_W}ng^MExDRSFm83gPFft zo}a#wFWXu=K~Hu`*P3It37OsGHvC^nwr<^gacDdi&u$9~R|%LQFN*2%xcBhFp`^lU zATzhg4<>o3^n>_lEpEi(GGj1NjK&kqxqdrw*5NZoX$5#ch!mqQ$ z_IEsNL+m))J}$}eNjvfZKE<`9uQmc*XCu52bc$>ged#K+9vY;b@-iZO)HjF$c z3ct96c?lgH*lk<~7!O%ZjfS{#iJXSTlzkZ^n zhtwaEm33-^#$3;QCZA$#wM6~u!RY!cQXu$)mf$7OVEH=pBm@L;Le3@EgH2ZYl_%hb z?sv$Ysd7!g|L?s8N*pf2686J-{55qxZ@ZteGf@N~-G^j*r3C%9WMCy{msf*IL#!^2V(2`T zT6N#!NX-I_0feeVF$v~K_XdEFl)lp@D%t5)!ua7bqs6G{pjQ9!A?c}e0^@<(r=P*& z6qQzK$|tV%MBvJ4W4W}i84GmUouJ-(CdX4cH|F`y;Dz}CbKD@k&WX-w+Ggfj)tJ`i z6JFc;!EW2L{qzgk(BkWeV#l>T_m0sHQ1GWOSvRz|wf9ReBRJ0n4MN26U1Qj637QAk zOsvg%ouaYj@%bD!(INYrhmYUKe2;lq#za^U8PWI}kVGsBc9sn?*GNa_neuw+D7k|^ zClV8i)?5F^{6KnhNcz9XIfKVPh1$n2``>Tx^MB(f(4VwIEXLd?ZC=ZaEjJXEr=`v0 zqxAW%@vWEBjoX2RPk_?qo^>zyu#&R*jj+IGF=PWkMrichq=J$eJrEl&pudCC8!&$}r$t9uc- zO*(c_mtl_%oP~HQd;B3q9JSV_%nQ1PfJLuw`GBlOyR9GA+vK5l3}(vjzkj}|C8HW% z@9cL-Y&C=v1y~&h#&M z9FDb^bC)0dq$N;_kk`gPwr%SJ%~bi;h4~MTw>LwUo+}8Omj8zFc_iK}+ekQqW*eth zFt2=j;Ay-cAM(*%%ui{=E3@&fvD2G^;6UDS?83=AemgTK&B=TIugpiK?~n_>A*~~y zqEB)k%Jlyvz4*f)4xHO=pF6;eY-p^d>$M)Xc#QeEjCx3;wu%ZOEzgA1G!Ui&=?LZ! zUda26#X!c~8 z=RjBXv%fd!tdg;x-+S+qWx#eksE8Vg4e3vF>!d}&t&l#h0&4lmAulfqj)e=gAIF{<1$=r zaQC;*AK4!s%oWXMa3R8$9;B zBVgAVJ%z|MRpN8h9nQMr!{k!E39@T;E#_8up};wH4z_9W8l-o8Q*4O%BI%{zHBo^v zTMKM{n)%N1B=gSy9(WD!dlqwzw3p$Aeq9_)46+56!@#~}q6U@vM5RELbQ96^fAd~Y!jtx)a4p>C#+@6iwxQ>F>r1;`k!FI|Oc?&? z8gRL~?)KwU*;zHjd~KnHQXR$jU4#2fZDn0X2d&sj8PUCJ^yP4@AHvgx=1;yYE57qu z=J1Z$|5AHB-c!2%@}$T+6hHZeHIYiNcF%_GyE9>(Cm6B*NjCk@e_G0t@6ac?lgvs_ zN&j(t&GF_IuRp5mY6YGjDYiE$HK=rS8MVp9*A$p%R~|ToyxpF)A80d?^-Zv2%ID&0 z#b)@fb|2S-==lGm>pKA3s?N53uJ+!0SX;7e+18$xymy?vVHNLcL`}+dU(c!#8E*VFcMsX~YH|N(>(i`J_XXlH# z3zv@Fx~N(*vv{q!RKGAV#ywo$z^(kO`Z9lS{sZ5G9(xaK<>Tm{_w5{eGuWQ3q^K%9m&#H)Av?sg*?gz`7LRuFH-H0 zI#HWStlp^`l5N>gT2{iJRol21drG|wU$++dRSWknJ_keO9;#CtJD3M@GacLb{#j!S6(i6 zqyD78XLWep%F;Q^kB0#wgqfI+kgIT!Oct>cUcEM(HZ`9`0oJul*A{XTqbFz3%Ab;t z3>19HfB|m$?w<{k7+L)|F1i}cJFnwDsYih^alxA-lL&H(ZH|8(^NZ0;pnu-xv9>j< zmkxJu^|9a>_hfyVJO0Q0yUFxBwS8D7>_I=cWtSngQE2G}7v1QLb&iGdTf#PkfKAYO zyqgBCf;obAWVga)8m?Q^z`~q3Z7fU3e{mPk@&p%;l)9oO7^3Lcw_LxH6mzGXc3QEk zd~CZ&EhAC7AGB(nPF+ZYEE+c|H*59nHu{lBBdYD_#O#;JV{9yOC&&-ZG`XUt`1vLm3B5}m?oF-a4?c8yle(F?gtbxE@lfhKzM^5SCLr?h1j z@~0cQf3|2_thm!rRO>P>QWodJQR3s;4dOBa_Gcl+j}QQYFD&-Ljvwor%-lP+j5vPH zm7CEy85@CA=$(Q<~@cmt4webQ*5%1s!Ah&K;v&Q`?^)z4XC{ z7Y@BOuoxGb-E(LKV^DLW3Y$eQqW6s9@qC+uvQ|(Wp<0g+(&#y2CFBqqVl11w(}V3i4TVH zp#m%*za)Gi|I7mM-?3l88E0M+e&Kf$tGRi|MPa!k8FzNNWjeJlY6_s>fXof7$z|8a zRc2FsMR(U?-)86hbowxmHm^w}hIQZfO~;i6ovW{}Y&nHHj;>I9HRJ%JHdQ!T z_A$v~h#OR~t}c#ST3E*Pbr^Loi(u<9gfg?$(~zRPZGMObn=z4ia{=Xk4c{7z$fFgp zxZ%J5{`Vs3QZc!MlP;5xhadjp4%$7*ZF=pFJ1(Hz^ za}Rz*Rgnm}ny%q)-}&77GD`oM%$SAGHH!R^4|2T&+yMWD(P3-U02%QJu>V$1+%sc0 zisf3RD&Zb*Ce)zYBujp`x@+o}%gLttorjHlIeHi_@?8ccat+T}5KC-HM8j*6ohyzw zb?&V)gQsS(k-a_i_S_uqq54wph!1<7$V9 zrw%$h<~P$aq{T&cuGyApD$*2kitFO`bO2!U7^OFT;QnjsxN2J_*!C;YZAqA@CBJWzdXR@{ng{LrblKXyzZAhu{qExOx{k`J;~>Rkiy4x&lw^ zF(5TbenupV5yq|1M~IWYPY%182FROikdw)J`eWKzovthfK}pJ#atzN|81w2PT2tI$ zY%^6BSEj4nH_M94nas_hPMr0j?SMXP#?fHoK#w#W6hUzua%$oK345E*yBN~K*1?T| zzX_&W8m2ePEjIlZ(FVF-n+pYJC*tvmK%iho7xvJccz14T2vrvkcihC1E7z~CpS^8} zw2*Vx@hGpO=-*a=s)N3?4Hw}mOM{`JtH+i1`6ko3g~4FK-s`GHBh#fm(owW!K~-V{ z$p?KdIKsVIALcwFe|I4rm3{iDa%}#9coWTj!Op6K=e*J(3Ng~?u+lQqdAAuonTh{G zVqux^2=U5C?pa=i7gBt@I4uwlbOQ6t1Xri1d6Gq|o-sx`3Zbaj;_>Mw>FJ|Nx7VZW z7&xN!`TZ)3{*e48_GU{U*v7ME9IUydTawicL{Hhxz^-|%M+5i5R`h1e+DqWrF8C7jI5 zVRwDd^AXOfXlOJ6R3*pOelL<>X=!4k&j zOhA4K|0QGv!<7j^T)`*%AKA71nP)!uU@T|s)Rw*7VV8WELk+o#EU({o%m^I@ME@8r zacTL2GX0XfE>_WXxX0(t3)#f3Sjttd?@KM@{#>8UZGX1<4bI0TY?2E120vFq9Bv4o z#f#*SV1USYqfx}>ihU~ngEh<#oOIrB6rv-7;$|T^W#!i0iftxO0&M}I zn8?+{>Tu4l#(PH07X8)aB>Lx3a$o()jidWVHf|)Jp<1Pb8qw?e4Oibl&1r8BIwT-M z9pgBKtRtH-m?NhCP4TvpHET)w{fml~Z|+YN$MZocfLbBr84=bVTUD z@uFqizHiGX2`_(e_~Eq+Nik+PGFi-m=*%8rfz6qK<|W($dVmmmz*GvAxAxnQe|>3N zzt1)pDY?>dzY>%iaxOUAL(dlF?xi(U;b4$Gq(~n>Yg^B;VkNv5%`6RAvdV$%wsgij zv2aDFg&1s3MWRPbl$8qk{$S65@Ok|QZWFEN{RB^opT(jCd3uPZ1~*dQ+jPqy)&9TK0iNCY}jMvcMp2^Rl_+}bgkBG0l>zn3IA2?LDu z*Cn5F3ZuhV)w?ZPF8#^atl3|G^8(pGj-}_3;>z;cmulLGRu|URUX}UKR5#$NqywDy z_tsl$!e>gLUb~9*L*@32Jj2p3Ysw_($W9;=V2>eW2(N~PqyfAXI_n90_0S!ghaZsz zY!{{2LP%l8SGbp&#<-m&vD#wPg*01O=1T7Mabv?M=y#mjJJJl)uP7Up~`Qy4W)wpgJbpXRJ0H> zkc(dvYXZI8oD*=>Z-4K--Jv#ax_;xuqeRo1j@EV!&=>3}GkQ)+M01hv6WikCKxsHS z5>y3ZaZ~5*x$SXJ(5i0BhsGBk2I~Bs$86@VdZhd?`3$f`G2c6H8GkN>{$c#iv>{G` zW=DRZpCKIu`x0^fcOAJs>2aExaO^T%z&5{Ge zs53t24)*G+#!^Ri$kros$BRLFH#viUZ-KOzOKfvXc)KLeeZV{oSg*`ihgD+mo7mC? z1X#ntZH=^a-jEX(kVTKeEMUMAPuyPcI+j+XBAm`*Q#dSMwEy?OP13G^s`(NTbhg`btKU^%n#7B$ldg%WkYh}LIxD28)|7z zp;Ifk-=af5xQg|7;PvB&R0hPlKkg}MODpuu&3 zPy^P5=@lW>YN){PWjr~8s(~Gr;~iZTK0@0xAe?08kZwo>3W1!bcSoB!5Nh`ZT^-R# z{VeX(2hfPtbq!-9CZ2$SlgoU8S3111o0kC}z==}xkFF_;vgPr6B&KIXF(tzTO`N-ek_SXX$7!E3OF zySj=Ita}=DK+JBw_12e8kdQOa zAS#gpgGuF%i!(b|v2h2`spqmcn zim_J=jaWG*^uKq7D6BMFY?_)QY@q+D$;~#ave(&0u2h;@E!*4Nvx!uvv29)-?X0!C zHCkjB&v^~(b}J>^$2S32E1OaSbxZ1xO%A_2G>MD5-Ciu^t)a}C@=HNyxtKCWb4Srm zcQ)>5ZzXH}W23{Zg|)2%YPTm_f z{k`-&q)8ii{)P~%6*_=L`A9<^I|pEY21#Z(CXp=+kq0S`3gkn7`rpx0?stxtbm>BG zdbu%4%yyfkzJhzIt`NCtO!!4+g`rbqwp+!2qp1;YdbDY~kemCnHRZL|(@beAiDfdH zH<8A>t5TWzuOHWcAIp37KZg6cxZavSPIRw1WhZgI~HG1>?IF!ifeJ+SiZK|Uz6975=dA4_n0vZ2o4@#hm5$wU zVi%{844_CvP)s1-gOCxj0>bGNA_BZez@!dl z1yAU;-3a6~7*Lyr6A(IRcjIqc<_y*J!Om*Dv$(=?j&b3UeJlPbGlB`F+m&tiiYxKB zT$NP75hmP%sJFMLU~%V4z2V5vF)3TZWG=beeC1S33)w9Dk*j9a=OfAW^~aWv{FR(~ zqc-mL#^~^JT;x5y36M)~>rO?qFV|rz=%;!$y^_bBH<}epkcC|Nu2xYZC*NY0%YhY; zYIXIOdz9XA++quP?dl#)Chi&VxpLMNa$%!Eiw+KS)Rtb^mMV>PFXA4kZ+am(0GHR^ zVba-R-j91Xh9U)1)tvXWPQ?6Ns{XA1d6i8PQk&%R;wX0qgurp@i)-_n$tCX>_U>i( z6#;MNGSu}qBb&_(UK8hV@L5pM_{>Z#H*^m#iI@@A48QY082qx0Y^TqWZu$|i@wkY8 z5`f&6!yJ(xb{PE%X@^(IG4%qsx}Ftv-FhD`nj?Q;gSfNpsd%P4*_GCYHQJDNZE|f# zI-aHb_V1t0X1TAsl1cjO?qm{YeiC`?rJ?|`xpTmp%otHOLR#`xFWbdD;UrVHGujhX z11z-2G^~KEVTm9XYrq$;Seo%5rfQj(6~dOh$Vks@_O|x!$qsL!Q1Ut5$&L=YYdma8 zOm?~2Z6cjPFSfSpg0oKAqcIpNcC*c;Qpi@1tR7T3jh(rE=MR1^*UJ0R*_-6*J4Xkf zC(bUg0&b+&j^g6R^Q~QWd&uihSLH^F%cyaviW;xkmU4=~QpPzu_2%fGw$T4ryY)Jy zbX<<|IE(FGdM#N+pCO_z=@&y>y4R=dS%D%0(e8uwm3L(cVN-H4DEzJzq_0)}=C zZ0-g_DmdVobcjMEG$sJAu*8Br+UVvCZObCCLNpWYHy|7k$wV3iSa}#C2F9Du3>smo zS-^$`78!DhFmccCk5G?TDOXtBVTU>DcS?x)J@){?m}E**P8-1xm4=(xa8iXwP5aYS&DuA-l@d6&k**z+jd{`Z4&!;xEIc9Zq8>1jY6l*;SHD@%$ zxZ1?TX&_AHWyKKo^s=GB%vY4_^YZ zbg{pO?4Z{k-MN7KcRfM=eL9JJ@vlb#2>J&;pR}bH*rWBxXBc3Kdm8Ktu)~>#JS5Iy z;Vlg&z!07X&VaSQ1568&EE45+O~Zw02DyVx8Nhu;ZybG+lK{~28aF!&ScXC%OUyF&{r5HI+4)xm(A`w$E#C@bh0iaFu8QWSR*X z{ZZ8NvP#|!nE!9pfiZ?~_R(ib53(%NCgE4ekKgg+gG_or`vuWGhL!U2-}qT01OXd@ zC5$4@HfD-VufC(&4gP05v?4x{B*x;n4pt5wpDDuKVRPJ>aCjCg>!I(d!^W7i)96?urT=+x&Cp+m*Wlu|fp$IS?J`tH$6QYI z{>n(o1`E(FkfY<%%&m@Zz9LkdoO7E|98L^2YL0PnFBI6q;9OJ)Vo{j{p<`9jDEC z*(>2P^xI-?`@eGJbL@r1$UCnGCMJl?7Gs}h>@I>&#>)et_Ce3%CC2t&`|GW8{wduV;_EIXZhb*FxVSe%gZW z+sjIO+~dKxWpd#>r&Ht(1i?+xZ7_Bk2FrU&bi&m}PNo-~AE?5~n!|1X>%P6@O!7~D zFI#ceW+4{Da0M*?Qe>6(Jemwz2r@j#6GAd$uhF%R2XHXufKn-@#iZt@IunG|vIZjR;2|YgXEv@|rT7pGX}St4!9+r;l%qFH_m@%L;Uw#)7Z^SR_)`ovmvp*)71^cpASiVB^nKcJIN z5T&C%ur=Zo8KwHJ@?c15(S{cII=WO>N+j~Q10h9Y)w3m1Y@Pb8xnq!ffPV1$>y*)K zX+33UIXW*ETM&LjX;VoS9AS4zDqUzp7PWT9uTljRtvw*t)H?OrWT<;X{$CP_G-J&7 zjRu`vwm}Q3Vz5W&0bj&8D}{(~BhMCwv|{oKCy`HL2t^p!hyv9>!$6T7a#lrnGq+*Z z`|s~TB`Tt`k3as<10SA9_Yn_26yyER4>8o)c=^sdOLNJJs|*Q~sZ(z(&864PEs zC@uXgKZko6sKZ73h~q2%vxRwn3pZA)nQ1|Yk_f&IJ`4|FhH8Wvg%8UMk!EEs$k>Hb z#74H0`FuMh?O(xh^z3I#k+Mb$YLPsRt2^&g(dsR5%RQxdsSr;}`pzW?_9 zz3uZ-oqgQDQ~5Og91R{N{QXViT)9yVDD(nqA#CR~Jfd7iV6f1l)gFB621ys_9cHQn zn>tb8s{0>5`8bx-Ywivt!G&d(4Y?;1?XGer zD*NfpjGXSeuc=~!J9nHa$d_!8kDqzQS;}|oJN=83sZD9I(xj`{ZDd_>Q(12>1e2Tz z{GWI1>6q{pbm{7VubMH0O{NI)=Ji@M3ghm4lABeYU~4LC89+~rDPW0Qh#&|Oo$+z{cBLS0P$@P`|2 z*gxBa`c2d{NAw0A{rk`bQ$sJ4tJklmo~bF4U$>4viRWE~(fnxM5YdAi4=+XwL-bd^ z6u{}+d~}-P)W#JLliTU*9To1G`oLdL<2+y7aN57>?0yt2L$FucVYA8*84)_83;0cj znr@sSCL5VX!ZG8Yo482EXU%T1nW^T!OHUf-?CwX#$UGW-WSlJcke)=o&&K*kaM7dK zBiZClp$6hKS_!4ePw7#@qe!)^IQ_`V(z^d(uz8LnuRe)-2z8@2MX)sZ{WUYe%yGuS z!Jo#CW3N~Y3!7m;@)n%KI{ zhj+EjGFh|5k}I6v(rNH%%|%ChVpH34ZUeQq%9Tpd`N6!0FaDG{Ty9n8iq)Hrq+R5B ze!O+L7VRF=q=!Z(xuYj(J8+7%$+L_J1B`{@swyz!C}Q>)bWXEQT9EkAMA(E+oA9iv z5efYdO3^h^OUYEIsC=2tY|Twxu-v|%={2JtBoCt})9;xp1T?^;d<{9_ zhilhf`3hi!*RZihkMe)3+!2zH-;gf)JazTTt4Uv?)gY>hbn9@0cMu!48iqwE4v zQWWIvE`}%)>@GGJIl)Qb9asdTzzc#M%uLTtObeQE;U_Hgi)X)ps{v+`ozR>mR~rsR zf7tufJEnDsehrH^*4jzOWyZVC^>llB%!Nm}P2xE;G0M4`z}ez?W2ANLyz|K8v06H2 z=<7Vbuwib*m@ZX3t&0llO0Gh8W=J;fWmd&y@@e-~{>^~yG~fcX&$@U#6AeP!jm zA91Ls!_aN~rae?M&%`YoQl;rFG*6}tLYW<1?n`>=$X|eylE8l(CyQx>o2c)YJ@C@t zY+U5^k8uqTeKJf=A_yFOX*EWTAR4uN8K_k1dn=XcSebhSM&hyW75}z(PGw?|(@744 zo*RSTJB>Z4;k~jfA~+0XiBgOi%mFX!7&Q?ngtL&5jom4nRc1f(!9na%fMkV}dC<5p z@D*j`{L@cA`|OcdhbJdj+1lJH#n9>V4A0u4u$s(% z%FP{oZ4h)#bLWz~POP3@x=*y0KJ(AJdaHN#(r0N$#xW8I^*gf0k(e%#$=S>1v?sl~ zJ6<92*pS;Z{Jt;4y;09|->3iSc~_8?j7MQ3_X*CLs)1E&Y5-u?7%30GfwDqW6kDkA zg`Xb$g7AU@;J=!jMa@;Zmg}ouJ0UWT(+}Y^0}?=54zvIwwsQ=L#GMq~*cnoQNLmii zCFDjnm8NVmNf%}h*WqOY~3l@=vwOLTY8Uxd4&J1~TM z82~R!AJ&X@bzx_uc_&PlHSPn_RS@w17v~(ikH&6m25*|wQwaO;dVw6-$5{uj0&3vm z>#yIpZ}=~Nx#5N@u7C~l`1tUj$aSpG#Lt;iN*`c`A@{3eZoc^#7kFUvJ@j{D#WT(* zj*-EhJg8vnXLd~h|C=OdPvz$P8H4E4(tfN%h)iWARPMqiop0S`UHeO5V9?AWTchGK|Rsa6j_+IkUV^K)AgMPe(Vb|%? zQbS@%gXSMc6%w&w#z2DLd;E+HZgtMzBvnZktJUJYszvlM+wF3iTsiVF53VO~ zeEB6ku;#JHenQT=`ks3}`)vGQ<1X@1c}b7CQ?2bVUsAq!$&&grZ53`$eKWW8+1_`a z7`=OHs@!|;y}jkB%I3|LDcpk*Igi7k|3!@&#@+@RK{#pr&V*tT08H>hSxpr_YSR&8 z2ToY}W+o58NxWaigJ%6rkKlXUa{3Pu`K@!%nKGwxMK@9H8`Ad7qRVG{hk}ldHEUPK z>1pK1{rh2Io13=t0|9HhRb{CJmqdvwiIz-1XM_Chi!Y2SyFz2j`MQm59UYd!sFA+o zaQs>2R+iO)wuH6NmxrJBe0#S2rao<}`3FW@w<(*=B77xp=?AWp#fk+V)rmcPICx7= z{Xg)XjZT_;>Jk}GY-LCjelU-Shfwhvtr2xRRQqE}Kw;I$JcJw8xo{TXeY`Sj?CtSc zxX4R?R=K<$4S4Ns;6&5Klv2H3E7q8FdR04FOFxm3)$}seTkaBPmUyb+^qO4ARVrmI z=_C5Qj(oPuz^Jkn(M>%a!SUX1`LU;prpU!3pls1fht*wlnWFu;6JhwZAHQ?w*F9#x zsmJ6Q?^q}R*xs)^?=eKeKBd|p3X>sAr&^*`D?}QL(WDL+=N2liGSMn?^Fy9CZAE5r zdi8;nt|T>B9U7&}F6hSbxuWV^iyJ@txK0efHhy8UD;D`>Ci8wP3J1?sZf_MhYfYi z(e29tbD!i^?Ab%lSwTMih(54}tYg44#*=o2Xq5XLXQP?vXPIyyln=IuV*p?Fhw%hs z-vdwzc%6`b62N~jk?}o*Afh!mI!zhS)J;uUM^=yr67&u!DjgSrLqVkWhs`mUMciri zSQ(`jDJkQnu~^60Mr*%k^I%(bu`{8v*xg38QR{B=yEJETp8ACghh8VY;e)9xpekW~ zXvl2{`#yZEp-rQyjrMB0(n^Vx8wNo_N6^%UW^SF!Q7)T}e|PzkZK0HJ;fU5|wQ4jj zl_4DO1o`R@e4`>#k8-z<=V#qRzv`i^@6Qlyrqw)lNd;eqA<7SGwuaS&!~Nm zGcCp@0lU8$Z?iG?fw|fZxz~J#?R41)Jj!Kc>6s$(RsEHZk*iF{Gs|O<$cp-(SHNHh zr#2-!Qd>#av$$xLAvd|wced}j1tt1R=?%y@X$l1``UU9C!eMs{; z2KER>`QM(+t*75`hDGm835C&yvO zj-oDbE%dVpejL-x>ybr0lFyJFvR_%fcl_6%G;Xwo;{Q6$nm4}C7Dh|GKddzVzt#2uE2%kwB2T#3b~M0Q!G_$%LR+w zQA4}EIye&ORObf_aM2aXx>2J5JFv`YNAk6vbIv&@cjlRAVoxa0ukd`tA4rQ6JAuWLnmw3N zOhK4}W|$tFX@mgzfDwYmh`b1Kh#3Vg*x<|_!X8Q^_9@7<=KRgrao9=hi~IY)61mA| z&)GdXF{ypG7|b4-+h2e2{PVB9cHov<&N=6nU!fy{=+@_Gc8c3bPh%?NLI&kPiBpz5 z#RmD9QfF;&$QO4Hj7>#uRmr^t5Rx8WxG}N6J5wlRy7woNXxOgx>ymY;H-_xyYuq*2 zME(j4`e9cVj-3p(&F6y4gmEden9Bsuoyz21!`6e+Z`yc`XE2)a`7@kw%nj}`+uTd6 zD<%X1^d>tm>`TVvBGPY7+koqZ|8)vCTLc@N<9U!zR(aNTlu=&``7nw3 z7y%C5G~?+W%rP+i)tn7Md$HZYRvx#_4ocI^Wm>Fx&&?e`YPZ{o8{5tF}w?_1$Vj%)_w$M0Zack-WAxPch}J-?Sh6^PEe{GH&P z0!T@S9}34Gb-TFJLp(0_w;CpW)57K67+k)5(V_+O`38q8rY9yg(2EAwub(}8#WH~U z=1JzwpFe-mClhoh@_Nj^JDEIPt)DV9`0Vf?F0!Ur%#9ak6>XY!tuC&$;^lZwQpqVw z^3lTVf*pWXvs{-@Iq*%tBuD>ro2O@Sc~Q^BWly4)+gbl1mw7q!80JBVSOw!kU^x~I z>Xk=;)e<@l@*Q^>6pe?b;Y0%#!YnoT%1o_8N3okcWRVXpHsn8hAJb_K-IfOolJPM$ zBg-%edPpWBlSIQzWw0bN+YYFuzM5NeUBnRegfwQOiG-d}Cvs)C$2&PzGkhICd#<;C zWBBQo1J67IvO^JI=wdv+@B$HC5HWWqyDhfdD*BI*F=}qL#9i=-0Pkd!h0aixQ7h^W zv>1qzSZSU-iBaA|UM9x+t8JjY?viWu#+)VWwMs`6kyN>LY^|?m?FCP50SwAYyGnR0 z^w8@n#<1U`Dmbb?OKl~DwWN-+$TLq z8?d=<1txAG&qEvmH;TZIz@+Fna6OPBEEa^#(j2_FXiPN|70k9y*O~^Btob%PH%*8c zOev4B#o5IwFcwU#600@0dASroirlJ@_qpeP^P79_d4Ue0bsSQjz0Lypked&Qal z%jorF85?(B!(ViNd#KnN3-oBczDbWeFv9&%Cyf-xVskF5dXf>BbWLvi`didsSh4rd zn%~wo(bG;|F@vQ%pU!pXTfdeY)E$X!dH64XHET_#(KmD1%AMI9e#sR|Z8>|&QT$WY z9M|WK;rapKvx!t8wtIZq<4Z^1T6;+w4!FUW#jvhi3*sIu|Gu7&f#^_i**#NJ%W6$g z@!hnpAW$3D6-oh-*flLK(+h^*Qg!4OL{sslXgcu;v9LjSX=Pw=9`Y(N z($7H0s40~+el^tZH5wTAk>F4c@)BWGf}Iu`2gg zx|pKx43jVS_n;n1jvB#>;j?KmD|sHXbR;?`oQPho%zv0Uj_h#p7Nw9BM~F*sxEiMz zTLjK5;Bh>Do~d3@W3J){5$9|ZHCk*jL&*Z#N*q@h&e^#{z;8qX;91lbLy!swbf$;+qq8TaJCw> z+BNp?c*A$T9O}$)T9a9RGW||^{E^WlF7D)_HEA?=TZ&&kcK3oiHW;j_bkf|r^6q7} zbShy?$EV|oWo^0es*JPR*XNO&NbK95bUx0)E-bCe}{4gN(AurDbS zWn0b9=>ageg)0|_Yusn`4(_sg4Rg%w$K9}ZTA=fr3<3gY`XPG%{}O_tnS0>J&BCGTawm-7nhEL{Of0DL$909i!nN1pVO@SrF1IF6pY#uN z&(;@{KLUt=Y|c7z<@-H<=k;R??B+gT;=+jPF9*h%X$1j)1?@JY0n*KY2NO>0mLc;S z@$8v28`Bhx_X$*F$k_N91+QRE192kw3y^Wm?1(7kkCa_iQ%5-7mbEV1W@xi(g5^Ta zYjJm3E;++BPXD;p&=ClGyo#!+Gt?H#;7!0*XnT(>gI3dUB#K<8IhiaNAF_DS&QuJm z`)@y_$B%Qa5ujGiVS}Wyo}S>*$N6*KxUUk=RK-$pPOQ>fv_*|UI*|#DZ*g`yl1`ug zu;l6bl77{y2H!XA63};^89ap<%^Lm^h%PPmtou!sLABx z(tm?)Wl@z@SV;_tCsd)aEG$l@45FD08(uSs#FQ$&EbNP&T=di9f6wQOWFSDS5xiw) zp8T?K^yggajeYy}x#@co^uqyIc<*uN0)n@yzJ;^bUwG%8cgTCUI}6@yqJD?@d+}FA z$rtEhoh@CJl2m;AsYnj*bvz9$Ax3}Eg^4rGQLO4x?bHUzOlzu}(X*Q~l_Dw`3Zms7BVvSlwo*I)|Q~|v; zee7|^BqOJiXFSk7THg2UkVYbvbk=m@w zY0V%+CGMPAztg$lR+YmL^VNJ2rB%6n4qAstRETd|Bj$DsU070P13I_OC@ITBP9F8I zVTkU6DVfPyMFyK(rL&rh?P|34)>(8awca3A=xpf0WRoj&*0>?BHAX`|rMvB!K+<5y z9iJHEUId5H$^WRnhfFiWdar^lF2U}|HQ0lMoNBXU1s0%+ND<@)e|Y#chgHaTX#ejB zbn{dRfFiyv64NwnG>ypr@k?$#ETW46bNbg0MZ0vZh7MoZ_MeKPT(T<*VNII?z_*Vu*f}n zzp>4icjjlg>Erg$S8BbstcxWQ=6o$Hx5}Rnblb+sIqdk&rDOfMzSj6S(hPa-{I9C} z+1XKGel9|7;3qA1-n@X8Ib9MisK)?);vPBbV?=XhK!=d9oqBm-zZBd;+wzgdz>F6+l z$2dCIv*W`fM&w3AXKc{ftJKQ38^+8JJ$xgs7wWr~4!uKMC!Ivm2Aixp2^atB(!;|A zbxvjvc6zb~)ZNK)injJVy?LX-58C~luD4J$hv1}W>{?YZXX%cxU}i$#vZrX zt{+jCbESMO*Oy!4?F9!&-!~=lz~AYA@DpgeuLCm{{1(p{Oc~zj6Xp>X^o*7HEol$I!FwVND3O51<}%FV1A#6aK`TSDF&~nT zBVsq(@DH;|H(`h*bT+wdW7N}QliO{b4wph@Qru*4C@qGl)}*ra`d#Uv;paoWt=q3T z^GtAVipWuLqs3&$jvt@pnH>qV&+;f#ves}^=V)t3qfL%COvi3E>$-DUuw*a$l7}X~ z_54xvv7wjT@PYH3Ou~Yj@F=xmTF{o7tPtP)gdfNcb{Ig75I@Zp2a&_4d^f~2KL!QgR8_ZyO)0Pr$1p&tAN?QK*aE@F6`+hnsqZekQ~FW4g48+%`8TazHpsfl%H_^=nEm_ zMo6tW{dh(q2D=my76DZN?a`QPcsz(!21S@+X1KGx+yv0@A^}>sx!1|*-F+o@$fktX zh1e7MiUYIBE2oIa!iE1C8sfxYI6j(4z92U|czM6I9Q1WA_34i`=sJ=an=jb!DPQ)p z*D8~LCg*M2R%EC7lG(HAaFv{lr!%Tm?qd4ulir+81jpws&$O*txpbscYV;dTenZ}> zcB#@^wxpFF6<(o%@i*BFx@>73^1LePu-McNt4UIkSP=zm&CqxJW$u>x5#;0Qmp!@O zJ9@~zx8JUR&`WBl>W~2wa5gZPcFb!Kom?(yxdPoHn3jcG$Tlt;XxP%wq{7+f)h;%D z(>8BxbFGNq!I)2o7z*^`*9` zA+8J9X?$$xc{4D%J5?rB6&T01#1$qETW<$crdS5TVvhXsdQKxZSXAg!YXHZ$R4)NE zYe=F~N$oBVcCuWdfwqbU{048bF-HCk05 z5<|Z_2WnW%8tyVnt>pl@BU?fiJJq&)v4_1V^_T*dh%KO_-v?&zX)00LP1z{hOk9T3 z7?pnX=n-{6DC#@3+OSEZ&}QRRRD5JC$;xLI37hsHj(>D}_qsL+HS0*5sUV zm#-2;k1mgG=~A~LVYFWLPqSZdK#}&j9~8fI#9eWt!KaifL8mq-k)m`dV4lt~SPpsz zoO|Hc+{fHA*d02+2QjlO7Ae@$z@}VHi<8{S30frg&{6VuSA0-pt&6$)4h+!G+25Ce z7xIUqFps@!+VU*F)A*MT$pr8@0fAkG`NvKFu6g9x_nwty$=QTxJe zR;@`PQ^_Q2KlL zNNczk#)ywzBGS+sh<)f)l!i<^|D9-g+veq=p}W_3mR~stT)dO~;ZJ}16U@mM>3grd z^2*EPh9sC;zw z7d+%c9~2x}0#^x6?YSi6>|MnmVVr z(>MJZm!nxj|JQszo6Mx~Wo`#j#&lR_Q!10s)2qB*WQ(2?Ni&%=-CawgsF&&W7;r(e z;pa8^NDpR$1-veFH2BKdT^ypknM(|Lf5<0q$`1C-)I{@{Rb;R)ZuqhKvZv{nM8Q+k zpT$$uE3T%-QSP+t&Yh3#+VvR!xNFxR&%gy37rN@P!R@S}uB@vDe3Kr1YxIm-N}sQr zZ9%ex-pL(5bZ_m>kw=FL{P@XmaRk0=J92*`eC-X(1UGTIkbs0yj0@*$W-SiA3--yI zD6{4#husyePm@l1DLI^zfH{q9_yz49glW&4H1Je zY$(=E?k>OzLAaoLo_wX=UN8 zK#4;bu!F&HaZD@7@N5$b-1FmBrN1cSI+$FAL&QMt$ls{_tGOKxUM+3F+X|o$-mJf$R%tH6>>FtYrZGL z*#|kLS}S|-Q8d0N8)Mz&Xonjh@`9&gbsO5Noq_uCfecbx=W{1qam5uVz*tDmbetSK zc1sX#XP6wnNVF2Tm?nN=1@4N!9bTZZJHcQZO^6`zu@F9}Eo+ddGdu$Bv)N~*fkfiH zznQ;kWd{l+dE(ZU#e^$qvxgNo{aSk383grAC!Q+){!!@U<<@rkv!`)WV{~AYlh6Tj z9~+N7=v$DFd-KV--Z36eMf&X1Tg68m!%2{Fy6RfVJLJK!P4SYt-RbV}mX;R{DKx7y z6qlE@e!o{;Y#sXnJtvy{?d;cPlj-yl7uwBai|+P?o}6}5Z2HdEj` z72=0hL=J}<7;7G34QQ z?@rLSv~wm!ZIru=zsS>2kZ*rfM(xw5`cOEa0gFbMexVAht%bHg-qx>e5BTSYoh6G% zr&puVa4y@W_h-m)GkJRd%^At<1exKBNK1?Dt1TaajqvcFF@b+43u;} zb4UKTqgHrFjL~JQ)^;Zht?Hk4CKeyQWPbeBMCZouj7@ZsAJN6*T$$>~O>{B2iJNpL zozCR379s?JX=?+)1F!-crEBGt-1xzn+B#}4P3)vg^o)>2V00d@1o ze-{czW^ljo$PZk|y~n-9bNM2~N(2%pR>p`Bpp8{$W*U78MOi~rj&kpyr=W<4b!NN9 z-z9YvOg1CHyT^;nflhb7ztgJ)Kfx*Fdu(uT)w_wtfI=@bTF7x^v4W_bg`;v^tC!F5 zrrKsL+B`&l)^knI)olJ*-?l46arjU|O?(S)b)c+3%fMYiH3=&aV$;c=P8O^!aXE%_ zWKyTZS<^63_%FCHK{=o<4@tC6t1e-5*jiO8twKz<4mfKa9kKCBhx+aGNUp;s)kw#r zTCr!=Q5UV*MYoa*+29ttb2b_>hCF6?5TbcfL;^Xr&9vw*vb84#uifgPrt)ryH3BP46ayd!p!AAdYV8v0+ zFJxi(4oHlMlW)YsH&Maz{a2chVbu6qjG&0kkQD7JFn{<EffykPa)!5z^Qh8P+=^tI~0V~SFCs3e7v_Qz*I`^8< zu7xk2vh1!^^o^Uy1vd(F*9IAsgf3z{tO944tbEYX>KzX0%-m;jS@9MG0&JsqD~R;VMb@sX_VUCF1cRvb2NbpS)b=uX4ub$)m;LXe8d7u#3h9`36*TC88%jtBm$vM97bDaj(})h9FAw zmE0KU$z-jbE5ozK23+0cAMC!U|Lvn&!^07uf8fHt-TfzCbLd4TP!Fl^j$?khyD3o~`t?DiYB201jC$TT+dre^#V z-Y^lAkXOW0ZLl+$vVzdudkHPpPG9{vA^@OX>SWW>6fiR0Y~$+%nEK`;R?LC5GWu9sN7F%)Oo>)w##Z~Qy&IQI#S)>Z>8&G?<GM)B`zoPxHa^Puz2*n_fn@84w#YFCzm_ILM9RAgv zH}~5TyH|hp6`7j7XU{Lt={VBG_W>1IZ6<<3Iz*Z*+E#ry8qtTMM-4oA&G{;$PF^s$ zL#9jf9Z0;RwQsyoUsIk}nuoXmSHfSANplj#g3{cwNHLiiWqT!vvlKvVDRc;?6475s zRxMv)2x0rJg8^pyNLB<{!e)k#>^5ddYHi@vc$D3L*Z6=x-|RCc!Mvz-A{nQ?QlvIH zjl&v;RS%2}u0M}H^w9a||Kb-sGVS{7ckQ~JUW|)g^c*e_tG0Tw3gpquK^MB(IwE%j z7cN;42-|WK8%Me}Z(2Q>lGeX--+je7q&%nKG@xLl+u$h7p^wcea^u(c-05$eFZzaLWT zU0^kkUwrWof5>(B_jY({JCmMy#Wq{2JN`-u9g8yNl*QI%&Zn$7vn6BeuFy*+CSG0m z!Q%S9!0^z3Z_)i55jg2aBJlK~_3V9x>3O3;u6QFk{|4+OE$o}wz|{${ zmJ`sk{UO#S62+p^SlaOAQUzxA~hQjXPi-En-#Hw`3GK;NNg+&jQ9eviT<34Q;DNn za-s539b%bC-=2tT1D3ANcEjD|U!R!FK6P}E)~r4VbEC+L6oE-TDN-99`ijrTm@&^D z80hck!2Fyk=p%Y#NN^(nhu6ES^2>q#11R!N_n zD76wx$zke`7Na;VHCUXwT+ZgnI|FI*THWu-s$uMM zWKafyY52Tr!TfpHVLw|PUb|`C>@?SNdG96gdA;yC=86>X^B5BK9OP~;YPpnOQAC-V zPHXcSfojM_EJ{UiIUp@zmO)`;S*q)hqkyJY{|iVKB#ht(Fx#KSh|^ff83(|2=u(Q% z6+A0J#)w5t4)p@KU3>Q2z+W)j;x;`RX4VkYR{Jgbg4ONQi+}kG!dCl<`ree?z7bdz z3Ae#xFFM2;heaQTE=HSs3AeiMUHT2<22f+Yh^d#gk%57yGV3d5i;CGR8A}Ip?<3%< zUyX}?Gd#?lG=6WMAuTf*t(JL4oLwtbDeNYf!Kj8f*V)_}@~f%GQPgON>J7Ok^Sg26 z%$B4%vpY}c8(N(vNbwrz5IMccBp!K$d_dOKTeTjSg<&oSWKcj+?QM?1*$d;X9Y-I3 ze0t%{%a7Q-yYt37`g1kXaXqthNJ{{mJX_H352c+z{EDKCaZ5NNOiee{HUu)Pl`Z+= z#)X6SDYWxii*V}ZWy1#gJFh|QSg+umP z_Nf(XJHnkCR?TQj5i#&u;IvSBFM}U|`r9of@fFdM)LNC8^#k zdMlQs)z)R{>AeD4#q)^ggZB>+!G9ex2T)AVaiZnj>#y#eXq{THI9lpn zxnx%Bzle+8L>5E!U?P^#8;R?0`J2PV{%fY`CUQ~dlG#J9JUTTj>8e~%%Gt^`TiKp1 zT~JvBLC5AIjNHcr`T$@qgf(DiM6eG2KWjlm6YYGJ(@QT-J@JHZ-jZd}SZdSs95>xV z4g(83KE_&lOYWCH=?#MMJw-q1dE<>9THLr8%}@e!*Bw7x9bx`g#y(Qr`Vc+?hk4kI zxSbk&DX8L=1Ot(5qve%_(RTu%36aX9jhKYxgH=s#HWoTKM2X>}!?NW*JHNA)eGp{u zHLAl{XJ^9A)+tqO^jAI34$FvfxTDZo>2tr&su*vH95ucfPe`wH0mk ztIRfyRHV=tuqzHV`3|=v{ zE^w{%E&sBbduR=sXM~W**EE z^xc&ye{3Z$XZ;q^ZYY~j#&Lfi5DKx|$ggwhQV|DJT)CFHxjt_w8B7J^Ts@^PvTQ^X z+cGieQds15t;6aZ*}OT(mUOTu54~H+*K7RUY6Zs)yQWs%s`{@Kky^WDAM{SlF2uvT zAFT{p2dC%4>FlMSed*Pc#a3GjN>GlTbgV)^mV)o z(&D5iHZzJFXKjow*XxhFI}LezwS6dIhp@OqI%_CG>)kNhpiYQEt#voY-xk*p7dRMx1`6*7wN)%PWzmiXMB?Y-82vB)2Oq#Lo7|>3cqhP3 zUQs9s2-9b95Dn^kf#oTQdWPTR?~5CBePb+Kqz!}XG5p;1p^>u2WM zmvKd*pSsk31Fl#R4L)X*5_3YQ5Np+x@j%@i{)K!m0XfsUwi4mbtJQc~dxDmB7xUo6 zPk;Jl^5d_*x^kb+p7nKTedRsr z!Z~Nd!JQz7a*N4KV(H*j{q=VA(ydi%2d|y)1Sj4^J|B1ZiDI~70mXCyGOhks zz|SPDU79zGH-tRzc1=x>JF3p<`2~?DximN7DGYw>dGFwb!^`nlc<<>O%N2!%)rkfT zbywPwgY4~t?<68bo?CC#dm7{e4P9e&E}2LyZ0_Oy&~B&=Zp{>y-o|~bX|4^;mmArI zv34?FM#s-7hh*@Lxoy4A_?chF3u6E|XOLmbLdo=Mv!*lnY-p)!| z+oeoZJ6%;nT!-%!Z#^64zWQ!gRU#(pl9}O|H*VE!weilXp?S9fQ3U;jApF2AuvDr? zNcEj4R)`#BE0eE~>0bBwiGTTtcd$FJ?3O1x$Ky~<%o+?iU9rA+f^($Pvja zs2$_2>7iEg-{MZ7P+rSpFE{2lxvQ6nmGjBVkEu4jzUkDvb4sbS%~0tX3kMTh$C|n? zehVWVLg;!e7PSyX74;b!zEb;w{JoDtp?yxs+;_i8YWIc7AGoX`5^!QUq+kS7!veKV zFCn9eEhC+ls%d=pnR@-W4!CSqf4t89ET@k|{7SB$ysfY&l^OfOsp_)CY_Ul7CGB$c zc8wO&y8Ic~@VsN-3eoBGVS1Bkasm~rRk{eA@@0t_&znWov!vW@KdRn3^U6s*8W)V|(e#gQ`%8EXEDqY!gR-uZq$wYeXQyW7}=0q$Br zwo0%S&*3LuY2L~Qc;hWi?zMPgPdJ*I`PW0b%uJ>j9&}>s%e}?@nWATU$Noa?q`qP> z7L6xsurWKdoTHf0rIQw;YtILucD-SR3xbE_-7N1P#Dc<`IWQh%TDM2YVn)R>kt38a zVYblj3ZwAU$*{SHGZgJrZ^mPi^vJcs?q6`5wVsrvYIG_3G--RP*~?tbkL@xyV(9(7 z!`GzTal2BuMUM4#N^8)P9Lte(^I$BIT;8?6q)ks)xhI;c{oiw^TA7gWKcn_95^a!HM3q6HnQa&tFF|R&Nxau%c;$bOMKZiHTl$imP8@ zR(C~#1+e7Vc0thRT;R! z_pkh7vR4sslq^w?Nw94@{*D=(>C}|=Bx96CGJuuJ$++E_j)aVr$V|#r%ZB9b5?`w9 zaBbe)56Qr;a@yjb+A) z{+ZVMxF5BLsFnY%?zq0>_-K?O8#$o(FI?>5pFZ;pU-~@v+`q0oqLxCmU0u=p-q&ifb%fUtY=?d0a>%jTNdQZawI$z9vd6nAQLxpJ9}c}CpaFd+|E3x%{k z7g*T2E7{nNa)hm#w)3-~4EP&V%jtjN3u&$7;V}#9ws{5v)OcyN1nG9CAP1L3|K+s2 z#kt{M{$}wNs~vvg3>hW-fcKLl+^>#UyVqDoBx>^w)Pv0EaaDXGl5}^NQ8AGdiKSE~ zF~5C(tubS%o7kFVhJPOF+aC~YLG9P#IsI833}}UaI{rx3t8q9RS_=bEp`eOjOK9(t z)gk}T)V888y?bHU{O|}-a8HvhbcZxw6Dx+_UH@SJ=ReQ=4`hcrLTBf=e;~fZaC_O> zrLXjkhcje&s%}-M491k&QlH{pb}ybKfBopAkMh3H1>d)XJEH`X0{W}yEL~zDls>V# zs004t(oLixByIc_dn%7yxD4Ug@DlWyXvvL(BBwq}#9M{Tm+j~cFcOV}&6#aV!MocO zT5TgsH&rT#m_R>UELLD>SU|Y(0v!>N^^4Uyld4ka5uZ9oRhv$o*11zmp;-lmM4!^u znw-dBS7|*~wa(#HlLxmx(%rq!+r=)m4?aE34S?Y*P^k1N{X0u&9LIFHG$##yU(i(P zdj44bu%TdL^M=Fqn{_#wV!&5Ad7UOTawk4J<(~|Rrk;AowM>aGJg{|Y&HmP*oh#zR zOiq_d#WWE%lZsnDEjO$B{FAxV?pv(CC)~<2Dp%H#Q%5!Z600Ymk65uWK=ANmbaNoN z_0@{GRx22?Y`I(@j|8`eSDqk0tnVpS7yt9d>ML{V5Tr^>c{56>yG{9Gp6zmuY&%%5 zonou3xyqiP?hySY-=Cg99@xgmwG7U;6X(lcn00aj>@Qg4IYTsSYBeYESQu5{>-x3f z=~ZZ*2*w**pQsL09@^EYEl&&txG$1PLL>`f3`alT^W2GUWzt;@#9!%WWLPTFp|yW? zgwd+IG%WXboxYf^sZEefF@4)skPXA*7YYS?rDvvAvzDyZvZZ$5KJHjDakdn~M1Ypf z7qUikdUv;`cqYack4=UXySf~8s*fw<f*-1vyhoXPjyvZxUYqT$kP~nr!nGICR_j zdj*T!Xf1C^Zu?MksOQ~VQ<2%p0oyl;fO~}OYOx>pb8jbtZ?(UFD=*mp`X}*WtOl+g z;C@GxTaWr0(nz^CK(-Ck^jc(6S&gAKzHRb(!y)_q&(F$@Sn}AdehVoY-D&X zmqk6mT1n1lt^yQ3YZ)HRWd)n#J07czRG(M^4lvbYMvk|GuSUrM?$e&}EnClXh5_cf zA0;<)~L0@zncfss>+=weg+yM%LY9Los8qE$Cjg**ZM+zP?+&XI5Astyr(c7pqFwcr0Ct4q@c-Y@5=4yyd_nk^kL zF*o1NuU*=)L#KAz^b9$&wDj!K(w)|jzN=FgY{Zy5xozGRN60Kk+tZ-&SSve`iXM*) zL@SQb#UqW{Ax$1qFS-M@+jYid(1r!uRL_Td12zurJa8<=Q6p=i@!d}AWW;Y2#q`r7 zfK$aMxfH&k5B6v05)kAt!&{P*oSxK{%*`SFA@Uj5;HYWO%CmZGmksF3tVh*nD7v%l z6OtQmrIISlv17z;{A3&Eg9YTDY+o{tHb`fK6dK&U4eqlI@*@i**K5{%u;%8P4U7l|AG%|ATUKC25cor9Gob8B%Dk$W{!NhOXZg?2l#wTzt zJYdGVCbaYQ?Ajs=INw%Q)++HX_pZFr3AV?ve#kGM+_h$hGj z?HZSayG7f5Xkgzz%k8SFXN+5J*g~p)A?x&M>5di~bJJ~vw(w4#G&t(y_EKPMc1O9U zNvL+c>v&q<-q&yQx(E9^xRVJ>K~?D!(gER%P92V+c<%K~qG5rw>{(SPp3qnA-P8M; zwX0#JC>hV!rVXiSJi8IIWfbeM05#mP=`fys4fdq$Dt;aY6V3e44Zg4n*z>t6&%O2W zE_f~QTwbEHEl8LbApw2;8wBF}N~7P<&gfCBDzV-e?GFa(x7TVpeO)d#IXpVoST1dk z2R#~Hrc|+}yN-D=JI9KoX9|XxrdQ>&wcFEvli->QwAamCbB#f5wb;p3?`gyKFuBrf zRFmg4QwNSGdY0`4VoUc#%QxM4I+pH%wCqRq0ZV*&aW;?}#%AzfFl;i%!#;JxHJJ6x zZd(YxTyXa~p>TRtbRv-mF7MtQZ|>KX4Th3&4{6?HU<1MMv%ZmmPK&*>A5#j5#UAu9 z_rlL-VE_AY!@(ZHn-Srq0VK*7VH_Aaav*B}rXhf$^IGQ%csiwpthrU(7Hx^WBwt() zf0tVn{=WnYliTF%P+Hwupa5-c$lu*fYrf5!soJD^MFI=Igc43_gW?pvbmq)4DfhI> zlCHYIluv)k&aU=YCk{K3hjd?wIt#7u=iPT8ziG zEbgsW=h?iG&9hsp$Mt!-Ly+P5%ae#RMKH#|Q(c4qLE;2ojv_Rx*g0C4tGe?JD^}F94UWbNN4nqc#qBDA!@76V>Gt?+*y)v9DKQU&@7P>ItYXt`jQTP((; z(S)2>1O1hif#I0SA?s7ctOaixLF}q)X@ZG!)M^sC;ei2iU!~f-Z3Q2%zae)y%;<2A zv@tSt#DB=$PmW8&*oBC)Z7Dev%*E#xcb7`z&K{QSb&i#;)|m%9{=cgI%a0om;PyY( z_^Z}A-zC_Ao*U(twlGl&AMspLLN~Fl&h1k=zHvRN_>2CX`TK#l8KaGG&6V-9bVvsC zq|v?mm$3|Rc45YYQI$Z64M_T>7MDkpah1YW!GrH&Bmj(#9WywRSQ{WCzpveN{ponc zKDKo+mN?jHDW=09x5y0Yc9~WtWS(#A&ts$x``~V1)2XPo?w*)iPPLy$X=*OB=i4WZ zu`c*=EApgC_#!D76#?WNtr&(}Sr5~MX486CuVf6-<3nr)K6F`qdS!TK?oBH_KCdbm z=(}l<`w`+fZ-_g7;z^7|P5MMK&ONI-o3_L>eYUDU(>0@gH^3n%-QCSJ%DRBxCC}SB zxtr0N?40SIAvah%tk!lb_kg4QK+_&kHAOm;<-W6;hsy4%mFr{3`VP&W?md|$1l$=sDxK0eb$fw%>*!y6lO`@FEYuehlfwDfR8c>GVO1e*W z=33l8DD#s2hm|Uq)4s>r$a_70vZ=Cf+qkzLS~`B?V0zB`+^;LzB(_)R%K!Gkd)u%c z${_crQ?jFJZ-*WBdon!fD|fwcym3%!v07y^%FH{^IIU&V$q2oh%qB6g<^90&z2KT{ zbnM|Pd3o~n6dkt=2fOyj)NZdl)mC1zzh+KE0_tJM=3M<9?Kfiv39ZbBA5cWfJ>1cR zKcgB_hay3BZD6nChMV~>o;{~>w%=2C)#^<@7D|6&__k*GsUNkUVN0x~U_RX}?3kPA z&W1W%82$NccYjw!SDEIHkj~l-M%N=*lWtN z=8S1?19WP+%s({HP9K@!n@P0 z+$S3k?@AngM{U$UI6jw;?0k2f`wThH{Vy{QLgd*O`O5J3v@-m6GI3M1qj1L0}J9_n4eF(q#_91ff&e{$RpZIrS`!9USqF@tnp)GtgG}1&Er?Zy*wGIJJgx(U*zs>+%K~#f+u>EnA$)fsTeRSYgM$^tG=M2~wEv za*?z#qwP_KToqRmF8Ta5ZKADWW@$;I_PFh2|F<<+udm3&-l<9%`>v^Fnrw&CFRG?=jr(fFKVn6icddUkpHI%rE*7iv#xl#6jq}x;jD|!! zx;eKmme_^&5Jj(d5jC8pRpEfkM8Pj)YgaxsMcOwy)o*U2+8lHLyZZjn|K5*(9LZT5 z`Nqn7l?u#@%8CZ3yjPWA>*hqjCcgD{IuyuULymyG`rBu?xp;{@_e|puax!z1J=oA( ztI^P#nRk_0fJMg=lkSqEclJn6ea6yY%{A*x{SVy#Qu}H{?R+=*nkvKuBk~&f4ZaD2 z>$FzVtR?SMuHa4m1kG!3hU>;#(8cY^n!+B7xGA;!qm{bBqZshjX$4I~ zI2wcd_USwsk{tTn=e|I``<4G9Z!24>)iN7OA3m2eRqJ)D$I)zW9?7|rMsA55Uh1h0 zf9gc-h>q6L`opycbn(sr_b}OABgc@*y`_fxVuW38hh5TH@B%+MjVrq;y)if@J$+OF2LyMD`A6=5hROTu`SPN>5ZuCz6if*%=>jXX;!68i;a&Ig z#&+?dmKvL|QQ2lM+b2kj`yV3zt|QFYSANAcD!0~>Jy*Y;_xD>l2zI=QSzTo^Boa~X zVmWudFOJ!??{d)S#`y$jzJ*yGF|VY*2j|0Emq)v_RL!Y!cx`V&}Utg!gnbmb@!`KlXLG?iG_%1*XxbYk`(W-sV$ z(gAn5TA7esbv?13Awov1bKA5Dn_eGK>WrXCg0~Q7w715|IL=z)Z<$=KRn%tm~v)Iwr_=>d1=GG-}?n=zW3Zx*=gPN zzgU(SM8=Y^Rpf+BRkBv&AOXg-8t=qgw?yo*WBio9ZBJ{f$&NguHW(!X+OV_0#-Sv6 z^|cf*BS(&a7E)%!QcGr{X+g8cDz!MZVg@W@hT;CnSoWzbs^YY(hwhdb{oXzO#M*n$ zJ)8cNCnlFqjneUs^yYZRGdO#ovpQw#u-co}X+RbZ&9ThhM13q}AcNrH3oO2vvEzXO zXF2JWM)wpIc4_YmCs^x4Q77wlNU4&ECzN<4F!wkMEBY57hf)DU9v%u z5ggJ~`;g>TC;`riPM*|>O%@xIucwRv6w0P#{Q>R)i_fg&xwS%K3Sxb1gnW0(KJR1ug`bF@N0+`I8XMJUR@Dgx= z4^F&;$1`Hm4)6Q_(RrPAy7J(usgb9&`7%mvS2pj!10c{mnZ72Q$^ zrt zE4Ld?uNau^%i3_aCx`w9dLH*x4yC$Xql%tdfiu~h~m{;DL|j&is#&T;udB=hZ|lS)MT9HXvL>Kca=c0EFt^%)l^z7 zYphxm)4uw5Rvye&nbWlqYr|q~*oHR@bgvfJGLv)}P}4yUKLlV9xMaJ&z!njGh2S_{o21 zkvAz&vOX*Ky4Al&d6Lex6S6E?c{wXJp_!f5XCoe|)d~F%Ta$Sg_xbL3EC;te zRUc#rX1Aw9%O7m#K1mM2Orec;@QpY8uY$0;$ZA+$NbNFaBKDAPpRHltqfOCOp0lGR zZ$j<$I^`LA*NyFBy+J2#%HrJo$W~pqeb3rJt6pJoFtwoN~s?I}vz6OI>>*V2ep_$Dm z(|}+uy%VcBPCzgW%vg*iXwwiQM9d{*nlc+V*W#%GyVWOo;GJRyHM>~QCjKjg9*I1v zRAPFI%LE;DqgU>9JGTX`*ydqrX7ev5urKs$wt>kl5qElFqT4iNn^;&1J0f#4<4%Z* zEHh%Py&_x5_k}=KeGa35wn}uNpi`Qf^!ci6#t^aDdQ#;cXmMzxnx2Oh0i{H&w|mu} zDnWjwKu_(VA{z(cC&m3D@k)aG0t6Dnikc=}sXKo5Q&*!9QMAka>4v{z%wt}hCGhPY zh4XcSCx^mRQSokvhlyXcdLa(O6lRR^o>RwUDu$l{A`69`? z;zGHC)ku|Mk=WNaGL;HXJ=Q?ibF18GH!|T_vCHp~a!1JLEqU8x#-CX0mR;q(AB%;G zU>Wl~S94ExKX%BmTXMIJF0L<)e5EDr6~4pwlvxK-v9VdcO~stRHU9%%~w>o zp)Amv%M9b4(0)@(jTIOdodlxQ*xJp5L>lj0{vxFj+gUfXo#>zy^AqkD10UrRy^pTE ztYGYZzpT{TuSqxxwzS_Yxc)}oeV#v0{`=s;XAc~Bmj7`+++aR34_+{&jOJJNkbjXg z;apCYJ&HW$0>H6!V0?aGqdBNAf#akbY6`#q{qNU*`qQ7{Y?H{-=&VeY;#p{Mt(T2F zCI?l}HCj*$lBCj~EhSOZ{+A$9)P%W2nbbH5VmokMj{n;%*LG=zpS!dJBo~YiCW1#`i zBxkc@!L(<~&Vz;8lD=v*RSb)@!)m!d97OzJu(#8}&M?zjj-kLLTbL6VX7^<=Uxud z_dV8p=NP0t-$ix`Bs)Yn--n25?0wY_G(Ly9$WMRzeND4V)}``(yNS&aRjCp2tjBj` z;P-#%-xug|9Nz3Bd$)F&5eduY_O0CetrLgI=f3#GFUsuxfgl?jB5wbb%c%__4{ZY{ z>UO?APxm3wUiTV15!^%ps#UbQaYtKqEma=Juoe$pp;TXoxvsQj0Yajq?zO5}gF)%A za<{=r|Lftt*ZU72<~|I5jW%U1Xzj9oRoYsyXMx)Rp%eo%VcxTHU2H%uVVFr2oWv1= z@OWkARV>;4Yd~^Gp>+C*V*R2bx+{?hcG$3)>w)CKL_EEH@6kpbL+Dmp6KCVV4$&F( z2dGw33eN+JT#ZMUp3myZP$x_9d>ERiaUO^|nh8E$WuWD*>BFyqErJ>D)4u-EnM``; z`#Xl}k1c0+zqg%xk(}k>5^{d!TJn<%5o5VlLC#23sy?rBBwae2&}vPZ%o6T#=65UZ zsIyrs!toRuUCfQ4W+tR-#EuSp;<>3?vgO2uS7RLQ&q*YMW|tCQ{m^o z7>=93UmTVbqO*Oe(fDIs=1CNtMN2Lf#vK%(e{eVQ93_6nQoafz35zG=Q#Za`XaSCt z^1e}NY(PdE#Svi+-jTcm0#R)r|M=gMfBm}`UU-$WX4tf*SCe)m8@+Aj{vCI&!U%bVcT}W|KxJ~7)u9l z8$dK;QM=g0`|{DgD`sqRsDV%5TEAE6om?-)A*Flr3G99EJavft4jOT-oy z7vt4!2A=b$Qxf}#;#U6`=W7M-iQdjBe>ODicfFdQE7}} z>>0C{Bh8O+-!K@ZWb@B{BeO(Yr1Poj+(6Av{)yX(E|_ieL|uSqP5tRHeuj|lk6+zv z|7X=3pLDN9X5dP#vqpqo`z9FUo*R1Kj=;_*E2F-V&9hKN-7+=q<311Oo_I+}4!rT( zi{y`IUZVK++9$Jr^O*budWYU&H!fbeH?v`V#vTwP(8DaRtMb@U*WmiJoKFZbleTnW6BL77Yqs!Sn`dB& z*P*#9Q-*aO?|Nq}hQd%N7Ae9}W8C4$h4ogA7<3EnKV^3L@4D~mX%mTM;<_Ufc1Zh) zOd)5^71^Mw<BSjC3>V$#X;m)O%@3Zz>bvUHD+mB<`FH&u$*Hr3VahiC`MrOhfsa zwRY2~8I8Hi$}PH*!k4py2L}x^q@;l-v~W@L@mE*nAp1Sn$d# z=99HUdf(9U{@PK5U_J)l23&~pVfm>$KGv?f3tSf9K@^jvT{z4St#;o2kJx<4`~Z)T z3j~Y7nG-?(wM$-oI2^{BOVxD`2}De{R9AMGQvu7$kN@kThdxX`_}snsexH*TbgXPp z75BvIoy>`|m<&MPymzlwWi;r?^Y!St*~J@zWw91WCfiKZWd^w}-k5b*+y==CSHGox zM;+g9sgs_fCu^Z;bG+%P7GF5hn3CBYcDbp^Zf@MAw}(6)`utQA_cquxomZnZUdN^} z^dC_pty?s*5q{`yBLjJJi$+}s^#%&ktSQmpEh1Ax(NJI>e5{*$sQ2w3Wr8ce&ncbK z0cB8MHb>k>;VC+RCnQ^@MZ{qD5K}Vw*iMzPeVY|EQ@X8df*j%=GP?{C=6w&Zyv2{T zHV>mQbtb9H7@$48-9PS5_-2=Pr|Y-qb9zI@a7%qg#yFxWa_-^U*MWY@jZXa!FT5{$ zH~D)kwJP_FqWGbE$L|pAV}1`pznaIo?tu}wslRc^Kb)+`9|*31(JX`Q~BcYuAr8bw+%1eag#R%%I>zE8;~ z%s-H5dJfAyH*>SG!c@5IXfKAycVdoAChIJo=uPyW$Qr$vBdtkvP}Wx3tp-sCTk^zq zulz!5$hb>ltyUxIQy1MOQ#$GtU2_Za647~PuF4vcM&LAT_3K5?d^!@FIhqUZ?ug}pxfqku3G8@b79ky8aHHE?mqdTAvZp)?RE}u_@v5Q+W z$8!bu{DBjt`eqvj1#6B;zLyn*h7O&5q%)aR_M9rB?ln~caZ4`h5Zw1x{+%6z;r^Ov=qK~`J67)WWtm&8iyvMyM_ExJFqKV5f?Ego(*j)LB2$(atf2fkDL7S5X1=XVKq1GA{`c+}cXxwX8n zbqCjrak%RiAhT8zM(bjYn?!} zpCuC`*MTYB?4Qn6?=ja6{^DH|dX3-flI_zcku>V}RquIU7E3WubX=QS!qnD_$7_f6 zG<2Z}{h-pAiihwHC{Ok_V4f_`51!dXb3huSHb#Ttm3dVjMBUYZ1%C~1?YXRCdJ}(D z#Br}jtzqtmN>)e$LXF*|jTuZjyUM2dWgi6K<&vr~_&#M?0sDg@Hs zv1vE8UV4uamiUL}$vZgg62EwCy%xZ_P-+6Jp^TOq2w-bQ@fSHt%--=fwMHd$*3Gr( z*zCTZQ0`z<>(l8xT5l}($-iU70LTAXnhS186z-pmc3gLISD<3=bm)_*7#FS?L#jTZ z!QxOQ>wRtKujQlp#fv(3mD&81P@~fblMA_Y|Jglrkq+y4T^H6GJgR2oY%QuzYISjK zq_%RpS=y5=?2Y%DM)zFZosZ18^-#$t?wlLw!Dezm7mY_XU@aW4FB^&mQ{J?QIh`2B zA={$H#g%7Tv-d6&fX;78474jqUi#MYkA|%&KD*d0o$o;U; zaiGJ^e23d>AF$t^zSo?Lc$g=ys+`&}rhaP{sR$Td=c5z8Lf4~*tJ^IDc1N#$8P2JV z@1fEe^1`Ni>%?2V_tmqcr`kF|da75@gao)A0{WayLM6>G@Q9`}E54%Iz9dCqURoK_ z$IbrW#7K|LkTyuocBit`+#2YWs$}mERc&m+pS>1hU>)_E$C(I)%w+$Lzg8vOu2^Vg zg?s3zK)2LL56gX)iY?|g2+m%G9{M&BIeOHaAbkp>w4e^B3l4WzR3D8+^{Jt!4w`fc z7O78ePa-+aRyD3b((MR4ElTcr=37|49U0}0e~fWL#9w=FY8eZUFZgC6spQ;26%S<`CIihezmHZ$L~^6@fvZf&H}%?74RqeGI#d%IwJ0&fo=oXl%0 zzf_*ejSi{8sjN9+ua}alXFfxVPVxk^kaCas62YNo+pljLg7Li9HhenaYj?4W^{-L%(h} z+*IDn{hruuwMr4Ztw#TFu!b)}Vi_h0o3tZmS_CK5gIuY1(;mF-OO&N~pbALoYWI|n zLJ+FwYmAnut~(+aEH5_)1I2l@`c3Od#wA%6AzyriNT!8vd+1{y8~9R=_Wnm7K@waK z*^0%oGg92|9n{3F5nDMIk@p1;I^!3ht~RL)GNM3n%Sc~nc;tP{$-R&Da-V}rk7OCd z(kbp6eUCElHP={6m95{=yz8!pU7s)*k~-TRAy;!p5K^Zubye3LoCmT|Fx7j91IB*S zW{E<$o$XwCqFoz1 z_pX9o!q)tF$lH>V17L=<1Krp)(iD6-z={n?s5cAQgxURlt|#e;`#rj{bBatbB2~?! zHi?b8^S%rKAD>o*k* z;dtI1E$;aQcfk-+2hF5yvr=etl6yKjbSpn1UsYi!(opN42*>0ezx&GtV(~{WpOx&xHjmzd5!eOAa#!o7*6FUQE&`vvlF^5&ce%XBn?!EpttY#$_3R3B<^n^7o5KrA)aj8XiQ4AkIU9CB`wT%9>qtUBipoGjILTiY$Rx@~vupxTci zCCd4}2YT|GHf7*2%De~E%aV{@JnEUxravA2y0QDYN_j~`C_(3&`sR`}$1uKcbaEHqw^%s21e^HkrMXMA=p>W|IOj=Q;! zkke>qq6j?3eYpR*{}Sp!h!JV+Caiarka%vqI3Lay6*kQ9W0$x^o|9QEtk@Pb%gO)x zAqB1qo5v?6?t<6WCJcA2e5h%i>3`*0zIw(lZHisVMzE^#tDrep>&Hz)-M|7joJ6h| z;Z+@|hvoN;t{1ntf;dF?0^r4nSCw&*C2bUe8;<9aIZnZ3jmTk0=Rf`FzhC+9-@NqF zE6PKg|AzeGH&ZXE{HByW8Vqtt&?QVdQICcO)gi@A7#y4g?d7b-nJ4@5L~FLn#821W zUa!Bs_JnNUwR-(mLQu4m{z5wU&a5Wj$CBR(a(`+*mmm7%-pW2h8LIb&eULDUDweh=~E;z+oojo3b)6N z@-=C+8@Z=@$UlAZ;J_a_Rs}gNdP(|Km_9H^d=~MAi+uC?04eO>&xmR@E=5=UNJT<2 zBozqb3FhWEejwPnGUCaRw_+vv*UxDJ!|Al8o#n>JZSm!3IXJg{XR5IXgw$LyFE*~{ zIZ8l!;aeuaFY};Ao!xZJrkgh1vFUz1=bCM=Cw|CGaDpY)E85_QujcxEIY4iPkVaoz z1DX_VWRCPJe4g}|ZUMIY@ONizr%~%y%-wPiHcjd)%?4{7zO&{U7#{KZ+i$LT`fYRM zDfe)j{@qq>#-y)U9qwMEr5Yo*qTtElEkyJ@`r3tx2SBMxapYVl{>1vYD9GpN?nVJGu~ z&MlX@e#-_7+K7q%2z*t9T)j1SE&!UO=FtUU!_+ccHi%V$_&NW^H-bIQldkmYg0*^- zY$w0G?ze+jz8hy0oGr(ORDw%&xH$WmCa@+M}LbC<|*Jv?+a8Q zZ)Lo>(IBZ}sAR%El^en{?qXtk%Y3%J7t}$k%vdq)uHUQCgFW@@yJ~my{?&w8)E%gq zXfL^&YHV!aV3(%F0_reuxmr*17i2+bM}<(Ngt_T+od1>Y0X~`+F|Xdh{bG`tg+McqMSxd>BYF|0!$zq=CF|v?x zB^_v~kaN0dG@^}1C%5iyHkLr0!1txbHERF(!7t%?1n7<5hP^f%ewM)<;!lG0LFJFf zaH*q1If$$b`#oq6iN6@MCj!TTX20kEbcF))JUJJ7MQ%J6y2>yZO(c2?L1pw-?tj^- zx15-q4UvWpl8ftscr}{MF$2S5FgbmHYYbqRxOx8h(&sYc9X- zqlY%eD9)M;Zo3_?05<7B|1pRDBb}?JxXBV2+?a*upSQJT653brkS#9>|3HDk4N}wP z)>_!G)-`kqr@UsZYd9$W|0G(aq2_kS;!3&T?!g-e{!WVxP{asr+&!Qv?RS*jH?dD} z(7ATW2jvb^$r5wvj~@ZRy;Zb#ugV%GFWrrg@7{ABisMAul)ye zTo+X3h{k9VpRSnu*gFl}AEVF$!xqe0SHqX|&qF?rU;h`rFR!$Nl ze!zR7_~{*jS?KT!FcDi@oiBk+3+S8Rvr*VM0%brJt~7Vuc>MLfVB{!y?z4lh zzy2BWt*`u^BV{bJXv1KoBWFnlEP}JwP^5F)l1^qev*aG`A4!;gl8Xc?65P*TeYJ|& z$=%h93E~Kbm6$BKBe^}7jcz}5qE<_?H8i2j$=dyLVx?(-3+>x-(k=;v+ydqt_x!+n7W~_v=os?!j7(?3fz1<`;`kaklza+xY9(HL zG)7)SA?po#%*4Hy@g{S6t<&i-L<>|eyhn(-cBc#S~3MZ}yV4~s{}8JS71_Bc&# zcCpE9k?AE2c|+DImP^HgVuz0GkPdUF{vf>H;4`E|R-1_ljY!YRp`R=Wb^r67Le^pw zM0VZBT`w^hS$Qp2G4x1uBE0%dn4}v|#;ipfH%$(^`xD8&=T5`H7FctEU2JgwabE?} z;tq)zgcj0`@k_!89cqb2oRV2PI_swD7rs!v?>=kP5|y~!7RF!I`D_M3K;rUPu`JA? zjYPxhXxF>98XP?=-ZibG?!wL@Df$?pmR1K}53c%S9@x4B%A~jQ@(8qEIAbaNWxugR z;}6;V+Y@q&uG5=W^+?pBMNI#Sn2&$#8|S#+43Kwook=#J>(|DtB}*z`ZM*tfB0-gS z>a>FVf&%uWtM-(&7WKD3Fu>Z%)?N&)<9l!IsT#N7OOa*n8M3YD%-Rr-_Q%G<1=r}p z!6vjc9G$GW)3I1PrvC9K@Qea*wBG{EL<~eAKzA(CC)}uksZs+^EC&?8SHiev6wKo> z%QffIGPNsn1w!_Ik)LP#f%+HU{`Sz{{_TG}S?TO(^g|8uxthtL8qj8}<>nZ3`aFs` zC_)`Rtn;LpZB>_=!tW|q^#`?64epOb)Hqdp*#5!`_J{Axxf4e0COZTXwaoBK$7{=2 zRDoKoW>~5{tc`Wxao|6lbaoQ6Q*<}Q?oIo7J+g36fE z{SBrZre3mio(i`ka4GQmrj>LFesf1przN^=VJFQ^VoMmv*H+^ zV^Lxuto_dtbn2VwxCpIZ5S3cJsdd8Ys&~FJB)6imoe_!o#w02}>hzhzpX$CqOxoP7 zqwa}2im4m={O+zsL9cdM69%V7t~%TG$^T#sD{oPvCbvrSS}#;kGzNn#ZwPx?!POUV z&9?}zB6nPM)j2}0`t()!pdjT3=ehl{_*PH2NqVGRsZ>?n)uv`WCSA}U@_2RTL3@n6 zeZE}&;90#6JF8TAJJ5h(az-1C2Gtqo_~OAzZC2rMIW-s ze1xmj`t>Cd9x+fQ5K^~|-ys;8ldv|2l8r=Dc4u*4RFkh(jIrW!)RID)B4E^dU0Y+w z)DP|YHd4{YoYi7dJLuk35jeCx2ZJxX!bniR{P64Ht2yrw#w5h#Sid1@#>8_ep%fbo z+BPgZSCPBgEMED$4Kd~bn~Gwd&1%$$J5?2r(&w|bHI&JKxx*Fk3Q%}s1Mt2^Dw57yzy7uSUZ>En_wDLy>XJHrQrm3bPkw|Z=<{gtTWh(M-HgFkvlh)WCvP8S zMA#$i>8ZvC+br#_R2lx)gBgo?fgN|bi{GRI4zP!6sbDjJcP(=$VsjqM5Kaj`72lw# z+=_(s{n9*PW26H6IM)Va{(~773IZ;3Cu{X*v}P@`g_S>!{I_n(LWG=znXz);&fLB1 zS$_I~YCMK5f~N z?;R1$Z|Ap;_V()3K@Fq+1QBagVvAY<3Syr?rgIqQR4$vYlVJ<9or%hL+H{6|^Tr!r z^y{$pBdzznXs=ZMCKl=Ra1C;6c4sKN`K!mOW5%M1Ef~kD$K#Q?89u|ytf^`NQOS*B7Bh)jDA`jE%54o^!m`cjlV-+uTigk$=WyG z1UBN<<;4NT-!{I6w}f;u&@vVbNTtlFh)16D^>dAQupdeJAi2nfq;9Mlvb&>lt(<#p z;KNjYg?XAA$m_l80UZ)~XDMohkQSr?MPzPHqp`APa)En|U<(t`G4nMOl=HOF^w{wl zyIgnXj;*}nZ7QJ-I0>y6Mq@etE9SyIEmixwxz~!0j0r@|)5%#h5PPThLJ!YW$5}_luQoEfYk1Ct5U84^hs{Kogki5o{!p`BKsa>pN`Sp zyQI5vp}Mb9+4qSGx6g$|FaQ$|CEN)O*GCQ+V^k}`+dr{Xu3V!lU@wgBn#yLqd-(Gg zKKU7H|81KRf4T_HJLTtkK5ExJ+_=76D#?G2$aLaW68uL04Vaq!A6Uo82L}%6YSm&xi zbZ_FS4}K~?Dm94$h4#)m8*)~iA0mtK`N!J_ExnU-@l0PNv>s6yNC6fG;a3ddNqOF>f&0UgcJ;BWSnsiY^kbnBdrjtz=N;8W zVOtq`ZgRD}EYY;>t*(5l%e%kx8-MF=uVi!`ns~9@2MVB8S79-9m!(u~yi3ZHI*1+1 z}#nspByPw)MKHI28(RG2R{j-tY=(5w?NL z@#!wSEWSW{(|iW-=g{S!l^wf7(P`g7W7nR(?LRN%Axi79<0W`!h(NB8xfCiX3bk&9 zTyE2{n2?Q38sdxO8?Mc#Qq2dK!huOtU2MeU?h7ZJ?e&roy1b&t)ssNlB9>IHe)lI- zX`3&})l}}d84OV+MD7gLVu$GDIiBEhhKv-gLuo~)_$BWn+MWPo@kM-Q5=)5tq*`pC zU>Lk#lTfRT>r`?EH?uA1+AYyF=ePq6b0d};F?Wb;Cf4Q%CF5$cAiEncZoZPuCyN9sJnt+9~H--fp@6dq+MH?AOcN zCK*W^5h+urF=(v|5BJtBHA$pzZ*K^_y3DT1k(P~8EOHw4M*pU%O=mW}2R2FzQzz3R zeF?<$r^wF1$YVuD7@G>+@Kt^oZ;tR|boPlhy+IP?!-9Z?VZ%}{FGyB@6JPg=j8u5) zk`m>zctEpU-bogi8@}>obf!c?quDC&U|3(wBvI>Sa_p8wbEJ<5C1P#U2N+k`=ACck zJnf~pinR&8^$n;iZxb`uO1yq26K^xSeVUb5wimQE#eh7_){EV;!^fya5_0Ge*&YP@ zV5*G-=;jH=;~I!CT4&szWy5w2)6uX_&2Ow3b1w^4wh;wvCihd{7Z3mxZ7Ja)cQt&9=H6;gMuRT zzr^s-X}Uk9HD3p$m6Elu46jI3E$hA)ZUj?1e||cvXR&VYPQv^<_t_!xeeOiCS9=Vj zSX3(HfY=xE3WJ8IVL+cWM@ct#ENci#`_y4$vC=KLa0A}tEUxi^0}5+lF;ox?zwrgC zc9}ZbS;fLjBU>^ht3A?KDk{d`>`fUewjca9(C&_Z_SXq}rvb(Bk>Io^H~lwTtD|za z$0?ILJudlZ^{hHRg?MWMcVjDbQXizOj2O96|7T!@T5TPv}K&U;MSX2?HX-aP=cAa95nUh`13Gx!B*~{MS7D-##XCE zJ)Hkws!|T_KY1*!+l`qmt?1dGF_H!0??e)b%igPH)gm6^1{|gc%Eipr`@mBWkbfwE z*ED1(yOWL0ZIA@T`T*wCDV4@zwj2}^kwjI^WwSXMC<%;&nb#(BSpyM5Wo-5ZDt*}RRUP#!UFoX#uF*)N-Zj0?*q&m0+{=thT;r0& zPU7^CW|ELV2qlCC5+K281PBlaErBdc4K>Rql%=!mKd``(%+2?_SEI2Vvb&!=nkJ3> z)4At8^*PU>o@)6DKwe@B6*?~qXhAp5e}YM@DT+K7bjuhl4E8KgIk#dZy8D*0GKxMD zWdOt({vu!_@JT;J;|j-_~v-!tU#4&Gr^8$hsfrs&%kdH4NE z3@+#s`MR&Cwce|z_t4oyg~xOk|M0sb{jOSMw$Mb=$I@+WF8#WGM@bio1XYTH)8$sk z!2QTMgXUj(8;;aev&%3n^A#sj-l3%MTRsG8R7P*)q8#MuLLcuU^k8{RZCtYI6xHnI z!Yq|0=*q)+6i1M)wrue7C_CiV9z_(RECd7;cZ9NuXtbfCl01zHXffb_?$^@jTT&PH zNC3p|Fj~EqhC6D*mJh^8KTYD7GF8lBi~AQJQayQx>Rrx0C%5(Cg3~wZdcWespI1I7 zH5p1)ot~~yV3wX@b-dZE&S+SzN;ag88H?#2<;9qtTPG#^$%lo<$rSm!et6wHj``St zKM~!yb6;ubj!UMbOZ|+&Y*q0#dKH-2S!cm<07IMWWGbelbXv0-R=Lhq^6m2%gM)g+ zJct)HtlXf-sN7etFmfKZ%aAeH%$!CTAU7tr`Z6<5F4T7O*d^A@FV-G{NNH`wiay5z zVloMECg(O|B0g2*p^<2GH?a@(T=!orw$gSuU3U(zuV@W5frhp>U1&;4l z4T{`**Ih5(dvA@sA^0=0Aa2nj+rF-ernBbK>QCNE)^)t?Z7)d3)xyUuWAodSiPZM_ z3HxO4LkscT`pMyd@F{|!=G&hNkN}9()d^p~zPXdE3Sdp;FXl{Aq|#r5bTy<1!by)TyYmsEBQd3>W0^#r5v%klAX zNP$Iuw;Fo4yt|rEUOLfxx8GaKp#(1Q=&ks^Wi;Ei5tHqr1gRA1)@#_uR!I*<0GbEU zsvHfQB+`!?i+w|0&&c7(Kx|)cc>I+6-H&}<-em~tdfAvAT|19~?8Cs+8X4KVS*CHS z|KB5zJoAhp7LT)*jh|mcl{yvIk`Cdo&y1frjT`Y^Y0Y=XG(CZt{C8d`YyE&8q10~3W)q11y1Hz}tknkHaJ4U7s^6P}hMqi!Qg{D&}d&4GR%I0l}ozdjv zmlhCl6o6;qx7K#AEzjV6Dv+mKjUDE%;yb$8gL1RfX_nv4?jx9-qE~h0dY}7_mU>o5 zL+RBO?F@Xe=nej-w=Y&mNHdu^5XvPNM~+U|W9f>c#om)S#vo_`Eb2xjQleNqBp-I>XI=gxh z90n3p5}PY0gLeHe7)KE6w;>B~k;$z;MH0Wo5~K__KaGcvt%>6iMQsC6jFO*h~4yBrr*4e8^2uG%jJ4T1um z5P^fOh^EDlNtoWrDU6oiBh-uzzy4)hdcI&yDE;1&%8G1r18X&aQ`2uS^699ZX|g}% zX)(~uSFt2!Dd}ob+P6K)QEztoGaD)!ttBh)C-ap{44pIN-krr=I45q*V$VuU=q`?- zvv>)7S1Sx{eJ+ZlV;Gcy=MrN9zV(^L3xPHR80=2ldbEVwG8X6W6$zvbBp$2f6ot(-3MS3dyU&5~E`N`*Mj&{+`pAISe;vy${r{3PmS;8;EP@4}ZAl z9?Dcs?z;O=OAndVtWK{gs`Sb+He%1z8}ieD?4UMxkf;?3>9|a#A`csVrlKaHEgZ36 z^vJC)uzt3vkLoMAQCA_ovvKM6s%x}R5e~oO9p&{U4gmEeS6W{tznVwg$m8XbV0*w2 z$K~;%aAWm9E!G#Yo0lu_3-xuJ-@pc0=$-=k*d**Rtv?2E4tK5E4|&pR;`t}g9KvtJ zvNeJOH{vdl(z=ZlrGaS+EV}Ia-^u4tPM2?#Y``puQrr2_qk$Ia1l#VFm9hfL=Q*OJ7Nq4m54Uh&^#qBghRlqBocX z#*%8FXn|W$VH!k2Yal^*>GOO$J#d_yX0KrED`sHL-E{nH`FC#gW9hG2p%eaC3`XDZ zI$|`yoOO@II-~2>4%7Ue!B{i zDWFFOd4ZFRhWwmZFchm=tzTXcKhS0L%grj}X`-=g0VO0`6VXxYkbQlZa@9ls77rq7Z4jsKt`}!cFeCe( z$T)QxrUyD~<_~_UzBZJ1*F7L;l@~WgOZl7DJopMp?yG3zQZ~)=Y1UE^{ihqVVhQHY ztDHcHwBo3PbcTN!J)=Ol(3&|CMG3BcNtP@}@^~l<+8BsPd`yy;(7}P_2(0Ze-WYAQ zaWu5VL@$9PL05xoLq4O?sI;4A04pwfTqyoXek}YB4`CZS9)dGAb};K?op{ivCz2P1 zZz!?E*r83S%^kx!KVP&ad}fBSuAu!pMm{q=y>_ke+qG-gtZ}eGpB+<4%pd}DTkQEQ z?;7ncTz2Kvb>dno7$|}mnbRP+>2-GVw>Q3f91otp3J?Bqw}!C=V{FD4G@+Td(?1YQ z2FKR#>8Wip*Dc^++f;k#ojv!FllVkqa|-bPo2Qyjw81Y zoWnVY_8*>3)Q$7rJpcgE93VyD4{+pQy;`JP=cnQ=n@8Drm_IDtKlBl0fUR|4G+1uA zOnkdL%xn8CVfEunXUKoO0IbX&;YrW*=B@Gg<`4Ie)y{59B(`o`;}R&%mh9))GP{SI z{J{M`@DA`1Z8RRy>W4%~9Y4sPiMj^NKc0K~X-?s+->-ourwAKqPg-2)dlA0!%=2Ab#wpcm zu|3?)n%%;wvHfv_LwWa&5)j;UbO1XdVZeo`c~x%Gy9$n&!piFXCNAc}LL<4v>M|&G ze9(<8BVmoH(%a;}!12ll@5SUh))cQpT?fo1dv$)h($#@ggH}cKUg5RYD@7Ij|Nctu zvHf44>eXRd+8p;=$bpL)88WH8drcQJpX%bndWlx6BE+E9+l8;G0w#A45HA*kE~eFm zSOc%kd9xgwbau&2TCGjZ+GG+nw%2P}PRYeQCJ8a{4vm`U3{v4|zNR;)v?#Q3oi4(5 z7&`zUlJgyMj<+ZR%P*6XnZTZ`X03P`JsWAgjMvC8%P+%9D;qW%jSH3i{0E^c7UW?EFtf!2$GsJ32=tv{_(UuOE>xavX@mr`&X2DDn!^aLqD+KoSLkh8B$oRtNgjevWicBJU^3=Z_1c>u#B z!l&IM6H`H7b<23&J~9000bA#$xe2H6&*Xs2>@VyIfmyi|#SXqtsgwSFN~Y%=#=yaH zv~f5R-w^XD$(3iXkZ4)6#_nL=-dO5PFUC`y7gvbKEaA01N^Fk3a!&X}w1h%KLla2X z!{2#s?HmjC@<<_68P8}-5zly_FWxxav>OBJvcFo)+M{JnmFF`>1$S}67+8x~ z$OU>6=J zK+reL&!j`LRJox2;3q&{DkWDkyLvX;8?^N1|Lsfeawe*)+SX3M14N9b5E~Q*{LNCz z(18TbxSQ5^UVaMU07>h)cQ+ zbMab8Xg`o5$AFw)6{1dfS$*&wdY70Op*lm0nPOR;+JWW!1z8Gp!=U=Spsp@T=?yJj zN!xYnX?zNml&rg4?c!{?BpL+zXe_L)e_*}UH9XwIdkQLRv-rMG@t2(a{qG-s_}hrg z;g((V)uPxyx1 z8n@j@N-76tost=OPX}u=7%b9G_m!1qxmIe_>SaTKWkb4h{Z#2hPj43&<}hozGdkf- z2i9%fnXX@jGiS+iSJh{fbfW7AjZ*D#)aA6sDiFkU&(w{Q3B-;qL^vE7Xx&<}g2Sf5 zY9nD$OTa6&MD@SVEVZj7%-qml|N61BbbjI+-}uaD|0>Av-hp(Ca%Dc|w<-4?0Jalz zBNy%0nYzh4+mP9wPkpK~M|vJKbsCKc5C*Iho|&tBvdiAE(`}2VqZ{MJ@cg!&UG*bi zf8>?MjPXeQm_E4X(UCHMceKB6Ks-DO9nr(?(A`yt(d30tYqt2=Qu5VK%o z8XMQS%4FB~zSk+dj;{4L?z!i?!03SS@w-dk3}%_5|8HLS6&cHVhCL|bpNY;U3Zw7e zQ9r8nc-$KBogAxgGjwiw@``T(m@31*@Ec(pY{)N*KzW}QyV4XgM%8-d#7jWbl}BX< zQ7XlLXT^zmmaai7g4?7{C~Qh1hOn&yeFVn^^=0Z|DWj#H`Cp37q8ND5)KX?Z$=Zf+ zy#7N<7(jm8dv(bEV`9!_OsoYErdeQ+=2_K<(&T;#bV(|0C|&YpO`VCb27BNY5^T7a z6vot?msO}`_vS#8u9A%CI@x@sD&4e=vH&yd*Bi`{L+Bq`P1a z+P0*Sg~H_J$3nHZS<)wEh}Qh5a6qclb}&khF=%DuAqUgx8OG>sWXz9Bk3 z|0=>L(TE2cCn>};3js|$UvVUyl}uFgnXk~jT;#J)X%qPpCsmmZ*fr+oVfU~eYO^5UXSX?1)5eD&4jUu)djZfj@QqpB!e(X^us z%Zrb)BOP_URd`bG_t@l0G9y(nBw!~EaNT{*+f59w|EeDB^&la*J~W-qcvf#(%-4>h zGHdGMF0L(d)=WB{2H=tA12{GKqknvdq1@4-7stxLyC!Z;cbS&k5rLB1s{6Tu|m%mwMDxb*1W)%A4+x zV$Pb`whdJH3?=^QJwSVeEWO=>vX_cwWy zEo0NRvp9-vZ$tlxe0^N0)l}?VQLko5&KeBzn{s2>vyZ+Hw=W3_G_CZbY|>TiA5dO) z3U+6m?9xkFXPPK)5O2Y0MyIp0W!Ln!#k9keN_FbL%0E`WvU#j_yhc2EWHFdUIFVcv zE>1skptcKRnRKMWysLKFnCySyiXJ>qw5ck@CWo0N*wSgla(h?36*jfiqHW`gR%*@S zJIQC$4F+XpoDI=6pM!B?EJu_^aT%_FF<1&pleEXDFX-mtyeuD$bMldpUvm~~-psp# z7(W4ZtZZ6Ve^H@OFuhu-&g|xtPJhUl3FaN@XgX(2^lY(OU93{-8Q=ftMRJW%s|9-Q zwz^brGIx}eX0uWFx2B3?^|FR4%R^8|C|lTUvHL-tfY|p~ zMjeYg2QC!27%J zxiU+OCp^F*CW;x(0 z26xQrDCN7@UlAL3)-br(um2EN)en63*C>whF`d2i`YOj+8@VKwZa6C2a|!=cI=Qy$ zmGvq@&2cYKfEg3W`5Oa%l}^be6A^8(!=Fg=3aw0I2eqZo=S=gUc0BDF@Mo-pGn-S@ zgTQ3)RqMg(Mq?C9%}9L2fZVg98j6(dVB-~AEUg*|1V*n%7~qyX^_4WA5yeWm=>jVpm#quaHjU?LatId- zA5`i*{RE>x0}0WSY(1%d?2|}0<}trTNJRKHqmZn6{aTs6<;w&(>5aEgCJS3Nyp92nG#BgGs|! z=pnTiqBc?BmV~Dhp|mQyqL(Y$dM+n{>e1|iB4Hx9AcUjaPbhaaT^`8G(Qs&O!3EU= zk{6$op+Pg%Z^FFIF1%*AbNhBKuU1E!#jMNXj<~Ql)=;E%bLNE4x8U(S73RDum9=!&pX(3g_O083G-2?#0aPauj=%DusWN~wkF0xiS{FQa=Ulk+Z* zt`hF9Pv-_KxBO)Tqi8Tn4XY`mZ?W)~t2@%Xt(FTiUH;cJ)4@Iw2mwJ10&IJa?0yV zss9^$W^g=4HH29bvTCPlP!}?k_^8J$yZE@sP&_xQVmq0@>Py`kgS3XdM2gj!%vP>z z)7+Y1y!)Q*rSzI#3{}l#)B5~u4op^Dw<$N9pD^XVof)>--O8q~;;gxn12(%~UDO5b z_Q7;XVYPBHwpr~oMK~leTcYEbOrPDdBVE0UzCxP2sye5%HpM*ec5u;Yk>|B`Az-2! zeST_2L3aU3Q+v`f%J6fd^*(Qqf`(XlGV5C&r11flbY6-s9tT?L6nne0jV>XtlE`h3 z3VT1e=$?-y_)IFS-g}j&--bryH)KXqv}4_X6LaPctP&S~JWM_{-UbLPJpc+W+V5M>H5LwVm% zp2{_F7~fT0038br{j2+oj6az+rckcwtz|>Q6Idomb6_pvhi%C1N|-Z$>#Db{ zdIx0FmIeGh4WwWgP~BJfbp(h&QRk?_(a1`)19VpQ0t<^rTCZ?{)}aoyk~YB?ih^IM z;?bX53s3NztQn){cnHaoSLX(Bckf9@o}1qWY`jUQcL!pQ@mrf#NojgpyfErDCAhS; zi&b+*oxE4UsWh6R?nH;nZIk9$cgK)AWT!)45>KbwAUS@yxFm6YBQt&NnKSp@H+;hl zmt1n<#NBuA+Y2}+Krh!7ud3iiRyzkqhP}O}ZrAVf>n4UnNJ2Cc)P`5X)5_$DpuK=B z0T4{O$kO5K@rBnn?C;d&@(Ed&w@d?!+kyjeqGR=v#G18p-PMhzve{BHZmMpn-#k^G zsBYR+ohVNgr%TgikkjMi*3$I9iX25O`sWt`Q|v<)x@pyQsNXHC)_F>LUKWkyvKRp1 zcBM8!Tj;O??eG|K#U*R;3ofrc!L^dLU-Ql44j>nS>bt06>(UIfRev#1irHjy@Q73~ zFFvdu5I&VopBe_DUavD2EmrtPG#fD0X&>-QZ;gotnHq zV(I3wT=f=Hw$ROXcJAJ{n5eF{qBT`~O2OT$`Z#d{P{BRaz84c=(CuWm{k*e-5q%_N=Bk)jq?$mC~z6~1R` zL(0x&S##KH?;ssjQ_^zK)4#WVOu^9j*a=+coXGW4gGJd5)+dlP6CbN3A_SSDi7~54 z{T4RA#~E5o6MKi}5gnkF)ROrMs~WY>G?=@vf(yHV~UzQGBR@Wz`)JpM7+7w11Z z5UEk58?xLMQ9g~+vh+MtZlqT8qkZ~8Qv(&GLcx7`0KF9_TwpTJ$?d$ff*F$k2KY4# z8{sS^gRz4M@9+J%{O7;KuosZ+>c0-3K7FdctJ&3=YNSSwUm@(z862uXeSk02iXA5| z6>a6Zbvi!H?A^Td7n`5g%Ve^CiCph-kdG{VmbrR!&1_0w^9ak;mR^14naX_mr0X4b z*-n+`E6=1opq$T=i{fkinfWg)lxA%`R$J3HTRLcrpb|%Mkd!l338~O|m^I*XIEE>M zRqezbZD$}MTkwBz+7UJnBOW3S6pp$@nE7UwjZ!y=S@3xtA9}SyFM|#sLN5a=i)Q9O0dO|DeYNq)CRsCCoF(dxlShT)N}bXc zgY?OyR7$ZzMw7G-?v=!5VHnDiPGQQt@>A7ab8 zWTE1!cNmmL*Sbq%HRO1lG9rBQr*7f5wr`1_scg;Y_pimgl^0Wm)95^01cb~9s&8Q! zv48>ljLNfaPx>x9@b5Byo#w3M>wh@HQ~!D5J?e<@MThCA~mzlHMR6=Fv!TJ3hv%; z8DsO-?qu*$y*ivs8q40Y6T_uP1Eb;e>Fotu$q5WKQ#-$;c(hnF$*4YGBxSx4$be_o2%_GXDx8XJ8B=k^2#f}IA2;{!n_mo zNe6qs0sTf6y}5p1vuDKFdG3au83dAfT+$#QlB-M(OuUwWn3P&s~FtL5#^jxM>Uv*ga{<6UWT z1s%(6-e zU@hKPy@KVVp@?vKji{_~U(y&tiaRq~nyIwpVM6>ijUEE!DJo!VSwo!B7yFewFskT~ zmiN-S2h@PpeCsJ8!Hu^yEaPa=Pk8eFo%9TL&nbvw6&z zHlgctta-|A@jD&l`pe(7y12Tu-HS_%8ec$IHS2LL}5ELe#AQw^Li24(Smfs z55ZzAX9ml(=AwN#mkEgW7H*2-f5d#iM_2JlW`vKA+_lNG_5Iax=fvE)NUXGR0==mx z$q}ly!jJyN`p3_y?YxmG8oEFOgve1!)>C3xVr3n={=%n!?f9bbX`KT)?;y$Ib~VD2?w9+vTTgc#634v z$IE@?Uebf944NOg@ZKq&RkqBvaHQpj8Ysgdh!KNpY8uP(98(i)b zm&!&=Rjn@=G~D;j@8KrgS->E%N-=B*I!cvB2RPql>*dVRqk65GGc&{6t=-qghrIR> z7wGVKY#>O#!QMrBz-^!=)!?E2^7cv?N`bMKNYc|A^6`aI!6GcpRkjf>t2ZHF!U4HC zIUX*KJ-)rM9oTw4Z`szkRc8&l9W)M9qrbfcb?MNmF5uDWN!UsyM+3iBwvBWTS>;Lr zsx81Qizfs)IuHl#r!I-!SB%C=rhZPe^kiU6a_&J!rPZb)S$oK;Wn>D;q3`WU#>c~7 z_`==8FAcv<5nU4@AG-S`@g`haVtMtLzSrO7%*CCu>uzF{TNKQW9UR+Delhv*^xB&f z75lpVmpAr&x~6o*3wle(6{Q10*c~OmARLjSXl8$LtTa-bApKE$m=(fUV6Y`z@{Fus ztkw?MYBqb-ey}!Y;s+oLJ$S#?!$vxg)Ab>m5k0OLq=~X!{ysa+=Vh(>8sHoiE115Jd*V>Z^3Npa)+HMBkNJxKWM8N)giva=JIYD zBMPNjuC@HTXN#0_^hAud2`%<;( zU%BpqW;FUNGYQlc+6Unhq(J{PkSFyZ@@3Y(c_&t?r?Tv2-@R2+u z{CkyhTDSIF&Wjk;3OG;>tU4lQZlZcoKHoQ)4WT<|3&k46M$jr~>u8GVRWzF*BN|`R zgM5LmwT|)|;Uf~+vSY%67YU;XcP@lMB8y2;d&U>$0)e1e&lRj3Ar}AAZ^4{_h2PB1 zorlh1U-En1WBzXmwIX=KMzjIGlpSPFoWi&+YMk4*8}v4-o!lTS?@MOf(9$55Aw6ft z97vf<>muF^>#%UD37r88!%du8`=N&ETcE_if}Hx*-ty85;O}|Y#kLK?337G8gF* z)-q8^Cn{m^ydd1ctPvt{)~D|y` zyl>>r8u)0?pSxFyW8fc(21^GrN51#2E_c%|94B#DJX}&{i>T# zoxcNeSFCh6B9zC_E!K5uK8%z^^f%N-paZ{xm!y?8_+scZ^)U1)t=Qa0D-EEFg%6@` z_5z)LWB)^pHDs_9?MzzIr;^Hn=f`4HUx!pCXG{j2)uvEOi~7F!r_j+`;5s!Djh$U0}Tc4y4z&}lr%oZO5tI4R;KtU<~%TggsyiM14rOMh&Ve{L+jTI}HD!>TU6 zW>5Ng>G4w{tJmhuW)1!ma$B=`y07oL!9fPSqI7qPb4Qfe%}jKhMF}LXgy*p~sIGa= z-RD)gEtYg=M5{BXyR{a*qf?ucYxEYqDa&ICx87U}q~|>8++90L)^77|T^B)0eXXtQLIuTS2_aUPq|@fWV;a< zp#!)|%R}w(QHX(jW|}y)@}qMey{+PukikV--T79WN7JcRxtNMO)avq!&H%5`9`z%m zKOqz?{O?1;4YSjFjfu19t7?6RTry(l^fv5WAy>!Y#=mos9F`l+k0p0DmTn1g|k zC1!ST29;1G?@Mp*N(U!5?rm1Ln^2uhnYS%%w4*y{(id|N?Xz`9#+n&@kJ8v7y!hw$ z|2V#>oZt3*);ST58p8qiXx==MipSQ%uCTzEY=QhJll)1MZ=JfVb4uE#=s_=(%87=A zxCdHuX~-AO2hY=JiWb*bA_g&&U*60gqUkmqUdTsqa+Z(F$BF}p{1 z-PUmXdsDA*4r6nhvH9_?w#e{axP1SX(U2ky@A0sL^PJ8o4F7 zF_-I_-?+U{*#?{?yuh}~QSimOTwfhiU=uC1-xeC90?WfMdqP@05;YS-qXGGftAo=) zVrHiNp>9g~*UHTy)$^a#PD_^U{sm!dOVdq=*qL8=FX|OOI&hJH?YAYgGW?QF_#Kgc zkMS1AlSYNrh5ZyJwd6hxh$j58&}1V_KJ#s{mG`%$KNU1K)rc-;FY{et8>Kp=1E(9- z(>-F|4|*^2GJB7{ZR7l%N6RRcnUj{X@F7z{cUQ6LlE{WJ6NHMJ-s&-~jt-Vn#sb?t zv45;&Nh3WqPbG{|BTV#MdR-_HnBI9}u)5!xx7zZS1J%ye@a!&I|7$7jefulKn_~&i{?Wek-|v zd8OfeggmsiR&5Hutf_gnAUB|Dj|qJ_1HSf-Yi)sygtOZ>j6{2(a#$?1E)<5}7{yFY2Y6w+ko(MFihIwhTU&7zHDIFsZ@B|-7NK=OwTvQn zQndGmzzbi+_)2`Dco0RMYss^fCA6QaSU%~{R4QcAx%^{ug85of!SiN$mhI{WMYqSl z&z&e3SVUC7K4Vfw#`uSR*F#j;YcRlo!{ncmrfxQ8O=lCXl85atxT84(fV)sGIc8!o zcNY$MU$2o4m5S-5lvR#l=Felot5WjX3!aIYxp*`_KR0e4?R#vyKe2Ic(*6A383of5 z0dJa57jX36S_xG6)tQE&7SA`>q|T7w?cJQaCuL-!`Mg1)DVDqZL9W*u@b}$N^49rK zuf3`(gk1eWHfCVstTS)Xdp({}jU<%Gu^pOBKK{!y&pvwwy)?e=uXcwt4Q*$!;r{-2 z#`ih<6~0Vwq-M#%TGH!dfW7PmpFji^t8pdTOAe`GKu2l^D%Ni6#(DaE|C~bbX}3Mbz&QK8aPZLNKedsKzjaP`1T= z7P=}%iQRt_ld29g$gA(W8n=~s@z{8l3B37?YZB8eH9o2=|QE$5b zj`^DKSw9vVetk}X$V&#IzlM&NecG|zQQqoV`uAX(d{Ed6J75p+pid&3LPNn^WcB=F zqj3yzlr_&CZCt8DAtDr6sO%yHpQy}RyygYeoh4v4UyX`0m3Rx;BepJEl-KA4)oE{t zT7`CT2`vs0;@*A+oRix`X3xtyN(D1&RL68YXvsI!rHwWPURU% z`n+kldIO>(ThQWj+H}YDM5@7ay3GcgSK~7z(pihAxx2G|D46PX&q<1EPTw)2G#D+~ zEQsy(%zaMtz?JrKKMu0>*QoIiF`t-AdH?p5-D3UT2CnHnlcA{ z9z#ZB;ho0vh0l`(j&KO1)EUQYZEC(JV=F|A1KatLXm9{fSSz^0C!F&F40wvprEb^d~FX#PNNb+xOH zm`n1QxL79ciHK$EWtF7C zEA8PbMy!hqco>r^%|$m$T%bcPOFxZXw@rWZGKZS78x0zV+Tz8yRf$5qkSLS)XQ5n;Ek(lBSt-j~HGEu~ljvAZW$m?N@1nUU&-)*_MDMhjmB4P13IKH- zI-}~uop+{&iU}^`Tga8ZIHMc=G*t>YAxfAwWjr!VdD2QtYz!l*9cEOMO@ zmmIxUsdOVGw{c^~Vq=u|@#sO50hsd+omrE5_@VsYD*4`QGmlQS(Qm{Qo-xSgo4KBR zg6)-x>&&nIjh&HvVx=_%+j4 zh!!m%3;lUn$#Di*1!Dvjp?_S?FpN@Ji)^jWUtWJKoL6g5KGKl6ZbwKbn8|&iiCAXM zgRAuW(_gt3_SgRUJ?I&jSJ|;kt|WGVu=|R%o6ai*09X}l`V`IY zvVlP;2(oqjfQqfCVAufZqtbxf-dJ0>P;L_Pya6DRuEBh#rH^%Fi#^fs;EA*~ZGTbq z@~}1)Dsw(N#bz>CPIFd*^SwCzx4$hht6o>V{IYO5kK98qA5lB_s;ASbWsV#bX>Sf3 z(5szJEBSLs@75Qsx%yZa>kXDuQB$*Xp&4noic61J122^}CJS65-Z^ft8MqR{~c&;~aB*^Go&!hJI~1tZ>kgl2+A~O{z31<7SqX z|DI0fJV$q*2$xk@w|YR$Tb+iqJsq}7PhO9SI+;u)pijbMT_$u()a;x(*aUA^IdVYrss0 z_^v#6cERWwPY-x(3wk?BYKzBBt=j=#7LBe!+eb! z>$Z0D2_ryYhr(md^xWC4)wO)nYO7nTqV{`5WsEThoqZjE(yBDv1MID9IIz?5uF_ z=GuJqDs)!4*RKIi{gq|Tvm*7}vNm*NxnD?~2Tnf1(6)p{xH+`AokUR~uAK7=TVkyc zwY5%n+3T-d0{UkdYLU<$;(6INk`DK3J*Sb`8I|5R)Ql9X1{wg9GIR?tRJBCXC(+n< zpAc`tVo7ILji~Hg!4b6TWxIe`!B&!y5n_rjjtqhUN5)J~Z`h3f1>tO+m`9E3_~}e? za`lE$EtW9;sJuCx976n>_XTFV$zKH3*JLUT&Ulgzi?z_@VSc==vZb`H+zB}fd$8lB z8BOJ<#^-94KJSpzHRSEBx&~aPEt&UL8g9y==BZcS+mPE_&JJU2B%TZp*!zx`EBznc zg#19WN{-&ccF8LABPlaM8?{1NURKx#Tj-59i;HMG@!U4Cl{u^n^cq5iINRVnYK7bJ zQu}Kg+`@ePj9|L`qaR^pt0iQdP_Ds;ZxwzzOwJ0`D(}(`W9BR~*p!~YIwqvF*oNXw zlP^w8oSB?FBYvKoykiWvSA?Gu54|(jG==YyWHWDw>+!)xSu_LkOEzPG%!A2sAR8~a zgzaQk=Y+RB_2faiirT{Gu(tAMV|EQu4t~1%*zgwz3*!B~;{|{K==?eMSR!`~ohPCH zEg2G%e949JCBmRLlO_&v>-?{LrTW~K7}<*r%=!^F;VpAraj%S4NIbh(_r zx$nNOeeH9fJF>7-Ec$_>36rtgw;y@-*&qDikw<>}rF-sKfBN)ums~Z|$vcHeM)F3_95Zj>z%rAGI0%CkTM+OKHB z#9adRSB(CxSg6dF=;$sv7%{E6$*8-iR)@8@+vQ;2u!w0?Wi6fv43)<^kjXzmJ-I8(G)YqN~yiDp9;kH zZ-M=^!5*YUeylBsuihm_0q6RF%k@93892}3w|Lo6lc(W)`%;MU=t{r@bh&tNXoU-! zfQYO$OfAQ#6#}+%RmtU21Ijma$V#rjF~d_yW|LOsw40bB5<;D97_26hR6}w21lF6# z$%oWluT>IoWbNd$@lY+-Wf@7Itfm5ky;a+DKM}hyzxZPEkT8_nnogEDpR%TLCNdpP z8%Mer&h8{0qISFWUcF84QtS07Y2o*VU@e{OD!Drr2+)$|%|!$foRXQWpE8)blU^o` zu8v0|j4|Y(e>j$#`pRz7++yvuSbMCSJJqyE(QWKBEnQ#YyRv2f@4w&N;;QJv*}iyL zA7PClLwV>R$t2&6_#-sk&Br&qH?EKPtxQB}_Xkedh6jrsCO~Y{MKY%V#S6#{lh`V9*&!E?K*&0d@FjAx|Qj|W7tkaXJ_eTR?7w>`J$bk<$RW& zv^OK5p$AM1b1Anu{4t|QS3U7WKL0qyIX>A~`g2Z+s)Bq>7vf9lLG7{2 zh!XTOvvXLu<8qO=AH+?xjZYjnfRDIAL-S{yTh2r;PJOtTvFA*tuo?Y0o>Q1T7M-M~ z)N>%5lDhpv+42Lai!+A}ewGdD4rhed(;}6L5F+HV@Laq&`SgzZg1G9?wyQp@GsF@} zvZ5jOA)+8gy^yogVd=}U->NV({)?y%k z2o&cA?3(l|*fsD~4^XXzf*;OpM=azbJ|r&mFG5uL+cn^SFmCi%GCQuZJ=FV8JwN*{ z`SZ)a`QbIf{ikmt*9teC)|f~Eaao5o8L|{jW=vYT9H?&zf3x>Dwlk8Yzh+ddUaJ^V zs&z(fuF@^tdk`l@&Ww+nbiBn(ew@Nmj;Ei#`?>yHuKziEDzzb%da795kxG4~t_<>? zN*8EK7-mwYmCCR;%daW&cNL54at7XP(Fv1Ss{?j-Q)cr$gSFk3B4^2iCHn|x3A(}O zqXNeG?UG>;o1+Ii0JS%C^AFucwx4QjdxVW*!j_px;ZBeV(>?~eyx55$as;$Q^kyx| zbB#5!OhGDYYC8m>+REI0s}Q~UpBNKR`!|e4xL7o(3r7c^2>T2vvsGz#*%V629~iqJ z&tZ0RxFh0B*0R!lSnV(;+q6mRO{$aONmp9!k0e&T-rs-2z`zat{nw3*Fb{0{@|QOi zi^37ypDXDj(I}ft^xk(%qN0*Xq~j8$M5fZ(j3>+GLm6krjE2LgYs6a~J$tZn#6;KT zaEB|GvhiNwWVd53n=q!j63l;ZD$UUwbk2nO)gt&^TKj$5dqan*&Ou(wtw`GXR^a|7 zxx+sol-ht?DirclQV~*&N~n_WTfgvym!Ek?_)!aSarB;# ze>~f0yxeS(%btH;@JpJdrS8&)e)yvw1x3uz5nzU$Px}9ZsB&2h%r~T~nTyC2bK_0mDaJr7LkW1!Xd=G8X2HzY`UX7lz%XjA zU;Dv_$!EXzn}0QCt36AfHuE`KiKCpn5lhM0t?!aByIt zY}KO;9nxEQHVl$K)>2;DUDbrTvUYc_GoY<%yip+X`$$-Lv9D_Fj{BJCv?07Xk_^+ckI7)Hb`QrAKE+bnaU%tY;g=FnCJ zy^E$7+AYcrMIz!~jyTZXfDxvVDjL*qj{mpxOw?E}m)nYx>A%ZN7QQ18o(UU2`mc{X z^0jNyrG|MX*OR^X+mAl_@1QBjbcHpxc-d$72I#(e^1fdv^)iLk;nHP}*hZGVW95Qe zNo$u4Y2s|jlXU8s6PFS?8@~8egVx{O*BJ^GLUz@qH)zSN5@m-{QqueM)@-sEFRb_O z(_Q6QD8!3Np*v^l&SuOFR3d?_r5>dqHM1RT$jOa4Ts|{&XtPzNhxj3T7@-ak9#E0?cca_p%bm1 z2Ia)rP&=h#+?`qBHgjNOPM2L<38vO&-CgUMOU2iuGL~U)#5LlcUux60pt4EhHpBp; z^%iRmVmw9zID`>USA2uW03wGt5oAG$TjPbT&tZ{M@LWOe+;@PXDPT}(6qt=%=o_e+ zJ^zWc)*(qxxL8|MvN7xUr0;RA<5wjMrgF9_c=1oQ3t#qtfmuad>)8JFI~C+KYw-moe|#2dIy^+q|#jo;tvH@dm@$B%NN~OfF4L`fKLF4g1QK%K)h0 zGu&mBQ##KKavu}r0)y}IA)BT3&qXnQMkl{jP!3Q~KlBv?F6YZAv=XSC|J$|(%V1gl z@6t2!AY4Nn4PLDKi)0m&4u#gFwHEDWM^dd+$;c7xtAK^xAl$U+^;KI>0bPngkyD$R z+MuCk@C)z#!+%tC=8jQ~&xP$%@_mQIeM%cQTG%LOnUQg_rbN}DWMZyC@9vK4ckU$5 z2}5YSTd^>8t>)+@JGv?Wn|w=JgQ$_f}VtKK2 z-E}4UWxiOPFV)hn9ET|RaA+8O8`NG@7YuY1%dk+rSr0^C>eKV{^QFbbMQR@?u8(rK z$&p>0Kvs9%s<(@s{x_MTZ?|dz&!u9+yKku@vIzhnsN_V`D`w#eAGl2Du`haPvPNwQ zwX`CGCJNFzCP48*{~uxB0U&2tr=Rzm-shY7X1?jY_uk9)Ub36E=@m#wBLM;i2t@-( zFH)o`AVrD-ilTt!ytCY)=y`{FwzK#DsfRru|L6T?b`$ix8#39=W_H597C_1Rn#BbmB!)6TPk_m+;{cb6y-JPA zY2*J9sw4K``^dY5m)|kw2r0v%=?GvTERmSp`tvrMtBg7j%i5w`KtFqR>DV!)JsZ(; z3LxQu6qdfO4}WVI1!sjS_x4ihBcw6UBN}3=jLwVn=s(J{%txMG;sAi6z=cJHK*51WC~QG?9`UfW=hSOPAy9E{NmGOb+6%AWB-*xG938or{h#My_U zk8DyF&04a?Zwc^eYx?<9cacMbQ<<6f?`mz=1^iyE)*JBax3$ctuKv(KlOrFg@2%sP zaOu>(hYlZp-2jZuHuribQYJGtRM@DIc`yEY5_(H|}T^*DWk$(tBd%#8M)= zIl@exys87SORD{So1_VRgc-M@iQJL;%${vHU3P-)ko*r{la)m(nloO9VVS?_%~W7a zsEvV2xV2CP9tOiBr+fW03jEt-gT^>ZU%KZWipL~(-ucDfEX>Rh*{p=j%xo6i>(M)r z&B@5@?CgifbsoF1qjd82@p2+LU`ePiCEtFxR%_53K`YRa#f3(m1L=&EwOCa7YD2ny zlUQ0@vqo>QTP%#cHdZy!48&9&s|mkvO_#w$p>u1>(=BaVHB-^L>7Obis*>=a%oOoo zU0v{clcu)XV@q%Bb}x2V3FFm!Y?TJNChLK6c${oA#iB^$Ctf_%I6`aXSV!+aKq!fGAAXW&j_pn!H z3ts+zvy7tWLeF-OB#d?vF!*JU>4X=}X?v)$&U@nrJmGPdF1>H>_K?GrFJz2C;(5%y zo{@ksQ6Kc$2rGwF9^)5Y8vW4FFN6oHdQ27TAcE+LJB_jnA$Zemknm%@$7!LgO{2v1 z6X-@?F8n|L7oYxZ+S<0k2(9+FqWRRq`t8l;cE^C*-EnVg9ycVXNZ1@PbCE+M!XMhO z@k-2OUW<8D;VreKF0d(YttE*zT=aY_I@0}GQm>vQTP~@KZERUjYs`Yi1m$TvgQM-Q zqC5$6-esl-2JRdF&I{zx4}R;5mkEzvdg-N)K;Y+JzNWDmbI}=lTctC|g%j54v8R}t z@DCrU=Pg6}puNh&DN4>cfO9D!i>q-i9ZvF@V)5M9-+1G7qVHC#T?k1P3j2!1eTBl? zYPCOEf!m4XcX+b2E3L{6%kHRE$;Fv&0~zzl$ZR|xoL;xH-a5)cKs;qW(z+NEFp*Ht z2Rd>7wn{X>?UY33#IsOmy928OgGbx;w45n|RnHjJg?Xfr6=Gd63tTQ7oNnafEQxTz zXfLZHzzR@PxYA*i$N}3$q>VBX7wCBMFsFHg1e^jrxFc z-+ro?Nv3AlF3X>se(}pQ@$rqqe~<-F(toMuc3Z|eS*u+fF|F47r~KqMF*mBgMtj7B z4Q0sNBF?NlVE@t3HA7mn53I&|*(29nV>@(Q^1hNnuStNh@Dj2VfQ%*88%<2PvkOlh zXl``W?e@B3W9y{h!kJoPfhl+6r4G29227i^rW$vp_pI#!C#mrfjZ}DQpdyuw%Vb1r zvT9Uj)ongc%-42)o)5gFQRKB&htKlF>d#}gUH!b2D6DBcphhA->pFDrjmRJk@QGz0 zw9bc{#L|jh455Jp!I=Veu)i&Goax6bcqLD#-2v!Fh=g*PlwXU5y+bU7}y80y!8?F2BpHF)_QaWE^L!~nTyeC< z2Yg^iD6wJA(Qr2cAUciWKs%G}mRDz0q12gi*PUFP%^6^QDCgi!k~OH&`JrAkwCV*| z9r0lQFO3n=l>AM%n6E|wfx?ni%`jUcryyPEP)a5S?&y)V6_m5f&O4&|8M?Fl?GB&1Uppdw-{d^b1B4`k0TSo6@_RF&-af$^N#QVXpyZTz~_thGZu&sODC zyb_5gl}H3niv#2o0DN9jTSym{UOK0}nJ?OHC4O^zr#7@&Q{o$vHGA{EyF>T-_ar|m z&Dc>>$#YMgNe-A#dF`?y=PzDKLU^ z5v5VZYkY1Cq5eoFVy|~dWFmhA#gJZ$Q$ed>{ZtBYG9*uwsg`apG=xuYbN?$VZEfmq z=wRz|hmKCJ(Nq<$LlOV)qNvWOnt`&`5Do>jhIAosihEiP#$KGsTjIkpm8p31Tr@p9 z(s3Kp7Y&9+4pkVl%(ph_w{`~GmY0-9IeNv}m~qH)m371szxP=-Y*vPi`e;0;y8QC1 zZo;8^r{}^8U$5yr8cesb)%=(Y^H{QV@(t^CXoC7lDX($69V$n)n9x>jLy>4F#kZyA zcsp9z=C7Edsl3}B9Cejk-H4Kv^I3gG;f^G&m#TSX**P*b6SNmCY4g-~ED@tAW24H< z-@oW*+OV#C(N$?vo)f0Pf;i*JjeYj*t!a=ca&^m8>k2L7PGqqUN^k|=0`4C{?7$7K zbdhKe4(1E4WjV@U{wO;9|62zOnH9|98R3>#HKTSgNYelsIf$Fo`^bD%_~9kTi3oTW z=_N1wzR$?_ znIwCxKQ!*_ubJ3aVrhQ~O7?%>=n7kHn`ia?wT1Nk}0Y(e0@~=x$ti5wa`a z`R%wc&XA{q)3L_jts7dKARB3~**3Kec!vl29Z z%&yvk`W~%9-3lyj56wt*p=nD1s8L$yqc@Ms)B;=_>i~{dwf1!=U_7DYL2ch zGz?Ji3+NkzKQtus6?^rX7O|>*a*{mPyg~TG+=rG-rQM;{o+p=bt7B>JTsXBM%B-Ef zz3v>GoO!%iojsD_qO6c1*Lu5-QgCu{bGfw@42B?G+S+n;T}HY$O7s}6!R(qES*96m z4Lxl(irT{&L}bT;zG9^yLVLo!3ZR~d6A;$^9`u&_t)u{_1Di99CB3`LJA>V+N>*(i z{Fd~ti^t-|GGTDWmAUQ-cgrFu%zJg2#i06;4@no1IfdUIo6 zolG|DRR<<}t`ClTOOp?8Y45XCI7`{GuYI|Rk47To!N2^uR45h)47jJ9n0wRJ;Sqx* z!5()3)K#upb+xFlBF1>jcNGT?5geWP6>Ch$fBI+}v1`ynp0`P)M8`AxsM7|-C}|NX zd}g$M<}sx)AuT2nvD`$vGH13^Yv-G$KP3`{d})*QenCYZSwth%kyYCq_E$l>Z{>AS zck&pxbR{a2+xB5Aufa?W@Ei<~6#JECa2z9f7CzF@2b5Equ%+yXyI9G&hp0+D_u%`ZRJdgmM-#;{sdoHnF9W9eOnEzjhN@JZL153XKG7p1Z2K z&JvvxE)E&u=^XD4ZewoQwoQ1mU1`Ao8 z8IPaOrZ`KIYo+COjo!sNeY$|+N}apm`c-f~v#Z0#S>z05y+@^V39s&@I=DRMGS0%R ztQVEpWrVPZJE3_b%~J9F8{9z{SZjI_s7dPQMP)kM0{mjHo=d;nYYromU3Q(62#i`A z8ptt^KJ?Jgd*1W>!9eXj;_5v$>OD^w`y*lgFml@vlJt5q1X@xuKwc3Zs6TbF|Ev#n z$K11<&#t)BySJ`(2=|k#2^=ZnWZ|3s3BPd1v(J*-ZX@5Dt8Lp>o2wqKSdy$c!Bq}d ziyDXS>zw!6c!AFrFQ`VB+NYkJU5^=obyJ`Dyr+?mXolq8Ogq%pxwLwhhWx|f!`@Br z*+8ee(W~h~3m^nLLwVk&SFMG|q!DgE>*-akPuqtxOslzn0hZH7F;S#eMFjF>>FKAb zc~Gp!;1e2BQ1C)@IbfJ5vb=i27OzOr?s@QKcZD_P!O`zXuRj_Y zFs2T#3Ah^$1PoukAwe7B=&)p4{>0k=Lio!xxqDLh3z5<%v1Z*t3x;*}P7f9R8+PnW zHFlX0{uj(U8&?~MEtDV*SJmOF&$*3WV=i~igu`9i9;hH$O$k5v%detJGs4L4cKa)>BV(1KD=(9x21LHO2Qu>2*T2rASY5*7Et z&O^<{POf3K)cGBaU7Exe--WMzq3$ll*l;*(Xr=dcEOL(y^BnCX3D)f-kzr?pANKgW zUgCP~wYzuhfKoi-0~_MhHR#Vu5vle%v~->d^$qxPkW+}qtZeBoNxv@Nzks-~E2of# zbqEvu<>K;Ky9ASI6o*HbZ^ixn&!v44N5p(-o2~rcNslIH3&_)6Kt^lswt2_DiP+xP zHpV<`${JQAyu6=8zIW=^Kl-@vsbTWjQQ=dhEBxS3L&uH@|6a2B&jcAA67lU6WW-xt z%<+31t8<>JA)>$gy*WuBX!k-hU}L3fNEz9rq3W$#L&gHW?vFB|WUVHE-<~`noJ)2I zKPf!<=t91-aboiuAq;W-**ZT4oioGpMzmQEbL5PkT2E1@_;G1bgZXG^Qvre-<7ZdR3%L z`l8VG1;_cgHWZCGj8QWu8shUw=9shWj!K;27<+ftVJl?gMt^MmsSmRnr;TOGF4LIG zV=1!{FSm7UaFqq*#|=TPK9H2T~%IYX9DYMpjYc!;Rv zCZ??6EWF`@T6Kx_@+GK;+SJ1R=d=}8r^iqTCYgbgMoTf{XX2#_#3|14H+==m^v=We z)^2mkYE7GVw@w|a>kEOh(d)F3S6N@Nm@D`4t2;2SW)k(*mnQ(1k&ZaKeQ!Yn0ZgpZ znQFQu;?w{4VzHI7Gf$y0wAx8M3%(os)-Pt`&-6S?)_q*2P^c9pC2KONx-wSw#BW|Z z^*d6zVrl78;rltWO*vwSTC?7yQ_t)>B%$*>LqkeAYc{Jc0O0eQYk>KDq)Wa%@Q$IO zljGypBU{*}HyMoDjMkkVEpd*zS@=n%LbevBUzo{fePJ_@0h=NNwnlh<{mxo*pBa2( zHS@maA%oKH_Ug!<>B8FFtgx^Ci(k}#@jQJX;twN#9|X6k4Uzw%cm}TkcNijndRvil z^?a%r$+O{Q2fOTGa70)M&a3!JaUH3PSy@G_LO&sROV+v!FgU%I^o9K=^Id*47&YfI zajiBOPjaF3y!+PQ3C|f4={O3HH*P=GkJXDm*2W(!Xvb*v9n6oJSimZ7@ufO8H8uUM9_)J7ocZ z1)27BJFUZP{Y-Z1KWl_CVim8-O^yL{Yh4 zJdw-`#ZTXL2bm!E-uqdrz;;|*)L11~R?&NRRs`QT#Mt$dnlPkw;=mW~-XqRB&q)^n zs<7GBO!b=eBlB;(x#~^&OY#T3*J^#xYW9LM>Mx!T;cC(2! zc~(J1n(FuLl$c>TdrD^Qm9?XB(IIp~PhkD}uDX})`-NKGT1#adFz zBz%Mi>Yd*{f{uoZSTON&hY|GaiH!cKZ)e4~hrM0?NbUn-)v7K#d>VflQQw$CXSC>R zxvm~EB`C?tnDt8rOLUSvHY|K+nCub03&{@pyw@3q)I)}?daiL6I`0zRr0BO-F1=Lv z@H652G#=7M8!)Riqk4*&;rp9916wzkuk1*Sn!1uD^IA-+8^X>(eFP?`)lA40aC*A5E9v-~C|c)Hf|TLp+nTH);SJ>^{aRfMX8 z`<*E%JUT0 zbwBt)?z-zpD8>{V!UQ4LHy0C?==v=?3j;eWEh^i!ZQ!s04LhH(N3u)!!KsfiFSfCG zR|E=rB+8S(Uo)&m23*)zi2I4wQ_WK+?9pFj@4GMi?I*XBL<5m1)hnR!k`p%d*s9|= zosVIimT8oFxqrlw9xB*sA%U^UYAO-M$c^?{|R(Txjo)7EAr!b)iOi{>YgJ|A~ z29=s*Jvo!R6olzw-^haQ1sy4FYl1v3K5CWSnwbvvr5JUhTZEm88Zq(sY` zfpoK)>!rX${CsRlhGKEU3F8I>=Aq^+J zX-KY8B@Mg(``IIS?84ZB%$+ztHTnl7geVDJk6o zdU)xR4`N&!^@M&*3>a5$p1WEpm3eWh0+*;aYC@eZolB<0&(qZg@gC9gk9catQc~Yz z_ML|4kQ-XEZAb74+0TxGdTZ|d|UVvm%V&^99k6bn4G-l z?KKO!NR;jytt7o}w~J%Qm1!t+J7QKyxU7*gJ>Ct+fF0>(2a+c4X=8%$|Q&7IbD zKnmp`cku2(@1u|Y@YJ8a`}EWNkW;7fM?$)rC;nZ;?R|dY8gD6@w76_`bIe^$W_9SE z>!Y}i(HE!b<4sN-^zo{&MiWx04Qh>%Gi!M0A%I<&BR5wJ7M9f@#5o$73bcGBcb%jPX9V_3O!#2-!}RmsK426E(N6z!8NJoZc_BQH zINpWYpNIv<%ls(aub{Q*-u`V6wA|FdW}jIg1#BMgTd6V=--)OA44dS#g7ll6IF~kM z+3Yz}v6+9*aBeoo2FPo-$lYe&>P#@T#p{?@SPVHm6O)5heINwhy;|+U8$81fa`4pG z8e>`?UuzW%Tof>?y8gl2D9G3*bO_9E{89B)G_KdB;j|8tRvNIsf)%O32Zn-<4!{+;!t2mEGl`Yrqch#ds`Tv+aN9?YGJl(<4#2 zS{{>X?qBVQ%QcFqQhgPs{K-EXy$YAxCgH~n>SvzWzkk2*uCiRERLI6OHbXs8(w?Gt~sB1JY2WsZOzEbnM_Cc#->dsjnTwEK>F zDuMXeJ)0VbxC#|lJg>3dWOBOv)DF^GzzvessJ8@HVlW!NBK|Uqb(3Y!bvpR!nIal| z$yT;#*?7?bhLu-}=y+=PM4lR~yBID|z?o=Em%+-_<5-V;*EHmdwNxH2gF!FY?)K6LNAKYi`t-wbns6iq3ETzXO6|;_E8H8-5|3V~ksWjj$MLcFE=&L&u{N4>jHX;L2dQ-Ls!j#wD z$SCG9Xv4?>#Cq;SHEu*52Czz^G@Fd_vH}?^*pU<(CG;6F@tu*YGur`kJ+CD@Mq7fDSB$-;I@^Jm(wLmyX`z zF=i_@htEGb+O|M)o|j8>3XNS~SDMv6gI5D6M%c@fkIrRQXSb4II-G_o-gVwiv|ydv zv^Cs5#1_rwB73NPzE0u@MCe`8tjf@tJLENXXubFmT~qs(2gaq1KKhk70Z|2v*jrc+ zu=C(O;AzbaW(@2&y_r^X|7*R(uNO7T{@1#A7~k>Mw-(mZEzD@Vp4EFPE_qo>(m>+`PUZ~3i*ogx#u$*x?k;V*g*CQpKji}H?r;V zktx^QhAqiZdgH>V4FW0WqQ(SLgd?Ynx#9R(h8gdY-Ip)49P`PGCrrtDPT%lPr8{l% zp0x6nkLqgD#>Rr}Ky1JFU@EobQv~A2f1l3_a~Ju~Bkg>C9*N@5U6**LbGeta=7;aw zpZTZZOwnl$TEK4ESL@k z?Yt8*KJPmsVOO&nh?_REwxDrT!9%MosoS^}^BAB^sn#_ZymXPDg~J;o5hUfmhlJ4% zK-EQ7lox_QGPS~wauXY2!Z$jyC$ia(z5Cq~vaMLUBbOK6DfjX=FSeZ!hj%gG2HTBn zSS{0_s7h+W=O%SpbMxQwE>x`7F=X0Nj+ADe-rhWd;)z3zlJ(K%xjIWI5co!wK2DW# z#a~6fm-}uylYo9q`ppL=If)d}cuCxqo*SVa-H+XYSIL5gaivmE|5ilm!w@q6Amj{g zZ*;K(Y__$h-=L`ZyQuYWg()c*tIxt4|5V8 z9LBX(E!28(tNSS!{y!tIXM`>e>%Q?Oi_()*G21CLSUfQy0zH1uwtlz!AICFU}G-{tQHWQUQ_NvXG=FpD} z3BhXy`&1j2F1qp<1l((R@PpDuu8lWz3rk+ z)*e({lnf?cZ9?FcmyauX<*QyqG@bI7Wd_dvm<-Cia%~{f4Cm+8^W2)jw!fMV>SZ7q zmj7`A)Lb%|*5oj^eQp&tYG(CZz&Lzf`%h#&RcJgrWlpY67)s$={U`LvQu9h^6!IaT zpUZ4qGv#SdKeTS$!{a5-*oFh6j=BRub>h^Qn0)=BOm1O%GFq!193Fn`$Wx3|YtnYi zX4!2NFD_qYg6-ac`G)}5KXd4YoJ+Mr!pP$22}FGfWei%f#}}w$6}!&3v=|2xtMw?x z(>%O4v`IrCT4t(JOn~bxED`u#oPkm#yqx-d-PbB74Zcw{I3^yM);L*--k>9M$9)r4 zHdpKVAAIDIOX~Un7NTNl1sa}G)FGdi7@#osar>}E?Q&X}cIA`C)DDXO)bCnd@D-Cm zz0?!SaIKLk6O}r)WzrMefG!wM36^}h;%F=eg*&-4Ij%(upXE?sc=us@-qWdP4IBTH zIV;a5Abl1~EDAr*_%>jc%AzT?8b;6zbJa>*7C7HKHp*sj9gKTFKGgLOj!dOO3$w%4 z;^b3@Eh(POuFi*dRy@vTO`O}wf-#87Ij6G&K{QP4F>7`Tth?g z;1WkU7t^`csB%Re21teb+MY1^8 zD`Z3TZ1*b@R0Bs`a~j0=mb1!>2!3Q-PWF2 z$c}DuTeh}KvkMpyXXN+$6B90eJd+*S;BHv8p;)v~*IOk+8jJ8PlYp#NY6dJZd=_H zG0t>+)4}kTTxsa?iAdZOkNO3r%QqV~N9X==BuwNTIxW%>_{O3uIump!M$soJ;9PD6 zM#_X3jpm>8V9TH=$Nyo~=rtCNUmsj70Ui4p!>TK>IE@~b4Z^b6E-D9BP|8w;L(%H@ zqH^-{Mx~+|S6b9BxNBT(F!yOqXkrGJ)smU1WkZ!@$jtAbj}#$F2q6RE>+cqBzWwpX zX!o8xD_ldy{1vUuYF5_R$Q2q}*sgS;nrzbRj4J6z$a{qc8os2uV@#9xB&Hspvj*mZ z(3yPM@~9imB*?ZdJASNOOLRxq4V-)bK+V7Z%A3d7&{gx5%6!$DwOVr4>K{S1@sYF@ z)ojk6+xVpLd%KTQ(>ZupW|hhK2LAeIvDDc`cku|$ALUKHRk9zoG&3yc81l$o7X)ir zS+&aH!rbNm9)IaaCm%*Wn^74Iyo+F1oHbrKB zVCxcvN=cF*!-Kphe&%E()C)?VT{u%e7+anM4nTZ-b_!l+Jl9 z`xzQ!(wi%>1gk5C(?WhZOE zhTEa8qc*Zo+<8qgZ?fX_&EkJg4HZZ4;{2dq@706(pyr6`fMBkgG0b8!_}#p`;ojDE zBb0r`Vvbp)se#$amVtF@OV3=vCalKT55_7ZLZJ1W(hE{DWv7QZaliR4$p!HJCb02( z5Y>&qhHe&nP+}1u({;GJ7=h63QiPLB+5LZuOn zc&1h-Q?K)$Z`T%E{`qKf>d|wok$H$|*}iPM!RX=mEZ5$@YilOs7@c3AOwLSAC*sjP z7hE|66p-GhM~oGJ^B&Ay8xRXrFt6UL$5M;C5<2zFgoFl8yu5cMA~XOy9S-!}5DqoI zjNi|^5@KZ#;T61McsJ1Ep!JNNy`!oI8;M`3mX+5_BM>Ify_Th zKwCb6Dk@6MGMy(@i_|X8@DqczSUK#}(^}gFHY*z@;4xZQZjwVK-+AMF=aKo^@RT^nPN5 zO_)GjSKPK?AymKh#jTHyccL?EHkY*-havgOdAScX%6hM+ZXfkjVhh38qP=Du^jEcB zeYx?0+<9d#V}!!JIm5D9Q@MH9hlg9+hDaLhkKhMbuo!Y&DOOSt{O??UYd zFsnWp489l+lXv=4Z~W{Q|GYot->`jaghRb9X*TBh=luKZL!Pk<_AJG^&U$wu8JwIL zab+cm`l(6ERiD;Gjjkc#8dsb!Z-~E_*xtL0 z{a9Wc_wOITo(2m5Rt!Q>Nzak5KyLs`?8gC$qB)4g>b+VVLjf9v7WBj?J(wJWW7rQ@ zm({!^lF@L}b6lp=8x&oW$HvMBAQGjLT*+o+rQnFwFa~Cenn#PER5pb`!4$6kz!4emr4Bt5q%_UIS0rBam{zuu6s6l3F#k`9my zVIfTkWmWEIo(VtXxkwj+2BX)%uwf%izCRMt+j6I_&NbgPJ9r`$&F?<&wo#2+qj72H zuRMSMfhLoXg6vpll3iZDv3%{S>T4vUADUlu8%!FN)zB!ND?D&@<+|!smD_}$ z-q8F|Cb}gY0cTw#opH~X{Dx!>LnkWm54}@z5M1b#?=6WatXG@4Yt_BjljSmT`7Jya z%iR{rZ-J^!&mMMOvx?x>$CnUbo8G6bf&|ONHt)^J87SE zRtJTz4G!J_?g~7Z>oa(il{TBTPm5t&CderN_St7IpOvaz`r0MO_CRgk5%c^8YP*v)@s#qtJ-9m&m3e+yx!Fcug|4rO69YU%zbPd$7YH} z=-x&i@;os6dAzXFgv4(0&F7#Y_D9qI`^g8lzSoOr?wp6+ro`FBA5gRs$=FSO_0B z%9#^W21v}53>pQZD$X0{nd88BLcvY=vo2ArI*R_mT3Rdof_Kt!S*b!LbNPKLk`rFC zwRX%H$Q{-ptH$kdYlVwhW``N1CuQ!7L#XQ{QP-jK!&$I7P&T_21`?`qLF+WM)7<;9 z(aTx+44a4lmVNTFeiZo&=TF&fK^f%jeIBJrCtP|jWdda$5~V4SqMRc0r%H}(^}#93trrzXkOpZ7&AN-{|cZ$aHhTQ~D1D_`Vq{)VlLkJfPGL`%?4 zY0`^V?nrET$F}CfHC?7L9L#aup%$&V)xb|S2HYR5<&J}!f?`y}vJ1_)@WjA6et`bZ zfC)Pnwgx{2Vgvj_sdl+7k1!hFhhNzFK6>c%&Jqh-HDf^}Ob*yxzdqp}JoQ1s2{)1t zAQB)F8OZBkQys$3r8Wy!z;M2j8B-|bj!?>maL}#Rne|G^2^o3UyB-sUZHtV2wUn$S zkhD5f)&{~+Q`R>r>2#jxD!t$t)!TIjr&jMY8UrYh&32pD4GtXkMVPWZsdmb0L3h%O z5%>1!xHr0He!`tVud361GCZ(%h$SvS*i1Q-@CHk&AXTTnUV^#358^C-4Qu3qw%W=H zg{i0Rn?UjYVAu{DzkIE*3cYJ38aTwQYjTe9xp{wN;TGXl_4MfDOR?6$-CL5vgUmk( zztshV)i=}oEQ3JAcbMCR|M=-o$yRbpi*GhcY(BC3%2Thl*1LvGvC3qj+vVb?)^>Jj zT^^@~Z`pSdb-T5z)0-cY0;l+ZWF0toLaT~k-+37QMlr;;D*9KD2FwvKUwB}l89JZt zrGT*BPeMP4pJCDl69Z_F^$u{aUDm(Ly^}10bbz$OK@i^<6W;Vhh$bFyLQlj>l@MQewB$%DAeIvYsnyw`k>B z>9EqSQ9JwzJD)JS=Zl&AdavIvg<6!H++c=Qmey<`?eb+x7Jk@mS7k%v-J+qT^6`Y} zP#}#4JZ=}peHx=qujaz4urUTK8lBxBsO-C&?yK(r+t__n8cU>FUAbfl$mv@Bt zn5wO>29u$V9}-i-&7zoar+nWz`gr{de@u z$Iw&%H(;6(zhlm{Zv*5#|1D;Nv`@5R7+~ea<3)q$d-4;w^vzU!T-NY4+>X|*M)tt3v7`=Ub z@#b7Dd}2z4|0OM`;d18r11G22ZQ<*NXd-TE8S}-I`WtC4Vg-1goEL}~GVN?Rw7i9t zdH15e#6d%7y{Kdy_G{v zcV!)WS;d9 za+cKxlJx`4=^M)Nk()rB?sn?SWLr3AwasMnhlN9r%5=&l>m;WScXv%zgY{h8q_Wv< zDs9M62^IWi=@B@Y#=pxgPLDn~ARIndrj^-q5P;Mum=7jQg<_VC8BywxjLVf$iNWeJ zI!fB|1^GnjiL?13t5mI0oCO)br!)aIBTYM_H|LDzy>Q{Z5Ntx^v9#n(x|4<{NzWZNrl2q_3l2`HC+G`aH?nU=X- zYIQia%@zHPY(TSJY1fyXF&8V{OtxLSq%knt)S8!vxeY|Vi%}^r+;V^QJN}CoQ}dTb z+y}OnckksN&p(KAhD5SWAz@C$M~zz_oteG1Q#IFyCPNeEf+ZK*b?*K``}di;rW@I{ z_28A=i>qYcfbe=}$KA!j_N|*1ZyTwP+_lspaYNA1>*zMAeM+MCI|rT=%PJo#=?zh< zyl4Ay5XI6C%3NpMOKSZ47xRoyd&?#oE}Yoj&85D;zr1LYx!A^i0Rwb+JgGn>6){g} zP1(lCoxXO^Gn9y~y(oWmZZ?+K)bcmCtsW0vpV*Kdx_Q<=cFBPqDdFa)QO&yA)!8$d z3bk_q^){8qm>Vif&LJBvm{D3)OL`r7tvPsUH`s2}Tn*2_)P@omW+z5Eq2!pykuX-g z2j-rv%zC_Owy8_C=5qIy*98mXjsZ(`YI}#=%6C1xUVP%tF6`ILVszM;Hx$-?=3x8B zzDavKhj1S-6;^`6 z3B|vqcMo-xpzuL$<%01G{;^fK=HyqV0M&Tp3yf0oeu;ndytSpd^L?03RJ%+~U)pVy zT}Eyo#;<%uxcFSHN#gFB^m?*wE-)$~S-bEn{RP3_2`NvETp?V?e9zf*?fmHbZmtc+ z-@cwt>0BVy&h9$rK&>GJen|c!-O`z2#>77HX9`0Q0@vJKev4z*^o#nr%Z`- z3hO2Tp8R^rrNE{%F)gx-+Khf77|yzXXvzkHCwqbd%k6A z42}CTj&3Wb8MoAirXq>h;&hk)#H*W?Hgn79wXu>BrA|I3@}EBU+>eCnvoZ~Ht1O-O zZ*Jyb^OE{4I$qQ9r2V}7AlZG%l7^Ek={XXOteG9McCFo^0h{nu5(|zF)U9p4GrKY0 zc--A|2W(Rd3tm&S>D~*!hF|+SkCS+8P`~X<=Z+q$G%Vfeb;+hXZ%L)kI&iq$`gOLg zFUPPFs8rImSqCnAGpY=;&ag@Lr^w!%$ zSFXQ$s0DQhbF21&(T|R9)qd@V)-nD?Va+hOMo_(ZQn247)hlP%woV;%yVnmShiAF9 zN~^AbXwE3xhvfO_N5zMbUWa15g3Rem%=EnAb;Zap=NlJsyBnwW#mNt>bYROWT-jp2 z721*F3g*>N$2pcMmky4vW7FnRY0usR&8G0iL~XJ;Me-UaRNSUQo3IX2ti#Q)t7_zP zORHX9^;xTq z@}Mgh(U~XaXLwg=X0-L(dFYM2!@!zHg5d#uo*hZKLb9#AOIGO)E6*VXkmpGlxpJ)( z|CAKk=6{rPMo4C*l~xw&FI>!NFe(**vKW;HKIAf|5@D@5TL79WT*7P=>rmZ1I;yov z)=3o*y#7?q7BNb-I*sHM;tpR$&uR2Ay)mXssUg*gDuNYdxKPDiwXj)tPHNR_of_65 zlOQFEX<1HXN%+kYAQz!E19cQ>Q)aUA%z3dvL-3-d%~xkKIaxtoY)0nYX!*)=bN_Tj zyQBAjjY|(bCve~H%@9da3VRX z%bHS|G;05pKW>Wo9;}V`4E3&^I7bMFdtGW!CiMJ_*gr(4nRXP5)Cu>k(DMDE94=+Q z4A*B_k_*We9Fl0233-I<91TkX`6_R_k~dV_bwfC^-ZM|`-==Z}Bf|Cu%w{iFW1L*(NiocWOT? z52^*b+Zgg#C2dXENuCqtG!QIjzGh8EJ)mY9n2aV49@ycjo0{WOzO|-2pM`Kw&Br57 zH+D(~pPHizdwN`NQCQ_YVg`$ql9c=C%l=2P^3=aG z^p^Ew=Bik>=r!~Z$YELgOS`;;r$d<@Yx`T@;?qQW;Byp|b^YfCL29}-ueaMB21~}5 z&yL!$Z@~ zB;QWT8#gG8$~8)@N=_;Pcb?~p?rL`4-O{Ml_6qqr+W0^H`qv*kt3iJQJm2VaVlurQ z&g8Bb;>{kDug%;RX>-JAZw$|-{a$agoH8~e=hpr0Qd}Ec_t?8n7V3rTrW;UiPN(Uf4(7m!IaEogqa!_WPKCCY~qqJC+jdOq`&J(Al z#VJ*q#hwO&_pv+@$#T#@&ml~B-xRHkanPd+4}oWYU3<$f1`!f*b^}NKErZhHSw~30 z2pE|Df<%Ur)@#C4n2m=0>WJDOiKz@pvnkYWbwVdd_K>sa^Kt{eE64fNwnEU9$z}x2 z#VF&SP`aGX4O7|SCDXW62UAz_#vEG7W&(b7d9pd+^lQtlCOQ8T>0i)?P>0T+O2G`t z)G8UHK7RZe^Z+40_sof`+|2Wugc_B7;l1eG7@0DLTY1BgYGuh_<8tbNQFzaJ6>~8N ztfRxqeBM6fUwUeO{|f3x#Zv9Mk%I zE`%WYQl9RE9GH!pu@4GFrs-AhUiHCMA6oTF-^WzN)>MBXVbR6U5QfkQ44l1md<9U< z6}r8i2|*-_y;*5Yd=@ zf^1dvTr?7lmRXlAe>}p4G;Batkgy7+SD|v5vqry*R}6;Y3cXg*mC9st85baGnOQH# zrss;RN*vhI*YIZyPLf`RWa zDMNY?fx&(EAcJDeK2?X!1tbc!MxjuG)KB{ChJ}SSYnGN4lzIgw?xeTJVn3@$waO|$ z?hG>=aa4W5{YCJOg@N*wIrIvfl1*8H=3KdAv&;u{p^!&q)tSwlj*Fi9s=ejbTUAP< zHWUtMfR_bHqb|XYboo|(BtKCYow|8=zYWRYmG^9C8 z%J9jGZFp?JlHOHt7OtH#1Tin9Q)$2w1@6w`aG_gB=#_S3Xyc|e9$}w?Jnfit6u3+_ zg}B23zp(?eIR&sH9fj%@B6{i&=*>dq9CcXwN1O^VvPaJoc9Dksl_Kg*<L!mC`*5J{6YvRVKShE2W6M z-zsD(15tvXbyK-|R-t~wc)>kBIqLEh4Fytnj9Q%&31hz6I<@y-{^iwIfBox;u4YPw zsXseve3nq_dh-1jB}R)~7pXH*MsKlctuCpAD5WfCQ9PcT8>u@r07_Wx9*d)8cLWq) zHR~9uj5z#W`KfEGu8~|}!qryVgDGe3Xsct6_$MyRaj}q_xpRBxNc+xWr~JyZhCvZYeCGIBF$-o zibiG-uo9OT)1-*_#1*EOvUlw&V#w8BW&_@$PfLaS!(!aFN5@9fZ;B?glb2UQi9JWJm>@OucBC@1(9)MYiF9o1FUH4D&diAWR6-AJFJkZ{@Idr7 zh%pf*%&}H9U!m9%4fyh>0C1zA3T&W zc$}Qf{wM2*QOUc#Mq{Q}I`u6h)qvMlC7i>d9JRF)MO!r&klpnVZFDf#5#!y;gi~wd z42(_3stjH`3)U;$CxX+#P}f#ri-F*}($9@n;zHe!mDYVlO$e6FJ;JB-B^Wcl&4*NO zuUlzOKNqra;6x(LN^`Z0d~AC)FhxS2&^< zezoe&+vC|yf$+9Uytp&O$K{!y zabre>+3q#FHV9`4KN=zL6F&6oi!B@8DKXf?&RPlN!G}&>uv-#I8N}JECFdEWH&Y#%P@{nz#bwrM9=dBZ=6gyJ;CtWRJC) ze9h))wi|Y=jraK5o_!9f>xpiHnH)~-3c0>IR3ZlqL9sZ8pJ119B~E=jxot4EW;-;h$@aY*IET2Vi&Pziq>2eKio@TnUxWiLkj! z)mBhi3`>JU?r3TI!5{yajJ!(|;+;w1)=uZLR*M)0;1k?Nl)-H#;d4c+&uKR_W#}C+ zKxQZ%aVZ~sB|J6Swx`YUY{_emIQ~3A1}^##b_=V#%sfDe+xkZywFT;& zXn=-KWvpo6dfh$CN-)UwlBS-=TD~OI$WeTGFD%5JSiTWUj7%nV@lDRRfhgrZU(t({ zntVf}(I^2YIaSJz2Sc{5fA879+Pr!5d&zyd|IgQVfJs)B+s;1Km2=gpT&L<(&N+4E z>gt?krh9sNdU61UIAj<_L>kO-5=E6XYW6(fBox+OhCwJDb<>u*z}nJPgd)G)7esSzL3ek`OQP>Z+(nh zb>|%tBD+Qzusg#{L6c(HP{{Vh&|(N#ebUtqhc^{|ZpHW!o66`>{F7WNadJhQOZu+* z{{8hc8p1ikJF4bzIAXOVB3@P9F&!@)Uo1OAzNzu14GgMD$DOs>^^OMNA}ay^BHhCg zaGI`^?1PPQVHfXT_aL@aJfVG`KHLPkxC;{Mf?IT|7l{l(8Ct%{4@%V$akD8b-rvIh zXVD!Dkf8o$fWxPm5gx=aECXqphFGGzIvl)-Pf`w`20y{|fvW*|O|map*z5CducmT) zcs?Z$zF{3T%1lll%dc*}bi~8y9cJyf5`5FD&?+2G;S6@rE}JxtCEdqK6!>?^d?cJ_xg%`m%)w)Onxn4!U{}fW!;()xQjKN zNhw)HThNHgV;YgkWB1C89`#gVmnxXZ2*0#1SQ2gfL@YXKFSFfL^#k3yK4o)`&rEUQ zHaWgS>U?Z($nH=gsAD!@zKp}hbv(%>cU>LJjbf&HBI47O-OJ^aG3fWI z+DdmQX|G>YF(%CBgt2l_)D(9(Yfigg@l&IcNLagFE>|)mp_mU7fmy|Urg$Q1aOKPr zxin)6%!UtS-p6K=A*OoKMaXU2=nY$Ao<`p%Ri~n!g=(tM?DqU&91ZaRykl$bkJM5uwl$HEy(aDe3_Y&`}z~*#=+Z#Ym`5 zsM=;7_v>erW}m%ccN?USK_%Rb`3l)oXeJanCdO#=8j@R!c;i~jFFkdWCLM533%kyG zH`xRkq}#*eXHN^n_}&q%9%|!$VKlg_7OdX*F8|JYuzC~YCKTdQTTN<`N<1>Upercflb7>T8xsJ^Swu%!LncNTnYM!S3Ww|ghnBZn^vJO};d#{Cx0Pv`tRb+;%a~f;Cb_4P_GhOlxiusQb}tf*Udz z{Ytr8q!b#)O}GeX%#%Zvj+WLE)SN*A2zyr%zqUzsT}DPmM&7TukeVNr*<<5I!FbPe zW-Vwx!ir`_u2U(%O7fWw`;c5t-nd_?lzoPr>z``2?H=8PQW9%#Sl;06RIb=Gd&%Ule)TKi8R3xLHM=nFxVQ+rnn{fbA5ZJjxr8RJ z1{DQ3MFiZhd5INxQ5(G_i%`$pj-42U1u$QDZGZ~;j~;ZMex4&5LEn*QU-99W27~(K zBIl$4b4q96$Sbg#X(E~LU7?0&-%s)^&HP-($|4wRUW-Xa~ z))Mz@*|#U+JSZG^&!`-eup*F+r6l_qO0~E7q1?M(YiLX(-ZJJ&1=CmSUw70n*VEN- zYrv`{7jf--bnkIgu_r#{kK3^)F3f+M!JaJB3JEkAhks~M1Yr^lnfiYY?-BaH23sV- zo(yt|ij8hhh>`SUjDUWy5p2xJ3Gd`a$zOFJ686=Am%{Nl!hm3zD|52+{ zM{D}15xrZr(Q2i3Xx&=F$ZL{5l;9QsnJ{{*Lo;Pj#z$N3>c`F3S3W$a-u&S?Jz0B? ze)Fth4RK`@{hAZ-uO6tX(r%5L*WI@6GwZ&Dvq2l*;o9&%(E5E#)+C{n&%=CG4#Q{r z+C2z1X*h^vi|(FIguUpg>Stc~9;n=6X+!*GpO+>n1+a(WwX48!4?@bpd8B)ak4of7 zd8QH=+(E*u=06yZ>NvC0A+7j?UmF)PyKf`1^-xYIPjNQvfP?~0GMN)<&NdFtLT9}Gt7TPcqpdva85;-1w|D6pzxtP;TK+jUzh|xsQ=_d z7R(WPFGu=V6X?Bt5)d_(w72RoySL8@HKH893mB{{p0l?`VA-iftm#x9(oz)8PFXaA;16qV}@~^O_!{KW&tB>bV6+YptWOjv}})S{E?Ws zk=(=yU$U7-Iipi7I_u1L$^wHqIWC{PQ?OP6(5Es z_8@1XhY~|~X#sGkL4~FDtA0oEo2Xk50}9jzLq~DHD6(3iYPceWc2FwRG3mi<4MzWbhgpfC7cFaV^h&Q+-Mk3E<|1X=e*pisW zl=HXvv~8Of{tj=9S;MAP!c@AlHypL*b7`2W7tAR$n>KlBA1u`GE7*e`hc51FK5NT4 zc&8LtkyL9nLD{9H_Sipa&Y9V)oa*`1ZbW>7>t69uas}gr4ZV+x$pgjja z1#{1P-&mBn+Saf+>b75Xgu4?>WvI@4vA3H!{^_Tmu0HqNbJznP`1aeGr|?zfsQRN= zeWVL95B8$Z!2KVOu@xb)cmoYhLs zkjz5qa)iVW*15@xvns14pN(mB8mXM=giy!`N#7=#+&e`pW=;dwEM|z!U5s$ z5{sMHJI#m)alIv6@(*m5wWck3b<)}3V#+;g3-$trSfc}(_Mw*Hmrx-CYtz(tZ>r8b zu&;I!h*&jBhgp|B^kvBke06nTl_Y)jJ}Fcn=m(BNq#UG3gd83i|H9wWVM-wKl+opY zsXnYbXn7^;6Yf<)ocPx&lG$)w%l8eEIheAvrZHD5uH1CP964SlTsxvv{ejiWmi)bS>peN}JuTx-Q#BL(i4DcIi&F-J&z=Z6&)Hd$v#$ zZ6g2gtEkcG@ie;VpGZU$lyz^z2Sv9KaR+=fqd96p;+)emMfIupjFhfOH^^}q5y;Ly&GnkLmHxB18zYG#f1NoK~3bZG7$0`-cU^^`^aC`+@lBLf71zv zNW?BY3?`*U`)j>HNiM^Xf(^`NHA7slPv~pEy#M~cUw!8F z1VB?2l&@$31JK1$yz~BaVniO|7-<@B`}}DFK}PzU^n*U?p_RsuQ3k>PK%5z2^U*16 zI0MWvCzTFzt#B11mL+P|Aom40iPI9%LZ+4ZOyKda{wKAdKXe5>HK(5+6=KdJ+KX~M zAr(N-f3e~E1N!sLd7FFc{mqcKXxql9_Mas`j{%E=+)3v|%t}=D6cfGo=G5Jzdq$JF z9r^b;!<<%dkB4qb z8yVXM*u$Z2^U1X9p7MDQgA|ANi=rKU`jfa*;%3#c5XUolIW4pF&tIII)23eli*0@ps4|` z0yK{HG0*}jt{Mt!1A~Hy7U4e-0uPN25DgIg4otw_z9OK-4 zElFL$x;kSW7o$>|4!G7t?GGQ5A#dmU$Mz>Gq|!eX*MZ* z#xT#!U)H#epN2gM9J)=in|TdBoceF-yJt- zP58GN=V((9S0Rz?CXiK?8H>C<%vlxhxnB5h=c(k<$@Q>q%EzAw+$X3`E^`4{gY@D#;LWv$=6bieN8X(YvCEMGLVD} zjAwkTYJo#AtBt&zd{Vf?M$?9-#TR4Ahue$RB8Iow7CTp6*u2@8N`|p^s-1PBghS44 zhTl39Zj53l!^`NS_W!7Xdq5YEdD7d7M~3(Q^AgcaxCrbTwR$j>*g2RzWSNJ%5U8dD z^b{DHF~M%Ky`OTM@+rPu&6-+jvzjsV?jx^%0emi{RN)CF%yPXJRjm=y`zABWH8hMy zA=N9CMkI`qk0mBg431kHoiSH*@?iWMAAm_R%1Icr#2xCA!RAzb=$pP{ znbQ($;jE)JwWVTrrde9cm=cAnjXqhhV6Kf%`^roDnr+l`a&314VuU)7q+P~KM6CKv{rJ z8HY5i82&I&E$}cRP&LRpIrzzbMV!LpMBF@)#gey5_Ge1Rtc+WvS_iswLjjH35b(Ja z8aX4|EoIa`t2viT8oHKTx#G%wKv+_QT3Z{X;>Kz~{sd85RHdoJ31^&J6AtQw0T0bv z7Afw)FkTz;0n4bxR<@ccV#1VnJsrF% zM`WOO8$O-=iWT9uK;qm?G#=`nV>KtowsxXBFK|BhcT=Gm+Humsj}%&0Nl zleyeBYQreRWBpy<7xLdt@7gjCZi%}Ss0ZrbwojdR;Fxr`{;h)z7VDsV?ESzG)L=S{ zGg10m}zMXlnsenGRqKWwl zw%+ziWXJvkRpE1yyhp>#jOZ;^8Ts|NF>Yf66a2%aM>bsl{ z`$~KNPQqH+z@0ZxEJ)0MB@w?YPHPG@1IEZ#+%w7pz(b+U<|bjM-siE6 zC;&A95@75sIkxvPrNeH*8Kn)FBYMuxhm?$_#&`IltNpK*D{5)zQ@vjorteuxuHDn$ ziv;k(ow#cj@P`wK<)9`@S5Aj$dqgKF_B#&CfP!E%T|E?%@~N>L;b!y{(*!r%YS$hVCUq4)WWx5?%FqYl5B_xQ|wczkx! z5Do`)E&n(sshP+NogYJ@*HX6rsQqTyH|Ed#yU&lQO$MWS%o6Ac3HR*Aje*egE&X$K z7qC~Vq1XimvGMRNL0m!2R3CA`SK^%+jQ*q7hDOQM3{XH)%o-RL4Y`Bk1@2bJ#yk<% z2Le8QEK$Ew_^2-F^(^}e@eQ%Wf!Snr$86oM@pv>ozfbFS=fR57%7tsm0SrY0p`YyT zy`BzCcw-hn?|a@s)(p(0HJCz=x)QA2Q$4+DU&xi?>-{qaQ;p=dJtx(L-`it8s|?0& z4$edGagv{OHrgj0S}*#}mxRAoL*wqEiT8MguQ#qjKqVFD)1D5Fq8v|S4&I+4&V#)d z?E~&epA{vM$AKq`Zl1N$IIJJCmXQzP!da;>WTi+8I~d7Iou63NL7Yz%8P8ZW!Y`6{ z)^r#UsLy-GNdY_*MryLTbY`m_^%R#u_Gg@ZM&%!`XPq(Lt~3yG;fOX4$u>fI_c`Y$ zoq>f-?fCj+%^Z(MnGcsyo~y7m;hkA9n}7`)0tHs&PvF>$*g1C5a|6OJ9X>klz;Oo9y>h?1>jNpp_dU8 zqfXjUPN9rJPSZb^^h6v6=CKupidggPTNHX?@#y;}RlRtK1$c<#TrYn9dwO#iX-9<(mZzv7x%Re=!pipenj07}u^7G!W;w`4D z_62=vjW6I+3w7ol&QXW6;_6*OzNSKRA?+~qT~+anxr%)2xiJN6G08eMU+=lBdv19p z5?zl0dUQ>C*u&k(yQm&IwTPl!!NnY`41E*-n^oDqEc}Z|f6J(UO-6dxW;{(#)?at~ zS+AF81L5u*wJSl2z&EhQecNqn92v^a=gaDfn?KBMxX~j;AIjQ%hkHII0U`_wU(pve@1d3LO{LW40 zpc*M-T|Tou8jl(5kp-vO0Yx+#O}Ro^H?MVfCnr43&ommJY5u4f zo^j+1p&ZP}2r}O0E z-e=QXgUfrXZqDp=gDMp4OpVh_F!?H;tr7Z}c(%`^xy4N@q3GOQjQ%HThuf`b zT@U#|8Y_Ac_pX8aqwdFwg9?=ekJ17}2(hlDA5e)7gvyptY2AUB#x2v6LDoU{Wt8lO z{{B>y|3p7rPz{_}Ot!GHcW+7`e&nyYSRo4N-k77SF5iuijl=pGWVW1?w=Q<`$yLB>&_65xw)!#{ZZE|ISoiCtUBw6gL`(g=!{`ZzAC0 zC)<;WIlcu}ZaCj&E^M`W7qpolRQRrQl&|$>95K_lG1~iGqJ7`?cw}{DV1M<9SLwXn zd0;0yF>jaVqd?xM@1cN6ADrWc;640p8-5wp0C894GP2pEpFJVZGBMm8sXGy~<{k>13}Igh_IHQn;G6sU_1LCR*{e9SvAV z|4UtGPTMi2aqk=(wr)jXWaqZ^eUAGL&=gj{kJHI)eRZLAGlU=dGjIW ziP7LpuoReoZp@ywwRLu@rT1((uxabocxuZRM4g(VaJBFqYM1@Uqc$^t9h@kT@}Xix z7G9Mr z-kl%Uhaw?em7gU45+3p_tnN$;kC5iRoB!^K*tN9V6KzrE`;+!syXER$fHsuBFt_iW zG)1lFRr29kdrlt=`k$z)Z5D&HX-@QBNm(a0uEl-(5bla`-_^M1BRDTXD5;Lp{C4;R z#Lt6h2T$qneSyFCFcbBoVum_gv}^+-AydfWH31|A@(!&NW*;*P)kGmUcZz#gNCm*fxCHrhI)7<{!_kQT7n_GK? z2OF1R-X`j*m)7qQ-aIX9!%!4+F1wd}Wm0KjP4Wo~-+Mkkf6Hnpw6=8H z0;(}ImR|#+eppU-(?AXiZaJ83iLOg^HP?i7m;{3lG9M$s2h`+Zp#X zm=9+wC&U^bnNI{4<|f>QjV^Z2#u8t*c>@M!g`DiG8vI4RZVqqvpDeupQ~qtja~K7j zwweQ+rS}r=?}pua9K&rLT?k5KHElQ+VJ^;jXPgRC-J~VkqPFjKm4Kaui)}x*JAI^ZK!uGF}AC;TG`%fIqTf& zws6$5wiB8XQq-uZUcVgN)U5clX(S^0W}4Crc-ezShNGVN&^-@v{-MF|ld&X{)%^<8 z>%#eq*Jrn#mvT;T+#E~$7B?;i+Ebc6Z-^trh^}{I+*x&}JO#BYG|Aii8>h!pEpJ8V z^YKjnH3{pD+C2%3T1X{#9&<{qbz)>Re^P;Oj%H1DO}NmFo%GmRCvU6UYz=!>QRb?y zqO&CQnpVHIrH%BSi_P7&6pyYfFEH6VC98)0{?1{l%Lw+&rR0rd`}VUo-p9J2838 z+5C5Zrcpoi5U_w_aXTMh5gxO2ap7*cOrlWSF6cvnY9QbrofsQoot($5s%s+gFmpzg zALH_#dQTl#-n=EY=f3eq^J9CP+;q>##1#YOhL$gP&!Du8^?^btUJirAe=IYjXnAbLSfk>QLif#|YyLWAIdPa?Z zY&L&hF@p53%sE=Uv%s|WXxuhM*ylT@n=Pp8j)H5wB2uV2H6EkXW=U(vDIIIr)G-Hp zKS}wQHm?MIk+n65pHcgM4U!PuIs?=XgE#?e>-LG3ZrFeTzQDjZ40X*ztd$mM5TH>2 ziJ(l)6rsi=lG=wBgPxZm*KBwvBwI4EX2PTV(nHz_y~-7-^nQ_ZHXTPoJ^#q|MOWO->pJAXPvttLm+%8^CN%J3)9 zYH(V7bjN(%o*lJK*h;bJx!XF030p+h(T93J%gx-imJU$UiCbca?#xNRWwgkjyg&n1 z2kP4WvmzZ5EQSYyhO7w8{5qzO3-seM3zTAQeU_()v<=zkm^cOaWUyI;`ApneETm0I zIUh{~oexiWM)@)DdEC8^q)=liFO*ld8hwc^nkab)|H5LmWd&031Hhtj0aj(ud zEg^mHwe-}rEAGvAAht1s^S=){PY5_x2^OUA5h?MbxvE<+!syIKqb9hzZCjKN9e?5;FL|(cXVFoIIzdhA4@|~g$@!Bjj(R0$ zEEx;cQF5-plIOQvcGjL`zWJdWKe4;K-Npc?CQ6gb)G#?A9PxizM4$6bAQA8WzT=A7 z+V({6r+I$oaeITg@V;Yr&^XNn+i^UwprqKXItLR9C`S~fJ$&w|wLDVYMIj$S0Yz2; zW%murz*Eo=lbRceC*= zyuJ5W#_aL%mShN6r>C0;Ibs3t{&x19(UPT7t;EJQ?%aM#{rGHVIoR-Rsgy5VXnqBZ z)XoSWuFLg0wdB#}^abVeHs&g{93TTkSGn+P+f(IRX0OZDd$C!%eI*rK-n1URA%h%a z6*-0kabFdvIF0%cElY=y!T{=`M;rkk)*|`{8cx%SSKeBos2|pMc-?)tM?%Wv`+_vV zHC$=F!f+>Rovii@VzN8e=98^CyUTPNv-lv98+2+;qk_cgltjb2dSCRJ+?>bE2U_SQ zE|d#Yr6!kSZfrum%hv_M(Cr1~2B(Q!v+26A?x~4RU@=p>dMiX9uTvXTkS%6Cyv7D3 z-U`rDZN#v-HXH2yuHu+q+2qUm7MGT&KTKeD^D1ni7Kkxr5-!sre zgg~tZ@V!N<*Pyq*_h``U_3*4e)SYOV63Mu!65hzP8x?bjWlQEtBU=kh21>!n-n}fR zGx?kbGZ!$Bk8HbVV)EF)xbwjD%ttp0t$@kJrdcvOL9=!BgcaF((LJ|uDUh1E6@DN9 zj?Qkxg}P#CDv3|N$szSXCsmB^s1V?p7-25ggxNFH@};X19z>LI__he5^D zfy+M7k|dH~QwW>S-!i{hn6IR^B`lQeui#vJ{SdE{En`cFdQ2@7WErl_75JJDrB#pD z!Y`2Hz!X85z)@W7#1>a9*e8YX{V5~RCw&W8ass0B1X5QG#qz^sp%kS9d&MyzkwWT6Vq&w+>ebI zT%%#O0Ba!TM3N0efuMeW^Tp&Ow7h!dyD_m^g^DH~l4&2c)6X?lVHy0P);%L{A1yPr&$3T8HMO#bZV zkBn>)exWleCDCG5LH-EPVSv=p>(N00;BQIy{PHr8I=XHbYTzsAQ(Z4c2%t03x{^%1 z0<=N3Kch^P(j0au9?pxzrGeCTB%5!17c`^K8ay%a|h)HAX1Z z!C}xygq!bjH(j2(>k#+uAj{}2WoDtGN8G6?y2t-E#YT-?$e5UVFD0vYZ;$M`0dXen zoxW0XP@JWgLY{@Hq8L#kF&66rVpM&2gJ3m}IEbV6p^v>BtOcgW%I0ZPZDvy6p3yv1vhQokrd42#mw&Q zn*y!%-+q7R9jN)(infEDcRfnJlhp#TRHSSZuQqLAeFMkT(t9Bt*s#1Y=#FgN3L{A4 zL=WYlVxCz9D8L3(L5_5S(KZW=wt&^ANG(<-8biGHBcOlZ3k-}T9=DiIQloiz*+a-h zLa4iJ5s6#n&?}AhfXm%xwG8X>XwdhqlVgnOGoiipVsNUFR8Cud%?p~6yJJh~1AdM< zIU1kocKnk!%xAY>SMa9&PF06|-aYAaZ?EOw-}|ax;}1uTygnKYZl5$pBLPj5YF{%8 z!c*GuY-NGDm){hiS}+iMBwYkOL}_%Hok`8q*@=u}V)L=1_9^RJG2CWLwDGmK*j78e z5nHlr=zsy>A8R$ZnrGbGdT%k*Am8soxXz|*%WV#O?@-b{zp@(S!&_Dt$?25?sT9@h z;|{$Cv5^iLC++H>+>$=V(5ILYI`zQ@Pf9DagV@m~DkO-e0(%$gTUW6FU7_BYVp(E$ zB%%(iH)h=57fF*#vVaPOQHYv1DqSVKY=7`=Z@kHZ#O*B(P z7{5D~TK-!!yJN$crLM0`Z%$WjZ~h{j2VrU}IdD=P!!V?9n+U2~hFCJe zoP6Vr%q{o5+&Hh1nb6CiEJ&8r3I!A%lNNM`&B`NtR$EecMW<%P%N$(ofmrDm(G_gc!oym{Flk8N9BATNGev=ISd4h8rUC7%73bxTVdkfiqaLyRroNV{s5n9}X_GLrylksp{aWV!6L`J@I^ zp<^JxXl1B_G7)1bTDWX`c;kDvRTNts7o8a0alT>B-cIF0&3s7Pk#o9NT;WB#OASKH zQr9=@uWCL1AahPR)HD{94v#ONKkc+r;3sFAT6CMEdjV6YQNxTDO6J5Vr|jhqd}@00 z`-<(zSy$e>?Sk)aYIHw)a(r99?pxh+T-L#F3Vsdwsj4M2n#{eI)1&un<-^M>Vt(pE zOqN6bV8PrzYI|r8)H+b0VM!?sy6;m&v0vI+Dx&Uhcd7)xCcy{u^lh_uFT6x)lYj30 zAcfE(90dYg z2u%KE1_dpXW|9^?GTg%QreJ9HZe~wLNt<B{?$$)2e{d$bCKR+0=$|X|_`V)9HIp1EfSSsbbzr|){4n8Pcop#MGZ;lxD zJs`B&s^+fqW)x=i%)5`7W{gcoTvOGe`c;a}PEAK*-uaE99~lAH=0V9Zm`_D_r2v+S zsO&B-{@>N(-vWG7{8)Uv!yS0#y^MSpa@=>(nkvIQ{`jwZ4`ysNKC1WoIJ|H4bMb}M zjx`?f>+6O{B;5UX#d)t<<3Z*Bk4@q7HuFTu*Kt;972&x_XI49bD#CBd+~VrCcsjXf zI{-oI*L~o_(HUm+)i=Shp_XgFry10%5DwA9i9ZFg39J8PsR}tlfdBD;GCThd1BGw4 z=;GWtjbY?N^Owy&E(j?2qr$?Fb-jDikebd~$83Il1k=1wc+!%L zcom8f>1Ksmu5|id5Om}f;r-;x7dG-nguO*mz7ZEov977Vbq5R&fA8faH;=$JGILvh zZFKg{+|e~}@daZcN5w2}3v4N;R&?USh0)K$7)~OYYfSI+&q1_j%v0HUb@7)!f9*Ab z$~XDPKYsd1>;t{mv$iG|^NgcmaE5o$$aP0MHs@+<`A{^F>t50jZY4W{Q>~IYSG{X* z{rqZ+s>Bx^&FcB}y`N&tMNijWw2l9@V-M=K@zr2p)9NPN!Nj4vBqxga zCaw7lXRwMV&iB@eis(*;2MbT?@Sk6uPQJOTcSpw8;xd7T8B8u13x8yyHff+`m8KEY z115(`WPJFs*ku0Pvo)DV2c_?)x@sdV#W>`Ao=kBo+jj&b!OdIOn8zM&e53g}Y`hHh zpUWl7%s((k(mkj)ppOX_g65SGk$Yw>iwv40={ExCLE-A?mktFN5SwjEskY4Pta3}+ zY8JXoxA#EW+w$ZBRkHAvd9p0b^J2Q-4|l|LA)ssWo)E1N^Hxx2{=htP-TLOio1QGzW& z=gaJdI{)!d^g0dpdRQd_UI>b#sNqg;hO0&!YMRnYWbEj7ozS`z`Cbcjc7&)MrOnu~r8xRCZ2-;c^ z3f+A3*Lt^R*t#p?u0o1t%ENi*Hnc1ezgyk5cA4GF%Qw%>t!FmAXgZOcVTy)a5CED2 z3qT?t& zp$h+-zk|5hTN{Iz=Y;cTo)R0W{?z+<#?x|VeKpqrR0xk1W>J3T)nhs@;)ES{-udTS zZ~e3Q_x5m|`ONV^8LUOq@x9}j9}V*5zfv-XNz;b!dpznvxiI8Ixo{h^2KIa7kAM85 zc&2IHa2N7LS|z6(HoA&_bPKvPgl_3LO?bAUNgPJ6!)$PH7fFalvb#!3m#lZlc-H>8 z6G#FP8>h}yj_Ey~q#%l~Mt&iDYd!f@@9TbwjsYhbn;oatQIBApsnD7%xu>iNX_Mn} zQg;bYv3jbeRhT;Ojv;nrbSKF*!Ug0IWxtt3Z0K((&{V|a_a86QJDNftR}||>qE^yC z)Vfiu8z2^=VVcNPVQ9lvrC1(F+zzsxGLZ10=lcIHGDgc)fNnx2!LDRR%nsgUjG>-BaeOpdw~rb#zOl3G8ww(ZHr11QQXmFi!03UI zVILZ-uZMjANE8gr-2UuKGhO*#6NwF!!{ph(2n_S#8WexkrLcZY4rdDy26GVYnirFN58{)w) ze_q&>8YN%)d~=Tmz2<6L*Ri{KZY4BnExV@PXtNo8)0FJJT%LYlOCq&n>n0dGL}T=I zo6vJYXFwl`BaeRFhgr)1yOS1Qarw_n!nGTJLFAaXOH93QWIP=p#x-|9JbAuwcc&Oc z>KpLOtCXimgpUdBG%!!HXodo8g+0)Ccf~gy$OOh;oD{E7mksp}rQHjgHU*=zcR;7~ zslolZ7Imt1P!mrBZKh}>bf`p~91(XUbPPscoCw_#1JJQW!caNr#~4SQwYQo~dZG3M zLsJ;tmQ7ZR@-apknyMwLO&7+=9mkklYBl;QU(R~k;EvW|@_#!+{-gIZp6kRsk?!n_ zF@mal%QwM9h2IiCqtKbu2Hs`VLZ$VI+JW7Rj=E{Xac7oQvT&d}Uk%(b5IL5?;ACNM0S;bp(R^0X8r(DIDLu+;G$=2OhmMaVHF+(aI z|Imp^$S<8{7amfxZmlU~CUbSUnKjB9R=)RY#x=LJIUHZS86;t9S6rx%RFEf7UP=`F zb8(LJu*Gxe_m0dS?+a;D#x~slzpaxdIjg75pkS~9qNFFumzjM~s*RZ}oRmixtb#ca zPMHUh`6?(4f@;X6CO6k8WTdYJCde;NJ8iG0MxGL?jH}AGJtbeOcWu7LYPBepZGiR( zqcfQm%oT4wBUuw30nd;%%f`Sn{AHe7+`J{4Sh|x@3IEl$6@9W?Ms>#yI$8} zG6iL|9EQE#{*{=;iN8Z1D%MBKL1Kdc?-?Cpf^%ke?SjzQ2sxW(bj+0uMx4#gO+d6fwb@AH5*C08P<}q zKJ+D1!D7v`UuX!A*b`{)TB$RS6qSLXSDuHC5dVj&_$X`oaPO6jduHRNNO1iv9Zu?;LH?Mh!PhyY&v+`DzU*f<>}0>mVXs%snJ`sStqpyp+7ct zwta{2m5Zi+I3;}7apLvi3H$zS4GYd{0Njx@Y^YkSf5za|MXr))`6=Aj7k9#n|J~a6 zBWmUk!pCR66IdVq4QgvD7ssii&?4nxoPRRl3{AEt@@w&;A)ZQLgxbf+Hu|yVD>6@A zX+PM@GQTS7d5=q#M{f@Qbl2iFHMN1>Zwp&)+nNZhZQsV6|7PP&JO??j*PCHGmExVU zAr{?=Nc6xU`asNa_*M-}CGFm>?HEbx=KhiJm7oITw> zJ%Zs`GA23QD7%HR4F=9;l+0j8we8G6KjR2bi10*E-}Fr~9~uv==gM4Hm?&kpB$M$~ zvZvywrHl#BF(13~eO;N!WRxkDoJ(OcIDGklG3nEJc~0H6ZA_327>H&8zxvI}spns} zt9Of=-@LZ$F$Gt)Y$isU8=5p-OSt!^GzXUy3eSC%-e=ke_A$wE;7!QIst0OAhb{Av zS167z=-*e7G9!)9=%|n8i2xQ#Vi@Y#kMv;(0&*|}-m-zn}z2=iLPda)NoTJfcyS(+?Ydflb4h?b{ zE)0l}kuu9t1$sW2K(=5kt+8a(Mr;>0gy&rE-Ux25#VqR>Q@v;Vg`p%0B;p=9Q8V2J z|3z^sS~Fco5ax;ru_!-+nZ*DE-eLif+#I%YZ|}8{F!~*s5#ckX49Q&1lI{vt$Avqe zBzYkAfW zkveJPD~)*@ohoOW$Cu>v5?U)f%93U5pJQx9+tH&cnwz|JHSSwo17bt{(;bqyh+`Q= z1TIVM+7PEaD##G+^e}1%0s^4Aj#?H?{3w7+&3UO`Gk%SWjPV>gHoO33Pnc$cy*s?- zWP}@WAZQQnYvKN-+Yv@wX_aaL)tQf+0uJ8WglPKo{jIlg}Gn&n#}?6uM30+y}7VMR*`A#VKl+^ zj(<{NiFn8wV#6|Uf<3TnN?7d)QDFm>Pqb^m3ZQWvIVg-<-+qJSC?4qu9xK)bvXiJA z1zks2jsEC#7?`85x_+=bX+GmG2SUkrz5l&GA0Zc;=Utxe;{fLILlr-R~RcIN#(#Ei@Z18pDwgb5@Jb)NEcB zRfZhmn6{;`d;8Xu(XOzL80QpHrQ2yt`)(>p`1EKwtxM*(iQBi-eU`iz+9Oo10>SB9F1(Nh2%Ck0JQEUN4m*d6W*kSNZKa0LYr1MjpW8g_p z(SVBCQIQX&Rbuux2$g;H%C{3HM2y2GYP(5@D(wM-pRZzY)WrU*wF05%1mCIUO{S2~ zB@e-Bs^n6eFU;1m4V79ARf=B{G^~@`*=b8{EP4GdOUrGq2F;~IEeFs7 z!sI?VYAfUtT3xn;SOWX%M~}*8h*|m`#EIsO#5OXq97uDVf93%bM*|(^a*zWQrQ$RGuo;7ZaR9XGN;MadrAK1* zsj;$-D9r5F98MK+`i~QC!3d3Zp^j+&2`7_AN)3SQ{nb=ggl^Nd!ll;y)lrH-5s zTz}jA{6&Rm_TcR7Cy)7_@Eggf4g&0owuV)zOufG+trIJI3*Hm&V;;o#W!fuq4Qz6s zf8>QnEx?;%HWF4&9V(&yBh-_MxPvI{aD+TIc>WS*>B{7l!eto_*sZ^+CfdgydzC4? z_W0w(+`BLt7z<%a^oB`8JQ2~gM3cJXywbVOQAAP{?{u}FYroWLy@XHX@g`T{>dqQ! zQ6{AjRq%C$U(OwsPh=gLq%Y&2KFZaNl z5=~DWrur`sg}eL>q*M?M~v9ph#@GpvGwYE6|sEY*zkQKbMN+ti^Aaot4a{cqzUjm`C$VY}>i?%-qW_-*XRIS*6S;Kly6!Vg|N-Gz8|&#|fCfpVaJitwcH6*5)3toe1?KmAMsA%5xl$pwQlV4H$?gAP z5Uw_yMgEA%9~gKdV3>fMO?o+x5`(+<37;iP-?;ila1j_Gg<_Rg8+VQyy@6TIDe~jT z@a#kSHvKwGKy=ba%|>-JKkBxR787dW^>BO3l%07>c+Id7t}FcUjHNP-VG>SLM8mA! z*m$oY9P~Vr#S~_rHf8I+-n52vO@-0K_WmVS_rhFob;~lIwiorxoyg}aIOEf(Ra0F5 zAf7zc=Aeu1WBCKNc%L&~@s*??L!odl4_U-`fYypod`2|f>Q5fTO^%3chr?2YL;0s+ z$}dNUu$k7nsoKZRzot%@4y5KfHSR~|(%AY$Wd4Nk6R&H{BM<*vsg__iYF4h3ZiB89 zMxcFAf=??yl(Gt95uPmVjxu(aAlwWeStH8zHC zq>YzmcGZZD!zi_h(4=?NJ@MTqJW&Ulz{z%*0TP=U8~Z4(BU>09m9xkra(e$iXZN(p z=g@1WOZV@X6;m;vbN_&Ad0inV0? zAaCslA>w^wE{jR{Y{TpIweo)9gq*iw&3J3fHI>=Z!b-O~6812xGsbGA-}!;HZM>>< zW9VS-PA_KIxnq+H)y({;Uv|}Zjj9nRgUcl?^xx9H!5AuJTh|>osEvtS`aaX=aFc~aau{}?o==>$IfxQ*9jK-4yF##~ zz`5#on`2Ap?+!hnq%xwhnVh3>5A>THI%WhdO$_rB5ib*5XUESYJMWRIq+6_0Mx9ri zx^!Q8>p_lZ6*5sR zyV5QB>lv@?6aT>|wn&+Wdmk^jE3TNq$Gfke)cPTivc*gBKq*8r^*{A^nn8;>9`bB# zdnY0l9mfZmVuqjOP-OXX;vMffFWu&scO08v`{L$mV(%FjuWx+|lnQIv{;h{{sZnb| z%lmz2_x2M3?bYSY&whYWV77^^T*+V9@%l9_so7>h1AP9@6B5ad3yb2NxCZg1deF6T z3ihP0<3XhZNd?0A6m^7UrJ^4JYoDb|6=ofu&87+5Q7Op~ln?{0qi#;$aNIA| zY885|MaeLW5WV9#cTMX+o5^{=)y*3h!`lO_i6NgSflHJI)R4N#hIIxp9za^u{hxS( z=zBMpA*zuN)ZHjUgU#SY)+W~LXx2tz!r#>m~v>o9q2 zF_h$I$E${^?Dsmb?kiQ5oz;=HIoA7I!aBZjOCq@EM%*M?58DrWD#MMU_2pS$^oVwd zk7lm@vh1L!H@H{g_m6A?%q)I@{DZpm76k4na^1gd*bDLK46P9PDY1v=1N=03XVmD@ z&I!-Yv79v=THY|@;;Po*&ScHEwAeLuAwB+I{+yqyc=HF&eZ*J@@JYY$0>M0%jIZHM zYSHhN@Pg~k`PVOYQHP2cYiuasC+i#~4>u~SOQ8*NuQy9d=&x$2LfJAGTnd+V1@e}~ zy=PQ|)`ZPgjn}pYVq+v9U5EtM3s?M@xp6eqc9qn;-~XoxN5b4Sr+ZJQ+_RguVzTeb z;ta);soq6aViJ2HB2WRN*dAs60InZC|9+ns1J80Hi3mUG zuQ9OIR+GZ%@oHt5`eBdioO!-EGINv-x_ zG_3@(NYmfTC3zdwb0W}T=QLpa5sRI<4fUE$y>t9o%<%pe*)^162=xAu6dM4-)3=h9 z2XGRMsO@gW3~5@|ZQ?}q8L5buJg7V zPgxh(AQV?;h3{$XP+FE5+*U){>@@id4#S~osol+~%3PxySKsjk?+j03C?6v=r9v9u zVsO004=%w!`N4EWud|&PLc~xcS!se}! z+6P?+JYewq(FyZ>zj)tb1HIowxJ}!)2YtcKYg@>nl^{E2<>G+UH>pKhXVIVec(i>*MPaCsgLAvuglwZMMSUqbKS%VEDaJa z+He?fOC-w>y;I4JGtqE~XdW5N2yiXHJk&8 zbFFF!04FbU5<`cEm~wsob@RFBQg+Xc z=q?%|?|8?py<2mRh9~MDV@}Li3Z(*DFlLLz-c>wgE}Vh+bMp4lO2J%+@9(ut5oB%^ z_Y8UMrklRqe5!r6scbYC*t5>XXnPE)J-7W-ll-ve>)7hfPA@m6FVtH9kFD7t-iNAoN}oktSV)&{4`2+pl=-Uet@ASMF7@pdxZX zks^X9%6$CK`DSJl@J_P3VN1xIIp@6Z`@GNdy!Nc6T27P4Yle`ft&8+tY^oyJioKNI zolaY3mUbp%i;s}EsoSp~dbt?-AvU3}Jq@Rd{#<$_WAqU9qXjLW2Z=5nRw4}ZIqDlw zVB=O1V(U0YcjmAUvHOtf41V$h`%feawBuq{rgEw(M4{EoC7{5|V5bf{8`%ai z8B2(?m?9^uiDfGO*Kw`g;X=QCu}Wq_tYP&Z!;m?JCK`5&;cKeahct2(<~53> zixTF~9zmGp4K_x{bkP`yU7#?AnA_idi`>P+elD`sgtk#AYuA`%B&jc%%tiip@9G4E zw3j6(D#G*V&Zt?}YvMqlrLa*p+zHw6-b4NFwujhS*-{~GE@8n0*mFi7$E zaHlP0)+^-bzIL{C$e!d0+4ADyWve4$;eX9P5}YE(!%GeZqA$Ho19B$Vl5?=3YG}i~ zzlSW-8@DAa%a35q9RjXP1WprW(e?G_{dOT*Zm3N9BZ~Uc%E2C`ryP+88OJaVc};0b zu0RYL#^Vn_ZYx+Sa}AMbaZy18vRbTjSuZg<^zsg*<<=b=lBF$flbL*jh{5QRGDQDq z-Cs7fjCKC+9b?4WGRGcEXgwacCWcwIZqG!}5t?4tG=xI|UEMKBcJnWBL7T>BWCJFS zt(2f(j+x2$^rf}N9)DXs)=r+Yq4lb#W_MIQueP?w3kR$I^!bcGzb)xYZJLEso!^bo z&g1V)*g|aAkN_phF|%P)!oTL9A@4Mx8{!oh7sY<&c~oNgzCsPiI2>t( zYGvhwk^rN>;h&T6$W~|EWmh~{uu|F}RSb4^F>8959v6*Tf`f;Tsrwt8e@>d)9duIQK|2c_dcDB6Nzq1+ne3RIE zH&-C$rOa`UZO-E```qpgW05I;ll4KCvY*m&$=%oT=lOi(vTNJ7VmfPERte^eUfqN3 zpJhT_SDu^UM~xXxOQuJ^_=VW?gIg1c_46Bu^(8zF+z2V^je%U)Ab6!w$F3@J;y&si zJOSJUNPj3RcMzldQ~p5c8OCZHa$$!G9M;XT%~xc7AKeqHZkjCHMh*7X`17NKXE z`WF@leH9R9r2~L_Q0*eW6P~6BPk9(L=-#3OUa3>)@Tm{)vwsvEEmz*tV9rmE?sTe6 zu&kcAPt1RlJ*K{E{e(B2*d7O}AroDkyF=+oRujiPvk%jAG^JwOn{on1fw-)2);Xu9 zd(R0<2gzAG~CmxY;0So`Nj)Fz(q%Fz60&EoM zzIWiY528L;gyx7cm+2j~Wz|8N9S^6;{9mJFhP$}W)EmfRhnLmB@BzJFP>ZNJQvVCX zU_cXT1eL+D5WXusjLukVW>xLEY(6^bX~+1@hLeg{JUwH!ZdOb%v8dRNJB~~`T3Nf6y2xx* zZo|eHJ#%9CYupG8x^$HXINu_26_hIkt0jyX2HApM{=y&#x?rd_hnvp;I~KZL{b^s+ zZnST-|H1B4d8Jc4JekbjXXaTiXs)i910E1kCe&%vJi*)v#eeobmS7z=yEfu0J}DOK z^p=X%VD#xwnKLuCJ=?blboz}OxA8yp8{$tHK3ujGq$;;oomDE3RH1i$!_Ic?T)G6fMYj6j!YH9sAij{da0 zi!B;VdHv4zmlKnhbq#RQB^@z~%j)e!^19RA2X3WnMtSKMpuVsP75jed({ol`j8&sM z3iCASFoyoV62W|yy1-F)L5hbWsS^~~{o$G`yH~(b`dTrl0 z`OBxZQKvgd{zqq&dobwXQpMsK{+ikqDF)SD@sE5D7?6puqOcQIbE0%be$Xg$YNQ(7 zjb)#pc<(ve3U@eewgp`lRa>3OImdm@5|=mECuW0YHloud4TasYLY+L}zHptatO(7zxC3X!^>b%RoaT92idB{Ii8MzFGVhmGHrk0^0y$Pgj95!RiS zch8*`IB@VoX|-?Lo}B@5&ovM9ZqH)GnoF5bfYitA%32EfjG>}Up~Sn>gAndfIao-# zL#gudi3XP`HXdzh9Zs*Y5iF5EKK0a-P4YuVtTL#Za#kh1yzz9Cd^e2-phKROI(@!g zwq`0fI-aP#SPYG;VKWf<;rfOyL81xL)fxH2Hj8fkUgXJ69}0NQqGz4LPzW90)#NH z@)u7(12xYGd5vEJFDU5@jl*KF!<-3)4$?lG@fw?5Nji+(;n*~qD6O~IIdTPK`6>)X zba|JOh*U&u>3zxvdkGJi3S(QQ5Nsf;^Nx}qU3%$PefkU?80`D1vsQbnY4KP~7FX|( z#-!A^Z7iLqLbSkPGjpz*p_Yi9Jke_L?AW8i89<2z7F5hbsGW! zfh;J8k0gBHMJjO4`aN`t3M>ngFovBzddE=>SpQl>0^Ijm=;JXokD^h8Vh2Z7^aIuJ z0DbAJfrLse5@oGchr#EoKKgs3UtjRBuAtH^y=&&7iPx!iRR|x--pztu%+qvujcB*i zxG@WljWD7x*r(^+g~uN;oclrMD^)dTFeoaf@I71knx~?akdax+o3!a626~2RZmq4> z(rQ3ATkDoUKgfo}Lcc>TZNT?`r;fax(ACQrWaRu7M?NfJy@P5c_r8nG;i)_`726AF};t$IS@un2%SyAbCITG1j#aPaoX!Ma5Pt@zeKyT_5BMi z!?{1@Kj!?<cM1`NCo!~9+-qUqHp?8(8$CrIq&m!Bc;{rbfhiMe-c zP7PtMI_8;x1;nh+t_g%fyV_hL?2)$>zDR;O{RTXKb1fbV%?nzmkZ|8QdQ?=Ms^aPrA@;@P4^;7<9iMO}YtMLW=YFlt-J?x25y?6C9%<55< zl`}{t%sCeTpB?*;*$hSZ!uDgftUj;9x!H!%e_vf@Hk+kY83yYyH|D)1nB8W3Pv7f| z$*4crEF*_!x$}y~nw@n+({PomLEJ4BV&n*|*8i5WOs?M?w=O#7Dlp-L*O^!UB1h{o@8V>uB61K^45M(!*}9B{)^kor5oNp!eG z!^(7sDG3o`1#H5$9=a{U2E;*3luQ1U5}U57X;Rg$kNg)QGgKYNOL3~h0kuN|J=4N; zaMsx>G5bn}R62#0!}iN^nslY@^0`Nw`E$#@nl3MgT%o77#>u4^Wmo0KHl5h9Wj0-r z8mnBo;2G;Stc7ixwiZbJCGtpHNnfCnL~kF>N0>9KdtP0SQ?awk@No)Z$m5%bk#z09^5UiMfK8O7%>i>s8g76L&cnE`t zL>Yb_0v4YxGrHc{Wt3|52)U{EowUN?!ZE{Vbkd!Bf#S&%F-?r+AkE;cG8z8^*(_10 zRif@{8~LPS3qO8^I>Lq(4u?fz+OObW&D^gE8iLLQ$8Hz%zxkFMxa1}l%$5_EH1J(k6fD#HrkgN}*%XQcdJ)ZF%pPYkIlHov_Qqv< z`3oIeL;-vT{*JNfsWq8kcn9_PmBORuCg|5+ z2Q!WO^YyWI%A7IL13UP2q)XMW*AX%LTW*C?0hno!><-hi;UbcLvMXZV;WuIQ+6?(J ze>b^*eeaP3=z&RJfid%YrMC#DyhGT2sQ1_qGab2>GU%AZ1*PfIWcmEknv%Ed&-%-}^{Q*W|J~=Rx>UNDkdHIL zw09|1FowAF4oE{RI`Z_SpjjP5it%QAV6A@pbN&gv(&a%1g4PIT+;JN*BZ|ZAwr|n)iLNRy3JX zVUnm+ti))G2pGz8<27& z2MX@sQP|M%J{*4hm&Bj0_TU%klHd1U$~oGOoTb5>kv67c0R=3Kd)I^U>Gc@{;qLli z?)YGyO_%FmoDdSV4&aj2lmt0^JBGQacM%gSc}M+e$5=1eP=#VqZ7kg+zZzHQVSm;& z`+DD;VjIb#yD4Ag_#K&vfu2{V@p|D@z4ps|OZ3mKlzJ*d~Tz*kvRY*D;U)TM<^*TypvL>zqp4`E3N;X_btML{NTxmUiY z|Gcplc;SwEw!*zm%#6j|W{VD6QQa{HjQYrRU1Q3tw%bh7jwWf;NBM_ywxT=ct^9At zly}$*nhqP&>tf#|>bIHFJH*sGEdZ*A!#_IK@=OOQRO@GM=ydp763M;M_=%-Na&^c% z6-=kMV>V@}Y)u3EC7qDQO*Ys=LJ_i%(A7Ppj^|nBEC=_Rcc4(zcd;c*I4m{mDl$JFp_lG7w z6ayE^e`cT2qVc<}A`8YSS*3EhnE&rX!u0J^;qo)`gQqb2<&L}~?@X~BwQc7eqoXG$ zTf48A`cySyEEH3kq#>Eh@A24HJ2`j*1a?&^a|BjpUGkxCIP)qgoX5!+sHp_PUZeEk z#urREj?0?Az#B_O{4O=FY7nmI>DqH#``wp2V)V36+nRo0E*yQVqAyk}#+9s1rM=s?B|ZbQ**w?*Onap&~mSzevA|Hh?c=>?lK!GI zi%BtPGCT`ywuL=NSQ0;>q9Z zVw#IXMfaiSpSL8M0nZvvDdS%w`ds(k+$oJjbZ%xQ%s=~w`|cBX&sSG+2x18Mj7DbsP2Udq3;tcK)Tj8t}9|mtFSZ-h){?3^qZ|I;h`pU8A+rul5GR`c!N+ zXZGk?a;L@;V3tfJPy!@k%we&xCtsr}7`9zVRIqAtZm-p@=zYg7blRMuHZ|J``Jl5J z+eVVcn$c7>y-r>c%S8=^-l{8V49cfkZ#0=|8NsXo-P-h&ctoQqCiUTvPhGaHjzqT> zoym>1*rCyM#9(1{N~Jq9njBU5oPS8{*s{@=$|#|9{6R}aO-!1wXAwla!aNqNG4=ZX zsOS*(qg<%my@+)E%1kIBj@n86h*k7sEG@mu-@gN~^t8E6F=Q+v;Q2wu7{)gelDF4Q z5y-TiJ~y}!e&A%QC&pY;p_<0w3NYI*e`@jvZ@&fX9Eja(Pfng{tWVB|6P^hSJ)Jg` zM`vKPuy(R)Jn^#2m=m(WQCmji^LbyY$T>47FT;=Pui@eyJKTZs*^Ok!;ls5Usqd~+ zl9e&Zn(DjxpW6JBosyxb&z2hw{uN?yRErryOP6ho2Wp3fxaNaKH^{sw^i=!KY_zY} zMa)MAGrVv5U7UdnVLzl%-q-u~3=LpZ0YZNvntZSK4{Fktf|#*kc3Zm+qcf^ksU?KJ zYm&SQh!MNMi+<~9U!e$xkTKZB{fOk8v{@-MEPqR+{5$8AJi;Kh-UGp|3bKJoF{Tdb zEe>VnDe|7S3SSnTvTF46Ox!U&KkpAt+{S$OmM>0}rt$i6@Kqc~%s%2!BUC>EvWocJ zhY*Lam~cLzM8vDxPv?i+dH>4EI%-R-pwUuTE#ZG+^k}PQZ^5Qle|pMP=}ZUHYcI~+ zE}2UG@2gkHLbjSGu5n&hn5lgDxBP<{R}&QI1`ud!UJa94Fc^g~bTAQtyW+1N(S41? z|J_~ENTq8rn$2cBgTIl)yrb=kxfVNbeMJ4%hibY`Ae@>oaJSgb|Ml@?rh-Nw2A8}J zGh?b(H~V`pL$3}OzVOUl%-R#1z@D)l25?*#nYRTbq9|l`J85qBf9z=bl!aF}=mkAy zu%k;UP-2e$_JKh~|L%GJW;pA?JMI9JcZ7WAGcWcIC)I8k6@=mMd_E68CW9G}@X<|h+xu?0+9^HaX>IEhv-sX5s=tB8v80c?Qa!) z8qzhopMJex^I$MyiAM{?<1PH)#SG5+%ZGQ60jwiO$~=$&@0*-97Z773hq{~0z=n8NN3(8_Z@SX{6X#U*k$o!BcAT`hMj49(vh{m2Mc@C3@m7w`I}Hn?f4h& z(V)T(4k*|IO$er-dog2&N~VxCG9dOtrtT7^2(SotG;zXYv_X=9I^KjLz0a+a7=cL& z*SbJz!smx6=F3@IIgoKTNi^z6+k&1P*)hdWPBJ4S5Im5_JdTW&wJSYtj);{S2HB3> zEO%PUqkNCq!oL-mV}sh9+HB%9Hl<_CPU|*))EnCra;Rge)Q`M_eqDDpjeP+c`(PRx zYr68b3I69rXC69$Y`OQVa+!$&RI)2fbu+*ABS{!@Z}z4E9KdBM;KImJ!dOjYPcC+A zqp|7JmZCGJcRHMU=N7YL)=%_Y)nu;l-)UPK&Z+`_FN7Q^&)*V^yr|e1>n_F}`EleK zoPfbm_N#Cspk_HbWgqs5QRl(x92Wz%o~6X@K>>*UP8SwH5e2aEHcTpnKsu~&nAi9Z zPd&$oH;c)y(fwf^4%kp5mAD`{d(D_7oA4>voRd}Q3^G-wn3PS5BvM8z@r>EOMV|Qf zQ%@xqeZFMxOt*I|;5I~q?#)xdc|ZUY<2rO$nb$-Fk-e zB)}I!&ibgRD{w@#t3JBwrd9YXjxfN;R6lElKA^vqq*x4p8Obcfe)xL0MBB>r8v< zh=MQE906B~p!&ly2`NKg@7JHG+b39qO-#G`=-XpBCXlFp+nWBB8Y&W`_w4ZQ5Hb0L zn3W%pYSOo0;a;+C8jk7?K4Ubo2fROI;~`uQCJdzH^LEp z&hFBCUC#6IO*XqOYVg`EKBo)D(kR1yjN4c;nevx`W@}3EomBpolcHjsFPyM8xTHPl z@{r8pR-)9X8B5jnpylKGC?`^>l*Cj>d6*>exl;O~rD24Ti$0@I>OZEl8RX2IjL`+w ze8YvkO#PZY8qS~hqVx1eW6YS!tefmGpUneFbZQGmkHhi8s4>j8WqPAw6)JWY`p_BX zA9yvD*ynw(RqE76^Bk(y75YY0g$XgM@P1gFABE(+KfLv~xj^BjTb}vZ=K6_e|BHhd$g*_K8 zWiwLRM}cR>{AKw< zFaNk#?E_)m=9yUoGpblbSNBhmYj_2DyLrV&F36SJw=FcUTyHI9BT9waS+m)gFE@## z;+Zm25a)z6C{8?>huT;orb~sl?AnuQoQ~;j)&h5WV^PC6V(E|7AuI(!T^;ECwumO< zQaFxkoW`6u@bR@+D=CnRT}R=-{q^XxfBTVT#mbhVIYRiS$DAH^a2Ue05W@+l=exhG z!pRmCco0ZnG-p34{=o8)RcU9@5p`FX6Zl)CS~w#O6c&^OK!6ED*kPv5Z+i1 zGJ$~F9v@v-*ZLuiE_++d1#oP06r5H59gSVj-)}1_Aw?ykSp}F-9(DdfvPlV&tG=Aw zQ-h9|16VDo%M4x%lvpW=f#Z~^GAdb&Jwk-ft87-Yly#|0QxDfmRZ>My*PxeF&5qvR zA(>vk5Q?rAxH+`Pf4!iUr+c&S2sG^S3!ISm#hjyIqNBWNh0F>IJ@`ll9C+HScwZNl zp2~L)ZrjF4K@Iya2L6P*c3;}NHE!#IVm-=S70R8Ijhaf;V($#NoO+zz*)1tsr-PcR zaQgEYGZplx>liZ?W_&*p9v9ZhRdtU!&shpaZxA>Smo*0J{ONVVS3Kif*%H8RdSe-Lv9!P?z3Ud%2fU%BrS;55c2{@RP>bNa>Y%yXkKQrG zTLh?;;FF9~L5JU-c z{WaR%ls(sS!Fz@zDq5pfC7og;?rMFtc>nS69FQ{Gw_AwG<>SAP27?=U-;e@98w~eX z5(i4K!o5C!OswRX+p@3NIL-{=U6nhovFjmnxHM=SoL(_HOhy$yM^4Dh#Iox?cYI^7 zt!Xkht$Q2C>P7Bo{MsXoS~HqAn8p&sG!}}r(>Z0^;ax03rd}BMKSI7Vs8WS{Nm!So z4yVws!GRTsnnJu4R_v%`ZwR^)KlxMdg&aV@FNmaB)nv3R%2UTFcMmT;%r+K}6Gph~^g=$C`nN=1Y@h6yj3&4^baI zr7(+clW+U{;>UH~-VXLII`>zMZL|31$c+O=<2D71b5Nu{Q#X6~MS==5e| zi8&<~nzdwYv+u3q&oxAR))C;^vy}X)K}VBZ)cBpgVo+FYoSbW3)8L;^IJ?~%=hPP( zU7~DqaZMdVON{&>n|^BJa=>JtS-0_1QRlj)MQ?B~h2(Hn{WOn2znXg9?(cUEgET%+ zuBty=qvP+Oy%`A=``QNqBRC?E1MRzislmlrP(vKK;si*EW|aemG(rY_MTCpssO>7s zfF~%2dyuW*uu3?jw>GDCgzz8M0n61VVtyG0>`BSPy(h9ZN*Jt=*ao;jj*yAJOfg_n zE6`c!8|7TnV+DmwItA1>)9#qH zd=^4)DyT+`G=(bh6gE$&E#cHc+WR0b{SE$BJX>4SZLBRYYzKWm9r6T@BF z_s+#pvut5ff&QYB;IB!^-6%{+~>v_hA?+V@#Mg(7L!8nzXbW zV}BZ@39q{9>X3)O@%6vkQHHQd*7lCO(Ri>7by>mR?cI_I9mp~&m5M2B`6>T5V@%J| zVRReR(4uSYMAvFvG$ypH(Ffy`iNu*rTj# z^mYW?@S<_A-OvCv$*pK9{Lut+fWIH7aO-B(W!jY9z<*Or{-21B`MRwfY&eTLyTij< zVr$0=Y<=59JI{%?-4|?MJUp8lyMC#D<@_5i$%xj*j=MNgebpE-n!neD6u7O4^?p+D ztzFmx;u&0% zK8XpEh2dHZKn8qS6z-dHmuXHXeETpQ3u)g65@V_kr+aOs9V0rvUMa{nE$eC{N|DY9 zm)xq_>#<9la=Y8hKbv!mnv;k!``e5{g>g!+8>bG;9(!)8p>nyL{Qs0VzjBJr8OyCH zh6Z2M%lr51yjlK7E)A?VR5pyl4J>z!KDWov@=cLb(wiUM370@t6xp=AZrsn!FR!y2 zoa>esh`ShEZO!_+J-=tf$eASxIDTJi0lR;o|94R^xt?UYq0K!n8_ z#H2oRpW5BP1s>ZEVF{E7tTw7z*agxphZu!##-D^AfsTSo0tCsU5id>uM~=?*C}cy1 zFPLa^sKON14+^ zI=z-T=CYWvF|!!Y#MVy~GzPWc#UPPcb?a)I*>theyT<7R$<8 zYD*f7Atp=B;zjH7tE&lp)3|vlzQ)D6)fz~py;6UIyD5EpdgfzBZ6uZ9w3+2?1%KO8 zw2k&^BGA5>?Ahz`YikKzTM^8){Dn;}rA?`_DjgY_Gi|*m^C>Rkw~?nOxVWya3G?@u zVw+Ry^q!w4Tx%9LMGL`&jcZpakPF=a{tER-9%}Dtm!9eaKD2T#KDpL@!5m2<@Avk@?KV$DW+XB7-C# z>@OXcNZxzUb<*AB+ie}ks-@JJ&&;=!NR2Gg>wbmDpUE%zTXR(`EVVf!JI*!$x=_F7Z!M7no;ies| z7WN`6h!D%^zM}=Rpjx2|f@6=^BwQLt?oZJN`J#h%Hzl12_v{-nL5dRf<;m%<_MUr% zf1R-AVj;tF=H}R#Yt2EkUy^8!JBXrpvdcE@bs55bC!G5tL6@ux-f@80P*;LoCh3}@ z)`DYx$G+XmUae!@w%wa%&ui(ych`FEMgLxpGFHm!^~|kxAm(~m&7A6e_1aeJ+U9vE z1(vdvIn{*opsjoM?fQ856#-d_^j-17FAJF#_np8PK$vSh+wD=(5%U4c=a z(vcDo%aj_H|Fz4rIfy2vBd7|-;_wHJhbc*oa*J+&CxK>_Pw@C@3Cz)1B%u_4SV?9E z?oKpU9KH?Ka=2D2xc2a1({Ch~uaTNGRd>A*RnO={>@~$T#V4Qq5+1+leJXFuyJEpI z*EbSy#K(Zkz)TIeOq<+(xA2HekatuLW7)U+gcFmN#QyMiJ@Ch?ciS`bYNbSEl;eEH|+YVQDL=N<@Qt1m)09p zHDkE|y+M1?At`VY6j zC+@p-yf0H8s7i#x0``qpm{pHg-YDs($$}(|9!4No!;E?e)6<%mIM9=Z4bPu=Ie8po zkpx&O32!4i`3V0Na?qK!T=3>w$+A9ZG3=KsP=dTn%&?{9k8!!D%=U11s_mX~H#}2J zm;XMgGG|o{nwXA_sSVXvzVxLRFj_0fHti%SvL3Ef06EQ9)`U|%Vf*x(kugued zfCkqs5)m*bR&qD6(hviOnvvn>hsS5Qwcds$2?U%~W`1hp^zHoBNMx^`nwOY7F?-AG zcNk?FDMsMQwuv!cM20Ck*OP;{Q$o^4B1QAFcegh@8u5hYCxs5L(B!^yAhVLZ`!dPE z|EPT&*3~BGzYXi44IAb?Nk^qI7GC?-r;&<5KE8PqjNwcL~# zIy}N!ervQ@GE+QB%-nF}J^W}nF>S9aUBLv?=D$a3^o@Lk?BhSl-(+oO6EWh2{f53^ zoK~i@`E*Tl9%nOq!#ZZ7j4fR>miV_@#*k)I@9n+ThDW-tXfUAqtA8R{KC@OoyeAf1 zSYBfOwyg?#G;WmHlF_LZQd!TCW+&|j97>-4C4^N8}OFL}T{jOZENvGgQo^Y8 z+rCe}vfLk@G6s^%AK_3+JO9&nljubkU4*C{dhZeR_?(04aT&Qfb*ns$`c=}Ywf#L2 z#(n8$X|5t%w?euyC>wEjD8&WW2c2z<%VTAi3?uU3@<1_)zfV|2r2ImQtiP5k#Iyym zOsb5<9(H@k`4ehaEYvC{O`m>Tp_h$$Nbo-cr*-{Gr*!%}*qw2g8(^x|`(wu5G$rg^ z&LfPNwF9Q`ZR+?Z{WX=xA0&^(tyAGc!rY6C1FKIs50CGhk4K90YOPMrwI@jyp_a6v zlMrs%icb6b*7PYJH2S3c|FcdqT1Ld8nZ(rcq171iKJzCyWB>`P0_8UM-pG`0-vaUZ z#tqE9#bYCeh~601`wx6?YjxY7@rFGm2R3)FsEPYXy~>Qbd@FLr6IXqD)n`|IO{j&0 ztwAeqytRaOphgtNt{GHFSXeZj@E)JaOAxHMph?;%p9?-hq&!Twhba;@dB9&rhe>OM z9~;Cx`~~=%uzm5D(Z31*zu{liwvrhW4c@A5qrh}~797nIMA zh(r>_23U_XViC!mZd3XEUZupyS=Ba+jFE_YKlC|g{jTWDx=~X+;+EGn-e8dVdP;6I z8018Ql1>x3MQTjxr6!C04h<{SyYz4}w?Y-lI?Sx3DFubQ<&<|BO_YUp(;!i%*|1+; z5QDP-=OnFPp&9WjE&5LvoFOh_PLsVQPs>(PxxAj<7vKad(Iw|t)ZY#>4OR;+d#0IbHN?J4MH%Y@3)}cnb*hP5xX*$#| zr3W7ehmyj-!u=#3ILe}lMQ3t>RoTDhhKF_q;4MGOE{z4E-JD;!(RtcZcy7Dr$=^Z} zYAltrYF+!#!Gm?VQYG@$ig~M8E+)m^SF-kkBk3+N>zlfa6R6`Aoe@xHl{G_vU+@TM znLE%1VIQhlwO4D0+ps|l=t#U){2Pk7qD5=s9_^wq^kObWhdejG+c9P-b?37?E(>+c zd)HREvI$CRLRyRz*%#3ojUyVgCq|qF`w3ZJ%b)PId)w35gUNXEq=^Wem~wi5>{xPZ zzmd=}24DLxeZbAZFj2G)pq@nRkUa@&S$&%SQ6P4xZgw=AHE+r`yJ0aDnZAd{3F-&- zQOv!UgVo=k+_w*}$%W|tucGtcDY`D;LT(&hdbF{~!XaFdl!t{E2c1CrWkF;vv<8PS z)B6xf6okSoQ{jaYnpwhUC`v+eR_4!X{$9;oWwQ3UQqG(VJ4TfD(?XjYj_}%ZKeN_BTb(xFhWv?fow8KBk>&9&>w18!vZ*U}$JXo=!bW?(Co$f{7v!U_8~7$C_)C zM1!xT=36Og)`3?l9H0$csnAc{hk89GxHVGu*n>h$V^?r=yjcAq$vz2Xu29J^MMSW= zkdaEg^c)~iA>$QZ$Q2mMKdd-cKK5S^Y9ND}0^>3WdjELUQA>p^nc35lU6n(5yLHNy z_{wS}?9i1)wkR=#y>XKh;{NT2h>qfT4AJs@(I0e5{Ba(PJ|4wO=*ojj#NeeLD=ozO1uL}<{UFm&*yN(Vu#a*_QU7`=cG4oum%DkrPt!Yf6h>kZ zIPnBS;SGXE52RwTm5Rw(-hQJyfLeC$gYz@k#9z}}NK3@Ja6ibq(34pu#gwhE=z z@As-DDzR^KGoI)=41Sf;pjI&a>x>KroL*})8k0jH0#(G4Sg}(^PGbvZudA%%-EVac z9s1ns{Na?b=#1JiU`*pjFT|$zczla(bI4;;bWI)Rw+afV1?*e}95F&_|UNA?eMtIsT@oZFdd26+ExjLljq#9E;sQMC z*)-*!bBqF_-ok&LtYuEEn{*KtbS-23Z{PeT3DzP>w#p@YU%%?AC!SCpvZR9+)S^ox zupQPJu5UI;YSd_F?!vm53TL6ZWd8D zCNZV3<0F0zK7R1x6Ay1le8XUm0zVkupHGF5Kl=0ztBt(E|Bkr%bG=^jJO(Zwn8ts8 zs`sWAk(u*b%2y=J`CMEBu1YS$Jj>rZ```(_y`P_2+j(fO@4$T%c;*oDY=Io|fQvSv+yo8SsRG)*aYn|N2@fSNd6zP_O_RkoKW-AvtPM zt^S~UD;P|8g*`IN;t@>x8d-q=Jjl9+2ar~UgLyTtrR=mVTfSqQ5w8=GJMn&G*D?Gr z##JJ*OstvASL_MDMIsr&Hu?*i<(O3hBGe0^#>ov^vsJgoDyQXPzh;*w$rf*oqllr- zT&~u7*E)rxXLha`$NVBXkJ7h>@!feR_cOWK=Fq69FUqln(3qp_nK-10YP3GfMNlI(-3g?va63jIQ0ks(R(ZmPdJCsl)NUh2yL~h~o z5={WgMl{d|eXP%E5}7EuK&>~a#lX2qO&MF5j@lDJw}z8+x{P$am^}IX*vBuv7@|8d zbMeJj^Y^E%F>8#=Ypk|Or^VZZ3!&cNXxoein@O(%)qwFvgJQ!+6{!=i=MskLEBIC? z+ORh4xEn2V+m0(bckEcL#KtFN7UkZEq&z;#ruS@~GHkp1`YT4u=2U4sF?Z+M#&&bo zXijt6zI))n-ODwzK4COP^_JT5-Nco2LZ@izJm1tuR5gu{|Lg@?x7{q3kBkzAQ=EtS zPfX3fdZEgu^k;d3CH}qe)ZObHi+9ugDFsIIAnoEq8`+9>xk zf3SE{j8MZ1SD~m}LU1;D%|_gxfJf8f;?Q1|s+4M3Lk_)I0ymlweu|L)SjS%rSG&d=U;2`8M|}I+ zFZV8XIVYT!*!Xf=2SXONq5>z0xiD`C;|yj&01Wasi}%~g>-Q?%aa8FKU7FHf6X^&a2!N7{f|*X*8V zBhj$70jKx?ljHfNNA~TTIPEm%fsQq3t6Rdo1u(*l67+AT(M42i$Tq&otbzf?7x{B+ zY2xAkO1{$NLR`ZX>wPQb+^}T}62y(m%gjss>tAe~^~DS6excg2t574Z!fiG$ct#6z z-QRy&j|7Y(Czw7h1Q%=+KsYqqA|0e#j9!5KOb?+1foPb63~Tw7+YT#2rnYXSbRM!u z#A`>+W+dxJ$lksDdyC}X`S)Hlu7j$$l~qt&chrmW5Gm^(Ljec?s2N+jn0nYQKh zVMj{jRS8xqP&5iQmly)uX3S@wO-A`@jE%DTs6LX`rA=Il1xw7-uKlhZ=A$8rnf40JgbmW+vyKPC^>u=S7Dx-mh2GA=ROorVEfB8F@ z=60MgHE`Graxv-$Fx0|Q>$ZFYWl}8BG7#VTyl`|9>F^X zx7yLBVZs^2+KFPhurB6MadwT(LTGS!hRC+S|9EY}*>I=)m8+-u$%A)$L2~pMe8DmD zxs=B5bx87t2LI!9sA0`>ou3Octu+nr7}<7;@EFNeU`4)x8F5FL)3ifXO#Mi z*<3RA{>u1D80eaVgz*XHq~2{Fl7~(UJnnIGfL9b09-m(gf7nfVTRRhp&yUbaqk>40 zx#`^6p~~slZ%Sb{gAe^c5&Hj>b1`JE52Gj!R1hqn;ei`wtJM1syNo@$XC`#6QFIJj zf&}SQX*CDUP7|Osqe8^rH$z_O-H!!wVSz%O+5~*F41R5s z#WVuu_}lS#;S+fLjK2>j3vc8h(&4}LyYlEn-apn`HU?a#krCLo%Q56!Z8Mg?OkSAm zgEiDg?)ju^eKNTj4ws9YHZjl7RaXBO-X7{!#)O{Xoz$BOcMS{n-KogqR&JT$IWY{e z7*2}2=3inZoUv&pr#ZrU6i_y3GBBA@;-d3zF`5x;BTRH`5)7X1uTx*4oPv*V3Uslg zuWI+{sYjYG*jewz;En#Q`KGeC#(3S0hYks8$BjfZvJvs~vdjMMLEY|_YatEaR(KHo zgW}p`S|l?Dz5H|Gm}!K>{-*W?JY>^NH<8=LX65S|jya$DOJZKf8)LL7uL6?AKauZV zIfk)|8#e}h9^a0+%HCQ`UpB&_I2MsxY&NCR2Dmg@+gs@@J6gW{XFaR~qZ_$+Fl5Pw zEp+1JZgQ;F>$H#u_g0)$j-v&u9R2$T&@*}uc$Wda5$e(LelLrDUqlFHgU(_ z#78=RZs@YRVr9U*#qXc~gRm5T=PTqm-kxz5+;LaqY;w5wGcOpl0gXF8-e&gol;Hk@ zo8E+~I>5g{OFJ~MUp#c^GqxOuNrRtZ>-8^IJq=gU+3sCJ4)C8KR}O9Gy}ds-8uE%aSsUTD1zD%MEO8ezG2=P#y8R=@b&&nQ)ioxU!IbeBtqHAxQ^8xEke3*Z!6=m| zWyWgE>lw3gEtlV#iMStwr`ksP##~wTH7!MZ<=uup%+(Ch4=b%^E%{`%`U|afBr$dF zSk5;#u{z;ZDNONfH9)5M$CPH}=QGPrPr}K9D@*2pk*X~oy`>R5PmFX!t2fvZx{{(~ zwWTy^RUnokpIlQ}j}>*GcfVOQBJ|Pbgs#UPOiX}|#$Wc+wf44)VU!_M?)P&0a!c`x^N)8Fc{U;BFv9Je)MKk9GnHZJ}z6gU%UPvzm2$?hG zDVijVISL`;637pw5NM$T9O(lo3VmUO9~>^UXp!f&akeR9O`MEXiNPJ|xo%6PmLIcUSpP%(SNwv>q&GAgpU8JDT@WH?BJ+*_W5#&n{2I5(owM+<&&G0S z3NhNSOGR}4+iF{s>uVTlbe*S0{#wyF>`pxt_8+~)vvtp|fGr<$LBg8! zqTOM_c-Itv&<_2*cZ@ZS=iNmESj_W672x^4BQW3qwK6E;mvC#FTDXNRqu+G;UM zTk0%k0b@YfQY^IfUgj&ew?5IjmhSET+~oBl2P%U;Ph|-^dr-Y%=L%&#vR_c;z)T({ zXeMzVk?(iERsc~UD;|PU!y!3>*I|LbtC35 zA;7!z;*l#o$JaMB#_RAT($^*qdTYt^*Ds$Jt$X&ZuNfj_dp6v)rXAhCwz-J0!G?Rk zjn^JL;NJW>x&~6h@U?iShRXr-!ARZ#ppwqK{8gcaM_g+iz!z36U?6X5*%G%*~6LoYQGA zYO^*!h>yUD!p707x7AOsMW}s6f{oNpmO8uv)|EDb1Hs00zp8gG%tQ`0LUU&qjSd_J zg?YdOz(^%vr&K zX9W#JCP1?Robi6)4&TmxegL?$IB@^Kfj{cn6dH9O%%xuh71I+BWlx!7x^oYR$@SO& z=YP^cPjmb)N$A_(zUwYV%>UA-rdXXTIk8mNVtSXh9++U7=i&kW2PRqFS@sm1`A}B( znU`Pwj8PNTl*jm=&eU$cxi&-MV`Y5er~M?T!FhZCJCqIGNj^DQ8vO>|gfr+z?`8{n zH#DnTj|vN28#*bHhT9`=c*X;mf_@y-o+88&e7hxpk++8m&dL!MxunK2v+mx#wDoHl1^H zv}N(zlJBkZ`lfwQ56m^KVUJZ=H@2^Q_ua5Q`)z7ezh+$aX0EG z1A6XtXvw6)REA-$JBAr%b4PGtnj7|?In7UCRPPnhozc&EkIqemI*Qg%!}>{#3jejd zHSdc1^33tP8)bk@EHgR%CP*h>UqYDR694oBd8~J<+dB;ia&Ej87`JrgHeZCf{8OKL z?V*RB<)0?$;Tv-fJpNr7$M}8P$)#m)erayP7hC_mgA*S=YkuV2uljO~rT2G+>2Oip zKat++@y6Z9*~445E;G+xa>*rM-CW*QrY2?*^zrDdVl^u5o#2X}4QKQ#aT5(82-?pa z2u5%x3-`-WvXY`v$kg!q%kS*>>g}wT#lvb59m(Dq@u7K(HzlxqS;r!&TXLfq8 zXWE(G`|R{S+c(>@yUC`I0wjUZA}xdfN|D|K1e6k*iXw=ph>Gw^S3rERS5)xTPXrZE zUzE(@zn(KQo1owKPcqpgI~&+%?&q%8eO+gcWhPHgysU^Mw|lDhQ{GTIInJsjFD1lk z@iwXIvjc2e|4l#}$bL59_n9(mGM#go!$$Zzg{&x(k;Phb-c%htySnJ8n?}c=CSSB~ z9;)cW`ie4TEJ0EYyXIIJRnx!vRRMBEPJO|Xe|<;+;IMMYjOle!6sn9*3|m9ik+l=G zFtbsgRO-X;8r&(}3`2VN^Je%YXrm+VnCfjl!G5|q#gTZ$eh&$rN3cGeH(l%Nl7>;1 zwJ!Xz2Z9v1FZ!uS|9Xlv5HArgiOGdTf*$UrUbWS5z|QdQO=-E&;FB zbJvFt^T=%X18zG=10%NU1_~*?O{q@?bc(&wMy2daLKL3-z4H{My9F<-21=)oZJ#-N za`$DI37E6<`8#MK3v7OJWVxaZP&RC=g6=&T5B}xz&hx9H+DHgCH85wgYCGpX*d7ec zFCSGP|1}EoIloIjsC0R~7vI6(#ns4pchuISrDe$Jm+HrKx7I)C+L?p5)jnbVK0P1n z`HY;$u_Bugg8v2j$QWU$_pTJY^y=qz1x1;+ABk30aA2<>k5}3c=F+pM= z>wrLM!c$rEesQfKXDb$Gl&9~fC{A+hu||l{nKb-k0FXde$(b5kscW%t4rYcrb2cTA zyW@^yVhz#!p{JQQDe?m)8b7+5A0+#dGyYQT^CwhK1Wv(TwVzPkV6l3gF4GOY#-YX2 zc|FrZjvr+1_*(s&jr+T{;lj@Jdd!l#o#u6dX3`03&?f^17*nDTe3wUlznC6T5M!^+ z(-&5PCWKHO32~mraU7uVBL=TXau$X|qtX2Z&X7coVVOi6$U z9+hfY{kcx-Fk_EotzJ+-sL0S;!h`=WL&$A(>773$oZ|}{lHsMhVKolms3{ke2$^XHyK$r7 z!ks}hfaUbu2JNRF#v};eH0^ePa)%~Fpzz0n7WG7;Re5EhlY&o@2pGP8o3+fuPl<`PrBLNFz8>ud^1rYjt6fL*s`8=UEfMvD z>%Y>ToI3(cQs)*tUcDZV$;s;{UlBE2Wgh_g)Jph#dwK=f6@_DU@sxbaWz{`Pr;Lubc`!!tz(WIjh3!1bppm6EXvF; z)ol@FO`z=jXWTryWk=X^!oA27lfXY751mRSdQvT9il+){PbdKjEGQ#|Yl0J^B>@hm zdpXQflZ2x+D4;Nu1+CXE5nlVj_#=E}_jSVCg0DF|8?t(?O9jknbGK$ebRxDhkn27a1<<-P%!2%z^|%arXJ9 zL8oEn?7Z8SGo5e(qZTQgoQ?l4k9*kfj7_X->f@k~u4{sk2x;iuYp2KT2J7hbG=FS* z^qz&~yT%%WyH7fEX!5!`T3+U&`I9n@MC_W2gJ z=Ht&HnErdRlV90cxl1aSRAg~btgx~#RW^%NM3c&;{!iPMRJZh*&RaQ~Aj25ix@BIl zXAZr1svDyf=BWiiiFy_m-L2aM_DSJ3QgiLqsJMc(HWk{Z!hvH5bVTyqkLnb?KUjk$ zn{!fpMQ>+HKpIdQRdRg$=BJs3XYOv_IzV1{0T8Ay67uY`jFdl=bkuDb@1VISxf~j5 zV*-Z4zTp{SwjU#6&_9~_^vK9B$oV_v7L#UN4Q!qx5FdCqNX}hXt)B8ca4Lr?7w=NSkNN>L)tmpn|k?X6e>pa#{6^J=80IXy3kQ8Ce_bgWo*`P z%iZWbZ-(!taf>RE?F3gG)G0m?w}h@e?2P`Tefuyn9GB2#rg(~8HMLHw>&69kn92Znh#x z$xCBnmWAlPvGn9|)-kHutXCN{%`M!0%%09(fddmmG`jr}gv?F@P3STHyOcbHJ|;U57~VOy?IV$V;M6)+ z&N(@FdEA>yjck|y4MQZFXwQK8I|O3Lug#a%QXfh+KZbDMr2+zdMev{d)_i!)C5NkF zp(9Ph1HIk=J%ewc+fc^Q^$(PmhA=}M8H~#O?`J9MDP#5E&)s}Nz^8yVgW9W5)$~8U zo#blnNT|W=;=e4Gi5@jJ)RwX*v$GyLXS=CfM_FGyBVmu}4aK2xuP3=YHmJJy0TJ1U z0Qxt8NXS^{ysowS10xlvImSSYsDo+^!yVLwtZZzq2BFzerNv?n52i0(J99%(m$__m z?FHvHOssLpXucQg$GR%kkFTq607luf{NL z1jnjlY-xM3Xv(UKMLElwCF@#{)6+vv4{V%q=hEiQ{*ZrZW#u(GziE@*4!RHpkuBTX zWtA3Ylmq#a*zhvvDhC~bs>5#?0zRZo`=~nP`kQ+gHj3Wca>V;WV;Qn~JQ2+fcT)R) zpzl!8&FYcB_`{Ur0cjr1Y^dWnoZb8;;%vAg-a5H(?BKy`)&*PfLaG&6xcZjPPhFn1 zep_g4tZ9x0y_%ZF7Yvi%{!OfPu!fMuT+)M~jX!$yPyG967Sdr1_}wqBaHCwwQ}2BB zsi&$tE2p}yy~K8MWoMPFw9R3C+u*~n*FCqqKI{)~*s#caVq530Ha{-UfOvR7qH{UP z7dl^MF5Ol~@(U7ffYIO|CD?tx3Ox)R5S&?PytM@6_ZlG<_rpvVLq9sUfW z6D{@n*Su$KG=>WiNwhWRn_$OGv&liOlnTi2{?Y|x_L48$t_UVFe0#0NZyF5MQ(onm z#z&T(dWu&hR9>%J8MhB>-JuDz7f}CgZ^lOL4Q?_~iXD^We@!&;<1!^H(652ohtRM1 z(}!yAp=O!K?G;xoebQVKsE@s!8V@ z@a`1DdbwyxxTiF4U5m-vcEkmsl=|Jve%J-18sEGCyb%T!bP7Zp1av7~aQLtQAeO|v z(ofhsz|kOqrPp#bsr_flQN;#%gE>7X0Mg5Pzu)_P_PH;K==L;JQLJ9M6xGhX*P8xY z?aqhmfwV(Gm|Eu?w-Li}qc_xe1~jdHhinM)qR)ZRClb`uAVeI13w?u_=#zm4Mb2Jz zX4ORegGsNa;>RMfog;yH{z`Is zOB<99%A(nvaYCZiY6mXSFF2lk_Q415zyBxvMzq`a@!z>Zc<{pobuyFI7Q^eAoANrF z#iS~7(c8<$2wPTTX_yZ`{y4YcS#b+|lPa!4yRM%Jnf zS0?7ms#K-vh}DnBIVdpezfu&1u2u})&MtC^A}J^)_QN<0C!=9#%~;H@FWO0;;x>HJI5P+-a>!3-90)DH`QBR2_@?so0w?=Hg0UE?|MODl;tw=n+d6%1~mRu5s-0 zOgIJt+YNyxf3Ig`Qt=h3-N_D!RTjgD*(`q6xz(mBmXo4CR{W!ZLSX#RKV4CBA%8ie z>t-=SrcmcQDbG?WwKWM{I=>ZxDlUw>kK=f-@d9{1!G?${6% zcCi+;6*&I@PTIGYymm1jJLvS{iL>#TT1dvF6j!P?S`;8T`TEz2KdTqo`F6of>B-H= z2hCUUXVB^Rb8oNg)#Swt0zgbZ~A605n4uvSS=v&o}l_Vn?#d2&WY6JHOs3F>e4~$b|Sh z*>xr6q`J<<#4nQY|HOuk+og`X>&%Bz++a3i2c*4N=-lM>On7bng%iT|YPG};W>4k+ zSr>Q&8(M!j!W4dq2YKhwN8f(?M-+TvGK7qkiXm(uSLAd7FDK7A>m5&B=kZ0@9QZ$6 zpaJ1>0SNDqW{Gz#D8wJC6syBAgj`@%Kue*5U<<8S*fr+J=WS08K<(hy3Gh(1Lt zK*eRF#>-F9j|~Kl=T9Lle_SHB&f3rflY<#>oqO`0n(;$wqcQHxMP1UiF=!(vTT}Xb zZnQTQ+;TqcH67R4;-iQ=b09c83CT$)E4CnC(x}xw(r$mWTxLQQLo``%)r>~d5Co1J zu|jBf%j0QRa~~;t1(;MPR{y$Ar>Yx^4dhLOb0P0?xMuL1$4(67t@dZ?BnuL33b=X;}uoE(Fh*S~DoNWEgeo!spj&|IslV^24ng$5W#AJU%L z^e@+H0@jPMUGqb5p?6qf5`u;>`vs-4Ka7~5a=#SGy zO)jkm$ZY4iCsM}PpIn0n|8~YyaD*KN6*yF}d1LcWlJSN_r^71iW8`i|wqfAPtF;cA zx7uW?wF;G(JS$d1BKp*(ISlcQ!A|L}H03drB9k$#aS3dOOTr1G&LH4RM&=O|xK#0*erf_=CPb0Gv63!201P46 zGVAS8(}WMlng)3Q_VQ>`hn3Q2H!fk^B<_9nYM#eDH<7cALXXbG@6g20IO}A8K7PiB z&n4)aA?K3T4W3&Hatpdn(93xs;i`FKp4OW8(eEZ<{w>qU+&aHEy0kFm@ia&0QkmG? zSe5+;R{S0}3}o7)*1H0=Vy!;3yLR%$_CbZ!;nb9Zv&T>6bM;HTp$Vr)9}amp4<*_j z*f{xzV{*}KOeVtnTPm|tR|Ujbd%Rce@p)7(t{jdlDLF*cT;EZ2RnS$e@`Jjt9)sb4 zff*WL!?kF%;IqivU=2x!N`|m)n2>$N@Og)P-FU8T4{6(! za;fu9WbT$tp2Y{L|8O8S?GmtZbT^821Zi$f5vJ&|3H}tmv}e#FxC{L0Fyg4+{~|!k z(FoIb48rSsX+yUu#C(hY+9df&=l5REnAfZH1VfTxMmp9xp{vI236Cy7+nnBgkkvOa z%AaKC=RdJ_?R7IVgiw|vxtp_)K~pT`RaT|i0hP<=C*#fpd6?f!c2=!nwk$QV?4h?B zc$&u(PcHk zRw=*P9ik+5ODX@(HpJ>)hSZ%t(JC0R8bt%$rtWtVQ2o-&4bv48A@+#QF^V(_8=|b> zw9$ar-VNm#@X>L_YU$Q9dupiNOuXk+L`g6|avojCXjM7wW?(T+mR7LtpH(R(BJo?D z$1>I;)*?#3N-@$!2{V+J)?8bM?I&ez4kka2`GlC%ZrfR}jYoW=v1R__9t!?eaWa26 zw5e$b`JD2)% zF=uz#gQg#S-oLr?nwOjPIb&1nM)ZkTK;A?zJV<_bqUE4ShIzB1u1(~MHeWUxv6ZzB zSI}CSDmP1POr?yorDl1m5}Y7MmAnmmP3eIy^~PLqQ|WupIMea4sc7&=GHz0Ch{a3+ zG&&Y-S*ejN7K!w*|WlCzc7~zvGsHfKf%ZY7jU_|0z zHl=u&?Lf?~&O=H}UGDvQfm+lmS&Eec38GRiElik2=$f^QK;W)vQI{P;y5w z#cdGri<9pXy6JYP^JtQ**h03(&ZId5;)$FR40;3PVCz5#=TahD_^(gObc%3v{Y=~3 zG8*gCD``7a7REtHG|}m}6_`J&Eb3r1w0_ta^10P5l?(hJPt@6&Y&tS#IrrR$jU^MP za~{656e>Xqx5WRhEO!UvY|NZa_#g3oXxLFH=lK6(eIzbc43sTHOFOGvIzH1(tE(bN zjs5KHyUCp`xs^3ZDgy?PeEl`U4b5$>xwG3hg3LjTKH5#9Ns$FMT!96jC9pUMnH8=) zz%w+BM^gf;g@=1FNciCp@)%?HUf4HHW7n%7w)MV}I*R}N%Kp{}-jjZ{B{&X|Byd6_ z7~kTVkqw8x@C;E+oT_?WVU4&0m|1LbYxS4PQ{@-|hC-yrGe`U9a8L`{0i^5A8}+ z+-tKj!`la{{9pXL`Sa~@w-HU^bpv8zcFOefote$f9uh2lIogwP7SC?IB^GNXTtAP(~H|9Nl@5t4@ z6aOsWk$-+{;L6U|lJ=A%$mN*R_#cYI1OH^ijLhh^Wq~`*nYDWGsF24sNf$Sji^tdd zeF^3lL`G+W%s)F9f^N^{3=PlJ%t5bRQD^I9CU9ba?Ap5Z#{Fe;%FHHB<^4C3Of~@i zd*dKKV-1@u6A^PX;E?J?BUn}*U^$Ok=}-lRog7}Qjrje?&s8l&Gk)%`S<$=K1v+n~ z?c?(+anHuvnUnYLr?rF(7`baidqmzfcGM9ybeTqkJ^?z8t9@Qp+68dqd{A8VPNRGK zyLAMU4-3e7e3ov*L4rjPhUy>qYHYidQTl>GZ8Ue(!kBB!c+RJy>pod^jruSgUCOXE zNG4&+p1i_8J*|rS((yF*B!0)QXC&nDCH{+KfxmBnY?kp)lRCe~>z)g^VzWzQhGaY_ zZ(>*$Chrb{=mlz$mRx%->t`<>8IJ621)Gk6%9Ukb%LXUv_jP18{}ZugUoN}<{0r** zALTaX8{}WrV(pgQ5GtSM}ae|ON4@kafHegF7}78`G}aH0{9 zi_uiaZVsks;-e(Y^DlxSKxPTaMvN7Y)S^=;#ZvJQBU9@XGS=nQ$yr%!-*_Z2-Y%FF zdNri;D&+x%Le4Z~rj1g6PLhTEn;Gv|wB*%_CJYlk{yeXD*l(N7Rg*J_SHW0}`CQVO z!j@<{lMm#$0#|;qBxYNqqmHqwhWw4&PI>rY84+ng8OR2-+Av$G`gfjqtT%Ph5LPr> zj-pj(F+0P`@PIcKSIJc(n^S}S*qpN}_ovIA#EEB~+vHC*Yoigb)EsI{{JDlWY>U|9 zGu}dI!?C9{*_}g$k2UN;b=}_iS$gD_<)DA#3LUxOU8KF4A#f3j@OvfRQL5s83f@iR zxm^Pmh8e=8@7E*!%TM{UBwdA;UXP5HhuvrgRI`xg2{Ku|4zmDs7Rc6w_nElKpCi|s3iKt8MfdKktM%zEYzBfY418PfO<|+ zrpinMzGJBK*&AW;dV||^@i(RBtVYW~U+We!%|A?xOQrcQ7Cm))G1&NhQ))8mB`u4) z^ZQkdO%e+WSr7N^@|MX#ZA}p@Pi3lV7iX7w6)tqSA<0rOBD1UcZ58B4gIx7a@QIo< zHYCgv)X%p8lVb$eGR0H&v_OsB0vYq7ZVS~*`L0?x$XN?&Xo4$=TYy#~P~=xk@6INd`K% zx(rxYGq@v_j`CGwd;GkBbN$G!^i=&b+ssXgUNRt;4)9;}P=yw>ty|#hqiTIM3^>u+lu0%BB$ZT|K5`%+gE;s8j1;JGykxR=Om(wb(%Z;+msLb!QFLz!`K~p4&jlt8x zsY&M$yOfXGi-R%s#||=*xdHO2+d|v(_yc!ZcHEa8l85|7Ldki^OLkD1neu2o4}ETszm`GYU+m4mbmEWA_*2mMYaUWx@_+99SS0n~5w8N600 zvV$~xp)Lk*c8U4#lFDY$i>vx*B;{9i_DwR?}Vpm1D#*fFC7~ zo8A&!uv0fbT} zaF{#QHM!9qbXwb-)QEjybwY2?*q!55vy$p+*p;z_-xfEHd7^5M*R!|kuWEWjxFAW2eSI;tfIM3|FxHIl|>uYMKFUF+y?&bfw)aLVlDL0Fyx&YPmaS^}l}^>OvzJV`zt+a???ST(@~i(-ur6`gV`$qu{!Mdl%Z8-H9|_ z&}(a~W<~h!adzF9h`koC88aAc@;%8{9^;Se%GK9A!y`grVfKZFnY;M+e)OZMpZ}bH z|KapdZlzd{@jEh{pq|Ni`K5_B8SzGNMyz4v%79MqQ<|#P&J(~lEH2~z-bubPB$Nu+ zE55h7x%%Dj;ulPzuXUV3PU`uKTaP*RHj^fT5s1#%^}k;D-!SvmYCW72Fxj+^-izQy zRwMQU(%zf0^pQ5J?euOL+>>4ay*0cu4vT)@)NcA=t{=si@3h#oYJ^Qg(qnG(G27OA zb)i8MsHG}WgGLu zq@d# zBmVAi#X&jUXe$j?6&5<`!Zl>jP8X_bI`GC13iN~7{#(^1+(zbAB6cbz;1*=012)^J z-k@M&kA)<5f1Hh40uKGaF~?D=LgFLhsR6W?#nS@`Mm!@XXLYX3SSsMs@VK3fck;NS zj&6@J+4dvi=ZV~C0R5vyVzPRb2Kgo92Sy*q`}Ip7H{MDOG$Z1MSv(;@bd$duVK7vW6hHgOt7^{tH@mF524u6j7 zJ>_V@+p^^;ik$x;A)9Z!u@1uEyLDd9CY2!4&PxUuGrO1n4e|V*Kos1xVFdl4Vch;V z61MqG-G0y<^QrZ)c$#|*VHY)u+fLC1Th|eBZET{qgrpi|2(ND{0y zdTDR2fzKWumC(j~&lCPfih;`6hz=)dkKgQzfArUkc)j?|Yooq{PQR(Fb6I01l}hrp zfrAGx9DkyH0XE3Q?s%-6q8zT0_<*}rHhTJ?i^ z5Vk=QZGpGsCcxA@J0O=0=*_@x-DlGVRK>A(-Jvz_j}=ux&2t6cus`b?{qv}x7Cj84 z)Efy7kTf8r?qSY3Xz&Bn zGxW{SSir~#PyAW%od8ZzL)G`DkOE4DI36X6iR-TqiFHP^BJYT}Eb^L+Reo#Fhdbwz zA^xQVm&cA-zWu|W{*-^sC#)g36C-5J@ne7Echyii1hI@TLSnmjGoP;2_?`Uah%NV@-}X^|Yf$$JWSAHuK|rP7o1%BL%PUOpKW!EQpeW=& z)K2hQVKhmDB3bRx96qVOpY3@}v1oWOJUddgRIc}Ug@oul#@MTgF%o0w5XjGGf%x%T<|FG+x3IV5mU6I16CX%5q!Kvm~)&$(=# znduQjG#b`bWmYHWV4E4|x-Hvd=8)z(Uwv-Kx(`eBCP~x2(DM9}wN%u;XwsI17Op95 z%Ed-ab%{>?iq$*C%@t=O^yOMimX=6NK zs*aAgvNZ3IqW5wmF!?mcw7|9~u5sU*3k7sf*GBZ+1dmcsqLGNC6Lu#2LErBMP#Y?A zteTw zpVYDjmAG+{NoO{3az&7JjlFyBRaXHgFhCw+=&bVg+xHX39vx&IV;UVOU=`}1);Dp^ zLl5!O9^a(hruK(}N42cry;C&7;u~Q;nuB-alo>3Be3AdVZzfTiwGFfXPf&?xXX%O|ek*(<85I$ev*}`!cCKdT z?qHr+UT!+0n2#A)Tj!mEcOK*OKz!2%RQ_t*CIx~z@p9tICL zv{AxpF|O%5v;N1vefIv`#}$ZrfFRM4EHo5FUZO)XN^*(!B1g&!lP2MA6f>sLzy-Du zee{vevuS(N5_2|~Giv}I0v+}7VHKyT>z#bc6)n4+3h-u-rD3I0(U7P$TE0_PIqWt? zRcW)??jHrn(XTB7NP5yW*L?C0ckt0CuDRw%H{x+8Sy38P4e&5d2OTxGWIKvKi@cHz zPusJe$&NRk+Z}gjw%%XZOfbh3c&z6)y+ zKxl$Pz_vkOg08EH+XW$^-YH_a&5O_CgnKOlq2B7BtPskNoIEnOeZ2GTEsrvd&Nt(( znls@mZ6v>r15v1lV>jJ|)Q3M*3}I@{aO%Hf zVm96fgamj;>%_*bls11c5SqLbXRp9q>|?;;8w8wrveyNt{8R!PMDU0s#nvw_vH-5_ zk}lEyEzJRhAMnOP-~y{3oGa~xQ;w%(@Fnxoyl1I%C{1zzUzOS>hoVgxS221amu-bHDM?$@BzyEe|QStfTb%(h~o?!N;)@ z88gD5ab|RZS`A_ZfG^&^)cIE;xnbi``RMj-8^=?UAD`L2^78Z2i}7_AC!r~1mL{JW zQd%trNlTUF9qZFer{;b0%S$1zZ`0O|%J} zJ|E`5oYn0ei8*2u%XM2c;MPhR=H$g5=d?dsFmb8gN&%Mm71j( znrdZ~*JnVxCMHGuUB4XLpqsL7zW;Nd`&{!xJRoc5FS$x4kHh}Xh$Uuf+d`e+=KSMR z>yn|Bo0(tL`L`-9@()ID(7M7wiBq3Wc<}aNL&xZFsc-O1O%B(DkF0+{H zUqQ6>PWuK?V265%|M+5KbDddS*P`;VI7K%w!PCe`wK&ZNaxpr+T|wV)JG?Bdj8^AX zLPkaXXD>owd#%?WJaVa||5?}Jcc6ECeP9#A^R-F3zjPE(2m_r@Wi?jTrpW@N$}*=W z@>>V>52#|tX0p0iETmfg(LLnjpMCLIM=9y)T;>h6Bi_*T7~E>er>VO~m;wb2zC^)H zzM^OO4S)06LVn zkIl|{lcP5F5tFOmF)jto~Koh z*58smd^-g~Ex(k40fd0xOXye8=FG?NAKS@Hkvr}p;yDpHj*$Qp{i)73QjqL&sly^i>Bb_%BzWH?v0Z(ZC@;b&oox>IlJujB_KX6|E#vLRqzEFR^I?@MQ zFied;yUBXr=(;WAUKI_y5eC&q9NB*q(0EPX?nIk@<2q^1lbjwZJH)wb*F{3Z)j`Ya z;Qs!@pUKNV-h1`c!eYj)=)i9jUwi$jFa3bL^$!X0ckaqL8_u-1&e3%wkI5fwuN@Ke z>Fb^m^0!-W-E`4KFI{!jQmLXGRk)I^_=YX|QHh?5yOEh??n|6qF=lo8j8Sg2TBN$1 zv2u3ezD%)1UMXP!h5xL?zVV|Rm;@yF| zr;kTR?X${N(!HG@sAamIy_XfPMh>B{6ucbzLn#I!0uv>HxWp`snwVyHgAp}ozX{jJ z@vpkLi-(?m`g5Oq>Pbv4MC6%gKJ%Fud0$d)gV;w@;cz-Wk^sG1#$CIRbGJP%P}@cb z?;1!BuUlAav-_+D#h(0uZJ*KDyhe3(?c(fE=UR-EBHqBv>?j&HZV=)WnSFckxQ_;m z^~W7oStPZ^qD@a*J$hSlk$+~f!YpLuoZBf&$sH~y0@j#67a0Biur+{XJ(JDGi$Mh| zmP#b7)2ltZ`JvCXzon02MU?JGf-&yJ5jMuwO!3a|ldg%`xnOka8uIpRVfK4?!d6wV z)tkVJ%^<&_jOY}x(%+`1_0JC6a(Kl4ZSLjfbh@#sc8|z{=!zKfA0cD)M)ys#>mHGj zHleLXUg9+w73XoQBc2f>6PyUlUR-s|Zdme$e6uqXPG5;Vi`)gZBzwif)`mtpm-)DH zufsnv-LfP@Zg~Tn;(${NbAQbK6I-_2wQ=KZn>HPKT$6Wt2FcGUd*By-C07ns*- z`QnWm=;JzT!DK4Zxj(HJS46-|qB^f3lJuj<8k`S}9Y@9w8V2xO?PGi}>LOXk@&4bC zXuYUGW5=(F@f+WG?KN;O4UqTV`_-?At#dGKDZ4{JoN>%e(>HcbRlL!pOKm4A0=b`Cwa11$Y+Zhk4o)P7qf+Y@x`LIX|JfouqWI|?=pWz%-lyqKH%=(#JDL)j{4GfD_zGCP8jH76Yy2|9t zs1w^(+GsjsiP!L44`OdyfV&1IOR!;wBx==JA+^`rc;|tFtvNm&n!BNvuk63zW9w84SDteUvm+a>*)opd z&i4!crjP%_dyZDSW~tjoXBI*vI9oPoGX_&iYbek1KetDN0g{D$vbq9cK&(Md&CUCr zo}~@zn8+h|P@I_=cXz8ujML6R+l``A*8n`;>!S(NLcbn&6UuEcN@!|yO;Iq%-tmEU z4V@zjN$sz==V28o=)VDOW)uurFaEbUE!z4eu|_$Q-D=6iV#!w0t#Yp@eqwXn}!#!HQ6cCKy@we+kK<0mpH9nJ2&?EC!xdbl}AIZeSt!&rA~ zXgm-L@VVODNtts~Ydw|JrftVJ`S(2a`C%h*)X3%4b=9%TIEj_KqqY)6zkH8=_BWLo zmeop^R0C2)$fC6AxRBRtix^4r<}&}U0+2f}*fd4%ENwl?9||A6Z2@*_0B^|F-u_&F zKZ5qy{!`r*C0q(9obISrnBmZB4z}4hPjk1))@`?SrxQIm4^m0LnR>huwaorUq1=+aRN8jYv0 zmjCkT%gf8lzXpHcze);+!!9q|^Ek%<`jivMsa*nAyn=e;(lrmRd79pL-0XggK-k6k z(N+!ay_B9Mp!h^e2~?qnfCez8G?rqa+dn&8r%*G+AjgklIz@!VMx={fTNNaHFx`yP2|tDZH=$>OPL|WNy%3xm$w>SX zSHP!?X51={<&xomsT8=@_ITEoQC?Y67^O*~(r7+(oZPM)P`kl1vgA>+tnL<)XT&H5 zPdPA7o~`&+G_kn-!%;voI`Hh}#1a$rsUY5dn2+m3vLflv`QQMYXz!u28pobQlfk zto*m?nwZC0b)U@^H8NxlmarL>KT&G5;vZ_`8V%%Ja;B39MK+IH9a z6oCZ5&&!dsK|5kd>bSHnYcOPaiFeu;$YHmU8APwkGEpyRQKNFeb}tG2z!n(RR={z3 z&6?}i+_dHvYB56Pg;W@wK)iWK*(m6(|MvDMB``)6WS6P}T9)2QSV%wd>o;13mWr_6 zO8YR>-g?yG9EGyL3SGzq1^ei}?R1N&?;4pKH23fi?bLjN+{s5JDxFEqmU9u1Y*Oev zlb%TgxKwJ;qqj}sQ!t*8OHpdAB7C9dVyNm+;E8I@FzMaM#EP_prO9aDT(crXWd@&n}1&PL;5l?Da_ zihf2CwA}*`i!pBWY6Jef!C}@*n@SB;OMv_^{(Yjga-AO+DaDy8p?2D>LnX1n?g8B? z6cEl%sT0|>_F70!YSAg093W;TSQCt`8gAvRju37VmHD6lu^)*l6UBjD%YlP#I=1dlPs1&S-P$HseX8i1dmhl?e zphS0z{#}7;$O!)6h>tYL&^OmoqK#f~G6{PUl5T6Kr-MQNNwj@1fu}@r)G2i5A@pm7 z|Ac^uq7_w-pCC;A3zE%V1Y^FITlR4a@pC>czmF&f6ege35O7&URw?V`G&Y+=A|WTs z8m`+fSLrlS16EM9)kIyxNgpImbZ-SUvfPrwu92`di=;Gf$oRZm#x#IECz%-N8Ijmv z(I*Xhvr;t3K$5Uv(qO%m@M}k;7OUNAlngnCiY_&}$XdH+n0X`|ocBg2k!X&(*nr0L zsC7)Qj9DC`TlPpfJ^K8C44bmYt!eT<{w?jw(V-`|nATU=RG0%xGd42TGT_-Itlcx} zEvx^&B-Kjts7>73TDoQk*Z{-Uq4{T3CU5e$l_0B- zSv7i>7|0L`+_2!ia$#>eAY3n6Tm9O(=UY~Vx zS#4e$v3sWdMK)!O&U{n((Jx8NBfh=1hi>NaeG`ti)(Giggw-xakR5VdVByDC!DXWNR z_LbUOPCDsqkenIj%%E-6Wr$__gGb^K9!P&7|#&`%pt#5Uv*C~SL7oVHlelKoo-2GcFCK|Gh<|c5y@OeL$R2U z=4M9P!MrVB9gUT1g+f`DS1irzTH+>tZ;FGD+Enf==DE2+V5dXG=-`y5xBp^ZD_?5n z&vAXkw104yT&mY9i8r&ExEdzEuBr=lUa51V(ZS@XDjk@BK8OZ?ZNBk4yBV#g)I^)j7 zLZ*h?sXRA2m3a31U-`<{zV=$@sf@Y8(Mre3obs#Ko|bR&gv5C6z_NR4f9hQV8bgR) zC_5kWy4L!+=;Zv6ITrRPD=G{Z$w9gydEIqHlqc8#lh-WS>SV&f=B)eKqbs#iwcM(Z zi;A9>t*Ueb0{-*zkg?6p)E;?wcpW>YZntaNpjH=zuN-!!)NP1%{w2Z9tzY&BVp~_H znA?PZ0d4ZzjaHwzVl{7-kfraJ@bkDoXvq{lGu-5)Y zL2rX*wZ*tPi2e8eglN;d<&U&{!{;Zb?2X}3XiQ&```=sqt#o;Ix6Cql<{5iJF=-@U zb2J>&{u?@<%sOiJn861r)}QeIH9@}D`HCBLj8DTE0)E%d8g}kNy0RMNG|VwnI`>(+ z#7$mpO|ebKQvSe4?CG#u+0@OHYV*M}u9DOlkwUMkfbK@lTz8)Sq#fDNq&)=*Pj|s1pmTt>+>A}bcQfqx(xzD4zqCA0luOkOui=UFqp{^$%n9}AoSlR{&~w)a z%*aB@hsz74dz5t)JJ7%L-DJ*8(>(kwJ}2blLKs5gM{hR`6k!}Xp!MdStKbNIxlqwi z|3ROO;4^{PJJ_`uy{Pg}yM`InC`^YvW=g>+7DWP}wufOkaiv zv!?{TPEf|2xbJ5p{tb}g(uOs(gB#KFGY7AIy2Ss3C=_nZx2{T0db6PunvtcLF=a5M z^qQDP7tzkxt3NBXO3ebeNAdIY(q%O^sA-rY*qhJXy4$zqUgq&;sfA<49kNtXYZ{8x9 zGf2>c9=Y%j;7hyz0A7lhb2v}xx4Q{BZFS<<`+=MO*URZY84gE@Max@>C)+APFN!C6=HP@lRxRZPHlPp|D>O8(u5j?_>B^76t;0=)jvf zBC3x9_ns3gri0&b#&wZs2yUhjv57ATGvShkWv!aHH%s2D=#@dxIgZ8*)k9 z!nh$3afyZ`4)l!|`RmAD`eZ%{;5$2HZ?*hGnub;;G8hdak;Q6MNfld78U+P*4i=^2L{a^ zn@OIx4j%eHTonJw+Zio{s7*Ri6RCxTCke~^)~$ZGYxDL^|Clc=!uQZ#^A6md5aMf5 z&=fl!2pmDvTX4+1`#>`!k&uM-oj5*mI5Og$7v2esBv)%CbPWXVaN*vVDFJjpj`rUt z!MQcN7$sa7(T-$tB)~1k;)!`q=}(-yh$Y=dzl>e^buG(YH3VEbyhM==1*m*rh8~Z_{rXkf z6dFxe+lGSDNY5Lgl}+`VnQi|Dc*GF_T-XwJ~c4z?5V0 zSd>^178xaGn_XovKp>Lvmjd+VQOBU@9nl@_&1bTlC%Qd&+ihgu!Gm}Ik$*_(l#*Ce z;n0^QI=$}15xGh!YAbd8KFZt}1V#A>DUJg&J}i-l?wL?KrNay)%HC*#o6x7OYJCAO z^YMyj*a6K}9m>i}t9$F2M$kxAw#I1*BaLLUI(yxX3dJTX>iy9{H#vPkjtvO4QFL^9 z&z|xzCH@+S_xzmmj0f!WRu7p)i9$xI3(t@XyIi<6*28;6Vqd1>5P7O8x8D@nno*fE zgXu)vIk#aYkO*zrIE{D5h<@a5VAEK1YUwt6zfVh9uYo-g4!s`)`X9}4ct7;Jh0#=h z&LZqv(H;+lpLl6!2d+?XT6B8)?_s$QmSBFsf9t9%=`J7n0w9e8+n?j#V2I# zQ&?I66RZOVO8TT$m(b&^O)_Cgzi zxc5S1P%H#HguBZRcK-ByLoWJEB^t3uBU2;ijkPPsL2212K zZBs-^DT+Y%J-xgVitfCFY0rOqEI&U#f4$JimxEjFB2fx`J<5^Q<$st!Z<(?b(GID= zlCxTS(-f?mgmvG2dXJ81)OWu_M3)>I{@pS`$j<5{lt)imsPe;z{w|ubbtx1m1d$%i ziIW<)%c*MHOSSGq5)v`w;)};_y6LpjF1mwPiyWVA-A8dl)c0%^Foj+3Qx~>J==2 z)0Iyh6E19;6YvBQaF1OfnuC2wQEQg5A8_58PpSryu7W~pjdf4k%L zvNd8$aVhXUD0K=`T*?d#NCwn?EW{pjjLCE1-Ij`V_CRN!8>M4Fhm6thAjh=UZZH_o zK(IjE&5rKxqG6}aea0Bb5Lo;wo zj+|FlSxnjiWQnZh?M)&!&rNH?kn0{G<7hQ9GJVuCXwT$xvVpZywV0^VS-(H)-2U~I zm0N~=zJ>KG@eMb`fBfaVZa&*GSX3e}`RPPwG@iU?pBqfk)Sm6{e;T^IuxrH9G&Vaa z-n$SOMw_i}|W%7&4 zj9MO3>O&*Br~*ajO~7lF&lV_!bji2T)Jb& zp;n>t0G`74?*>=)7HDROuo3SPvTe!@)dn6003$dyR@@DLG+m>E4m_z76ToKu4X{3R zsK58sGvq$$U>}DdVqP!LRXUHo_~kn?WsSpZzco3LxcpOJ@2spmfcA*CsCJVofAbLe z^C*l7*AGuuR_XS*lrhJ!!R4Ritgdx)ElSa;ZfL+oNv?{XAAX_ogUT+CqY%(v;NOPd z6V(sOF8f5-Hz(yB%F$hY3vgWP|~3H>d3dkU`5}@o-5_ zkFG~!M{R@N+it4cZS;0YaeApQ%_js*4cjCb|4y8h8M8NrMm;fitCBU`e?p>BA7Uhn z17s}K3ZDCfC0{IczLimPE>0cu)EH*$n`Iz-y=sB8;e_3%0XsBZ!Rpk1*Iao z0G-Cdol7$!_gUjyCg_w`!O<$_e_gjk{Z2XDAbKW=cKZ(tQiXU_qa~MAQpXKF`DC!3 zPnc_(Fsi%yHs^r`^x#YhQ~iAR(RD{I8H6I5F6eW~^Uii>*Tol?pN3{D)>IS5@>OMW zPqWCjRPl$LCE`@2x2~Ud4r*Nf5L?qkEm>P@Y}{>EsFiB|l9X?LX))w=ZP~s;^jF=Y zuqaE`9Nr|V^Ky%5w}4ad3p}B_=xzp0(^lV%!@m=ZwSQ-^e{uLTtJ9ONLHCW8^p-pN z0srun1?`kxmhig^1ep;mPk{>d(MMnFJeqTqJaJE*1h78^R98cIUyeFzU*{N~nlk^} zQsYF@=3lg}0COYG;?rWXogbr1EFo<@FiP&MUC0(pmOOjG%f_t9oHYe1r`6snVyhx; z9X|A4;}xivSyHA~NXC=`v!HQH_0|TXsterl4c5m$`(bT)wxxfFh--9vjN9PmiPm=Vk1>$>b0b3G+!y2}n?GH-vc8s?3Z1}=_axeSsMzosi4qB-Ss`-h$ULeyS%#a+d{G%PMams9jF4uxYN6&MMW|gE#t( z+vCTo?5aJnJ*KF7$X50|QHV6{Sx2+;>Q8=h=bkr4%I*=2*Z*mn9~>-pK!p%3+a@dF@T+>`D;I+WNFUP}wK1 z1np&8@tPG)ZdbN`@&lkV3;ln5y$66><(V}+@71VF_o`g!s<*4&N4-z)F5}*fZEV1% z+B8!_3xwW6?;-S(LLiVz$_93mC540}-);(<5JD2jCM2Y6h%VoGucWbIzyFslq%rcq zyydCqIVa4wt>JJ~a3mrT>!>XfP5a!V;~j^AHRsf}cdH=H$%_+zo~A*pVbT_sI>|hW zE@TQc|BPNgdp}}3u;8v(k15!NkCE5LF6neGIcuu4NF#d}diTemFB5gz?=8F?}YGnM#RP@qPVceFXML3`8I8`?O^NMK~6SF51F9636ZPdgSI`y|_WYqkFY zVH6G$gJJ!F7=?n>II>Ze*O*gwBd1lI_aT|5Y_+uWeCfqADb`^##O2Rvt4$6|)$B6s zq_Kp_qjlIwIRA?h6h`9bG=ThnH5*w5=6Tve^DtUFAY7X*;GE}an|p4=D!Kb>Nb ze5t{?oGx<}Xk>?^fA!Tz5578~0|~DlSUicd7?TN6ZPrIqaijV!{yb}Sg(i(_uq7OW zYB;TP>%a?jIWWj722QYLI@aj{%20*_ZrnM(2F-#$xv{?hyJmt}cxl@5)7MYrG_CD)Cl zR!&xJm9@`FU%_nQ!NKXCY_OLV$10iFY? zwiH|AzRc|TWaa8|d37VeQb`id-$;PuDO?Os|MPbZ$JmN>sqCj-_>OIv_g_*?X)Z|I zKm35_Vohbm;LzSrPTIbm+7Zf4c$H!ryl@J+nnU%%Q;0(;&K-3L_$!-$2ot~PwMV>3 zOAz3F#h*v;90XwWOwzAuXHZT?QJPl9sDA2^siJ;ylQ3JZb-pnD)oG%9mEqnbn%`b4 z?Yr((2-#qKuX!waR$6zRW8!ZL)=&V%-)U^6rJef8iTjzE?uPh^4Tz>0JyV`C{I1##;Q|-bE zf*DM*4${xK;*_=jw^*8|_*f>QCT~n2!Dtqx$Pra^tS3#&o zv%v{Q^U+!2llE_#nGcW0w@JSWgwX=Eh5X))j%zIzzWaK{x43p=EEw6ec`bAB%^UxPxc-LoV;IuG57p44>uJqXjB)$@ISip` z71bdq*!z_&W#4iQ)`%9fj;JE_idjdhe}ih)AdgYhK;huvVWdr5(qebB!{3&^5HtIH zK}!fyQx88h2YrXDR}hQz??L}e${k(WJX)CdHr#W}nU~`seeFU#KK&3L%4MSsw@+H z+R&N9dz#tNKYO1am%(q#nK}|1t1u|*DAuPcZBA?RCVUBBCgjx54Qm+NX!q%~yN!sf z!FcA+KYusi8T&4mnzJAJ(7t_`rGZ%8fdkvNog#fJNEQ8Tq1fc=$@5!3JRc7tmEy-n zgiLnCRS_!VD|0rjU0L0Kd|8-qk9bEVz4S98)~;wauc&Q({`tyUGCp17*`$S!v9{W@ z^p&+0GS`y=9tAf2tpu@)q_9|%^BgVee^=m+QM*Geb{iAkJ$~s;)anFngHdl z)tP?vPtJ+u-1q-)^c{CEG^x#W{saeNnkAB|Gr7@)YYnuo%MF( zmRlO_`p!nRrg!K+EDyPhlm9(VClL)G#^_=4L3cBEFF5zcFjBi@>dgm4z_C&;QsOp2r z$j+p&?K`OI@oj)FuE)F#N?g((3{R-ZB_xZ(hTql#k_fBx{o|@ta&lFivR9l_U3GKm znP-;3oIh?$u^oM^`=gQI(uNJOczFA^^~@LMiu3<6+k3t@Us+ljf=3sCDc!7aA?xyj z5g;j_m0pE}sz(ozAiY&YJxCfT3Qe9+kl6rov`LCf1Okixo8@XLR*_mAnm5p2gY0YI zrNHT>2(NMq)y2qMz@OT=dBHL5bdE1B!30ivq+=P|Cp_bY>eSu07Dk$$>|Lkiz0Ckn zY9Um3q!;JNOAFGAC??RST5d>yZESkYm@Gp(7J(MJtLbqy)`o?MzRr~n^{1eQ1~c^2^DpN}%m6YB6)!WqmO)@_oD8DmBPg$2B}y1jfN4 z@Y5n>r8mWrOCP6xo!X%rQ75Gu^3;D(w%2QiZXUWDD<<2aUN;|W2LpqpkrS*w_ij&y ztGBGQu`n<|HaSnFGnKu1^U(;59`py_i^ilMtV#^*+>w)sWUhnZ3i+j~SQCv-@~+8r zFgEG3iM-=mAkV>Iw99Clklxb`^BMp2Nhu7i>*FSE&{7GGb9JIzF}!0(!Xdqvv(+)f*IAP%<^5bvf9rrbm-kbPoo+Gom*>vvw4^ zaRKcZl&NCOxqG!9qtzu{VdNubvj7Rts%O&aFIbw!tS_>vST%*Me4&`P_#2-f2328m zbalIIZw8G)qdDVDi#zitaefw{|5DSeuApDkpd7N2b#$A%8QtD~`3K|sT%$TMTlLj- zKCg{<4<{@mR_lm4d5!0^e~0e|6JnzKw|HRfrgb5Ibm#Wf%+Eq?AyD7qWdod0Fw$Qufk26ll>e9RzORIiNOT zU|a^Tw&gP+-zC{=^)Z0>G!>(@!Yoq&c3*UehA>J@IYW${R+(cRCR#44Wgfn&3~x~U zPUQ{+v<GR`FT zLv*aPkMIt`ElJNkM<70CBO#SF8Z3qby5VOCqXCM`<--3n%NLcw!dS$eIW=RDqrq@& z{(kaYkK<^<9+4)Z>V=BOoe5e;%|S~r+=*u|-@p6*N&&M&rOBeh>(mN9>b20ClMivlZiN>XadK#-oKGUxkI>q0e+n0v%)aI8!^C9z z3i&nyF^)ScpO60qiK3WM{HBMbcjb>96ZqTyff(dM{Z1oGn4e46OufXevHf=asXBka ztrnvdzGE*6Nu%HA)*fisM*?Q8593uzjWV=)^@7ha?2V-@&TKJ0EhX|`O-pbAzZc}K zf8*`5a%?SKmqY z>ZJ#!$gjIs0Tb_qfIJXv5w>9wLm~3t&*^Q37r!VyKz5Mx3x!YFEqc4)^(0g#ztfc) zwdK`$PyUpAzI5{bUD2xl)alZVd*|DY{N=NLV%0k~sr$mT?9cq@lT4uArN$&3U2R(Nx)`gXRf^Rv8}@N6Bk^7X=Ek2`kJS^pUN6MUXLN} zZG7G*wt`O2!d0omt&2_moIkd|G%|1UE253L`6(xKNjzF&4}=T8;H2Mc6vLr)oxo~u zRU9XeT6UP3Ym43~Pr*0#FUOUe)piw=jm>Jad|YKqh3BGXbCl!p_K}ha_-S3$-}+I@ z9358Mor{Pbm4^1Mn3X`SDAb6u-2oHh0tSd_J4LRkh5!gc*7_62W{$mw z{PDQsrg;*{VIr_#m4b zIH2Bi3N=7Qco{m{;={@-mUC?E$Ffrzn6P(`Gpu!96s}mu^@8sCvQqS#Yk`upz&j^G zBQOv_gWaoU^qTNDHxa>Vc1nMF5Rbp6y%m2%95wm^GeKK)_P-R56NSd0GX!H92WQNh zO?HFwbiFT@bLWDUm}7YRxo|ZK@_=Ll^e^b;T4qX9awqMctW;H`Ob*e7jj)`I~B{X)n6Q{?y_jHNnUJ&=ktW zoW%+8>sbc%vS2#HhTEl_W5ipVSW{`RA&iEw4e5n=Zq3RSNsvOVT7ta^13%Da{s^|j z75(ZK!e)fx--qISfgEgQ!IbqF&QG-UGTl z8DmH>P;!zke_ljLE!qS$%x!SZ7LHDV~$uS=2Zj zR;DgU7nRDm4o+hD97-Mwx9it$#A5cm!OA0Q;OF=o3gLSRQpPdcMVZ z^kr+l+VH&lPcHi zI1(4)(IxNHnn~CCN~&^P7&cm++>}?;K$aDfilo=_DMLy|LG%P7 z;|%d^clax=PkiE`I?_%9@|dOs!e7hB>Ev zc1{{T!5I(wxVCRG`sIK8;~8--*mN(B)bh1rZG>;Ms^;95jTu*@W?yy^%ZXvnzx=PX`hOk+aiN0jW|SCde-b7? z(D38}wFk&!(xw^#v`-!Pjzz;*ZH76f`xc{rMeTJ=rN)FxD0ITPo=wO6H@|c3B|%Vd zL^!87ISc*Fut(o^&M=4RB>R)c;Bh~#ACP-UfemtInr)cyPw6{B8UpuAP zOp5Nt!Ah!eupO!7OOdfp7R@8J`PjJCp(*&zm_Nr}uXik$k@al~9#=Ju;qKou!Nrv; z#n77DnOjyA)_$-5qmo-wtfC)v#wv8CBnbIqYzrm0hu={4mtIEf^cqkMsH&)orZV$X zR2QAWKH={`T#@{v=&Hyfn~y7xpSMUe=yR-7u0)YTR^8>#D2hv8As{&pvTd#1>C`JR zfMn396)FwWHtJPoSHLC&^lUX88!u@&y@rwAQy9D>VmgxI(E~!6P`c8q15=98otV5S z5TE2Z2m$EfPxt+Pj?w$gMPF-rt*K%S>#K&O^!At~5C~XXs3KiojdW1A8vPm@HqYDZ zNgl*@Sw3+XP!ni8RVV6&Onv&4B*5riabdb;=hMhdv?h%`qZXNz#}u#)>y0(H1C(Xy z4ZgV*t0Eh(Kl|8ZOFZ+6YZ|5qTWhMUf=$z~CcFQqU=l5)f^)~PW=?TlwfbSksNwU0 zY65x^iwyTTUO})|m7Sja8cR2j&EqLBuS0WfCc1N1-?9e%9mzT9A=_VcZ__2l;Yn zoY^Sd3uH5%vT|RSJ{N&T_~bd+kyYYaVQcIYT9e6Y5ywQvnvKpovvfeFTZ(y8 z(U`-f1^oQPhOeO?KO+%e8{X(#8@pHIw_bg}HMk;T5m%G{YS=P{CX{0A-QSyIOG$${ zm5PT0nT>u&Vv{Npo19r)jO@OL`TSUI2AQ89`F|5U`f7A0C{}1KFmHQ+AiM#So+$eu zK9b|GUe4ZINH`qaB-~6jn6LYH1?F#XX^wo9n!>(n0zwFw!NEu5J;%NuwQpd{K6>h= zf8%A=QW<|D@8=*+R%o(jyDqPHxg$amv@ou`)y;F1JC#wbP{Kcfht>1hvW^`tDK)wS zpnTQj3;|=5kFZ?98}SxcHTtfo_n;autT2V{EVCA6Ny$SR^0;xv-Tivf+jPVs7q~6% zYSs&;ajJ6aNzR-c`|e*D6=q7_e9@Gvw7Z}1g{C}ytKaKiGajDuw9rgxx?Bz3?rvS2 zbyeM=ygOlZ`NH6x^zdPpjoAw$__TM8+1d~cI*-r8`YjE+;Amc&=CclW&6>1Vb3(&w z5;-nxMv5P(jJg74Fx`zx59~Yc?z_l2`QW^BM4aiCOV&zfJn+U3y`4tETp2lWwq!MD zEp+CzOL zB#-6weHl$reAq&;#2y*(gJs5SAGV)Dr+T?O?6qu@X|ag1wIDpP^@jNr@P3%yrqe$( zXv8HPD9_VqMS#Xg|56XoR75e}(&!(iYCf|*2K@eP$&QRdO-x>mQl&_%>>d;+7^g=V z`>#0ne9YVNz%si5=~Mx@9eTx*h^oTzAog6(XyfU)W|7e#IUlh)Ee7eHeEmyGGAli+ zkBcMTkVT15eKSU?%Zy4R{VPM75(n(67kUEGiPj8-?XsP~1X*-35x!H?oW4;0^Ph6I zvC)#2#{{X>ZXx*ZsKTk3HZz&`X%mExHK8zXFcyQ8Vkz7TMEI21oZ=g7-p&{~14DoY zWRx6dAcq8%1uZPWnG6Ssb81R@81`EF&K1!mf63PvosJ15G-560g!S?!S+~rH-F-9b zp?r6-IqaESkG($-JxRO?c~!E~OEZF`am9IT>GcGghRR7S5sOlPMj`XcF@?QxX5hTRQrYGZuYo zPDydO%~jD~E0^5&kjKC5afz%M747ajK_g78(UY27O9u%3x+WVCBg{t|7_wrK?tl6A z+xO-rY5!>t-$y=D2#kA5zAuYvc_@GD zQyp8yQq5SSaYI36a)w=nLcm*enqooW-=Mw$alug`*nK1FLxUk4PHbGa0{fuF-0bDh zB9Y$L@1}ZOV9)D!yRq_!=;huU77!hm7y^#>ce`n)J17HWdt)d?dxxO+NE3nn6Nxb( z1OxivBXzSiS6ZK$dUom`zh}H}{q5B&rE{B+S9;r^&>yNj2w^>U@l~(YOzMjcE zc-Vi^6Idr5cm%J;?4<#5wo~qd_Yl@Se$1oL`EsN!TNMSx=Hmp@o~68QM?8ic3m%zo z=tGC;#|P>Ez_!qw2TN~@^n(CeE?}}hmV|Hp<_*eTO_)wsVpeuv``5?F4Ig_};_~jA zFB7OR!FB6`ZcD^sb$Rs87hjZe%%Q)JY3*#w-~!fy6~jRzAgzDdJ^x4P&?Fm;N4aKn zmZWy?X0C}Bi}3;oLq=Zc}D`1lDAYi&mRXU9n@BY37%3Y z<@2w(oGpwOH^~=Ap=4>kRXV60kYj0T4+s`RHpcMlN9XbKg39d}y2x^VBD-grZPL+K zm+Z%0CG7w*06~UTa#QKYH;y% zhEMP9e$5k@6rJMC%!Dl+3us{iLQ!(pmGa|?@7e1vN5#q9TB+o6O_P`9JSNu9a$c?} zMLiHK3L7i&<0b-8Q<~#a=8^nJE!QfLZ|C)5IG`=~M!VS-BU47`Nn0_jGirnqUou6x zV90MU8_64^)~EqRh3+4s{?!9Rz;O9|J=eP3=GSQgsIF74VlVo!>tUbG=-db86F>5S zjx1)5 zKf-a#n9-yEs`U0>y3dmO*&8;TEq&ya%)#JR^4Iz9x+??M90Y$>B8t=O_4^zqVs11x zVE|jTW{vbfqw&p^D{ok_f+-t0IIS}A)VGeg{R=MXXYKYpd9}9b8%r%RcS+)0Ncg_~ zdW+!8rS7{W`>L&5Q6`+3o34rq<;KPu>FbY@Pb_`*(MKPpXVyaXSWxq$icK4kVN-8) z0az+NGISM#RZ936Y^{O+H^W}nw*j#+&kw=ZZ71cKI3 zWNL9rR>*0GCJ00vxG+G5&Y8bS?-C`U7$f>52McV%pYn!xluAEu5@uMVmcHo_$+U`9 z#*16mt&Zt!%F30GzjXL`TAlLgOSLBsSN0^?GWwstoq5-p!9bHOO8m5{vmDqE!zh9WP>vrXLWGM`&+df0y3{d z7ePc~3b{>|U#f^0huQWfLLWc)`$EkP0M+M$wQShX^lvQ(yp2lEqK_7;ZqXc#h76|@ zdYS#=)A0ul^XxTgUS=Wfvf@+=9Yc3hx z4xap~V~-d|VSv9@W0TRMA>b9F#mZ&JcsJcdcDaN?Ay>wkW-&ugd5dkZH&h?Ifg1Pm zsOOz0Pe0H}rdz;_vs`zQ<5={VV*{kDd_?IkASz=S)V+IV2{e`cy0(H^9omGWjK)vkL_z-W2jZWRwkYkHQ^-RTMWw^-P!*JRr|UZ-yqC|?fwz-DETs+v zZWA1+Cs9=|qB0m(TSde@Kt20t_8Q=W;jyRcm|C)^YUYUa&V)?%+XUI~mb3Br{Kv1qPIlR&Y~L5C7-S^6p}#5h`DF(V58udauCN>hjo#dsPSt2VbK!-CP*|nY&L~E&hmo7$h$2;4m=4_;LR)sy+ftZ zb4K#fmdr%j!u@$V4UVR)C6L-<$;hC%IV1YuL1&gE*GPt5mZlAz;;d z{0VJZrL}9RKc;$Mbk0wWca+C^2P(XD`u<$17k|{Oq@3GUd)}yrkhb+}xR`LpTl6~2 zJ!uRa4O~MSoYLulqYWL74UP#7nQ%k|oFTlR{7C(dy4SQqfjGEp$`KCu%vIm`IBG|B zZ+v2P(bcihaTgDBT1Y2=kHe5U%{7@2zIxh$%T&@U=2Pr(NZ)3Yru&HXOJDlK&Ej-+ zTVghL)9YXT>d<@F7~`4T_mo=Y)x!qnYu|^ID4{b+(l3ag*{<;zjdmSGtmV{h7E-y(i81rBgYP(XBj!);?Xy2ADs;}SB|@h+72Q=UnJ?M z)XTZ*xO@9Xce9!+*K3xz=-Hv+)M~Q|%7YZK;{R--q<8Cd?yp3!?mFNM9!9LHlp`QI zQ%UPf7t6H=iXFnz^ic+QM*|$#G-z(hw@EI@qJ?LRRdLhg&qaH=s9alm-^VzDFOS?# zB=)__i`V`x;cI%SX*vFAyrUe#k_d&KWQn5YYdV!Yq$Mo2 zjqymGStMPz68&9w-AZo#+*c;_5!Uuox7QV6MXr6l2QiaDd897~FZe0?Taw^pp9 zUVb6UM)a)60!zq>u7{M-#h4n(eX({eFzy`*w9y90&FMyCy2)mEcbn1n z=J#93cYm1$Pxtz`f9YeB_7nL$y-Nnfa#uq;(j;RIgQy!)MA(s;{bRAOSZZ3t$0h08 zM%4STC4Im2|IMxXzJQGyOKK?Tb1-{t!_{F%za_<9cyH)E3c`X}>OKW9_a`&1QCG_3 zaeJ8aefbm1hUdBR{*pJjBG@6nUFluyel%=`^fIWlewi-ES8Fn&v(fG^Gw$itn=|p9HRr%w!jSE9|ZeQuWEC( ztVY{Av`3XcQD>1Y(!ifrdo#3jHyo=fI(yf@Mg!9n;A9Xk69(z_sceX6Z8>zW3mbYj>y8}V4; zF_GjasJqUBX~hB}2x@1EuhqiRK&5e>KsXl zx~9>lk$#Ag)du(;%Em}CBUHiqa4o=XVlFiK-%S*#ErtfhCH|Cz2;jPKWd1?&{F-4U zGgCeP{N#if7`p`+-f!TEyF>fvcY=Rv7`3(_5YBXx;#l;OZX9}U=y}lW!VO2{PApZF zD_}T)N}S2&2lPn&UWTIIX;i?+%jX}$9w>dwEC-N+9CQ_Jn9#vaS^FcEHnUc(=cE3C0Q`K z7)Gok8ol12`882vSaZG18E7#^Ja(has5hvAaBwJCo0EgUIg@<*sXOmn?+GL>T4=Jq z-4k(MWEXC_DPpZx(krDi_CM{;3tYys$G^v95JfM>;|ZBS#TJ;jOd6#d6q1_=@+LLY}hjT)8xwZn=su-HV#2nS*y)Vq+&VMRY^qd@}R(!K88PP)1DB+>RXUf*Yydu7{b4Cl!wcT5KPfS1^D zqh*gaNCV{W2WvYZhfw1VlPLN5NeXi7tuH=pilmD^_xid4{QQ{h(_1x9qGQbRkPfu7 z&SoTJ&!?h>hhMnuHZr_MaTuNBPi4IwZ!XkiVq$4sK&{uf#i*62v>GOwFn~#x3c)hF zr3fYF!1azyUFeQf(n+Tf-`}0WUIp1!u+EH0pCPO0^OVDf$?GUfyvyl*hI+o{%ZhGe zJ65+k%w?m~V)0wdPBZH_7EA%75M%3VArKd8`MSXijaFKlkl`^UajLt0jLUd1jLGQ@ zXtWIjFsq{fKR`haAGVY&)*|m&PadQRvPD0M`ow$V2HxSbH^o*o>zP?x2^GI_G%*E0Y%OCR4E|WRZv6(WMcEYZ*;dgxojeHrSc}cdJ=XLtMyt_r=FSb0kNk2&qjAmZ)|T1^ z^4~eIliBnmLcQxu23Cs^ae@4BTqB@PMCYsd?oaAyOh$y%a4?nCx3OHl6 z{?XcF=9JZvHa|uPmqtKoUZ|f}d*0m)crSYXEVnQ|*|OLa;bOBGzAIa~ZcljAO|Z>I z#DrI(*H2_D*%EjLcJ-?nXURDht@90$0Zs-aTgaIaANCen-Ypuh(+mr|Mc|pPQX;Ni zX|IoT1sOGL>;P5PgRu6CqkXs8ZxFw4P=z{5DkDT+sk0;t;8#|tb7E_OL&y00a-8$( ztHe6>-3OJAA%0igtfypkqy^dlwb%Qg%f}5fmuRlJ`S_fx>57Q;2f;XOZy|Z=ZVLuF z2nWZfJK2@CF}kEc&P^@WLv7fwBOZffd+sVVYOZ0)KU&)l`s$wRlVxbn31 zjx}7=Xz&;+iF2ou+N@q_HW`Uo59pwcHR*Ym!66FTf+kle23xkWtI_?#Z+`QW$^{ox z7;cOYo4^;_eIq@6-v-DuZCgi9&87-hXMeep3>Pk2xsqx{XfWe)yJ8&nF9~L-7ItJi zy7>=NoK4R^0u*Vd%ezbsc%*K3gw>{Rx%!LRt1KN=u0|wDH;l&kM@^M2V_`AhS)`X` zP_e=XWyLKzx95YEM9~DEav<=e$PXI?3sQfUxLF^|YL!~O$ru%r94MR3#;8fKub)*kX9XhmU z&w&FJJj)z7uzmZj9s` zFn;qzI+o*2S#c~_QR`SMxQE=JBrJWW94H1yf+eYoJ}p8STI&04x_;wqbnarNP_$;U zDT|QKcz|pWv@6W<$M|fZl`wcUNm1Y(sDQ^#0-eCu2@7K%50k)N=dMKn;K!=#_CE-!8 z!Zk+nKKHn16fO{>e-UW)o@MU)K?ONUWg*u~8$g|CM2=l1 zHd(oxXuB_y-^@vmVSdzwp=dtkEVGWlBx<$6SooJFuhtH#MT3>sn3N?|07Be$tdjB} z^hZq<(>CNH5mg~N z3J#*NKePml_bIJ5n-q^z=F2(`4{NAJ=6z}3d?vGR^wld1>x?s8q0z9LCa!HrKV}RD zt<`B)@SN!5wI-YXEIS)uU9C<-5TOSZs(X?`J_Lx%&nHa)uTSoEcv|6bHQTu^=3BpY zix?6&Y{rBm?63O0%M>e^za!>J;6#kTH&R^tYT$a$MAh@dsJKvMKraKAO)2e*$_7|Q z*&!jpM#)1$bNbIMc3G65jvCe;R=8Y^@lm6G-nX6oE?|08Ag zI$dl$P}T&XbRu#dO7^)&%W8&SV=bmA!UhDB3BhJ18ne^lY>|mEL1mukG@q8vn*rn8 zm}{JQs8;KS>|Bg%Pk4S2A=gfuvL$9rhpp6tFf1%%g4qhid~dDAl4r3paF#7L9vVF3PchYdA{?Y zAby~N;(9NP2@b9cm;(elf+*iKEN=gbQY$PEL?iRS4W(Di2lfkmzrknZ6jT08->LRK z^R|XJbl`1_pz{P#Im7Jg{+_Zwdh8cM-VTbO42U;?czWWAKX&ha1VG<-)ZE|_$;jxH zfvcP+WDb&(6Kv2pY7lHGPrTs=83gnk7F1u>WwJ9Vo0}o zlMvBan|m@rA!^&XUg-*k-Hxn~i>%&!Y@MH8zkTC^P%|HM{zqyXFKw*Ux;##;)(Itx zRrhfziv@aVwM`XO(Y>&KOClz2-M)@|YHfY#j*GGvNpEFY(emWQyqnJolerNL1eWY( zbls4U&KFF6Fhb-UdFNG^*s9K)!k;NS3k{{RIPBmH8sqR>fr}?1=o^G&o>mQRlx--E z357g7=v*HQd=v7ACy;Fd8AnSkFl*p>>+LCt^x^U`B%bst;CczRVwtj3_94H^IcG1E zAJC`49||zI4Bf@v6CGbQy^VOH={fjQdPHbpbZ{zgG37!vb`%~J*(y#0wp{*_9s|6C zbrGf(7rY8q8=ah(mG-yn?dWJ|jO;NAmWbev8cpg$E$DSC!c0* zcBeUNataRS$@~O(d0bAFsJHPRjedCj`oo9U5uP;=2XVj3YAu`G6f6>T@8WLAeXMxfi`Q=+uld#%5+MD z(lI759IN7#W-37Cc8#NBM9)BP)-{Ig;(D;&-7|DQcK!Xx3YtSM2e3#9<$6M&1-oZh z2ha=tC=P5~NqGWYF6F=$EXTluqyzgZpMzkpbWQ)5rk(iJ|8LN4DYd7|fiCj`nN@s2 zF|WA(MkEX%aFSa+H+65xXj~qTE};e1kePnt!IKFrE|M4Ml}uzhCq6jwnCie-#ptqk z+j(N^s_X_P*W{=6>VC^Hc7S4gYYp22rwuYV}{gLjh+(9^cnQ1@) zGx@%}5W9&=I6}{|oPrE45QRM=e(6w z9tKDS=FoS)`xW`2W!)n#jaj8pFcTWBPU+%wsLmO@qE-F!%QAudTiw-5_V`CAPd0OF zGPpsyA;Z_4QBO;071girrJS^B(X)0(HV@XV#|1{c8NFB^uy*w34LU=L)reC#Um*%A9zEO* zL*^7FPs$ffCz-XjZujFE&?3aeDsyv`_4|Fsl+hpXNC)=q(^(<`L6KZDrSW1~FJIZ_ zS~~8sOXZ=CixPedC0|QNXQcCd;H&fb$HqsqE1-B0j3t?_tY>3DF!xS>fl$(N`p?r z6g4{Ijuham#^J2NZ%&$1tSRq}`bK)de#mek7gU%M&s8|P5=)^skf)`w8D>TI`HZ_G zB)mvLq&-tVRNg@z`nrl3x_4kW*5&e#jg8aFoMAjP%S5EtiF-`iL+)k9`k?+(azff| zwp%Q0(r6R>f-vf~1u)GmI9g8L;}8~1T392!UKfdntpTmW?FMOC>*_S0quBnG4cPvs z2U{idAnz3IVYXt9bpMgE zPcLnV`FGz=a`hXx$UWGLWsNRJKiBKAB+==$D^U-<10GP$58(N**@I*rTcJFXHpthN zrUpTRV1tI70-kghlfDid+MpXHW5z#F44l*RMRI~ITN&15 zWc(eA&oU8ByK1@>#2~#s#??Kk#HiV?55`k`f(!Xw>XpPubkYzrGy@|zd-KgV9|8mh z@UOb7M=uS&E@Jd>*=oxh_vRo)^O@&wxB-ERg4~TkQN@K9KKOBQAs%V05WT6prB_;9 zC?uMpkc)=npH7N3Sz-VRpI=+fuXd%)&0zI!rv#?#so+vx$Y&ykl-3gno2!!Q7n{(5 zNhG$)|0KJs!O2iDH2KFdF!2CV$A_i8KD1*znzoj+x-7*^S$4uTTJAQ z4cBPgU(9B|5({tGyd{?PtlzecVv|_RgO15q6eH@`5oGMS{v`CVKq*mN3bZ(_a)Fsn zha$CrucEWew1$HGnr;t$swtD&k&VMgdjcW0BU{lMt)W>bZBxm%wiLDE@5;FYZYljf zJqTroJPA?JfZu5*?Z#hC!ZF&f;7`SA3|Nb2YE^g9uDQXk-;I6qDn#BYW2VLt7 zn1DC;wXtP2$pN#8^8N9Bzu7~vC~`<4*FsSB9Kas2oES%x*%jUga)hPB`VU&PbT5`; z#J($gJ!5jaJf@_tLcTG)f}DV%oR2?9OVKCF9_Y)`Z{M8Vxf7HLMzmV&BiT5&>&*iJ zL4T%Y+V-2*UVQO|7eErfZ|BY>I&F-3AF+&C!riy>^;?gL=2p$oUaS$b<9938Ln9E`65@kWUt!}`d7krW779w;GU~r_8kgYLvHz_%e^=_pyf|OHFDr(2KYO9O?wBOMt3q(Q15^b%o>~zbwG&2 zk4l{6&>{k>2=9gbyqY3HQGrHJ*i5WmdyTHch+Pqeb#f(Ph zf)<0IuCTLtS*bM=8Z%auI;|yJthm{zk&T&MIc;oyK`+k4H0F3b(t#w1r=*QU0}_0^(dHF5l(dpIG`^>%+=@UGmjIi6nn*spbh zL(tl@w#Pu_MeiRc<6XBQmQ={yJIYT+^`nlCC2yCRq_AJKW{7K5rnSex`$5x(=5+mT z5RKMp4p!w5BQ6J?74-3AgPa_DFMkAvFYm)-8elQJisCcd0}#w05|I<>L1}vMO2gC$ zo=lOLUut)olAf^t+WBYeCn;kF)C(CzjzsM*DJ0$c<|iex9uw%!yFMyAKD%8HXo6xd4F&(Q6nrVEmW4V$Yrjx8QL% zoyx8>gKe^^6KXS06$(2}xbu$VcgU}Io=~kuCtV|Ay}Ms;(TDwd-p$=!8fltKv6}wj z^hCYlFJ(`kQ{-pXC-i=U5qR;=Lu0Jh4EKvEHP&w6jC_h*)8Mmg)gA*mhi`t>QX~{! zw{9f~jeVw5lAjPa#r4zBDI>!zRa4C7N1vZaP_^K5*(uC(Wm6b5%)>MaVErMn-mS=R!V*a?0Q| zPb6lu#~nwB=uYUKp7OT*nNUMVsY3mHU@<*u3W))>=^SS&?e;(S?)_)G{i|Z}SM9d+ zXfg?{AkimWS*aL;T-7-vmNBFjG-OwKI>zZtMK7|I%HyTeDi+KJqP3bfnKG8jX(ij@ z<}D(h+@1Th>(<(3<;$uUSD1S!0v)*8zf97`l71r5{UspefXKu^{O7vt-S(d^du{&Z zi^*N{Lng%h9|Dh;ez`a9?z67e(I1}&=JGV$Hd+~xyX45Y9kzUMDW?`9Sk;WP{L+jHJDm;E%RC|H}12F&0{fZ~j}2a|u>emCfJNn-PL$wHRYQwnO5{ zTRSS1o3>WAmUogom`{Jn>Am`LS?|;R50nP(XaI{D)Yd}HfBrd~-H;Baw~#kleAGC` z#k+6m^p1iv>P^^%yd#^~9DV&tz0+_flO0Xc=iqD1SKH(DsWI+0G+O-0GW(pvJ4v`VqIu2WNn0_CLN zH}3YhrdlnkmuNuwQ52aMvsvi`EuFwIsy&k=me&NWn}Wx%+aot9oIKx*o72kgy=17X z(zC+aTu%CjG298OeM|Rdvrm8IBb#EUMij5SY-lp!jTwHsxLep8yFnSUX#J3%{`5!y zBS4^`{)jfb=u*4p{;IN~E!ht zXTZ?WL+ld@hI1=pL2+r-+z?Jk67kg{>Y7?~@k??nC5J9Deoc;W*^8pKm} zjLxr)W)^Rdu38v>>DI*y_pkFWMSk_v=;0Az0@#hvUuEXQ=pm&y*Cue?nwty z`@T6|_)2G8*{`3`#i#d8L(s5jXrNYTkf{=e$3yzMPXAZ3|f-hTP6TOHc6dG-L zVM~TM!p($(341qJos|)2xkZ;^(&L@Z_Zz-KGHT7tk5(b8>g0u)V)BfSTsPqu7aU`b zbG-FHRh9F&@_KW=2~daXQ|m*dq483>HX9G7J?EYhvZA6L(GgBu-VcL^0e+f6GoTArk=K>$uFcdd4)dfGe&nP;f`-FH;;>FtH!zEY$AGKLTFjR5ORTU zV!SD&cebvs@WFvSX!a zwRbnDVOOYwl%x@4YPb!w@G5Vz{9!m_5EzxQBD56IyCT$EqpidYZ-T-UA#8SHQzduY zS%JWn$CeIXX=Buc`9IRzN~=3yY2kE=?6}Ir0f{-}X<4?mx<49MX|c`I!x}9as(>NX zTpFqR;x3aC7lO`)4J)?cTUer&B05%n1EUy@t{`u43EmPhwNKx-&fA`NV)t23<=T~( zt}=)0)?{xkvKZZY-2MW3C)udZUbMd)a9SOmiE+2qHa0UW{bwOD=U;hMs}x*Zzq1(L zv}1cBt#i5@T5FBJ(p3wU?74Kzm|9m!@1*BK1y1klaWB;HhEzqM3M|W>-o22$;8Ev8 zj#qlV&`abifZ$2!UxVJXN#EuI(9|C=>VI(XA?CQ^^_4A=(F2*>yvs44A31wISU+Lo zxW(pV)LWFqva(P*^k8dmM`C7%S)(2z2T;^xP83IvPjBwmMx>kWU=83uLDvHNJ~q4^4LhU zDoLrwqu=MaVxwkd`BJ6S{qd-)7MR?eSvOO$j0+3ZHD_Qb9f^;3a#ti$Kj7!9)q=@p z!8{gSH?^!Ed_40utO@1ysUrv2AW!r5VoFR`%V4ii6jJUqS}&Uiei>1n+*uwJTa-AL zM-FW7Y$6E6*+hERx8Kxwmnod3FGCEoO%%sBG@(S&RIsEH;osRsbfDc@i!)%f<0vUG zwDY%4vS^vrI{e{dD)uB-Ra z(s{ieoo!UQCR4m_$rN3?G=F|PxD*Xr5{cMtsrj+GJH0wI=9tar53j3ReRK1(K80)L z`qk2V6>BmPVM7ZG)86*Td0T>ePdhZCF=_NZpG&KC`Fw`#@%#6s631Zu6_|OuR*r|f zs5U}TgrG`081=`cmjz{2bPyK{I`D2*EOYPo2ke9l5WrC%+hJ`@P3>!}m*d<ncmLKIdf*t^xk{#Gf5^r*<^d~g$0&{-K8xn9ha_DQHqKpsGx`_R#Yywt5;Ef zb`dOG8-L5yYyBxX{GaccNp|7h&o8@4CS;OjzU3{?`@GL<)Bv79jRdke#NaoRYb7K3 z%hU~5UR?2J51e~`b?Xzm)fSJv+crGaT{HyOE>1gC&Y3mq$toK(LH(v3ry|yDA#d## zH#*CgHfp(Z>b`Y*&Mv36$AmIe+HI$}LV(`i2zZK{p!KH3EVeFYfSe6v8+8fUfJdnT zgC&QeC*)-0!$cp(<>NN6h~@eq%NWGGh$89A$*yjAg{i1NJ;7x7Iii=$@EIr}otECva z13xz<9^1F$64!{1b6IW8xN|gUEpvR?%K5aNU4b&mIm+c6Z!;&0buYc=>Q$3iUy7^g z5P#L+H~Zk4Eu*fq(`9%`sdc2@RCYuRjjxxHSw!VPZ=k=%m7Owl^6ODC&y9m|;W%6l zHcLs)lC1QTwTVqdD^3gzpbk--6CQ$52W#`vTW2gz)x5#+`O6oG?LX+mq(x8TE%UzM z{M@8;e8fAtxTn+EyKW-bDqMQQ-ScY>#q4F?S`tHR7AEW?S6_SF&ogcy9$NJH);-ASPRUFQn{I-oo|fVV2iS>__HxQudl)w%GnNiz+M-Gx+ooD9&ERz|J#)w z>5#w2%$`s-5U^!4QR!Cb$gqJ-bxl32$#71aI8~dv^73ovsXNr_91wC%?k_Cf-4qg5 zYw%mf>>WE*_UU!&5h3Q0cND<$Orq|0K&};mS3ekG4UF7JqiOn@WqOf(muP5+YcE%0 zvDNghpr`gsD}x`9jrib*cxmYu7Z2-36MouwiGNVT80|q(ENOW*jqU@45_o%)(&O^1 zZw0DTqFo>lfUWzdNphcb1Z}KABcoI)t6lqcI%0l4b`!*%B2E}?rjOB>O5PRZIS4LT=FU&1TK2Y(4~4e(+OIt4 zOpv!qCz%gAYvml5X(#;_N26J>W(qrFlUFth#&~meA%6B{Z=7JAMpK%%rr3uK0gM5a z?luMHR?qlVzPZJP$$#Q5DS@Hgp_oCwUBW#&L?`G{me6uYfo@hAfsrkgOkto7kIqHI z9RobGjBc%1D!K`ZcMYWN!>8Gy?*n! z#$Z%Sr}!&2i`h()&t-T1qorY4qiRfT=FGXgqiJKO(lubMPQ4mgJ-v}i<#w!?n&kuj z;7el~fDVcYd09u=@P~p>=2Pv=vpb(FNcW2xyTh(c*jmWqQ|L^Onwyj6+uhL9;OeEP z&-QTHV#Q%|)GK-E{BCT~yZw%QTPXAvOTqm|j~7@-Jh{DYEy$TJ{khK_b|ho*ubATf zZYQX8O`%f~7ZvMyr(!ea)|hclX>FQj$T*K`tQ*cFx@`skz_2PLNBgpi!|{}tiI#;} zhUzt`1~(n&P$ntkGr7$YbSgN3Bld_z$y+T^P}T)|zfjCq1)~`!j8W+KAekddm6{O( zUeC)DDmcAqqR=rr|L_Ot-O(s{LAr-D=l?)1l)TK@nS~6>!Y1O~STL9jOHb8O^U=wR zYt8(@X6&LH@0@@RiP#K&IXBbH@cvvX{WViye$7Hy9bQcq-`YgTf5v5-b{2a7t0Ll$KpnPiwE$)a5a9yoIS*Hyr zjoLJ5{w~|_>lrmPcfW(tjcVpOMzdM9y>4>at?G_BcU9)V14Zwxds63JZC8RI$*6Y# zN@JAb$eO(~OXn(#oG~VjI+I!r%_3lZztIa6Ol@f#(4S-`*vUN9dloG2^X|j3l=WVb3Q|B`$UO+YTbtx%lnh1*r96f z;EqLy^r2jEU8$T}OZ`>~XQK$+>A|F$x?GDL_NEN`Lul(JwwntMJk*N9iA+|J?b6_? z$zRi}wj9AyH9Pn>xCKQ~X|nTZyoz|rtWKwpo|`3Ke0Fy7yV50fHEYx{qe{Ke^5rq2 z2jz4W7svQw)e1>g0oJBt54)@yH59slCn~ohRnqG%A-{(tW@l4uG8s^+nQ8QgFb=;@ z!yJ3%KNXvnj(CdXmr{Yug!QRH5et&Y<_?*d_{7ed!8S5ABYmk?ns$16y|yFc?o6!7 z=k}a^e9VZM270mMzT&$F%<)VHbRiT@sXg+&dV^vY_~Ue*IeKqap%h1fM(7h;4k^0G6Hao3qw2!u@k<%eB{6cA&CmZVH$f~2>f8& zVpC3II-l{s%Z{u==Lto)TC3-V?WXAvK52D=&+Xkk@g*hmf5^Xn0Sx$S8jj~u37^8E zcKUq=gyiJS#6KO?dX4^`gKuPu7<|dAE+dbIm}s$V@nly&?rgt#+Juh3)zZt|_(C)? zH_;JC`%gamg$=H@AT&L()v-1Av|RCM^52*%!)ubwW@1f55^0>J(`w*=r_o-DyUVG` zm(*6x?8%%ypwFIFs~@ga1LISxld^4p68)emMCKxN66r)J812(6(B(=Y)!D*PlC876 zx^!iRSq{B))S3_DDA`HUtR3rzH2k8=GdD=@`{mP5e}nw`TOa@UkC)7oM6Xq-#$kgD z|CKk2V73aZ-|N)WSwUy;T43lY;T|`aXn1s#loh^c+=$X}a-7+GqIB6(YUKALFL%2y z;}dzOiOEiF$q@U<)SUEm6LTeml#riqgjG3K!p#{R-7k_C*O=%ibmoK@+3Z+T;M^Ghvp_YRD<3DnWZ%h!etY5=G7WN4|1OJ zKhQa5%a_0W)1OY4xw5BmUSk5j3d17SNyVbs0U*xNO*hT1AqqyLfp)IM(EngGunRrm&med2ZZQIqAJm*`%+KiCvH9Dr2 z(KfI1HE5f6Zp{MFw)stTyd&&S6dbuNsAp1THrhQ!=VXC#O8tu*QLb2Ms8tPfW;3B4 zAFh8{X@n-jG6|ddqyHeDIjJ=NFL^`Brp6dAx+1}fFCFy!X`NDMHckPZ)c<&$Qmq5h zs8&dSofbTHt6|LOaEKtAmB=@kO~<8=fDm%%8LnXi^2~RZ-ca$xqv>G8kx4|`T6MHK z7S_A6xl%$|#VB!aK9h|l?a_EPAS61uFr$K?k#`oV`DVxqL1P~@nhfodl^!D?bBeeT z@;m07ix(qC3$IgPa;1X&l@4uYe%v-Y9WG17>T@}y=YF9ysxEgmIJS{1ym5y+GBr}+ z&(>1nT+-Dn$J95Ij~*B^1Wav8Jor*ysnr|R9S9g1q!$_{zsIEm4Eb>lDb1_Lk^u*rW@|E}>(0G%!+3dMf2iCexm|LUCW(VXf9nVXLWFZ`uWCwNhxNEjeg8L`!Eg=dhyT z?C=cElke5H$=a55+9g#(SpeQLs0YA>$tyS@U!4voQ6nF&BcbTPaFt<=Wpn)6)g9CX zwiUM?aZicouFr10GW_MQ%cECc`f=<=U{95B$JJYUY?{lt(uvVxSl>6h$h93I?`d-` zyYPHZW#)Np8##?x`rC*jXdE|&h_%rv8!lf%P`RjqRMv~wHariK@_g?9$QhRSL zQ8>snq%CAb%nNnrhW+Q{9p#-%7v&pkGjV4so{R=+gM1t~3I^&MP@?sH&VYQ6zKF=&#)6->V zq#QIaedrIuY60!J;K`rWy`>sEqC?xW=_-8n~bK1#6pqTcwMe(Clkn5M7uK*3>UfB z)|7=3yqRslCicZ^FKZ@H)4_N7I`|6<_JRfK{L($+fPP&0em0$*okJcH#*}AwVQQcBe63Zz3_(HCn9>}3Oewf-TLD~!7bfy=-s?VvHB({+X`OP zPy0qXb!PFmvR(FpXR;N2ty)w8#()IGnQ@~Q=eNMaHz#`l$j$yD=em8^s$EdB0WufGir`=Z zBtbW49FJslxQ?4jSpc*=f&YM&!$;YC$!C}nwP<2DTxC>w>q8s1Jo;tDLnx+*7IF~f zy%2BC_E-!_Q>fHRcgDc$N#H{1E#$61#eT{la_3f$1=m&$R^O<}>GYV}wt&mNw2o;> z4=eSISRPqdi)Ch7dFwa7*V!tL3nA5q| z>^WThNUuqQSDV8@14n|F!>m`2{mMnQ&c?$&RdnrG;Rk!B}ock8_+lPJS>gePVjrnGM;rTjT0IG&B_T_3yr~ND`V2o;w_n?G2U7z z#?LuB7S>}y)3_2YGs$t|5^ zK%YqxHHMg^E*wwqK}+fWR-{{sn<5*?h{-uNIptTm#-?UrV+CNGb-ACxfOC3qcv59! z03~e-53D3G2v~t*php?j66;D`j?7D<7656F+^IeoDo7nK7ExYOpr3TKS`0vRZXed%BCJW?;r z1)3L?vz1Hg`D2$~J8BMLzMpN(`(}SD>$+~KCgxKCjf$)#lvBd+4yT^n2zhG#)4lEE zWqWw(JIt3Y(26sKr>>o>Ze|X=TeN=dmx*Hw(nWm#);V2Z_3AlT*5a$DfXNSZq@V60kN3un92YnU)!l#Et5@_H>b6@p_p{?DNE&oK zvnajP^~H@{W19R%dMi21yt&CIIX=NRfAQfDORju*HkPnQBQbK`8>0TSR;yI5H)t(^ z=0wZflFkcr(P#)`O*>@_n)my8S7>yi5S_{S3R{_zW4ND5;16pRPH;CSz*;x~M&ppZ zG4Q~!e6pXx%NejYXpRRifb7=k?Zo?Vsg{!{q>eaB_^C5}`5C1fQ8V!5GN`H^mOvD1 zgVl3mj&8Rt`rGHnv;eZyV$PKu-yIx@Tk_YY1^hZm_$k8AjFYA?yIAElbRV*nwaAC3bWO!7USgh zreoZ1iwB(AmQV}o94?p69u=zD^T)j%bJG%DaQU0k#W&vAYPI?e%rM|nLZgo_m(Ra#={2kF!p8T!|3kZRkAx_i0d3b>3Lfb#AWn@=Wt5B86SEP0PAZ{B z^O6X99u6@-8nVTyD#;u;v$TUe!nm%3PU-V!VVp-dwzt*6 z$bp6swKr~PE`6+KO=r-G6x*1KrZ>hznYnVbxiRXBZQh=b>@LL9`cvhY&qC?X%VX)>N4)Wof?@eBiI9xf~WBfDb6 zG*}$?wZST_M9&2iZV`rGRf$5aVjB^iFC4Xq;hxJV@GJ!cCC0RR{BySxHQ?ymq-UT3 z2xwILcXG>L`j~0No0vaV`zAO0z>Lz=(veOxr$iZ824?nSH;@bo6XtAd|O()(`C!W-K77xt*{~G;?wI(#^m;q zs2%FPR#yT1Dtbq+hn=#6MX?{9hYv!(M#hh2{x?P=&;_E2C#5(7ufml@zJLXQv63fb zQbzrb?7E~12r&1fbYdIpv^`))7_}^17Du46> zSD@(MwLasor2K{x-1_|!yS}UDd9xDZ_flR(Gc~F<%vjJQz;wgjZmS}=O7(6y5@^>- zqAg_+svf9B6(9J%B{HsSV$$=A$Qy)Wwb-J)4{Nw{V5#>)}YsOqc1hip30 zW>G|(jY3e7t+OWtoev%G?9z`rI)5}}b40xkV^705!w&Cw&{MOQY_0Lxh>eR|EE#Kg zcgh*}ImpdMb!uXJO=TOKn_pt=!5C&iZn{1k=*1dF2b#J0$wSG!m`Il+kqfT7wXZg* zgtlO>i|32&fV4h3<@EzBSEI&v7pgy2Fk-!^@(p@(URQfT)o*a3hcdeg7zJ9jq<)&R zkL#~Bz4F1J`;Q-@B~Ka&P^UyTev#Tx@;%9Noyx`bShw+5d@6m@)zY8)&|&|+GEQ zG#PYQaa7bnQO|}pvZ1(^#;1zLdn%e#D%OTp4L9&YEY zz3EYDiW3@Q38$J@Pderk(f%g>)NMqwK|^jKpMb=MhE$K9y*=PtxA(kyX#1_DVuhI# z^o6n23$sg)cc_37tVolJkCFGZ(e04nKk`(1(p%v(#fqzkQz15Nz2;`=*62F}WM7aaDJ&(iZ10gk=_@grTy4Y0F25J9e@W^yHLJT2gj!!kHgNDk2$S4J)~OnhXt zl)~#w2p!`T8ATV#(6rECi3XxH@gJ->?*HpwgD!)`=C!-TDCg1xwo++~nvO=VMG#ddSI++GSJG|Yku(06 zeqBDNlqzoU^)Ibe%9mbq)8zM&&WcsBx}_Q%&4!YjGU3MYZ}jFnJz>VT#nU?xjUrM- zXEf+Cta~^4yL)+)3Apw;qMR zo&hUy=&?}`9fU#4KAVoO!4jO=G%6!FXZWH)aEK?-wOa1gSnl0mzHxBLzUR8@*cewW ztPk{y%*^&%lhEnKEVlR;XLKIRsNTY|U!Br83}XiOD_vKP?Q&`Ihwa-R+O+AR?c1f# z@7neDO`G1nYZp2D@sW|o`)_j9Y`N-Pi=N%1AMQ)5L#e$fcXDIJUfUV7x>CtZ*izUR z;Zu7zrBerU-pWDdeINethx?C{2l3(Y$LTtN!}scSz)~&fflq;7(U*06)>B4LeHn_7 zUz8jqQZKw54a#cq%dcPdOv{MRN{~z!Yxw^1ywPXrwzqqxO)kSP5^M5=m45e!Km75J zK!5t?N&uGI>;C1G(rgtp9lc%PelSloi0sBSCWBsjal)16+H9E2y(qt3nwWM@lfTW9OYGque6T-=gKrz}tr&nApvHj&B1T-IVaZ?U5bH#uJPZOVsA zYnj{WPi&)Wpv26uJHheQVGTOSW3QxM7=bPW;RHL?kdt`^G6JkAm+S+}jBij_Mt+6C z<)E2^RzqASX2{fol@R+hEVEKm8E_9|&aahLa23W>rQ@?UXIQ=di{ezG6{;kB#!1hw zEy}d?Z&QVB&=Q_XUVl9qz5DLFf3);XP<8=(QEo3&3(2Z78Weaj*)E`hK zWi%qttg_YX@jNuCF(?(|a;^MUHj_`A(1S-NwMtQ(^42aZXXA70b~Y^=ZA)w*OP*DE zJWau&J=i#Ps&TR@H5jW_rP5kQC%P7UrCxKS#C$exp1CkvDD4{s{ovF@N+{UvdFz9Q zU@U5>I#bEiJJ`VV%%orCo{}Z|Q04QWK0~!_bx<6t$+$h8ks?n;UdDt6@ysCZK`4lH zcAyAEXL|!Cpa+ePOdOh}(-92KV&tF2_bH!vcnB3TVvpVE4IIM&y$@G~rnATdqQPP+ zHCa!a-Pa!uCKpHZ`Zt^c#XzCjjtY(LhtHZ)^@+f~dLZMK&S$y&+y!e>mRupviFuKA z85-_ZHEo)7AL4&E0p_Vi-LZtEpJ>NT(ob8SrmbP{c-((G23Co|;}+Evpe?H%UY`+C z@_Y3Hv$p762qqMXTwL1PaE{I_#`nBAF=EP&ZK}4}W~ZojW_Y&X{B%3MW~L*3@00%W zrWErH*W}GNT-WVsgV~1PmbHlyT`IKaoO3hWyyum_xj5jrW=D4Q{6`g!3yJW7e9TcU zq?zZ`ybd%ji;BXO_bM$`yB-pR>&+qD|0r_hN%&!n%s(CUXphJ|cO-)_cvS?9gL^FN z9Ri>noc4jH1$+TDZ}gf|lSebf}Pwd0ndk^AG+B}L7zN37)u7h*dYfF)?7<5?F8q}^qeBBK9p|xvj zW}nTY&}c(V=B>v*@PT7aOW4xxO3(D$*Id)?ld*2w5;6Z}wz2q4ydO38ZkSO_-68$3 z?+!a{#^x2}oTt@aQz&fTd;Ua4C~*i^%CWTpq2Nn;X9JP$@vgT|aYYw+k9)z_rJPgB z`IrZ`_-2~nQ3eMEvSWO{(S(3?+*A9U5~gBXvF-H^|BG(?RE4c+Bm zHazPT_ldoZA#g^31+zmGnX}eNAM|4&(uAktXpQ#$(m#k<9O;ia>bYyzCduwKh-?IV z)zOt+Fpb>UQ`yI6=idOG8NuP1@!P2GKk7K%c-rg?jCG*@QaCSZuaz^VxFwa086)#k z5JNu=!l^}--sN)Y5vbi~$#^ria5#)Taid3LEA-|Scx(ojz>BC7Wg1Ec(_no?Yzz&i z>0_Kunhc@TfNugiKf^{-OEU-FBa`v2JNWc?@Be8xbT0wLAxJyO5Zxx8!-dLff^$w)PKb}hK`@Wl;p(`D}p zwzhbP&-zkT8=K~Zghlx4(@#H@n+cu8B+48T^__ZgOof-j@-?ycYay2EIt1CSI7%r`M?MMv2?eM zs62fLWYHdJjp&V7o57sVjJS}VAF%F`QWCSv&^8yJoZu|XB+%!r(jN#<-^mo&dA@HA zDw+E`yIWh^?X9id9Y!m>Z^5@IRkuXK0h71iA92=$2ajJ;o_kBjtM~c6I=$ED)8FbH z4Fr>WzHe&Yx5zKvO#D0Rloz016?^q6B(m%(9vspJVw~;3SdR@gdnqO;XI{8$v>uEj zGwk!Ehk=H{E3va?CG>@DlS7}Vj2eba|(nv`q^t>>?lLyQFvl(teK9H7CF6X^M-l|Y*bQ(|8V9-1> zLl*B_O*rp}jyIdWF%O+dtqR0CoksfQ81J!JG$ZEnD^%BsnQO2$SC(`LY$qCb z|B>~$>>7}%K?G78RE*xJSNzt|wTs<9f67)zH%15%mAjnK5WES=nO4 zBosA7YJ69dCzc*C8@EoGEtz~Su5zYR8JE(ROU6TKI$qr=w01DLiTVWgK#f^(4=Z+H z4zCyMf5GzFuc*zfbhMX;*ftKOm3G0%8O#9Qpvcf^OtLK3`j?+E2pCSgnKRC-3`Yvo z+G@&C7+dDkXj#8iwV*huxC-6tD$sXOUqqSl4*u0umSSfzT9`Q*6&mC7@ls;VM3wzn z`?CxkqxgYsOSdajD!>mQ`q$XBz_%lH@b$egj;I~T&mo4Gwd5LkcVDYlL7rHxXVxDv zoRGeIRL`8X6>oJO3tP47TyjT^yf|fnYk&S$~nEb=F}(f zhMVt)4Ok;{r`upn-?Hkh&`5p^C^+@dl=nJV-Q~5T%pcj{2`ddaaT}ZuS`}qFJ0v7< z>T&<+qN^y1hj&~VnlcVCrJ*%FljM$FtA}BAWg3$3C(nKx|`pk zS|rzxu{N_wGoc0>S~{*z9l!W+q?o$!iZ}eJ%?J6G6|6Y6cK2#sXl{P$|CU1K!0M}` zIW%AtP4SCwykkObP&+yfSHt;X-&7&U#xhx(-<+MQB{^3-7&yd%$fY*~BT+JCOPlph zl}WH#jS((glJ0 z0N{mK*njQ_G1@(r7VCAGHw5hshtHd#xr`RIq&so&sD?b9N4^U^i{~K1z6O;~IS!Fi zSdKOo405w!j*ESl<2I4TCH4PT{BgQV0~U=&Fo^#s9BEswI?1QO7DSZ^Bf{3d>HUoA z18;d&_2~OwTKeltPd&w`rEPtSLWTcDh4va6au6*IIUK4g+G1@wo%?km2U-$v_lPcJ zDSESHw%NRMlbY|&Iy`0-G~x~QD%mJ~5aMCVUy(J(Tdm{LlTLGtZSU)L_qExW`C`-P zjUy^|e|mQ0jOZf4q0_|}nR{JyVOI;33xL?7>&+zBy>Pre&6_J4lVCc>Rd+hWn%s{s zRB+ye6YCs858M{mGX)|Js??vA*ZM3(9YF1X=FyuZN6v^sXpLoAobOCH)~Xp?i!<-f zpgc1S_T~#8vTuL64=D$Fw;>L55mb5{Sdx!Mz6O739G^|N4Z2-+&p+KakQ0T70 zBu0)^)|H+}#K`DWzP7ilfnu%RAi4t9Ml#QVLkzG4%exWC$&1qOh(O=TQDAy^KGd_M zEcn}#e$)Mm_+)pjIeZ|)b0CJ0w8=9uJ?T~1$LCj*_Dx1_z-vsa@~xU-+sSZrL%M;{ zYEg5nTPt~rxr3e9anK{QPOVTiLoaWC1I=w3)CI0lETU&dgUDp9%pE=ie@yGg)T_#> z>%gQ2e_&dMsW&ao%Yy54HEA_u8Q>Z$8GaVUVz`X~avhE187rzp%NUJn7-}oJBS4et zVnur2ob*jnlpZEKr9UYR+M=_PPqHJ{LpI119`=s#9F;v-L;&_x8%CB5qi8|BX@qkT)5@A9EfP3m0S80VJ$-0{TpV_KWtwl0yoxDm*n zPY!%7-`U&Q4+mOw_NEu(wis&4msUz|*~DGkn|tGUw&NW0VL*1&=Q8!UUN(JpY9zL~ zv+C8xIl1iFw-C>WYw7M_YJb{OT%UD>_Sfyrjfdjt!$o^wv?c3>Vh$N{lm(nks*ZgG zD+_EDCVUXvA%7b#DfOoyMh?SVS#)4-^qWOT`(OB0?khR`CDn zIrqr6faZUSg*70M-~$~=csM| z%6K8azZbjo=DYgdt`qV?fwACxopSp%!0c~C?>mqB={Rb~S3o28)>V)Kh=!{vT6>bE zz-6izR%$sarrr=|RF41TMV8U&)15gmzBt{~^U|M)qAZU`|I3o15m)N{=+Mn4Urrn$$U6uvdIRV^4;}DYLt?F4i^h+9U2!U;Z8C?4~y)1DDU{S09Og z;hS>Mjrd#fkLjI{AcUs@fI=k&E7upgZNzVI6F7C~y&MgMd zzw*iw8|J8NfmREIT=#xc&?}H{y#@{V>(#ok{nX`f#N0IG8xslXm)do6(SB}`_IaZow3~Jd}3_mY(dt?cvp(azA z*>}$Lf4|eDNCnXu>BpSxiU_U`qHc51ADlWdO_b0}w4285WbFvz`j!z?wU;n2h8q*Y zpBmS@xW2~B8l^w>El#Uh-9>MxKwduQ9O+|p9_6Z6ohjm${zjgXF6po5p`XeusI)BC zOOkqaTRtj%4N94F|LLiXESAM}ulzZY+tYN3sZ8DyNuQnZ6t?7D;e&O-UrZ&|#k}Q0 z-evdqnnh;(B-!!N9wI>GL^MC#fZD8EX7&vjowRbW2OU>~ZmVIdm8^L$FAYLJB#er| zl5ujTh*&T>{92`f%fr{N&w7B2RF_vx5s7E{q}%RHTO7tyhWSww&rVcScaev;|9+NS zHHN~g!*4H(0k>o6YsaToy-M5*Hs1(BJN7g43Ioe&$Ml@pBt4vSMErhhJvB!z{Jk^* z1?}U^hW3I9oiH;f%<59&&fS;BSO**0H{M!$Fw!6m>4h&AT&ZYGjPl4$p7eH^%a8kiZ(MqXQEu$@q<C`(}`Yj%a&dB)lVH0!n`HHW!J<R*!;O1dB;^kqhiX|iMyEIdZ*j5nfoGY0OOctA1$BkKA4tXd z=u9LsGg7q_O|fDtD7Ibo=$1nJd(jOUSG}6Gq<0iDnR)Nj8;f~EyfI&hoqyHMeZ2?G z-uABZT5-%Ty$hk)>_SB4Sy;C~E?KNWU_-a62Yh!IurU=_${pCo3CwBOj(Y0_II}om zJ>r*-?(%pX8g;!UB(Tv!hXN6o3JRA_ zYo5Y7pPPX!huzSIhP&lwa|)f2g&Zl2z_&S!K=9`c%y}CO=?i*R>4)D3dSX!bHJ(V; z)!5MVnqwAB+x2FuwS+AP)rAIz@uF$LP#LRC{VZEv?Z@EIWHRcr<_kH_CS6teHBoE6OYw`OpjW8n1^(d)JwxHz5l^x&#TDU)>YLJE@Z!00i~+ z@bMIz7$(2+d}^8-$QlKxRfA|ToKu7ud-P@?2crRQPXYdUP###6M+j;Z%~T_h;IogADI@NAb| zNuO0rpaHtVydVgbW7zhCMgB~g)4Mw9M8g3*|*hMJBy>6yY)+K?cfN~P(GB4Z5W z^qe$@!a=rW3?*{nggG4a>b$OrU)w7Vt;6H~=Zs`I^U0UVLuQ-a&6%l4-;GNg2wBQ) zle0H5i6N(e@TpIHNO2G|r8KgA@1iz!LY{j`)rM*QO!K%Ezc*9~Qw;DAc|1^kC4R=3 zY!O64WT)6p?Btn2o@~2@STpi)?6Ta7Oi^jTR6`k@6}1=Hmc8*2^(O0+;|-JDW;fMP z)pLC^Cl*|3Bf#+8Ahf0uS32S@6F|dlh?dnR<9@G$k-otB0|Bc-rxFVOk{GlIy+}>( z_IX)M0fOy9i4f`t_&>1eemJf*sEBf$QR%){v-(9a6^&(biS+*w`||tm$$#wCZINm( zN6-ozv-^#SOm;Eh>jV;PAm|@=prr5DfONNBXjpAkdqMB8SqLw*LE_A$GLG`Dig!Af z3s+qu*JTTaP-TYFYOkN*0v2P0Wkc*!dS4)Dmfm9u&d$#TRe|}%1?h0ona|~2p5#&H z{`vaq#yYuPeT`xkyl#cuc{=dE`@lbz(SCSXR8YdyU{M=H2{bg~#$(wx4D)Tde7L+L zLw8IY669=KhBSsYPG0-F$>r^YH3Q*t+l{=rTrZmwskQt#d1R++dTDafVN#*0sx{w; zah0GS*BtFIY9vaM90?YkC6P@fgQ_kU^oklIXP}xCD$1$-`tN>c#dHDN@;hVu{`Z%j z8C9SSoC`QGD9Ntq>OxL5PWN0sP+)sE_4UZO7l`E&gEtUh8-bmvbT#6##J1Ww>RfqYaJKJ2?Ntk$VjIpi^~!I{(EL)lkwxqSu!CH2pZlgY%qipMA?omMCPbkbY2cGOmfYw5Fi zW5%KI&iU-X1s>sx9G|xa)huTR=$T6 zS!>X~f!wzAabsz1Tw{;LlKE6{J|pm%Y>u(FD;>nKlrMBW?3@MBffe!pdc?1XVBdyV z`ts7FI3}Yp(cti^41^MwaT$CDLn4pvbU8j41O>|WeNi zZ+EV}=py)r?5hs|Q=wXggP8+#_9LCe@{U#S!~H?@Nh>^ZP$U~48VwA+!NC4QZb*i} zmt}|k*Qc&%cdRr*;TOvy0YDLf+zd%K^j{e0#K`}ITF}Ui&QWUfVEdTo>qdv2S9SQf zAF}d-$q~#31CFTAiHZ@OCr*nMD*xnCi@I9nDH=ACttEGo%|+vAoDkBz3T0rbwW3S3BGn0Eu`^9UbqEdYq$PHemvK>n?e` zGhI6qNas11Asmmf8DTPzGzEi!3)|7EAcO<-XRP#R#=Pb@YmRej6FS`t-mbK{?3*YR z`BXAOo-^?2bP}q0$xKeV=C<3v`jr>^mJ7FL(N?S+54JXzF|ON`WG!)%me=mOAGqK1!Z$niJ`)Em2+wojUbdxjT-p z37@^NYzQTDj#y#Gw=-vVdS^?Id154|GN>Ab_Z@Z>H(r<=)393U`+s_X?A3Ya<|iCV z*XZQggwg4)Fd3onQoH1mi<5zEb%(83E-6gmy+w;F znauKHerML5+WXlgbG)}j`qj=Z`REp@ypyF|9k)WQ{00E3yz5*Qn6c%4*X_o59-3B{O;GePcwsL!-R-QUHA$RU~H` zGf_?!!JJgBN~2ivJ`GxGY1wv8dr+J=OyjT;SDJUeTJ+*bGsVM*EE6 zt77F3B;koUwx3$)s*FaXs;P5IzbFbxTS@J9+ll3KpZl&WZtx3f|E7KCRYUbs&SA2F zWmMw)mc-sx2wsZ-k5fRMWUE{^f4A&!sBgyZQiF5)5&SH5LKIsW_RrCX z4Q@k5`YGCfMp+7*L9fWl#2VSqsB?@wD;`fo+(&BEuMHw+{7wK>%R#gJFH>7JI5={$ z8x7Orq}Up)?eK?pAeD}Wf>vEXZ^?*Bp^ypdI@SZ+sLn*xyv?Tf%}O6ixzgUSxBg%K z+itt)qHC{}C%RpK>hR&WO4r0a6>rGbBp>l*W&(+Ivt8>s<&%e>n7QE}! zVRY<&Dx7E%V$mZMZi*RRtcRM-wi6kz5?&6hFdt9uKIHbAMe>`5kn@C_T-gAzLmo{n z_P8z2=4*AkJLD*+bP6^Y^cn22$Ewi2E(y7%N4IaUjaR3tv|~KM;lX%~tgbtf5Q&XT z*##gtL}AaR&uJZd*XUPTO+icM&=fQ>nN}p%&W;jJ8OdZ!TP_Rx=CZX&Uz|Cw+F1YK zLyuwREiZUE%(J@2TyX2EHZDBa>k>4t&IMm5j&8MSRBW!m463_;G^~>2FnO;BGu#xm zq1ltGV05d8Y@U^h<8WJLQtm+KKn}Jk_-!xItQ4&t6kede=ZqsE!;^B1-lG)`K)K5f zP5veL4nPdWxs}?6pl@S2Q(6o=f)_f3 zUdI@@zSa7*wSX|RnhA|w#Yq1(%DZe<f9(6>A9Eje=SC{$_GxHnjzVir3WR z8&hbDH;`EWo^>c8Kx?cOn46n&*Vd8Q%2W}vl&lyCGF4gnM8Ta(WPIrJPbSGD1|O&L zC(>pFj-;=$I@Ep^)8>oWOZ!!epJjvW($6)?^YX^>ZdB(3sZLhmDdcj2gbg8fKv=t% z`II4|C-I#@TfN-|f{=s``Z>_3m|1llW{JHOs^=eH_4#3@1>cVau0WvTf0i*3E)TY4 zI2i=>B-tnf9Iy?na+R`R3-tvT=blWjx54&DbZEG@COUvQMpKDznlJH>Ig_1Ebh~9^XBW%5*$T!hdb*vut&qN?ny3XsBeBLFK4le>*4=1e4=l!t z)1pztG$SFxJR*Qk!|HjLWzpBJB#k9*w$_}jyD(*ki*e5SY;!?rcJmsudFfAedkm$7 zcx<-q_s$hvY&0Ifw`bVY5)1${!X|5Lk*)mDmEZ0Vym5c9o-@VLNlP61nhBbVC&0Pi zp#Tv_=4fP5r=1-3Z6K;4G>L+-1`<2G(P%!ef+$MkP2BnA6qz=qFN3ZtX*G2U=>DaC zfdb(w+D$~`&0mpKOP~Cg^bDXl6{cK}{?e-7Y41^EpH%bAD~P1hFk4e12AS^AOoS;ZddQgRD(U#?!yH4ILJ z(W!4p$Lqy=?=9A)j}|>6ffVQQcuw4Z|Gh~jl+A*WpHBJB9um%GO-@rL6WkYQ1FG($!kOvHfS~P5OOZcw3XNA49oS}^^xOptl5z12~4dn zb5gK0XM{kAZ{*=S0}m!MJ}J>cGh8ud$A_hDPk!rLjB2Bj{BY^NAGE9`kIu9A-5|X% zO+LD`2h)&&@=PH4`I*ZP*&pyY&4GZ|P!P*J+lbYseOe>v$+U}FyH!mLJ~Mg0^b+ws z$L}+(mR=wc=K4adR;ZdIEdExdUVZw5ADpgBF9fQu{F>Zh2rR6gfFdct(7(sS7O!dR zHDOFz&sf`qb&let<=VC*p7||%3;7*TNfK;1;Tm(!|IB20dit-BWuZB~59_xbxW5hx zKo72Z52A)APUkLY<5}?*Dtcz*g#mkOU`vp5#;D1VEBl&ZQd5RyqNb>fZ!Ig4(Y9$C zM^LyER*T|p@De_xx>VU7Mk)@Ig9ifxMG>Adhv#9t{EJrvy#n1 zEZ50QfENx)T-0O8=RQpZ7|_z%QH!AJsd!er)u= z(GF~~VqUNM@5k^aotR*CWSlWD>9Qq}N}4l~S$o4?=Y^`h@hrRUK$OL#XhX*k42Phc z-yQYmI&Yl~?mhp)s@`GXAXQbfK428=PCnOE(0kAOO01n&buhhbct^ae5_F*=d9(C3?{v6x=R(YK&5r8+ z{kQ9@H}v&mH_7p03_0r*?1~#P#5sr|E<+SSClI}UsxQq}SN2~)H&A|mO`r(ZAm>mt zKs?&fIYKz(1W zwy!RIA!f;zih^fstmi7)&e;HU(zqXML)` z?85vz_wCzPKX3rGaoF!9>YHojSv2dAiJk>C^-6h$^4nJZ`^p`IK%E>d56?eJHN$%_ zxDNxMVBp#{9%{fPt{W; zdmhRy6=ymqFk=d>V$xb+8KY{R;yd8Y67mGsB^J@4!xXNQZL?@;>7Y(@{RpCPEg*-M z(f~QDnNhPrJ*Lzce$}wXtxZ0DVwzDlk)W!xb+u7d)tb?{ilF*6Y(O4!O|2={p!opd zgv#nafh5E>NVCITu!#cLOF}C4t{dAy}Xt6F+E{+D7 zlEsnd?K#m^acUgCpry%`tU`e|c)Tv{*wQDxicDuzboRD};Iy-LS0NI$Il z^A1-tR*RMejF|v8SG@~`Z+*m;7e@l{e%4?h@bWlD$T4J8K|p-gYLtSOi<`4z&Zf5M z&@z_s7essAmx^|US64Yl!s%>J#L%vo!)wq9f?4^NCv-bsG_990U~kqCFxANsEwjWxNG@pvE;FW8r)u-1Rg(GeMifTo#;nmZW`8fxVm!ToVL!I z(YQ?e3TPaH)?^<8Em!pSBLElWg{Lz9xYewp4i8G5=xd1Yv^qR6*Ml%+;BLXn2B2lX zn9el6o~YAme;B?Z#FhPZr+0HXSKjM03o3<~Cj^A4~8&6UKqYgJxT?R1ofc{PClUqOPzV{KpU= z51NwQQpVu~)5%+FO!-`xRbwxB@~MQ_dfV3TIckEfB3^0E*=`g2Gc!JSe`>PTk+Iyj zLkm&2Y6N^!I(PI&)N}7#b&qVTaT|~%v5dSkR5p;#tAX>Aw-BO$%jwvPzoceehI0qS zMx@{L@}1tZ6>~cTa%FI2AaDjWhDPStXDbegT0=b~^}UKML1$LDRmHk(<^bmuebCn- zw+eY%h>KxZ??`&m64ZR=ON7pU{mt_xKexWP)v;j8ISVnDqUax&W&&*&mFrQkm}Ft7 zibxvFFE z@;`il4|xSJ|5hs)t1+=L_EXNQ>#3{|sanX-@-f}w6{t`#cV4&?WEYtq5Gty%~x zvxRx4QrR9Bi}{qrR;gF*x#GH5qNOw#XrvEy2U*fntJH6lE zcwa7e+#u}U6HB(lF|Es#iH-<$jgo0|)HET-EyIm7lVl_5P8PtCCn_3Ydzq-EF&$)!63E z#%VE2j;M<5x<1=Xcr4Lf*?MxLH@mi%R2Ge%WGflJ^3MAwbYLavWJ$btxJJU#gL+SY ze9WzKjZaO$=c!iZ5T~w3oN5D-e-srouxW^lP7bdO)fS-p6jaH`v;44%=!b6Q>3ax8 zfMrNiE=v;)W#$gs5a^v8-b4y<(@<8hqkFp!p9s+Vf4Q@imO=l0+)QBM%eR(pFb%fI z?q}cmE=IjZNj~s_mn0{-QbjgwI4u2E`n&lpXPre5SJb#vp6Puc?jK1*6LVe9~ARv(HuyDA~D;)t-?X zui}B!)}$@2AbyisbekR=*%1iDv=eHF%|2UdG;TMz5WhK%TtLUTS{H<~jkw3+OvKZk zM0#3m9d8t=OiO@vc#lKw*$^?Ye)b7(CnDVsb#NLSJ7yu-Ppf3;?WTRPMW7jD@RsLc zXD>XSk#?@69dh`i zqKAZD>)~g`-q7ep{@K*AM#|l8RjlvYnHs4CQin5+?BS#51=d9ef9U8?M`*+ z$32JN&@ubT!_s%A$)}_VI>X+r=i0@}OiRV66m(b=VjiU;H2eF$Sz!7qp1J5kynXs2 zyphFbU_N=%n+nsOrrr}tyV_fQm)@+>!fz`LoUvpytM9l`do@}x;?8Z}%;vBoyKU*& zc${1%UH3r8mP^OknXAUT>wo^1nfte6Vwovyu58Z-$7j~&vfIDK{r{Z32b^SOl|DT0 zy_LhQx^-{Wt-6(S&N*~-cXgf)Lr=~O3=9l;7?30&AW?EsOe^A|2nq^DMBFv40Ttt} zaSf~MU&ZjPtFH9rd)`~sJ%jH5_x*lfP4`UCba(aC`=0l_=RD^*&zZb;%G7-Dod;`s zeua1BA4Tv`w}H!10hf;|uOGoW->~VfP4|J*0gZ7)8LV2{Iw@>WZyg$eAUj8)3(zA# zU>1QO{WV-voVtyV!s{>-8Pa<}d!osQM8KG)Vavur99@FzP_fF921C8df})`{*=6xO z(P=`Ojxadu$CI*Ead;e>R0}Q4#PkquOW9(#2EJ#(~z36N}#1YcWCAp zhRt=O%Ox6=C#UZ8y!#G(4G!ToeJ$pXXghiokCgAW?H-rg2F%LqBe&jlm;cZqMJ(%i ziPKq8jC&cH?n2% z+LmHsDVIqsyeFI`e&siReMgwjWKuRpt9)pCW{|pU9HnxyQs?pvzXYnXQFVVr|+T`A+k5 zpKHEA-gMeqw=nM#Gp>kG69cx8nD@tyE!#uTA?KY@7jgSN1V1E}{Yu(1ZbmnMS5>yXLRJ63bwP)W0)=&IY3n0(L0CxjLZQ)y3e4ha z3L|U>=s|ntMmG??M9uoiPzHpqI(<`f?~{NNwyDz0a8A@9{*7ez^*>O!ACigRBvu9m zeKFoD=H)pE*42!anbqWP(D9(9nKrwopJfoE8^HEq4gaC@L0H_ZG3(>~P|M)3IwPw7 zdd&j;bsw)z1Eh-#!kOM~=XB(f4}9Rjwr$EwJ9jeCuYUE9|BS~i^_h%7#+~t0G5q}> z^iG$$M92d7wuY^E+rhEbQ;xJCE536F@#qVFxoqBjYc#ecQ?v#g;dpVr7StB3PF|d- zCa4gu&Z2|tg=}(m#p9MxB+NNae|YE4omk_jI_C_yB$yP((2@A)ruSij`bh7LCZ(h6 z8Xv*As3i|9C8D%ph^Go7(B)kBQA2m%RCUVKoc5&sp=m6=VK)34y{UzVrx@qFLw!36Uc9BnI~c6(a??QrHg z%Z-$fjD;+Aza?TXBwBn&ZFFj4QU%%jwanqk)Xc&3T>cH){jr5XOZd6_QY0cU0A>{o!|3IR;W_XRCAOpuW+Tqe~KyrNC7(#~8mrdkvT|;6gWhT~SoPj|B$#!yxp*M9t61mLQe}TMPXrQHPm~E;Gt<#5u+@(Z~=}gYmm+ zBY5Va0m4QAh*K-U!Pmn|PLBTD@nAkAXs)={TF~k3?wE3YDclvBMmZSugk=<--Lk_@ zKADPDK*tUBE1rA~V}M!jj(nzZs-O3)q#~L5D8fdu;!kX=6rZ2;i!yg4eX%{7%qcs4 z!KTaO>5`w?jMJx{hsMf;SAS~#*!H*C{26cY+)`=t+Fxxsr^(J}3>L)RmaMbHVGN|7 zuiM8N=`xJrl1BVBtHV8*BIGQ_%KNLm;G+n+W&L|RUb(&wt^ajK2C8go!J_##ZPVI6WfB7=$4F0G)O6DxjxryW+a%8R+YoRNc)6`1vW! zHJVo$`q!Z9dJ{VK?t&eK)l*JO-4sU)tEt_3ZMhMgb|c2fr&)4+*dBG2UCNgn58rVIx=5}V=rIU-!t|{`!wY1F0J8L% zt9;C9%B5QlkH8z%7D;pm(%8w0>fAq1Ok6)0;O(u0LD-TR+_ALhtDYsI!HeRsC0e^*;XWLo?_fN|?Z!VCVu$=Ni{B4$VPc5w`?VIoUZhj?@ zn{DRt)tR)T6&(v?uAMD;N~KyLf9$$9%-RH-ql5-b$Gt)`RKAHmlpk#w=avkg0nljy zo^}UtPRu*Ql*^&YP#1X2naC0-7V~E86Fs}@XKs|bp|N4;m;E^XG+U=-B^0mJ>zQ8B z>+kfNUp4OwM|oIfr@0))f2-fFg6^v8P!F|Qh=Nt%bND;F0=7z`Y}Y=^{Mp1{M+9Hg zkqDM~=rHBORf~=WEkuV%wO0BuNK8{&tMbh+{#5xjRLOqvJLM50rZG9>AeVL*ID0-+ zN!IPdsY4L8Lk>rZ8wU)f~ zAC#Am9zCvn&pnaEEVUHl#dtOzy-6us#Xl8_OgXc@ot?n+pzpSaES3m&>SFGbQt6C} zp>fWKE0sN!%E5AZZ>jXm?YEPpSx7j7y++Pf^RFbUTXKc;Ijg~$slJ={Taeyk%;rM; zGY%Bu>TYfGytS`1G|9Nl>vrfmrl{;+2-fAU6L3<@67rC1%eOf;_&U@@`=yEr<9h;2`7Dh+f&4yJmICo(}b^~Y8W{~X=aARiAA z0yuPJA9ylqE#R4}Pk_qe`UmSQ78TopwJ^_*nca@IAgz6BShK}I*l$-nSvOzGw4*hf z(FC{!6cbE}ME8TysA)0Zv3B}p)>AtEnqvijZ&&)Imp=Eo&wu`@i|G{nV*XeX^Ztsm`;R36tUZr>`0C!rD7uxdzuE_IyiPL#EM^7m^$ z`PDPeeC9KcKcPlbpO`jhj9#zXkgy|SQBdt2Rw$R#_j}~Rme0-Ndv~p(Q}D)-T?p&59Ba4sX@Mc6&|GD zzoyrF?O?#zt{gO*gXUCYqG?Y8+~zN@E05%?KCj!DwuA#Nvm;!0TLm=ydQ8!#-xwPF zzIE@tE%JcDJ3ciP(6(+?ew8yt!yYE}O=2S58^O#@CG1&SIOw-bUNKpoIbKa&b{o=s z?+`fiS?(0N{#atm+b8SO$}Ri$?%%&3_gn(n9@|*~bt0Nc=Fxk4+NPuE@27R%4PFEi zdU_|J#*0jmruSfO(j!A5FsLKYqlgHIRnHeNlntrR^+bn;OzO9(ig`%-lXV;~e7g-1 z6TTCdqPk&pqsUKwy7rr&D&Hn)&`Qwrl3qK+{A%s^AAdlUZ~g9uDp)6EBUjvH?gK~H}HQIbQL3x*Pox5BdzA7RqUGt<)yYOX#@N6 zzn*x4c{G>L=L)tU?+9`Q@xC}bE0``RqG7qytQzbuNbS* zy7Kgyh&*Le-HN`7e8r5>pQdcIp?pN~1WC){7aRFwJ)bjd-(j7vb?RgFi8{H(8f>@w zQJo7T8kNU0r7a0MInGlO66LA#)?eSK3u=XmLo5sT+4Ir*8^ubkDpt?=w))-JC=GDr zyVxDT9B06<`|_rLrDuSGR5V?uGZCn1V>1vn&`EIEgVA=NUlQkGc%2N7$_C)9e*e(E zv89mS-gqjc8I1&WmKpT4{D3_o4|s>vut)OaUG=1x?3ufL%W@;!QmcyFw%33C*M-v122m!I3|i z#yJdKM|Lst#Ps&0ev^i;!_*aK1StyIC3FI$rQu9t1Sh>JV%k6_sLinJZ4U(L4E;sn zRD+V4FNjh36KC<7o84x5DbkYDKG<0q z@3xSg_ch6_F61H6MlF4Gs{IevqzEpj*`C=O^X_K6`e~c61)62 z@N}F!A5B$=b0*ANptNnboXM z?fFrCGA>AXciKZzZKxF{AQfuo1sq5n$)teWlU~B3;0QS-kPF~Yf0yszuB8@(Pv8lm z%`)=%G#;XUWt~w)|4y#J@gy3HGwA9%{4N_6a``l3B+aKk^OuQ_-K%>u`n7b?fybpM zJpl1uSNN2G?8lggqvu`~B*&Dw9=W@{X6j@2G~*aWXt~jXAsVy+%#=iPxUHV3$~E3Z zMWSe*FiXN^#v*#i*LL9X0OFDTkJV}y)oK^iYUBk=dv4xa-@d$<&HB3Yd%CwiU)*U! zttiA*QpfuVQ^BmY+sst;AmniHey0U#6oM^hNYYnyS!MO-KmWJdb=TF%YpwF++(K0E zUtF2nYi(YLhAu=%HG9c9alBad?3qa%d;J}Ql$>`6InVp%lf)CtoL|b7ZpZsg%k+W$ zv|={x8`xRQUQIyLx}r`E-=gwsX^rFoRFL0>9i@5UdWtcu@*>Eg7rBZV(fgs65a`B^ z0wzh_sEzwnCS7XaO5oMc;qzL$@53{?aegUIP^5t}exOa|c+iVQ3wb5Js>k=x z?`8NUmc02b_gw7ihEv|AG@%M6B$r#4Jn*JBVuI5t38Sb@YaDOi7S3n|LrU-Xx-Do3 zhGo{ZEIsuUB`Tg-VMK4h3Xjc#5azWrc_Cr5SAz|!&n;*T7I1ZF@9{olu-XR)L~8&U z3o1Zb^806||2#k;i#%&~84HC^_-g1}Z3N!;UV9i*TMMb>PZSD9N%`~My$&lEvs%%( zw|DQV#R{G?7a@OG3x(=dRG-H+Y>51T*nZgUo;^ET%VXej)Eb=Xl`P1douuZexq8=@ zE2#6ejz>w>7Y>=19mPV* zOli3~@IbkEOlGH3XcVV~R?XJWCnv`zQ$=&rkJDqcnoPcU!D}>Difnc7)l03{UwP00 z9V9JTGcqsHZXU)MEpW;A(lgV6i{muQsxuHW5qt?PZZR4z{H*^~fQJ@+4 za@7*)%cjWny0FCXb+d2})J3p+43dLSI^G#hlm7IFHD=Lvj@gSID$O^!IRjbz}AuOZG%K9%H>2+sG&m5vFz&RAgqknRsgt+<|^+T-|3y9#3eg(_?W%F~a zJszg76%A>orsOme$S;{Fx&4(*%+^Eir5)ai#JjCrm^a8S@)#zWKwpoK@p`+%x%TfI zzw@H2FW%?WiWdLDi!Q(D0GZ&^s6SdQS|P-1&}U0*pNbsCY+xQYrxcS>6y=30yNA1b zx({^j-_t!z`rdv>XV*iIT@Dyysgy-$*E&*($OEV%>x_uUxQJb6G8y#jH9DKl9EpX@ zT260>CL@&ZP3OJNFn``O0ge;B!;Y!Fs_S!yaBMbUE;T+@%?ALOnvm0VP+2svrYOXk zaC88K|NZ)r|J(ZgM0tw_RFoH$AjsB`H%JHSZhIh-mS^6&6iDpZvn|kn$L8?NP2+ql z>Nkatc3Hc_#^e^d1^$~q*XeE{?^i5-2tOu!%2jqZXU7`*MDj#mFVHnk+PT=;*KLU- z$Bv(Q3Rc*R6~5x4gJcpaanQOjYaPh?I2%X))UucPF8a$vy)?!h<|(-m?;OZfz(h5aVEORkWML7)n*y5H?H1|ku<3z5NP zU4+m^Fp`0_(LK^gW>7LAev&F9BB_c?VdnjO0xRhnH(+p&q!BHFQ!l>i;zI#zX#dfR&OP)K zmb2S*eBNe}jY8z9S>9viBd~SycU5nkUJ#QW(pH2D!CYF9_iZPlDWCmm5_A2+0Gdjuv3c8TD zFmKh{w4t8pGx|b-^DN_kO;|uE2=sS%A=)17)l!hY=RFnDJ zV>fhcEc5HNx3SET^H*70&?iLAjD?dzoWuIN->Gbh)fdO~u~03X`h@b*ELnscm8!7) zvvX%IoIU?dpZLTl&mNsE?;InSGf5ew$U`1tgO?Gh8Pp`}nG)vuT5w{T;gB7*%hU+s*gzJ3%FAQ(s{ON)bkB;%V|SXw)h z4Ue}gLdV$}A29!tOdURQAQIej`eBeu&pNc#+g)(Yx~DSwU@XDS`{&B@A7N&CwsfTv zss_5%#L)>`sWXY8Sc863(M}uEo!MAuFjlqo?WImXaLPO8ovSzZjD^K>=j00>9xNTD zwazH;@_o?VFhiNQ3S{XJbjZ(!Lg&V-fNMrtsUF;+atbXzs}T)y!}SwwQ(b{t`s_1F zdfwGw64XVNWE`bTIm8g*_2`mX70U$zy;jK)LU&^GG}lF+T?*|za!w&|&iltObg=14 zibCAc5+nTLN0n~H)gBx3#-`3=cyZ31Gg-{(sjMeek{GRqa|XrfOXj|1|L@81@y*KD z97lGLPu%uK`e1HvSwqMG%eGk5_mAV2R@#*gIoXb}nzqHnv=p{E(sD*h@GyZu-jh%G z^i6SGc|^KN?#AO&RUbP*pH9l5mc4IO%5XH>Up8c|Z@WJ_p(R55XsL8|rE;`34m)5_ z^ShNjsMeDfM(cO-uG0%_v~JpyOkju&jeIaxjup}}h81`-htE2zDCG9<*%oPBUJm)E zrpDZ}$IDkMyCb_3jyRO(XZf$PVzId!JBe1xqZ?QPnNDiv zRDMe5O*bMKH(UilMY}1B*msH5qFy$KJLJuqKC%8Phxh{BcJ-R3c_IoSKoB>ub=c6! zpBv&(3Gj_amp+z;s*xdR8YY|69Z^CZ)fmN_8W)Ye^lzRDMMi3%!#nKnJ~y3bLGiMM zRx+XdxQFw590W7?M3>DOGS$#M=rHgtdyW-6vPn#MGZ29kvQo+@Nlv|0wlx`xT{N1& zwhYB5&d%j}s0zHRAH zVn*U?&X7&^$aYWASY|kfXz+9s88K#)#zIL;5R(G zn|&9wJj;lc#}WHofjSQ5*1$mMehp>jC?Ju*)kLERq)@|Ov>gHFK;iu?uBif&D5z%v ztvt&-W%2)F}j9{t-X zh7JJL8FYGWk+T_rV&|=*MaTqXyJWW+yNPj&%~<5^MysIwdmdMwFy{A#OT5|7$5Eue|KsWaHEiFDnJ|+@5#sD3>m}>^1f7)mR&6-FelmFaMHUT05|N zXTB0x+`2Q}y}tPeF)vAZ@rEbGI}M4#{)az(2AJDlKlIbPim-ybyhs&K80_$K6sJRY##4eNWf`bA8(oIs)q>mzMFXtDI+M>wB~wOgLYBVsr7x-D zIzIn-s~;80zSkBPQ%od)0S4)xE8mLg6Cq2GuhA-`aolgo{9JivntXFwd4?=0fB4GO z+??{^sUmu6Vu6Wp+@an4sck3#GfNButRDE#a_glgUvfA~eDi5*JX>@Jnod7oC4s0I z=hOApEmcO2iZMQGiRH_3pydd!eJGM5w<}kYt$(fDfB)eMv*+cXkxK*HPd%K^h4=4U z;=4EZe_-$h{TTFv-_Cx@Ua<3d;4bnjH?U)<5ofTDVaQNBfk^-x7`lA`66-cHWDctX za@eu8$7m>j^H$~4hF)tXkoEJF)57Qv!C~77Rh{~8@<~3QPnwi-$@cvpS**vm9yn+0 z_+w*I&*|*A?|MpTI$d=U2mp=qe2BZ3z%5vU<|f_Gbp#e0G_1j>Xe?d)p$se)%Rb3^ zvEgc~F|GB$D`7*WQ3C9O1&l&OHUEuP)qIyFpVOM{W`kQ2wU(J(l(}jU9ahq3B#)D3 z6bv9@hMYoZPe<#EZ-Qc!g#&*^gRJ+pR%q7u(IMdv3*9pd{z4*Tca$4#Pi1f+wj|)v z+5YqnjQ}2>)r~Uh)Ap4!j@7~wwJ2-1lZz~|blzE8u6jwB$({c2Wf$C)hw`;#Fi4mU zdH>T6h*wvH5AZQ{|LVt_~JSDtWDf8 zzd#X6Q&5`r`0Og1hB55aPO8I^X2}i5jvZ%ownLXJW_N8}3^>c8v%)|4Zb#iAR)lwV-?hIb z)*LVGZ|!xLdDxT&xYFIwaQh4LxK*_?8eU@E<(+t0syUzZ0*C1t7{NolUv-*8IHf3RmW$40Ot99SI>5}@yLLYWC%eb15)T=R0x!8xAim3TI7~Fd2H=gEIs3i43ci7 zn&5GbGukCBDUo+CEZjaledEHyk7+Z)`aAQ+VzpYV+TspJ%wAQ#@V@sc=he+&zbn8= zP?%}3dSJ+yZ2vLNLDsH>eC|cN|K(8p;E%3HKX#epO0G9N?5ILePJBn#q*fkbUovNu*FT zIcF0!vNjZ(Eu^WFGL#=ZK`s>MHM-yuPZttoAv_;g_! zYY_sDc!YK0T-C8H^t#fjBf!zo2oCe#_-*y2j!xKcU)Xk?rKtVdeU3->%&d^r-9=|- ztgZa>s`3VM>8D%;u~%A&OmZ&s!;JnkY*bJA40#HOX|quZ^NcB@TYHr#)t`he8|aB-~{S$!bWf_@Zf?Cw+7^x z;XO0VA*v(yIP9UOxCL4I-IGvzhS@y!*w@!Sz3^7Kw7bwVdxe3`?{;Wrv{p?4{%(i% zsw;1p?31hdKf@S2xfA$FU%3$)=E}!Oact5aw0}K)s2C3JJbbib&MbScuwbmL5vkYZ z;~y_is&!56?Ct7ql0qtuk^7A)` zV11?6UmL>R5lsOqUVB!t^f71VjBLh5`><>0_sX8Jv6eH@5j9qGH(ZXn^;2526;szI z)_#2C$l~)3OJ~rt?l${uQ;v|w!Oj}2hItz2Gv^WSCs{osHskhyhbMndpLY24%wWIV zw`Vc=dU991X-PuSe)cvH;<;@4+zZdiNKo0VNn4+bP9>1mFAt_Qf>Y3ZGrlY2iyu02 zIKkytlh?Xh7?~|yGsznTlwqPTa)p=~n*_Anwt7hJ_CRH5FpGbH^0 zf~5m$V0WW?dgD*Jgep2TY|B^IjoRn`=IOw8>{EUqqtR)t$%wBVlqt{2==DRz$QiBy7t;tDVepDXEJq})#G_ zfe*mO!#m|~U+#M5hg<_02He*1?>zpv+Q9S3BcHugtCjpnrdlfgD*&+y62zE4$eerb1?2qR?dTFNImDu))49F( z%s+~05voVXKDH9z;TqQEeSgXyU9dnw)vIN)^v2{J%=sE zL@r~!&FGdTgQG6q+WA-vijvf?+=Beyj4p{8=!D{CK{`CTQmG#twm(ETjlMn(E<79~ zZXSx_Q03>18wPVAsH``;ehsM?@84fSCUX!3U^atsh@vrDy`xc<_dD+*h4PJJ;?LF3}eGgr0 zLM+OEkt>-S&#}48_CP2uL3K;`)>{*cu2vtjv{8YaWp}*kMY9J3NSnm!aOegdA?d(d z=lAk9lSx)Czv9Zy;zY(72}Rve;xbW{N8sR#ly_i&Cd=)>6n=#jqrHKCbuu!Y^g>Yu zwdH_<194!cG)ST6Miop9<8OWxeXvrrEkRgcAoXkDjj4+|L8FE;w%W+aj6->0?dva+ z)7PFsk++?x77LJ7hV%yW*8kFyIimgbH_l&BK1SyL(HIm;7-9frYlF$Ed9A9G_`UCw z)O8A?74i?Y+BNFi@ref(cigu!wS3=d;q>#an0*BW&evV%$O&Jn)s$}@J=!{G4)b{~ zl?8i>n4$0nZWtG}w+^!dZT#`^sd z2Y2!Wk!H9qG#;Sj{*jS6|8`Y|82vD2pvP|%zkrT}ZjyLVVg)@=X(Jus!cel=%j$pw z<%iZtFOc@t?6aQfQoeb>|BlD_SlF%gX7+5G0s*$~f3It^ay_}``__P|?VXUj2B+b9 zQ2cS$luwhR9q(@67$xYOPYUMR`ZqUQ<5*)KkhCEyg0q zHl(RZLmQ1>7?!iBJcBf8MY)t*P#f=k!duVyh?rX5vb|`$`WzSXkcM0PexAsk0a?q%AovH$dj`+ zUKc2G-3v1=N6~&QC0l}%%{=iQVl!Bs=9U3-L=7yj*YlLtJFVjcuEg^`GwKMEJsyek zW}DUxWeJbX;pscA{P?zxX?pH#_v_+XyLHOr!qhYkz}4vn)R#d`ADF^dV9wEqwUU^A zw{oL@0vx$|3ajCI2IUPGRIsV|m!L6RYdq7^Je9IJ{k3Db#TG7_tD~TnaTFGcfzJI9~OJ6(KQu&K2G#-u z0~)cmP(9hdDl>5`)sVV_>5wNYduvihtVLoIfu_6=ljnow#B3zCd7F=sRRP&=GS^p#mqS7Hvq zE0~$5KEmQeedik*-V+v`@km5yMQ3^itLxCN?EJLVoAPyoaY1+Z_vdb=ZD-_M$RPkK zpKB%N1DW7Ndo649rrL?ru5F9n-ltTdI^p@Ack|Zm@k9gaslDK-=N&5@|MY65MlMMo z+%@Ycc*bYuquskwUlhT2u8U_sME^vGH3J;|A!uK5xPOp5#nlv@k^|J_oF?dD>fwf< z)4JUZ^PpGxzLV{S`bf~&xBu|tAO8&b+NYj);@{TRcoU^cNdsB%=DfC8(1o*z;%TuY zWqr*`jyLdNmc)FTY+_m#vtn8<@~)z%9a5TJqZ*Z!X$?Qn)d+&U-Q^_MA zh`n+x`rPRGr~10rV(*6u4nhj}@%3YmgEG1c^g0&}hk-;6qZR0#)0hXri+aZJg|+pQ zgbv06vvDz;REVbmHS=_?)a52k?nv(XN@~28ad=K&Zl=4kGb-EQq5wf1fOIK7ayLTm zx^nxBk;B-L8OCJg4hr#B488VlHez)GxOK;58*R_gx_8eMQ&ZKjL2p6zGU#(@l3dqk z3I;taR8KHVTuMuIPfc!g$)%>PV|)QSZe#;L-n&hw9trQUfjO(UbnclD|At8 zac=*IZ3kapkB^aMdw6y0lHUr2hg}cW4s5O(F}sLt1057BdpTM0dYhH3t#RpiBf7FU z<<>}{7;g`G9Zbd4h@m%DWU6|PKVS)Wv+=@g;?x(0^JQ*j3+SIRqs};FUhjkL)lpGE zb%6rDbSf53+OU7W50^&ChNGJnM@;=l9U@M%5BMuegjZvl(VxsOkIx^QBOg_2wCT=b z@p}YT>u4Qbc4a1t0fSD%7~1_s7y0n< zNCk(_uTNgOJ!M(3uH{$}g0 zDe%83vdYwn&7YDz#kj;2^}%?;8t6r*pMCb(?ngiRQH0aTBB++&LDbVMV6sB>CEf(G zJ1VXq-BhiSM@pr7XIewoulsI_Ur2P)3ynuqi2@c!Z@6?CRr-K30`VQg7PJ$?0MyFX zXz|EH7jZET0EPyf*N;x5szIB^7Uo+To4F;Y_@2>fc*STAdB*(-w-wz*q?TS>T*>B8 zgw`0WMx7vslucqK=!rOufI>K5aklKMEC^0~E%H}$G+Xu*{B@KOSivApqhy&%&*^SbPo4}R>~U38Me3pz`T53~I&7 zC|`BSK0Y!RW34uhU3&BkPhwj_u|*r?kn%KhN%WL3KXdrXnLQUw`1N+fW-Y53td3up z?_Zc|Nn`Y;Ey!ps5SX^u2thL-Y0sO2aj;9qGs=bUr<^62Wk%M#8Ol^!p-rWt z!eNR7kIYt0nb)ryI`?b+;HzTX>j!^>AVLp5E#=a8QrS%|-MjXRrw*+N7x)A=E0+$4 zb%&7Y+iVyifNHrd5X%J$scz0^u-fhEWKa`hy~%>;&58vR+SH7opOO22tUgwH%zv)A zdu%PY(=W~*xTwGV!e}&UF)+(!hbZ>ao<=omi}qSIUo*C{H0?2z^I|&UX4^yz=e^~& zwFUjeC?A@RAOC3g`LSo|S=Vloz+IogeTyy>^jJ@+H_s@_81@IQ=O?2+TB=F1aUbC$ z_0SHnTiiv|(1w<&Ud{zvI~%dwiH|mJXX;hS^7k;)T}!^rrb~O`mC!Z?B7IBAuB%)w zkmvKha;X||_(mI&KFf7cj15mIwj z<46svfw4xxw*C5EbNcPOF(=3~>1{dt5xMGYd+U#*NxDR8@C>B`9Oq^BJ zyLq+4o!m8?<2H7Xo0igRt{V>**g-Hg~Sb!dPoa_@<)zI5+ z1WTihWBx;VcKY*_r$#<`wg^^N9ON^4QqfbVA!wD(5Gvktm-6C3Ob8P~>QSTY4_HlJ zH_+(nj)4;*if;6nFb0Do9L;!B!D=RK)>yQdngt>uAMpD)U&)>00zfd-c}(P;?|b}b zQA}lWp?Uu2mneUTPFc}DN)~}mV>B%|aDQ8j<+jiU&A{!yAb9hoEZ}%E$9iAgU(`KDp`*;Lk-+p^R!&`P+;J1$P4~pC%XHR-en|--_#uLUiiOFz*p~qD_B3* z4Plf(oRn!$vL!AWilHOIp|(a}Iu1PjhYe8nq))l1UE6C=mO zTe%XG{;}EZ^)v5n&nyv-XMV0{>GWW!NKv|-|F9>y(8ToSteuC3g4Th?UoJ1V1Cd4~ zdiV{@$35|&*WP@`!N~YvF2iHMk1CN_mE+DxH4<68tx_sFRxFOF2bccVRJ>6t`di-F z`57r@Y!t53MA-j!&e8&!Qn6ujEK=)DTA&pKC6dXz8GD2p&6Q2J-YNa^6L$=-CMcv-f-WYX@@n+PuyGnF|ZJP`}2mh=c3Y; z{+&wO;j?ogdm;|mbF0G~*oC@SCLRFnMzl<5Mt~=yyviQPPx6fH+5g*p3E|9b*G^4MDBjD7N|7+zhSlcRaaf~auY2<}xuUvepVJX8_W z@vx<9@<)?OSqOUFR#(!=8zPN`BJ3{ZrgHKIArjB|Goel)VkA1q>zMp7yoenSibbcmc(LcqV#R~|+_e&!UWRxS$|>a;)>W?+`E+D^=Jl^9ojdNh^~+N^D<=h<(1=)Dl@j#`dVTZ; zd2=M|!W=@}Mpix73YZ5^_#1nR=efNkwcXzZ&@7SKk(0<>* zF0*df?>M5dxlul?b?1UW5)bz*Mm@8TFl<y}aPE8q?68(C1W8wbyi=1j}tyd