From 00ad65e071aee354412bfb14e5574959c4b73911 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Thu, 24 Aug 2023 14:19:19 -0500 Subject: [PATCH 001/180] fix: changed import --- server/src/controllers/practicalStages.controllers.ts | 2 +- server/src/middlewares/practicalStages.middlewares.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/controllers/practicalStages.controllers.ts b/server/src/controllers/practicalStages.controllers.ts index 491fb9c7..ceba1ef5 100644 --- a/server/src/controllers/practicalStages.controllers.ts +++ b/server/src/controllers/practicalStages.controllers.ts @@ -3,7 +3,7 @@ import { connection } from '../config/db.js' import { httpStatus } from '../models/httpStatus.enums.js' import { handleHTTP } from '../errors/errorsHandler.js' import { DbErrorNotFound, type CustomError, DbError } from '../errors/customErrors.js' -import { type PracticalStages } from '../interfaces/practicalStages.interfaces.js' +import { type PracticalStages } from '../interfaces/PracticalStages.interfaces.js' export const getPracticalStages = async (_req: Request, res: Response): Promise => { try { diff --git a/server/src/middlewares/practicalStages.middlewares.ts b/server/src/middlewares/practicalStages.middlewares.ts index f92d156b..36e90501 100644 --- a/server/src/middlewares/practicalStages.middlewares.ts +++ b/server/src/middlewares/practicalStages.middlewares.ts @@ -2,7 +2,7 @@ import { type Response, type RequestHandler, type NextFunction, type Request } f import { practicalStageSchema } from '../schemas/practicalStages.schema.js' import { type CustomError, DataNotValid, NumberIsNaN } from '../errors/customErrors.js' import { handleHTTP } from '../errors/errorsHandler.js' -import { type PracticalStages } from '../interfaces/practicalStages.interfaces.js' +import { type PracticalStages } from '../interfaces/PracticalStages.interfaces.js' // Este import da errores con el case From 5e0de03a967adc757d72b487bb9ff165820ff77f Mon Sep 17 00:00:00 2001 From: Loren Q Date: Thu, 24 Aug 2023 17:37:37 -0500 Subject: [PATCH 002/180] refactor - style: changed the structure and styles of registerDetails --- .../Register-detail/RegisterDetails.jsx | 651 +++++++++--------- 1 file changed, 338 insertions(+), 313 deletions(-) diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index 4e7014b6..e3aca280 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -1,10 +1,10 @@ -import { useEffect, useState, useRef } from 'react' +import { useEffect, useRef, useState } from 'react' import { useParams, Link } from 'react-router-dom' // icons -import { BsCheck2Circle } from 'react-icons/bs' -import { LuArrowRight, LuChevronDown, LuArrowLeft } from 'react-icons/lu' -import { AiOutlineCloudUpload } from 'react-icons/ai' +// import { BsCheck2Circle } from 'react-icons/bs' +import { LuSave } from 'react-icons/lu' +// import { AiOutlineCloudUpload } from 'react-icons/ai' import { IoReturnDownBack } from 'react-icons/io5' // Components @@ -12,30 +12,20 @@ import { Siderbar } from '../Siderbar/Sidebar' import { Footer } from '../Footer/Footer' import { Button } from '../Utils/Button/Button' import { Select } from '../Utils/Select/Select' -import { idTypes, modalities, etapasFormacion, nivelFormacion, apoyoSostenimiento, pagoArl, dataInscription, keysRoles } from '../../import/staticData' -import { getInscriptionById, getInscriptionDetails } from '../../api/httpRequest' +// import { idTypes, modalities, etapasFormacion, nivelFormacion, apoyoSostenimiento, pagoArl, keysRoles } from '../../import/staticData' +import { getInscriptionById } from '../../api/httpRequest' // getInscriptionDetails } from '../../api/httpRequest' export const RegisterDetails = () => { - const [showDataEmpresa, setShowDataEmpresa] = useState(false) - const [showDataAprendiz, setShowDataAprendiz] = useState(true) - const [showDataAvales, setShowDataAvales] = useState(false) - const [inscriptionById, setInscriptionById] = useState() - const [inscriptionDetails, setInscriptionDetails] = useState() const { id } = useParams() + const [selectedTab, setSelectedTab] = useState('infoAprendiz') - const idRol = Number(localStorage.getItem('idRol')) + // const idRol = Number(localStorage.getItem('idRol')) useEffect(() => { getInscriptionAprendiz(id) - getDetallesInscripcion(id) + // getDetallesInscripcion(id) }, [id]) - const handleChangeSection = (section) => { - setShowDataEmpresa(section === 'empresa') - setShowDataAprendiz(section === 'aprendiz') - setShowDataAvales(section === 'avales') - } - const inputRefs = { apellido_inscripcion: useRef(null), nombre_inscripcion: useRef(null), @@ -67,8 +57,6 @@ export const RegisterDetails = () => { try { const response = await getInscriptionById(id) const res = response.data.data[0] - setInscriptionById(res) - Object.keys(res).forEach((fieldName) => { if (inputRefs[fieldName] && inputRefs[fieldName].current) { inputRefs[fieldName].current.value = res[fieldName] @@ -79,316 +67,353 @@ export const RegisterDetails = () => { } } - const getDetallesInscripcion = async (id) => { - try { - const response = await getInscriptionDetails(id) - // id === Cookies.id => habilitado ? desha - setInscriptionDetails(response) - } catch (error) { - console.log(error) + // const getDetallesInscripcion = async (id) => { + // try { + // const response = await getInscriptionDetails(id) + // // id === Cookies.id => habilitado ? desha + // console.log(response) + // } catch (error) { + // console.log(error) + // } + // } + + // const [isSectionOpen, setIsSectionOpen] = useState(true) + + // + + return ( +
+ +
+
+
    +
  • setSelectedTab('infoAprendiz')}> + Info. Aprendiz +
  • +
  • setSelectedTab('infoEmpresa')}> + Info. Empresa +
  • +
  • setSelectedTab('coordinador')}> + Coordinador +
  • +
  • setSelectedTab('documentos')}> + Documentos +
  • +
  • setSelectedTab('raps')}> + RAPS +
  • +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+ + + Salir + +
+
+
+
+
+ ) +} + +const InfoAprendiz = ({ inputRefs }) => { + const dataAprendiz = [ + { + type: 'select', + name: 'modalidad_inscripcion', + placeholder: 'Sin seleccionar', + label: 'Modalidad' + }, + { + type: 'text', + name: 'nombre_inscripcion', + placeholder: 'Alejandro', + label: 'Nombres' + }, + { + type: 'text', + name: 'apellido_inscripcion', + placeholder: 'Rodriguez', + label: 'Apellidos' + }, + { + type: 'select', + name: 'tipo_documento_inscripcion', + placeholder: 'sin seleccionar', + label: 'Tipo documento' + }, + { + type: 'number', + name: 'documento_inscripcion', + placeholder: '1023456789', + label: 'Número documento' + }, + { + type: 'email', + name: 'email_inscripcion', + placeholder: 'example@sena.edu.co', + label: 'Correo electrónico' + }, + { + type: 'number', + name: 'inscripcion_celular', + placeholder: '3012345467', + label: 'Número de celular' + }, + { + type: 'select', + name: 'etapa_actual_inscripcion', + placeholder: 'Sin seleccionar', + label: 'Etapa de formación' + }, + { + type: 'select', + name: 'nivel_formacion_inscripcion', + placeholder: 'Sin seleccionar', + label: 'Nivel de formación' + }, + { + type: 'number', + name: 'numero_ficha_inscripcion', + placeholder: '2134567', + label: 'Número de ficha' + }, + { + type: 'text', + name: 'nombre_programa_inscripcion', + placeholder: 'Producción multimedia', + label: 'Programa formación' + }, + { + type: 'date', + name: 'fecha_fin_lectiva_inscripcion', + label: 'Fin etapa lectiva' } - } + ] + + return ( +
+

Información del aprendiz

+
+
+ {dataAprendiz.map((item, i) => { + const inputRef = inputRefs[item.name] + return ( +
+ {item.type === 'number' ? : } +
+ ) + })} +
+
+
+ ) +} + +const InfoEmpresa = ({ inputRefs }) => { + const dataEmpresa = [ + { + type: 'number', + name: 'nit_empresa_inscripcion', + placeholder: '899999034-1', + label: 'NIT de la empresa' + }, + { + type: 'text', + name: 'nombre_empresa_inscripcion', + placeholder: 'SENA', + label: 'Razón social (Empresa)' + }, + { + type: 'text', + name: 'direccion_empresa_inscripcion', + placeholder: 'Cra 30 No. 3E 164', + label: 'Dirección de empresa' + }, + { + type: 'text', + name: 'nombre_jefe_empresa_inscripcion', + placeholder: 'Juan Perez', + label: 'Nombre jefe inmediato' + }, + { + type: 'text', + name: 'cargo_jefe_empresa_inscripcion', + placeholder: 'Gerente', + label: 'Cargo jefe inmediato' + }, + { + type: 'number', + name: 'telefono_jefe_empresa_inscripcion', + placeholder: '3012345678', + label: 'Teléfono jefe inmediato' + }, + { + type: 'email', + name: 'email_jefe_empresa_inscripcion', + placeholder: 'example@sena.edu.co', + label: 'Correo jefe Inmediato' + }, + { + type: 'select', + name: 'arl', + placeholder: 'Sin seleccionar', + label: '¿Quién asume pago arl?' + } + ] + return ( +
+

Información del aprendiz

+
+
+ {dataEmpresa.map((item, i) => { + const inputRef = inputRefs[item.name] + return ( +
+ {item.type === 'number' ? : } +
+ ) + })} +
+
+
+ ) +} +const Coordinador = () => { const option = [ { value: 'Sergio Soto Henao', key: 'Sergio Soto Henao' }, { value: 'Marianela Henao Atehortúa', key: 'Marianela Henao Atehortúa' }, { value: 'Jaime León Vergara Areiza', key: 'Jaime León Vergara Areiza' }, { value: 'Mauro Isaías Arango Vanegas', key: 'Mauro Isaías Arango Vanegas' } ] - return ( -
- -
-
-

{showDataAprendiz === true ? 'Datos del aprendiz' : showDataEmpresa === true ? 'Datos de la empresa' : 'Avales'}

-
-
-
-
-
- {dataInscription.dataAprendiz.map((item, i) => { - const inputRef = inputRefs[item.name] - const isDisabled = idRol === Number(keysRoles[2]) || idRol === Number(keysRoles[3]) - return ( -
- - {item.type === 'number' ? ( - - ) : item.type === 'select' ? ( -
- - - - -
- ) : item.type === 'date' ? ( - - ) : ( - - )} -
- ) - })} -
-
-
-
- {dataInscription.dataEmpresa.map((item, i) => { - const inputRef = inputRefs[item.name] - const isDisabled = idRol === Number(keysRoles[2]) || idRol === Number(keysRoles[3]) - return ( -
- - {item.type === 'number' ? ( -
- -
- ) : item.type === 'file' ? ( -
- - - -
- -
-
- ) : item.type === 'select' ? ( -
- - - - -
- ) : item.type === 'textarea' ? ( -
- +
) : (
@@ -263,6 +313,15 @@ export const RegisterStudent = () => {
+ {showDataAprendiz && ( +
+ + +
+ )} {showDataEmpresa && (
diff --git a/client/src/mapeo/Map.jsx b/client/src/mapeo/Map.jsx index af38b832..b6794a46 100644 --- a/client/src/mapeo/Map.jsx +++ b/client/src/mapeo/Map.jsx @@ -8,7 +8,7 @@ export const mapValues = () => { 'Numero de celular del aprendiz': 'inscripcion_celular', 'Numero de ficha': 'numero_ficha_inscripcion', 'Tipo de Documento de Identidad': 'tipo_documento_inscripcion', - 'Nombre del programa': 'programa_formacion_inscripcion', + 'Nombre del programa': 'nombre_programa_inscripcion', 'Etapa de formacion': 'etapa_actual_inscripcion', 'Nivel de formacion': 'nivel_formacion_inscripcion', 'Nombre completo del instructor lider': 'nombre_instructor_lider_inscripcion', @@ -23,7 +23,7 @@ export const mapValues = () => { 'Teléfono de la Empresa o Jefe inmediato': 'telefono_jefe_empresa_inscripcion', 'Correo electronico de la empresa o jefe inmediato': 'email_jefe_empresa_inscripcion', '¿Quién asume el pago de la ARL?': 'arl', - Observaciones: 'observaciones' + 'Observaciones': 'observaciones' } return data diff --git a/client/src/validation/inscriptionsValidation.js b/client/src/validation/inscriptionsValidation.js index 7724e516..c04fd659 100644 --- a/client/src/validation/inscriptionsValidation.js +++ b/client/src/validation/inscriptionsValidation.js @@ -1,7 +1,6 @@ import Joi from 'joi' export const inscriptionValidation = Joi.object({ - modalidad_inscripcion: Joi.number().required().min(1), nombre_inscripcion: Joi.string().required().min(3).max(50), apellido_inscripcion: Joi.string().required().min(3).max(45), tipo_documento_inscripcion: Joi.string().required().min(2).max(50), @@ -9,10 +8,18 @@ export const inscriptionValidation = Joi.object({ email_inscripcion: Joi.string().required().min(5).max(60), inscripcion_celular: Joi.string().required().min(5).max(15), etapa_actual_inscripcion: Joi.string().required().min(3).max(15), + modalidad_inscripcion: Joi.number().required().min(1), + nombre_programa_inscripcion: Joi.string().min(2), nivel_formacion_inscripcion: Joi.string().required().min(3).max(20), numero_ficha_inscripcion: Joi.number().required().min(1), + fecha_fin_lectiva_inscripcion: Joi.date().required(), + nombre_instructor_lider_inscripcion: Joi.string().required().min(3), + email_instructor_lider_inscripcion: Joi.string().required().min(3), id_instructor_lider_inscripcion: Joi.number().required().min(1), apoyo_sostenimiento_inscripcion: Joi.string().required().min(2).max(50), + nit_empresa_inscripcion: Joi.number(), + nombre_empresa_inscripción: Joi.string().min(3).max(100).allow(null), + direccion_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), id_empresa_inscripcion: Joi.number().min(1).allow(null), nombre_jefe_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), cargo_jefe_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), diff --git a/server/.eslintrc.json b/server/.eslintrc.json index a40d29f7..3d1277e8 100644 --- a/server/.eslintrc.json +++ b/server/.eslintrc.json @@ -10,12 +10,12 @@ "parserOptions": { "ecmaVersion": "latest", "sourceType": "module", - "project": "./tsconfig.json" + "project": "./server/tsconfig.json" }, "rules": { "@typescript-eslint/naming-convention": "off", "@typescript-eslint/no-misused-promises": "off", - "@typescript-eslint/ban-types": "off", + "@typescript-eslint/ban-types": "off", "no-trailing-spaces": "error", "comma-dangle": "error", "quotes": ["error", "single"] diff --git a/server/src/controllers/inscriptions.controllers.ts b/server/src/controllers/inscriptions.controllers.ts index 7bec3ae5..f822afda 100644 --- a/server/src/controllers/inscriptions.controllers.ts +++ b/server/src/controllers/inscriptions.controllers.ts @@ -76,7 +76,10 @@ export const getInscriptionById: RequestHandler<{ id: string }, Response, inscri const { id } = req.params const idNumber = Number(id) try { - const [inscription] = await connection.query('SELECT id_inscripcion, nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, DATE_FORMAT(fecha_fin_lectiva_inscripcion, "%Y-%m-%d") as fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, estado_general_inscripcion, fecha_creacion, responsable_inscripcion FROM inscripciones WHERE id_inscripcion = ?', [idNumber]) + const [inscription] = await connection.query( + 'SELECT id_inscripcion, nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, DATE_FORMAT(fecha_fin_lectiva_inscripcion, "%Y-%m-%d") as fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, estado_general_inscripcion, fecha_creacion, responsable_inscripcion FROM inscripciones WHERE id_inscripcion = ?', + [idNumber] + ) return res.status(httpStatus.OK).json({ data: inscription }) } catch (error) { return handleHTTP(res, error as CustomError) @@ -91,38 +94,16 @@ export const getInscriptionById: RequestHandler<{ id: string }, Response, inscri */ export const createInscriptions: RequestHandler<{}, Response, inscriptionData> = async (req: Request, res: Response): Promise => { const inscriptions = req.body as inscriptionData[] + console.log('paso 1') try { let i = 0 for (const inscription of inscriptions) { const { nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion } = inscription - const [result] = await connection.query('INSERT INTO inscripciones (nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [ - nombre_inscripcion, - apellido_inscripcion, - tipo_documento_inscripcion, - documento_inscripcion, - email_inscripcion, - inscripcion_celular, - etapa_actual_inscripcion, - modalidad_inscripcion, - nombre_programa_inscripcion, - nivel_formacion_inscripcion, - numero_ficha_inscripcion, - fecha_fin_lectiva_inscripcion, - nombre_instructor_lider_inscripcion, - email_instructor_lider_inscripcion, - apoyo_sostenimiento_inscripcion, - nit_empresa_inscripcion, - nombre_empresa_inscripcion, - direccion_empresa_inscripcion, - nombre_jefe_empresa_inscripcion, - cargo_jefe_empresa_inscripcion, - telefono_jefe_empresa_inscripcion, - email_jefe_empresa_inscripcion, - arl, - link_documentos, - observaciones, - responsable_inscripcion, - ]) + console.log('paso 2') + const [result] = await connection.query( + 'INSERT INTO inscripciones (nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', + [nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion] + ) if ((result as RowDataPacket[]).length === 0) throw new DbErrorNotFound(`No se pudo crear la inscripcion número ${i}.`, errorCodes.ERROR_CREATE_STUDENT) i += 1 } diff --git a/server/src/middlewares/inscriptions.middlewares.ts b/server/src/middlewares/inscriptions.middlewares.ts index c7b4f629..bbdf4d70 100644 --- a/server/src/middlewares/inscriptions.middlewares.ts +++ b/server/src/middlewares/inscriptions.middlewares.ts @@ -31,11 +31,38 @@ export const checkInscriptionData: RequestHandler<{}, Response, inscriptionData> if (isNaN(phoneBossParsed)) throw new NumberIsNaN('El número de celular del jefe inmediato no es un número.') const { error } = inscriptionSchema.validate({ - nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion: numberParsed, email_inscripcion, inscripcion_celular: phoneStudentParsed, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion: fichaNumber, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion: nitEmpresaNumber, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion: phoneBossParsed, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion + nombre_inscripcion, + apellido_inscripcion, + tipo_documento_inscripcion, + documento_inscripcion: numberParsed, + email_inscripcion, + inscripcion_celular: phoneStudentParsed, + etapa_actual_inscripcion, + modalidad_inscripcion, + nombre_programa_inscripcion, + nivel_formacion_inscripcion, + numero_ficha_inscripcion: fichaNumber, + fecha_fin_lectiva_inscripcion, + nombre_instructor_lider_inscripcion, + email_instructor_lider_inscripcion, + apoyo_sostenimiento_inscripcion, + nit_empresa_inscripcion: nitEmpresaNumber, + nombre_empresa_inscripcion, + direccion_empresa_inscripcion, + nombre_jefe_empresa_inscripcion, + cargo_jefe_empresa_inscripcion, + telefono_jefe_empresa_inscripcion: phoneBossParsed, + email_jefe_empresa_inscripcion, + arl, + link_documentos, + observaciones, + responsable_inscripcion }) + console.log(error) if (error !== undefined) throw new DataNotValid(`Los datos ingresados del id ${inscriptionLength} no son válidos, verifícalos.`) inscriptionLength += 1 } + console.log('Bueno') next() } catch (error) { handleHTTP(res, error as CustomError) @@ -48,7 +75,7 @@ export const checkInscriptionData: RequestHandler<{}, Response, inscriptionData> * @param res La respuesta HTTP. * @param next Función para pasar al siguiente middleware. */ -export const checkInscriptionDetailData: RequestHandler<{ }, Response, inscripcionDetailData> = (req: Request, res: Response, next: NextFunction): void => { +export const checkInscriptionDetailData: RequestHandler<{}, Response, inscripcionDetailData> = (req: Request, res: Response, next: NextFunction): void => { const { responsable_aval } = req.params const { estado_aval, observaciones, id_inscripcion } = req.body try { From f1175c91783708df9b0ea2b4ed90d3c15c350505 Mon Sep 17 00:00:00 2001 From: ConanGH-S Date: Wed, 30 Aug 2023 10:02:33 -0500 Subject: [PATCH 045/180] feat: deny button --- client/.gitignore | 1 - client/package-lock.json | 5424 +++++++++++++++++ client/package.json | 56 +- client/src/api/httpRequest.jsx | 9 + .../Register-detail/RegisterDetails.jsx | 232 +- client/src/components/Utils/Button/Button.jsx | 5 +- client/src/components/Utils/Modals/Modals.jsx | 74 +- server/.eslintrc.json | 2 +- server/package.json | 2 + server/src/app.ts | 4 +- server/src/config/config.ts | 17 +- server/src/controllers/email.controllers.ts | 27 + .../controllers/inscriptions.controllers.ts | 7 +- server/src/middlewares/email.middlewares.ts | 16 + .../middlewares/inscriptions.middlewares.ts | 10 +- server/src/routes/email.routes.ts | 9 + server/src/routes/inscriptions.routes.ts | 2 +- server/src/routes/routes.ts | 3 +- server/src/schemas/email.schemas.ts | 22 + server/src/schemas/inscriptions.schemas.ts | 6 +- 20 files changed, 5775 insertions(+), 153 deletions(-) create mode 100644 client/package-lock.json create mode 100644 server/src/controllers/email.controllers.ts create mode 100644 server/src/middlewares/email.middlewares.ts create mode 100644 server/src/routes/email.routes.ts create mode 100644 server/src/schemas/email.schemas.ts diff --git a/client/.gitignore b/client/.gitignore index bd1336ae..cf8e07c7 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -8,7 +8,6 @@ pnpm-debug.log* lerna-debug.log* node_modules -package-lock.json dist dist-ssr *.local diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 00000000..821620c9 --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,5424 @@ +{ + "name": "client", + "version": "0.17.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.17.3", + "dependencies": { + "axios": "1.4.0", + "joi": "17.9.2", + "js-cookie": "3.0.5", + "jwt-decode": "3.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-icons": "4.10.1", + "react-loading": "2.0.3", + "react-loading-skeleton": "3.3.1", + "react-paginate": "8.2.0", + "react-router-dom": "6.11.2", + "react-toastify": "9.1.3", + "sweetalert2": "11.6.13", + "tailwindcss": "3.3.3" + }, + "devDependencies": { + "@types/react": "18.0.37", + "@types/react-dom": "18.0.11", + "@vitejs/plugin-react": "4.0.0", + "autoprefixer": "10.4.14", + "eslint": "8.47.0", + "eslint-config-prettier": "9.0.0", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-n": "16.0.1", + "eslint-plugin-prettier": "5.0.0", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-react": "7.33.2", + "postcss": "8.4.24", + "vite": "4.4.9" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "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.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "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.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz", + "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@remix-run/router": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", + "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.37", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz", + "integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", + "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.4", + "@babel/plugin-transform-react-jsx-self": "^7.21.0", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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/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 + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001524", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", + "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "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/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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.503", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.503.tgz", + "integrity": "sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-n/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "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==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "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==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.1.tgz", + "integrity": "sha512-/KxoyCnPM0GwYI4NN0Iag38Tqt+od3/mLuguepLgCAKPn0ZhC544nssAW0tG2/00zXEYl9W+7hwAIpLHo6Oc7Q==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/ignore": { + "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/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/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==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" + } + }, + "node_modules/jiti": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", + "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, + "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==" + }, + "node_modules/js-yaml": { + "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" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "node_modules/locate-path": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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 + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "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", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=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==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-icons": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz", + "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-loading": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-loading/-/react-loading-2.0.3.tgz", + "integrity": "sha512-Vdqy79zq+bpeWJqC+xjltUjuGApyoItPgL0vgVfcJHhqwU7bAMKzysfGW/ADu6i0z0JiOCRJjo+IkFNkRNbA3A==", + "peerDependencies": { + "prop-types": "^15.6.0", + "react": ">=0.14.0" + } + }, + "node_modules/react-loading-skeleton": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.3.1.tgz", + "integrity": "sha512-NilqqwMh2v9omN7LteiDloEVpFyMIa0VGqF+ukqp0ncVlYu1sKYbYGX9JEl+GtOT9TKsh04zCHAbavnQ2USldA==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-paginate": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/react-paginate/-/react-paginate-8.2.0.tgz", + "integrity": "sha512-sJCz1PW+9PNIjUSn919nlcRVuleN2YPoFBOvL+6TPgrH/3lwphqiSOgdrLafLdyLDxsgK+oSgviqacF4hxsDIw==", + "dependencies": { + "prop-types": "^15" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", + "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", + "dependencies": { + "@remix-run/router": "1.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", + "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", + "dependencies": { + "@remix-run/router": "1.6.2", + "react-router": "6.11.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-toastify": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", + "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "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==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "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", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/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, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/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": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "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" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sweetalert2": { + "version": "11.6.13", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.6.13.tgz", + "integrity": "sha512-n5yVF0FNx1lm4XzpPyb1HIaiptzODfVyeCzmB809tpK+1bPdoKoevKOxYjrtId75DV7xuIp4r6cjn8xUAB8dPQ==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/client/package.json b/client/package.json index a8f087aa..53ec8e1c 100644 --- a/client/package.json +++ b/client/package.json @@ -11,35 +11,35 @@ "tailwind": "npx tailwindcss -i ./src/index.css -o ./dist/output.css --watch" }, "dependencies": { - "axios": "^1.4.0", - "joi": "^17.9.2", - "js-cookie": "^3.0.5", - "jwt-decode": "^3.1.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-icons": "^4.10.1", - "react-loading": "^2.0.3", - "react-loading-skeleton": "^3.3.1", - "react-paginate": "^8.2.0", - "react-router-dom": "^6.11.2", - "react-toastify": "^9.1.3", - "sweetalert2": "^11.6.13" + "axios": "1.4.0", + "joi": "17.9.2", + "js-cookie": "3.0.5", + "jwt-decode": "3.1.2", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-icons": "4.10.1", + "react-loading": "2.0.3", + "react-loading-skeleton": "3.3.1", + "react-paginate": "8.2.0", + "react-router-dom": "6.11.2", + "react-toastify": "9.1.3", + "sweetalert2": "11.6.13", + "tailwindcss": "3.3.3" }, "devDependencies": { - "@types/react": "^18.0.37", - "@types/react-dom": "^18.0.11", - "@vitejs/plugin-react": "^4.0.0", - "autoprefixer": "^10.4.14", - "eslint": "^8.47.0", - "eslint-config-prettier": "^9.0.0", - "eslint-config-standard": "^17.1.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-n": "^16.0.1", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "postcss": "^8.4.24", - "tailwindcss": "^3.3.2", - "vite": "^4.4.9" + "@types/react": "18.0.37", + "@types/react-dom": "18.0.11", + "@vitejs/plugin-react": "4.0.0", + "autoprefixer": "10.4.14", + "eslint": "8.47.0", + "eslint-config-prettier": "9.0.0", + "eslint-config-standard": "17.1.0", + "eslint-plugin-import": "2.28.1", + "eslint-plugin-n": "16.0.1", + "eslint-plugin-prettier": "5.0.0", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-react": "7.33.2", + "postcss": "8.4.24", + "vite": "4.4.9" } } diff --git a/client/src/api/httpRequest.jsx b/client/src/api/httpRequest.jsx index c4a83370..55490a79 100644 --- a/client/src/api/httpRequest.jsx +++ b/client/src/api/httpRequest.jsx @@ -103,6 +103,14 @@ export const inscriptionDetailUser = async (id, limit = 3, offset = 0) => { return response } +// MODIFICAR DETALLES DE LA INSCRIPCION +export const inscriptionDetailsUpdate = async (id, payload) => { + const URL = `${baseUrl}${api}/update-inscription-detail/${id}` + + const response = await axios.patch(URL, payload) + return response +} + export const readExcel = async (fileData) => { const URL = `${baseUrl}${api}/inscription-excel-file` const response = await axios.post(URL, fileData, { @@ -160,3 +168,4 @@ export const getAvalById = async (id) => { const response = await axios.get(URL) return response } + diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index e85b9c33..121d7e35 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -12,6 +12,8 @@ import { Button } from '../Utils/Button/Button' import { Select } from '../Utils/Select/Select' import { keysRoles } from '../../import/staticData' import { getInscriptionById, getInscriptionDetails, getAvalById } from '../../api/httpRequest' +import { DenyModal } from '../Utils/Modals/Modals' +import { ToastContainer, toast } from 'react-toastify' export const RegisterDetails = () => { const { id } = useParams() @@ -49,69 +51,71 @@ export const RegisterDetails = () => { } return ( -
- -
-
-
    -
  • setSelectedTab('infoAprendiz')}> - Info. Aprendiz -
  • -
  • setSelectedTab('infoEmpresa')}> - Info. Empresa -
  • - {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( -
  • setSelectedTab('documentos')}> - Documentos + <> +
    + +
    +
    +
      +
    • setSelectedTab('infoAprendiz')}> + Info. Aprendiz
    • - )} - {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[3])) && ( -
    • setSelectedTab('raps')}> - RAPS +
    • setSelectedTab('infoEmpresa')}> + Info. Empresa
    • - )} - {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[2])) && ( -
    • setSelectedTab('funciones')}> - Funciones -
    • - )} - {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( -
    • setSelectedTab('coordinador')}> - Coordinador -
    • - )} -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( +
  • setSelectedTab('documentos')}> + Documentos +
  • + )} + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[3])) && ( +
  • setSelectedTab('raps')}> + RAPS +
  • + )} + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[2])) && ( +
  • setSelectedTab('funciones')}> + Funciones +
  • + )} + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( +
  • setSelectedTab('coordinador')}> + Coordinador +
  • + )} +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
-
- - - Salir - -
+
+ + + Salir + +
+
+
-
-
-
+ + ) } @@ -279,50 +283,83 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const Documentos = ({ idRol, avalDocumentos }) => { const [avalInfo, setAvalInfo] = useState([]) - const fetchRaps = async () => { + const [showModal, setShowModal] = useState(false) + const [notify, setNotify] = useState(false) + + const handleShowModal = () => { + setShowModal(true) + } + + const handleCloseModal = () => { + setShowModal(false) + } + + useEffect(() => { + if (notify) { + toast.success('Se ha rechazado correctamente', { + position: 'top-right', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: false, + draggable: true, + progress: undefined, + theme: 'colored', + className: 'text-sm' + }) + } + setNotify(false) + }, [notify]) + + const fetchData = async () => { const res = await getAvalById(avalDocumentos) const { data } = res.data setAvalInfo(data) } useEffect(() => { - if (avalDocumentos) fetchRaps() + if (avalDocumentos) fetchData() }, [avalDocumentos]) + return ( -
-
Documentación
-
-
- {avalInfo.map((aval) => { - return ( - -
- - -
- {idRol === Number(keysRoles[0]) ? ( -
- From a2f60eb16a14c17b8832ebf4e95f706511cbe6ff Mon Sep 17 00:00:00 2001 From: Loren Q Date: Thu, 14 Sep 2023 19:29:02 -0500 Subject: [PATCH 116/180] v2.7.0-alpha --- client/package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 86ff8c00..db1be5bf 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "client", - "version": "2.6.0-alpha", + "version": "2.7.0-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "client", - "version": "2.6.0-alpha", + "version": "2.7.0-alpha", "dependencies": { "axios": "1.4.0", "classnames": "^2.3.2", From 105abc9e76001a3b636b4baf07dd8b531ab1eca0 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Fri, 15 Sep 2023 09:45:50 -0500 Subject: [PATCH 117/180] feat: added select teachers in documentAval --- .../Register-detail/RegisterDetails.jsx | 62 ++++++++++++++++--- client/src/components/Utils/Modals/Modals.jsx | 3 +- client/src/components/Utils/Select/Select.jsx | 6 +- 3 files changed, 58 insertions(+), 13 deletions(-) diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index 6a2eb400..6a7b8dea 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -16,7 +16,7 @@ import { Button } from '../Utils/Button/Button' import { Select } from '../Utils/Select/Select' import { colorTextStatus, keysRoles } from '../../import/staticData' -import { getInscriptionById, getInscriptionDetails, getAvalById, getUserById, inscriptionDetailsUpdate, sendEmail } from '../../api/httpRequest' +import { getInscriptionById, getInscriptionDetails, getAvalById, getUserById, inscriptionDetailsUpdate, sendEmail, getTeachers } from '../../api/httpRequest' import { AiOutlineFullscreen } from 'react-icons/ai' import { checkApprovementData } from '../../validation/approvementValidation' import Cookies from 'js-cookie' @@ -519,18 +519,18 @@ const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { const FunctionsApproval = ({ idRol, avalFunciones }) => { const [avalInfoFunciones, setAvalInfoFunciones] = useState([]) - const [nameResponsableFunciones, setNameResponsableFunciones] = useState('') + // const [nameResponsableFunciones, setNameResponsableFunciones] = useState('') const fetchDataFunciones = async (payload) => { if (!payload) return try { const res = await getAvalById(payload) const response = await res.data.data[0] - const { responsable_aval } = await response - const responseData = await getUserById(responsable_aval) - const { nombres_usuario, apellidos_usuario } = await responseData.data.data[0] - const fullName = `${nombres_usuario} ${apellidos_usuario}` - setNameResponsableFunciones(fullName) + // const { responsable_aval } = await response + // const responseData = await getUserById(responsable_aval) + // const { nombres_usuario, apellidos_usuario } = await responseData.data.data[0] + // const fullName = `${nombres_usuario} ${apellidos_usuario}` + // setNameResponsableFunciones(fullName) setAvalInfoFunciones(response) } catch (error) { throw new Error(error) @@ -543,6 +543,34 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => { } }, [avalFunciones]) + const [teachers, setTeacher] = useState([]) + + const getInstructores = async () => { + try { + const response = await getTeachers() + const { data } = response.data + setTeacher(data) + console.log(data) + } catch (error) { + throw new Error(error) + } + } + + useEffect(() => { + getInstructores() + }, []) + + const option = teachers.map((teacher) => ({ + value: teacher.nombres_usuario + ' ' + teacher.apellidos_usuario + ' - ' + teacher.email_usuario, + key: teacher.id_usuario + })) + + const [selectedOptionKey, setSelectedOptionKey] = useState('') + + const handleSelectChange = (optionKey) => { + setSelectedOptionKey(optionKey) + } + return (
e.preventDefault()}> @@ -554,7 +582,24 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => { Fecha Registro: 31 Agosto 23
- + */}
@@ -979,4 +1024,3 @@ const RAPS = ({ idRol, avalRaps }) => { ) } - diff --git a/client/src/components/Utils/Modals/Modals.jsx b/client/src/components/Utils/Modals/Modals.jsx index 08611d68..2e691020 100644 --- a/client/src/components/Utils/Modals/Modals.jsx +++ b/client/src/components/Utils/Modals/Modals.jsx @@ -308,7 +308,7 @@ const AsignTeacherModal = ({ closeModal, title, numero_ficha, programa_formacion }, []) const option = teachers.map((teacher) => ({ - value: teacher.nombres_usuario + ' ' + teacher.apellidos_usuario + ' - ' + (teacher.id_rol === 3 ? 'Seguimiento' : 'Lider'), + value: teacher.nombres_usuario + ' ' + teacher.apellidos_usuario + ' - ' + teacher.email_usuario, key: teacher.id_usuario })) @@ -362,6 +362,7 @@ const AsignTeacherModal = ({ closeModal, title, numero_ficha, programa_formacion placeholderSearch='Ingrese nombre instructor' selectedColor='bg-teal-600 text-white' rounded='rounded-xl' + characters='45' borderColor='border-slate-500' options={option} selectedKey={selectedOptionKey} diff --git a/client/src/components/Utils/Select/Select.jsx b/client/src/components/Utils/Select/Select.jsx index 42c236bb..abf18b5b 100644 --- a/client/src/components/Utils/Select/Select.jsx +++ b/client/src/components/Utils/Select/Select.jsx @@ -2,7 +2,7 @@ import { useState } from 'react' import { BiChevronRight } from 'react-icons/bi' import { AiOutlineSearch } from 'react-icons/ai' -export const Select = ({ options, placeholder, placeholderSearch, hoverColor, hoverTextColor, py = 'py-1', rounded, border = 'border-[0.5px]', borderColor, isSearch = false, bgContainer = 'bg-white', selectedColor, textSize, shadow, name, onChange }) => { +export const Select = ({ options, placeholder, placeholderSearch, hoverColor, hoverTextColor, py = 'py-1', rounded, border = 'border-[0.5px]', borderColor, isSearch = false, bgContainer = 'bg-white', selectedColor, textSize, shadow, name, onChange, characters, textSearch }) => { const [inputValue, setInputValue] = useState('') const [open, setOpen] = useState(false) const [selected, setSelected] = useState('') @@ -18,14 +18,14 @@ export const Select = ({ options, placeholder, placeholderSearch, hoverColor, ho return (
setOpen(!open)} className={`flex items-center justify-between w-full px-2 ${bgContainer} ${rounded} ${border} ${shadow} ${borderColor} ${py} select-none ${textSize} ${open ? 'mb-0' : 'mb-1'}`}> - 45 ? selected.substring(0, 45) + '...' : selected} readOnly placeholder={placeholder} className='w-full text-black outline-none cursor-pointer placeholder:text-slate-400' /> + characters ? selected.substring(0, characters) + '...' : selected} readOnly placeholder={placeholder} className='w-full text-black outline-none cursor-pointer placeholder:text-slate-400' />
    {isSearch && (
    - setInputValue(e.target.value.toLowerCase())} value={inputValue} /> + setInputValue(e.target.value.toLowerCase())} value={inputValue} />
    )} {options.map((option) => ( From d8d91f5a27e9c0e9a8e987648f4fde8b8a826b95 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Fri, 15 Sep 2023 09:49:11 -0500 Subject: [PATCH 118/180] v2.10.1-alpha --- client/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/package.json b/client/package.json index 6c467cdc..0097ab4d 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "client", "private": true, - "version": "2.9.1-alpha", + "version": "2.10.1-alpha", "type": "module", "scripts": { "dev": "vite --open", @@ -44,4 +44,3 @@ "vite": "4.4.9" } } - From 3e35c5df1b984d4912885a4d1c13848087e3c1c4 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Fri, 15 Sep 2023 09:54:39 -0500 Subject: [PATCH 119/180] feat: database --- server/src/db/db.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/db/db.sql b/server/src/db/db.sql index 6aaa4058..7555eb57 100644 --- a/server/src/db/db.sql +++ b/server/src/db/db.sql @@ -670,7 +670,7 @@ CREATE TABLE `usuarios` ( PRIMARY KEY (`id_usuario`), KEY `id_rol` (`id_rol`), CONSTRAINT `usuarios_ibfk_1` FOREIGN KEY (`id_rol`) REFERENCES `roles` (`id_rol`) ON DELETE CASCADE ON UPDATE CASCADE -) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -679,7 +679,7 @@ CREATE TABLE `usuarios` ( LOCK TABLES `usuarios` WRITE; /*!40000 ALTER TABLE `usuarios` DISABLE KEYS */; -INSERT INTO `usuarios` VALUES (1,'Admin','Admin','CC','1234567890','juanlestar12@gmail.com','3195810996','$2b$10$G/qBWAkBBWWYv168liiN4.yNHoflbKb9y6nUEFZvtVomsVCNQhmo6',1),(2,'Stiven','Blandón','CC','1017924888','blandon0207s@gmail.com','3183577499','$2b$10$GWUNM.FJKmU81l5dW0pDBOuc5EGYTeYjJxa9ENNNaioKoWM3QR.aq',2),(3,'Adelaida','Benavidez','CC','1017923453','adelaida@misena.edu.co','3183575433','$2b$10$wskcGpv.zlFyAp1gWLZSpunAe5uqGcgJ2yAhpzOQyRWdlpp./jUkG',4),(4,'Juan','Esteban','CC','1064973453','juanEsteban45@misena.edu.co','3133675433','$2b$10$SAeF4T/nxMHjfl5LhHzqjOI920j/dS9CU8NCpDecLicv.kSxegV/m',1),(5,'Líder','Líder','CC','1234567809','Liderlider@gmail.com','3195810996','$2b$10$dfg1Lu3pt3y169EKQZPKeOHPu/dcqpEOfPbwFgtkhAnegXbMFBAyS',4),(6,'Coordi','Coordi','CC','1234567098','Coordicoordi@gmail.com','3195810996','$2b$10$qN1T5s1.6iHJhiyayLFl5u8MK7YeKpaIz7U8ATCJilojcFl3a3kvG',2),(7,'Seguim','Seguim','CC','1234560987','Seguimseguim@gmail.com','3195810996','$2b$10$AWKbnyNkMJ9MlVOuBlTk4.0R8Kx.e5appDM5E.1bw4QoYyQaQ85zq',3),(8,'Coordinador','test','CC','30079181','coordinadorsena@soysena.edu.co','3195810994','$2b$10$butEm6QiAzC8aMjFap9WvueEiyzU8RjupzHo93xrRcdqMVJ3OHXQq',2); +INSERT INTO `usuarios` VALUES (1,'Admin','Admin','CC','1234567890','juanlestar12@gmail.com','3195810996','$2b$10$G/qBWAkBBWWYv168liiN4.yNHoflbKb9y6nUEFZvtVomsVCNQhmo6',1),(2,'Stiven','Blandón','CC','1017924888','blandon0207s@gmail.com','3183577499','$2b$10$GWUNM.FJKmU81l5dW0pDBOuc5EGYTeYjJxa9ENNNaioKoWM3QR.aq',2),(3,'Adelaida','Benavidez','CC','1017923453','adelaida@misena.edu.co','3183575433','$2b$10$wskcGpv.zlFyAp1gWLZSpunAe5uqGcgJ2yAhpzOQyRWdlpp./jUkG',4),(4,'Juan','Esteban','CC','1064973453','juanEsteban45@misena.edu.co','3133675433','$2b$10$SAeF4T/nxMHjfl5LhHzqjOI920j/dS9CU8NCpDecLicv.kSxegV/m',1),(5,'Líder','Líder','CC','1234567809','Liderlider@gmail.com','3195810996','$2b$10$dfg1Lu3pt3y169EKQZPKeOHPu/dcqpEOfPbwFgtkhAnegXbMFBAyS',4),(6,'Coordi','Coordi','CC','1234567098','Coordicoordi@gmail.com','3195810996','$2b$10$qN1T5s1.6iHJhiyayLFl5u8MK7YeKpaIz7U8ATCJilojcFl3a3kvG',2),(7,'Seguim','Seguim','CC','1234560987','seguim@gmail.com','3195810996','$2b$10$AWKbnyNkMJ9MlVOuBlTk4.0R8Kx.e5appDM5E.1bw4QoYyQaQ85zq',3),(8,'Coordinador','test','CC','30079181','coordinadorsena@soysena.edu.co','3195810994','$2b$10$butEm6QiAzC8aMjFap9WvueEiyzU8RjupzHo93xrRcdqMVJ3OHXQq',2),(9,'Claudia Marcela','Aristizabal','CC','0000000000','caristizabalc@sena.edu.co','0000000000','$2b$10$gX7Ztmkj6mIUhdo8cVcAP.LKPK6k5F2VizfGboe.E1JjzlLJQunIi',3),(10,'Claudia Janeth','Restrepo','CC','0000000001','cjrestrepo@sena.edu.co','0000000000','$2b$10$4PRkVOd6JuSoR.zMA76xtuARw.cKQbzkTUHyelUEI1rHEd5yi2wjK',3),(11,'Yuli Milena','Acevedo','CC','0000000002','yacevedoa@sena.edu.co','0000000000','$2b$10$qE1awM.igdYZ.0EXSQeUHOjpPQEn.Hj1kgazW2bcOCORjX52QYT0O',3),(12,'Gloria Patricia','Arboleda','CC','0000000003','garboleda@sena.edu.co','0000000000','$2b$10$PjHGV9Sjk6NMnTpDLGhTles5PHeBgS//wSQ4V9s4iEPTR0zN34Hd6',3),(13,'Gloria Eugenia','Sanchez','CC','0000000004','glesane@sena.edu.co','0000000000','$2b$10$dSxRwfVSQDaTIL9D2i5wSux5NCeXxZftD60F9Ap2TiEeuH7f1Yn0S',3),(14,'Genny','Carvajal Jaramillo','CC','0000000005','gcarvajalj@sena.edu.co','0000000000','$2b$10$SrO76ixNj4VmeQdtXGHYzOrVV.YVUo1nK4a25ofJyLRFn91b6UXj6',3),(15,'Edwin Alberto','Grajales','CC','0000000006','egrajales@sena.edu.co','0000000000','$2b$10$Ji7Q703dGCuRwuwo2MCEKOO35CQbIcLGn50uKLLNUaW1FFAwEPOYW',3),(16,'John Mario','Zabala ','CC','0000000007','jzabala@sena.edu.co','0000000000','$2b$10$CXJEkHRFGhSo.6Z6obwwrOzickwhwDU3rXOplP/Pm9vpEl1N3z4Zi',3),(17,'Juan Esteban','Arias','CC','0000000008','jeariasg@sena.edu.co','0000000000','$2b$10$U65uMTNcwC3u/SHZp84PBeH1njjBUeAsB0LkJjm.ne/TAPWaCYRe.',3),(18,'Heduan Henry','Ospina','CC','0000000009','hehospina@sena.edu.co','0000000000','$2b$10$SkfsFcfZ6taIwn99uL/iCuO3caqoqAkWTpO5P3K1q4H/tJgTmzkYa',3),(19,'Jorge Ignacio','Llano','CC','0000000010','jillano@sena.edu.co','0000000000','$2b$10$tmm6DlX947tMGWbFe2v7weN/zAdZSIoyWyxJi/kKy1pXJl.mpDoiu',3),(20,'Litarsuyo','Serna','CC','0000000011','lisernac@sena.edu.co','0000000000','$2b$10$5Fn0qmUWNNtsZFdncSkF0.PqZFn//yGimnF9QL.u1bWHQ0GxMKNvy',3); /*!40000 ALTER TABLE `usuarios` ENABLE KEYS */; UNLOCK TABLES; @@ -728,4 +728,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2023-09-11 11:19:11 +-- Dump completed on 2023-09-15 9:53:40 From 03ab5957dbfac2091b75b75ae9db02c063a67da8 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Fri, 15 Sep 2023 13:43:59 -0500 Subject: [PATCH 120/180] fix: style pagination --- client/package-lock.json | 200 ++++++++++++++---- .../Utils/Pagination/Pagination.jsx | 2 +- 2 files changed, 160 insertions(+), 42 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index fef4e5a7..05b1b9d8 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "client", - "version": "2.8.0-alpha", + "version": "2.10.1-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "client", - "version": "2.8.0-alpha", + "version": "2.10.1-alpha", "dependencies": { "axios": "1.4.0", "classnames": "^2.3.2", @@ -77,12 +77,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -144,13 +144,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -194,28 +194,28 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.19.tgz", + "integrity": "sha512-m6h1cJvn+OJ+R3jOHp30faq5xKJ7VbjwDj5RGgHuRlU9hrMeKsGC+JpihkR5w1g7IfseCPPtZ0r7/hB4UKaYlA==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.19" }, "engines": { "node": ">=6.9.0" @@ -267,18 +267,18 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz", + "integrity": "sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -299,9 +299,9 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", @@ -313,9 +313,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz", - "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -355,14 +355,14 @@ } }, "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -390,13 +390,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", - "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "version": "7.22.19", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", + "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.19", "to-fast-properties": "^2.0.0" }, "engines": { @@ -904,6 +904,18 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -1001,12 +1013,48 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", + "integrity": "sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/node": { + "version": "20.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.1.tgz", + "integrity": "sha512-4LcJvuXQlv4lTHnxwyHQZ3uR9Zw2j7m1C9DfuwoTFQQP4Pmu04O6IfLYgMmHoOCt0nosItLLZAH+sOrRE0Bo8g==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -1425,6 +1473,14 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -3001,6 +3057,17 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "optional": true, + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4811,6 +4878,29 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", @@ -5048,6 +5138,34 @@ "node": ">=14.0.0" } }, + "node_modules/terser": { + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", diff --git a/client/src/components/Utils/Pagination/Pagination.jsx b/client/src/components/Utils/Pagination/Pagination.jsx index efd7f01c..9c593c0a 100644 --- a/client/src/components/Utils/Pagination/Pagination.jsx +++ b/client/src/components/Utils/Pagination/Pagination.jsx @@ -4,7 +4,7 @@ import { AiOutlineLeft, AiOutlineRight } from 'react-icons/ai' export const Pagination = ({ pageCount, setPageNumber }) => { return (
    - } previousLabel={} className='flex flex-row gap-4 my-4 pagination justify-content-center' pageCount={pageCount} nextClassName='btn w-[2.2rem] text-center py-1 bg-purple-500 rounded-full hover:bg-purple-900 text-white' previousClassName='btn w-[2.2rem] text-center py-1 bg-purple-500 rounded-full hover:bg-purple-900 text-white' pageClassName='page-item w-[2.2rem] text-center h-[2.2rem] py-[0.4rem] bg-purple-500 rounded-full hover:bg-purple-900 text-white select-none ' pageLinkClassName='page-link' activeClassName='active bg-purple-900 text-white' onPageChange={(data) => setPageNumber(data.selected)} /> + } previousLabel={} className='flex flex-row w-64 gap-2 my-4 justify-evenly' pageCount={pageCount} nextClassName='btn w-[2.2rem] text-center py-1 bg-purple-500 rounded-full hover:bg-purple-900 text-white' previousClassName='btn w-[2.2rem] text-center py-1 bg-purple-500 rounded-full hover:bg-purple-900 text-white' pageClassName='page-item w-[2.2rem] text-center h-[2.2rem] py-[0.4rem] bg-purple-500 rounded-full hover:bg-purple-900 text-white select-none ' pageLinkClassName='page-link' activeClassName='active bg-purple-900 text-white' pageRangeDisplayed={0} marginPagesDisplayed={1} onPageChange={(data) => setPageNumber(data.selected)} />
    ) } From d118ebb3004a79c0ecc67593028ba651a1051804 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Fri, 15 Sep 2023 13:44:28 -0500 Subject: [PATCH 121/180] v2.10.2-alpha --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index 0097ab4d..284f8c8c 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "client", "private": true, - "version": "2.10.1-alpha", + "version": "2.10.2-alpha", "type": "module", "scripts": { "dev": "vite --open", From bde11bc75bf94824b64f0706776237d022794f5a Mon Sep 17 00:00:00 2001 From: Loren Q Date: Mon, 18 Sep 2023 09:30:20 -0500 Subject: [PATCH 122/180] fix: scroll --- client/src/components/Register-list/RegisterList.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Register-list/RegisterList.jsx b/client/src/components/Register-list/RegisterList.jsx index 7ee0c200..0f5044b2 100644 --- a/client/src/components/Register-list/RegisterList.jsx +++ b/client/src/components/Register-list/RegisterList.jsx @@ -276,7 +276,7 @@ export const RegisterList = () => {
    -
    +
    {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( From 5428d3ef682fc629f79668fd49236c837a1a8fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stiven=20Bland=C3=B3n?= <80909795+ConanGH-S@users.noreply.github.com> Date: Mon, 18 Sep 2023 09:42:15 -0500 Subject: [PATCH 123/180] Add files via upload --- docs/Actas/Acta_No._7.pdf | Bin 0 -> 258636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Actas/Acta_No._7.pdf diff --git a/docs/Actas/Acta_No._7.pdf b/docs/Actas/Acta_No._7.pdf new file mode 100644 index 0000000000000000000000000000000000000000..70f764ba881b4ca1e1c96b28f293485a9bcd6b33 GIT binary patch literal 258636 zcmcG01y~%*wl3}j3GVLh8iKn!1Q}qE0E0UOcZXoXJ!o(U1OmY!KyY^m?(T2M-us-r z?~!}ndEXnRzwVx1RrRm6s%urRzi4U|2`OfF7G6{&>U!`86^WgUjm*yEEh>_b5UYlV zJ&;u#;0&;_vtU&LSOA^KIKY?HSQP*u3p$_^JsGRIv!jctvxXxOsAgy9OvcUi>$)Pq z(OMQ{ZU?U8`4DJE1{MRpdc~>;bOxA#D zE3aOmA^|~Wzo0xf`WH;Uu&|2TxqzI>xLD<_%$)SeIG;MyRjQd#|H3PCg zSN1IT50!zn12^ydyLxIsCp#BMFc>g?Nq1*yb!UJx5PU4H&Q10kY-x2qvR_Srb&|3J zIfE}sv6KC3n^lT~jQ_b=Rw+(0cHZYBu#k?j$y=c5vz)9g*pTe}WZ>_!(63Vtb~5ny z@24DO9KRX*x2v3F9KW>tU6_lE> z0a!&rAUkKUo!EahM8^KB0W$XA%*Ot!LbBhSLiU>n49LLlGP44R*}3b3v9Xcy@^g^! zuycTa7YC~hHkT9GZ|;_Mv~#fstM;qE{5oM(XVq{7fSl}~&1&kwDz45d0d%!81*%Dl zfw5=+Oq{?XzjdD9Oz%X-_Gd3WSNw;Uq^xY5fsU+FHefGE08Q=8fUF8YkcG1)88Yj z#-=0xUvn-Y8F4PpjLb%V`GA~8rd&=WZ*ljL@6*qR zjuU|D!zx<$bSQjxdgE5!_4)O!rlyueUminR`KtQ2lg{GlPki~*xUgkby47M@KxA6U zlPZsg-QwlecbY`4B6JbFTiL9K0+SmcK2dG8MWSoVA;-2b@yf)ex)GO!Y(jY)St2?m(bTzJUPM9z&0jGU9udH zZ2V;OP{lCyWaxcAzNamnvo&93TBi`Nj z6LPUiQ#SQaNjJL=(7yDO6`&?X0U6YyV7Ps627%A@p)$L28<<+(!}%J0d<|(w?c59dxLh|_%!-GNHm!}vtnHq600sL(1Rgra|4|x$ zoSMun-}7s38KcB>^^dX1Emgc6``X)^!DEwo(dft1O0qHC{e0d&X9JD)P>q6c-9q zholFtR2ym#UpqT^MHjIUWdgc_^Aj62`+cyuAxKHch%}D8+d?s-4$7Mk5CtOJSH(im z^-_X*nRLG!i4j^(lF3!W3-B)lvij=S9^yc6Xv%)rx{BnS$lmT_ZOpc_=QAu5EfK44 z(ks8C+eEzYUMSF@F$Nt*4y}*FQhg+~<4Hkpn6__ht#+$a_K_Qd{6e3?5s8STJ{Z0f zN<+KG|5NVG6kB?x2`X85X#sjs9GVWaIw0IvRf{J&kcXo=22WTri6gW>m;O+=PdFt*f3r$D0bP4n>jPqVsd1|J^GW($SB}!ZDeO>hB z3jO)=Z0M)zt4qzJlK%N+5!9`dCOCd|qh{UHtA`TBVY?c#5z4fs1QY z{`JQ{ezMig%LuV78nD%^tAsw)?#G3Ewmsu0No_2DKe{jafx23P8dE2-nYxq)G8lls zn7AfPwUN*5XeuuTP2-a`{L1$eFjN~uP-I-b7Tl@4p(6~@5Fd)uXLX$Ahc9> zY&MT%nwznEP{D4mS?RT?bVHe>y5%CKWZIV?>$tabG8WCF%}-w=S-7Yx3`@_b6uS{C z==8Co2P=r~8n(!m_Corf-F$!BvbZIAba`}<+3 zsb*(F%{I(OT2eZzm%Q{5|4bkNSqPxxG%@}-7ei)m^mZ3&O=8LcPO1n$wV>4Ukp&>s z-dtAS5?{J!pWCbLtCpr%fgAJn={RNb#%QW~dlojGO)CN7nhr!X72)@pyWY}8bJcQ~ zOYfysooutoIU|e^2SnD6bgVM2$db+Xn5a3xiJr|1HfoJgrq4X-sFdH>JY$EA^oO9< zHR8XF9K6H@q#DK1UGhSh14O-LF7H`7HW(4skJ5$%;_U<9LE4cW$>IBXEREUT9MH`Gj5ml5?M}LJTM*942@~G4NKxU&J zp(iAl37x5^0KV{3#oCz>(d3Vh8pixYWPKsM#g4X)kLg;#tsKKy!Xk^Y_Y&s@dMmGN z#<{F$Jfy!gGXs+NLo(`Y6-ucIAxwho=k#hnB6T25J$7*ql8T>w*j( zn|7Eb^T^TT-kRXIJ{^QeF_s)c2o_fAcpM8oIY44XVp|yF%Vh7^M(2|n-d8^qO zda;$xbTLzeIzm;OI~BvM(^A#y(4SEO9rivi(Z5)@!<**XE*Uu+?kZ=j-~AA$m+SzV z;0`3bYcpzLn-5LzL!~QX{O+DHM;yFPLvv=UzB zJfMV{;aiMah(yC8*OSm9Qg0o31yn=%gP88B*P<|0P@-%jly4Ta6?NrtH*H86g<>AO zHkeXiUe&GzGViHT#ytXT)j8Oab{R;CI=vf_m&Q!iXj#ejP17#r5j$CS3GJIGo>k{p?Dy3^=t z)t)agAKqLU_ucTj#ceM?jIS-e*>PYO9_8$qoSF2KnNZX%=yo+PvWlEHdg(%V`RyEi z8d%(vUT7W^D*Xs!Ov6R%B1;<;x0!J+cD&;LG_+&7ycIYq-4EOH4E z9#`l9Y-k14f?!iI>?@C4cNli^I95MpA8&|k=0n5IlQe-xK^QdM%#Z7)-PD$8oAVOd zySCMASP~d>a8)3AcJjb6I#NDa{S3_RVlQvKb9nBGA9W~354`txaMJl7>@&P|rWr*} zzH=Ak0)`n?IBTN@{hQXxd__-lx{5Wlx1?9L!UshBJqOcxWGV+P8xYf_C?L%e4FV?| zdET0AY*PUZnBhAtV&Hx@?&=EK1d^vW;*=e&kix}ABynD^UoS%q@uGdji7ur)LqUKU z^j5|wQ7ah{^(|0G3-Fqv$Sd67;~Y+v`&S1z#fxL2$eb zS7rKo8o!ng!H5%{UQT1tXH)tYF%7ruA*2%6|;q#)zO)W-X;>;oHpt#?Ee!E~is%&kz$B15pjRZfVRbr*Q9vZfs7uu9i_Jkchh02Gyl7-uf*DK-z1r}vhAbT#` z(fQR7qucDBLz>K8C+=U%VQa&Ye0Ze6*d-6s{=V+ zl$1IdjNu=LL8)v{5w5J+B+$f4Az)$6#782}my!MUp>jQ-Jj)!9oWl!UjH z(R-oRKvCvRD3UMd`2?cH$^~Q=Ivd8mjB$EwkU|vAL@Jp=8N2EfGQDq)m_WkV2Ze%y zUWVZZYsvC4++n$+Frq4}(t)JT277^rtP$|c?~X02 zyIF8nkuByb;Id{9csk!4xo*vIG-&clYA-nZI7HvPZSir6F6QNSD(bzQF4~T0#mKY5 zN{k8K_+Ec+H)=a$prS`2)o<5Hz*YY>$vS)6d>qDLw6Y%8ZnV+WOKd&uAUxxwdMM!e z<`ow!6ALW$lJC0PJ{$mreHn8qW)7(au5ss>uW=4_o77!n892-X4Cwn-46)x0S+4AH zK1g(pxGO&d^kaZZ>_u$PZBy2JNvBONn#^z0jZX5rNZLR3*wG>%e5%DO5gfD-op5vw z8Oe`{ZcCf2tLSooL5@GUW#4v;>PVj+x)zEgTBtK^Gk8Cfoz9rS>a*jyfBH_$uKQ=l znS!03w@aUK8-@=-<5{hiJ`Reujw_;xzHpUDAu6Xn;b#ZD^j`4&gdpd0fg?MuHb!Gz z5)2x?p84_?98eB^t})y2c4?4e-1I|44w)8h?`FO02wu5vg}8+k@Bi${wq#nHXp3@6 zp#IGkrtMozf#<+?^7hZGVkrZ3TjomA{Ege2K9T|%O7@_b0K6^pq%OY3kElMMX`9iv z7Swq7HeH%H@i!MdiB*S(b`hLF^pqJ9FVJP}LG;waF|We9_#6FW*tX0i)-v=7doH6sduIB0UvB1PeUt<9897L(zfMq+1_75?OIj&N1^`sh)L*2PtDUVfd3#f ztJ2e@A{UDq|2_&8QadCT=!{nUy;?Xmp<4KT0{)2&o_7Uxxx{QUD;)9G{LEX6fKn?V z!i~hY_P9ChS+VzAN6)gFYYt72cjr|{YboeHlg=#EEb z|G1zVZ=hsTNBeTy?ol)Z!N9>l%p%lKo{_^aSm$9d&S|?VQ)#VOrrK)a?7{nlYURYl zp`g#AY0H*Eo%%q9SZ2ZE?ExxnBt||OXb;xmCfnej zjv)6FoSR8C132X~v$W)h3P-SrBS`tTV_tz{G-X#Jf^{M+xU+MYcpm7LluS5xT6Huh|M)Zi#QGGk{;kb zToM#E6i~EX)4*wWP{3+#duuhM@+DG1b)PB_N{AQ*=i;Mb0-wUDa|U_$w8I; z>QPRY$}noqHM#v)UlZ)F1+Wb&nG}VLyw+5VvA}1$CCB^B7*6|f5aI3f!#&SULsMEbRM8{q4_h`)ksfl*aU-0Z1v5<-V2j($H;&>KhcB{`(* z%W3nr2jO+AU+yr&*Cv+IE-7od@aRsZo&=L5Bi)oS(|lTL)AesjtETvitMpDb+C^qI zw1s9NZ%EsCst#ppn_)sR-Qt~94fM1vMF;5He7`Tivpbd|Wq)?!aNDQ;rf+f)>-{?U zT-DJmTXb)*W^CwvW$7SYO{1)AI+&wy}-m zd8bc+S#-uRk)=B~M)855*?Gl+0Vc7zrmGOwS=hnq)!SlYm3AXcv{V{y%C1ci4gOCK zUKF99W9Ai=m8^>yI}{yJHAHToqfb1|Eg)JxwA7uXadgzxgzp!o^yTkwCfl3dIz|eH z08p88n9t;SwTjHyDwyPrL8FuA!!{6ir7d+gX{8-e4NSp1_3yI2Ents1rs_L4=@Q~~ zRVFaZnz$6%gA1tg%V-*CQDagAWs43)u#;TE?<_8P7#$otY&KVzl{kzIJ8W;>r5Wu{ zrzLa{w_*pCe5+Y(%^a35)!OXi5LJLnmKJT~1O~Ra)~Iy5rGDU(f0@{#fijgA(P2;l zf>DdFoTO(MYmzxB&P6ZK|K61*W2$4ckwW4Rt`3Y1_p{_MH?l{1jZLP}+`Yo6v7T;n z^ujk!MG`($c7UTw@gN-Mz}h)!FX@#3AR^0x+xk<^oeiRD(9<}k>?3P#!KYW-*=OM= zzO5gyo-8y9ufGNfKkziYTcPTHDm-ww48KUkM|}J={(j>rs)+9?g{N!UD>|ej?n_nOUBNpX33d$HCi^0!Y0fTpmn($M zF3!K2M2X>4X2hrFR)q#UH&$-hM4(=9oHCr~M}Wpp#PH;k*KM|sK_`Y;mPwK$#EH3u z60j{Wa0(+k5K zTd_03swu4MLb8p+^w%|JL)~h^eO>4|a_Fkx;1X4kYL3eI;iOCf?{R{v%Vg-JxHlA> znvN>P{rE-rJo&n1T{h&%n`k}wowf&@ltHQJtDb9fS(FQ@rLBwn+-oGmPj(Z635AF0 zrKcW~i;(eWDUik9w?1$oDp&Dw>Rm7kS4mGoH^Y9{G}a^$A;<252k`oPRhHLYj(O-+ zbd|@AUgv^NgUL-_(@VZeX*j)gpQL{MmA|d^x{ln|!QCi`4Yk2aO^F@GNCv*)I@uT>O$oT15Bd)e$2te2`+Bt zYzZbm*nZ{X|BUsyI4S?zF*64{518q(mjPN?SUQvO@N=??x?21KMaIR(4rX!Oe>>seVdwhQr1o!; zTx@KtI=`3V;AR6S<^j*ic2+|~tWyeypTWZdkWEc`rVoV;u-oIGH*NlYEgEondVL#$F@ zx=-{Erb*P)*~$(C=8-hjWS=)WTL73TvJt>||X0>@3_IzeE223zFl{!@)1Y?%#prWMkpr zCgTL}xWJ}l<6+?eo05x@g@^sWK(tzFtxNY z1@Lmdwzc}V-IDt+82=ot{uxH_T?59*!O!u0^KkL;vhZ{Mj`+VY<$sKk=PwxlX_Wd` z5tZ}rgRq#mgruY-qc}J|nK)Yg$KjOy7y14#246m&zlYObbp2nD{zHuUYoz`)sQrqk z{{z~;A9H!ZvG4D}6nygcVETONZ^4wC<4?hqofjPWpPT;|!SuHX%Kg`Y7Cb{>21i;j zfzJh|{XUorTce7wJI$Umla?imLLH%=OwIPX4P9iAsE9eK(0iOC=YF;PL*#AWX9tnh7e ze9wuA+55=$JxpadYViF46Np>vbM)G`CJMP+m58-~C<>$i*f1Fg-(#cH#5y5?qgJoO zz2L*?lE+;vNf*PfZC74bSzg1Rx3YTK9HpZ*FTP=JDW~A9*W@pbAC581D)91J=W10o zYNjg327lCWI<@ri*RAMt?yN;4fUWh2HxL-f*xxx9@bsKD4T?w@Ezl05q0JP~G zDkIKsQLKLO)+`dFvS#YjE)3fJSYB2KY!XqHuC&4TnkIE&8JTd=HSvHdL8eCe%)pFC$PDnPm`rDzG(v?j z$9E*3<}+61Aa$k{yRKd}Zl&a{Tn{lA`cn74jS`>HtECm&99Tq{Rq=!EJ2SB8NNQU@ zvA9fkG{HzzMFYpd#Q%VmbI0d#264lD5vPA zrRS?{LV~jF7olx<83>hdm2JhK(?Au zu){<%EgW2E@p3P(+>N5UQxM|LCG&BK;Z}~8DD}V_sRLF)7doxPpHI8&o0f8M?jJ|C z(ZYHi?b1z))J`mYAa|rY=yp%2lH>rI9B7l+_vp${h8pjP(7ulDg7bE|h*qX|#q`oO z0~D{cUYdJJ_W3<+`@a);)q>%-G&6tj^6P=)Qwwp{$1ls9!u$-6d@o*Hx6UC46(`!F zvwgLQ+$^N-ajn)RrzX46@ews~NHfBU5E)SR^7(SEYQLbj&^+QPNiwuJd85(r#5JvE zrlmsdIwJ!R6qs3w?5{B#%B5r z=X_tHe|s>ptc{VTNmQe4o((dwLL6F4s}Ob;#Qa`q`IpF%=ulS1@A^hVPedDg{(hNF zmgwwC!`pt#0s>g>HKWxH-yCK8*a*f_^phB1yHhBuA1qsaglyV@kIun#1D8|OmA;eV zCGw%)XqQPj=zMo{2UT+#e#I$|Fd)9)2}EF07-4laRI{Y} z!Jen&%;9;L1v}0&Bsu#I5UyTm+`xnrjsvoDb7Bx;X*kpTt{rfos?*RE`n85n`5crJ zy1tQ)xUGYScftY9^IclFZGJ1&<0S*CO=q?<)0t%5^DJA}W0rJ0 zsG_3Z;xs17sv-0`5h2FIVY8cchU8zTb~n9Tkbn@%Cd*e=7^Yt&p}Ii3?4{O?&gSqCTEpfa|=wYjNX9G(zb@Lg7P zrk>ix!}j^(>uC8Iwu)K4d5Eu~7rNPfad&QkK1^h7BquYKT#R1{S7R$Xq5VPGFT5Ld zAVqG~*}YIUrX@WvKO685UeC{Zf}5nqC)b zn$oVyQ_NYocCM$amED9HlH(l-#jBvr9>wUB`1wlAF2RH1&-@4#eA6 zq!cg)fMY*g2>COoA*CM-E-=?=(9Ga;}B*Ec8eIjqX1A|)3u-FKIM zib3|0l#@jfDW<1bbYtW)-8SKLsl#Q+UA;E*AiP?I8-SJxU#05C5^4I9s<%PqFf&`3 z_EzYvEyL_gO=J#>2Ss%ze>8QM18IL1Gg6699Q7v+Snq z&BOp{Sw)Lrt5w`5c&IHZ#!1e26`LC18}PvFbz%eX<;4uz8y6Qd5tf5k$z*b}Lc5eN zEjx>ygWAyIzA06s{CU9C5Lpm_0GstVCpV8$NjkGSspb}kh6ab!Cu?ZDbFg!6myf@S z7P)zLY^EOQ(}O7ttI}QELnj!LlAlGX-EO9d(Ga4WaDcjbS0)9Y)sik!>`hH;v z^a=D+>NfH_(tXBG_7)&(-BMPk~tyZ6(?10hdWV`Uc%qBRBi`7s%?!l{i;0#w;7?^<;l_!G2iKjW)kv{M@npKRhx zqvX$*suI0sK46Z_lu79r7u~n`K}*bHL+ef_Q_>-roaY4K=rB6o5h4()u?I{pEXpDl zK7K-DghciAK&()D0{XUds1IOh=xe(BTn~QlYLQc6;RP9!Ea2t)blIJCK!VEzch8_Z4d0hH7DR zxCWPHK_$Xg+aI!uE!z^p5}{bNVDKcK4Aj2<8U60oTemhpOQo%S9`q2O5ehEcI|^SuMco$ zVrTf2XW$3#Ki~Of1=~J68y(&Y4L^r5Ku71a_vDy$vo*=JIHyaZJc9r=DSkvJoMa<5 zDPNpI-*lydatc|fMU<314*BZ#NG-loF@uNzVFr_4AmIf>VzEk6T>5 zFb=q%@TZI5J5$_$KTosZR%W43VrjIfpv0(ZWUwMNm@Q07qrDKeH~HMaa>~MIMvwER zt+t>^mc5)o>YPl3)>w$l=*fq_yWLRRs+$l(c@2MJ|GuC%)P~pj#`$`eX%od|&aam% z1{FTgY^1X9^=#Pkd|9sxE<%~I;szrVmS0yEF zKb^QhLky6<-6yyaHwA=wcRm-GDKW&0_!{M1qi{Vwq_aOCP2ptsA%dOb=Sg8y$@X78i1EHpxBzt^vD* z`RHKMcVP|G1Y~x265l)*?%NXXt61Qsv`oeiHe_V#r$orlpGsA{+P# zLCY~FOi>zfYE}0wB1926366VHj83sUukJ-=GLLl}q_N${8grp7@>@)bF{31= z7VO38SL~Q5Mbs+Gii{C0o-anP%h?z|(Y=3j&EbTHrjD{-XDbG&t(*g>I~s*Sx#=tg zzQ~2UWZ@d;-n6&E7s|GkZV_B>rU0zK@qD+g!WmmAVEmCtPgWLDd+H9w*U*&p#ZHt6 zyIBoZ=d>Z$gS9s#5MU*F4Gacl!eG?+(y5`%Lhkz7k zKW=WZn6HJ9);}XQq+2Hs4==WBZgucE>svf^a{;~zuf~$QWm_?5Jlff=kMF(UR!5;n zY)QnE$AwTol=z(;Dvf~0&KkP}9tDzv@Sujq7QrubX-q(=7ES<RWXagwP$$lrHMvjmyW>!ilNJVj`{9?MZhOuPYm$_2~TYs>3Sv~ZhD zk*0Xg=Mhekx_&CW*zO~z*=JK8+W(;0PSn`fxnZVxYL1p@QI;^`o+>1t2;ZV8} zO+tgFLd|-~HhU$4%_jJx)9fc9wqtm2@jzJ1zy^I59Ori^$zvguNH(tUHv5H^*dQ58b#F@RO15%%I5>>Jon zq%Ae3tcg)M*$@0SDIWdhUDcS*=O0R!F+Pm1;{?2w#Nn$WgnAxk*6vif0|*+ z5;nZbq7Iv6KCmzsc>`V=>FbCL0>GrLv2(JR!|4;ttQj1d)veIJLGMlim-m(H0Aa3@ zBZlJrEtYY0gggX2f7OZ+mY5!Hz25V$BxZOvOE-= z`MV(=<3^P4hte&fQPQ~kbSjUpoe5Vu;aAD$ARFrri>BLGLH2msXm)1=Iy3;v^pzK< z+AEbb3ENCt=mAFUVP5Ui`pqv6Be(XPUhmi&HbCvRAcG)3+2h;r!wn-5VgM~X6Vu8F zp{CA6b@xtHU%WuS=nNlD1^09Rqz#=&QIDzeeU-8xEx)p8l@i$uiK?fz0LuG27JpPe zj0Jyr6y||~jX8_lE-4i)7yDqMSYJr3!;nd}Dj%-UQq(f2O>^8z5}1{cPJCq57g`Zl z=CAR;Kmfc9L_BDwXfrnDJJCcBJIoVFd)ld+En<}T)Vti2wnXm zIq(uF-o|M?ZV@Z2{9JPUA-ta(n-K;|T(x!0KXqapcO-0+5;S=kW&4y_!KQ?EWpmMMhzh-q`hi5hFt5_UB|9@SbzoX*g82@ zsFQc6+&%9&uvCqYYCk+0;1bwTM5)q56-H;|r;Fbk^V9wQE2i9*U*$U$@qT(0oFfWd zd*hM=#ALfXpwOr;Yaqw+H!c~y_u`|rIT^?TAjA&@)o0l77(j{!3C~Zefh#j_VDr_r zGm;|9-`l!VZv(d3K(LF8VIh9-CS(bs&NN?KEWP?WZiV~YXV47c8+RIc$%yJ!s(bin z@-o6)n60XQs$0HD)WZ1?Yr-{%LZ<-_@5@|;I{2*xuRQNFlHJp%pM^lYcPjgI=*CV9 zc)H<*ac-n6y2i%eeR7kcD)Ld_LOZrCitk&vd#?A$_UTse0?Vpt2N7mIn$uz!v@fp| z)dY&A!FX4fNJyjB_i_aXMzf0g`y4+yRaGu)GDyJNtV+l#vZ^N`$pSG_r=2OAWr)IJ z>0@Op?B52JWz)QIdO!GrY7;a14%)u>M-`fgu3M7hguUPk@740!Vfq<&^e9$X^i8vJ z>m7cGFe}!XH`bExXLD-1%dn{uAeMWQUpte}XxIl+CR#?#O(opE2;$^DjH*5Ef>H!h z?g(l4DKh77oMNO-qER-l7Gy6tzANs(t~P#yA;l$L)$9FKkT5ZJiG*K|vW7S!qBpF7 zvU9J4klBkSUNJ`dDWb$3_fmcC6uGu@Ojr-wV{z%rQ$VG{(12+sR+nIaOO<3ANZHo1 z9Q8Zf1H*1M<%mIb%BDd2VF243VR?a&Bl^o)xUMz~-HrYrgU@p}SlMB;K~*);vg3_4 z`5<&_1Zx!i_GYQA+W;APBCNA}u9?Qpi(&d{P)r4sbi?BZqyhl3q7y7p?6U3W2Fy0; zTnWtrCnrtWAXBTtd8vpoEE*gJxkxw z#81tpTjL^|3$6BB=463;N>TRH9s#<{L@LQkA3(TIXt(I>k^g*(_7DGA`|qY`9GqN# z@G#uql^Opv4fAhiWZZne7~4P1$P89pHkeQfg6r&=-yqL_tB=DO6Vsc)8GAme46a+T zdo?oep@+!EGc2H#N_tg;7lwxd+OdJ}142njAMpWPSM#&bJ-s+$NZ$ zp~r^jJwzH|u)~l8jCpeigB+X-ISKRDT#@dKlc(^eH{q8rU-oqf1P5!hd36iUxZu6} za2#`%Bg>isP&kyYU|iGsx%7A*A6`-F8@r2@#_#26Iz}8Z2?AU&1AIgBYRf`*)J@F#ommt zPcuKW$5g&rmAi!UBn|H~u1F@de(_O;C*ympxnjt4VGH^9)t6;{_a7ypRSeN_O&VYd z?6)0o!a9HK_||q#8GZXnAZyCoI|+|56rkuY7Y_xhOFzN#GuiaGL^IQ6&{uL5p|k!` zlzunlXo)8qD@Q1bXK_Md!B@1_5~scvzp7h1;({ap0|v5HRB2w#8UC~i(I#`xWWypw zS2(BL_AM*7tF(#;)<_zk;M?<$b#s#N4xmltv`<`u+L16JkKBNge)mC|%lReeGiY0r z4AKf76Y>Hsg2BAk5Cs|m5LD2dDt=8WrRO!N`Q4^Ggu$ZB5efbu*~bPkx3#;d^?5j= zI7S8OT$w|!cI%N?IL98|PH#HwoiJgKzLs=+^Vm&euUNo8n5-N4} zFqTxYRLkW#a0ElfEWclG2!9=7Guy1gVQG~_+WUTQyT=KkMzRcHq2I7gfBEg`hdQ;) zG25Ru{N?hE1TJGOV@P{879NGs={9cV0oac07IkAdL~?qz%*~o+2AAgqB=m1^a`EF> z&4aaNf~uk9Vw&?__1i{42^nBd7mn9NL1j5(Dv`ccuN87@uT@N(8)ZF!%PlO#QM;Z?Gj(OjXnq9G(P*P;y$|sRn=w*ac=FfH8#q*IEqm7C)7MCV-W2SXbANhyo8lRp zM|Za#IQTUoOCN3Ow_liI6nnIJw>w1H?~}jVs0yz@C&^Xa_O1P(naz_P5ZmRHZ$?Yi z8O%Q5ph})99?sz&-rp~A9RbW+!K-!`a`IVqPf_ks%{!x-X%l!&eLzl%VlgJ_oMef% zI&R=qTrC-X>2{F4IZ@uIW7<3fN@DNp4;$6ibK!+|h}Yr$TH?p|HZ`Uv*&N?1fPGV_ zIRRq(4XuYyv6NVYQO(EN0RP!k+INpK)_~v%gjSHG<9)0FB2d7fdIm=ehY!>%Vd(pt^Lh~pz4vyX!b-$`E!YTZxm!sX>Z4bdk}8 z+Uce5C)R%6cXZ;f^dm>Bq|MgV=a9V0Qxs#i-pUk2=#!vj0plI@BQS=eVK{4FRWKN! zsB{t3?qv$>n~Mt5ULh^AeAyi!L1&gVnGVEOtvIdFV-OpglWz1NEEwr_B-_5^bzTQ|qyvXq@y)Ac2OX>g%X6abkuxR=FvD?jI1H;= z27<}8x`g&~xv8C+ybZF>FRz3r)?35O5PZ|hkh^$c`+gZ)-;p&HVz$jwP?OiA;w9T~&MJg3InbRI1502UZsj8qXAc`HzujlCpXgM>Uh| za(1{X)}xNoS+wun$)OzAmJLAVB6w4T%hvOGbw$HVL<)`V#@=0#(c=dJuW##EKlV9o zFF4e~YOQe!{74nX6JL6@KQ}l#YWgk{vihmIj|b9uV~ixkyPei@>TM2e-C4#PoARV0 z?#1LXBvQn6N`r$L^y|!k#1Vb@bmcEiV;R}UeylH;Z}aAJfNg}iB~d3X%k@=r*1n8V zWIMZdi5(%xbJ8>45kMcPSWcwnD4!zwayZZ4ScqU%cbD_~>lZ zlukTnkH5c2><~k^4gaa62m55y(TDek2j0`!ibZ?oTf!&F!9(K>zj)@eda15uJQXjKmNSN==pUr zf4l?){3@AWuMYWRBKtJ+v;u)HCnYNd0SO5SVGRC*c$$Y0hd_XXgNK7ffQN@iL_|PB z!9qnrMn=KMe2IodOh8IPOh80LM#Vx)M!`f$L`26+&&0;g#l=NR%P-8wA;iMT#qnGT zBqAar3Ni{FDk>faIT1O>|Mlmo9RdRZLIvU@G$aKC6b2+T2INy01StdrBrF*1GvMDp zkWkPtuyF7Qh)Bp_fqHZZC`f2%C>Us1SQr?vv=8_?1Plf&CONw(+)GseJcR=mhktx7 z0;O1W2e#ViF%_qYV*nx&4lW)(0W}RR9X$gVHxDl#zW{i}os_hUtem=rrk1vjuAZqG z(A>h(>aCNri>sTvhi70=a7buactk?t`=sQQ)U*$I`2~eV#UD#bYijH28ycHFH-GEw z>h9_7>mL{!pO~DQo|&CnU0dJS{JFKgvwL!Sc7Abrb$xUDtQRB%^lxhYO|$=@7Y0}_ zC>R)M82D$sAfepA8#D$CEIB(Irl=}Bz~LnYhd%+A+3?<0uji71t{D z$+K#|H2cpK3;3@z`x;#Imp2>?cX1FoN^eeL%-Sx(3 zRpc)Tg0PyJMAb)ri0wiS`rO^_ALv}N3Eb@@eQUqCCdig6gosfY(IKpnq3P0$2$3?y zcwj-!O@VTqFI~-LOwKH9s4y^>1+%baRk~0vY|!(W+~MlVUf?}0m!|hqCIM=gv1IlqE6vC)*y?4^Ea#?SGmN^JFWHQCs-iZUqmdg96OzU}JVGb6w zX{-9zu~p4%BlCA`>GaKX3R~hMQ~jVJaE5OXF8YY|g%}|eJrkA>Ya>=y{2UyZ6dS}u zwmx7CBnVV(K%cI}4SFKvHwIG#&y?}tO`dGo7U)vyKqV_T0PnIgNpDIh1 z_Ia16y$z8ULHFBM`>EXcYd9c_61;5AF?d0WgjZXU|Bq)NR z{7l*oB~fmV$g(hPVTFz;K^gFx$T!TQs`Lv%g5V!cZP5h!flFLlXrcPJCj!`GxG3{sMKr^Hs)lMS_?F=5NajMia6i-}+^$@U->&oR9nW@9i8vvL6V(Su0u_eG zN%jnn0b!o1^KV_Z#2tRPoua1wmPhFt2i&v;W7BQiY%u&d|8YWTbYM3|Q(7L!NWH}$ z+p-y@ks%t`iFr`qy9#iHsK-WI`TYmA3*ArQdCOy#a8cp!JXpuGCE7%(Mk5Y!lQA=K zYNnb+L2Vp7v6>`PzLRLLDiB+2f27KT;rq3A1l0uh}|*t$(8foH3R!%?%3 z5i6f>54~Ivb_-!6$pi>U5^SSmc{5^egzyn8xYnya6?knOagwzKu-l)&uz2~gMbQNN zbNh93lE-VKW2@y93lYs8(^e7TB5$BYi*Ewu!e$BgQx;Exy)1kv>Y@E~zw@b6HQt0b z>OCb$8?ti@uN5w{TJwV4Npwx5%^4l-bVj5t>n5Z0_Zj6+qBt=z{Md&_=tKQ0=oJpO zjVJbU9j(yXqb=={Z$Zj>6C4GwRst;Abx<_EXdZe7VTgMT&^B!pVD%i_nLzWl;>{No zd^z~MTGgCo?r0559TX$WrLC&CpEo1ENo^JZG?{+;jk__JvOS<8#G*UR6qgGCm8{oK7Q=VxEQNA*3xT)o+;8PHy4ut}V zgO0e$(cEO^z$+Yh1RhnG6KTazxwbjIb(SM9FSl&*HoW)Yb>Rj^QJVpNaUy9WSbB_# zOZzL8Y)qDCWtuBOt(W}uF1sy^my($AyGroB?cB4jS$MsgL?N27X{CDIs&tV$VuQrr zk|oxXqEffxOa*QZ!GP52V&-Y9Xir(KUx5(UwLNNC;xh|41V~~O@rWR%WrxYn%+nh$ zzbsqc-mbXiSQb|XP*iTYsx#K@&g6@U04p$#4twH&_`P+rENBVeO%aV@Q5qk2K!q>N z?rmt?BE3Ea&t=D$5H&v2#N-^+sUJwzeBI(Pq|1<@ ztLx+Jil`$fmv^7oG%`cXXG*X&CkIIR3{bx5Z-dcWA91m=E&3PL8(?L9-;rlHQfvq8 zBRtTVWEB z^)6J#lHx1+JUI2p#F!AL%#3T0Ce#5yEgwFpt5+2tL^q4-UuSgYr7ZcnI`>J5i*iE4 zf7`Yi@tmB*naMDN|V4`Bn9hcT2x7;r;3 z34oz0{`|#UX&AmeFoj63Umx3r5b7Sx(!E1y7Yb~=UQ>8i#UdL0hA3DSQvnEoOoD@K$laC7ros;PjF+uJy%Q^%$H`k}Y*O?3ib21k?4UzYDauj=RwS-Sv|(80~a zFbj2iP|{{zKJB8 z9qEeH)#VTSe%blYUh!X-|9SuCN0sJ(oNmDcsKESNO$DId<3H{H{NCO9qom?rkL5FR zviz)X{nZ5mR8eFB#uB&?gS9WmZ3$@sL;7*(YeHHQFn0dv7J{_*r{}Qd3)KE#Jxkx_ zA9@UWL*rs%+|(nTI`MFH7jL{@kCj+hXauAVj*gC=o}QM$EZyx>uU$dtK1i$gnhJ3E zSEvmaUo1#i&w2NMWWm83%=z*~zhK%IzGPN%)#Ls9_e-}|S6A=(-uh$kE=pK0YSFu| zt+L`E4`LPITr+=td47I|uib9m1>9uF3sUewHfwRqF!Z)*W1F>kuW{ePgBue>vEtDs zNcFUaHW|G0>l5phI+U{KwLi)IVh2y1(X2dOAnbvy2OPJ6YF}ZvGHh_%^mZj{ewrD! z@oKBew$n0tE-)wf{6i+hd+tqet1)ABimI;@uJ#8o*t1C2vbLuDv25xPx@_c-=a%gvvQR2eELHGHvJh%pO0{paguWGS>#aze7A`E#OIj6o@bw9mSp z5OjBfuqILy-Yv7VV1p&GS;|Yz>Fto7npz()gJi>=5Il*SH~77XpdSX8#o9lu^$CT5X}ix0T@#mFo@3D zoS0z&uYa$BEZr)Wem>XA;BJ-9pG+M(h@JGgZ;7y`<2!Df2xI40{i2o*V%|ElNmIP& z#;ekc=EJ|b>+l0NCKi#tH>hDS7od+SyeO5K46iO+!Gb+q z#WF~*3u+;*L}?)|rY0#nEoKYfa;@#PnW4?Ia4Tui2S~ra@k;qTcy7TFQ>RtXLcs$9 zItb3bgLW*BNrK5)uZQ|Ev5Wz2mk!=xEiF{&X>f_i#F_8(yRz-ILT;kW5|Wt2HmFPV zhSWtEKO(+gJ1kay={GeNV7O(IJEl+fN$&i5rI%G-xc_e0-}8*;+KN$h_XOGiE8bampFcNY<1rEjS^)9T@DZ zsg(Mt=?#BhpxN~;msyAnHxnPOWoC0=OHkKFyBD%YHq&9DS>&{NPH(X7_u1K+t`~Sx z1#2_k3NFG0&%#n6r;DJY)DM?mm!mk#p5;5FquRgUa!;JzYL`&9!Eg&cUiP9&w@S;- z1z2$+yP|ces*bHybp&FBik2tjEYOFR5IN&OJEFSUhxiYPVVlujNJTW&Nd^~oZq8G- z4b#eGi}PR1du&P?#N77DsXs20Yw76;>5EOV4~<3w$ur8H|Oz&7n?W9E?D$hj4ov8{<#D z;=qEH~q7^+7Pf) zzEMlJYEf2~F>e>yBV(5q*ZC+{<&2ts4ZT(mhgk9_T$HPZk>IFUoOC3?c zL{^rFoLI>C>aUH)VUZzOU)9e2^|MP~Z)!7=9`Fvg$&bG2W8a20o-)<-K0ize)HklY z_tT#_EfT7MI}6i^ygX*|F0sY0TpPzf`L z(eACz0kKtTGGO}XJ2v$@j4k;-i7xAmbaW0;<)MZbOyt})TK|*YX z*ORdmrN!8RJ%4?8Smu>|$v2Xq0s~|@EVxrwOe4N~;!rrG^_3-jS5oTZ%H4(t> zD9fjTovsaE6&DwmVo>U%R%cf3e+l5^WnuP=Q4aq6{qa#t3l&%7g9^1E?bjt2dX(Y4 zck;$a-4!(fF0GNHv$L~rsH6%BCVH3?$qf!#Ihb-nLqp|Cwm-FOI#X~QOuDfFR~d8L z)UMl=$kh@zQ`AyAZ8kJ8-+h${v`k9j`HF8L9bgL|+PAu@t+Q;yX6$_(M4uA#O}CbT zQLxs7uyOHK>{^GL^;^TsQf5X*2AtV7NGLNS4jipx;dAi}aW5ph0Pe(}btn|2At>pR>eSF9e_|4aT6Q;Td4Z-O;`1YP4Rm`S~J#-pGxQeYi6{9cf>#Pgj zo24^Ym|J;Ao_j4hhTrMR!7XkX4|V-yw+f#3Do7f0AU*Mj7U~5+W7_eCEH+^Gilt=3 zIu;uv*ziuW;K;Ty+xo*)3oaAgeb!>+-^9TLA>&0LUlvuSE5fh&@=-#x2-Gqm-h&t? zN}ZO*t7Z)dRkm>hOOkGXYJvd`kCGucOY!z|l}1@Qpj()V)G-pm88msP@gYNssu|jU zpJ-eKwNK8`@pL>9jGM68nyGTo*@KJwk`gaceDlL`Jad5-da*HX6iI3(4@CSiD)g1s z#e#p+SHfjTCr9@D3O^aQJWH+l*iraR!|J5K8FA|7^+SKHYX~XwoWo>V*`}b7Tb(2VnzDnw zq&8&p<0a7NAaEltwlD&Px5%Qd8An}pRzWjE>!0hs3sjB>SjD%PTMOW5fRcq{8xRkJ zg%iYlMrf*ldZ->(W3x<1mS&TPIK7I20FGH5X+osFdiczHrdI1-NrRfqRG|`>MQPx7 zo)#o!CXq6xB;wG|2=7nBfQXFnyyRb`4JIrO?$L>E6HB&ag}zk-N#UiNpn~G?mTWr! zrz1If6D=H91d#|;lJ!<7$f)+q*;(n9rm%vQIqutj!Q(-kImAH-B6u7OJ(wxC?qms5 z;3-vmBW$iaeL4&kq9l^g7dPu9BBsGFD%k2n2L{bXWj$NU&*IdiYE{PcM#V?|izh?k9P>u0HPR z39SWBwb#pMyMDZ#9ViwDlA%-@GstZRxlY*tD?}H{vl{Hf!56yC6|kZVS_@3>9NJFk zmx3(w6P!#iSWDD^mTbXJ#>t2Rw=6=WPc`y*!JdJG8C=@-MtMZ)#2g- zriZ>-+^D&K9!&Ga&WkS0tyFPD#e%c#q?40zmUx?~xr~~+#zjHdydlr-4w+5j+Fg3B zVu(O~FfvQ)4Y%9}2`6Y)mi$-M>PAybxaraUDB~tZF4_tPZ;P~;@ug{oGbtopS?>TnE+Dh{%!3MnIm>)N|^n-qQhmv zuL!_4f>Sw+JP1yLi<3H9`o^~Gn09k}!HDV#!N=2V-yT~_0#Rm3s0Ptz38`$c%F$<+ zp3V%$o6_{~PqZm{9J}V`D854bXg`87vsRS8J@p=@q_u?+H-zRy&h%=tey;< z{ImVEtzj6!pjHn?P)1N@$#g$&G4%7O2DNPrjI2-Ry5B(cOEwI*smFIU(YQ+LcP`$Q-~uBx)JKlipjW5Y zV5%bVpyJ+6wQ37sJJ&p!8+5j|T=`ZgoXKQ=)6>JpYhH@UfW5RxP(;40m^X{_qTaaA zKWDb-$KOoFaXcW21tqQ3qO7f6^T6e5mWxWnLDDQ> z&Z2EKH^!rz^=1f&(3vTs$#)iG@*61B>u{l++TxLR`?OBk(b>ayOETC!h4S8jzTUns zlsxuN0{dqWcncC2>^gA--3r-Rr;i^T#O467Hh)v~0SGSrt!wf_1?&$68FqlA z+#gFE1T243RQnI$Jb%ke0i64%$_+qt4)F5_lIQ;eJBRtFIv+qz>&GDgMR9-S;{ez= zKNvZH^?&klnEtT-e+Q7m{=2Nt&m;dDg8tWCH~=B%zv%1yAmqGdZ}xtd{F;Y9QdSyl z4RS77B$dK~H!-Y4!_CR+>V#*J;HDuO4=w3|{JO=n2lEYNQrTzoxbvfjZSJyVKDTN- zC2Lr4@Yvwsr`*J=JNZD(%afKpdwTn7WH%q~RBt)Y?cL>@r|<8+kk-`DCF<*aGN9~x z#le7*X1ce`ltAD9K>z)Te&l#JauHwe6US?XjLu>GPG89fdJa@$DEY$LGS={T1%FvS z9-%t+GuKNGC{?nY19t7_+i$y(uLq(cZ zMxfHF8zNSkFW}*`*e1%f9dJf;^W|!RK;wsV(8(s}^zS7pKWL>vX7_$+j)Q>v;2*MB zPHq25;@)RFctnXdaXehbq-aoI2S6PWewDeVyS2;=qvC|khRGv~uQQ=?fjqLy9uy5s z-gXxsFRbh~im%fFO9_uGs!syj+Y!XCUYvUvFk*dR!K_YLJb&vATwBx|oK`eQMnbm_ z!L~W8Z^bJPKX4V$rw2vrnr_O?in({3L#NbOuutvTcv6-}cg$V|(ir+&5^Ou>RBSl& zA5A>+9Lf5f;CoMAenEb243bN|13U5#5`v+T)z32*eilK%f6}?l&h6)UbptOF5ZMYv z<6H4D7nxeBf*plmXyRVwVK z{5XqeR{&394o&KcwO8nW-EBf5A;nPOsDoptyutUjr;}ogQR1m&9u#8@)8za1kf@1g zZJRl6RLaORL!I~-_R7FY@wUcc6oeSV48JokmO6{mwD+2$68D02o?yj?w;bjdwQeG@ zjKF!y71h&r2~dCu55%O8w6CkYll!5UP!}W&6el3mu`iSq3677agrgJd6T1`M9#i~K z(g$<>W-96WN}BZ0&NUj#65hzjVZhbed&Zd%U@X2N-zhi*eP7w=vd5IXGv_BSRdU$_ zloWC`Q?$HnTvxgeE0t9Z+$ecIYsQ8k>tvPqwT&aF;XNfP=#+OrKTPO)SY`ti1`}!9 zqnu1;@gx;dw&IP}JE`k+mvm!p1@;t?Iu(4WXmwXpp#NY|r)(yRHRy;h)6~xaEYB?6 z(0Ceh+EQi__yvAd<#MmoD)r@!#m9j}$omw zb+~28;u?OG+vv0IlT-VO*TNk_=s*@T`bsLGO$S@d0}W^S^rbLO!HIj|`K$M;$El zoiIUMD!;u_h~MrevE8b1-^Sg*0zW?-(2_au)>769g_jun=U2lFc0FBR?p)xd+hq z6ApH*_6}yB!<-PkTl8+=&W-L5JH>9WH=R1zco7rzXjK-u3?|e3`B%Y40!MSM{b7SA zJ&s$4-wdlnbc_i0C(d>?f>0bthv7_lS_PeDnNg?diy(FC{U%f12C>US20gw$x4*5^@gz%8%g}2AHZOA0w72yLCpVYz^f9tE5Ne1O_B}1| zAg&Cp^0shWtG2kom$j}wsHZ;J>GE}p_h2|i-Y;0m*`K4HcS)04ozb|EyxnM>{d>hc z6zCQib>7`?^>NiVy>I0K)(Nzte~+tK?9QZCHy5#P0})wl{E2q+xT9;pq-urv-fU`lAB&DP+~xylb%koW{2w4L6uY-oBVvA-O@B19%889%b3;5Trpc1PBttJ}i^H+aj| zwt9C*pL7%;H`u}O#W-qnJ=6=Q>dui6tieLxCM(@)_l}uh(8G4&@#T@L4{wjJ2jYdE2iQruIY%AO5p~XY(3zh|?AdF*!ngl6h=rzUa z*WvRQwGETtFv3|PbE0InnOc{vq|)g$Q-fgter_Ya4Ja01+rqTD(NT|*%y_plwDD;r zwUw4AthW(o6~Pwo!`RM%@xO*Ui$4kV2V4sziW-l77(uR*P2@L=uVa>VYIvKUM(SLI z5OpbC`&>)qQb}07TZru{{8>t+`;Ecu0~1rGbE@$w9J~MbLV_hku=PzO(Dflnn{**l zwBb5SAxCr|Yv=5*bqGzbb`oY0Dmwg2CbyQK{G6|ek4FLtBXaliAtt!jT>G1cKV2eF zdOACqPjaw{lkUG?g%h814KSEB@KF+G;RtaRhntKxv`YMrMV3<~a2bV>1FlbO%&qH> zn?ZpSZYpuz$S#jYv3p)+$3Z2BzF6%x{8by*F|i|HHP_e7OCOv-xnz5ZhMC3EWq^rU zu&QnXPARXcgj!TiQ!|e>LCfcY_xt-;{!igB)tnD2N66kSyp56}9NeL7`U1n25NKr% z+k7_j7JTmq6KTs~x0kIphW4|D%UQp9fNvUCT*S~Y_|SZI*^BjF_ezg}DZbbPD$nb6 z?N_%@I0-b!$u@68=Exa9*Fl~|{%Ay*R&BtE4Z)0`VU>l$n~Liw>}!N*bKcku`n+s` ztj#-$Q+BcLz>+z44>Yu75Q5rem)f&H7HGiW-hPL#6;LtaFdY!m-;P{aN?1m)WM9|A z#1!V%KOUbrgV5YPJAz!GoP%Fbakf8IuRGJP%K@}dd|84eY+Cv@0sCDM!IBG}_9_bI zo_5AcOgo@d{e#*(@9BB&S=Lk_r46~o&0En^q-)v=njl>5#X#Kw@E&mH4lKit)bSb9 zz(yE23hFa;96a6DU%}k?lvUc%yoxG zkM1yh8vc@T!%@0vFP8LihditF{+==R46S_FX=F{xio z6UZRhvc1!C8zb$4k;MwznPbRe^~Irw!atbL7q{}F8++l}-)L0g^tE$4&lug3ZUmnOM%Rc)Bwi9|;Oz^S zEziWhJe<1PcrRWL{#O=%Etter3#Qbn z!4X6kA2yspFokeph^e7%_(D;N_^rbCD~nW;oo?j^TPjRnrld$Ip7G#LPQ~#;cvLc zLVD@ZQ(cWR3JqKQi3Jo4ce1@2lPW|J2e>x$2>+B}>*C#%syBI$)HT$??ta!*yB2@x zJdM3fBxBD;simTASah00N0#B8hCC)VONYUY%6>>|+BlddISF$#Sw4`4XorBRTyibiaJ(gzB(&n*l?r8WJS%Rz3fAt?LywcT6;h7JTUZ#N?SXun1n*y)1D@8DMQxe}Utd z$x#=q1y1J$|FMhUh0m}-$)Fjemu8q@hF57fw-Fa{nXYK;DXF)~miueS5*LLAH2lt7im$4NvPz`8F}vkNTo z;qs~~_ve;)s^HzMDh~0n4+Gy2H0O77Jo>yb*lLUovB-37c|%&0PUG6ZnSQ7bJ0Bkt zW`@jbm4|DbI3XyvEz}cjd)xO;Z$IYVXeA9Q05`J6IxO6K4UHcb31K*kYsPf~P1DX= zNypj~?6caewcvc;B3H;HgGX^_xy<#sXHQH=N@HFm+T-MsLgednQ{g^it+lh^qquOIWTPqPE`Gc` zcD99bnw|Vz_^br?-D)ia@h#t5eMQU;t_CEYN0F+l?$7~IX3TbqW5f^^)cCHE<3lbw zqHjD&NChY$uDTNZj2S2&;lvSHgj53DPMX6hqwV6E#@Vb0sPOPMNcrU|l+d@TAO>wr zkf8iPG*wWSNAo*{tg-6L%xNRxD~K91&GEz<4coLQiUsgQ8`ZxFAfpkA9mzRkql*Po zKzC->>)AeFO02=&d}pZilGNhi3l8o1s2{A?cyErq>!Hf*4YPRV6Un#97U3T;wmEJe zRtiRmMcQBTaB0ccr!GRDkZUvxtK5A()e3_+>FF=V0_M zioM^>1xyf&n@xQ0nWKOatTgJ|2>n#HI^lpuNwA3lc*EiynYE5bTo?N_qWKen4hzI@Zh+1I0MnB4 zF>TzFW37EWhMj2N1C1shx$=0#Glw`<`#qVa(F$}lnyd;HcfR61@ognA6uEnD^w`KA z*7{Lv_wB(6y3`Xni;p?Xg!%IRt5al@y`yL*nb@|<7t51vcebE5&a^2i*!OUZwkcK! zCJdcWoD_YAZo`je^0$g$?__O~11b3t;faR}_i}|x2(!n}Dc*;P zn?HZ`-pvLrL17gS9vDLvpCV{57^60EFj0xa(3@L2u7s&A5FK%?K*mhE1XNuRkN7QL zS$!IB3V*30+~2gNf+VrkE;8eZzIyBL1ZEa*0AiHGBv_-e5{RpNIcldpMowd9uzYHoHQ`h>_M*_X|TZ-qiYe zEQHtL&W7cIRnYnSWh=qFOfP_DoO_MNgJt%K6-se+~04ic=rgUgj>-3H^19VFC z)WL<2h_@=ECl57C97$WMgW;dxnD{5%-VAL(aHcbl`q8EGFSy(pyCX?qg+&evXx;l8 zAtW#G;WQGot|?+`Vmg9J?{Ud0OSfOhlR?gp!1tA} zGt3U@TVYO8dR&R*RxpVBd-5t+Ry?M1BE&+Oq{5y!yG`k5Ghtu!&hCa-8h^S$6mgBzA)21WCX z;X{Fd@O;+1EN6GM&vV|*jDP{WnJ|v6DTkkXWbQ_kB?Uyj`LIT^8wUA*Y zL{~FA9*!xF>ak&Jpx9ypm@$iZ`8A?hpUhq&QDmC5$qysjo-kQeO=k6&`NtXb#BZ+) z9aBGO+o^g7;@QvShAt}FZghQSu!3UcH>WB{i6EL+lwS2L&rgAF_bBX6ITnOU1|!C> zLe+dnjamk8x5P#kE45@lB}WKYO>mej1%DQuV8o3QL~0)!k4YIwZ)t`-xl^{91@WNo zcz#9x^aZOIl%vZ7=RKbA+v;y4p53qby2|iL|9qVOpQ_#esr>$9Q)cfYmDY;*uh=h7R<vbQ}b142*PafC(W0+5+$o0K35e0LuL5AQ%f5 z7YAo9dU{(^Qx`gOdwT%)h|bvFmfphCoz~vd-H6uN#rYp$FdTm|^Y_HOe`Y3ts6xQX z!9mBwNWjR<^5f+XqyO*i{3)dPi+}ZVrtBYD)8DV~zp|`Y|9-Ip@D^eK@`fM)Pv!g{ zb2pfOPM-Y>?#5p@RzD}c{_=(X!<6B_YW9Dz?B8QIIGH(r!)|ae{f6E6vFY#F4YuF0 z8*G3#{y6!+$8NCwe9td%6(FY3GI1~wFfs!E0FDiC^N&LSX5M~cH-64s{^jHTH$;@b zMqXtPTO)g$-|17oBFjGsxXgb{ll~rXe}>?{oc_@Q#0Kd3SM zXqo>i1hD_z;et+&PGzqtAVMNYpUc0WN{fA#9`LI2Uj{8fS z`G?fJe-n-Wt9k#8Z~hXK0gn0&g~a?jevXyp@4jK=_)kzsEPwd#S4;*xNzpO^&{vE< z;s`tQk4J>xVlw03vPAwK_I{>*{KZB8R<;B{I{aTmA+h`|k>y`z+XHxa|5YLxfI@nE zgQi~vFTG&7oZ@;q8iRsgx6SbmXNd6vX~^w8b?`JXsL*O7h`&;G9wJi_ZVXc<@4gJA zEySB(bgtkxq(S}y1OiezLQoSVWF$MA5U()a2?oU0U1yf0(krUv>}R1O3#UF^_?>4T zyT0sl&?fW^e_7i}#YQP+pEr8%Db!K0tZJs@WT*~Wkk}%XS3$IXtw_P^l&>&oMd)_3`5%YAEUJgqTeFgCX?5v0~ zT*_}TiTRmBU)x;W3webIcZjk@0Tcf%Qf0>q^9=I*>J32ZTr(e<2bH0M7Y%O4_2zb2 z82b7Avr|(^KH(dd`hdeRUA-U6kItdw)TKU5s7hW`*!kuSL5C&6f@{ zosC16cj+tU-Kqd2sK#LT*v)zxRxq1O0mqHk8^XoQv_(B1Xw@)O@gl=6IGbviK%Rd> zZ=25!`X({u2=N4hCCtT2rjj<79Y|(bG~{BXGY+H_=0+?U9Wh&EWZ4b{%;4O@$~lkM zx(X7Tdx}{WRmH=hSTe?=D(nXA{<$Ofi zy7Nnxa%Gu`L~VT!*vVB|O{Q^Y^+sLW;L0|=zkCGsCkat1CBekiaatrzvOqF7?(IKQ5E@L><7ZYFT=!Y^@&5XA2 z%aCggGl0#4L>(%qncwXQV81da>1o5CKfU&EfIHyI}5r^Sce z7Oo|H2h!`+^O;HBb%bwBgSF;Op<*}lc4s=&^3JjcVBTrSs+;uW{er&ry)qc{wZZ&+ zT*fB=KtUp3xU^gWZ|6No|5F3f;0naaimoa^m#>uJeoEEZRuUFEMeOEbvb-^*Uqtm& zIv+j?#*~ejEQ~71ROfWs+V0IX@;ee0sxBxIw-A;L6Fr?s@Xb(&Km-~$;Z$Z+h8B;g zYL#^(8I`-chb^Z7aZv4i3I@gXw(grVxREB1X~l3kL9J3f>bF!f=t4%2nfhlJBWED( zM6@a&+M+4dGfD8gyxz03avs?n>(eoJdRpnYkamxXprMOew+U`Ud0P-rKvg=a?5((` zN`KbEg!VoWuexJgIV=|I{giP1^_#8hE&b- zEbWzV?exD0E8*rbc!Qe%mt@j-F-G>-$YFKg^QwBd|*ij_$*d2Y4VX z5`Q|zz`DdkaT%2_`!_Y!Oh_H&y{Q&3kSg2V8(sahue~7BYpaJ!1<)6ZAL?bc1Etq- zlZ!?4wplv|oT3Fc#Q|fEhzws&e|BnHMB3BdQqPijG>lz+XaqUL4%~q{8g-Y;I28PD6_ZR2}SrhM3^n5t)}jB96}H^OmDS0nM9MjrRK5+=ys2p}RiY|Zf7B*mzDqFYIXf3esa(A{Jw1l=ZEgLO zmUv~il9V7}xxk5@v(zGKOu6Wg;9Ayo35fT1C6KA1D89kmt28rHuX0)_10UbETAAuT z<;xwv+9tP<@?qw39hz`Kj8DL-x;6olIlfJdl?*dOYZf4eNE-On3HO(3)sAKlnq$PReSW{sYLtxSr=N}pO z57`tcPqDUMhaWRKnq?OltF;h5Q0>x~TI<$}gM2){28V5(4Bue0nei8bZ(CF`)B4v1}0E#(u6!q--euS=Vx>}p)dNFtHXuYxWo zw5nrM1j}*GV-}Uefu&>4sRUafE03j9ZgfP}8LB+?dGQsvxi3XDGjlcpt=>*NNiIid zB~a)z^}&vwMI;{uA)VK>E){~zwDWv9UD(Ohb6vnL{~}58p1P0;$mI_qf_}370=~tk@X^HL!S2uY4hRJDcr^_)^xYZEV zMy~Tx?~MyUI_n)E&0a%QOK%`Pc0lt}7O8GS`$1>r9wm?kZ1Rf(sJe}q2iDWcd&umjU|LANzqWJPj#K^#Nv<1mYL$&`PMmYPuOSeEU>rQY&?H-&|i!WyPQb(l7{> zvi;rFqWnr^4oZAr8zXH&s@uj;3yAMapqD1l{pIKzjv8B-16ic<%1N;@qx7y7OuW7c zHCf849dB@3FU>}FS9gZ6T?LQARW(j|J4j^PHtu1b9n)6fe6U9kn5Lj`k+m>`0&DG@ zSSZBxG42Nx4+uQlw(B*d%e{rl`8SDzG>!W)T024xknjnr*gKJr|*XwgQz#4#4sT@g?n< zOC{JO#cQ&_O(XMkr=$WziBr(;gQOal)Fy0?#bnp&9P;T^atQMuL`kMq2vOQb?5tRh zg_Y77BG=tJ5Otp_uU-Wq@QhBLBCmG*{77{-9pxMIMmC&H>e*jKS`s#<{XCVad84XK zkO7ZeJYj2a5aa!ym%_!h=iRcG5}R6vO5)dm*5j_W1Q5NF5!}P=Zk3pnfnozu?{S2+>M9v=m?w;Q)?yK*sw2lgUa3PF;VY{V z?7OD+T9{R;D3LU$ciKf%wE=LR5HN9>O&!w6ek14$ zL=D9m^-TCoo3fXWoG|jh(3r9j_6}#}%(pFnA-%_dsn`o$abqsbk8UgD!oZmeo!N{H z??X0m`!*k*P*#x=E;+xg%vWLu!%z7EW+hv&)qCMqPA&smg#1WLRD@ilu8Ts~<7s2% zWl~s*sAEL_uMarcdf%OdY~1QQv8EM1swo}0c)e5(B5^z2Mj`^=O$(Kfe0z!Wh$)il?TJ zNty@&f(Y1yjff6&B(popK~Is3I)hcSTYS;2oILy!Bzt%gbUQdd`QD+{C|n?xsWj%M zId2HNg)Dsjj9RzU!LzShffJus07Hxi{1%G`3*&f_N3nILAzjaB8|;;e;YJc9+x0M< zKxY?@q@%k8zrKeknp=n(A6~nzGvf8yqqhyuPF9|w+!T7ph5FP}BeCf`Tr@Ned)rCa zAXB6#v+tWhWIr~w!Uhrgr7mU$7B!Uz)JKWvG7*grQ_0vtvh7}&(w`UV)4ysNP0578 zxeLQ<=-IdtY*~AAYHH>dg}=0&uZ_i9z)YuXsJd7X5G-A08Tlh}>b-Pf_-cOvJdU8@ zUGguVj;!Yj5+Y@2#=r*G+8vRa&S35d(sFW*dX1ea1q-zF}igVZAaNM_=M{L_#QbhRKC+qLV8YBHDH<2 zp%;TdvT6+poduxWlxHLx6K#e*f*Sd<+gW)>ub6iO4}SIOxT?R#?ZH46Ei7}AfI)JR zoulx@qIPZWQUg2yBf|9T8jOfAQcah(0_36&LtPdg@=Hato(#Q1 z6_ewkXXyF15w5;w$t$o#UWLxjPV+B0nO|egKfAF1YyIc{gMvOL02BGgD910u0XjJ8 zmJX<*s6*y#856*ak%$ZeB0UbG{$XJO`N%AO0+mS=dL+>QkF~b|inCkVMI*SoySqzp zcXx;2?(QML;K75tdvJ%~GiY#!;O_2c^6hW$ea_kcx%d2aZ`Bkv#XGg8XSF@OdUba; z$$QLNb$*drWg6suG+78vI1RGzrMW<3l`mhuK!-<2$ALQCmGFS16Qf!9!VtOO31NTeCS5H){lbW^`eL0hT|&I>DslXO5L(xoeqs2e}+jekjY+E zhO-`RsI3gX8`Yxfipr?Jwh zOI7{hsIl}7(VvZ`WRyC7aA`wx!;3Q2Yq?L8TFxDOAU0YVfl_Hn=ByV0>6-MO{sz&t z8ntuP!{@ZP0Uf62_os@%SRQ47dSUWW8}Z`cx3hW5&kGH^{EHnpsMhvqUym`OY?5s0 zj~8LKc?_}XG~sfK8+_~<{XsE3Tjq=JV^$`rlc+1S{fQ9|i5^%ye)sRp!d-?s**B6X z2jMSX5ND<~tShs>?<|6gD|)6e_g>3g9^V=2vVKKO~g>0X*D z=f6Ma!w;+C4JBscH19VsRl1qAEjLu9qlEfptDd4@*ZR)Os|?pygOnG2Fe>Sa1s9dO ztY0}Rp^i}p_IR8zju4(W`*fRJ+za%k3G^>$KYln&2cBd>;ZROwjyem&MH-4@`(_Wl zdd>n)OY|M8R?dV<7T3j@uD7|s!=rqPWK0nXPHJ1$58_k4lTmXa?{Z=^H*mJd*j9^qK_oF#rW4w_di{)R!j?_N~Sh)HFSL{Uo2T7te}Rg z=eV%(2!U_1cV5M_Tvfjzx>_XZHR%Yvy+L3b*)~se5hZ3E|z2 zKGyrADG--Tfg$JZ}cAh)K>S7O1aaVE(RD%D1Y;zb_PnZrx*_9DOC zi1fez&b}OnxS$MaPm#y%S#5n3bX%*9)DPgURv_1e(xmXE#dW5&xBi%|`~LK>73<@G z(j-zn@Oy>ZtO3_=EAR>%Cv>URSNM1j6LLX;aX+Yh>{M+pB_?j;mqWt zW^9PIs_5QzIjSN}Q&=7EccxDi@g!ECC}LzMz3yMfu2eo6*wO-!VYfOH6yf(}pC`pH8UhhxI%Rzj`EJT=_JyD$OJ(-Rc2 zm+OjJzNScvxEjbZJ(c<{=Krr_2?}vr^Nj( zsm@|nv2vkuE54h{LK9)l227tfacabmrN3UBSWX=Q=)^QHDTyaK{mU67Iky9VJ}R4G zB0m-f$_Mh9WY%~@Y$Kg#L;rA>kr47>@N>$qgpVt&|t+yxE{tqtm~A%-i;?0H&(b@glH&xToe+CHLYK`R<}aht$Yz>YQthFv)f>%DL; z?DCY~c{d;0CK*QG%Fm%-e}0J$nC>S%JnyBvu%zbcutqE;;qIb&+_KbYzdrSBcxPhI z_yeNUU3d>l2VwI`IDJ2K=QXwVrXemTZ{Goou!qX(u+M7TB#&%t<|agfd8;wQ!DmNi z!=lJK_Vr;DucDOYv~9NVA0}pa+t2Yfu7wBs+g0kvxPQcw@On@?N^svxbk}p?(9U9k zCyh6nEm_(kZA7h!&9En2K&Cl{^yCO___1A_2^BAqc0t}U6>{Xj#f$^GqtTa zv8J6vccuXy%kP%{%^&6f@f zr=P$hNs;Y&t&nLZpj~O>FH9aQ;G5rWaI)`A*aRjgsg#SnVbE`viy@AsI1u6XY^w}` zg7-_kss$JC^4DQeg!+^kYMZdN`uNJ-6@^VFx0{zh0=}e{HCDuH%j%}3s~k(dY#gKa z+)|xm=`6vNIdUhh%{&;_Ydl=n(s;USi`0|{EvuRV1uI@iyAnw+88q(3{vuw?#i=(^ zMA9&4Sen+iM$yGf3;d7R%H1zs|1}ExS85lWy!|Ve_J3D<`*)$Opx}SMY?hOS1pNAM zm(BjamdA4Zm6>M#|ED~b^?$i#^Vib<#H#=2`dD_hzp85g4Hz2}5CmJ>n9kg?0PvzhvbbAu0thS$H{3LgZ zktE5wCoeLW^I?aACfHeVA7LP$3y~UX7Qh}sr_QA*Hg1S#)s^3}XQ$lkyJ?51i7+UT z`K$abSA!ROoLEt!sQ@vqyZ)pnVfp6P-cYf5e@^3*vRI)wkeyl{iWYc^h0Nk;Q1nEa zPZajaC3VKDUo32e=gCrTJ3IxGB2WVmz+1R3zz3rAzatRoW&s6}e$M{vmv-CD!*@z4 zH#)hc6@E?1y>XxbV-uOgCW1tlB0AZ;(Eoz+U3dBuFXznx5#z9p1;yjp0`xXI6hxEZ ze<`_1-h^i#We9lChK z*k4n~==7Z8XdffWYJh}GUhK@^u-8EnS2lxTOA;_BwQE`1z=URU3i1kMBRJN`C8tFK=q+%hTQjvmT zK?nQ$rRCL#k2TKk-hEM~NG{0}@kzKAmMtt@|I+E(4SSnM0EOP``f$0^)HEsbrhxSB z9g1#?U;LyU{9`=(iWn|dyL{TK)Tw`&e5=h(IzG1p#M3A6!Y7OMmNnDKgxBkP;7uSE zFPnmT`GI@N6C;>7hWUKj=~%m@lyeGmiwa);^3U=^gE7dDXRcr>Q1VAupkGqKA1+wD zmC8=paWmgghk?4vL4NS$I7vGYdGr56h3I*7Wp?BU_RDGKnTsX#(>Y@B0V%uxVEsRz z$B_zPvOxqN42uB3BtSsmPN|WKv7}ZLn8CbzCoCLCx~c#eaNy9nNyG97=y<}nerD16 z*jW-siX*Ru#0H+rKtckHa|ne9pNlJ-!#yjUw2UJnjlYD}3PtGo+~yKT3SRZS2*3@R zf(ga|@Syc^8=G~i_57?F9rtUG+YX5s`1yyg2nR^7pMzJJP`8M^=6%gzpr(_95#GQ1 zl1)KAZPMI+dPD^#q^H|9ZZo0BLu)Q;-WD;f+ZWsr{-2bFG`KZZmzOtP#q8nX3rKw< z5OCc+-lkPMTgQqg6|v;dal9J|ki*rWk^) zaZtC@hUnf#OmoqR)Kh*4MOg_SFE8-p?}!McR~rBh8)J8^#lN?O=%-0z;Ps@` z$oKAF&AC?d)ds*gqUgf@tcj-d>+2)|-#edlJz{+B>?C0K2uc;{757~9zu19tsBK4- zLOlv>I9_RWeSHoktF>FK+o2HSHDYm@AQk&62OeZPEu)VzG3xc5V8P3;N=Ye=*JiX2 z&wsF{D+lOUiTm%(nmIsB%UBQ4qf+v-h ziUE?jy!{>R1D>Kz_;jVdF%faxmz9*bRUmjfjyxUMtdhrm%V606v6>Q>l~%5GJlLa+ zdv=N<6psKXuF~D{hxjk=ea`~#qo7aX3x+I4eO?dB*m-%!AsQ6_=+X5%o5s_hK_B6< z8RziXjt=pZGC$Rtf!G=)1BIGq$=UmNM~6@J)b-g~8anE_^78WAsNV7t0{Q^S$yyDM z>BPj`4#x{&onwrBBXlm0Sdh(9*Pb0*;!O6irM_$VB2xE$85Loqqex|^?al6AH?tOj%7e25fE^CWDarL95pF9 z8U=#oUPjGghQo{7&WHS0y)O{u-Mf8U=`S4*yBXL_`U~BGZ_vbkEw=Ngxa<~@l$X9; zdD%&%7VS~nL%Cr9bxlpqnOOl|i)+(Z{^x~0Q~HVu0?LndvQXb>=n2`&?FXYREhf?g z_F8#d_r|ljoqD#drz>oZWSX=IPOIP20$+0f3PkN47R*sI= z_*LxbulIUkZXy7T8~pRFSRs!9pW}tvxw-gd&*K*7Ehz7m1fs>}z(8ML-@P}Ru7H=v z+O46$`;9QLDJSB03)lBPn4)y?UhncBQp#-cxv|+p{|q#-9M4<~{3%38NSGD)Bb@+| zNGRZWb0BIcHizVm0O%RN!^bVl6nFARG|xB4!D4o(537@Hm%`w^4SX|-=y^5)e%v}T zXdmL|?WzVf-y}{{8+LkZia&*v6syns8X0wd;}`sBK>Ej8`XrT&3PaF_nzqpGS4lt?YW?!Po+ttJCt(Cyey)-p0^v^eR2j9QY6J<-yi8laY9WAKO(+|rT@ zS!ndV+b)}ycHkE6~Oa`B4z@B*t{m}rnQIq!Zod>!Ai5OVdtDi+97JDa;G(3C* zoZlkrrY@&8l6Q)3+&OQu0fSgZt`#+1wLt`FK6v<&v39;*qgFW+e7?8G5>Z%;dbQ7u z8WnSudfhfRO9OH#4@;7*E|=|>d)-%#;6@}%M-{e589>OaNe+kS5Lon_wwJp)AZK^y z5)%+5g>NrWNr?QQcIO3Inor)x=dwpE3@?Kpom%kWqNSS?a8v9?oyNe)An|m+H#YkqKsv(j<>pkyl(?eQy3+c*dilHr9-C=xwfv6{ z|CRV-fq!!^XYEQM#0Ri_%~-d+tztGzkw&IdEv-^i?}jJlaQmASIXNZ9s`w_QCI?vNXNAIhF z2YSF(2#~q@?V$uJk#iqcbnfTwIjlyT$7#od(5qMWbtuSgwbgYmP0#gm8)Q9QoXDKT z>u$5~168ltq21f|8zJACH=WtlZZpUPybUB;OonxCbH_X>%tojBZ;iI|REn7#=7;QI zNQ6XeZl6Fg<0V>I0=^#Sad|lbx3~{Um2a(kdvh~06FJ>Zvxl6CR0@Kgrz;^5O5i|a zn4Vtdi<`q~wIlg%xAAz^)5QgBqAdN94St5uo5_$t4fG#rM2Y(~hVn))atWtyA(tu!As~5jYPxDe8Vx5GOLL_r@lQqk6=|=am6Vl7_f4Gu|=hb zBLv=~2e7@?ZTJkDqGay4p0cgbtTE^gIB7$)op;p!;bjf_wPA*Cph?#K*hKO+?${mZ zlVT2>$Vr;z(QCGsQ?rIb@(B;=v!~bUlJzkLgN|>6MjlL(Q@>}*rkT4t>WZ5JgfDW- zz#Hh7${qNgHhwvVDCog`MfVKuTSvddfGn6FCi;Y z$anmT*m1SVxNi`Zd{_pc-|7-txlz^36-&SgsBCR3b^sd)8r0DmB=2ZKLBDITC$u^2 zRLf4|v^oByN=EG0a5Fq>^oqGI#P-LxeEAY$1ppiW2162M-*Z}!V4)`@q!7K)Jn65(=^icz&C#p z`}`~5+frjrlf!CL;9C&8<@m}t%4L!N({1O|sc#CC0ohQH5x51&FJp4Sr{}Af zj8~4+3uxdwW|~H=JD4<*^Nn=VK44^Z+H87f8k&__aO`L}3pJu?CsJ=%lJE zNl8I3!aXc3aUG^vTIhFH6v)a?5M9FXxZMM<(mqeCGDQ6Bsb577sr9f3FRE=ba$(JuEodMz5N75$l z{J@QT)KphTz)>}!18VHG-0&=VV-|fBa91E-9#qJ@KR)Jx$70Zb?2W`WqQbo#21{5K zxDofwk~@XiT-Eyhrd*Bs+>Gbq37NC=-g5YJ=C~Ex>zZpV7*qU#c};#24u-E&MI%CM zZT6Q**5*6OV5|8e0f@5&AT#5?^^4byc6eVwCnHe3xa7ZVmrk169v!ZG-*tAso{SBb zFHtF79ZZ+R67tws47sE&kon>NXVMo*x0DM zxvBg4x#<(g(E#ZVg!=V_`lne|=C{4wj%RSEQy9VD*r;XX|Kk1z8}EK36I{9eBf?Mr zVpA^kBb5726*;R3u)zv3t=R}xlqrrM_By+59rto_NKeKD9C^HA&nFHq)a|_V1cx0W zrZHBLBNOt9SCfYM5jkE7y|)`NQ7OCFh%k?c$TKhFCzwukaq%)^(kRtue!M!e{RDrQIhkR9b9`~;p$u`jFD2K|Yj&L9_ z{D&dzh?luNNVYRxRb1C$D%#6bvg0U3P;BPU&8=<;egs3a38ncvh(tAcwVbU zxAXSx%?XRudfh_0j z(JRsN-$A2X89G?-YD}@wk#I+=^nzS~tc3moDpy*WhW`77eW%MH2{|T*O6ChLf$b{< z$J?aF2SBqIonB|GLVAnaK%~ZNO1Wc87Ad`vo`%{w#&t&QpIGkXAE7gvDDLLyc;nu# zv&O-S8={Z_y}E4(UW|B6A`ZgkC_?BWMYC>^X2#Fc-^+IV!KAdLd7d?f8^)c9TLrDO z81G|x1gfJ$YEF`r8t!f3OZkDK{GG5F9RsEdBbX(?85tKFS-e>|h~r07TVb__wAjm!VgTw|Fj(H<%xik2$7*4~XO>l`e;mrdMu3CkOsudd<`i~Hv|`b5W#FQ0D2aeU zT^!+Xgk6i zV4sq_SHAf+F!v1c&)Ejz-}osGh*HsK-^eHKLaRl$3o<7N1@jO_gD!zowbRgnr7(lh zr(`N$eMkr}Jp4YD=902YF^i|N z@JE}SlfljTeD>(DKB|66ixBIf6uK!42@C$U$)&i88j$mS*jYik5a}ZZ*(E`!Bgd zVqnR!lDVJ|?jY~71LYhU93B~<11_G*T2|K1=MvFpT(q?kPZxbVaWic2Pb+ zCf}s(7cEjO0I?j-&=rZxE6E&8A6ep}5oe?)(QL7(p=~Ak>DsuEf#TLWee1>j48J9& zomiN)%S4>RJw-lZgP^Xbk%_h$2o04D1S`wdwyqk%qgi9@>@PXBxP8m@I%ccJ2KvIF z|ATcct}fmTRN&nD4jT^#9A9#;oWj((j^um#;0g6B92-_8YRn1I&WZ2#5 z>|PIae&16eMgLR+8mEb1Rze)pXJuLth1lcu>6pgwLo1U*Q^wY93Jg1QhF&T)-7xkY za{|_#5IQZ5ViebVD3loX}WVXbIE zE}fd083PlbP4jp(XXh0~#qUumC%Zd4mshTk5)TQlp>^+HFoPqfp^--kxV(flyc0{x z+_!6$JL2CEB%YMX6Dvp3oRZr4K>dC2xU78PkR-fX0;k_M5r$vztv008 zF%y~>GSN;01jVT%WY~oafM^A7AVeWAo0)!0cvbv4gj;0vh@wJKcmtixH@(!1G0%1{ zCTJ0+d*(zm5NPvm4D&vxU{-6XyW8Zm^P^ZW8vu!^n#s}OR$X25zc2{|OuByhvThih zOyJUzpV6`Cg;cl{qFJdm*zj&--@cBhUw-0^kfz+0^=3#QWy2DaFNwreuU9>uq9wp9 zqg041`&}WyKqNp(%A{z`8Rb$B*{Z|e9DLN^oaK={av&v3F)}bRvbkpo|Fjzk4_7E5 zaT)Y74TU&^%t*^bY{;9>vCjwb$MrV4 z8p_=an$+S>c3TMe-@H+%m+h%PF;UN-Y+JStc(>+1cPMW5iduJz&i;Ho6nV+|2nF#U znx|cf^gdB0HrAAK&>79t93fI>kb5MQ7gcJ&vX1t`k5_>n^?-tm6NEyfH*6lIBmX`| zl8qu}Xexro1{KUqb*BSWu3!m;q9SE&4xctE0f7;aJI?|V-~5hQD|m|emL}j{DLmX| zW%F5|)f%Onz*@veMfmfR&Zv{{tS__fCnM6ec7XJVB=X1a+W+l$ zV-RZFqjeFPX%z?Z@FeUIQ_9V#jzSSAqlV?9OA@(IBivML73rpA`|)bEL0h0jJJ?{- zLY3)z`QW4+rr(7TEo@9tQY9|dWp*}j!3q7+3MxhPJh)KVBO;y)I7r~DDdWy-J_A1A z<>GeGb}SxtT0l~PvDJA#?Vz3p6+Qi93yR>RDP?_l?$h;iRp(+%mMCIT zO-NIZRHp-Xe_HgQFGFry9d}x==E9$L*!pCr9~k`!Qb$pw=`ER@LMDVqXLu#^KV3c< zA2;(*AvLZ^!j(R+citFDE~T1@$tU&lZb4}Pun6}x)+I(fA1h)C!cUNK_U(J9Nt0%; z0yc{bz)6P#34{WbEFouHtSW9-tY48|Hf80*xSAx={PZ!zqH)Szvv_RS8Qeq9#o%_l zdxsu4KK02!WF7O5g~9(fXv7NRTTa-JM%S4RaR{EuPdK;2@PLyT+&L^VnIZ|HRoD>1 zCrh^JHvv0~f+Fb!jzrbeGL(Hv0^HaE<0&r&sGPCS)2a^)lIhC1zshOga5bvrHHLLG z>7yXRXC?7M?BDhlQKm==#d#+H()IPCJGeT32#ER{_9%l;$f&7@zEg1wLj*tVq#)y) zP0U1UU%SP#sL^r{n?r@_m&6s1h}+akQ(_E%vLhwuGyv9>LQwInlkCtw$g_rVz+{c& z!+(Kkv;P2*x;cGy^AB)FWsn84X+HR!EmNbXBRJIY5wS6&VrT$s39@Wk*cs`6(gq?XOYEF#cmlqJd{vZaYo zjVTYiyF_R*%?fFmQHUg5^({QA6daQ*53c3&*w2!OD{%RbWM_@0$LL0(&1kQ!Hn|k{yDeSpKJ6 zO8AtxXqJ4^pm8arUDcNYExLXmfq5IuxJ{=8N=3eT3yZ~3`HWBpuKFs?qA?=T64BSs zfQ78Z?O)vcQl3uuJij_UUgl$6CX8TTW1;(t=>Nixz9bE7AuNYCAD|3?xpHapFI8%! zh2qh0p^8+qBWAo2;*3-gq$q6G`Zjfny`+c zPICHvR|M7;%48|ZwT*yS%_9js%9g1-v_p{SM~sV>M?bW$q8#G~2(k6=0+Aj?2%md* zY`X)JeBt&)+QRCw|FS-J!a(zIkd0Ex$N&Q1>&Sr}N*^Qdn_9h@O^`4pRgLNs7pKv8$Sc5pyq(7btpl->I(C+iiS#cV>+(2 zOP&gSV?0qU%Z;w0g=8CN|E(&G1u#!-KBa5g7`I!C(?VxfEMwZ!;BFBQZHr3 zmZhGL7Pb9>C^>=TvvPw8QyFqrs+cT=8WS)H9^CL&fKrBRyM$su3J@k08b&!F9+9Tr znVMtEi9}0_1s__5AuHYW=(Z$>MEiX8Fz4c;#qF zGr;RsTIwC{$+b`28+VVv5C^_@;XO64CaOZf_(A<+K5RR*oX+{hC+x|Ws+T2 z^n5b(g8YQd%}opV z?OgVzzM#q%_b6olj=QOg`ZxXig*1G}w=KW1UNPjcC8fiyCv>6s8o{o^`_lp~M@!({ ziI6~jSr&t^;EU54B^oEQ9S^&|n(uOy6cEnx<$>aXsV*W5x<+2xH4{Vm>XMuy6i5Y3 z!LmOk5pemvtu*m^FcY`tVfOQLEOpZE%ua~_GE)i`1mw_B{i{9Pkxde zPa3#}j4#N?ZM7RP1<2BJSPv}n9*FO$zY}V_6@S?j153!CpT*yJ+OKxBMMLlojt1CkPw;1}f}Y>`QXYTBqV9tcnV3d^~GBs3D&ht_JbF^cZiP%#Q&@^js0P?gg;L||m3NeVy02EEJctGo*xb!uJ6 zheA2Kt6Ddq+&iwn6Z9Qw?8>psan=5sHyKrs$|x2$IKeNXy(wH(cn4x>558tQM-4nJ z!)uJ%4qs{7@CfYoXhyA@TfvK$vYDo9ZcAw}lrjELf!yE2UiILtL5(BpBe7SYl^?Ul z;RF`}nBhh?Y+bgpkqXtHXK!3wiGPe-+q=&7o`da8qxm+{N7Z-KC__nz@cR2zd62I8 z@%$J|+BOeBXR#ikS4n>nquh4^o?d01U_>>+_LcJqg7ipZ5BTHDo71<#J@x@>p{komR?k$Aigb+c25HahWnMJ9MNKM7Hv9XF$5J#04S5pzu zP$A+l+j!<-e|tdwh2q|t_M7BObuWScz(ak>+e^D+*N6H0$BJ&ho7LvGyAz}Cr_*KJ z?q@j-0|h-JEg78y@bTyU#?x7`LeA~U`YV_3D?ec{tv8`K0PiwayQM$ghrV5-P7vrnbsNC_qiJ!{Tg?98$~*Y?mJPK zvfWkDJhM>bM(f`u410DQPYxpZW>ufjO*trXR_q;=E~Iw^Xslz$9NF6p;Xy1`z>5q9 zsz8)WJ({hIo)L2QnyXyQxOQRh!wl$Q>rR56IB~JM3JFQBM##q11a##F5 zW)6X}I=(aYP59l7!b7?4U}lxr!oaM$s(QLuOIb)*B33wVlZ}U{h#w^I8Mv|}8T)oS zx5}+5z5yPKgGyI4O_y~y&ykBOyQEIgWb#Rm1di|lXYCO{YXhfZs!JVu`84qCmQ2cv zP^T)Xmo4L`;KfD!{uY$Jp!$)rgGi9=$M=iq;+`@NUk?^Ah3{ncY6Z0*tR!B_E0gzUFiAH#n zCIrrua~lOd-57Pf?$)e7zdQxL9_{J4TE4NI5C^_J-PK#Za6StZqXh>XbN zkx0qIvMm#J=}k6Tw@p)0SX?J}i>1y$EzRDf=@VZ>n_3#)*{8n99$q!Cj5x?G^Ag{li z{L!?bN~2vG+H&iIeO!eHWvVrJ|{sUgMAjN1va`RkT4 z=JxF$et`_=^$!`y7w(K;njaz@_uoi{j3X z8iI*Id=gC?F*wYH1;$`!ldmyj$x^^XAFETqABH*H7hXl%)8s?|zQ`9PHB}gr;px{v za@M!bUysz5zvLl+OuKTg%614zU|7BFw^EAG7yUCjtTz^`5-M0&mPqiBWE3E`neM^& z=~BuSU_R>$$ZH z+3Bx!uGb2iaSzPycN}+FmE6NdL=WXaQle3&>Ln!h6Vrl0V&o{93;o8KQ>ZWH13Xz zNm!su{51ie|44&5K6kRSC%U8#KTK&7Wxw8%&T%*5@csj-A7tWJ=jm2i0D{rf$-U@C zhZ?6ytll841onhnkyX7?AN^pr){%(i?|ISBH#^8ep~4gC$4N7#fmOF_@T4s#VEvQ^ zx#&)C3GqfBb}0kQcyJ?DEpcgI-xDC1+uaq28MA3UvvABt_3wiB)Csh>O! z5yC!>;VvZwvj&C?y>K2yfP5Ntt?6z$ac{CJoIYuW=W^qP&BP|R#Im%&zP!q`xT0}p zM%iJmJK*uOX8q;ns5{^W+a2+SaGC3Dz5eBQHsRCVvAT+S>cxngn1F%1JEy%tXRR1( zn?xDk`2)!^wYfkUTH1oDIunYcIXupD&tviXG+P+54K+pD5jA>SusVVju0KxiC zZN~<}FU;Y0cyGQ>)b9{Q=+SZ+S2uVmljR)c0aTm5lJe0CSZV1rz=^k=oaunqgQ2tT zm&do)yTDf-|MafxwQq#W&GxHic4mduW#;EgkMvfkOS3OmZi9YVbU;n9mMXEhp|24P zpY*nJK#so=Mf0QZ*ogd=@+ql%TEu8F|&hhl?7AEUC`ckF&iIJ|_+Z+q7MY@HT&V z`4tFZ?cyuljZDC+tE02Hwl==wBIXc+kMQ)hsSEX;Z}ZvXjfRGXhaywyaEaNta&lCL zFMI6#;^N}uq)5rMJz-{U-hGH~k@=1-x5MkNCB+;8se(yAzn6xaf!o5o0xf;j$9qsB z=Mi`3mN3gVXb{NEU2jKXay`5c$J3ZOanA@uBQ2q!+*OFLa~vnFR9;q}JMqN{>}!fQ|v8scK7r;(53V7w{y?}}|<)*8Z! zvWlGV@iLYyT#n1{+h-cw4v&r!iTL%wIg!HcqiBvtA8v|H|IP)Vu>UJwuO05n!FsN> z#D{q=Rm!O@QB7W@Xdsrbri{tm8B!s=5y|)2yMJsSE#3#+_W>&MCm<>}foilKGXZK3 z4c5ocQ25JKn`?1zQ2*1W9C0~#tLQ(MmxJ$~y91~!o{$N-3>zpuT}!H|vByihU7fEq zm_IchHImvCA%sHb=H#N&WpmQaNg=Scj+ak683zp=OAuV|;pPkv z*XsNbc{4Dgxh5Fkg!RMuEJ*ALiRktM83qyF^X^=?+nYZ6XXNZrrv6Hl*38e%uO{(6sDZU!2xoYvzBS5yqK^$K}fBBscMbx8+<)ff~xp| zhtDqtZwRJK=YROgaQQe%F_PNmM$a#P*^;*4gy8baksu=D>P!O%QLI#+>KQc^A)m31 z0!g8z83a_=51!2Fy>T(BHxBCN%F5^Kv?~pbS#dI2LDIauybW)|*V@GIlto1X0sLPa&CS6u(uNqHTsSE%J=~il(meI^~Mcb zQd4r)mzU*==7LaQLq(;}?v7WLN=do6xv{aa+0#a=tC@t}zN|hWsiWIyGiVwclV*(3 zGScg{`Y;l}`{p6n7;0R2`JL0gG}}s>Ont=WzU%4|q|tdOrz2yd6A<{A4lrOg#CU>+ zO78Z9HGu1OuV`xGB0q|+J=ok%QWxwl%Fq8G35z#8!mQn8qu^qr%O0zx`C9i~G_>{u zH5(T@_}YD8m-TPyPquRrhxP&2>*W&2a?3YW14Sm_>?o$R!ocd zFSE)4FS6ka!t}o1NADq187lsU&fUofx-z?qaaxL=k#68G4 zNO-z?p6&0WM2Kf)W#!U=jVoG|IU1r)t3?%{>2%JXk4Z-d5;_b9;)AEsgr&FlZ%BM@ zdjLX?IGLCavBwqG!ccjm?H-6;J6o`C@9N{%ucl}HDl{1A^#eaH&L<0U)$_P}U2+7d zXJ&BlGOTQlI?Bt3NBzuL{G>qP0K26&gQ1^R;$p(M!eV5O>ze8+YN{$q3QCqNX&Fs+ z2DzmK7zA)Rp2sUy#by4hgWnWO+P!^(;8tPa)l}xc^s;D9TwNX$5a{XYb$0k+F{r20 zQyb}jP-(O1Yj;q8kmo3@J-NfPSnpAWqG*^#dUKAwx+d3fDS-ut2FG`+w)_EL%*88Y z_kH(f(Yw&WsWhPt)<0!k>KqlX_cwBOjLDl@%kU#pbC>tAzSA<`CqaxoO*cW+F!=^K zq#))$z5J9__(NTC6Otk|qY^z$x!qz@mSll|yrN-~je>^8%}YOpyZvg6UQ-ZNp}E;U zE*|xY5(Sz}t+TVc`;G7IX*)VGSmO0mbG)i)ziz!2-6m$ zQ7_MrJdB*Rr8nve(l!T0c6p)&Ed1)T%RZx7p_5yw2Ch2xe zXmz)E#lI!7`1Z_R{JKD*uyZ zpxt?MmIzXE%|cT5Cy%azWMq+<|#Zp z6BE;_n#C1`mb>4^m*DS)4Z&mKRF3^|p20%$Yxbo5E)LYlVs#2`%o8NSfW`Of@bzH| zQ%ypQg1;J#5e#+XW)O1zI7Y%!_=#Bvi>8jdhl)DLbofyl*2W?x=fX$J%Z&;pUdJp; z0g7!sKRiW=I-^Nn*wMAspzD~m2J~j_j81EC)FdKy30wt-r0pN}pTuy$@ifW%YP0Lp zb8KQ4Qh+PjR|)IPQBI4Td{R>)5Fg-T4yEE#^)Tcn*E+x`7*~=DBNc-s9(F`+&Ae&HL7LiKrj72 z*m}#bEW2)Nm6Avg1q755L8LoHTI!-(y1N_c4(aah?gl~lme1|8_x&CF z^(P*1#u{tRF~^*1oZThD_3@;e)&!rE=`0i}NRyt<5R11w>lP&K{kZu)R%*{#eXP9K z&(N{u^yW>B;!hst*J6Lw2#QH~7swk7621?&1qBTaS})8MW!`YGYn$s=yr4S!0>*xU z84LEUir586AFfviPKt`d*$ir2_7^`c(J8HvS$6i0psEX9gP#ZMAv84E;i-jYyG6@Y zmktn5zSWbGk`g@6l`pDQp((4sKS4B_EIXPy#mg`~)1oEKuuu>@Or=Rxe|+hn9SP6C z?{fYHZKF&VO;>upmodKUDzrSktTWv6oZ0Xjc2G8csD^hfwTTp7%Gmt2}0 zH4)t6H%nw+pR*fR9)p|xgS~?6LMw+$B4hssKl}sIQLNtI)JU|3OU>>S#?}cd{L>}# z#>V>(^~W#);z*cYhvHOE>rLxtT)RsIt-tF}YM5%y75vz@hlJ#oK&`uCpYw4Q_na#} zg{#n{Jxh>YKk@jc6TCS?_i8lZk8GGmoNqu{wbgd^E2XLJ;>6rj&Ga0Enn38s7g({& z)l->5sS9ot-)(qfRQeA~t;kSZ=x25$yj2Mm+W3>D^sXajev|B`(C{m``aoNiT6a~) z?w0y%3#g2Hh-#eUPzYu^^;S{UOkasqEw;2Vmj?_H`-I$i5td*kuA_AlMXFGnu0Zfq zTqMH;v{-i{+WE1&Xv==-_EFhtiYTv4d_f**Q|U<(Dhp$3hRAdsvR)z>>Tng7R-`-n znvuR39yD*G;y3-`fd3toIxCa^sXT87BF>huxR@3Z1N+W5aJN{L)bol8@-s`bjq-|e z*gV=q5ovI5O7b#tic0c}t+MjX($b3POVjdl@-xwH8=E5n>vNL4#$25cc@ZUWAxscb zL7I0CG`L($f~Q=Fr=A6Sk=J26kYyh@hoNMa*NX0Ku80yZ^7D&xi*o9eB;LG{LvHS4 zQb!Rcw6WMrPzuYapjSnF5nwf|1dpq%jO!@BFuy99PB-#N#_Ch%y(kT?1CtFK7vx2L zwi%4@;0UU{n8(c(77zanTK5q4bQu<~;J9hTszVE2~PK32s-1Um{Vk$_@ZpUasVs;}+8$?j)&99f?t#vK=)!)%)-+($2?f@a#V z`r_v9I|U!nkfy#O5Z7ctG;rK-TXPYkeL50O{fQAtN5DDFy>M|KJ7|9J;HB(#08p;J z{WPfftgK@GaULipJksMQkxVzI_iSfR*S5>F>pM>6H_N-s%AvMq^{>8mBwdkVeD-4X zI&XiAEE@kr;_x=hl1KawRpXl8DU_y-&Konzouk1Z3V(1Rg6N{wmxh34RrJ3xU~?bM z0X_H!lm!+h-1G6Y8pDm+2IKYp$IA#cLRn?|;@3LW58dS*g>e+0V;kR#DXS~@_87@% z@gYgBMe=pr&&FiA_v*Z{d8a2?!=FxKY(omm zGrTxNF+P#Dz*`Pb8mXT3`%)@R@Vn6gi0q4^pUCq2_b?o@&9pyR)C@NLBz=Go;wJNQ zY3Ev1VlL?l(K%@QuRd=!_D~wL)RU88I*z-+CIq6nf7=huGIRp<{e}f5p(^|dvVQ5S z^27n4{c7MQPaoN$yh?`Zu9XNXo1Io1 zAayAtwPQb;tD2E7RQ6G48A7hhsumyI$2l@kzUzCd!Ta)mWZ3^#O&eL|if%Q}<9tUP zMmo#xeC+q?BJ@jk(T2rjb1~g9Pbqf{e(41JtHpYY?v$pxtAoWB!$qXUN7u^L+U5r9 zH7@-Mm@XI_9;|j_V=`%G3%`l!nd&bWF3Wx&wWD{7@c34!YRjsN@6Ug+mVC+{DHz&}^vu$n?97tv!fZ2E zcYL9x9*+R1s}r~tUYj7nHbwflum62*Y0zNu$Oi4_LCv(v!q3y7@^6=ND49s3mTMf( zbuuVL|MF?XJW3sUz^P}cg5HmAY&-OztPsI_TMgMZ{Gx4fIi{`5;HazmY@5pQ3ije6 z{Xb%_Ke{mFRyjga43DXLhaBti_$Vv)3)pL>sY{;AluL1&?N=pB%eSe&$BI}8!o{t_ zYu;e}Q)anh@gc3BjiKt>j&iUk3mQGR7TZ#!zds;ywN&V26 zl+~iy^CkYfJW2wB3e^Ap|5iUs(nS(s1aBXx7!8MyBWv_o-0*IB*{(V;z{@>I7^#BMWe_D+HdleKa zntwmP2-ZsxNLy?8yMH7F6ffx~rYK0zBDjCrl33!hO8>g_naw~PuhG?qI;V5|fhZN> z94fo5-r>$^d_7%x<-g*+6st>UQe*)%ro^)(J)pUqkbQH6gMD&}TX}pULM!dX@5UB2 zF(?#T-{7J-?<3F*Bl5ui6lIQ2LfhNh`>)8XWjL6UTT+bdbda?@){~oQrdy$#Uh!S! z@gu}!?Fmuh%^_(9IGWhp?2d421@C^lLeUuWUV$3(0rFQFL4P|vk$ka17(w};mBW|i zxI7*S2Qmi|Qp1np-`C3?9yJBJx~`|NkEr6>i}tkFq|@SmSKK>}rIcsagoDaXb>fHN zK+^frtVbgBoA-$pxL?xsn5j>?@=aI)^|K2(ZEfk?M-u<6G^Xeq6{9gbL-8%+UBaOR z!Q-aN$5)Wu-QCSoL<;Kl_;K)Sxi+8vc8Gtx})e@&{5FuK#miDD&XBzxbae{j6tf z>_2GXyw3bzXe)^|s|vjn`W4b=PLp$&)mNcFk{q4laPhyuD{g+F%P3)KqeMu^$cV+o zCWK*(!yg-6Cu4?mWp5uM)*>r{i@JrkGU>7nSorx*yJ!efwg1AgNEj0T;U{Carg?c| zZ58M0$BeqJGfh;9$R%}cP=JpWISwy&8l&hN7;NHpE2KEspJJhCN_D1}mL7kSolE&G zrMLcUrIPcV(=C#Z6!1pJ1-ioZ#i>VJB=e?csu-53Kbzyx)#as}M^9_(O4PFL8CuZK zQnmlzibVy5Hjfh2saKdAymN4{A0WMvr;VaKEHAJ0$b=g25;bOS1&oG2JUncCuW~~U zGZ1{R7%17=+WH)0q%G*GsWqRK-^WdHV{%oQo=(ZL8Q7;r_R;WkL z&z!rLMzw-vp8PMiqJpl>h~UhZe{35V7z`xW>Rgk)U|^_ewmg@FjE+pXNDYEzc08sz z6tu3Y%`zWgE(?pwW#Os+dZL9erplG^2TQ{#+a1%Pp`mk{1-W4!b{v?ftZ@Tr;jAKN zW>z}O>&q3|3ysMi1Q(lJ&7?Ql+C7ETcRL`o@>M*jT&p6Td5aYWfh9{539#bJXCfe|>!o&7l`x`nAJ zwBW12LvfEW0VI$96|-mec5apd!0_%u7lTq|SyNMju>Iu;6b>dy2%YgFRrq;*y$gTc z*BRcrww2Z%X^u#Ob^L#AmDp*k*UOC-$i^rz0dLxy?z$D!k7h0lyDFj^u8%wx#h2cm z1I%qahNTJ!THkaY?$mmEwv9HJ`gi{JQ$&CQJ7?`N)y>sIWDPfab65QfQb$E#ZG#`~ z(DGJ{XF(F5yR=VjGC4V8KuU3pgY5F+LO@;yv)LwUeg*-~mV=$1hKp37XLOd-C%dVM zx)glJdyNJZmXK4z`qrwL5i6qCRNl;u|2*4C+v^vc^t2fC z`jxzvDMA$Zx{_&>%tuQ~k%OyVq**xzqJnk9=Z7TPpC(#KKjOslG`O(EF)Cq(NBDFi zFD?qcbzBqcpiXdd-Dzxy)iHI(vnSK6OT8#7Ee-3^o9C<5-xk2WlXeK1e3y6@i>s8F zn0wr@!MWpc+b_E#Z>E*VNgcrE{x>C8z;Wr@I%$hlTP|O+(oFW~zvc3Td189M=t3J5 z17uU;FXvN6d6ePNTqA@=Ls}XsbxLB-Ll{X+&9J?M4g|k4Zfh)s+ZP5jy20zMW1ISK zn2NqJzA5h6nMp}m;x?5I5?)z3NV%avJhLOn0HylTk);b=P2)Y446-;?gwo8?^6S?1 za~kfrZ(K=Dx|1WVFc4nHU3z;f`|+lxrV&}mtJy*{WV34 z1LB9bouIsoHxr_-MB1wnW*nG^I>M)j%t$HE2wdSe{3SERFjw_Oeq|BL1fQb)cfaZs zKnW6v5U7&V%0Zwt8k)rv_U8VqOqxbXVbn5xw+%?&M$D|%Y>N1vPZm<3hDl&HUX z9#NvM!@>Hh($StavZp3fZ-6O=RM7p5Ek<= zg3dw5&$HNQW!mA)V+bsw_2tQ@iW#d3tQW$?h398ac-)TIaWbdIDau={Z|CBCKY5FZ z>2fNRkQp(ni}YgW4#{yM$coCouFsO5F!;QEuk~eUCu9;~ZF2vLn!8$Qe{VI5hlJT! zT2nGcfBi6TW|~WUhWR7em)hbwx7*?bqs&;$ph4>=h|DhzMcQ zA8cibNDvWQ#WVEQhIFc{E2^0onMEM+7a-AuKN=kiEF{!FynY~`m@*yBs4#ja3FnFR zOq3$n2LZ+9n8}4@mRQ3JUi>YV)Z!#x!J6@YLBsldfi9`T1pSM&4EMXc@bRtg=~9bL zH92XI)a!HSBRgBWqq;i3tJCHbyJ11l%(V&vj*K%Wh+jfQU8IcoJu{oUsZ*_3tgWl? zQ5YE+UsSLXpyLH~ZO_l19j?d`Yw@Qn))v3$lX`Fo^i{s2o0C zYHIkjPK#_5E7MfzNFU4MGrvwP^}4V~o1}pi@qn7j@RR%7*~n}Ly=RdecBqP}ymz$M z!`NI1!I=fstA6B`ADUf%q?`0w%w7aOc$yWO^v%t|IXCrMrm8XV4{cV#jPO36IE{Rz4>Bw6bVML+g<6g z`^~EJC!5=72DRS7ZBH>j5hr1PcSW&2db3m^H&nIy(@dryVy#x4G?2qzBc<269Ow4U zLG89#B6EnEh$#J@{IXeK;p#EQd?4Q)@bmKeSKYBU2$=7ax!UD zF9I?fCno{~mS)wqj)MB6xV)S#%H)&9V7a4pg(Hr_?_ubJ$Ki#YBj)kI!2-F}@=}F^ zmZ;v@F3Yg_TqC0UYGSD_Pgh}H2h+9U^|8*cJ+tsoptXL33l0vxA{8R4Vddh;U0JwA z^OzGokIYUzn8mzaN<&Y4Wo2P*>B7TfzkRfr@ardaw-7Sdx5TTn0?m=|LU{Oh4iKFb zL2e$N+E3##p+hB7VdUgOwnZiBn|J+cmJ7AB3-$N9%d2LuKZGgD&R_3Rp2Ttq?njMP zfOo4;Wt~%7w71q(YPtC9DF$+blYl^@^B`Y1M(yq6uSBbJRJqrJGuJn#CuUq58@ntj z?6xZtx>Wm9R`kV1u%kRSdz`hH#{TAeeas_Og}>oX(E1t7!rUIZW@hZHLw?3&gPrPl zyjTcKKjBxMS4Gph(}*s_EZoLpEciX@A30`>CBL+VB-YSgO0_j!{;f0S*HY6d0o+9?3=@}aST(wS00-jZcA;}%8 z54P2i)ZPmB;s6+(6yB&PH5f#I_sZ?z8YXQan~0}8Uw#?)n4RC>+ObCL+-&64W(CDE z|F$t02|3yE$(!lyndvN;gECa$&ZPThb_*%W3wD{MO#T)g8+JAtY>egd{iuWc3=X5=miJ=r5hfF> z)Ty4bopd>#TEU^A?GQT7v4&3^wdkC-E4t)Kv5hbHTe$SCt&QKByj#jpRwCPJ`UQ=N z^TC<%(wN|8CL|<96r8Pc(sEUHw$;3PfJfG8{0e*MZT9?mHrJ~f3SV~7mloVO4%o1N7Vl!YI zUvp+v6}8WEuS}mlRZNYmMW}-;qGcFls>??K1+r9rT zvuHk7=TI9jt&oj{qoR(Ej-(`#v2R!y=8bPe#8Wm5yda6(aV}0ydj|&yI=XIdT^+9~ z4BMy5*_fD^6$&L-RCjlG3U=^$K;?W@DXG{`mTb`-RHfR28<=HfYxk#0Jr|?lI{L@y zzb=c`EtoiBPKsM9DvFi$Tpry8R; zA;_uWjf4X~tAS*G{4ZWmV1f>{<{_baiS+^j8Cgn7${Q;EJd(F!B=}9vfOzZ6hr7Y1 z7UU>{-?Sb-b~7nkdbY}56BD}xLG)NrLFN5tDyNa@yQmhF;HJby~*!eK1$^KsPt=IvHZ~iVAFa~~C(Pq-N zw(LC;#>Ovrx?DAcxk*S!fZx}33ZpI+Jw1II*#~C)tMjh{c_xO2l7>Owpq)Q|f~d*Q z%jH>kLT1TP<-S1}d@mK^qnjJ!;89~#2wx7Vma9mL&ph9nr6 zSB-VwfI!0Pq4Kw&wn(=pS|i3zU* ziha=52Bt%GCgX-``LXRR9vz1wKz*vc=urMAQ0{Ihk^yifm0QD#+qv5=ETRuKM2eXyi zz>J98V(DOay%gLE5rmM8@b_(-7!b?0q6J7??H}7ZrriM$|ID05iE40mLRqYz1?<{8 z{~3#c@LI13tE@>FEhleC-n+ ze|5$jr5EHqa1Oc+x@~YSE_eR^C|EJ^72g7cD?tQuxjq8RjTI+tV^Y_C_sNuVc6yW$}bDolnMw(#qedBJ8i4h0GR z5&v7_#J;x;%7u>{VYCVOaxn)xd+E#hD^w{7Q|jED$(c905Y|; zwUr__`(vdfB|+fj=H@msGGdKrY!omvGjnhNK5w{Z7)u~Su&}VOe-Mqqq4YfSLPXmj z0#6td5h23q^IV8cX0?fpi|DNX20fy?=6H#m#MOu0>(+z#hQ;IH_PjgH?|7-<(fVYR zeBv*#Wzuno+BeY-5HL8Ysfj|~YiK;V8l9d-hJ*V#Iyo5~9uC4!>-s4mQmtGFa3XSY zL4Y54x0O{@`IO$cKA3B?iU2Ct(&C}3OJR&ccoUAysXtYufz2hZqGC6iA(86->t#}? zanD`}v+woK?4qy z(?6$LTU$p)!i}ZDoJUECrMvsXRIwI-v{aMMcFkNk(>TA7hjQ&yGzyF|fj`_P~Y_26p$3=}JM=*RcoO6_U48 z$KULkrGx=_%2Qr6gH-YT`}eBqYN(G70U@DG_So5(EnrD!SK46y@B{@HHyU{Ld3!&n zp}D=i9ZY?lT8pHPWGrEA&1xJ3k}V0^9@}|McsvCj9^M}pwmWb#XL>ry2E0&qRBSTb z;u8!YBkSg9{S#C5m0$QmXZTSG4Gn+&`sM8GY-3}iprC+`1TO^a0+sSrXU@I~fGGoj z1ok~xA~;dl5|J43*x`q=>gucOYro%LzI@ST?&P5;C@27759l~&$>L%l#cOG5_B_X7 z$AR-rx`*?1{G%yyECM0(pDp~7Q+$Py{S_PR@yOKF7dtx+4i1&KZ{ztLk2-UUTSZza zTDc4d;@Hfl7=c2>`V`d{?v)4$!j)XMa)dO(Q2VCsHZZmHYdIg{w@wqMg5|bxbgcRD zgJv+Yj?((3!l0j4C<2j4Sw$=N|M9dus9hjFffWLKt5@HP2TO&b1Fuq_Qt{(pIAT`E z$jC@R9@8-Zd{yw5A|C-BeMHl17=Zv_{)+emln14%SC^HKpFhB@ z2U$F(s`_Q47*OHkcJclvbY@U8BOxK_3)-Kco$YC}W56{F$54FdM?vV*WzZ{+>sZYL zvs%mDcfi6aoENYl3>$lU92A6S0iEOH1hts2KpFz2Trq5>24(nsw15986>lR^4N=gE2 zvx#XC5#CD;2nQ@IEHg9n(a{kF1sNGx8q=RtNp1@P^$^G?rNPju(gW46et$CJIMY8F zk^SX&Q89$jp)~Tny*&yFfS46(TL`QM%xJhG3?-$aJ{Tw@3(GAneLV6&3iZNk<-h;^ zyO#px#S>SY0C51y<3~ItTo7^JB)%d|!5RrS=vRC3f8JU;r7JSs2o@I?7X$(c$6zOR z1A7cWEFvNTAh9gfA6^~FsU!Nw4=%rs^2$m89~XlV(HT*&m=f3_ICAX| z9|+K)uI_wQNK}<>cUNj)RxMv+l@#ExO}^%Tb{;CE{D$XdpYD|6by{3vopPNbpU@$ zOUpFMpFe+|(M-rBgCtA-F#J8{|M`R;v|Q*1jh7moD2P@lD2O%=)d6t=F9>*)g0;}a z2CzxPOnatFE>!W=*%|8Rr}6@a9Yqw6?YY5OD5Iw^4AaS1fpT?pBGH%+bQo}+cvr{E zn0q!GJx}YP&$Dy>4;1?{DD9zy#wa{JAd9_IRrP=QO%?|a4*W)YPB~0{8>B(#zxTn*8)^0C&a@5SnBKqsmz-4Ri=Zre7cJkc7`(`iMeG|McWa z<^RA$OzZ~E4o&XQD*ix3!waXYXr<;MQ2+r$QWBb)N}lHfg(8JWR@T&DqN1W=Vutzq z!ywB@ORw10=^Kb;Q0h0XcVNCo*k$G57@wTv0>i1Oz5uMY5K7pHcpeZ~!d@>SzLxxd ztS0OXNeUE7YmCx^f`Zc14#3~k*cccX2pHS?`nrgiFcnB1xw&-4{xvm@1&o02Fyf(Y z_@elK5Sy5s{6y#7HZncU&B_V`0TEs)h94z~hK=oXXEamF9ql_qp&8B+=&KM6aH9V! z@250nR)=Enpu`iv(Sz<4EQYe0nwp9VJP};UCon+!EFh~wzYp$ieQoWlKuS)|*4<+~ zpg*kf@)&;LUBjcUA01&3Wq_NS#^QOapfEK0gxB?^ET~X*RU1g0ZSwz{C-5MvXNdB0 zc>meeB2=KlBR4fOYZC!X@b~@wjcapsbTp7Rcu)wDVUYtuLVQKV#Sx7CT_vBy|2kcA zITk?!;Y)usd}T#9Ks=+ckbxXE9$00Ih_s1A-o{*xgAQg~KIXq3ZU1!oiqF)<%*@0D zG|4g@%qUH!F+rLoLO{Ue{m|jAViGF*jQwu$cPBoJAl%0eb_E*2M2@7S$*XvgvUx?9Q6F0 z`gmgP^y}&A>Bo;B(m^l^E7p}y0T zlke2juCK1}@bSIPzQqAQD8OH_0v8rOScl)=-xn1X)z;R60s^oUWDOtDRX~S?#Z*;Q zh1pzPUE2Zcgo6_m6Eoq|)YHo-EiH|S!Lz|a`5w!tAxffu-0W8VBmlL=6>wX_Ii&yc z4qFqHm3?w`Ev@OXv9ZNPZ7r<^U^Pw_h8(lHwT1LE0*nnuMMZ(F3b;XdIE>!f?(P#f zxRkZMJyR2t{K7&r3yZ_m)u)7nPl({y*N%@%0sV{?kpcB4i1nUO`!8R}qO!~LXWy^n zotQ~MZW;cVMX#)kjOQvo{yz3#_*J6|#{T{h&SXH9rN?01H!!5#@Wlc|Kfv!J(3oS< zN?=7{--CC7jOZ!cs#kt-c{w;R0OW;tt>TT1jjjA%US93(?f%ejxx%11J`e!d2s-+Q zGF{IPV#4aJ_N^kIsgxAGXTvxVKD`Be5gT65URzsZaUq;L{ykeu3(89rwumlB2vF%j zdIFxCIH(ff7T&$XHDCMF48C4;?B(07G#vDT1Nz-A3|lWKG%`Lu54@wNiszHM`nDF5&}!& z!%Ug}36yY*cyeH%PadJ@69~{7+Rgf&q7{vx3*-!P!ro*d=;XGFgD?pi;eZwP8v84~ zP>nEHZTAJk-4>mg`hd$?SskN<_$%LZDTqOwZmi34nqOMIH8GJG3=EwFzqCE1)6=JI z|8U<0d~1Olwe2*WOX_P61^U-6ucoT>ciY7L=&G%M{|u3!!39&=-oLP~JID%K5t6Q)uaCs%L|*FZ_D5pj zq2+2|bRn>7cu*Dl*!b0^>=>mM{@`)<;dcO&SmLac#I<`p z=0_C`?Z=zb&m-X_M-J9hFmnhRUyGp|Ec9T)k&MXsA`sd-JYQ{xf6(Z(-;In(PR4ts z@z!KAB#~Q0tYD9*)iLe&e9bWkKM#6<66 zv$L}5vJ!x_zCx;tb#_atAKwm84I&?iXh6y<$<0MZEkj<&N=wr{UF!lt5j1tnlJh8u z5)$5%q_neG^O;G%al^g=ZsCE&^NvDJX9%2G*%r5v)th&i7r*nNAQ3xUTh_X6nqJpm z(kY~*+@#?cOTRzL(0aWjG~rnF#b$hG=Y_GT@9v}SD9~K%3Pw0B%CKbw6!wf!qKxK-u#quXy;Xrdj zq2T-L81K6MKkE~>TQlk2yh=oNj7KhIN895>(=@?b7()4AxVLP&F)n{@o+a%m8(8H< z#gysvoiId2=DZ;1Yx~f%f~vT!1UZ{P?y9Sabj^G-;sUeXj+Zzd@hE3uV)w= z*#kna(=@kSZ;$xruX5qDxGh#Ue%=j?#^%~MYH~@VdCC8J2|}c-J&i(N z1vXsaw0*3qDwtk+07E-i`hlY(W7Fvs7X!Y~SD$DjMeD5?1hW!h5lRsUyz2eES>e=J z;k0&PnP}Z1oX5@uQlt`^a(0C|b>8->M9!*80tGM$YKW7W!D}DI9dyJU7$&f{_XE!_ zX%LYz7z5pco3s6@%Zsbi>!4GqkMn^PJ;Y~yjf9B{Wp#*BxsFaPuIXv`jNTqZbbp-3lx21bi_H(qL~J@utv>l zX3~8|01>bSj|!_cU#@bRZ%RFS?RxyDH>9%g=Fs zPbk~XW?P(7_nxp`jZnG}U7!G6kiJbeSewCQ&6ZlGt~_f&T2&MqZ&ciu^AqK}T7N3W z3?6)VRp%`|3;6nWeprzQ*n2TfAEWNoSq&TWq8XAmOiX9GxK1zr2*SmMh49!K zz|$Jo_No=B!|shPETC)6XaIFVM<*5hi%i(sIne9fqQ4hi!tz&C9CJuWR4*Nn@JT(Ft zdi2Et^o2r57A|xQHNk~zvN(YXRxqEsGB96Z?bTuEUR7@apl^Z;x)n~aqL9>1Z~vGm(lH* z<7``|dm|HE_PC33C>gGe0Z?o6!$pC{-*8?s1_2F5O2$4t@A@7pKZ}qgiAT1ETjS^5 z_oPgoYc%=u?aCLF)6UmX>xshptRXpP#=ktXp2u5pxr_M zlwUy1dX_z7JmV?nmph9W7;EPR8vO{D808}yWAN|8Dr1RXweJsB6@Uwbtl6Rq_e*T4A{yU42#U%&1yM26sYGI*$ zIUMfsAmK%01D1H**C=8asR;e~E7IS;;kOvg9@D~yTX?`%NiKbR^Q{>Pv%)do-FL_N zLY4zN7??_3FLvHaZPQ!FtIKvz1vby8R{tr8 zR0sj%a%wQ%QxXvlULe|qH6x&GGE5iT`qcDIUd$ag{P8zI-D*u+#N|Ml!$6tk`O2jI zBd+9Jrm^Ox*an|)ar6n} zS|NG%A^Yfq^LUXh-1LrC=1ZQwzIW@k*Am&sVSV?{*^P|E=cJyVnt6XtTo4Via1(nY z;40tPWheqCiM2Q*BZs_v9YkT(muTYuwSUS&t@KJuV;<=G*IUI}CWP^L<`^VqCKjLD zw&0X>ZN8Qv`lqPdIN`k~@r-&w!8$W5A-bm?*=NqI8Y72b;^)f06pF4#s1)+Osqwc! zqg$)@Per3HSjO3;fDl0434-DNIJ#J2l3El*2WTbBv?4`)yS!Mr3=TidCl?o^?dw5s zj(^&O7g6C?k!A>DyRKh=74cwY1iiMr9ZPOq?At}z{1Rba3FQ(N<}t^YY*?{-{9AGJ zbbQuSk=bk(pG^2&pN0N3NRl18p{3roRsQL_QFR`#k;~4mXkh3bAK}0(xL^1^xO9B1 zMM1G8F2;t9=Gy+lkkKfiR@T!(l8%JiQQv!UkM}%--?Dcw#IZJ42Dvu+CJP1kryv*@ zuU@@M)T$7Hg%j&gOy>Iy-qPyoYMA3;wVkzq>&A}bvd1w#0s5$UIFF}&bUxt&3JhG&v57w~iZp`jWC!}uD>O}uy_SWU2H(B6iqTVE-aVXI=p;US zny^HoxVUeV(2O%ah`Dp7lGj$H-JWL`hO!jYe@}9J$#p0H{>pdaqBN3yI2S)@-~~^- z+86qoHGAjV+3yvVy)@e@fkU|)+I=s0Qj=T^KTVxp1h4nz)2*w7`8>D!PRl9%OivY*ty6q9ftOn4p<)u`@dP@KEa`F869$=J`^k<1xsmw&!PsW~N|@ zWM6$YK0ev*e5$x_k4VdN{T2-$oOX`YQ9>b7ULH|belPUu)tBAE(wM3r$^0G#!gqEZk=jd5W(;+G&6uD-a_`J4{2#$=Ou- zrFS~9+HH2`Ucz+A*B8+UJLry`;Y)7Jv25Y5=Rcg~Oy5~)4pzjinLZAfE(iZyX)n3y z3wg5X64{TL8=c(4$RG33o+|U?gX~n@%*Hs|%R8#b_qX6X$G(9Y%AY?sLt~mVTyRBl zSgcAY6;lL2cWs4x+1=&7^GU$Oct`(rUo;p}nVz~VSuVHRKAd-K=5b$`Qm{VTczNR6 z*xsJVZH323FRLH}56RbBQ2L;W#PrQTDOg@JrV0Zzh_|;M3n(qe_NPlb6h7C-Lv+fV z`lkxj?sm6gER~1Hb4A1yP?IF+6oSoA4yt}Q?r1h#&HXUTHzAZ~Fq^>oqnhyjAsi2= zd^mQWYXqWJFvdrI7^dqI5))Dq6Hw}tWNGD4?r*?TmB#hlBv$BSz;SuFNyX^!4;K1T z6=#0)mS#X-?0;z)tvW4BZIfMIyD*d8*-jJEk0}?{C(z(@mmKDZQN{8)BH4kRDVL?` ztBSaLlgG!D=M1uO&zKc3?R!sbW$*(z5Xg9kU?rG6eV>(*7`dDKpSMS*N%Z4SS-#1i zkJ9#NEIX3_nPGRjyS=8OAWr8&g0;LuggY3+JZDDyGVIQwk8l^x6Wg6~?7h)nBo%gHN%uJB_}0$-OVlv?N|%VmQ*Ctk$o)W>yQfsVO($>W8p4T}NiqQ1-*U ze2xI;1CA}e(h!Y2*PeZncwmSADLwE~D`4{s{oJ|Wt69g0#2&g)*)H(G(+48-rK*S&2!(Ea^wV?Hz zQ1LFDNv~*cg!VUtEzLJyhCt`WWhWB@6PkD@Z$I%q6*=pfxEje4vNXr%PET&A7YiTj z=qJ+Mz=-VnjXujKz91H2sSBN;aPJZzrwNP2U1N#*86CXgaKwBd^ukJr<|RMF`(p*w zp{)1Ql4=P4IO=fZ7$aW74-rQ38Se4o>32mJ%Z*O`9e$Yn{0;U<9dxO#XTON8lK8K; z4(Ds`kdWe0SOhtUjoU%Y_LG##m;chdH{U>c8S+M0a4#{TO-OLx*&~fILRd`5`1nBd zCPw2hWRS?ZCtEIdDE0AtJJsW%7^;qBK>C8Iu-5MS$TtZ8`e+{0cz*|Ou3`i6(F!|{ zl2!LU0Twh$Z}Ej2u&pz2oPWJgF_-Lge(ng@J6dihUv%(NvN|B%KwqEvt5kt!jNVN; zlmI^^*}&=R@%1rON#zIl(vxyKD`j;oRuhz9Q8LivGH~|<-HcMolz?(_;2k34@j=Dd z7WWqt_p;+2ezUtUJhkJ&!jCQWsO85ZZS>ba z>^i?6f?=@>C#{LWo0CMH#G>ZhNHbLs&!i}$UuaP!%leo&R;E4mm8a#GPvgCMf~lOT zhMaSBsvKP(=2BPPEckSvYDGI__Q7!gN)sCrQNyN)|L%G~KWo$LQ4S!g}>aPj$ zpY=55JF9ruI`ycQd3!LqIvZJq`!ABAJNYr(P~(?R#Ik07`0TuQRmEn@!NnhyMlUr$ zh(-CG-L+S8eVy7^e%H#M`I)YdxEjaUG(#>blb%XtPVB4-E9%qSk;BXD zrMqW9Z0Yu<$?X~2dr5M-&jd1L&!LVh-kObGnmrFh%3t|~l)cgNw~%8IQE>K@y0-d; z;AtRIoxXk*vIFtBgS`e%o0T06lM?amdOg0NY}9m&8>7tlwQY^X^{jP#jVBTE9fB*= z_3YD)%Cm>LY_MvhQ_mTR6XtHE4`N7Tn??6QyZ8O6Tgl^!p>uJ_u2z;uiFQX3ge{1t z_7WX0LKZpP7=5mNg+W(X7uMCQ*)(!2T8f5X32+sNzQXEX-=T&V3yZ;ViXR zsz#{J$0(SWS5NS%3#=&iZ4TXgt;2CV78|`&I&ro+tRZgxB88 z&c!(4w4a%1&)ki-~y zzpnq?yJ$x44oFd~k{Ct!wikc=u&l-Umg3o2ZryF=!abz1k=IiXsa0jb8i&K*6)7TN z_8EtqxuK!QK2eo@lP@~;q*p)!ugvf(4%>m1s1$=70|iZKZZ;0u2zidklF!c}k)Qcd zB0{oO@NBJVX88sA3s)vXh%FE2zhrCJslLyaE0EF2ztUOk9U|TIcR2Xa(f)=oQz;#P zW7ijvHo{anFX6)o7AcEPzgqBlh2+bZzi)g#>bbHARgseCQA#;rwQC7_?JdF=F8-En zdLRAPEt>IT0(-;8=#;{|Z=KaYi4b=p86wK<8sb@p*b54ZwX9G`%ErV;a!Cxw!~KC) zkpwmyJS07Pk1!v}Ffb+sg)=J(E58l#71sS3^&0NocC~A*%QW%+)L~4Fy#6~wGf*`D>pVVnj*HwJ+qSM{_7n|go#GTCFYN|MF*B!c)TFmm&sSM}z{8X9D zE;le2m&C%;l@^jqK|#^)1;@r*He-!@{(REv^pGEuOu+S%0Vz7cqdTnp#+)Dd@5)h) zKZwa~i`pHQ-#3tZV;=t`B9S+cP+TW)q3ZZU8H$tFH9kaHW9we&;nd>>Mlq)c+29(=R(nR8tjXrQ-%@;XM#q~rrxwS1CL?ZY7(h20 zX(IlrKSth$QIEX~H!;E-n_*m9cJ%Eydayk;M~8mhX@sCye{$BQ{AfjvF(Hy>eP}`f z9gV3;FLseC6NiION@EHc_du{^reE(Ir(0?g-TBeh9sPUhz0mx% zw;zXixTS(NOnIM?Dwb?-6N}SFNgLq2xV(phm$DQF1h<=T?J~GXn^VE{4kw8c&V`gdaNo3!mS^WZyK=FuJ{9*N@jqJ>2ZiGv{Cb0yaG;8@Z=t1IWAj z{fv$zI~v$k6Hg^&$+_KxpL3mT8j8cox=~QHisyK`eN&8?L0FLrtcmOV)eFWMtC38F@x0ZIkH}N2#|!5t*}@6;jD@StQTF0dMSYA|hsA zrBBN7Rxvs%z`$9>K2*};zJNL!wbj)VR)$~E&nDyHIe$%F8x@};h)m60OotzOu z9c_$Wq=v2}s(cb0X{oNLQW`FvamzTCAk{dNaSsZw1rt}XUra>|&ay(_6jo-!sfdGd zDm%VN1cOe<8cqhUFVFEa#kb{&isgP`2`~HJ<`iIFgft8Cxi(hV=gNN?_>SM*^CU}O zEyonG#TJo{Tx^BO$%`VK#cxBy(%DNP(W-B;8y^_OZbjshb?r{Fj=hYdjz{ zGJJd@_`Mdx_8Z@;;+yuI7XCw6k<&W5-vQRRb0vHw4= z-Z8qaHvAJ#gT_u{+qP}nYSh@a?W95D#)Q9ebpN2i zL=~?9b1(Y=%4blDTGA-|11MzOg2PHDNUH<+p)>VwCBLj9pf7{d%)CW|B<$JfOVAJX z+5)S;WABYoIq#S7xl?y2KufCzKG6+Ep$XgS7PK5F?7z|U|Ad5%a+ACdbCTZsILJQG z#Sm|WE#C+#7vA4_7bX0Ph^LGut4=4H#`~Tb=6L_IdI3c0+kQIe|L#58Jd}l#anq3# z6qpacxApZ*U>%uMIqVK}@5y?NMuZ$4GNZQtqVjpDaL|s;reb0u`)>Bc$+O%u!kU;! z-mxcs!}Pf_()c&nS6`dJ%>`CF{@ssJ$s)&ihhYK@k8M>_I-8IpR&hUU)IsDRSSc!W zpyC#ew&3;eMAG-yh8^%69Ui{CsF*G&8)I{fHW!QZOeNUL5kHqX#S&rtP!VN1sHF+H(C`VV4_ zZ0t!IVW&k+qX<}u7?fmBC^aMF1~ok$Z6Zx`fR2kPhqLEtU#w4D}$y>i)1LV|BHPnrOf}95p##>_=4x zikodIWc7qd$q*o-vVr+{RtIv4|GAW8P-hYD|N0u2YF z>G!sU5#{Jv6ieJ&-|>qMeMjQ2X2@x&PJUvV{_CnG+k@9dOSN>U%KUfTAgkOQQOJ`)3j=rK0fAAE0LLqJ|RRTmv z7Fn-x=X(y?b((dtuJ{a;ITE$A)7F3Jw-S{&v*&v1{5A7SHuF>5WbeL<=_+)h88_>c znfMTn^1n&emhVcf#1ui>@A!bW%})JYd?+cAz6#dRfNwd5?JdhfUlxElFBx9;99cmT zyyyk4n&&gNA$o{ugtb<@p{E!sqDm=xNUE40%nZuFwkF_FRrYilaob6@$WwQiS(u{L zYl$XzCdgpF`+JSVbm~Lct!_K97!LIHu@{wcM%0%;6Ze2B^d}vl)bKsp9Ol24Vm_#s zWkoCK<3r0Ae+DVZ)HYmI;WsvC zCK7u=AzRfVZ?=TXdn@8ic1xxfb6IYA3vv82`#HZ=q3j~5?-;=^Ue8l&W2d=)b+QCD zTlpSz-t?+5SzWf#P-iT!%1u>c5snT59!#aDFpXy>CC)X6EXr){5dYxvH(1`gVu+R5| zFzoEv&+_=z6`za9|3b(`79(uR%FY%fb0X&U44d->031L)q;;7%r6s>f zm>nEX-rNlh1cr~H94AA5Q2LWj%w=DhmyGdG;4Qq zoC)Mbv?Fs+BcdZj9G0tl1bI)Yyl`-Jy`qnGw}Nb=2S~K8*XJ; z5~i|%7JH5X8X#@t0;D5p#lSoIeyAuuPHK$Uu>gY>;gSKE!f*vk2ji)&s@QrPyy4`* z;lm%_TggWx>H^bkhDY7ZFj@)4C~YHnc={LNyAMu-1PS9YCY=`I8M82f3j=nsD~3&aN)ir}|zeGrJGb6}!8$7{5!0;|OxNoLrv) z(1qW>*X|9d|N2O(-h1MNjYr*()jh&g4OGCrflsEwG;-KoOK(81HU@Hh4Z{4=zp;6E zb=_-qRiy&YV*H|H9FIypRul(g%rUwD9Z#c zIi5w~1-0Dw1_;A1bJNJ0L+^f{%e{{r7-}D90cw#b-&T%pTHjrG=s2DsT zKXY{Q#$-QoaS=Mr|9(+k-L=;4wq3hF?B(g{cDeQmfNDu3Vgr2vCY3;kFW$rZ&2GQk zeWsP=`Oq*$PwfpIH3M-^wdeCyF@fL5?dq~Vs*K6yWfma=Lq3UpEgrWwDI;ZY{|{M( z>AYk12I zY}IxwsBpi>p`Nvv-bX{DsrCt4Y9^Qk?Ep(%MaH3&*cvBs&Gi202O&>s2Ch6Dg3Zu4 zOCr%G_t2$%5ld(zm*kP}!kX|@9kFOzf(UlRq3mt%YI&lCltNV6xvsm%T07LUx)7lh zgI?xPtxWwcjny&F7o~IpddeLf)h+DOk;PR_#Rr_srs(iSKk~T-ZNvM1i0HkM3KJrY zL>+Khjs$=~4i7aN_`beeTQ!|8vsGS(A>er)XStD+JEL;*F$Mz9(qUg*Mur9{e!h6x z#PnFd-4)(K(%E?<6dnfv@L02E_%DO(gSgJDwjS*j$^b*OnUlzHc6ap%O-Z>O zug}}XqSf-zF~{|`-%jWA7TD$V)D&nQCO#G(HvTt0d`^2pF0LOBF2_?@fJRGJyK7KP zuBjr^7J#B>#lb^u_Il3#PY=k<6#)~HGo3^tE-(rBQAbagJVV2c0QKu%6M%!cSa}T` z`-w>yi_b%k_DV`txY6;t|KlG6oc-wM?E%#eAsjjJoqhyi2c1sSrxGjY_{BhT%Vr?NVRq`_;j2;JOu!Zf} zi2i0EX+yFGqb&tLRtvo+7rdI%r`Br1Xmr5^jqt4~Bg!L$W?t;JTI#9HFM`zmSPdb~k=)2VVG| z-RWg+X4b8{;`@BHd3LsTzHGvwQ z9wnY7kNCFM;UVMqwX^3>Fyp(NaRuZkF!=P0jBh&r%LkEU@6XqeF}l9josp5$JA}Db zE=o-He*`{Hd0)78Hsdj{f#uhX#ab`f!-mT>kdl1wC+~^!cKN%?1?7Q~b$2#kf}YuK zKHVh|*Y)wb?}z!{UMvSf=6-kVVWWfUDlpXkFew!SSsG3@BAX7+T;|QAv{Ap0lm;>} zC2N>jBJS`BlLrzJ$IFmFlST(oM>zwAPiea6r+vM2V=DKSF zy?tY-e`$1lOm2r%>E zx!8goT*EG+aur{xo-Nlw$Nn?5XH8DX1s&A#xMQ6BRqVTOg1#o}t{y9qa*UG+$-~4q zX-5J+Q#{j0Y;9#kvaU?bMXA`Cc;d5?-4wKL6jwzEw%qWmg51ahRs%A9O@Cyx)>qZm z$TB@Kv7LtvcV;(I#3&H>(V-ia+29@+v0JY&H*b5B^Cy_W+CJu>7TlS^ z`21dLz!PLxXdE670_(xUDU0Fw<$4Y&d0|PEw58?ww-hxt^QmlzGw1uGNuW;p<5Q47 zM16r{PILHMXY+cT_4bDmvUxpU!p4QaJ#h>)#&iMBr*#~?Z{e^pFg&Kej8t}nN=?2PIm0iHdU#)sMeQRjQGTGa4Op&ofbOW$=29?F@STL@90xlS5Lj7XSg3PZf9n4CSp8pT zC0_;p@c6`Y?SKD`0?ZYR4y^v=rvDuH*VzIFucb%JMsDC4@wlz6aaZZKg2sZz_3#>wYwG9^OPAYjUaNhH{ZAT=y*&-sV19rj>YXS=NOC;= z#l=qFyDe}sko^Me1sQDx? zu2?1i^|<}DzV*X&KU~|axo-*i=e~cFo4%1v_XXnDIilZ7wE%5>t(I+j-`J8%Yt}t8 z&--Chm3q^ay6cMRRQ6JK7p5;ie@j2hUmTpdBjk-e74Iph3AX^YYPG++ZSFT-{S#kt_Mf0>-@UE+Uk(o@VBthD?DH95kSVF#8(JD}V=A;MP)B_D?$` zJvsZg6>!QM!BMxP39XvQepDIh@oIzaeK(WIzF;iSO9DnsiWIS+!hlQSfWeJ!zc0X@Ngl{-qZsb>E4YLhpI||V1pMH4pxC5H zBfn151-%6gU{j7?7b8a98S=ID9Pf|h6qEU9;|G%n@bQfpkqx%hAQACFDWJXoR&^m? zi$%sM@VZ^ey;M|UAn*L{cD>a06i1Jc1w(k>fb0&az~lEmct~gQTc*|gJSm9t-v!n1 zDZud7TfHve;cT zxYoV-u`jVt*^XQ5Uf}8}+9DWx9Him_<{8fzh z*W*@K%s@(uFp9wA3Yn6nicJXkX_mjD?52($f>||1<$b=AybrH%!yYL8%7~aF$6w?*4jGsL zB&csF(vs`eer_DkX5$lHCMfhWPiCRe?b)sOA4e?M%)tqK(*pmdxcEW+uaU!TldXpF z$B;ZW(Nc-VJeyUQt10cmh?Cv9ugs4Xd>$7=zFzh-4L*+{n^M;ZUMoqMI2lu93Q5e$ zpPq&pKL3?-{JVK9%*o~%Jcif>!xROD4aF2i0Zrf%)#gM{nh75K0Ov7SoYc64Qnf); zc7Y_jf>U;bNjz(Qg!g^hTLrl9*NvCBwfOcAEm3difQUEUiUYaLbA6^)&eVx7dFB3T zOr=c3q)NnO67}%kG5(Z;2U4C+s@PW2a*8Tn-XTuhN`fDDc=0KCspxn=iY`;h*d7S( zJ8Elg&JqF~hMTzMG-7T2nrsORo+LdNr}pZm-i+6;#)`C}?xPF5a;vQFkI369LVs96 zsj5TIP#dV^Vhf$5UQ8AORFBVL8it(h)}N~;cvg-~333m)D4xOD^i}40@VLK7RLlyg z{!CclP#B~3?Nz>xf`WkXx)O@?^x*#@6am@sl62J3z&Xf+OHW;H`|(JTZ}qMfG57_U zU-Vbn@BZEG>!sMO>uvhp?0BAf~p0SyPDtsj4&M^^n3rbI-OX^+hX~KWBCQ zOfE^YLq;J+l;RvnDs_BZ(^atyi-!wSO;g6gioduM!Tj4_y8*`33@l&l68% zXc)%|co5%gBa2cNzDappK2XyNl3z#I{z<`7pgtQ)eiNBk!39mi!-whq7#o;WFnGDZ zu!D=c@Ys|1k|&%SF+q)khM)pftBOfmR4>Wf*genPxDvUgX7St8`!_R;Ese1ZX` zRALm!DrdZ9Z@5>(3y9F`y~Pu9unBCD_xBl8y8x zYuzYsg(c?J0^=X04famImyLwa0=C6Tv6$6D$U?Pw$Nquum-K3ry(@S89#R_a+A5lX z?96RLd6(X=D-Uy1|L#~TN!3yRS`vvEZGTnO|8(7O>;d~qRS>_Z&eE9XX z`c@lTmGO(BrB(NP(MS(jJ%O~nVm%LGx>t9TiQQ0uDGD#;Q9mMPFF?b`2K>FIcmu4TqiK^&}1hjQLh9=SE~ zH1u+7nzgKsA4yKr`dN5StXLT5Kz~PRR?A#!v}mG4q5=p?#i)9a5ZALD(vz+c#cNc* z?*9K0!S$X58b}6Lz&-ow+$@t?u%nsOdF1R?KDG zTl!u&--&ALNGV-BKT=O2wB#oZ&lq; zPj2fB8WF9rj1{K^mxgYikj#GKm|0xhhUe=;<7vX{P#Z)+Id%WYfk_fETRE1pj0C)@ zM-YREiG0yqZ>;Un_wnVA@c*&^!~bLfw~+Gk!ZoV&EgF_8X7|JIaT}cVmN0|9>eW~n zHhcq-bmTQHq}(yWh=GzuXrAsM0Yd(oCd@g)yGf(GP{M|o=Lq0|>EIRohUDN%QYPfc z#>i5-xDjE+A-x--RigcB?DfVvoDP*8n#F>%_?Yuk>T4?VxIg*8niV{*qAxmY?t4zQ zM(?sNOYSQy&ZS?gHb+}F$UGRV|9v$>>Mu-o3ll&Os=KbP2Nl`wt)W6Dr6Iuuf} zRY+UI&X^le!+E)7%VWxrG!-(?*p`tHAHwmP+o#dWCkC%Hl$Ji-6aM8ryRzH+oTJmi z#^O*`I$B=KhOU_w&?=gjdM6ipQVVA!bs0X=5)k@5Ffp^?p3v9JcdNQ4(RM8Z&9DNxztjytt)D!QrO7;gg; z(qL;Ug~tO%=9k0sUhgcA!t@5_hKsM)*9^Xb)^%xgYKUBA6xHQ;S?b_HYGHEfAnCDi zw2!_GU;0)Hhji9ArV>$VXvlp{?E~POd5H{IuTcx9;=EoAL4@21# zZz82dQX#gSOZLo7w#03&q+OPTrDukD4wU6B6#SDYXga-Wwu8*1v_&n9%@=@9b> zK4v5enmviCL~}5qoC1m&tD9?Hrw@C>^(xak8Rlh^@U8F{JG$Pg@Nz5uqF5Fvcw+j~ zscS3Bki>2^X!1=J5tDJc_d)-~HTwUF>#dlj)Zk1r*52)Fk&qcNd!k>O(yTWL+ zBA~ZW((vnj8rsO)_ttn978Ei@ha*|Ig>>#gjfBOAhp0}?zbUG&)}K6wcY`|T#j;>e zV_Qv*1It{fx=f`mb=OY%JWcqAn6qZ=X^GWT77cm4ACPeJFn%9o`#oPaT>PQtLocUKK?nLog|yUAx+$ zts+vCjq^t&ydqy>kwnQ8yNqo7e5E8NW(~PDtI+1~$yb40h}dWwb~8YW*E zln9ds0X_EQ-6VeToWwdUa7R*=SC+y!1k@><6d`+JNJ->|7J{xr5@}!fpi;Il3H8#L ziVkj}FP1H=q=F0U>3*wN;3;-%qkdm(x!0#NyW{DVb-AL=gMO>AA*< zv^s9&h{Ik`k}n)=IHNEj^Q|bq>`^Z%yXf9lJ7FCRQDXWxRiF>)I}4H&B4mz}M7RxV zb+3wyJ!_q%>qt{i?Hf(xIe~!{G20udBw}*WiK_VhJG*rstE;X0y~4>{;a$}A{KBlA zW3=(FqhV^2UU8C+y6V&*X*xk09ziNt`uQxjd!EdZzj}LyIzaJTcUr<-_YC}q0 zg1GQ#TIKqKe69{V!EChKs~iZMUl-7iI~Y~^BNguol=s;ee_48BxMg1~agNoGua)C@ zRfZ{J{yJAdbvpKZLeS8uGnU58i~I# z=-+`LF9TM>a(#+Ctq4+U5=}FSBP?;fgGnr*SZ7|@XOO8uXh(CoPitQ1Aa~m7-QQ-~ z5fwG;Ky&!so-s<&OhC#+!nR_{Ue@rd zCiiw_D^)~9t`e_Jz0-!b{V;uFsZ}oJNm)pyR7f_Ru+h2XYhdu-Za>*uMVhdgCITOC7#-DN)IHhV#jPIX7A_X|c^$(tN5hd- zV4$*8f@%27i(x2XNeEs2);N-ULj+!l=KcPEIaBw4a;8Y&4=j|)hiB7pTWwXofCP)p z#4{tQ)h!ypp?k= z_TMRnCe+(j#?(V6025jkQ{eBQas!F+Ci`*%4J?hDd1&?3)y>I8Q>aM#RJ!VM#aeAi z9Ya~h??hZ0saUcUAEG={vQg%A%aeVn1z!{HSlQ>{t&kz;+?pK!mc)y;NrdJxUNs~9 z>H%6$q z4Rj&~Gb+qO%q7N9@pFo0;^C>J3BHVK4-&e)Xlvk1GT+lxlnScd<#wkryW4L}l78mg z9Z=G_5u{(WaCuVam?a@pjWs6d6+)Vrg)um-9+Po6ARs#qui0>|@2405t>HH?ke)>4 ze4zjdlUFkNu!s3TKjPyvv#y~F4%wJ2KQqxnUUEE6)QmO0Z!cW-TkOP8!YerSwA*OV z09ia|dChmDU8(SEWhiJGG$5|qg)q{TvE)BtqE=?rU9E9cuKtex311jfWSu{tFREj6 z7wNyc1Y6G0e)TpxcmuW|m6Pgz7E$9#dl_o$7^;)7)a%BHK3bRO39lB%(z2Hke~JQH zCdOPyxnqZVk~EP*z-GaHA8uMuG>WXul3a$`Chw>2#*>bo@P@Lf-$yUH>ZvYSEYy8K zsF3!+OHq=F_4xG9V=0N{s!P4ioV_jI{kiFLf{Gx=9fQ!sJVNBE+mBsU)$QVo8AHU3W1acDY}SL~bsrs23xd^$WE|dtnjJ&dg|kw=|ZP3!j)s)X^#@ z>-()%_38iyM3H_wiKzSa^7`LHu>cszO>TAfKhzN<5O)v-U4BCS%D8v@vG|g+QpyS; z)_vhgsRlDubw^6(0xCkvwYaffmDYcxwBnqap-BH|L^#W_`ubk05}_oK;=rAt(R@M3 zk_VJ(3m4%ohVRnY+ZaT&OA^i6HX=u?g_v9;%AQ{G5;7GS{P_7ke1AJtbrlXW*A#ka zU*473+()FgijE5_-zTm$<t5m=R4(lxlhiL%Ne)h;| zf!q-KmR#h0f3*z_){uW=7Ue-!VVgQ^FE(gpfW{3#>^1hf57 zUQ7g1kw7o3Jq38NK$aF}yd^x=)+i#oThs8Cbb2O;e7QMHCvV}!xsjKw;-juK?5-U~ zk25`+r9A6()xe)ezM&;HU2swj6V#cT5po54lSdTLM&FQdj^B;l-HC?@_TGsSS1N5* zv$iUlLWXRT1oXJsY?~jOA1=A;Rv2qk=X_}Sx5L9Y-BIZLp`?QP5Kk_yhMGLQmQ8%l zug=(6d9%nzp-_&aOx2(x)b8KK-yhIJSYuF>d%|f22Ow~7(bY@VDmXg1PXFy)oTgkY z@u|T}S>Us8u~&DqfL}Vzsfmn0<40dy|2zGzm>BA_~z-YNQUL0-Er`7$9_Ggj$nxR(s{%V;O1> zCCU#Du}9P;Ko##V$+ailw9pfuaiWYPcVsf6E9<~QR~AcA|M#z^&Eb(#!LWeOn3LPZ zPA2)jw~tQyqkFcEXTf-R-DJ5BhbdiY=5N#rr(1Np4jXRy_Bia?Sppc+M0a;)3`8eT zs6Q@>JKRO2c^z!cKGf}t``k4TSJPX*Pb1kF;={gALta-J+k9!k^$LeZqh#4GR7c^2}Fz(TV*vlH-dBOdQmakzYxbHyJ8O`!l9I5 zsEMj7x{r4!Bj(c#S!+vMdSwdnX0;@DNa+bg3rqzMa7uV;$_f%VjOAp;;s@kK4G|3B z-T0uu4g~4{3F>aC9HRa=p+^>Fu&1+6b`kPgxCE@C4PztkRWHMb>10b7LxF=$RZ* zPoU+^YI?b!p4<%9lDJ_ERpG5X#Wwb;tj`(YP+6yMZtz!IW~;2%E{BjprV?#&&Z}Bq zmT*pA4M+DFUB{a5dE*WAcEJf4&%});FhMK@A}FL<72ThdjvsIFJ2@{8SM%K;n!7P< zeSQ=#SMhK+R~v+djll7yOB2tEj0l~b#HhWhErI%YHNuM3kMyxNF-lOBK^93KhLxcjp?3eba&yd3@#plM%^b~~{C9|Cb6rZKW+-8oPW{;z zjflFRh{*Uig= zZ1Zzt(7%ijRT5Bp;QEtZ!P8Jd>OXzDeXrh~h5NSql2-Ud@xQ?g^a_1bMV5-65I@(l zKt*k2R)hqz>18ZL7uA>eVZ}C-H6A3v5OdMW{>{pWJ&|7kAJ!U8>V5C0|{( znq+Zbb_ol;lzuYgkYW~2G^q#a6b{Zz8B;r zeVv+drH*Bq3iffz;&4!6%s0?v!F@p!`cxuc(kbrk{<`=@iUpC zWy#1$QH3%!OH#;cNl=zM;qnT|oAOhs78i7$I~e&~jdI_wZnhAc8x34or&(PZ8e;5D z|ERbbV(lsM@Rpe|s1rMwHP;!b>N$YGsJ^3?u%bkqDD(oJcofdaSV-A1{gBKgD))L< z8|u}0rY9*O#rn9LUr#LiIh&rxSCur)0)Af$>8;7pXw;dHe+2?2P=dw9U{TnAG&wh3 zUE0}h>uuH+I~eAhk2txzJ34IfY;P{7YT;lvAde%719`Cw6ZsfY{4WKiDy+m?b=3r| z&9(iJ+EGzz#2)pkG>ORHS9THXQwvl*VBN9d_2?4{#o#;{hY!@5Ffc68?@yAzC&=?{ ze@fq+Z>^d3o|o!1T-m+h!T0KolXi0A@~osqx{)(@`=*{h(a2OFvILOk_}zn0P}#|jLB;B@31kjo9jU?w#aH5MU7NM#UVlovIEjkXn4 zlZBgF{$t8L1Wa{|WfSMb zcl#gEXxPD~P*fnpeIih)M54HOfh_{$VId`tqZuMi8g5(N zpQBy`8=Vhhg&JYx5^HXkCDs)R($le$D`-hN87+l>8>Y0EHh=Q*pZV-A9?mOtb6)!x zefe|Ajhha#^xaty>69pm;r?>a6fM&J<6dWe+<1u9ylFg6JG!b#A6;ok^H`3RZ_r6~ zt{=)etHh#bIi!!J3`?=r3k$SIvp`Myu>YU**+uA(*z&RRIZdB@#;bgx#zVI#Hwwq1 zT%e)dPFSgz%2rj9Ay2l9dprvJX|a2r+XLcA_-zk0!Wwtrj-vjS6+fWwRX&vPTi1Kt z3uhvsKeiN#wP*crvj;T1W_?&~UildXcq6iG>H| zBaoc#tp2s7*YdASMz>|{ z&^jG66&=3ODvuN&+aMSAC05jV&WN*E2@|bPPNsjN?6SE+NO+J$?!-}ohA0uv;R6q0 zs{%wJ3Gwi1DV63JM+_d~oo4&3yFq>*Cs{ducfFMg)!r|ohndavn;jmf{XD;IH#&VU zuP$MmZMy-yXKN;hew(|)>7aRz@8#<<0Q;Pq?QLz^8henA6^sGGTni@@m6qtOWDyET zG9Jg_xAI@(FIm*UjmlC+D5^65;HDKxQ}S%9iKVvvD<$h35kl0sF^wc&AwxK&d0zk| z+?U;dvsi(j6Hki(nbGn23X(wA=k+nC>toI8H+`oU0Ni2d{!5`QTwXNrSu#d95|WNUB5T0`bl}$#^T;i9XcMCs{f&rP ziu{qHRjYLj2`NBu>DN7fTQ$yYv}J3}n?2tazjh>Nqo?>2%lK)4ZE9etEhQu2q!N$T zD3l;uhH&OaG?F0pD6V)vq6>})DcwE%67v4TAz&BuRdf64KJ1w;^&DMp={{x#VaP!}@!hEf5#r=J;lyQWQ>Syq*Vw{9OVv_}P6E0P8Zk}5XoGAm`Z$ty zasstwuF)!4?F?DhdhLlatjg*{gw<}8)AGj&uO%51?|Ix&li$xoO)_Ilu#`hOt*u>e{X$%dEcbdSl6ML^|WxPQO z3|d7B5czQH4uXFyu0U`LI1+8$eeG{s6NJZgHLe}Ds^=DW#N_b{t(&9?> zylPnja+`PQnw`}d{fyaIM#SXDGjlL0d2y9*;2` z2dAgPYI~`H8)K1m(l#!pmHHay7S<*88FKGW*El!=Og!B;3oO$BGT&U_Af^X@A7GAm zcifGYV=#2RyD_MKK34mEUfTIR9}9e8y$5+Yp4}aee|=QjPXZYY$YpA3GL{>fo+A(X zAr1&ZmVEh^+ib{K>SP&G4MQ>NInlHirqq#86Ho%gZ2qz&iYHygh6!Bmb=P%JCXiS}=6>ZBHjHq4s-lXR+=sZoRa;E;mt; z=PofcuL+LNvznM{EcDz%JWL9;Ob*vh-q_wPV?JbJKBYMz&2ThZd|K1Olcgc?1BiQP zNjb&ee#DUH&XVp3MPhcqfZ9ms4ppotc8qelCW&Mh`~9@uuowBvnkr{O-7HYy>u2c{ zVd*5P_aSNa9HOw5higD=&S}@x^6aAQ<|eNrW9=9jTsIp;FAGi2Uqfg1!AWQg8DDJ> z^HUL<*_ul17!Ok(dr1tp35=n^b4hL6f!hez zayi70tlBgu@C3xK!{d&tXX5`;n5Cy(&~1{H%FG)vR!XH~YTVk{JFAj(e^g9PXQR1bbbAMM=XOd=_4T_5fUQ8spNQndmCpt2845Y0VUFp z2LN`7N|9l^)$w}VMi{42tslY53w-`GYVGZvebwB*UAEi8~SC;?-35j78)FeQ51+0mJ!Vb`E7V!OeVX&G03i}3FJq++ZEPB84 z2&F>B(W5RiJX9WF_ZWUdoR~V*7E3k4>(^;&(MU;NMqSh>G@1M!rA|av2!~fXQu#HYdWn*DrC9`G0hPKRvhNOtMKsD9 z+(8Rv0j1^k{C`hSlGVtD8$*7Q%7|`NVp9`JR@HzB&G{*c2E9So?3l?WcIvESf1?@w zKYb&IS*cPg0DAIcQH`y!@o^a2&h^ZX|J=zkIP6Oc3U{{Fdum~{;k6W8g*9bps@$PlI z%|Hkr;GY&|OMU=d77zpoC>3fHBs@E0=ZdonC=WW(9de;DHvd&lg*77eiDuT)dhyUCCBn!_2qB3E5%ZI3Rvq<($3d1T`!K@XYhROpjFy0QIBet= zj7JU5TQx0PW+ispies#ttAp0X1M0?2W3I2* z!!|e@{cf)q9ujJoG5qPSH3gK_&3Tr&ubRWRZ%2D`dqG;zy$-gn{6*zWRWoeVtC_0k ziH5DlsQOMngv`q$yXX>3O-I&{Z0Rm0Bnisse?h_1Z_tI;-)}cAN$5<&mmj~iV+$Wa z#HWITz~@y!5jo=Vzt4yW3JQAj=IDyRjM1>dYbdtjGKa|-*5BaLF9{NKPbf<1;YA4d z7)BvWwgk*N@&kPmx3Jj#5kSjF#Z~zCFC1qdqQJiwz_IG~ zHiAy4xmve%Ydh zL=?a;0Z2MR+1qQL*rdC6`$D7tz6teU0B*Q#UY-+^%Yc9F7#sM(79JkQK(>DSWtOGY zIiTpx!^fAEmX@5J(m6f_2*4ry0lixs9o6|3(3`6{11Hcem`jwKl?(rbATMYs*lD-j zm6g@$L&-)*MKw5NX0ALJ0FVQ+u6OL%z@76B4@v==fm;_N56|(zs7ep^Q*h|u&`?lU za&qd`%CBY)P55$9r2jxqzSk+j?!zSne<_x_~=aw?{qB1-J$wLp6wQVMz3{PC9N^ zJ7fd+i}^2)!&O)e4F0PezW;O3>Gz;bn}2#NfWkA~aT)C`8=ojq=us0_Fxyixtz?a_ z#6ziU!}L4-2nfoBmL&ZVT13c*){^+}dCF)?WvKHVf}Ra+^_}PMbR}`0(ijx@w*XR- zT3NJJ%<4{+^xk2nLCz+O)Wgb&yP>*HXlnsbjp$=2O4_{dE>2R;j&}N<=8~EM+g}}& z4ZKhGueCH1)zi4$OfDT>O-DzSbvUT68bgRVSkSbsE%RR>pv8s$eZ8~F@Iv`Fl%=7H zipubLy|Z(_J4h5siIq+1%wu|%tRf<^LR(Qc7aS^g5pE-GAe*=kuU*@bkUTFHEmbc5 zeefB1>GE1HU1^RsE|}Too@)PMigwJOAJ1o=P`4iXl}S0job=eF+?q-I`+5TT>U@0k zihgR!$z^hzD!LxFPIphXaNWp7?-p01LsvvozzXVx6zk=yf@nM-l+*VqFAQ*udvWK_ z3-y1fs4reODQGOK>MHB%Izq`lL%|=k$MSe}#LenD$*iuW1Q&yj31uKhw#UJ}v?jxM z-OA2K`ilN@aaPbMagHs|+Pu;3=eHX-{r0qeJj?X%A(Ki*O3vr|fmzb~VGSkeIX)Jv z+wR&~Uryudhbwt1^smFu@8gh0qwiT9mrom3c`u1VM`#TZj+pE)9x!l720Sug;fx&} zmG${0YaoOX;pN(j&_!f)D2SM_{*Wyr8KMG))qsw^As8CqY-4F}A1|y1A$@nYXcd2K zZekK>@c97-`2PrU5$ZukJ{*jq5+XnL`TcfwLHzJ@N&McZY~n)&1t$t@=$Vn!aiFZ+^9w?=A89&pVm>osd@_DRoj(LOS|1aC zZjNS{c{jjdgwAV6=l9H-{N0zgKKrGUP8j+U|VgZ8<1r-4zAckw75caA}Kn z?@Qt7nb)ekdcA%+j!hKYfnDSnRv1_4&23@DEdMR!xu6sXn7ShNL^qW^4hU2scqNE5TU zq(_5+A(WD@{tcpO)O0WV5txo5Onwp8fD;hL)l*Z$$4BSk|dV%@! zAR!i1wY{>^)4iwVEGw(-8e3F^p!6#-QN;+0m>s$sEDGYey%YY5otoOz%1XyeI9E_{ zW)%P9u=Kmq{p93iyYrDSce&+>=QFgg?>h$v?;*F3qN2Tpg@>xMv$$ExCJks)@$%pd z#f6xcs2WZacafX>~PfCHJ_y2^Z8blTSyc?N3R#W-4j|~ zo?dY5q5wifSx*nX1++7QFb=a6_z}GvId|YHpswv)R~twyhQ3pr zy!i1U92owXd*zGpLiQQ~wsqdQM*o29fbE&X_4@aP}O3p8aBQIS^6g!5(z09R5=0lNxt+jSL~El z=^L5~p;islM5>W1pQ8;*VGT?IS+T>j-0%Zp-n*zL^!wavhqwSR_v0u@mGZ^wbyy;d zYUG7#q+?jJ=2xs99$_~Jlh03wKXNldcLnF-4t$8xUm74`@~ERG#r)<_*}la=@QzW7 zv-fntEL6^j|K)^Nv2qJ31wKf-qzpd8_J7TJcW#wJZ}rx$S}n9c72|YTVZlDF!Yn_w z=j5p8$H&r7@|gANVpZ|&V%gG>_0KB52-Cvr%kX7ZRTp0(`B+m3x&v-+Xz;RX@kZ)l z;~)9rLg0&4kk}lTeg`E+pU6HUNEuzex+|*@{l=CKZR=mYOqxx!4NG|aEX8nLFRblR z5$jK3f)z(ZM^+W;$BbF7-J*2ZIV5q4_u%o6-hA^3E+R!oA;-kR1_{+$kSy{0zEtgL z9c*s88@&Q9yAhDLS-H8NK_)D1;_QqdRj|N{Y}oB%=3p@@NL<%e48oH}HQbO9qxiqv z(MbITc}S=@pI>1C)Qq*%-)X;ygCn)OU;6oo7&|(`t+q4LQc_W2TSSQM)4Nl*hh z)l^k{h>H?Fy+DJu^2Vn@N}}=BQXuBg@Sa>g3FtX>^XC)fp7VOi;)n!EYTx$;B!xtK z`)>T+@1n!9d6r(1Y%JUJ42?jE-7&U>inR0^XxXjz#MXA@4=zLuoW;Mjm%>65&>y%O z&P@;c|2|D_bo552MrS1nJw4Ug>1iKLelUnBX+E6|%_}U~(9qB~WH{;(8130vJ~XGE zo}>8$dJff%2vVOrXfUkCKS6!qu|dJAd72?v1az?qzB^32_sG5YSP0=lfHR|P#mpp4 zg-vF`D!RCoO9IiAr_hx#M`&axXu-q{V@a)glP%#b8u~#S-sq8{qz>~ZaAuTYrXiZG z8jEg9#%;8Xe8ui`j=qlghAf&Qhf&fjNOSYsiGK;4E8j*PjD6CSHc688VzwXiFNYWJ zW*2QfSAl_Oy?49Ei?gfM1qm>Xw!T}Ip3wNgn1+6_VPrJ7xHq+wBEmFts4`Y>y{iYn zqF8-ZGtCj_na4jZZW@NTd^+w0e5VdAv5F0%`FUJk;aq(ZP9C~K4?k@yURNMh#-au5%@IjYSqKioxS$9|I&AnvPgRbROgA}`>(YlfPP_7o< zxWlklO(c@zXOOZS0}{9r*F&D~F$pm-u|TdONFXl`zhJ(ZMvj0T8O8$Ed(A1gyu5Gx z&>?il(EphNEB5Ky=%NtZ4sX=4|V{dy!Y(vJ{-2hol z2FBtJP-S3vh)PUyWO{NkKu`aBDj0?3<*}5M90&{H_u*q_AUaG%X>9x$ehvqj!6a2p z_9&jiw*;T4l8*;kRD-)xE&f9ODkiHQRARukLqPF!FNfH{5 z?M+r0T1siHZi9rbd-HcebgY$HL(tRSX1f8&^r<&;ex9}a{b2*71wkam4GaI~ZwYIG zLcOrvcd}nHk^k%Upg6}Dgh#ow8U?L*3L6Fl2Yiu}lar7f0abFUn(tklZouonaZiqj zU_0UNc-ZL)T)^=;xVUgIFo zGo^$G_)#o4_M8$%+y_q02N5c6EF~q5gpnJr&aAmur#`=4J?SvO!tZEf&$kghhy{s6 z;w(wilIDcYWXbXwC}$nZyctz$#j_ z@cwSnWvjmuihkMiKC)xhYBWWb1D?>WMi5Xy%CtBX#m1i$tGy(T{iQ6<@T~gmxZL)V zdzsnc#>U%K#4WJP9W?YsURHRacUdo+hdrnLRyiDolkVG)5pN?)nocHr{8cDvK;HS+5e@oipa z=JeE5+AC;%T?hnHdwUlVLhU8wfi_qhU?wxS~lh?#`&|;~Tsl$K8(&Fbfg9`q%F+`fT3b`0i zw`HVV+cY^_z5Jcc$qn=d`3?Loem?dEL5`)BrJeeTv1|L!YYKF6u{URqKY6%85~|8F zP2y68U!vWact4H3%_T2;Gp6H`2y&8?yPs6?ILF_d&?DmM|2H=b!DMOd&zPchwF~}X!^<581lRG{G zknE~=h#O?mv4=y-w*W)6fcmTk3&sU26x#LPh{6vA1vNNw3&%dFWSADCS*#4Jb6U~i zf`lw7shC$;T~k_j4C+3;si1+Yk{FM1iDT%2hXtt0YpN_~mg{KOwb?6;B_iuhe@dd35L{BBDtDmu#B4^d{kuJ@r)L9E@m$J*U5JrHuEzqVex7S>D8)ViiKE8tcUXU1v5O`Qo)J4B7kk3e8#L9CXmgXTueQ|YX z1&5G}cbuMcireAryle3IB)9WN?ehv4sJrl9^p*eJgg@6$!2i|IkT_loD)Fu+OlqZ! zObQkUEe>poxF99MqrD&$@acv>T20X}T0} zALEv^_8`M!=h1@tiHAgT3Ny+MWdmkWCI8fL3{5J;wQ)d z?yaPCIjFvkrUY8`FN6GAzTjHdoh2|{kk7?u{G@@b)rxe${YS0cGS6GTzJ5jlBK71)4ZY;SK}+h+*f+YDp( z3(;r0MafuL@q0!n&Cpt6Z`IXrReCDGuw?j!;{DbsUZ?AU#0==?EyFb~jN*T1z|f4j z-#+eI)WXKwO2}MJ%hNo+#Ixz5*;d#!12)VpD(}o@j5-c7x#poNz0wM@^Lozz^Ilq<=@`g^K@wZ5!zZmTOfNR*8$a_voG2+L?#$guOV zNuMZTA;#u_WCRXUF=%!FdxV|Z`TpTuzOvblhmZ9QFYgU|34vZYJmBe%g@gQE_Dz8A z_artPujN}Y$@?dDy%l)jXq~kr2ggeiOLA5K) zI7%6M33xc4_b;N_F{J}cU#L6l8!9Mr?Sf5s67NIQa#6%raw;2{lZe>jJ@TFHM=9(b z{T+l9^FOuiXBy`U8sCqG%Qi;J0On;dl%=o3rQQ-{fnj%qylVl2`KVD`AuO2H#X-r< z;MBh$>Ijvv6Tw6en6+qC*2%|>5yca#KY_Ce{ex9Q06Xm4`n1@4i%+KEaj7x-FPMsHW%LRW2e}Bvuww!0bbGU`O0ftt& zqL+DX*xb!y_jWH?{WMNvRtrmRYl{HrH)!64|q>Vjosj!mW<|7G3qD=`oN-;>pktd z)z_4zN;QqFidxo{CcQFCv$1unF8R^V-9^->PaemH`+NU=n3VK1R0@8Kwo&Ik+0M=^1+pC@TOqW?>AVry!x^USDgbQ!o?7K;>S zx)OnU3@fN{CZN4^N|PKM3s^+afFDu~?I@?URKnYHsOfj9^f!XS38sxCVrwC=!lfh_ zTw!36<-MqxOl**m3j^`7$!r|^u5M^+cH{(_Ev2qlf*wo^HN2}mp_iL@1deA)PWE@( z(InesN0p_+8xmz+RAu31r7&fs-jeo@NSmi?U%$Q#tr*fOTi_JJ<4Xqa{f5OyiYuX^ zp2NVfWHQ5rkQM)`Hs`^PA&emYGZAM3*5)hjOk(47T)X4r_!a~L_ShFm%~v6R0RMJ> zG1JOZJW!ahr5jz-aObKE4aUTTrKqq1nS5n%kPrd6-HEyzP}RmozCJO?vmuS&CWPBFg3N|EhFXi?Y_bPQLdn0_^BIH8Ry zkIa0wigmRH1IZHsk&)m2?kIxtce(v%`NnT3BLsgCkt08ZB%81lC8m_+9K%W6IkMOvv=`vvp9A8+;w>z zwefe9ukVu~6wWD~{yCS1Q{k8vf84>v&XHIgtiB|v+6KbnMbYYIQ=*i0L6zA`%`%f- zar~}s+OzxP%mKJ=i~os=oX+FdNS4@hB=iz%fx&3F;j7J{m{uG>tjpHh9x!j z2&fudaYNY@1u{?qw3n==Hi|ouiYgxyQKgs%^TNatG+C@RmF zJ^jTL$jf?_t?YKbG?));N`Lwj*hd1=VuILD%5P+jIn?4o8EMDQZv;e~>Giuxm1T6i z=Zxy*hrNvp`_0As?^%=oKnrTZkyaK;z@k&ZqNy0D!^co2s{Bzpz1AFKhG$p*Dk9Wt znNa6(8^=}&JR*HSGB0hB49$*-mup_;1AAazV0ARNxKsFiviTg$>FX=sPD;x(Rx#e{ z+G^!Km!lum2e|TP^p!NEqMwAxRPa%-i*`;sL70cKIMbxG>X>ANcGM&JHs@5-S67TF zbd=|8(*o36>@@5O)3YasC&~bnUusYu4T#zt>tAmo5#*8X)v4fbtOttX!Y^!PrN7Zt z(>z3Obh*g(y7?)KCD$G<(@#{#q-~Vf1K|)Q`L?7JrZpF_z>-gLp;A#2&J;Od!FOHX z|1dI>pWFz(=KrsOhz_!VNx3Z+PNN$3KNhOjYS}Em3cA$73nW*5mP^|YvdosASe9GN zNvWad$_!dtRjAyz50>y1)}zgNPz(*GTfv(ShS=5Dyr-?Wz5U==s1ktq;6N@mw%qjG41JGhXXhOXaw4y5Z%xc(4PF1L z%1ZCOlJ_40XR})i?w#d_ua`Y(-9nv}-bO}OUsFG?9SfgLP4E1?&HZi)?#459u)EuS zx7h^ZK2bsF;6Z?2YxXiZ`>zPMF-R6u?yC(qF@oV1)@$5hDw~twvRo2huAoA#Mw0iT zLE)&th4uBNQ19fkb@%-y8O0BJ;o(QBL~YC|qv)p6gR)HJFp!;O*&6ZVr z@k)wz2u>2(8P5dt$!z!#%o(M`ooJ-C(~oQ_Y`CPAwigZ4@&XTe(N6c*6ta4 zFB43lV*`V}g*M_aYypXc2I04is_zePk1~sT0>Cx?(WK(K$hU9Et+wyJ(dVTiJ z3Ys#%_^M6C$uiX#w9*d`Go4#4mp*{;J@f)a*8 zgT{bL-j*efB^TlmKR0t9cKkWAv$i9@-_{++S_ydS=<&RK^qF?f<(u)n=o;e>cNXMp zMI6&z=YbMY9*boG^_-JXSnMsWVTJ9zhE+i~qO4E)_w-PPD*=yWxD zecAnbanfk6zs0{BrNjDmJ5&4l5f>I<*wy+ACJIu#$M0Py4^rw2%jM}`0pAyw^KC8< z)NDb}7(_Uc9~dUs48%kmr@#lOI9u;xAXqgTU0NP}`+~ z*nz+oG;IAeflz~!>T5ij5oWhL`5S3^^e0%xFRq~%MMZaK^e?&O5G6+1rU$@!tnAA_ z`Br_KE&gpQ5F9vgTMVDWlqALyr?ZmGb2&_Wn_ZeFr5-Mv?~U8JtMJG}qx4e! zXAUNCb1@#Dti$8&TB+7cjJ#(?QxJc4Gp*txGKH+4gk6(kJmr^@8QEq*fGV5&HAko}xLimNW+S6F+ze%+N zx9Y~`yxaa=`%Bo*cpNThhxpS>z#%8y<>E3Cza#G5v+M*NEp26BdUj8G<+4S9v5T8C zhCj3%^_c!E8;G z@)-0_STaODyK2%>i3DA-)F7pXQwsM}m*c`pQ?q5EWl}ocG!6|vUo>a?YV0lcuc7mg z&o_PIZzkIjAb#}xHk_Yb{jN#f;C!2@yHR0vkvrCzKZlsd>tFx09=rSyC!2;KoNMR+ zT@Ctw?pqR9DXrGMBUK38ig^OB_(Q&*?~lETuO1M@77jb8u%;q)#Y{T{$tA1_5M5zy zVR^242@gnpgm8sl*Vc#~_a7-S4|dy4=`BkH9377a=@!46TH zaQ)%Eb3;u0=H3zWmz(Ibma!WrajHjmJJ}k!sMHkw*NNlZRsLKry(-)@O^XnCc18Yv zP2|VX6apvpGC8EmiX7E&Am+oTVBawk?>=ik_42 zJG4o9#Z;tB|Nhr%J3pR}-U04wNn@(O^HLVzW`^5zON)!OY(B|_i?w@43F}sr0tvGv z2c;H9tOdtFoK-K_WL#*W{YtxsPV*6E*Sc|1w#+OB1wNrz2>Zv^xJ?d$V3=X?@H zmrG+Im=B4QDa~3xpZinHYqXo?P`aYIbZw7Z8Jg`BCE3&5qzhArP# z<0lh!Nz)tF6@f3~BdB`^lj3=ENAm=paP@{;7R!zw;77;Wxa$aH%F^@{j+yPJLA@K0i6FQl<4y5qy^ zzM+4;kF@0N^6CkI-tTXO;6%DQ8-bj@!bsrk{?9jupYJ6Q`7+J-vDxgFn{Whq9QFUB z6`;WM3_R>Tdm({SJ^b)|_|YDR)?TB0RQgo)$=as?5UG7okH8Y$a%v+gAz64M+?LQgv1uA(QbdNZ3-AGvJ& zWuKCEl-F&EWm}5-bt`!(%VuJnPvX?9RCAt0=e5X_JkHQws7rZCka+tAoVHtTKs5$F zJnXeZhS`u5bsPrNT`h3R*QK<=yq(ZFWsSONG0#KTZrNh>47OkAST2R!_PYje^o1Xo z#|=K<(SlR2w|4GdF8dx)_O*-Nl4L0|}zeVw-9uan$5IXAQcs+^1(Z_GriJwz&y&|SPB^4CfdVnRV596Umffj;o`2)y76 zxyBOhBpdqcnwHcH7dpCxs^;^)^h+?Po8dT?v$aXKIJj4p zP{3<(X@K98=c|R3tv=bP)%iC6Y~G6X=s@_d!TG?2BZh!Wlm=*chsJ%5D_A48-OhbC zS9>CqyVN{>e{i1L{38^Qe&oSON1$R63^I|m?IlzsXjGfZmm&~}fZNT=)CG}TseBRe zNN{nPrUx*1*dIcOA3LB@G&p6GsU;Dza=Kw?b#>wQdV^BCtPTUKZCBMrQOMNMk*!I4 ze_Bu!at3wFKu(vjUHRc|tuc+!zfIW#{=hV-H~=QmRZiJ{HmkmA|~3I*Co596?g?fq#~ z?t^x8%u0oMW`NB(Z5g+&QM|q|DeTwt8@}LBun~0;+2{)<+gyh+DNOiLU?o@8Nu|D( zG|C>d_hWA~!pI|}Z2oSH-IparsRn&a?G0RfC!oPzh$5Nxb;ya?Kb|TXAw(uYh~iKA zQx`3v|L>j(06X`A(A~CvmO>tnp^Ao24Ru~u7c-OcAEL3?eLXXKsfS&;5@=nm(D>s7 z)-ouG8;L#MMQ>ZRQs)$5vfO6bH^ibd8q;o zx#TC~_9jRukVRRpEi9l-P@vm;BGvQ4u12oot7s(&o9r6~t|jf(c!CI<2nizU7YqDU zQ~5#`8#pmOaC4!DiywSjKKQP)lbSCBRXS5%7He?A)wVwDNC|d%LFFx#Ub`2?(o;HPtj`z{)L_Yqhl}(KF8<)qQ)uGL|hOCr)6T_9+Y)^r*yPrcD&e%fC zPN6J4`LM@|2EspvuT^DAa6M3umx6V~K{{ku)MwiKoKt8t+ zDtuIweeyPx0E?d?U^&%5w5`jRlde)opyUuUAGv24RcT=JjV=`A)(imPO|YYAzyGB4 zTMwGrc0Np|~mA-zen6-NEcX*Is7346=*r-swv)Fi0(6@*}eiey?bU>;PN8x4VO zoF1v;q(?H~rW+lbnn|etPS4c*yf5x5++uVVM#)h|X(@kOaEInM@O77<=zZXqSw(m- zJP?Qe`ij5aOAZ9VLW#XYvhskm3RI(suLwbJ235Z?5aGne{Q^aZRRW8YsuEyR`USqZ zE74wHIIzkh+@9GjyKr8G=)awrwQ`;D4xqn4Xd&%MbJw5bE|6X&6FW;}vj?;9(C<=H z0srP!o3FxsIKS(chGZ;|$(=BJc*iAF8;GI@hM{K9U&WPsl(DfMVW^gwejQ=QT6{L_ zYzK)Yn-)Id;}-h94Mm@6)-q)CFAU}W6)IvH6Vt@Ci~}4bda_1%m_UAqH#fGi6Ru;T z(pp=`7j(S=t=fF*m}?2jU(iKig*B z2gC*Tcz8`?6t-2jLXvuWhy|n8G*o=Y?Rx0HQz#MPx2RG@D4oRM_SLDx?thCq22Lk=>LVqMD~HP&o)(y?$kP; zvIw7%tBL6<(xcyg|;1Es#&ogg~_i%p~x{W$VQ5O zW(tK5eIt;dLacEYZT1eylHd|gMSu#6S!f_Hs7QvB=#)a>dY{$GAx7>dQOXfg-Gv&D zCBPeI`BkV%k*VI$KhXqcOkzc;6J>mU85jZL4h2d%jy0z zpw-+Wz9$xGElyZgRyKj|&*x8?9?TiTPOiKhRwgc}L6W0+vw~wm;}sArum|Q}isxJP zdy>MMK=c+|VeeTXAuWfjhD#EYTl`S*7msM>SF-@JBG9qI;#AqGrKI|=jsWaMKO%!I zNN|i`VZkzuB8JJps3G73B}w2qq|cx>$whglEn-(rS3?C5O1)IKAglF6ezypmLF}Kg zvS6esOf<$VQ8{;@8&4!2ToA4oSXO#5ea9iduDpnpyhMuG!kdkWN*?faa;=ryqEmJ% zsn`}~SLFDfj1(QlMjDw&6%Q$j7WKs=m}PD@Ur1o|YvnVadY%v&sw`mGd&4s$!&VvY zZT3&gZ+d7F&p`U3cU9h& z3<4OF0dQPn<1`!NJe!IUlC?$0*m_^|K7n*o+sDH!JcvLc%7~c?k{5xE1Ib^Rczt=F zqSDz4&%{1-3xgXsK_^x_J}CeA+e4J4T6Xak~>0j>kC^B z^<^C#4e_pj*&jn2c8N>a!X^8eh?xWA4^K(zC~-Tgi2?%1u)=3tevz$n z1bt%$MRRO<6KudRra~dZqCO?f~+@AgS6bTgi z2a8MkA1u!L`&g4@-v-}2U8-HJR!2#{^BFMZ!-3`{gT zhGPY}v|p>UjD+Znm}nN&h{(RQvS=0xaU91aBFBo8-SnIFbh40nD{K_q#H2v~W`dct z0g#pV4?b1=fDDto!*lB%wy7Uz|m-L~Q0;>=!l@xBcXzpPW! z6I&VN&-KjEV#?iw*j$SLV{^f1ACIi-tY)Mxpu5+Q{9Vn7 zj{y(@=u&L~r>$MHW^iXch*gO78cB0lLZYY^{Ua8mrZLa8&-r2b%@Bpq|CR!OQWr;J zZZErA4rW^lKiCy4mNP?zOOev&8V@v(dB6Cb`35B^0rBk+rKE20 zW)6Jqcvr3PRk?*&8JafZ)vo1eMebKJiRWSWW7u8f&PR zr0Jmu3;5Ml>OQc%4G9CK*-+wI0`GTFr$fBb{dAmGDem;n5bhO_7y&rsrx$Hj?^;{C z*PYKYSz!yMSbn8a53>=#>=-atAP?Oa%@4s*?q}wx$ARCN^W&SK#Qh+*YKoPIO{r(`IE^Cfj-(JScYptC?Q3!x zWU?W$zdmrlyHa(w*-~`-G#6Lc+4nH)80nzb-@~|f;z@kr+Y3BrY+v>`mh#+R*9|Inf|9K7xNp*=iBF&mUeEy?=(0pMbOyG_e^wa)2xV6C#9C_u;snsMQXYr#k<0Y zpr+z(RqqMoHSMZDp$l*Fw*4_xCQL2LtB-7AFbNm$LwMN#VjKQH^1P1<$WDa(5G2i4 zya@9um7JEy=$+IXMHWg4ZPk$tYb%=_ojAm@jF|rR3M0<0cM1A^OTM33I`D03l$}IU z{u?F*fi5jXJk@OdKzeOKAa#Xi877gXlg@gq5FHt}jrD-`*QJF9lymiQl-6IzXra>w z{lxxZ-slrJaLOLN8t#)A=PjONfaSp-piYFla)P&T_;rf_YX=`|B{hCMEtf&SvF`GT zq^~@wUsV!-Vq2-3=M#;oiix3qgzdV*c#&%F)NOydEIudfT$DO3&o=TJKRQRr@ttgg zI@=b1IyJaaeo=vMLe6ax7V`}cpY<+9H8vrnOz`tf7~N1#uGf~_bRK9u$I>Cj_nU(S1sgwl-v(uf@qFl#jW5dW3jsco}RXQ`qJN5%q{eiDWUO%v$4& zxP=2Tr}E@$KG&(Cpz;hHXl@%3ClBKvNoVKB@|(CB0e{Z;wcWEvrP!Ll?^C7GjUiFG zU^1$LYn@A>tRjcY3%napVKwneLsaR~BBDS+v`z~G%Qle3ET85!7WfXQpsXc<$AiPnDF z_E$RYuk?zN1a`tbbwcn~%}_O{!Bol8+&fwL9JC7w6l0w*9c{_X)w($jM;t4}VM;{V z*j|;QI*vIlycRnnOx-d}G-^B|ysTMQy8VfT#CAy(1B72ZCnK4A`$%k1*587fkvT~v zzbR{J!6Ot6j8bl9^SwuN(t+3$KFA;(Ucj~V{~js?Ha6cjSQK{9Ds*57n`AFt$0PxV z;~E9zp4L3`$!y<5g$}+m4{LmuhT-JHe(9M<1w%yzMliC0$Fhl%O(jsWRRQ&~pueZ3 z;AKoKYtQJK@X&7?+f_WDV^q;?ta3w`6Ggg349o4MPfIc9b%Zg~hhCtLnZEGMrz#YE zzp1-7RfJn(A#*xQz9K*tUW?v`PaXL=t?g?Qw=%u9eU>IMY3_wCMaLAwMM~Bef^Kdz z#?c(Z-W=Df^roDQ%EpZ@ANR$Gnwh68qJK5S$j0}3M7K4+v3;#PaJ7eSM({XaGC%78 z9-m@19p6eM4vaErF7QkIKr9Viq(hDYh^7Do{U56^e|Z!4W-#DZ@p<(T_x+*ooFui# zPpqAl8^=U}V|3lih3J}lp^vAAmP(pfekZF$ zHF07}JP#*_DXJoy{X?A-DfWXpff^`PZN&OB0CUVe+)&2M$_Y5!+%6#eng%29sQ1I> ztEmlvl`&>qGvbI=7c*LnD|G@3Fq)J4pIuP?$1Z%UXcmvGM}g`=z8@P#?1IYzSJV~F#5Pno)gz4h(^EVfKsQ-IG;T#W zYLlGXM#g7A&*Q1-)uiKtnyo3Vu$heC&cNkU8-cl9S{B7mygFeD$q97;7fZY(! zO9Mu>H(S^@vmZx-CYkPc;}Pl#xBdD@-U|2G`=`KN+@InItc|97Rb)y{4v+vPa2Qp}-G!-Fzaf35!88N-qzECAFrqP^22UKK}l;6^gpG1P^@iyvTKv><0f+t6|_{`pnB;R-SPz%aY1 zTR?z$hU$-!(tII}u*4trq$v&J$xfzJ1L{J~DAWLwF9Um8pv3zZ(mxQd0L{O&kVup* ziz2~Uovf>3uBC4;*H?0Z*@G3b%I?zz5$)RE3brkj6z46dz;B)h_wx$|A?Tf2d}0a} zHtf>w1h{wVdh*HPs+4x?HX(0RcP$Xl-C&DfAnjTGK4FJDY58s3F4e#$)xavnz$Vd@ z6ImaM2JcG)uGkUYD`T@%bX!9fpSrKU`CMS|UX3c`R%(^gefDJ&wd+7VnfTT>iZ>HZ zijy>NtylXeo6&16XSb#G^FwKEXHvyU_%R2)?j$z;jNL?|!I(ZKEeVbvrsEY*_HNH% zz^SqFwMr2VZ;8n|T{DsU9Gm*_UgH#!S=0u>d6syg+|MCAG|4b7+a2Zn!@h)t0ZQRWHd__h;)d(TT58h!f zCya!n$!nFKOSasK@^P^u0D>%o||BbN?}n%4S@X7hTkv z^|)+rqBvugqm`ZB9^o6sy>$@HN%YTI+Wp5%cr4e*#!qA=4-ib{v}VM~6{8Vq1=~e+ z3`tsz+K)x_;oWWurP~d`I%X8eEacmR7(luchbsNaib&GuPD&TXp33VTwO|8 znRl$HxG)vpD&L4Tw`@k7osm z{jJDdES&ZQ?3;Rj(ozr|C$9|4bRH5S@4-p)1}mG*kBI2Xo&CWB8f+f)Mjh@oTe`20 z{?}pufV-dI|NZXg1o+X>jmeoD-M`lsHk{GX%k+ogMc=A$S-zREe6#);(U=*+^n9zi zW3$$sE4WCeBB%(rxxt$V0=eb`&kF>%yRAGzh_qN)8jeUq!->gB$* z5A0ZK1q8JMMC#5`iQlo@kE-qRNlwgiUg_E;D?GlbcNV!nQC;3d(XHDNPK+b{YTpGm zF3^#B{J6T~PKZuaEYUla>FP(|)%ba~`!a-w47%E)m^RS z^^I}7vl}FPEf0?z@a>zz%!=HLmGO_`n4iD8UgNB26^R7>`~XJ)KvD9a(%E@YSc2m6 zJ5p)_8d73Xd8OhA7Hat45v2K2%EHiUN@#r$Dq`Z$#ZuT9_0>G7XcA~6Q3KPLNn+pJ zvvW$|rl)VSSH|E-#$w_8H(T2eogQOfto7A_1ZHVjw7j*sJy*z2_# z?k=27`jxa?xp)}y7e;s$wud#AcGkyr4D3`Frdy?nsq$v@^(FLKGP=eJ?6q`On@XD@ zET*E$CN|O&VPBD$sc`pYH(K&eR{cupn>$aA%TI$=ff)?ZEay4PTJ5}99TvE48DZq~ zQ&l$#^tq*i=JSFqU|{JuhCHIPJi3aCGoTG=CnqQLuV0IbiVpVo8yXvDvbk?Th~B=w zzIsN8FF#2^Vo(7IENsjbmft4?6K+>}{KQSoq3G0)Z;q!H<@2q$7Nj(WCn*NBS8Dz#P2XyNov^N$X4kW7pIdWlY%H&= zZhw`T0M?Z1uIPNMEjbjG03T8wHgaND);j<^mB>dW0Ppiw_bB%C$LhVe6uXIEsT}xi zE(AkE%M0>S{U?7zZkFi}ZFR?WI8&O2Q}iMk&o))o>krkujin`x*HWs@ssZD=zpz#? zhD#6Io`EgyD6EbyOfIvt8TJ6Dqxl@nb&Z;&k00P*y&=zq-<&=_-hmsfS?TG=$H(cJ znT4_x6cqCE@+KxG{QUeb-abBW!7wPpZ5TM|k^dCUB%7uiCGv1(nFq2u2a3&< z80=KpHVU+sij~K!t`}Brhf9Sw!%125kKC_i8=fIqJY2_XxH$Aqv7@U+X#mI(z|1K zG#=|}F%-0vzlwfGs4P0F(FY}e39O)y$%reO$)+v;K$1=vUs~XBa(X~|<#5wI4GgB5 z&f{NDQeD&XFQ_kl*k21O23|kdeOpFw&*Y`jY9D%r%H#HZcuQ$n$f>5Nt}dwtQrPB* z(`)`>*QdAXNLAfP&|gSU-%4<7@znGbl@K>s4sG#O2ZmSHW&>7TtR|-Uk#hm(o0{qC z8+hw@GY>7-+LiebfDkaS54~=&uuk9Chv8T}c6Ro-xHt_B4H+33&{nh_gQkc`(9}=R zj1hquY!sRrMGdIQnw!gNKCRbaI@aa=DA5W!ng6pONp0745yoFVAGYvu_pdp_|OWob4P;*E;#SzWwWg(WqE0T@* zN&US>^iO)^SmxZ)clIeg0zS>^$cZ)Qr^&dSaI)Y+(JFqu#{>O!_v*Fgs;XHvN`~sfjO@giLuJl7?AV0X z#DaBULsVYPxt(cG&Rip^_1pOpJY7SzJ1n*N1a|Cr_C8AKqzlA1Ffe2@^@hDoj>qgA z97RP%Pt!jvmpC~%I3_+~V`G!^zJc|Mjz;T80uxE>0xiCl>pTO@cFxWW2?qxU_j{8? za@5HGWo#-w{v!1`MG@FWxIw}4!rmaJ?2n)zLTSg;e6!8j z{gLmoo`P2qiK9P`2%QxfL7Ud3Xj+gPU66BWD9A3YEzYQI&Us7G@Kt+ER(o{DskY(f ztHk~d6`oQ`3PPM|xcL&U;kUZ}--A894oA4JOR3F*U&357VlTt8(9o8amawq*LGQ6c$;in37z9;Rra>{QRaR2ce7i4P!&h2Lv{&Av6BDpW1`jgt zZ&kHHEhm_cB*U}pk4TVnG&obOzaQzP>zO`+2P|<#I%5uL!I;ySr&&Zs6v{i@Hr$W< zEQo2B1J>2oe$x8nMo51YGT`~*_*sLH!pK7Mq`Jm^-d+?q?J0&ZqwB7ap!?=bSlPKx zd~|Aj`?l*%M?fz_Ohi=5BzY?g3 zOoQzvX#5hFn>f+-4VtfUQtFi3PUd=w2d+Y`VZqkpqpYr+px1mMTr97TXJbOHhz$kTx z5Q}Yw&=igJ^9VcshPAtY2(LH=tbPQxRj^^Z? zdM_Hyak)QM83`Kk%Y_?0A?v#${fKD|cGqTyfr+`gN^uhV^WaZbHQE1R}j?LL1f~b{+xv&x%Bn#Lou;dYQ>YN64&-#TaZq8;i*Kp^~kO zN2kykZXB1J?Vp*yEH!03j6IIWNj7Mrp6u1n$`pG;#^V@N-Gzn)=hgo;Gw9H+X+;RR zZ%M9iDRSPMo4+;zf zYU2oo(+Gwi?(gI5CK3)#^Be;rd(--Z8djb4Eg%1Tl)$e9O^oh{jVQR-+|RHW=;^KK zkMr}6u(n|nV}iK@>Up|?;_XffI( zjbCgwP}bVIZ>P(@wCm%YH!lK5T)lnpM z^(I3Z1ABV}bsD$3EAz)uua$_ukB=B_P;$HN*s0ou1%aJa;@fG2Auti=%D~{^qysU_ z^*YTBJ4yZiIX_A*Ddgg!+4(%TdF@~XHHOgWh{p-3io)ZtG1OdzUD$n3@=0SOeb8`3 zHt^I`eEhEpWJYk#B;0kKA_B}t_N0r!ev!_eztZiI?ETisj~eS#Fy+4 zPIS;FT>A5=CdVSFUSdgFaYECCooi+gsaRiPAzOIXx|l+IStk9o;y8a~5$EnPCk%{a zqxB$?wzhUO4k00-i;Iheg$3{m&d$!hfBz1&7B~s{BC>W?4PT>ic2vN>Kj;&{>~~T= zKPPABlx-Oai2aDZ!pFzw1z%85fHl14$FQ-` z(9dL=1w2viVj^y*`1pDndU6sT=uR*O9q>dX#Km7OyK{QnyUWR0o0{&QqJHwcUIml@ zV6x64Bcb&?aOVB4)P$!Q85{^$BXH6poDSz|4h|kHukVo4{R!A?(6~FQ`-$}(P(@k6G*+dI2d88X4(H;GVi!D zj|9_-|K(K@NguYf-@OUTl?u~tS`H2KIMnV*YAUF? zD;Y25WH!!a&UGs=mE5b^-J%J zh>ZM3j|uynue=7m5e*$ZXM7iofXx?|_0z!wdQV13_|u}IveL%NiuaUghL(zf;q1N# ztU4@KrK4qRXo)-DYDIX)DOj<55C#BgY;k3Td-u-O)iWSS9r6HazU)3b8+UdV0gtb) zGYfs?^${FKhCh$zeB5+_-5goH=l|16$T1FSZzY6r(`O}l8%rK|T7m4ueT*#k+&BDI41_Ja z0^9G9yA^y-2q0S9c)f9CUijDFOljx*X)52C!G0?B5;H<7VC=IKU~vDCU?H52gNo^g zx%lSKxYWso8m2pQq(z@V715Ykz!#0@Lmx)UQF7FE;7!9C=Q-16s=c?*hNlQxRBfBD z_^lsq))L`zFifdTXj2NB6x}NJ6z$EwZTjN9M#N4?kh$W3hk?25jH#bMF(W`eBOQS*Smb^+W9YL6w z$S5yAwpQD@+;A>a?V+k*OJT5{J2%&uo4cjk6DA^5CQ?-Y`u&Eo%Jc;U0_u>mnlu{~ zsd^)>eLDRSouN44jk=ZwQ$^EdFGoT=svWKNTp#ZZmpmX44@QAhE>}MbKE%Ey$B%^8 z`vY-SYhA0uTi3w+>;kW!mlUO*6aL}E#}jS233B9L7AQRvd*&M({HPNo9dkqbmY=lp z`1hZQxDZtG(NC&OnRj@|kcM{uJ4^>=h;6EW3h;J7Rdm|_9 zLlPb(+aY0sT)?i^h}@5aG88S!LiG5Hu=^f9K}ati11ZUU#EOun_ zQrNlYgw`Uy2^q9M14oT-T!ZP7^G&HOO(;u>Xv)giG(8J0>3hVEpadA3X*!l3(BeMyIuvyATD}lNC1%3|DDrV55x0Vl+s< z3l0v>%g%m-on2e&z#5FI*L$?+3LJS&MaAUgUqPkGZC2mZbWWy9#OCYrNJvSyw+V!> z#%5;XlU(yF&+e}_6qi2m5ipW)>DKAUoR2V)usSv95K~1H{`r%^a|YeM?~e%!2&fUj z@;b6w(;FSu+y$x-z7u*IB_n0-t|L0L8&u`(?Hy;bALm~J*83jxxDljsOGzv%XfhVd zc-nc7Rjx_u8#{M(h=i{+14Z!NX-25d?kX_*Mx=CIclBZQb#EI}ucbi%k~BZ&ABhYY zWW8QA&SN)Ue%P=#VtmoXL8uBnVkWCO21v#(B#oZ~(+Ei#k>BdS88XTjq+fy%lX2Q9 zw9aA!i8sr1mF@ zcpNS+K{ulj1*WJD2Y6Go$EGec1 zaT2yMr>W_VSNcfSFP%W8M4hX8fXzj$%1}d9RdsU%e_>EtBP?)sVtl@dkW5+3Iq`RY z`N{TuXuXafBjm_4uAHW8-g1^GjTBh+)K-a>hv&5NexFt$pJjOF#6kry5;`U}+1JPfNAju(FjZ(bSr10ILXO@7 z^O2rj4hB{K{>`hYsabt{1f;u^PNP;*NhwB@By)!s0>b_;%*+mUc7iOK8miRFz*|&O zQZhF;_vA5KzsQTf^&2SQV3hU4WtX?AJ-a_EpA_pe=Hk-c6YaIS<%f9;FoF+b^_4<0 zgk#tkH?O$HYDenEY=p2M32NilP_E*7h6#&Y7<7<^$SEEK3m3Q8(oFpW$`%Hayu9+ML$#*?Ae@)vWcL=x=+}XL^*$?jrNB!- zcU3lUg`5Nh^^-W^ulRhCM?!JvD_t2vt6Y?NepsR8_(Xc=#PWD-tssn#nQP<7(S%N7 z=FQo(KP`SB-H6%=EQJx;y)kzSUFXjHD7@Sqreq#C$FD z3!QKAXN8dH*Kd^vEF@tO@y$qT`tQVEe)^0T#XtJ_#Yhv{-|lR?H)xvAg~A0HuW=&{ zc++>+dHz881;a5u=5u4-x;5|LE0p5=QhTKs#w?)jQMrr-oW^ym9(ZI)L&I(G$Yk|* zc6Ze@H14ji!R%@rEUev~otfF$+4=b_=F^Ldi?cKSy6f9pN^zkQiH7_ znuO1dc4F?;$pq6{jc0`I7?E(wnxgz_$LC?g343%R}IE>9J?U?FhskGX2E?%_wb z-9NR980?Fe=Zy2GP&}o0wY$B^RUDcKIv*xabPe4!z38N2LdH=Z2?;Y4(!RH8DD*6>~bd zvxd-y`V?N_`8b*kOZRA~V19SIJX!m%Dj$-N+#swK3bHrS{Sp4(KT_s|%Q?M4d+~ho zN1G5x95McuLw=CKbmMd?BkV_FkO=Qj;L|Vqt7ZcqJE+$N$eT`jn2)f$02IiQkdOdE zNf1N|KBoWuOuY&=L09f8ZnS2-AHP>jrzaRd((Cg<-;u8u{hLlu9 zl*gTvwIvu^@o8YVOG0BU$NWT+<2iwF-C9-W`TJ@Pjc5}}@f6=YthYMNjOf_s>%N|1 zjP35%F@#Vfbw3npfmbR?ge6~gp^`uZw9iNx1nDOyCjr`~NEy>ffcsuWQ879#EiEoC zE-I?Z6Z&|4eT{&_Y-D7V%;{`H4d?YUp%=uWD@EP0x_u@L8wmMl25YzyVx@RW!;xe> zGU6VsB;i%@#l#8wylZp818Tv2>XG`?qRDKqwG=;@f_oW=P8}eBKQY>qsLt6XV8LU} z9J~V-Cz>vf&>6Al7It^7?st?_R0LcuU%GRC|CZbU zQg$NpN6(h6vXJ3So#Bje)@F{HO*1wb-@8a+dvC0s-L8~5g(HfVF@-EkXx-><&g9M* zCA=|dZZ)Tw)k_!{)Rka^0G*UWFsL51WN~}kI{{EqKtMoKa}hkDF7R^Fnj|)2z_!7o{kVaJ@7K%i6{yjItL#GbaaHj0Ev1!bYEjVf5Dgumg?yh zCPyz4W<2r}pEfvt&+z&E{vBfU@AJNAfPG~k_(Yio4tj?OLV9{)Y_J1@<41)z{Li0Q zqyKY$venKn-M;oXwV73QsfO~fd0>uMnXd^?<=}1Dz_Ny_?fzrbe@`_&-Gt6T>sP;K zXGrVjZBz_}lDd{ZQ}g@6CPPYAGv#s(mPLn}D4~b(DDpy)2WXd;iLy{XfqMWO)|c?>Tkuu)J4@#~);WY~-JA6gC_(Ya%6Gn0tjo z9kPCywfrzE5#q=lTFf@RF%MautKO+LWx)@zu%@R+W&8ItW;wz-dl-*G zwH>gb|I(>{-RS91M4aU-=51ypnk6YYrghAlzIfk?YE9$4^9^&5j?Qz^B}yBWm-tUb5I;7))JbJ7?z8c8zmC0peVFO zFV=N1pR1s-3BSB0iVEONiI7AH-(X99OB>9bIO{inO??Xa8d>>8Qkm`xW0{H0%0qw( z!nf8VFx8mVA(Nb$_H?RbUVw#+ET4xh@!yPM{YsiHB!jz(92@*{ z6Yp~O)TwQ4-h8P!qY4R;|9h4>tm=``>KbqAZMoD8mI`w;7@~=iw6?Ya;NxM~ zGcQZ!5{%>b{8Q2P=-$|5NsaJM6RUM=Ye-{fNK8_EF{T1z5&s_m+lxDz_+^jWos-jD z-tn;8>3aCTd}$zBKPo^FF>7C`*+D1M0ZGqXe}$qHOFm2_O8?dl;dT)H{dty6R$W2~ z?O*L!!jf<8Qw-YZF&2ld48OU07p)6?bHc+a?lOAGLlf|$clk!=rQr>&0h+#C^{J|{ z(Lj*SX2M(fJD4cFj*8;##s56^Wfwqp+#A)|^b zqdllKdB{uiNc=H<<)2hqx*xgETpAeG;C$ZUL4+DhxX$n&D-eeDy|P($oK9xZ79+60 zPmKO1n>3m;KQZH5@bpo50841EO0Bj~^co7O{+fyib26Lqyt-|1rk(DDfmF)P9Z}ZB z1y|0O=jcP3;Mzuj<4I6kr+s>Ml~PcGfzx!;7nS;ygVe;Sq2lTo>#wc9o^V{|QvHCb zr(;w}%Khx&9G}~*USERqwxl9(mPjTI1S=Va_0H!8IzP8Z~eh-J04 zSIF+~w4v#BM=p?15Z$G3eq*sXyFwKcU;6wRlw~v>PxW+`gneC}^LW_`dLF?MF9;N# zF&2OFjH8qJqN5Yb$(l?n`Db87=jOJ;gx8ju|A*3`MVsbsQ{7jZ%6PZpY#GCo(N`N?JbsPGjvD$Q8d|3rzA5y(#9_{42dYI*LnSkpdJiD@^z?|o z=-=ur79Y2Hj&E=1S`;<>=Qcz=9)XFnSg1GtW^B8{dz8dtDK0)B+mKEb6SF;kv!9=n zv)KeWaDPa2g!y*C2?n%}q+Yt;KKB5#%0Tc9hF@DQ#!k#lT`_vTWMU(&X==iu;WFW|f(Or}Jx zE-t93b?E46{E*$f#z*sOlM7Db+mEehr>BV2tPX2)HT#5A%0hw`ylKx}>PC_|!qqL^ z4`NT4MzxI^cFNXtmgHoXb3m|d%;DGpfKqT=Lk|}HHPE(~x=(pll3BV)J~`xcjHxv$ zN+@>XyB?#L2V>*t9EcxuV>4kl1u}j9tlX)U^@cJ)bw?*So$MHqc@;@0UjH@AmfP{Z zt#e6L)!iWN!R^A)Aa#gn7xo%X?PLw4(1iBSF*NVWm0;TAn5SkLnm_frW?$K1XEO72 zVZLOe`*vdUnT1w$oZlDFQTZ-Q-wD zlh~E6kW?nq>0Jlk{-Ghw+s#Ul0QL7p2n}STl?cP<`mj*l)$9!SfliCED+7G=lT0f1 z=kL+Q6w^!f*2J7{#dbfVqoZjwYWvv7#4~dxhbWqrvHkBa9r_8D&uOLj3i-|s=NS!$ zq$MP%D*Ohu%TN3Xt}GX-)#|3F&fDGY7Kck0U8q&dWsf|^vI7F6h_a2U&F2Z3Xr!hh z#To2&0u=H|cqAly!5p=KjSeL)}ti4B+c@be5ZiN(_C` zaA(ue(HsJP@NtQ#4_(bb2_z5zT~{)7T!OjYMsy}N(R`Ih2MaifO1x&1gG?$e#XR-= zN6$x_%^<~ad@dIrr;`;3k7@6$?e^A)HsBi|VA5M`yew)1(-IKZEK|=h=n&xXS}h)g zo$XXgyF>AKoHyc6r`O5`7#l1)a;bcIir@7|X?seE)?3qX^LaE4xZ^XL07v`Bs$wx= z)&~Ncoyz(`-7H6*U(ekI#=Xkt?!$kS@Nc&Zc-`S*!DVSZZRY-`1g$44nF_)XK zt!^(8$_YEh#>Osh`R<3#ulu6(sgxb}Cp~BT%Z8J=JU5Iam!D;P>kt7*cUGp1H8rH{ zPIa%#vQ6$O0D98$N|q}>L+E5p^IS7j?vTeMpfu1;w#ooK3T9*_15Y4qFva0;TKwIn-+Jz&FtnR{g1u--Fu_Syh_csa6JB4cX!!7D~5!Hx?_JZ-R$yUR)kuk zw)q6+d|!b(Z7RSGfX&`Tf@YKBfD+gY5*hSO+B{w;m#EVaw>q6BMMnqpQdH_a_#pr} z{WbR4(c+H?rEgLkWtVs@ANEip)4pCxZ!g8$w{Kk@(3XOF5!aHWG(^I%mK}BCFCw22 zcKC&2b9_6CHa$hZ*3oWuvfjGC`J0h-i->>Q5&rtD|1Okq;wj4OC{Pu!A>h%xeQ1b% z=%8{pyFKz}g34@rCmt&o-u&@rDmHszzUTsPKI%DeVqIaXk~-h?FfoO&EIjn?Ew-8Q zbWcwcULWi2kwr|fVA zB)wECn1Ic|t@m%_Df)Rrz=S`Q^|W6YCL_Jwb)@d+%|{!t|ETM)Jm+v0&$_L36N6(9 zSy|q9iiNaG1&S^5`cadwrD-{wEV?ozio(9CHMm22J+l0U=9d6}LM*Y0!!et)k=3*d z9+9+Gea3P6#^F%IIfih^WAP45a((^vpKrwNJyMd5myid+kbl`&d(!}tO|8s?m_<)h z(F{lK{KsPml_MT&x%PGE=PC@krN;Apgrq#b(4?xv9%r7^ggWR!Va@#O>VpcXn>?E^ z2{gO&)7S9SHu9snWk>+#f89hGA>h{3uKnKCGfBN%peW1xcNd#tBgmI$;%3GS2~p$q==JUnsC(aau`g7FeUZSso^l| zuOhw=U>vxfARtRiUP1R2X+~^HEQ=w3=Ypc2_|kKcT7;tf~hv{YL~h~jhsY} z7?YbeZL0ELV#LQQHVMUh|?z z^~>M-I{4c!dK*4Fc&_ga^fs|s-w|3e{7cG}j1WeLW&!Fo&QOVJk^8mLX8k_rI=GFb zlayq!A?fP6uMGX6WY#Ai|6eOf+31IKh6u+5;FaH26G;3Q@BT;rn=_4+V6C*_6BbcN z2lA!qPv8*djy)3zF(J^4i=_L=MIYa+-|9*=us zk0FsyZ_x@svW&6R*cuSE>)t=D6mN#SNx;Twl=g9+fu8>M)~1|rFVx8H<_j0cTsL0WB>G zS>1meuB0t1-}kBlzR|O((P}j~xi&t5&=P?_oR4seT+QBzUuqn!a?8Ot*PfIhhDBSz z!VKz*g-#m;A~CGI7AH|{$#H&AK<5ZFz> z%3KTm#g}Spnf7HWZ9luGwCb|2k?711(^$Sxv^onxuJ*d076SWeA--Q=6P?>?aQFik z_{pQ+9nS;c)#2X?g{m!@wYAa|Zg=)ipSA}Rs?L5bw-}ZcpMai}`1tk5XZB5YhYs7r zDGGVgVECQt2M~YvO$=5#rnRzIEI6HQhye%t{szvzNwbd}6z9j?skOQZZBkAaPUkC? zxX@r(kLL~ne8gh9RoCnw@NnL-H`Z;e+?v1rvOpov*FU_)eqXui3QtmUD310){)mQ$ z2kIa$9-i8wAARy!S7Cfi4@8L3qgfs9ZV#aR*aHl3EIu%seMJ2v?cy}`xvm@^kNfKC zFuJ*!vw$ZuQlYrmJoIt+Ees6&Kh_Sj&QDY-;^ro9AlA^(uuQdrKX>17B&7-DiGALp zf)<>y@$qe8&(97AtOajDiYJOp#K*^vjFi-TzBWs{?HL4sXwK(b6UO6L?ojXISvEOj0S_z_8Ut?S-HvF?!t}oPTv}4YD`r|Qd?>*=E*de z+^z%S<1q^;&$s9z{38+**;&{d6}C&|18R?F2$QOv&p*t@M?}zPwb=rT|KcAjE?h_` zCdAaa+;#*OSD%bdMXB^FlUXlP!dRIG-PNgg2#my2?UfA7ZyvL*r+tCf|sw6xtt zGd7dSywL$q8oT*H{fKg@I;l{uO4(B7*_8Rb{?M)GM8pW#NynKF-xF}VfpMNZ&>#Iu zg)d>J&QCAFcW$#p!o%@6Y8?(6b$h;pDyQ0u0sWru-#xgUWSMKU9%KObH3+kENhM+* z&j#p#BvPrAZfTc4#AOd)KBS<6ZTz3D?Xxh#u9~bsqkWlNl|yJES!$|1_(7s7$4{S1 z1~>AgQ(^(Lu-U9l0ikx8wswh&6i?gls_kLGA8b-n>Tnf?j2tQdtw z_ow$ObT`b;mX9D7ygFV!K0IXfXz!e_vqZ#WmUOi8&&z{=y}V4jZRvKrmSJtqUfU2u zc+MxPO4+1$IHk#CiotlQSqP*&PqEJ)Aj>^HJuJp!)#^2g#KK|k;BXk+Z$ql9tNFZN z&Chc=4sng|6-^O94$69ofwDy1OTj?eLd_;7u-!+%Ucz1mFQI7h9{!rj1NDnr0O2e)r)l@M3zz*aHgVo z1Z}9FWW?m=+Mqq4;s}W5OD1EJ3rA^ywS0W?J~oG@BYrnt>i_i({(zxcPyWR&Ahf&G zF^$_ct4+1sYP2&jYGJYE>mnx+5m8PET8go_OAm(jphmgQ>P*EtZpzpD`xkjqX``*~ zJ=jd9EM^l57OAF&A<9`4r}J)uwaBzF)6SPm91)>XA+{#IP_|oY>}WeO8$* zw@zjQt<>utOpr=qnl?J<=;-nDMTn#sHCfaTc=qCT-==V=_lEQbTFRMtgCPy8T+sIQ z`0U?Xk6w^gj>#p^mbVSEKw@{FGql7FWSZ1qPnx0~6q63*aG<5!*Ur3Sf@=~x^un3S z*L2ca@EWk8Qfo6=WpBKTG!2%npej;|GcB6Tm(RKFi784*&;SL7zuU(eb(}-z8aF*d zv|3`1%+woii7|q@OSD*%@6|TL!HBJ&%`pQO*h%6aqh#6og{Qo(Z zifw!yps@hQ^;Wo7BMpO2YcT%vz)qRb)7IwY$-7uxZKpf3^2T}p9011^>)>+HL5a+X z^4}SDw}(p?ZY09a-(MRqBzSe)v)VF&f4}r06#KPyqucCE6f6JI8mGruw&n6OVNV*c zNjGagf4&c77RQxRq*o)My81%7WFGTD2~>%m#3nMCN`L<@FI~Fv><2?mZmz{b^=wmE z*{F6ixV`_^VTl1Jfm6orfq=teI=7}US}z8-{NomQBf`t{Pv3!xE^$BNHC-G`6+tB$ z?T*jIvUC{XOtUPXT>l@Q@Ng1Iw`s5~>byawOO+*|-Ag-3ARiC2LhyTHkRko(Q%ch% zZHr%k0nNPX>H@HEV=EE-zVTT+L@+xn%gOtgvGD}|fEX${#`%$N<^WfLjBnXcUQBo3{$$|fLv$C?NDega?G50S8zv>e(f{4e>tUp%_ z&Xk+IpjNM^c4`WYxnx^EV`DYVOGH>_q#bIbGKiB8h1q8us%i>Mjg6Hf5obFm+S|o-b@z3)SImyH z?XAYME;iV=4}CHT8@L=Rax?!AT8LQ`s4T=VKb$QqmH| zsk$goYi|`xx)sZe&TcVUMbm+fP*UOOf;v*0ut_lDu!^V-F&og<&oF+;Gtd1Y7LRF4 z0PjoGJ8k7Os*go|ru2ha8c-sdo0@R{9yVx-TQ}y3Gku)f;GK5$d`}Zs_R?tNy5Zo&23OCJ*tC$NTJlo= z@pw5o+UjDWU8T!+|MpIWGvfw)pk}7_p>h}j0^W<>Kk&p<@S$`HWldYR_lfI zB=jF#T>I-g zQd^aj7gKY)-4QvwxpJUdyyRD_*cE3?`ahuga1n8GpP z*BJ9Xv!0UjjsF9+t0n9jZMw&uQIpzt~K3m1B!Lpm(6`!PpzU=sPti>FlX47 zxC@z`#DZF5t+tM?A{bBV$*bvL@L@HqcKW`?Wytqv(tdG$bE1DP-MAs#cN0bBE}B=R z#V__Uu958;yEZ&1r>3OHzwYdP=K3Ly&i;y7Z>v06?gwlR5g7tckia>#gB0tou$|}J zv9dNzox)968ny8nsvy2_9Iq^|9Bp*ny)zs5%Wz6xjyyBN4l>evOm=^&4i8Pu_jP*f z)op`EQVxGz-Y+VXFKKghk507`K_Xz6;5A(HwrJ*Km-y!F54N_B%rB%~!sHJOc56_EaA9MvrZjv@8J{?HI&La{zf87maWAM|rjZmeSycE=rcWcY7b%&k|GeYFOxwj|op885QiqD93y{rB{g3XBr2ueV=?dd)i=Ow}0jjAqz|lMQJ! zHMk}u6uH%Zfcd>c4TuRFW(pYa*bny?_|sad0M}4$QFX_CotCu2?Y&BaZ%yt(ns;;O zpV^vPZh?J!TyY9c_xs{6E|T0*k~CizxRjiGOH-Fz4kHW~Hz+-So)QrpnlP$|9 zDLLpmJKK5Fl+T1Qx4)S!$Ba=)|2ZwM2BcbQdndJSkoQaRmkK3&;mGp2ADM#?3Cb&L zFBJo>vS^pAj9aTNEPizPIcpwn-3h;GpWZ<-pK?;Bd`z zIAn)^{}#B@#ow~hgSa8AFqpkvgWsE;_2@V6X{|O?MZ+%+cZ)A~tV+Zor5~oteUYfP zm)$;pgV#W%f=K6Uc|B}_p987(M}0~(Dwz^iNtpy27Xbq>el%SP+PW;e7{ zscEtO(j&yV(JrOFdV3lg#5>laYakDPcT)qSF&&c`JXEIh09h!}Y&yzIdymUzbFuPA z05s?%aI*Ce%=hff8w7v=50{hVI7?*UqT`Xk|2>}E(TipA(L(#AO)BLESHFcxwXk2j_NXy4u(Dx(qXxn!M+^0W{V(=vTuL)nD+6xJgCo4 zfa}GHF|rwsaW<{(`Ea>^x%|a=Y0th+>Fj4f*1*80!iUqm7obk^PE$>fQT}KFiKkHe z^6k3`#p6QO*w*IEjx8W2H3?x-r@WEn6eaP?-z~QkVz(885z0R9qt8Z2pz<$Ycx4Z2Pn(vH_cXLEXdh4+rOH`Io zxKsa9vW8{{YxMaWR3HAmxg)q5FyrL-wB7T9N5q4hDPL{CPbyI=D4uA5k&!Wtdx+!Y z{Lj=Od$g17>rc~TJxq*sHjvwa46Ll~5Z7y2@sV|qTI$3Nr&&CmL6t|?AlPqNhRWVc z1N$++X1z(4q`BjcW4-2m~2k&z~L+lMSiII-}-QN{j1Qnmp>_#k3I#Hdu1qI2e=bTYRHY zn8IPP*xKfaQrqv3DQdJkw8*L`(2SU$&2j|qi*8%6PWaeQK`G5;`$4(GJyYm@crLe)nLU%IUm!eX5E$!s8-hG!p^ForBWSGXB>}qO~Aw zo;cg2ilu$9x!AD^=8?HS+TA?gKGO$T^D5^}BN1S?0|N3BstlTppsaK`fGe5Z4d}k? zl(7JyhOik~)$JZiW}DxU2{SqoTL)@e{a9TxS_kVC#W_Ty)$>qi? zy!~P1cwy?H?7EESK-yF>Z?NGnEnS{`>*hjdC+DD+!Wxzj!=1g02h`$mQbNt!HQ*j( z6iFAU&o1;N4VI;ILZ~2Y?R*OTN2g%BC-txtg7Rg6E@Fmf`0U>mDGY{FUAKo9Uk1lE zvvb7sIqX7ZEKCg4)_fM)mOdrbnnilTg5p_JCVQ9l+@WCYCk?NE8--H39N{SgIhda& zufHjRtQ;L`+~%PuW4j)=ac@+tf8qvQy4^#av|KJRY^Sj_3+2}5PhG`OyYy=tXY2u1 z&*%c7geD=e!(Yoq+%I0Ws0(b!^>k_O|IN{OJ5uYpIEFYLVW`m;xl1!&4Pu1&BZWNR zDFOYCL7Jo4&L4nE=fwlzbVesc(PLfnrU@kHXUH+t^jB(!cN``9*Ng1x97wz zmq$slvD`;hZ#V1Bt;Ro$@v4-nA8s6&T)ck1qhIfxTTLMqaqOLQo*k%%KoHMp5nt-Z z$#tQiuA9cN&7bF#UQZMNxl@N6;%Q!22jg^XH&<&p1LDoK z7mPb|Gr+7AMXu^HGE{BgIW1fVlBSaMvy?x^pQ4V9jpwjRrf^qv23F+Q8x!!fG>XJh zGIi#yz-_jO8}l+0S)Ws{2hT|q5WWy-*YhGdEbGLHUHVbXbR{14F4CXbR=WDWid^BP zb4Y077pilzF;WR0zF9QG7D#XZ!Sd#5Y}xs6YJXe8$$@fa1l&#BFwas0ldI_R7|%1e z$u}aG5X&B(@b0N^r@wL-*q-3nh5EoFUrxK3fFhMLi=|2-2y_zk{1hpdc!2(TUpNe$ z*Ds40EFPvZ0qoX}izrZ*r;B<;eP5u16Ge3yK>?{62@vLnSU4tjIb<{L~b7_@W zxR0mI74o2?Z@y0;%R;tQuQ>1V@G1n8O+57qRN8Q`nS!K4i#x~WU;<-_dR+pS;Zb&9 zq}Ea^sB4SC5f=lcqhpg1exY7^{VBiBpob~1RZumidzR@=iXl{@VmsOVA9=~;UkdHM z33x7#26rVa!q?@cTA@{jE{9e&?d9@JNKlTKFX-hnA#q*`BED63M~0=ZBnf>;-y8O4 zt30Tv5)zUbZF3Ky$?jJk>-!k_l_rS{uoDq6HKInO-z%K0(0_bJt5!EBVn*b;sLT@stBJ@AJ~O7O zQoN~YaI_jTHqPiLjO;Fi$?A1bN*hT0Hyxwro?kHD=u?SG01{*Rm%U{JZ?Ur&ZxN3p ze-OnJTzd?yMLs^t2(j#5_-THNx?=4AAcB;M`m~ftx)#7+ZCX4$kZ&LFoK9t%X zSsb5hXFhU?i$`aN&v>N0L0p2oVoeqv@!7uOu7nN0-`9GlKJ!~iODHb^6twpLEX7ZK zKMc6UpPit_Z|)OdRYmao$r{$kPCSPtbv*L&^?VS{u;i81)g@kt4S#gN-I`}>JXlOS zx3(&8$kFfGt5JDue%H-A`(P8EuoUE1L8woy*6Q^^mQsNC*hfhCspWcOw`zDicRZ5t zc}D1aX9A=J#6E_q8IH#K`jK)+o16$jKHIH7+hI@q~wkguM5_bzVN-)SQpIs*OxNiVP)t#m!x%JA$53Wvu9VC zu5dtcE|%ji@+bjAl~a3#weT7xN`8Y;rTFW^+2+7~Fvg|@!Pt;v6G5z+jhmNXvMZFwpB?gwr#s&+qP|; z^?u*kyX|w&-tGRmKW=Ml&DmGx7&CKdc8uPi{yQZ_)Fq8S#(?$cATzWWJay9ZX7`|P zdHKp2v-IzB5M=t(aT{ zERohvfht?VT&I2^Iuw?mQZxJO?VYZ!&x8ctv6N~EJvncY*?5wR3xXd%7JwTwMA*-o zy1HQOgu~qPz-XwsIq*?b?Z(ztNDgd%(hQU{EDm+J8$#9qyCSbat zUQ&%GoTEENnUK(djg1~tmE!HB@W7$#xEy%s08Kj#|0aS&6ajcFWgaYGFQXh zcAng1r>A#mqkaFLV5TTgPYz&o9y*(RO}0QmD+Nj@mg%0I>F){UW61Rc9RmhBl??cD z7I5#xN^D|8tHxg0_X`9+9~d}CeK4~pQ)A8Ubvqq8aJbRt(%zLT{8r70Qz3){eB_L-&@M$wF&WN&; zVHB=f#cXa~x1Y}oR!ciOK)}0mrUh8bP;R%YWLKAPR+gq7h5|Ed|En6093`ZEd^RSw z#|L;RDJdv&$iEEQ2$lqYdCj9YydI&TLv1(O5SzZ;17pCh&U4~Qjv=REYL?!R_k}vs zXITrtSx_ z)!kc5N!GH5!FO+;hux0|$X((o1xewpDtZ8oU(SYqce3~?aB5e|CTnXmh;Dm5=@O09 z7xzzP{i+=MLFMsof4?_06VHgw0wKde5j$rB=u@}ML}S@Myy&)F?|>Y9Noc{KU8+dO zLTx2s#sLhktn)F2XjJNTTOU}$;ec^)i(AFwktx)epRly7H8i{RV4;9rw|ZWLtdKZ` z7k<`@s#mYo09It;$gWrB?z&{@LJ(EiqO^W1#_ z$tzA_Y((%+a7iuL_zB2Tu9e;0Y-(g@?}Vz9R4WbvUZHl?I)Nb;FPiw{LGp!mPIs=S zrNym<;^*+7awO+b?r0DeX>xT~Fje{0z#*5dFL0H0#A+)q{Ui7nq(x75%wv}~ui9vw z1g|!8M*Np!LW1fJg_5?X-TAnOA*%hu#d0e9?tC+H*m(Kz5NqJzyz7JdqyeWkgJ7bG`b7r ze}jXOubG+cn`8P>w^*Tv`~(dbe0+LX>$W9;xX48UgEPCnPA8b(GoFmQ|K^lKAQbMW zho}v5*<%lrOs7|*8K4`of0%W4d<;Yv>6vGZiupOcIa6!rizL3_3>XG(hr-(R|1Cg| zizY@1D{QZG3yc}w?37eIyhc#@7>w?VkBo$v-Ddrzx-YW*}cO z>94<^USOxKwRHy1f|jffC%en{;}qZ?ASxWX06ZLns0%Swka`}qZ!Dt!!u}9CTqy00 z#EyKPLxJKx{EPM~f;oiIZ^YkML`-<h9c(KCGsgi{BmK~5+^U(2@q|lDUh~B; zsgFu5B5K4rwYH80A^$YHy{rW=EOKYJaDI`oHrU=tt6t!z19jx>N5}5#9sq_a=R#{` zHa)$9x2U{a*3+u83JC$JFqs4-7=Z*2X^#jUj0M8BK&Q!u5~(D*Ge5ta_r~IC-}34h zOuxhgMyPg-ZBDg}S!_c)>4{*amA{DguPO1<-{a}&<)s1|lQ6aLU!Q#L7j-f?w?GJ? zxhwkNYDLdM%o-b^huBQmRS45fU=Z$ET9@kvRLxN@Km{i~j01rnB)2MyIj54g)8G8$ zSk{*%y3v_!QI$A_q+GrF;uOvI-L>s~2;(Jfi&13}S*Q>pm9##>ck%G#1kZF#&XX&$ zCt{J4X>x=crZV%snU*-vqQ=LYj}Iw^fLA~qQ({n;c>m@LR*EWx#P{RJ{Ol?&7cYdV zLN@cAi_;y@S%JDNYZ~Pt=r2Gdqz99NytrqM<4HG*Z~cbt>BOEC5di_H&bz-oTT;90 zwzRbhda3IJamC2OKzn_zernm+R3;|U!fYoeC(EY5?e84sEQeymZtquAS7+~VTSdr) z^ia1s9Wg9>qflGmarT0=g>I1SAb;IO@Se2UJVDo{ou-_QyqttY4nUS<(36X2{L zoXOk_H9yXV{Qx|iTAX!}DhutI46D^M_&()^nj}yr?Z#;lp{XNmblnt|2a1FUji4)N z0d9<8zjt3BUIy_D8{)1n)*HPTgAr=uIv0uiu)nnf@Z*_lFSCAzk63_%6K!>Plv8O|SQE%4amSCM(jbH?JCA}@ z)>>Y?0%NQDH>!7U_Vyd1{d=AEBZmQDO7z8a+oKERot@rmuBM&89^kTaWtMW2Nkm4w zC>gS8br7Ad%$J2)4 zVz)y{v<8s!MG_%hrK!Vnyq;%e;6L!Do}~Ee;GpJi|I$9HxrY=xR<6rEyE-jpN666I z-^T=BC9Vs%BKY%n0zJxs*iu7vW>-EhX=w>0lMHj0oAllv7tSBAh)lfU>j6M{4k*D) z_lb)S0F^9U?ic_|(8S>Yy^b2>V7wx}0JjAStej*ySu(B#I z^VvN<7NJ8#g0(R>Z*e)}V1`;>nAlr=z&m2xUwi-1R%8%evhQeKc9c1d#tXKw zxiZ3{FDlVM#HnL@z#cSn-Z{lHF=?g_o=MadBQ? zY`FsiE;JdKI`9MtqXmqD$&K3^@|DC1c(2<}BuB&%wUgLY^04@t`RLS1cyqOTTYpqP z&1|Ggd(~$=cfX?!ElEj4kX8OoqQZ_&NL*ThT~&Ueg*J0y1ZxCn=?akx;j2;i4fE_h zpmiA2@E;xKb_QI1W&}s>{dzYuGr985?un_eW(ubUz&zwwa7^jmFdFO#dg^kM#b*el z!$)j8m@II)8M&MCmzT$Cqj;U(YoUN8{aEM%72ZR1jPFD>iDO`e^ku4((psypgT-N4 zFj-xWCL_qRC0DTv^E9xhIzI`HOi|$|5?w1J5q-u~vuKs$e!t=r+Xzy*-@u%e!3C>( zox3Q0#3+GJXBQ304!|~ zgonC1mT4=;H7<6WIiP!$_pkTxY*2q7;Fybx%k8kWBMumguU{=hb5 zDMXxvPOmAuA>WkYBH@+$SC>0~aA@Jc{euG>+*CC1WmXmrT1*&?QQ-DSPn@5xe-W40 zBR;;{G|TjDe}BK2MGn?v#z^p7PC>z6UE=ZeCU6CexEC=yDVK+D=0sc;={nl#)mr7% zamn!7Xpgwg_~^jEW(_5KEr3;ZWk27qXLEi1Zq4;h`yEoQRN=*uG|%nLP8LPQY9imi zs6iCe&ZLoTFkYBJNIyruW|wF^R91ZHj#Nh~r{ozulf{+a%VqvPkSTsIDKGSr$l;Sp zQNbZ?90KDH!8;?H%5ol)sEF+U7|7k@*Mymb)s%C@>6>PS7)zB4kz+AnY;>^{+eJ=p z^)9YR-;);u$eBOC1NBi4$2*|(5;8a#b{rfJZzRmp^Bx!)O9S-)X(*m45jR1UJsc|+ z;y!+l6d8qt085b01~eaBLx@CN`sjsp&7v|x03FTUwN=lE&_$ZS@X?ot#br~d^(qIGF#2vCcnL?UaUiVp*lW zk-N!1Lo!Rea33MRm&eMKhg+j|cRLx_`a@ZnWXdd;N>oLavoE8lh@u90p$ZdO82S-b-9Cvyrn09(c~60BlfoAzX*BNo`b7*RZgG)w2Q?lDb|bds zX{2(CEHLClN+pW2zjVY9{ijpEaA;t?D-%cG*E8(($@)rOOR~ukQ&C)ZNbA)T;Lz5_ zNAT)eKugK%bbJ%IQ~YDYspI!&^JMaol~9td7hHIIjIYvgVlg`qH+Y_LLI|eA)>aEE zyTCj%O-n`mj9ke%hE%h~oO=Ef7+bDUoz`T%CO}DNR5r%uMX6EKqdLn01T+c6QPSV4 zF_+Gm?RHWdSerLFjy(g{t{3nz*f#c(Jj(KhMpKFz<- zk^^Dk-sbQ&)f4U49~ih6cPLG<>&YKVGI<*7dx1kTsE9i3p%x z7u^5E$&}LKTY(XS)8uKxAZ<%Y8l-Og<)`E8lK>z$ z!y|Lm%ui=D429+;oCVbKWd7S`swXD}t-#>OcidHJyY^>n~2OY7G;}5j?U)Ma>@m~<5zRh zwEU5MzZp8MM-JmdM@S8r5Px@N$A-gsC7YHgdM*+K4-*!rZ`j}zuXG;WPv5}aNQP#((*sr6`8Gu9sZTB*(R+0y z|171@VbKuI1wiWef=f_e)7FMtC048XUX!=GTNnVus{CfC#@pV8M94#z7X>N>O>aZ7 zW!hG+pCQ}hXxWlng)eJn)?IkLF+;mJt@Z)%B^K?uWu&7km}JNmhQSeW?(&=1T3dtP z3a=&6VQub}Q~D(?ETp1_fG|}yTsY}?~;jsg>mB!N2!WQmb z>@{01qyfPn+uA%S&CUsgQ1-FTF3wJo1B`4$?&D993tglyp(r+bMaLl6H!QG`_ zyvPnaQN#pKXs~GiV)+AK=`sv1F#^in(@cy=cD8?5>-f-i3ylnf(USnEe)Rw+aBQzs zh&TW@NS2YZIxF|4rS_%jlC@~+HdPqUO|jY`!Y}4FjZ~g!igL{axWOABSk;py;QMLh zbl7CUYC7Y+7S_vPZw)Mgs3lb&CtRqVyImVd+5^ZW#O|1V>$p9 ze|J9xxlTvCi4Ha&gMJrN1>&nDe`Z-#D4IV{G~S8(=4VVRd`{7S6EGsq%^xLEr1sRQ zWphiQ?%%${+#|>jlRlxf$Y8P#5@G`D5|ZK<`9+uGCsaR; zQ?8KTcp<;c_X@gPi8C(Z8SlkDfa719$}kuzi304!{jDIO6bDr@&Y0`z5dTn3uv@4Y|DTb(g+!`(zI_)TER&1d(9^wJd)fEgvMqt($X1royq z5X0OuifPC`6~$G$=FGT4`!tmuYXZhOrmHa=7OL7NlX-{ijfzS$M#x$N1=EyGr}IN7 zQ51?SlV)m%fiEfub<)OiC~CtT8XioX!Nh6rn%-H|n^PVRrwMw>xm8_O_MwqgChVum zg>GPMXz&(h-NQUTGAgjq5W+q@B2afh+~p<#NEgIHSz#?V=h7x}@GSG)Rs$ZK!d8fj zjE#pOCFQ~}QCj%$R%_v_CF-PJF{uM$TjR08*OO@_T1aaa7B*IWMZDG`%QT6RlK4dApP* zc6;XiK#R-_#+koOb1F>)FG^6HkA&j;qaj3VnI@Ob=?w3r>6GlC6vDtzsd6Yb};v}Mi`S#DV?q5URKcuuy4+afnmK>#%0u5o)O6c*U=sU188|<&)3X{i0;VUu4eg4^xQ5ku`U`;!%oRU z7d2IVOKi=w(zTPsXoXL{+{W!s8;6Y%%>|K@59vY;wKJ5qAPkhYh5-}PNMy_wj>5+F z$F41!7B*df&8q~%`Y=$xV8#M4u35l>d4i3c$g*dT!u-n3hUz9^XC$F(mOri+i zW)J{5+_DHoFodP#0tIVBAVk?~iHl%c`rT<-27qTl7I(#uR|2s5jex#jRz)}CRnDLmW!)IP3Wok7Y-S(n`eb&Y}9 zZB!t_1J0IHO7A2mlWDETp+Oj2g&5{y(_!+WE-SpT>SU0SXsJKLFsdrj&^QrGVXu>z99OFviU4HKb49_{j6>jA2pNrbLW#mfsH=-ey`0kn&!37!6Y0SX?x*ZYz0zt`D6OO5O+@S6hHPSAfI?v0DTplf>%VG-d>YynQrjwXgS z|03;-ED_<@nTeT*|3&ffF{*jkn=mRFn*DQdG_iFiW&vJQVN@}3vU71XHgN(Lk+8FM z{^!I(%>A!x63oOL|0Y<8nK}QV1Oynx-JK;>oeiB$fF&hW*@@ZzRYFpgijB+Nn zX3ploN?fe}RQr$4b`U_S^W>PLGuJAE7iVI!LrWqkdH5WjOz=rT*Tnt7%s* zA*{RN15EE{dk5aEpWhuF>emHwtUK}K4_}62k54_Le6ncHEt&Cke;I|bG_(*QQITHf zhEd0GOQyj!JR_rIAEEJ|hkyqVzGqTj3Lryo)j513YrhNN%Ly%}>}*f0rx}&g+A3-> zOz+%;w_|Z6Uo~S9q-=0m^gLocIMEw+~Emvaw%&>4 zwQjTO^h`@7H^7n(c3aze|IjbmAg=3bDU!tkvm@Z%~K2Mqx8rYdAnwX=M$57t5T4;A17rF1*1vJgip79%_miquMaHP?EfAIjDuk)JV zsruxBd|g+P-~;#PVcm!;iev_&vs{3lhqxJH(d(ZPvA+Pyk%(aGVD4bIl1~gOi8!MA z_LqaCGZ4;6pTy*iO%Vo|-hxOzTTT-GrW{rXJg0GM7NaIru>o}GXhTJv8^y#MyA*o7 zPJd~Yg$ZW`f_VFd8y>V|z2UQ0ohsqp_2W4vffg6pR8oFPSq*2w@EEPluD*LGsc`^HxQ-3OIfI#9R=jBu& zL}ns>$Y-cG%rjv)?rF0s(%}$4yjGJXwf@JC#R(qtW_|-c?9kSaETK68b!yXKhbdU| zy3st7EQX4013aS$QLa=560Tp4V1C?SlzHYY9+^@bh=1Qrtz4@$XipapK>uAi!Q#YO zUdA*jx4yJN+Pt&0{&4a%GjoWc%_LrXssjEnh9+^3Ire1TrpGVPKewI8i~D{WpQLI~ zNKi56V}UJZk0oDCu|FQ_nts4dG-8eT{i@&e=@wyW=%)q7^ygRToRXe%BqUm@5Wi+c zmx4mYK3^46We3#6K;SHRUQf5h9+x_d0#SvVoa zH>JlC5upyr3rI09H9s;>HS+J9`2oRWlqL&5%`{g}@qbQw#BEC=uL#a92^BUa(HyY0 zT8he)-3o04Bv4&F9JWs`r+W^IKbesX!>C+W(pwD>OBQkGS;B~z_a!im+mOO_vUGzu zRZUC$_l$t`zr5;%U7XGB9H~^DEnH1(iAAgpZ2@++#6KJzP0Z}5i5X>0JlyOY0ZvrH z#?FSo-=aXC;tVYR`2`{mVgX_d;s{~~;spGff;fXzfe?de0BJ`M0Fbf=F$7YEK^fALO5BTH3h8%70U7B)6U2@6LjAPZ$-Vg{1`6YF4Q<7WFmSx2GH znk_yjnm2Ns?>3QKy}JdPCWI6RY(nE6c9Xw1)1z>V8G(&8wGx2%<&D3%m}@R!*wO+F z8`G;T@<#=a%P>Qos!QV7Zh{*(mmo$;{#|KXMuz+Ps6w4vy<2Z&IwjV%W)%b6B?i{f z%ESmcwQUT;#KKM}eqB1N?cUFxtC=L&uL#;r4Cm?qS#H}!AimR1Xu%?^xY(tk zPh{enyg%5?3HhjSL~pP=$59>x@`PiJiBe)1McaSp0mR7aI&pDncb*0@wu8G@vyO863}%XOLJvGZqTm ziP<$0Arhcq!=^HzJRFwFKT1`OIQEcu=J$z)G|uY+-ihc#ZTak50nIclUke*7X#5PZ z<19i+Kc@g_V-F}U;dSAJg(G#1XcUq9wYmd!o#?S_d{3X0N`#o2JvBHHVXrLCh8HpA z1WcpkXaTn|x?Fi5XrH8oKek^&@o;Fo**8>}Dbv#%);W}xYiwyKu4xni8tHjF8Au&U z*RTRlhBPLQZqW*w@SpTMG4uQ*@&G@BtZ*YT{hy>^2xE|_kHI6bto#{SENd4s;2?$C2NBb}pcXMyj80>rxd)c{)=NI1bzV7rD4yAo!3 zM{-3y^+9~qSXXKs=9nsVbg(eUNwE2t2K7wV0djQs`8`jNsi9C*qHw;w{Uj`IBuEA< zZoQ;Jkd9dQedymW$Q*H}wQpxh{y4qF8D+G&zP4X6beLeg z;nwtU&pHKAMpmS|yj*DS<<^s3-#hUG)z<$B!fMe zspff2VyniJjDHVsTu1`=z2d~u5C97e*JR|w-%*6DNR)SFF)=5|)I?ykU|>y2ZejSH z97R`qUgbXNBOz=`BOx9Z#RDpMNXkScgz;C<(C9K4#z{$eIcM;DdSO(9@8<0xtNo92HMqz^;5voYST>oLR5QTURx-*da%WpOsckHFYbhv6_ zYXmQVs^DrUAr}0O5tkfe2p)lI1{n;E^$f#V!v#p5TursUYSdX*)D3hxRhl?wkST#TpDhICaa&4&hhXME<1sWJ#RmcP5>wX)lttAP8=F1A)dVsT(dn^Likq0~j9;@qXD*M{NQG#_5) zeik`9YEDtECFt&0eDI$1Fs|R@9&Kv0gr$5G%T59XfCCP2Lkc zcb|^&h(i|I$M2nmj4>ZL6E5oK3};Obh*;VcFFLPnXKgm#{gB*NYsp;#H#Vnud*rL+ zIsc-z4>sk{p;(nInK#qIjkICeH*qG#r0aPQ-S@Iw8~}Qr6)ty)6=RkgT@Mk% ztt-d7n4S0iDT61?%FKMRKWG2^tmEEyChXk5d9IUYELCL06Y-AWg2TDne@QsH5nDtU zQT{r8PZ?_LicaOADhuq=lJKsN;z^NQK!0d0nIiXQIB{7#3>t@_6rA5`Zv9;80yr@1pMZm=t z*sj85_Y>8lFVor>PwbLexZOOh$9!zj4%jxFQ*th$2`l#aDjp&FEU;F(>*u~8yoSmpfN}CPN4<{-W{(&yyrUDoBZD|&7 zeinYyr7!=u&eM2{fhc6a8ry~ zP+kE8!|D>-@!4e?CH@)FqG;{g^wCLj}<|{~+GnLA4-yFe1NGi=Uk~ zmJ*-P+1}ZPs54=3G*Ax-$9^kh-Y-bO_0bR=U1G*Xfx6Y4|B?bDY_D_w#`=#3s~S~199QAYtkpnjupPzhtz@|+(iU9V7M zA)MuVgZWAR-f;ZmMr=!@mY;egni@=cWdAJ+#MTR>X_5`_-0iYd~9t3lJxK0&%+d zPa`@IO*;XThvDealf8dprk@ezImjwG8=ysuLVv&?CAj=P!@7X>_TbIn#;z-N%bRJJ z?)nPoLc=x4DL+GHo`{Ijy)19ATEv|LuTdAl(`~5I5{%2VE}k?RUJWII7I{?ftbm_Z zp)vZ zDN`m9VI_7sWtu9tZ?})5%ZJaDHG<;MkBMCQ)Wy%6)4hX* z&xdL(ws^r`-obT`w0K4-a<5AlE5^J{wnd76%uX#gY29 zRT@iQ?-*azRo$H(&+Z?F5B+DcDOXSBX2_n`%c1F!ibDfO2lUquqUBAU&+jM5bdI{b z?e=^lG{u1x#j3nRqP!;!-R|o@Gg7X;tUc6nZ>cIuI;jVP!x1cJS+V z@#huyPW5CejPQJ)dVT46t*80eKDjg#f9;L+iEw%f#QH!N7et$x;#_sZxCjh=BoN}w z-kO|fzB|9j@ZkO0m^5krHhqy}$LrM5ws;iqGxUv8hP}Umr|<}6?WM=nwmP%e>S%p6 zyw26WEOSR&@64%9$;W+C;;MY;K}~{}enx@0VGhz}sr#b3*=D~f-@9!wmd_c_wQ*$S z&ps0LiT`R7^y~FA@{N;G`Wsz-MILio^VM_{_$Ai5PH=Nls^XFxZCQEUROaZ;N80*_ zr3Ni>qi5ue#=!;W-C*5m)ZSZ`z^@@yTybwm^YXK%Lu=XICK0R1%qA!c*+7o5tmjuC zoDs4G+6mQvt3k7{{$v0A4{M+0AVxtxZzU(A#&@!yd&9=A=R0 zw};8@A|k~yAh@f&CK1#X!y;v;{CxF^zQHpqfJm~`vF94i!TM%rDlrYo>!RSC-IU1W z8xu=Unjx$I6;j)~gBC5$!Io=DQ;L~pR;o_Y>iepInE%0&v7y-5GWFv_Y5mRX@D>QC zem+X)F^VJ;hu`~ca|vB^Tund_R@#pCzwKUDrvIvL|IdBJ&c?>Y@xLvz%s|sD3nw$n z|EXc0d&B;kUugVlefspNCrbs?F@mS2%2CiI#-X4Q86y_Fa;WMJkt9^=tiKG zw?JStgvnMKU=#+Jum}@OYvd`OEn-%iXQu z;62Lln&N)ibeg)_d~0`;0%InPfK)cWyVrUNF14wzA~A|2v9Z*fS?_wwwW<%NSwaoZ zSZvIU>AibNSF$0g``KONJrjW;utt}c78;iKD>7NX)m~3-gpQo4{>_l@rHrjj)SZuo3}<{0kq^_e)`)NY<;df=%wpTxpQZ^I<87S~ z_WAYQX$(!X;gfbg7MSFK=`s;b1`9Y!5@P(AsiQh zEPX3c$3y~$b{RaIDn_X!#!1j*=leIpKcgfQX z$sHT2i{7xCupr@qxj|p>pc4s7^DJ4g2xX7ewiU)R`aL(nOQav>^Th#quKNC7eD|=D z$j$H&NV)PAo)+{YCi9;|(d;0WlqPWI8fl#d?(?-*r`2LRE834YtJM38?%A!a^F3v6 zz0X+CzaOz*m7WB@k>ozS-kfsH{Qh{qKV4FSp@s=TkfQj*yk9{yu{L}WUGz6YE<8@{ zS^fL3-~E-%yJ5`>hr4k6VZ@04v-p2Yb`w!eP4~f%98C3oc0ZDXp+1{|x?Tyc2L7w& z^A;%9YiH!w3Grqz+^3Z`bygvq13gBBzDm<^5vksjR~fq9tjY_osthds?vzsI`vwha zfyJ#`xst}$2F>sK$(Ie9>RTQ})((($>Hgor`z(A2S>npOCNjzt(_{z0TuwSAnrwON z@z((R=4b53+~WYwv*b7a zVsiml0TkSP4Ks`XXTSL3qJVQzyizkAdx_N3w*_?g| z!tU(%N@qo%l8@8BQiOf9BWUfwAViJ+V@hHOWk73>nwgrLoIRSwIuOcCrj>RrlNCUP zCGrH7;9df&$Rr#w2*Iyl@2QYQ5thjOAjiU!n&#@;jrJg?ZS(&Upd( zJT?wV{Znc93!iC?k?rN_Wz)Kf&T56_j>2j`86L#MzvD$`2reva_NxrB^7pHj%X)F8 z(%Fw@@06827PprbK>O@e*=Ai;r_U(qnKs9X)&mE7Y! z*y79Xo15q7Q#Mz>CFdk*r|~i0>D{F>+FVDPW}koG4D=~~FV!HB=hYG0gH1x@%qnjT zzdUUqN76dK?3&rx63E}ttyERXMz(owZ7(Wqha%VtKv|r0%wg>6UD`Io1LhTv5sjhd zYlEz^q_)sLy-wG|s2bRiO}{o^Y5QQilQARyF1m)rBZ9LKbNLFDGN*6q^paK%^+2Zl zG*0U^$1eH$lGd?KX!VP$g1^=QJQaJaH5Jm#*;9ctrFAvcY?^3PeR0jKF{B#6^*pmZQjh= z8(Rd+`GA0KD+$q-^BhbazlLA2Q&Z^$MOO_J9!>MknTr{voBMryo8@*0BR;B=sfrow zzJt*&1+XLs>J3`WT= zN!gN_EfH^P#&IvHB(J3UrSsTJg4kCrtRPubH5W0O2zd-_0tRW=-@?b{Qq@9op@Uzc z=q;nv%cAE7?^t5Oq?ADtK57VtO5FHpjhhG?xK**BwKS%aa&Y}>q zWb2)9MSOSsrv!KdR-EuWhrX>YQPa_o4S%31WVEB*Ux-(Mc{AD!z+02F==RAoR9G(U z6ADb^I~Cnsj#Qn#)Wn5xiZORM@*KVuB*{)9y##%Ues_(DUw^tEY_Hr?NLdzwh5Xg_ z5jn}oAfQ?iABI)tCFbsLAaLe1ccO23$N1zi`G@VTT^oPn&)-5vij>nNN-68UzO3yl zOPgdX{K&2a$X);pJ|aCwF*4%llT7okiDr)cv;?Oj$}gEI4|${8dQazx4M(oeDjvzi zshOaGK2tV>T%LED7Gsjlhbq%nq0_#-(*B>2i|hRGF0jabW_NhC#`M-dw-d(J7>TU8 zUUxbz>atDQpGOuqE>0g=TaK&znbW3j@Ej?mLloPG7CM9oMKMQJhXbzh&@NAB;wx9m z^c0BXT6AK`!9sBsNTscs`S!=HZi&%uHefem5^TrMJv4vID4b4g-DDO=Zxzr<) zLl`E|y-X`DPoF1;lvMjVzSHvY-$h;4qkYUB!s4aht3SA9bze4wD}NE!kM13n8t48F zG;qbM0oa6QFCm}*-g!*~{8&4I#;k%0?_zscqJAXgY%jfBC-*HC ztaUvk=YZfqu1>wBD#P;Kjh!*5ixiA7-iH*#WI||y9w_cKYU!-t)50&LxM8;WMl@@f zBcd)f$thpml3Ijl(dB?gD*pe3=M(W)WijZIG zz$z)h9*!c!o4iMwqUF;iB;U*z1Z{O!#2*~dt6t!B7TdXTgolvR6?KS;&uog^iX$49 z{&sb5dW3GvOY8&nF}6#dR;}ShZ4k~V7RVSzNe$ZXCBi3=QSBIRJ9*%8_oPc2gxEB`b0fk!h zW~}xWaqC>bb@Z+mk1q@#_do_Z%`&?Xl zPG+-b7CK8$g4a-I%TZs;QCt7{Nc&rESfslcrt{Szahw^{0}m)kU^D)oJo`47^Ki}} zkh`1yEwZgd4an|NDf-B5I4yd~e-Fa;nA~0JHF2>mhsbp1b@DKh`N=U!=hHNo(*;`W z=T;K9Wfa7&mq7_BZLp44Av+JTsr9DQnYqRd8!PzK8)n`7G7^O9{l$A|a!9qoS6&`J zjBqQN;xVoCrK}ml(l9i;*m(!l<$c@5e8RDK6u6T91cZ9N-0gJ~0bd_PB1F z<^;@eh+Lwifa0O1NN~BNc6|7w$*6CW?8o|*Qw{VoAh|lk4GQBzQ~S%v6V$*i3*@k8 z%w$x3zlfDZw1;V^jTmd34M#xiQ=TFP6!!Kk$D~Js!J_K|C^aOM==$aqg7P#fm zWim1yxB@f>*pGR4xhgHCH$R2Z<`bUOL{Fcrp9To+;Dz}`DT)IEi!kd@=;mIW_w6oc z_O`JMPl1Fp2XoNp&1a6h$0s}@)!(0DTEXX$=)gI^*8FJ*(6NlSIyIY+EuovhpFl8} zu}+K}n0*l}IJf8>*~f+fyoCh@R*GSqT4R-bP{<2?uBZ35nVS`JESaWOwTbll@=fo6 zx`U9BWRl_QTs5Qt%uJrfW5=;g$FY0Iu^LBsZCP?kE%!PF#DqG*W9Kvlr$(~k1H9q` zr{aStg)!ueIInmWjyHZ4;Od;pv&tprsI0cnbW`>3QRSn>)uV z>ZV`T@ITLgyahZ$rWXv~9)Z74S)*Nm2_kjDyc^!Ka6XHIUNz2s3eR_A9T2G`ORowF zxp;QkSSK)i^$K;qfwj^fKfL*`)6SfA{w{y=)F6JMD%gVG-$ZbgBzEIoF7ngiX<^$Y zuw{%ji=;}IT~l{-IvM%xPe_?}aIpQYFR2{7wN5?hoOqZ9yei&6v>-*16>H&SV+EYS zJ1%gfkdrw~w{4EY@r*Bd;AB#VO7^J8?@YVFX!%UQ@+7+4q`lkP~`f zt4`Wq?@{Av#2)e-+9`1SBj^LGs`z}$40Spr#YkqAGD?ZrTZKD6@yna?{Lmy$FW>w zT}qq!nk+FP9w5=vZAH=)x{wyq+<58RA175yamNs?u2@a~_v4xnv4tZLB6t&6XdSbUvgeGKf1+{B= zgBO*c+tmCo0A)a$zsc``_7P+G8*a5pzHY;bb`R9%2H4N%WnNb{TvX@e{LTWe=E1d1PhbZ~{wU#RCpA>?cQ6XX|3`}iu} zR$aA^w@c=0*vGEotEy*8IlHRLcgBpecstCqJX4xsVuTxuJGZeIVsUz7aWSMfHb@%v zxZNV<2xX0+~U1!xUci0^tx%GbB%%}Im*jbyQVH-?_0UK_Djpy$P3o8B# z#;mvb-TAHZ>%1mc^#Wj%f8*N4Y4WP)=$ZfS!1sJPO)ag9CC6pwUDtvt|9n@Kqo=v` z0_s+&Zgy4mP-}I4Lr<%=peoR;HCMZut9-o=udl2l+mmVMRAzG`J(4{HzWebvsaV6}A(JtnH~RbCqAy*xS!%c2SQ!-^DZ`*?kgjB}=4 zW81F~-e1ukpFhS`;kN*#Dz7}RT&l20r7Bi_VLPBoyJnozwx8`BP+1|4cU6#w(yEtK zo%wWhbaZw|vSy73v~x|GF6_kObL+v}1H9Ghz8#L4uV&KcS&fD&dvsKlUGOTq*;Hkh;q!Uccq$vp zv#1s4WBC{1^C%JM0*(UC0;=?{psxWx0DcZs=sM8v0UreRN{Pr5dDUr4s$>j&9=VgI ziNfB3;=-{(@aBbKK5K56S5FIbZ+T%Fc%W=lRCyeZ>Wub-z6^W^_zCdefT}1Ig?i&_ z!fVjiK^-23VG#aatsfV4viivfsp^gs1>;i+4F71%j z)<}LDpdj5|y^TnnLU!OF{Z>bz_kl-&AN5ZTom7{RtAAPafYj-Ei{1+(jJPXE7>cErwd1?o!I~Ec%9WyDpTnmdYdk#)$}19!A-lC z-eU=9r<&Sv!z>AX3|dP!h4#TJiYn>Hw4W_!vnU_=i98pvaMPwxAEnaJ(9c6}q4Wd# zkY$H@Xd-gIqj=mS*3<2{dM~AyLnq;BHnq?rY#sX;hsGw_s1zyPp=C6V9;eq?Epk)o zO7$)C<2d%*P7ktF))zV)`aS&whlB-a>AQ3jJPuGFA0aB$?c|^wx`?JxGqm5Kw^h7j}Y$O}WQ*rR+7~wFQ4c#W%f&P2x5UXWA*2kU^JJf>yvQSbeIrRHbh=x-G zJlsalppP$D0c_BN$P%4OrqZbvp1KwzoKN@BA$k>lyob1dNnf+!NbmD&`1;Vrp`H5w z1Yp9UXe`a3xzt8$>2mrZp6avo9Q~P{;AU7JRGwF_Qjdr3Kx}iU0=`d&^(?f#5l<;V zL8Lb@%6R6$D8{mBY$jX8HnFWN$lhjea|3tc)&Gg`i&wVL(@@hYST`9c1k*dR73C)FGJkM#ec|3s*pjF@E; z5QjDND5CHumI5D!v8AkoeE`ol^SvTgScOXzi*ivfeBvgtMZ73}p{!PRDetJ0)Mj;; zvAKU`|ErPJYM^Qp*A<{&3qxy*972{CjL}QETXD5%H8h*-m>b-vI&*;CT ze{26U{l5>*30(>Q-IPZo;OUL<@*d2=9Y~L2CO$zwrJvE8y04!x&Q#3!H0Hu=$i-7D zV-s+6n#88E8A!8{E@pF)npq25jI^G0vG20$*!ApIcBh{1#@KeSAF(Hpo@D!xUT25d z@7O2oGmc5j1!l9G58?T|1S75F6ZmvK6KN4|Lu%)%`C2@oM|dya$KMc%!j1j5S*#NG zh#!k*#jnIS3RiNKe8sEGQ5GrJDF>BTmA8}=s$H#C7pwQH&l+roBExLMQp4SbJ%*1A zCyfSU9ZuovjK4C5Om6H}FJRn{pZ71``G$k6Lrqey;D@m;(nPy@Bb$wg8F;-|E^ZUQ zR2Q=2!ol8Q-C~JY7J5+B@UKN1o5K&VEMZqm#X`D;LTnd*pMSxBuOzd2{xKV>+|Hil zZK4uaRe<`MlB`^(euM-3n^elLW_|p5ah

    ^exJ_w!fDp&a3fbQr7pMt&D6 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

    VfSg8PU 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

    G9cF{vq=GwPpFs`}v#aADR&J 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 Date: Mon, 18 Sep 2023 10:40:36 -0500 Subject: [PATCH 124/180] feat: show in "mis fichas" courses related to a user role 3 --- client/src/components/Siderbar/Sidebar.jsx | 32 +++++++++++++------ .../components/Teacher-class/TeacherClass.jsx | 16 ++++++---- client/src/import/staticData.jsx | 3 +- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/client/src/components/Siderbar/Sidebar.jsx b/client/src/components/Siderbar/Sidebar.jsx index b1526d8d..a01cda64 100644 --- a/client/src/components/Siderbar/Sidebar.jsx +++ b/client/src/components/Siderbar/Sidebar.jsx @@ -16,6 +16,7 @@ const Siderbar = () => { const navigate = useNavigate() const [open, setOpen] = useState(true) const [dataFullName, setDataFullName] = useState(null) + const [idUsuario, setIdUsuario] = useState() useEffect(() => { const handleResize = () => { @@ -48,6 +49,8 @@ const Siderbar = () => { try { const tokenData = jwtDecode(token) const { nombres_usuario, apellidos_usuario } = tokenData.data.user + const { id_usuario } = tokenData.data.user + setIdUsuario(id_usuario) const fullName = `${nombres_usuario} ${apellidos_usuario}` setDataFullName(fullName) } catch (error) { @@ -120,14 +123,26 @@ const Siderbar = () => { )} -

  • - - - - - {open && (idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) ? 'Fichas' : 'Mis fichas')} - -
  • + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( +
  • + + + + + {open && 'Fichas'} + +
  • + )} + {idRol === Number(keysRoles[2]) && ( +
  • + + + + + {open && 'Mis fichas'} + +
  • + )} {/* {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[2])) && (
  • @@ -173,4 +188,3 @@ const Siderbar = () => { } export { Siderbar } - diff --git a/client/src/components/Teacher-class/TeacherClass.jsx b/client/src/components/Teacher-class/TeacherClass.jsx index 0934299f..780d92ff 100644 --- a/client/src/components/Teacher-class/TeacherClass.jsx +++ b/client/src/components/Teacher-class/TeacherClass.jsx @@ -12,6 +12,7 @@ import { Search } from '../Search/Search' import { Siderbar } from '../Siderbar/Sidebar' import { Pagination } from '../Utils/Pagination/Pagination' import { Card3D } from '../Utils/Card/Card' +import { keysRoles } from '../../import/staticData' export const TeacherClass = () => { const { id } = useParams() @@ -19,6 +20,7 @@ export const TeacherClass = () => { const [teacherClass, setTeacherClass] = useState([]) const [pageNumber, setPageNumber] = useState(0) const [rol, setRol] = useState('') + const idRol = Number(localStorage.getItem('idRol')) useEffect(() => { getUser(id) @@ -84,12 +86,14 @@ export const TeacherClass = () => { }) )}
  • -
    - - - Regresar - -
    + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( +
    + + + Regresar + +
    + )}
    diff --git a/client/src/import/staticData.jsx b/client/src/import/staticData.jsx index 9f3a7022..d1683f25 100644 --- a/client/src/import/staticData.jsx +++ b/client/src/import/staticData.jsx @@ -239,7 +239,7 @@ export const dataInscription = { { type: 'select', name: 'tipo_documento_inscripcion', - placeholder: 'sin seleccionar', + placeholder: 'Sin seleccionar', label: 'Tipo documento', required: true }, @@ -458,6 +458,7 @@ export const colorIcon = { '/aprov': 'text-secondary', '/instructores': 'text-rosa', '/fichas': 'text-coffee', + // '/fichas-instructor/:id': 'text-coffee', '/visitas': 'text-primary', '/config': 'text-fifth' } From 788529268e7a47b8d7fe4aae286387d1c3f6f332 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Mon, 18 Sep 2023 10:41:12 -0500 Subject: [PATCH 125/180] v2.11.0-alpha --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index 284f8c8c..ef249442 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "client", "private": true, - "version": "2.10.2-alpha", + "version": "2.11.0-alpha", "type": "module", "scripts": { "dev": "vite --open", From c61a9681880cd7189c9d8d1500ada37bd2788533 Mon Sep 17 00:00:00 2001 From: Juan Prasca Date: Mon, 18 Sep 2023 14:05:24 -0500 Subject: [PATCH 126/180] Nuevos cambios --- client/src/components/Register-detail/RegisterDetails.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index 696d4303..95b74d41 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -511,7 +511,7 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { const handleUseState = (setState, value) => setState(value) const fetchDataDocuments = async () => { - const res = await getAvalById(avalDocumentos) + const res = await getAvalById(avalDocumentos) const { data } = res.data const response = await getUserById(data[0].responsable_aval) const { nombres_usuario, apellidos_usuario } = response.data.data[0] From a4ef916ad97ec6c64f7d0d324f0841a7b9630985 Mon Sep 17 00:00:00 2001 From: Juan Prasca Date: Mon, 18 Sep 2023 19:37:13 -0500 Subject: [PATCH 127/180] Formulario Funcionando --- client/package-lock.json | 4 +-- client/src/api/httpRequest.jsx | 4 --- .../Register-detail/RegisterDetails.jsx | 16 ++++++--- .../Register-student/RegisterStudent.jsx | 21 ++++-------- client/src/components/Utils/Select/Select.jsx | 10 ------ .../src/validation/inscriptionsValidation.js | 4 +-- .../controllers/inscriptions.controllers.ts | 13 +------ .../practicalStages.controllers.ts | 4 --- .../src/interfaces/inscriptions.interfaces.ts | 1 - .../middlewares/inscriptions.middlewares.ts | 34 ++----------------- server/src/routes/practicalStages.routes.ts | 5 ++- 11 files changed, 27 insertions(+), 89 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 05b1b9d8..a9106ebf 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,12 +1,12 @@ { "name": "client", - "version": "2.10.1-alpha", + "version": "2.11.0-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "client", - "version": "2.10.1-alpha", + "version": "2.11.0-alpha", "dependencies": { "axios": "1.4.0", "classnames": "^2.3.2", diff --git a/client/src/api/httpRequest.jsx b/client/src/api/httpRequest.jsx index af98c63b..d000af15 100644 --- a/client/src/api/httpRequest.jsx +++ b/client/src/api/httpRequest.jsx @@ -172,9 +172,6 @@ export const getAvalById = async (id) => { // OBTENER USERS BY IDmm export const getUserById = async (id) => { const URL = `${baseUrl}${api}/user/${id}` -<<<<<<< HEAD - const response = await axios.get(URL) -======= try { const response = await axios.get(URL) @@ -187,7 +184,6 @@ export const getUserById = async (id) => { export const sendEmail = async (payload) => { const URL = `${baseUrl}${api}/sendEmail` const response = await axios.post(URL, payload) ->>>>>>> inscriptions return response } diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index f2f327cb..bc1de198 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -16,7 +16,7 @@ import { Button } from '../Utils/Button/Button' import { Select } from '../Utils/Select/Select' import { colorTextStatus, keysRoles } from '../../import/staticData' -import { getInscriptionById, getInscriptionDetails, getAvalById, getUserById, inscriptionDetailsUpdate, sendEmail, getTeachers } from '../../api/httpRequest' +import { getInscriptionById, getInscriptionDetails, getAvalById, getUserById, inscriptionDetailsUpdate, sendEmail, getTeachers, getModalitiesById, GetClassByNumber } from '../../api/httpRequest' import { AiOutlineFullscreen } from 'react-icons/ai' import { checkApprovementData } from '../../validation/approvementValidation' import Cookies from 'js-cookie' @@ -254,7 +254,11 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const { inscriptionData } = inscriptionStore() const [selectedApproveButton, setSelectedApproveButton] = useState(null) - const fetchInfo = async () => { + const fetchInfo = async () => { + const res = await getAvalById(avalCoordinador) + const { data } = res.data + setAvalInfo(data) + } const [dataAprendiz, setDataAprendiz] = useState([]) const [dataEmpresa, setDataEmpresa] = useState([]) const [idUser, setIdUser] = useState(0) @@ -517,8 +521,7 @@ const Coordinador = ({ idRol, avalCoordinador }) => {
) -} - + } const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { const iFrameRef = useRef(null) const [showDriveButton, setShowDriveButton] = useState(null) @@ -933,6 +936,7 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { } const RAPS = ({ idRol, avalRaps }) => { + const {id} = useParams() const formRef = useRef(null) const descriptionRef = useRef(null) @@ -1048,7 +1052,9 @@ const RAPS = ({ idRol, avalRaps }) => { throw new Error(error) } } - + + const [ficha, setFicha] = useState(0) + const [courses, setCourses] = useState([]) useEffect(() => { const fetchData = async () => { try { diff --git a/client/src/components/Register-student/RegisterStudent.jsx b/client/src/components/Register-student/RegisterStudent.jsx index f5f33bd1..48e4c320 100644 --- a/client/src/components/Register-student/RegisterStudent.jsx +++ b/client/src/components/Register-student/RegisterStudent.jsx @@ -28,7 +28,6 @@ export const RegisterStudent = () => { const [selectedFiles, setSelectedFiles] = useState(null) const [showDataEmpresa, setShowDataEmpresa] = useState(false) const [showDataAprendiz, setShowDataAprendiz] = useState(true) - const [observation, setObservation] = useState('') const formRef = useRef(null) const fileInputRef = useRef(null) @@ -55,12 +54,6 @@ export const RegisterStudent = () => { setShowDataEmpresa(section === 'empresa') setShowDataAprendiz(section === 'aprendiz') } -<<<<<<< HEAD - // eslint-disable-next-line no-unused-vars - const handleObservationChange = (event) => { - setObservation(event.target.value) - } -======= const [selectedValues, setSelectedValues] = useState({ tipo_documento_inscripcion: '', @@ -81,7 +74,6 @@ export const RegisterStudent = () => { })) } ->>>>>>> inscriptions // Validación de campos y capturación de los valores const handleSubmit = async (e) => { e.preventDefault() @@ -94,14 +86,14 @@ export const RegisterStudent = () => { formValues.apoyo_sostenimiento_inscripcion = selectedValues.apoyo_sostenimiento_inscripcion formValues.arl = selectedValues.arl - console.log(formValues) - try { + const observation = formValues.observaciones const teacher = formValues.nombre_instructor_lider_inscripcion const classNumber = formValues.id_ficha_inscripcion const archivo = formValues.link_documentos.name - formValues.fecha_creacion_inscripcion = Date.now() + + formValues.fecha_creacion = Date.now() formValues.observaciones = observation formValues.link_documentos = archivo // const fileInput = document.getElementById('file-input'); @@ -111,7 +103,6 @@ export const RegisterStudent = () => { const response = res.data.data[0].id_usuario formValues.id_instructor_lider_inscripcion = response } - console.log(formValues) // if (archivo) { // try { @@ -162,7 +153,9 @@ export const RegisterStudent = () => { // validar que el numero de documento sea valido // enviar los datos al backend const responsable_inscripcion = `${decoded.data.user.nombres_usuario} ${decoded.data.user.apellidos_usuario}` - const form = { ...formValues, responsable_inscripcion } + const estado_general_inscripcion = 'Pendiente' + + const form = {...formValues, responsable_inscripcion, estado_general_inscripcion } const dataToSend = Array(form) const data = await sendDataInscription(dataToSend) // mostramos una alerta de exito @@ -324,7 +317,7 @@ export const RegisterStudent = () => { /> ) : item.type === 'textarea' ? (
- +
) : ( diff --git a/client/src/components/Utils/Select/Select.jsx b/client/src/components/Utils/Select/Select.jsx index c860964b..abf18b5b 100644 --- a/client/src/components/Utils/Select/Select.jsx +++ b/client/src/components/Utils/Select/Select.jsx @@ -34,17 +34,7 @@ export const Select = ({ options, placeholder, placeholderSearch, hoverColor, ho className={`px-1.5 py-1 my-1 text-sm ${hoverColor} ${hoverTextColor} rounded-md cursor-pointer select-none ${option.value.toLowerCase() === selected.toLowerCase() && selectedColor} ${option.value.toLowerCase().startsWith(inputValue) ? 'block' : 'hidden'}`} -<<<<<<< HEAD - onClick={() => { - if (option.value.toLowerCase() !== selected.toLowerCase()) { - setSelected(option.value) - setOpen(false) - console.log(option.value) - } - }} -======= onClick={() => handleSelectOption(option)} ->>>>>>> inscriptions > {option.value} diff --git a/client/src/validation/inscriptionsValidation.js b/client/src/validation/inscriptionsValidation.js index c04fd659..c6b60716 100644 --- a/client/src/validation/inscriptionsValidation.js +++ b/client/src/validation/inscriptionsValidation.js @@ -18,7 +18,7 @@ export const inscriptionValidation = Joi.object({ id_instructor_lider_inscripcion: Joi.number().required().min(1), apoyo_sostenimiento_inscripcion: Joi.string().required().min(2).max(50), nit_empresa_inscripcion: Joi.number(), - nombre_empresa_inscripción: Joi.string().min(3).max(100).allow(null), + nombre_empresa_inscripcion: Joi.string().required(), direccion_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), id_empresa_inscripcion: Joi.number().min(1).allow(null), nombre_jefe_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), @@ -28,6 +28,6 @@ export const inscriptionValidation = Joi.object({ arl: Joi.string().min(2).max(20).allow(null), link_documentos: Joi.string().required().min(5).max(200), observaciones: Joi.string().required().min(1).max(200), - fecha_creacion_inscripcion: Joi.date().required(), + fecha_creacion: Joi.date().required(), id_usuario_responsable_inscripcion: Joi.number().required().min(1) }) diff --git a/server/src/controllers/inscriptions.controllers.ts b/server/src/controllers/inscriptions.controllers.ts index 48d1304c..45077143 100644 --- a/server/src/controllers/inscriptions.controllers.ts +++ b/server/src/controllers/inscriptions.controllers.ts @@ -110,20 +110,11 @@ export const getInscriptionById: RequestHandler<{ id: string }, Response, inscri */ export const createInscriptions: RequestHandler<{}, Response, inscriptionData> = async (req: Request, res: Response): Promise => { const inscriptions = req.body as inscriptionData[] - console.log('paso 1') try { let i = 0 for (const inscription of inscriptions) { -<<<<<<< HEAD const { nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion } = inscription - console.log('paso 2') - const [result] = await connection.query( - 'INSERT INTO inscripciones (nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', - [nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion] - ) -======= - const { nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, municipio_empresa, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion } = inscription - const [result] = await connection.query('INSERT INTO inscripciones (nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, municipio_empresa, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [ + const [result] = await connection.query('INSERT INTO inscripciones (nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [ nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, @@ -142,7 +133,6 @@ export const createInscriptions: RequestHandler<{}, Response, inscriptionData> = nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, - municipio_empresa, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, @@ -152,7 +142,6 @@ export const createInscriptions: RequestHandler<{}, Response, inscriptionData> = observaciones, responsable_inscripcion ]) ->>>>>>> inscriptions if ((result as RowDataPacket[]).length === 0) throw new DbErrorNotFound(`No se pudo crear la inscripcion número ${i}.`, errorCodes.ERROR_CREATE_STUDENT) i += 1 } diff --git a/server/src/controllers/practicalStages.controllers.ts b/server/src/controllers/practicalStages.controllers.ts index 7174c429..5a065929 100644 --- a/server/src/controllers/practicalStages.controllers.ts +++ b/server/src/controllers/practicalStages.controllers.ts @@ -19,13 +19,9 @@ export const getPracticalStageById: RequestHandler<{ id: string }, Response, Pra const { id } = params const idNumber = Number(id) try { -<<<<<<< HEAD - const [practicalStage] = await connection.query('SELECT * FROM modalidades WHERE id_modalidad = ?', [idNumber]) -======= console.log('a') const [practicalStage] = await connection.query('SELECT * FROM modalidades WHERE id_modalidad = ?', [idNumber]) console.log(practicalStage) ->>>>>>> inscriptions return res.status(httpStatus.OK).json({ data: practicalStage }) } catch (error) { console.log(error) diff --git a/server/src/interfaces/inscriptions.interfaces.ts b/server/src/interfaces/inscriptions.interfaces.ts index dc4a7915..56636890 100644 --- a/server/src/interfaces/inscriptions.interfaces.ts +++ b/server/src/interfaces/inscriptions.interfaces.ts @@ -17,7 +17,6 @@ export interface inscriptionData { nit_empresa_inscripcion?: number nombre_empresa_inscripcion?: string direccion_empresa_inscripcion?: string - municipio_empresa?: string nombre_jefe_empresa_inscripcion?: string cargo_jefe_empresa_inscripcion?: string telefono_jefe_empresa_inscripcion?: number diff --git a/server/src/middlewares/inscriptions.middlewares.ts b/server/src/middlewares/inscriptions.middlewares.ts index bf86dc29..3feb7b2d 100644 --- a/server/src/middlewares/inscriptions.middlewares.ts +++ b/server/src/middlewares/inscriptions.middlewares.ts @@ -19,39 +19,10 @@ export const checkInscriptionData: RequestHandler<{}, Response, inscriptionData> try { let inscriptionLength = 0 for (const inscription of inscriptions) { - const { nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, municipio_empresa, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion } = inscription + const { nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion } = inscription const { error } = inscriptionSchema.validate({ -<<<<<<< HEAD - nombre_inscripcion, - apellido_inscripcion, - tipo_documento_inscripcion, - documento_inscripcion: numberParsed, - email_inscripcion, - inscripcion_celular: phoneStudentParsed, - etapa_actual_inscripcion, - modalidad_inscripcion, - nombre_programa_inscripcion, - nivel_formacion_inscripcion, - numero_ficha_inscripcion: fichaNumber, - fecha_fin_lectiva_inscripcion, - nombre_instructor_lider_inscripcion, - email_instructor_lider_inscripcion, - apoyo_sostenimiento_inscripcion, - nit_empresa_inscripcion: nitEmpresaNumber, - nombre_empresa_inscripcion, - direccion_empresa_inscripcion, - nombre_jefe_empresa_inscripcion, - cargo_jefe_empresa_inscripcion, - telefono_jefe_empresa_inscripcion: phoneBossParsed, - email_jefe_empresa_inscripcion, - arl, - link_documentos, - observaciones, - responsable_inscripcion -======= - nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, municipio_empresa, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion ->>>>>>> inscriptions + nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion }) console.log(error) if (error !== undefined) throw new DataNotValid(`Los datos ingresados del id ${inscriptionLength} no son válidos, verifícalos.`) @@ -166,7 +137,6 @@ export const readExcelFile = async (req: Request, res: Response, next: NextFunct cargo_jefe_empresa_inscripcion: item['Cargo del Contacto en la Empresa '] ?? null, telefono_jefe_empresa_inscripcion: item['Teléfono de la Empresa o Jefe inmediato'] ?? null, email_jefe_empresa_inscripcion: item['Correo Electrónico Contacto en la Empresa'] ?? null, - municipio_empresa: item['Municipio donde se encuentra la Empresa'] ?? null, arl: item['Si su modalidad de práctica es Pasantía o Monitoria, quién asume el pago de la ARL?'] ?? null, observaciones: item['Observaciones - Comentarios'] ?? null } diff --git a/server/src/routes/practicalStages.routes.ts b/server/src/routes/practicalStages.routes.ts index af42984b..df6e9750 100644 --- a/server/src/routes/practicalStages.routes.ts +++ b/server/src/routes/practicalStages.routes.ts @@ -7,12 +7,11 @@ const practicalStageRoutes: IRouter = Router() // * GET practicalStageRoutes.get('/practical-stages', getPracticalStages) -<<<<<<< HEAD + practicalStageRoutes.get('/practical-stages/:id', checkIdReq, getPracticalStageById ) -======= practicalStageRoutes.get('/practical-stages/:id', checkIdReq, getPracticalStageById) ->>>>>>> inscriptions + // * POST practicalStageRoutes.post('/create-practical-stage', checkPracticalStageData, createPracticalStage) From 592e822435f1e4d617e3edb28385d4526f570087 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Tue, 19 Sep 2023 11:20:40 -0500 Subject: [PATCH 128/180] feat: added userStore --- client/src/components/Siderbar/Sidebar.jsx | 8 +++++--- client/src/store/config.js | 5 +++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/client/src/components/Siderbar/Sidebar.jsx b/client/src/components/Siderbar/Sidebar.jsx index a01cda64..9d60ca75 100644 --- a/client/src/components/Siderbar/Sidebar.jsx +++ b/client/src/components/Siderbar/Sidebar.jsx @@ -10,13 +10,15 @@ import { IoHomeOutline, IoLogOutOutline, IoPersonOutline, IoSettingsOutline, IoP // Componentes import { colorIcon, rolesNames, keysRoles } from '../../import/staticData' +import { userStore } from '../../store/config' const Siderbar = () => { const location = useLocation() const navigate = useNavigate() const [open, setOpen] = useState(true) const [dataFullName, setDataFullName] = useState(null) - const [idUsuario, setIdUsuario] = useState() + const { setUserId } = userStore() + const { userId } = userStore() useEffect(() => { const handleResize = () => { @@ -50,7 +52,7 @@ const Siderbar = () => { const tokenData = jwtDecode(token) const { nombres_usuario, apellidos_usuario } = tokenData.data.user const { id_usuario } = tokenData.data.user - setIdUsuario(id_usuario) + setUserId(id_usuario) const fullName = `${nombres_usuario} ${apellidos_usuario}` setDataFullName(fullName) } catch (error) { @@ -135,7 +137,7 @@ const Siderbar = () => { )} {idRol === Number(keysRoles[2]) && (
  • - + diff --git a/client/src/store/config.js b/client/src/store/config.js index 8754ccd2..b4552d7a 100644 --- a/client/src/store/config.js +++ b/client/src/store/config.js @@ -4,3 +4,8 @@ export const inscriptionStore = create((set) => ({ inscriptionData: {}, setInscriptionData: (data) => set({ inscriptionData: data }) })) + +export const userStore = create((set) => ({ + userId: null, + setUserId: (data) => set({ userId: data }) +})) From e7979e1f2536197c7bb002bcd9dddabab6f38c69 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Tue, 19 Sep 2023 11:21:06 -0500 Subject: [PATCH 129/180] fix: limit added --- client/src/api/httpRequest.jsx | 5 ++--- server/src/controllers/users.controllers.ts | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/client/src/api/httpRequest.jsx b/client/src/api/httpRequest.jsx index 92b63a53..0945f696 100644 --- a/client/src/api/httpRequest.jsx +++ b/client/src/api/httpRequest.jsx @@ -138,8 +138,8 @@ export const getClassById = async (id) => { } // OBTENER INSTRUCTORES -export const getTeachers = async () => { - const URL = `${baseUrl}${api}/teachers` +export const getTeachers = async (limit = 50) => { + const URL = `${baseUrl}${api}/teachers?limit=${limit}` const response = await axios.get(URL) return response @@ -210,4 +210,3 @@ export const getClassByLiderTeacherId = async (id) => { const response = await axios.get(URL) return response } - diff --git a/server/src/controllers/users.controllers.ts b/server/src/controllers/users.controllers.ts index e6157d18..826433d8 100644 --- a/server/src/controllers/users.controllers.ts +++ b/server/src/controllers/users.controllers.ts @@ -47,11 +47,11 @@ export const editUser: RequestHandler<{}, Response, userForm> = async (req: Requ export const getTeachers = async (req: Request, res: Response): Promise => { try { - const page = !Number.isNaN(parseInt(req.query.page as string)) || 1 - const limit = !Number.isNaN(parseInt(req.query.limit as string)) || 10 - const offset = (Number(page) - 1) * Number(limit) + const page = Number(req.query.page) || 1 + const limit = Number(req.query.limit) || 10 + const offset: number = (page - 1) * limit - const [teachers] = await connection.query('SELECT * FROM usuarios WHERE id_rol = 3 OR id_rol = 4 LIMIT ? OFFSET ?', [limit, offset]) + const [teachers] = await connection.query('SELECT * FROM usuarios WHERE id_rol = 3 LIMIT ? OFFSET ?', [limit, offset]) if (!Array.isArray(teachers) || teachers.length === 0) throw new DbErrorNotFound('No hay instructores registrados.', errorCodes.ERROR_GET_TEACHER) const [total] = (await connection.query('SELECT COUNT(*) as count FROM usuarios WHERE id_rol = 3')) as unknown as Array<{ count: number }> From 13e19ec91a9a020a8c1a177674e063033dc235b2 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Tue, 19 Sep 2023 13:34:43 -0500 Subject: [PATCH 130/180] fix: added itemNames --- client/src/components/Teacher-class/TeacherClass.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/Teacher-class/TeacherClass.jsx b/client/src/components/Teacher-class/TeacherClass.jsx index 780d92ff..b859fb5c 100644 --- a/client/src/components/Teacher-class/TeacherClass.jsx +++ b/client/src/components/Teacher-class/TeacherClass.jsx @@ -82,7 +82,7 @@ export const TeacherClass = () => { ) : ( teacherClass.slice(startIndex, endIndex).map((course, i) => { - return + return }) )} From fbfdbf2fba94198bf1116c8fd972f9d70b5f9628 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Tue, 19 Sep 2023 14:21:36 -0500 Subject: [PATCH 131/180] fdeleted console.log --- client/src/api/httpRequest.jsx | 2 +- .../Register-detail/RegisterDetails.jsx | 35 +++++++------------ .../Student-monitoring/StudentMonitoring.jsx | 2 +- server/src/controllers/email.controllers.ts | 10 +++--- .../practicalStages.controllers.ts | 3 -- server/src/middlewares/idCheck.middlewares.ts | 1 - .../middlewares/inscriptions.middlewares.ts | 2 -- 7 files changed, 18 insertions(+), 37 deletions(-) diff --git a/client/src/api/httpRequest.jsx b/client/src/api/httpRequest.jsx index 1a66fec3..8067a99b 100644 --- a/client/src/api/httpRequest.jsx +++ b/client/src/api/httpRequest.jsx @@ -169,7 +169,7 @@ export const getAvalById = async (id) => { return response } -// OBTENER USERS BY IDmm +// OBTENER USERS BY ID export const getUserById = async (id) => { const URL = `${baseUrl}${api}/user/${id}` diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index bc1de198..47de1670 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -61,7 +61,7 @@ export const RegisterDetails = () => { setLinkDocs(link_documentos) setInscriptionAprendiz(res) } catch (error) { - console.log('Ha ocurrido un error al mostrar los datos del usuario') + console.error('Ha ocurrido un error al mostrar los datos del usuario') } } @@ -71,7 +71,7 @@ export const RegisterDetails = () => { const res = response.data.data setDetails({ documentosId: res[0].id_detalle_inscripcion, rapsId: res[1].id_detalle_inscripcion, funcionesId: res[2].id_detalle_inscripcion, avalId: res[3].id_detalle_inscripcion }) } catch (error) { - console.log(error) + console.error(error) } } @@ -292,7 +292,7 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const res = response.data.data setDataAprendiz(res) } catch (error) { - console.log('Ha ocurrido un error al mostrar los datos del usuario') + console.error('Ha ocurrido un error al mostrar los datos del usuario') } } const getDetallesInscripcion = async (id) => { @@ -300,19 +300,16 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const response = await getInscriptionDetails(id) const res = response.data.data const res2 = response.data.data[1].responsable_aval - console.log(res) - console.log(res2) setDataEmpresa(res) setIdUser(res2) } catch (error) { - console.log(error) + console.error(error) } } const getUser = async (id) => { const response = await getUserById(id) const res = response.data.data[0].nombres_usuario const res2 = response.data.data[0].apellidos_usuario - console.log(res) setUser(res + ' ' + res2) } @@ -358,7 +355,6 @@ const Coordinador = ({ idRol, avalCoordinador }) => { if (selectedApproveButton === approveOptions.Si) return acceptApprove({ observations, approveOption, avalCoordinador }, loadingToast) if (selectedApproveButton === approveOptions.No) return denyApprove({ observations, approveOption, avalCoordinador }, loadingToast) } catch (err) { - console.log(err) if (toast.isActive('loadingToast')) return toast.error('Los campos son incorrectos, corríjalos.', { toastId: 'error-full-docs', @@ -438,13 +434,13 @@ const Coordinador = ({ idRol, avalCoordinador }) => {

    {item.modalidad_inscripcion === '1' ? 'Pasantías' : item.modalidad_inscripcion === '2' ? 'Contrato de aprendizaje' : item.modalidad_inscripcion === '3' ? 'Proyecto Productivo' : item.modalidad_inscripcion === '4' ? 'Monitoría' : item.modalidad_inscripcion === '5' ? 'Vinculación laboral' : null}

  • -
    +

    AVALES

    -
    +
    {dataEmpresa.map((item) => ( -
    +
    ))} @@ -525,7 +521,6 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { const iFrameRef = useRef(null) const [showDriveButton, setShowDriveButton] = useState(null) - const [avalInfoFunciones, setAvalInfoFunciones] = useState([]) const [notify, setNotify] = useState(false) @@ -647,7 +642,6 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => { const response = await getTeachers() const { data } = response.data setTeacher(data) - console.log(data) } catch (error) { throw new Error(error) } @@ -761,7 +755,7 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { await getModalities(res) if (avalDocumentos) fetchDataDocuments() } catch (error) { - console.log('Ha ocurrido un error al mostrar los datos del usuario') + console.error('Ha ocurrido un error al mostrar los datos del usuario') } } @@ -771,7 +765,6 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { const getModalities = async () => { const res = await getModalitiesById(idModalidad) - console.log(res.data.data) setModalidad(res.data.data) } const handleSubmitButton = () => { @@ -806,7 +799,6 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { if (selectedApproveButton === approveOptions.Si) return acceptFullDocsApprove({ observations, approveOption, avalDocumentos }, loadingToast) if (selectedApproveButton === approveOptions.No) return denyFullDocsApprove({ observations, approveOption, avalDocumentos }, loadingToast) } catch (err) { - console.log(err) if (toast.isActive('loadingToast')) return toast.error('Los campos son incorrectos, corríjalos.', { toastId: 'error-full-docs', @@ -847,12 +839,10 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { const { id_usuario: responsable } = decode(cookie).data.user const data = { estado_aval: estado_aval[payload.approveOption], observaciones: payload.observations, responsable_aval: responsable } - console.log(id, data) try { await inscriptionDetailsUpdate(id, data) - console.log('inscripcion updated') - const resEmail = await sendEmail({ to: 'blandon0207s@outlook.com', htmlData: [null, { nombre_inscripcion, apellido_inscripcion, observations: payload.observations }], subject: 'Rechazado de solicitud de inscripción de etapa práctica' }) - console.log(resEmail) + ('inscripcion updated') + await sendEmail({ to: 'blandon0207s@outlook.com', htmlData: [null, { nombre_inscripcion, apellido_inscripcion, observations: payload.observations }], subject: 'Rechazado de solicitud de inscripción de etapa práctica' }) toast.update(toastId, { render: '¡Aval denegado!', isLoading: false, type: 'success', position: 'top-right', autoClose: 3000, hideProgressBar: false, closeOnClick: true, pauseOnHover: false, draggable: false, progress: undefined, theme: 'colored', closeButton: true, className: 'text-base' }) selectButtonToSubmit(null) fetchDataDocuments() @@ -1008,7 +998,6 @@ const RAPS = ({ idRol, avalRaps }) => { const handleInputText = (e) => { const content = e.target.innerHTML - console.log(content) if (content.length === 0) { setHtmlContent('') } @@ -1067,7 +1056,7 @@ const RAPS = ({ idRol, avalRaps }) => { } if (avalRaps) fetchRaps() } catch (error) { - console.log('Ha ocurrido un error al mostrar los datos del usuario') + console.error('Ha ocurrido un error al mostrar los datos del usuario') } } @@ -1090,7 +1079,7 @@ const RAPS = ({ idRol, avalRaps }) => {
    {courses.map((item) => (
    -

    Fichas

    +

    Fichas

    {item.numero_ficha}

    {item.id_nivel_formacion}

    diff --git a/client/src/components/Student-monitoring/StudentMonitoring.jsx b/client/src/components/Student-monitoring/StudentMonitoring.jsx index 8156f40b..89e5b698 100644 --- a/client/src/components/Student-monitoring/StudentMonitoring.jsx +++ b/client/src/components/Student-monitoring/StudentMonitoring.jsx @@ -51,7 +51,7 @@ export const StudentMonitoring = () => { setDates({ fin_lectiva: fecha_fin_lectiva.split('T')[0], inicio_practicas: fecha_inicio_practica.split('T')[0] }) setInfoUserById(res) } catch (error) { - console.log('Ha ocurrido un error al mostrar los datos del usuario') + console.error('Ha ocurrido un error al mostrar los datos del usuario') } } diff --git a/server/src/controllers/email.controllers.ts b/server/src/controllers/email.controllers.ts index 0f67f2ac..30a8da81 100644 --- a/server/src/controllers/email.controllers.ts +++ b/server/src/controllers/email.controllers.ts @@ -6,22 +6,20 @@ import { handleHTTP } from '../errors/errorsHandler.js' export const sendEmail = async (req: Request, res: Response): Promise => { const { to, subject, htmlData } = req.body - const [htmlContent, textContent] = htmlData - const { nombre_inscripcion, apellido_inscripcion, observations } = textContent - + const [htmlContent, textContent] = htmlData + const { nombre_inscripcion, apellido_inscripcion, observations } = textContent + try { const emailBody = `

    Querido ${nombre_inscripcion} ${apellido_inscripcion}, su solicitud de inscripción de etapa práctica ha sido rechazada por la siguiente/s observación/es:
    ${observations}.

    ${htmlContent ?? ''}
    Revisado por Juan Esteban
    ` - const sendData = await emailConfig.sendMail({ + await emailConfig.sendMail({ from: process.env.MAIL_USER, to, subject, html: emailBody }) - console.log(sendData) return res.status(200).json({ msg: 'Correo enviado correctamente' }) } catch (error) { - console.log(error) return handleHTTP(res, error as CustomError) } } diff --git a/server/src/controllers/practicalStages.controllers.ts b/server/src/controllers/practicalStages.controllers.ts index 5a065929..70193ae9 100644 --- a/server/src/controllers/practicalStages.controllers.ts +++ b/server/src/controllers/practicalStages.controllers.ts @@ -19,12 +19,9 @@ export const getPracticalStageById: RequestHandler<{ id: string }, Response, Pra const { id } = params const idNumber = Number(id) try { - console.log('a') const [practicalStage] = await connection.query('SELECT * FROM modalidades WHERE id_modalidad = ?', [idNumber]) - console.log(practicalStage) return res.status(httpStatus.OK).json({ data: practicalStage }) } catch (error) { - console.log(error) return handleHTTP(res, error as CustomError) } } diff --git a/server/src/middlewares/idCheck.middlewares.ts b/server/src/middlewares/idCheck.middlewares.ts index 050779b5..1fb72559 100644 --- a/server/src/middlewares/idCheck.middlewares.ts +++ b/server/src/middlewares/idCheck.middlewares.ts @@ -15,7 +15,6 @@ export const checkIdReq: RequestHandler<{ id: string }, Response, unknown> = (re if (isNaN(idParse)) throw new IdIsNaN('El id no es un número.') next() } catch (error) { - console.log(error) handleHTTP(res, error as CustomError) } } diff --git a/server/src/middlewares/inscriptions.middlewares.ts b/server/src/middlewares/inscriptions.middlewares.ts index 3feb7b2d..79c24828 100644 --- a/server/src/middlewares/inscriptions.middlewares.ts +++ b/server/src/middlewares/inscriptions.middlewares.ts @@ -24,11 +24,9 @@ export const checkInscriptionData: RequestHandler<{}, Response, inscriptionData> const { error } = inscriptionSchema.validate({ nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, responsable_inscripcion }) - console.log(error) if (error !== undefined) throw new DataNotValid(`Los datos ingresados del id ${inscriptionLength} no son válidos, verifícalos.`) inscriptionLength += 1 } - console.log('Bueno') next() } catch (error) { handleHTTP(res, error as CustomError) From 8f2f5ce20b54e4796b884b72d938f08f1c717a21 Mon Sep 17 00:00:00 2001 From: Juan Prasca Date: Tue, 19 Sep 2023 21:42:10 -0500 Subject: [PATCH 132/180] Arreglos en el formulario de inscripcion --- .../Register-detail/RegisterDetails.jsx | 75 +++---- .../Register-student/RegisterStudent.jsx | 26 ++- .../src/validation/inscriptionsValidation.js | 22 +- .../practicalStages.controllers.ts | 2 - server/src/schemas/inscriptions.schemas.ts | 193 ++++++++---------- 5 files changed, 138 insertions(+), 180 deletions(-) diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index bc1de198..75f748d5 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -16,7 +16,7 @@ import { Button } from '../Utils/Button/Button' import { Select } from '../Utils/Select/Select' import { colorTextStatus, keysRoles } from '../../import/staticData' -import { getInscriptionById, getInscriptionDetails, getAvalById, getUserById, inscriptionDetailsUpdate, sendEmail, getTeachers, getModalitiesById, GetClassByNumber } from '../../api/httpRequest' +import { getInscriptionById, getInscriptionDetails, getAvalById, getUserById, inscriptionDetailsUpdate, sendEmail, getTeachers, getModalitiesById } from '../../api/httpRequest' import { AiOutlineFullscreen } from 'react-icons/ai' import { checkApprovementData } from '../../validation/approvementValidation' import Cookies from 'js-cookie' @@ -300,8 +300,6 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const response = await getInscriptionDetails(id) const res = response.data.data const res2 = response.data.data[1].responsable_aval - console.log(res) - console.log(res2) setDataEmpresa(res) setIdUser(res2) } catch (error) { @@ -312,7 +310,6 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const response = await getUserById(id) const res = response.data.data[0].nombres_usuario const res2 = response.data.data[0].apellidos_usuario - console.log(res) setUser(res + ' ' + res2) } @@ -521,7 +518,7 @@ const Coordinador = ({ idRol, avalCoordinador }) => {
    ) - } +} const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { const iFrameRef = useRef(null) const [showDriveButton, setShowDriveButton] = useState(null) @@ -647,7 +644,6 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => { const response = await getTeachers() const { data } = response.data setTeacher(data) - console.log(data) } catch (error) { throw new Error(error) } @@ -737,7 +733,6 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { const [nameResponsableDocumentos, setNameResponsableDocumentos] = useState('') const { id } = useParams() const [modalidad, setModalidad] = useState([]) - const [idModalidad, setIdModalidad] = useState(0) const handleUseState = (setState, value) => setState(value) @@ -756,7 +751,6 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { try { const response = await getInscriptionById(id) const res = response.data.data[0].modalidad_inscripcion - setIdModalidad(res) // Llamar a getCourses con el valor actualizado de ficha await getModalities(res) if (avalDocumentos) fetchDataDocuments() @@ -769,9 +763,8 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { }, [id, avalDocumentos]) - const getModalities = async () => { - const res = await getModalitiesById(idModalidad) - console.log(res.data.data) + const getModalities = async (id) => { + const res = await getModalitiesById(id) setModalidad(res.data.data) } const handleSubmitButton = () => { @@ -869,6 +862,11 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { Líder Prácticas: Última fecha de modificación: Fecha Registro: {avalInfoDocumentos.fecha_creacion} + {modalidad.map((item) => ( +
    + {item.nombre_modalidad} +
    + ))}

    {nameResponsableDocumentos}

    @@ -1053,18 +1051,13 @@ const RAPS = ({ idRol, avalRaps }) => { } } - const [ficha, setFicha] = useState(0) - const [courses, setCourses] = useState([]) + const [info, setInfo] = useState([]) useEffect(() => { const fetchData = async () => { try { const response = await getInscriptionById(id) - const res = response.data.data[0].numero_ficha_inscripcion - setFicha(res) - // Llamar a getCourses con el valor actualizado de ficha - if(ficha !== 0) { - await getCourses(res) - } + const res = response.data.data + setInfo(res) if (avalRaps) fetchRaps() } catch (error) { console.log('Ha ocurrido un error al mostrar los datos del usuario') @@ -1074,38 +1067,11 @@ const RAPS = ({ idRol, avalRaps }) => { fetchData() // Llamar a fetchData cuando el componente se monte o cuando id cambie }, [id, avalRaps]) - const getCourses = async () => { - try { - const response = await GetClassByNumber(ficha) - const { data } = response.data - setCourses(data) - } catch (error) { - throw new Error(error) - } - } return (

    RAPS

    -
    - {courses.map((item) => ( -
    -

    Fichas

    -
    -

    {item.numero_ficha}

    -

    {item.id_nivel_formacion}

    -

    {item.nombre_programa_formacion}

    -

    Lider de ficha: {item.id_instructor_lider}

    -

    Lider de seguimiento: {item.id_instructor_seguimiento}

    -
    -

    Fecha fin lectiva: {new Date(item.fecha_inicio_lectiva).toLocaleDateString()}

    -

    Fecha inicio practica: {new Date(item.fecha_fin_lectiva).toLocaleDateString()}

    -
    -

    Fecha fin lectiva: {new Date(item.fecha_fin_lectiva).toLocaleDateString()}

    -
    -
    - ))} -
    +
    @@ -1113,8 +1079,13 @@ const RAPS = ({ idRol, avalRaps }) => {
    Líder Prácticas: - Última fecha de modificación: - Fecha Registro: {avalInfo.fecha_creacion} + {info.map((item) => ( +
    +

    {item.numero_ficha_inscripcion}

    +

    {item.nombre_inscripcion + ' ' + item.apellido_inscripcion}

    +
    + ))} + {avalInfo.fecha_creacion}

    {nameResponsable}

    @@ -1122,6 +1093,12 @@ const RAPS = ({ idRol, avalRaps }) => {
    Estado: {avalInfo.estado_aval}
    + {info.map((item) => ( +
    +

    {item.tipo_documento_inscripcion}:

    +

    {item.documento_inscripcion}

    +
    + ))}
    diff --git a/client/src/components/Register-student/RegisterStudent.jsx b/client/src/components/Register-student/RegisterStudent.jsx index 48e4c320..4192ec8c 100644 --- a/client/src/components/Register-student/RegisterStudent.jsx +++ b/client/src/components/Register-student/RegisterStudent.jsx @@ -92,7 +92,6 @@ export const RegisterStudent = () => { const classNumber = formValues.id_ficha_inscripcion const archivo = formValues.link_documentos.name - formValues.fecha_creacion = Date.now() formValues.observaciones = observation formValues.link_documentos = archivo @@ -128,16 +127,6 @@ export const RegisterStudent = () => { } formValues.id_usuario_responsable_inscripcion = `${id}` // validar que los campos no esten vacios - const emptyFields = Object.keys(formValues).filter((key) => !formValues[key]) - - // si hay campos vacios, mostrar alerta - if (emptyFields.length > 0) { - return Swal.fire({ - icon: 'error', - title: 'Oops...', - text: 'Por favor, completa todos los campos' - }) - } const { error } = inscriptionValidation.validate(formValues) if (error !== undefined) { return Swal.fire({ @@ -148,14 +137,13 @@ export const RegisterStudent = () => { // validar que los campos de tipo number sean numeros ValidateInputsTypeNumber(formValues.numero_documento_inscripcion, formValues.numero_telefono_inscripcion, formValues.numero_ficha_inscripcion) - // validar que el numero de documento sea valido // enviar los datos al backend const responsable_inscripcion = `${decoded.data.user.nombres_usuario} ${decoded.data.user.apellidos_usuario}` const estado_general_inscripcion = 'Pendiente' - const form = {...formValues, responsable_inscripcion, estado_general_inscripcion } + const form = { ...formValues, responsable_inscripcion, estado_general_inscripcion } const dataToSend = Array(form) const data = await sendDataInscription(dataToSend) // mostramos una alerta de exito @@ -177,8 +165,18 @@ export const RegisterStudent = () => { // vaciar los inputs const deleteData = () => { if (formRef.current) { + // Resetear el formulario, lo que eliminará los valores de todos los campos formRef.current.reset() + // Eliminar también los valores de los campos "select" específicos + const selectFields = ['tipo_documento_inscripcion', 'modalidad_inscripcion', 'etapa_actual_inscripcion', 'nivel_formacion_inscripcion', 'apoyo_sostenimiento_inscripcion', 'arl'] + selectFields.forEach((fieldName) => { + const selectInput = formRef.current.querySelector(`[name="${fieldName}"]`) + if (selectInput) { + selectInput.value = '' + } + }) } + if (fileInputRef.current) { fileInputRef.current.value = '' } @@ -317,7 +315,7 @@ export const RegisterStudent = () => { /> ) : item.type === 'textarea' ? (
    - +
    ) : ( diff --git a/client/src/validation/inscriptionsValidation.js b/client/src/validation/inscriptionsValidation.js index c6b60716..afa47b57 100644 --- a/client/src/validation/inscriptionsValidation.js +++ b/client/src/validation/inscriptionsValidation.js @@ -17,17 +17,17 @@ export const inscriptionValidation = Joi.object({ email_instructor_lider_inscripcion: Joi.string().required().min(3), id_instructor_lider_inscripcion: Joi.number().required().min(1), apoyo_sostenimiento_inscripcion: Joi.string().required().min(2).max(50), - nit_empresa_inscripcion: Joi.number(), - nombre_empresa_inscripcion: Joi.string().required(), - direccion_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), - id_empresa_inscripcion: Joi.number().min(1).allow(null), - nombre_jefe_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), - cargo_jefe_empresa_inscripcion: Joi.string().min(3).max(100).allow(null), - telefono_jefe_empresa_inscripcion: Joi.string().min(5).max(100).allow(null), - email_jefe_empresa_inscripcion: Joi.string().min(5).max(100).allow(null), - arl: Joi.string().min(2).max(20).allow(null), + nit_empresa_inscripcion: Joi.allow(null), + nombre_empresa_inscripcion: Joi.allow(null), + direccion_empresa_inscripcion: Joi.allow(null), + id_empresa_inscripcion: Joi.number().min(1), + nombre_jefe_empresa_inscripcion: Joi.allow(null), + cargo_jefe_empresa_inscripcion: Joi.allow(null), + telefono_jefe_empresa_inscripcion: Joi.allow(null), + email_jefe_empresa_inscripcion: Joi.allow(null), + arl: Joi.allow(null), link_documentos: Joi.string().required().min(5).max(200), - observaciones: Joi.string().required().min(1).max(200), + observaciones: Joi.allow(null), fecha_creacion: Joi.date().required(), id_usuario_responsable_inscripcion: Joi.number().required().min(1) -}) +}) \ No newline at end of file diff --git a/server/src/controllers/practicalStages.controllers.ts b/server/src/controllers/practicalStages.controllers.ts index 5a065929..eb930cfb 100644 --- a/server/src/controllers/practicalStages.controllers.ts +++ b/server/src/controllers/practicalStages.controllers.ts @@ -19,9 +19,7 @@ export const getPracticalStageById: RequestHandler<{ id: string }, Response, Pra const { id } = params const idNumber = Number(id) try { - console.log('a') const [practicalStage] = await connection.query('SELECT * FROM modalidades WHERE id_modalidad = ?', [idNumber]) - console.log(practicalStage) return res.status(httpStatus.OK).json({ data: practicalStage }) } catch (error) { console.log(error) diff --git a/server/src/schemas/inscriptions.schemas.ts b/server/src/schemas/inscriptions.schemas.ts index 006f19c8..9a44ccf3 100644 --- a/server/src/schemas/inscriptions.schemas.ts +++ b/server/src/schemas/inscriptions.schemas.ts @@ -1,107 +1,92 @@ -import Joi from 'joi' + import Joi from 'joi' -export const inscriptionSchema = Joi.object({ - nombre_inscripcion: Joi - .string() - .required(), - apellido_inscripcion: Joi - .string() - .required(), - tipo_documento_inscripcion: Joi - .string() - .required(), - documento_inscripcion: Joi - .string() - .required(), - email_inscripcion: Joi - .string() - .required() - .trim(), - inscripcion_celular: Joi - .string() - .required(), - etapa_actual_inscripcion: Joi - .string() - .required(), - modalidad_inscripcion: Joi - .number() - .required(), - nombre_programa_inscripcion: Joi - .string() - .required(), - nivel_formacion_inscripcion: Joi - .string() - .required(), - numero_ficha_inscripcion: Joi - .string() - .required(), - fecha_fin_lectiva_inscripcion: Joi - .date() - .allow(null), - nombre_instructor_lider_inscripcion: Joi - .string() - .allow(null), - email_instructor_lider_inscripcion: Joi - .string() - .required() - .trim(), - apoyo_sostenimiento_inscripcion: Joi - .string() - .required() - .min(3), - nit_empresa_inscripcion: Joi - .string() - .allow(null), - nombre_empresa_inscripcion: Joi - .string() - .allow(null), - direccion_empresa_inscripcion: Joi - .string() - .allow(null), - municipio_empresa: Joi - .string() - .allow(null), - nombre_jefe_empresa_inscripcion: Joi - .string() - .allow(null), - cargo_jefe_empresa_inscripcion: Joi - .string() - .allow(null), - telefono_jefe_empresa_inscripcion: Joi - .string() - .allow(null) - .trim(), - email_jefe_empresa_inscripcion: Joi - .string() - .allow(null) + export const inscriptionSchema = Joi.object({ + nombre_inscripcion: Joi + .string() + .required(), + apellido_inscripcion: Joi + .string() + .required(), + tipo_documento_inscripcion: Joi + .string() + .required(), + documento_inscripcion: Joi + .string() + .required(), + email_inscripcion: Joi + .string() + .required() + .trim(), + inscripcion_celular: Joi + .string() + .required(), + etapa_actual_inscripcion: Joi + .string() + .required(), + modalidad_inscripcion: Joi + .number() + .required(), + nombre_programa_inscripcion: Joi + .string() + .required(), + nivel_formacion_inscripcion: Joi + .string() + .required(), + numero_ficha_inscripcion: Joi + .string() + .required(), + fecha_fin_lectiva_inscripcion: Joi + .date() + .allow(null), + nombre_instructor_lider_inscripcion: Joi + .string() + .allow(null), + email_instructor_lider_inscripcion: Joi + .string() + .required() + .trim(), + apoyo_sostenimiento_inscripcion: Joi + .string() + .required() + .min(3), + nit_empresa_inscripcion: Joi + .allow(null), + nombre_empresa_inscripcion: Joi + .allow(null), + direccion_empresa_inscripcion: Joi + .allow(null), + nombre_jefe_empresa_inscripcion: Joi + .allow(null), + cargo_jefe_empresa_inscripcion: Joi + .allow(null), + telefono_jefe_empresa_inscripcion: Joi + .allow(null), + email_jefe_empresa_inscripcion: Joi + .allow(null), + arl: Joi + .allow(null), + link_documentos: Joi + .string() + .required(), + observaciones: Joi + .allow(null), + responsable_inscripcion: Joi + .string() + .required() - .trim(), - arl: Joi - .string() - .allow(null), - link_documentos: Joi - .string() - .required(), - observaciones: Joi - .string() - .allow(null), - responsable_inscripcion: Joi - .string() - .required() + }) -}) - -export const inscriptionDetailSchema = Joi.object({ - id: Joi - .number() - .required(), - responsable_aval: Joi - .number() - .allow(null), - estado_aval: Joi - .string() - .allow(null), - observaciones: Joi - .string() - .allow(null) -}) + export const inscriptionDetailSchema = Joi.object({ + id: Joi + .number() + .required(), + responsable_aval: Joi + .number() + .allow(null), + estado_aval: Joi + .string() + .allow(null), + observaciones: Joi + .string() + .allow(null) + }) From c84fcbe82c1128ad20a600dd4767eed3af0ba6bf Mon Sep 17 00:00:00 2001 From: Loren Q Date: Wed, 20 Sep 2023 09:47:05 -0500 Subject: [PATCH 133/180] Docs: JsDocs added --- .../components/Assign-class/AssignClass.jsx | 90 ++- client/src/components/Courses/Courses.jsx | 129 ++++ client/src/components/Form/Form.jsx | 99 +++- .../Register-detail/RegisterDetails.jsx | 561 +++++++++++++++++- .../components/Register-list/RegisterList.jsx | 192 ++++++ .../Register-student/RegisterStudent.jsx | 129 ++-- client/src/components/Search/Search.jsx | 32 + client/src/components/Siderbar/Sidebar.jsx | 72 +++ .../Student-monitoring/StudentMonitoring.jsx | 135 ++++- client/src/components/Students/Students.jsx | 134 ++++- .../components/Teacher-class/TeacherClass.jsx | 76 +++ client/src/components/Teachers/Teachers.jsx | 76 ++- client/src/components/User/User.jsx | 63 ++ client/src/components/Utils/Card/Card.jsx | 13 +- client/src/components/Utils/Modals/Modals.jsx | 198 ++++++- client/src/components/Utils/Select/Select.jsx | 14 + client/src/import/staticData.jsx | 146 ++++- 17 files changed, 2055 insertions(+), 104 deletions(-) diff --git a/client/src/components/Assign-class/AssignClass.jsx b/client/src/components/Assign-class/AssignClass.jsx index d84eb768..1890ff12 100644 --- a/client/src/components/Assign-class/AssignClass.jsx +++ b/client/src/components/Assign-class/AssignClass.jsx @@ -24,7 +24,20 @@ export const AssignClass = () => { const [loading, setLoading] = useState(true) const [courses, setCourses] = useState([]) const [detailCourse, setDetailCourse] = useState([]) + const [notify, setNotify] = useState(false) + /** + * Función asincrónica para obtener la lista de cursos que no tengan instructor asignado. + * + * @async + * @function + * @name getCursos + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getCursos(); + */ const getCursos = async () => { try { const response = await getClassFree() @@ -40,8 +53,31 @@ export const AssignClass = () => { getCursos() }, []) + /** + * Función para manejar el cierre del modal de asignación. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => setModalAsign(false) + /** + * Función asincrónica para obtener y establecer los detalles de un curso. + * + * @async + * @function + * @name handleDetailCourse + * @param {string} numero_ficha - Número de ficha del curso. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * handleDetailCourse('12345'); + */ const handleDetailCourse = async (numero_ficha) => { try { setModalAsign(true) @@ -53,17 +89,67 @@ export const AssignClass = () => { } } + /** + * Número de cursos a mostrar por página. + * + * @constant + * @name coursesPerPage + * @type {number} + * @default 6 + * + * @example + * const cursosPorPagina = coursesPerPage; + */ const coursesPerPage = 6 + /** + * Calcula el número de páginas necesarias para la paginación de cursos. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const numeroDePaginas = pageCount; + */ const pageCount = Math.ceil(courses.length / coursesPerPage) + /** + * Índice de inicio de la lista de cursos a mostrar en la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * coursesPerPage + /** + * Índice de fin de la lista de cursos a mostrar en la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + coursesPerPage useEffect(() => { setLoading(false) }, []) - const [notify, setNotify] = useState(false) - + /** + * Efecto secundario para mostrar una notificación de asignación de instructor y actualizar la lista de cursos. + * + * @function + * @name useEffectMostrarNotificacionYActualizarCursos + * @param {boolean} notify - Estado de notificación. + * @returns {void} + * + * @example + * useEffectMostrarNotificacionYActualizarCursos(true); + */ useEffect(() => { if (notify) { toast.success('Se ha asignado el instructor', { diff --git a/client/src/components/Courses/Courses.jsx b/client/src/components/Courses/Courses.jsx index d3d97492..407aed7d 100644 --- a/client/src/components/Courses/Courses.jsx +++ b/client/src/components/Courses/Courses.jsx @@ -26,10 +26,32 @@ export const Courses = () => { const [filtersButtons, setFiltersButtons] = useState({ etapa: false, nivel: false, finLectiva: false, inicioPractica: false }) const [activeFilter, setActiveFilter] = useState(false) + /** + * Función para manejar la visualización de los filtros. + * + * @function + * @name handleFilter + * @returns {void} + * + * @example + * handleFilter(); + */ const handleFilter = () => { setShowFiltros(!showFiltros) } + /** + * Función asincrónica para obtener la lista de cursos. + * + * @async + * @function + * @name getCursos + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getCursos(); + */ const getCursos = async () => { try { const response = await getClass() @@ -45,9 +67,50 @@ export const Courses = () => { getCursos() }, []) + /** + * Número de cursos a mostrar por página. + * + * @constant + * @name coursesPerPage + * @type {number} + * @default 6 + * + * @example + * const cursosPorPagina = coursesPerPage; + */ const coursesPerPage = 6 + /** + * Calcula el número de páginas necesarias para la paginación. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const numeroDePaginas = pageCount; + */ const pageCount = Math.ceil(courses.length / coursesPerPage) + /** + * Índice de inicio de la lista de cursos a mostrar en la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * coursesPerPage + /** + * Índice de fin de la lista de cursos a mostrar en la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + coursesPerPage useEffect(() => { @@ -55,13 +118,46 @@ export const Courses = () => { }, []) const navigate = useNavigate() + + /** + * Función para navegar a la página de detalles de estudiantes por ficha. + * + * @function + * @name handleStudents + * @param {string} ficha - Número de ficha de aprendices. + * @returns {void} + * + * @example + * handleStudents('12345'); + */ const handleStudents = (ficha) => { return navigate(`/fichas/aprendices/${ficha}`) } + + /** + * Función para navegar a la página de asignar instructor a una ficha. + * + * @function + * @name handleAsign + * @returns {void} + * + * @example + * handleAsign(); + */ const handleAsign = () => { return navigate('/asignar-ficha') } + /** + * Deshabilita la visualización de los filtros después de un breve retraso. + * + * @function + * @name disableShowFiltros + * @returns {void} + * + * @example + * disableShowFiltros(); + */ const disableShowFiltros = () => { setTimeout(() => { setShowFiltros(false) @@ -69,6 +165,17 @@ export const Courses = () => { }, 100) } + /** + * Muestra u oculta el filtro especificado. + * + * @function + * @name ShowFilter + * @param {string} filterType - Tipo de filtro ('etapa', 'nivel', 'finLectiva' o 'inicioPractica'). + * @returns {void} + * + * @example + * ShowFilter('etapa'); + */ const ShowFilter = (filterType) => { if (filterType === 'etapa') setFiltersButtons({ etapa: !filtersButtons.etapa, nivel: false, fecha: false, inicioPractica: false }) if (filterType === 'nivel') setFiltersButtons({ nivel: !filtersButtons.nivel, modalidad: false, fecha: false, inicioPractica: false }) @@ -76,6 +183,18 @@ export const Courses = () => { if (filterType === 'inicioPractica') setFiltersButtons({ inicioPractica: !filtersButtons.inicioPractica, etapa: false, nivel: false, finLectiva: false }) } + /** + * Maneja la selección de filtro de tipo y actualiza la lista de cursos. + * + * @function + * @name handleFilterType + * @param {string} filterType - Tipo de filtro ('etapa' o 'nivel'). + * @param {string} filter - Valor del filtro seleccionado. + * @returns {void} + * + * @example + * handleFilterType('etapa', 'Activo'); + */ const handleFilterType = (filterType, filter) => { if (filterType === 'etapa') { const filterMap = coursesOriginal.filter((course) => course.estado === filter) @@ -89,6 +208,16 @@ export const Courses = () => { setActiveFilter(true) } + /** + * Restablece los filtros y muestra la lista original de cursos. + * + * @function + * @name handleResetFilter + * @returns {void} + * + * @example + * handleResetFilter(); + */ const handleResetFilter = () => { setCourses(coursesOriginal) disableShowFiltros() diff --git a/client/src/components/Form/Form.jsx b/client/src/components/Form/Form.jsx index f10b0af2..bae91db8 100644 --- a/client/src/components/Form/Form.jsx +++ b/client/src/components/Form/Form.jsx @@ -13,33 +13,119 @@ const Form = ({ inputs }) => { const navigate = useNavigate() const [loadingBtn, setLoadingBtn] = useState(false) + /** + * Iconos para mostrar y ocultar la contraseña. + * + * @constant + * @name passwordIcons + * @type {Object} + * + * @example + * const iconosPassword = passwordIcons; + */ const passwordIcons = { openEye: , closeEye: } + /** + * Estados para controlar la visibilidad de la contraseña. + * + * @constant + * @name passwordStatus + * @type {Object} + * + * @example + * const estadosContraseña = passwordStatus; + */ const passwordStatus = { shown: 'text', hidden: 'password' } + /** + * Estado para controlar la visibilidad de la contraseña. + * + * @state + * @name showPassword + * @type {string} + * + * @example + * const mostrarContraseña = showPassword; + */ const [showPassword, setShowPassword] = useState(passwordStatus.hidden) + + /** + * Referencia a los valores del formulario. + * + * @ref + * @name formValuesRef + * @type {Object} + * + * @example + * const referenciaValoresFormulario = formValuesRef; + */ const formValuesRef = useRef({}) + /** + * Función para manejar la visibilidad de la contraseña. + * + * @function + * @name handlePassword + * @returns {void} + * + * @example + * handlePassword(); + */ const handlePassword = () => (showPassword === passwordStatus.shown ? setShowPassword(passwordStatus.hidden) : setShowPassword(passwordStatus.shown)) + /** + * Función para manejar el envío del formulario. + * + * @function + * @name handleSubmit + * @param {Event} e - Evento del formulario. + * @returns {void} + * + * @example + * handleSubmit(evento); + */ const handleSubmit = (e) => { e.preventDefault() const dataToSend = flattenObject(formValuesRef.current) sendData(dataToSend) } + /** + * Función para aplanar un objeto anidado. + * + * @function + * @name flattenObject + * @param {Object} obj - Objeto a aplanar. + * @returns {Object} Objeto aplanado. + * + * @example + * const objetoAplanado = flattenObject(objetoAnidado); + */ const flattenObject = (obj) => { return Object.values(obj).reduce((result, current) => { return { ...result, ...current } }, {}) } + /** + * Función asincrónica para enviar datos al servidor. + * + * @async + * @function + * @name sendData + * @param {Object} data - Datos a enviar. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * sendData(datos); + */ const sendData = async (data) => { setLoadingBtn(true) try { @@ -68,6 +154,18 @@ const Form = ({ inputs }) => { } } + /** + * Función para manejar el cambio en la entrada del formulario. + * + * @function + * @name handleInputChange + * @param {Event} e - Evento de cambio en la entrada. + * @param {string} index - Índice del formulario. + * @returns {void} + * + * @example + * handleInputChange(evento, 'index'); + */ const handleInputChange = (e, index) => { const { name, value } = e.target formValuesRef.current = { @@ -117,4 +215,3 @@ const Form = ({ inputs }) => { } export { Form } - diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index 47de1670..c0f4733b 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -38,6 +38,16 @@ export const RegisterDetails = () => { getDetallesInscripcion(id) }, [id]) + /** + * Función para obtener la pestaña seleccionada actualmente. + * + * @function + * @name getSelectedTab + * @returns {string} - Nombre de la pestaña seleccionada. + * + * @example + * const pestañaSeleccionada = getSelectedTab(); + */ const getSelectedTab = () => { const savedTab = JSON.parse(sessionStorage.getItem('currentDetailTab')) if (!savedTab) return 'infoAprendiz' @@ -45,13 +55,43 @@ export const RegisterDetails = () => { return savedTab.lastTab } + /** + * Estado local para almacenar la pestaña seleccionada. + * + * @constant + * @name selectedTab + * @type {string} + * + * @example + * const pestañaActual = selectedTab; + */ const [selectedTab, setSelectedTab] = useState(getSelectedTab) + /** + * Función para actualizar la pestaña seleccionada en el almacenamiento de sesión. + * + * @function + * @returns {void} + * + */ useEffect(() => { const payload = JSON.stringify({ lastTab: selectedTab, paramLink: id }) sessionStorage.setItem('currentDetailTab', payload) }, [selectedTab]) + /** + * Función para obtener los datos de inscripción de un aprendiz por su ID. + * + * @async + * @function + * @name getInscriptionAprendiz + * @param {string} id - ID del aprendiz. + * @returns {void} + * + * @example + * const idAprendiz = '123456'; + * getInscriptionAprendiz(idAprendiz); + */ const getInscriptionAprendiz = async (id) => { try { const response = await getInscriptionById(id) @@ -65,6 +105,19 @@ export const RegisterDetails = () => { } } + /** + * Función para obtener los detalles de inscripción de un aprendiz por su ID. + * + * @async + * @function + * @name getDetallesInscripcion + * @param {string} id - ID del aprendiz. + * @returns {void} + * + * @example + * const idAprendiz = '123456'; + * getDetallesInscripcion(idAprendiz); + */ const getDetallesInscripcion = async (id) => { try { const response = await getInscriptionDetails(id) @@ -254,7 +307,18 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const { inscriptionData } = inscriptionStore() const [selectedApproveButton, setSelectedApproveButton] = useState(null) - const fetchInfo = async () => { + /** + * Función para obtener la información de un aval por su ID. + * + * @async + * @function + * @name fetchInfo + * @returns {void} + * + * @example + * fetchInfo(); + */ + const fetchInfo = async () => { const res = await getAvalById(avalCoordinador) const { data } = res.data setAvalInfo(data) @@ -265,27 +329,70 @@ const Coordinador = ({ idRol, avalCoordinador }) => { const [user, setUser] = useState(0) const prevUserIdRef = useRef() + /** + * Efecto para almacenar el ID de usuario previo. + * + * @function + * @name useEffect + * + */ useEffect(() => { prevUserIdRef.current = idUser }, [idUser]) + + /** + * Efecto para realizar acciones cuando el ID de usuario cambia después de la primera vez. + * + * @function + * @name useEffect + * + */ useEffect(() => { if (prevUserIdRef.current !== 0) { // Realiza la lógica que necesitas cuando idUser cambia después de la primera vez. getUser(idUser) } }, [idUser]) + + /** + * Efecto para realizar acciones cuando se actualiza el valor de `avalCoordinador`. + * + * @function + * @name useEffect + * + */ useEffect(() => { if (avalCoordinador) fetchRaps() }, [avalCoordinador]) + /** + * Efecto para obtener los datos de inscripción del aprendiz y sus detalles. + * + * @function + * @name useEffect + * + */ useEffect(() => { const fetchData = async () => { await getInscriptionAprendiz(id) await getDetallesInscripcion(id) } fetchData() - }, [id],) + }, [id]) + /** + * Función para obtener los datos de inscripción de un aprendiz por su ID. + * + * @async + * @function + * @name getInscriptionAprendiz + * @param {string} id - ID del aprendiz. + * @returns {void} + * + * @example + * const idAprendiz = '123456'; + * getInscriptionAprendiz(idAprendiz); + */ const getInscriptionAprendiz = async (id) => { try { const response = await getInscriptionById(id) @@ -295,6 +402,20 @@ const Coordinador = ({ idRol, avalCoordinador }) => { console.error('Ha ocurrido un error al mostrar los datos del usuario') } } + + /** + * Función para obtener los detalles de inscripción de un aprendiz por su ID. + * + * @async + * @function + * @name getDetallesInscripcion + * @param {string} id - ID del aprendiz. + * @returns {void} + * + * @example + * const idAprendiz = '123456'; + * getDetallesInscripcion(idAprendiz); + */ const getDetallesInscripcion = async (id) => { try { const response = await getInscriptionDetails(id) @@ -306,6 +427,20 @@ const Coordinador = ({ idRol, avalCoordinador }) => { console.error(error) } } + + /** + * Función para obtener los datos de un usuario por su ID. + * + * @async + * @function + * @name getUser + * @param {string} id - ID del usuario. + * @returns {void} + * + * @example + * const idUsuario = '123456'; + * getUser(idUsuario); + */ const getUser = async (id) => { const response = await getUserById(id) const res = response.data.data[0].nombres_usuario @@ -313,6 +448,17 @@ const Coordinador = ({ idRol, avalCoordinador }) => { setUser(res + ' ' + res2) } + /** + * Función para obtener los datos de raps. + * + * @async + * @function + * @name fetchRaps + * @returns {void} + * + * @example + * fetchRaps(); + */ const fetchRaps = async () => { const res = await getAvalById(avalCoordinador) const { data } = res.data @@ -323,6 +469,16 @@ const Coordinador = ({ idRol, avalCoordinador }) => { if (avalCoordinador) fetchInfo() }, [avalCoordinador]) + /** + * Función para validar y habilitar el botón de envío del formulario. + * + * @function + * @name handleSubmitButton + * @returns {void} + * + * @example + * handleSubmitButton(); + */ const handleSubmitButton = () => { if (!selectedApproveButton) return if (descriptionRef.current.value.length === 0) { @@ -332,6 +488,17 @@ const Coordinador = ({ idRol, avalCoordinador }) => { setDisableSubmitButton(false) } + /** + * Función para seleccionar el botón de aprobación. + * + * @function + * @name selectButtonToSubmit + * @param {string} value - Valor del botón de aprobación. + * @returns {void} + * + * @example + * selectButtonToSubmit('Si'); + */ const selectButtonToSubmit = (value) => { setSelectedApproveButton(value) if (descriptionRef.current.value.length === 0 || !value) { @@ -341,6 +508,19 @@ const Coordinador = ({ idRol, avalCoordinador }) => { setDisableSubmitButton(false) } + /** + * Función para manejar el envío del formulario de aval. + * + * @async + * @function + * @name handleAvalForm + * @param {object} e - Evento del formulario. + * @returns {void} + * + * @example + * const eventoFormulario = { target: { value: 'Valor' } }; + * handleAvalForm(eventoFormulario); + */ const handleAvalForm = async (e) => { e.preventDefault() const approveOptions = { Si: 'Si', No: 'No' } @@ -372,6 +552,21 @@ const Coordinador = ({ idRol, avalCoordinador }) => { } } + /** + * Función para aceptar la aprobación de un aval. + * + * @async + * @function + * @name acceptApprove + * @param {object} payload - Datos para la aprobación. + * @param {string} toastId - ID del toast. + * @returns {void} + * + * @example + * const datosAprobacion = { observations: 'Observaciones', approveOption: 'Si', avalCoordinador: 123 }; + * const toastId = 'toast-id'; + * acceptApprove(datosAprobacion, toastId); + */ const acceptApprove = async (payload, toastId) => { const estado_aval = { Si: 'Aprobado', No: 'Rechazado' } const id = payload.avalCoordinador @@ -389,6 +584,21 @@ const Coordinador = ({ idRol, avalCoordinador }) => { } } + /** + * Función para denegar la aprobación de un aval. + * + * @async + * @function + * @name denyApprove + * @param {object} payload - Datos para la aprobación. + * @param {string} toastId - ID del toast. + * @returns {void} + * + * @example + * const datosAprobacion = { observations: 'Observaciones', approveOption: 'No', avalCoordinador: 123 }; + * const toastId = 'toast-id'; + * denyApprove(datosAprobacion, toastId); + */ const denyApprove = async (payload, toastId) => { const { nombre_inscripcion, apellido_inscripcion } = inscriptionData const estado_aval = { No: 'Rechazado' } @@ -409,6 +619,16 @@ const Coordinador = ({ idRol, avalCoordinador }) => { } } + /** + * Opciones de selección de los coordinadores. + * + * @constant + * @name option + * @type {Array} + * + * @example + * const opcionesSeleccion = option; + */ const option = [ { value: 'Sergio Soto Henao', key: 'Sergio Soto Henao' }, { value: 'Marianela Henao Atehortúa', key: 'Marianela Henao Atehortúa' }, @@ -517,13 +737,25 @@ const Coordinador = ({ idRol, avalCoordinador }) => {
    ) - } +} + const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { const iFrameRef = useRef(null) const [showDriveButton, setShowDriveButton] = useState(null) const [notify, setNotify] = useState(false) + /** + * Función para verificar si el enlace es de Google Drive. + * + * @function + * @name checkDriveLink + * @param {string} linkDocs - Enlace a verificar. + * @returns {boolean} - Devuelve `true` si el enlace es de Google Drive, de lo contrario, `false`. + * + * @example + * const esEnlaceDrive = checkDriveLink('https://drive.google.com/folders/...'); + */ const checkDriveLink = (linkDocs) => { const regex = /folders/i const testRegex = regex.test(linkDocs) @@ -534,11 +766,43 @@ const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { return false } + /** + * Efecto para verificar si el enlace es de Google Drive al cambiar el valor de `linkDocs`. + * + * @effect + * @name useEffect + * @param {function} callback - Función a ejecutar. + * @param {Array} dependencies - Dependencias que activarán el efecto. + * + * @example + * useEffect(() => { + * if (linkDocs) { + * checkDriveLink(linkDocs); + * } + * }, [linkDocs]); + */ useEffect(() => { if (linkDocs) { checkDriveLink(linkDocs) } }, [linkDocs]) + + /** + * Efecto para mostrar una notificación de éxito cuando `notify` es `true`. + * + * @effect + * @name useEffect + * @param {function} callback - Función a ejecutar. + * @param {Array} dependencies - Dependencias que activarán el efecto. + * + * @example + * useEffect(() => { + * if (notify) { + * toast.success('Se ha rechazado correctamente', { ... }); + * } + * setNotify(false); + * }, [notify]); + */ useEffect(() => { if (notify) { toast.success('Se ha rechazado correctamente', { @@ -557,6 +821,16 @@ const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { setNotify(false) }, [notify]) + /** + * Función para poner el iframe en pantalla completa. + * + * @function + * @name handleFullScreenIFrame + * @returns {void} + * + * @example + * handleFullScreenIFrame(); + */ const handleFullScreenIFrame = () => { const iframe = iFrameRef.current if (!iframe) return @@ -611,32 +885,62 @@ const Docs = ({ idRol, avalDocumentos, avalFunciones, linkDocs }) => { const FunctionsApproval = ({ idRol, avalFunciones }) => { const [avalInfoFunciones, setAvalInfoFunciones] = useState([]) - // const [nameResponsableFunciones, setNameResponsableFunciones] = useState('') + const [teachers, setTeacher] = useState([]) + const [selectedOptionKey, setSelectedOptionKey] = useState('') + /** + * Función para obtener y almacenar información del aval de funciones. + * + * @function + * @name fetchDataFunciones + * @param {string|number} payload - Identificador del aval de funciones. + * @returns {void} + * + * @example + * fetchDataFunciones(1); + */ const fetchDataFunciones = async (payload) => { if (!payload) return try { const res = await getAvalById(payload) const response = await res.data.data[0] - // const { responsable_aval } = await response - // const responseData = await getUserById(responsable_aval) - // const { nombres_usuario, apellidos_usuario } = await responseData.data.data[0] - // const fullName = `${nombres_usuario} ${apellidos_usuario}` - // setNameResponsableFunciones(fullName) setAvalInfoFunciones(response) } catch (error) { throw new Error(error) } } + /** + * Efecto para obtener información del aval de funciones al cambiar el valor de `avalFunciones`. + * + * @effect + * @name useEffect + * @param {function} callback - Función a ejecutar. + * @param {Array} dependencies - Dependencias que activarán el efecto. + * + * @example + * useEffect(() => { + * if (avalFunciones !== undefined) { + * fetchDataFunciones(avalFunciones); + * } + * }, [avalFunciones]); + */ useEffect(() => { if (avalFunciones !== undefined) { fetchDataFunciones(avalFunciones) } }, [avalFunciones]) - const [teachers, setTeacher] = useState([]) - + /** + * Función para obtener y almacenar información de los instructores. + * + * @function + * @name getInstructores + * @returns {void} + * + * @example + * getInstructores(); + */ const getInstructores = async () => { try { const response = await getTeachers() @@ -651,13 +955,32 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => { getInstructores() }, []) + /** + * Variable que almacena opciones de los instructores para utilizar en el select. + * + * @constant + * @name option + * @type {array} + * + * @example + * const opcionesInstructores = option; + */ const option = teachers.map((teacher) => ({ value: teacher.nombres_usuario + ' ' + teacher.apellidos_usuario + ' - ' + teacher.email_usuario, key: teacher.id_usuario })) - const [selectedOptionKey, setSelectedOptionKey] = useState('') - + /** + * Función para actualizar la clave de la opción seleccionada en el select. + * + * @function + * @name handleSelectChange + * @param {string|number} optionKey - Clave de la opción seleccionada. + * @returns {void} + * + * @example + * handleSelectChange(1); + */ const handleSelectChange = (optionKey) => { setSelectedOptionKey(optionKey) } @@ -690,7 +1013,6 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => { selectedKey={selectedOptionKey} onChange={handleSelectChange} // Pasar el manejador de cambio /> - {/* */}
    @@ -733,10 +1055,32 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { const [modalidad, setModalidad] = useState([]) const [idModalidad, setIdModalidad] = useState(0) + /** + * Función para actualizar el estado usando setState. + * + * @function + * @name handleUseState + * @param {function} setState - Función para actualizar el estado. + * @param {any} value - Valor para actualizar el estado. + * @returns {void} + * + * @example + * handleUseState(setStateFuncion, valorActualizado); + */ const handleUseState = (setState, value) => setState(value) + /** + * Función para obtener y almacenar información de documentos. + * + * @function + * @name fetchDataDocuments + * @returns {void} + * + * @example + * fetchDataDocuments(); + */ const fetchDataDocuments = async () => { - const res = await getAvalById(avalDocumentos) + const res = await getAvalById(avalDocumentos) const { data } = res.data const response = await getUserById(data[0].responsable_aval) const { nombres_usuario, apellidos_usuario } = response.data.data[0] @@ -745,6 +1089,19 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { setAvalInfoDocumentos(data[0]) } + /** + * Efecto para obtener información de documentos cuando cambia el valor de `avalDocumentos`. + * + * @effect + * @name useEffect + * @param {function} callback - Función a ejecutar. + * @param {Array} dependencies - Dependencias que activarán el efecto. + * + * @example + * useEffect(() => { + * if (avalDocumentos) fetchDataDocuments(); + * }, [avalDocumentos]); + */ useEffect(() => { const fetchData = async () => { try { @@ -762,11 +1119,21 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { fetchData() // Llamar a fetchData cuando el componente se monte o cuando id cambie }, [id, avalDocumentos]) - + /** + * Función para obtener modalidades. + * + * @function + * @name getModalities + * @returns {void} + * + * @example + * getModalities(); + */ const getModalities = async () => { const res = await getModalitiesById(idModalidad) setModalidad(res.data.data) } + const handleSubmitButton = () => { if (!selectedApproveButton) return if (descriptionRef.current.value.length === 0) { @@ -785,6 +1152,17 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { handleUseState(setDisableSubmitButton, false) } + /** + * Función para manejar el envío de formularios de documentos. + * + * @function + * @name handleFullDocsForm + * @param {object} e - Evento del formulario. + * @returns {void} + * + * @example + * handleFullDocsForm(evento); + */ const handleFullDocsForm = async (e) => { e.preventDefault() const approveOptions = { Si: 'Si', No: 'No' } @@ -814,6 +1192,18 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { } } + /** + * Función para aceptar la aprobación de documentos. + * + * @function + * @name acceptFullDocsApprove + * @param {object} payload - Datos para la aprobación. + * @param {string} toastId - Identificador del Toast. + * @returns {void} + * + * @example + * acceptFullDocsApprove({ observations, approveOption, avalDocumentos }, 'toastId'); + */ const acceptFullDocsApprove = async (payload, toastId) => { const estado_aval = { Si: 'Aprobado', No: 'Rechazado' } const id = payload.avalDocumentos @@ -831,6 +1221,18 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { } } + /** + * Función para denegar la aprobación de documentos. + * + * @function + * @name denyFullDocsApprove + * @param {object} payload - Datos para la denegación. + * @param {string} toastId - Identificador del Toast. + * @returns {void} + * + * @example + * denyFullDocsApprove({ observations, approveOption, avalDocumentos }, 'toastId'); + */ const denyFullDocsApprove = async (payload, toastId) => { const { nombre_inscripcion, apellido_inscripcion } = inscriptionData const estado_aval = { No: 'Rechazado' } @@ -840,8 +1242,7 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { const data = { estado_aval: estado_aval[payload.approveOption], observaciones: payload.observations, responsable_aval: responsable } try { - await inscriptionDetailsUpdate(id, data) - ('inscripcion updated') + await inscriptionDetailsUpdate(id, data)('inscripcion updated') await sendEmail({ to: 'blandon0207s@outlook.com', htmlData: [null, { nombre_inscripcion, apellido_inscripcion, observations: payload.observations }], subject: 'Rechazado de solicitud de inscripción de etapa práctica' }) toast.update(toastId, { render: '¡Aval denegado!', isLoading: false, type: 'success', position: 'top-right', autoClose: 3000, hideProgressBar: false, closeOnClick: true, pauseOnHover: false, draggable: false, progress: undefined, theme: 'colored', closeButton: true, className: 'text-base' }) selectButtonToSubmit(null) @@ -926,7 +1327,7 @@ const FullDocsApproval = ({ idRol, avalDocumentos }) => { } const RAPS = ({ idRol, avalRaps }) => { - const {id} = useParams() + const { id } = useParams() const formRef = useRef(null) const descriptionRef = useRef(null) @@ -938,8 +1339,30 @@ const RAPS = ({ idRol, avalRaps }) => { const [selectedApproveButton, setSelectedApproveButton] = useState(null) const [disableSubmitButton, setDisableSubmitButton] = useState(true) + /** + * Función para manejar la actualización de un estado utilizando useState. + * + * @function + * @name handleUseState + * @param {function} setState - Función de estado para actualizar el valor. + * @param {*} value - Nuevo valor para el estado. + * @returns {void} + * + * @example + * handleUseState(setDisableSubmitButton, false); + */ const handleUseState = (setState, value) => setState(value) + /** + * Función para manejar el envío de formulario. + * + * @function + * @name handleSubmitButton + * @returns {void} + * + * @example + * handleSubmitButton(); + */ const handleSubmitButton = () => { if (!selectedApproveButton) return if (descriptionRef.current.value.length === 0) { @@ -949,6 +1372,17 @@ const RAPS = ({ idRol, avalRaps }) => { handleUseState(setDisableSubmitButton, false) } + /** + * Función para seleccionar un botón de aprobación para enviar. + * + * @function + * @name selectButtonToSubmit + * @param {string} value - Valor del botón seleccionado ('Si' o 'No'). + * @returns {void} + * + * @example + * selectButtonToSubmit('Si'); + */ const selectButtonToSubmit = (value) => { setSelectedApproveButton(value) if (descriptionRef.current.value.length === 0 || !value) { @@ -958,6 +1392,18 @@ const RAPS = ({ idRol, avalRaps }) => { handleUseState(setDisableSubmitButton, false) } + /** + * Función asincrónica para obtener información de instructores. + * + * @async + * @function + * @name fetchRaps + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * fetchRaps(); + */ const fetchRaps = async () => { const res = await getAvalById(avalRaps) const { data } = res.data @@ -968,6 +1414,17 @@ const RAPS = ({ idRol, avalRaps }) => { setAvalInfo(data[0]) } + /** + * Función para manejar el envío de formulario. + * + * @function + * @name handleSubmit + * @param {Event} e - Evento del formulario. + * @returns {void} + * + * @example + * handleSubmit(event); + */ const handleSubmit = async (e) => { e.preventDefault() const approveOptions = { Si: 'Si', No: 'No' } @@ -990,12 +1447,34 @@ const RAPS = ({ idRol, avalRaps }) => { } } + /** + * Función para manejar la acción de pegar contenido en un elemento. + * + * @function + * @name handleContentPaste + * @param {Event} e - Evento de pegado de contenido. + * @returns {void} + * + * @example + * handleContentPaste(event); + */ const handleContentPaste = (e) => { const pastedContent = e.clipboardData.getData('text/html') setHtmlContent(pastedContent) e.preventDefault() } + /** + * Función para manejar la entrada de texto en un elemento. + * + * @function + * @name handleInputText + * @param {Event} e - Evento de entrada de texto. + * @returns {void} + * + * @example + * handleInputText(event); + */ const handleInputText = (e) => { const content = e.target.innerHTML if (content.length === 0) { @@ -1004,6 +1483,20 @@ const RAPS = ({ idRol, avalRaps }) => { setHtmlContent(content) } + /** + * Función asincrónica para aceptar la aprobación de un aval. + * + * @async + * @function + * @name acceptApprove + * @param {Object} payload - Datos necesarios para la aprobación. + * @param {string} toastId - Identificador del toast. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * acceptApprove({ observations: 'Aprobado', approveOption: 'Si', avalRaps: 123, htmlContent: '...' }, 'loadingToast'); + */ const acceptApprove = async (payload, toastId) => { const estado_aval = { Si: 'Aprobado' } const id = payload.avalRaps @@ -1022,6 +1515,20 @@ const RAPS = ({ idRol, avalRaps }) => { } } + /** + * Función asincrónica para denegar la aprobación de un aval. + * + * @async + * @function + * @name denyApprove + * @param {Object} payload - Datos necesarios para la denegación. + * @param {string} toastId - Identificador del toast. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * denyApprove({ observations: 'Rechazado', approveOption: 'No', avalRaps: 456, htmlContent: '...' }, 'loadingToast'); + */ const denyApprove = async (payload, toastId) => { const { nombre_inscripcion, apellido_inscripcion } = inscriptionData const estado_aval = { No: 'Rechazado' } @@ -1041,7 +1548,7 @@ const RAPS = ({ idRol, avalRaps }) => { throw new Error(error) } } - + const [ficha, setFicha] = useState(0) const [courses, setCourses] = useState([]) useEffect(() => { @@ -1051,7 +1558,7 @@ const RAPS = ({ idRol, avalRaps }) => { const res = response.data.data[0].numero_ficha_inscripcion setFicha(res) // Llamar a getCourses con el valor actualizado de ficha - if(ficha !== 0) { + if (ficha !== 0) { await getCourses(res) } if (avalRaps) fetchRaps() @@ -1063,6 +1570,18 @@ const RAPS = ({ idRol, avalRaps }) => { fetchData() // Llamar a fetchData cuando el componente se monte o cuando id cambie }, [id, avalRaps]) + /** + * Función para obtener información de cursos y actualizar la lista de cursos. + * + * @async + * @function + * @name getCourses + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getCourses(); + */ const getCourses = async () => { try { const response = await GetClassByNumber(ficha) diff --git a/client/src/components/Register-list/RegisterList.jsx b/client/src/components/Register-list/RegisterList.jsx index 0f5044b2..6d7469f0 100644 --- a/client/src/components/Register-list/RegisterList.jsx +++ b/client/src/components/Register-list/RegisterList.jsx @@ -49,12 +49,72 @@ export const RegisterList = () => { const [activeFilter, setActiveFilter] = useState(false) const [inscriptionOriginal, setInscriptionOriginal] = useState([]) + /** + * Número de inscripciones por página. + * + * @constant + * @name inscriptionsPerPage + * @type {number} + * + * @example + * const inscripcionesPorPagina = inscriptionsPerPage; + */ const inscriptionsPerPage = 6 + /** + * Número total de páginas para la paginación de inscripciones. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const totalPaginas = pageCount; + */ const pageCount = Math.ceil(inscriptions.length / inscriptionsPerPage) + /** + * Índice de inicio de la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * inscriptionsPerPage + /** + * Índice de fin de la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + inscriptionsPerPage + /** + * Identificador del rol del usuario almacenado en el almacenamiento local. + * + * @constant + * @name idRol + * @type {number} + * + * @example + * const idRolUsuario = idRol; + */ const idRol = Number(localStorage.getItem('idRol')) + /** + * Función para redirigir al usuario a la página de registro de aprendices. + * + * @function + * @name handleRegister + * @returns {void} + * + * @example + * handleRegister(); + */ const handleRegister = () => { return navigate('/registrar-aprendiz') } @@ -65,8 +125,29 @@ export const RegisterList = () => { setUsername(`${nombres_usuario} ${apellidos_usuario}`) }, []) + /** + * Función para manejar la opción del modal. + * + * @function + * @name handleModalOption + * @param {Object} data - Datos de la opción del modal. + * @returns {void} + * + * @example + * handleModalOption(datosOpcionModal); + */ const handleModalOption = (data) => setModalOption(data) + /** + * Función para mostrar una notificación de éxito. + * + * @function + * @name notify + * @returns {void} + * + * @example + * notify(); + */ const notify = () => { toast.success('Archivo excel leído correctamente', { position: 'top-right', @@ -81,6 +162,16 @@ export const RegisterList = () => { }) } + /** + * Función para cerrar el modal. + * + * @function + * @name handleCloseModal + * @returns {void} + * + * @example + * handleCloseModal(); + */ const handleCloseModal = () => { excelRef.current.value = '' setModalOption(modalOptionList.confirmModal) @@ -88,6 +179,18 @@ export const RegisterList = () => { setIsModalOpen(!isModalOpen) } + /** + * Función para obtener los registros. + * + * @async + * @function + * @name getRegistros + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getRegistros(); + */ const getRegistros = async () => { try { const response = await getInscriptions() @@ -108,6 +211,18 @@ export const RegisterList = () => { if (modalOption === modalOptionList.loadingExcelModal) readExcelFile() }, [modalOption]) + /** + * Función para leer un archivo de Excel. + * + * @async + * @function + * @name readExcelFile + * @throws {Error} Error en caso de fallo en la lectura del archivo. + * @returns {void} + * + * @example + * readExcelFile(); + */ const readExcelFile = async () => { const { files } = excelRef.current const file = files[0] @@ -125,6 +240,20 @@ export const RegisterList = () => { }, 1000) } + /** + * Función para cargar un archivo de Excel. + * + * @async + * @function + * @name uploadExcelFile + * @param {Object} payload - Datos a enviar. + * @param {string} code - Código de la operación. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * uploadExcelFile(datos, 'codigoOperacion'); + */ const uploadExcelFile = async (payload, code) => { try { await InscriptionApprentice(payload) @@ -145,6 +274,16 @@ export const RegisterList = () => { } } + /** + * Función para manejar la carga de un archivo de Excel. + * + * @function + * @name handleExcelFile + * @returns {void} + * + * @example + * handleExcelFile(); + */ const handleExcelFile = () => { const { files } = excelRef.current if (files.length === 0) { @@ -160,10 +299,30 @@ export const RegisterList = () => { setIsModalOpen(!isModalOpen) } + /** + * Función para mostrar u ocultar el filtro. + * + * @function + * @name handleFilter + * @returns {void} + * + * @example + * handleFilter(); + */ const handleFilter = () => { setShowFiltros(!showFiltros) } + /** + * Función para desactivar la visualización del filtro. + * + * @function + * @name disableShowFiltros + * @returns {void} + * + * @example + * disableShowFiltros(); + */ const disableShowFiltros = () => { setTimeout(() => { setShowFiltros(false) @@ -171,12 +330,35 @@ export const RegisterList = () => { }, 100) } + /** + * Función para mostrar un tipo de filtro (modalidad, estado, fecha). + * + * @function + * @name ShowFilter + * @param {string} filterType - Tipo de filtro a mostrar. + * @returns {void} + * + * @example + * ShowFilter('modalidad'); + */ const ShowFilter = (filterType) => { if (filterType === 'modalidad') setFiltersButtons({ modalidad: !filtersButtons.modalidad, etapa: false, fecha: false }) if (filterType === 'estado') setFiltersButtons({ estado: !filtersButtons.estado, modalidad: false, fecha: false }) if (filterType === 'fecha') setFiltersButtons({ fecha: !filtersButtons.fecha, modalidad: false, estado: false }) } + /** + * Función para manejar el tipo de filtro (modalidad, estado, fecha). + * + * @function + * @name handleTypeFilter + * @param {string} filterType - Tipo de filtro a aplicar. + * @param {string} filter - Valor del filtro. + * @returns {void} + * + * @example + * handleTypeFilter('modalidad', 'Presencial'); + */ const handleTypeFilter = (filterType, filter) => { if (filterType === 'modalidad') { const filterMap = inscriptionOriginal.filter((inscription) => inscription.nombre_modalidad === filter) @@ -190,6 +372,16 @@ export const RegisterList = () => { setActiveFilter(true) } + /** + * Función para restablecer los filtros. + * + * @function + * @name handleResetFilter + * @returns {void} + * + * @example + * handleResetFilter(); + */ const handleResetFilter = () => { setInscriptions(inscriptionOriginal) disableShowFiltros() diff --git a/client/src/components/Register-student/RegisterStudent.jsx b/client/src/components/Register-student/RegisterStudent.jsx index 48e4c320..89b5f774 100644 --- a/client/src/components/Register-student/RegisterStudent.jsx +++ b/client/src/components/Register-student/RegisterStudent.jsx @@ -31,30 +31,54 @@ export const RegisterStudent = () => { const formRef = useRef(null) const fileInputRef = useRef(null) - // const [formData, setFormData] = useState({}) - // const [formDirty, setFormDirty] = useState(false) - // const history = useHistory() - const token = Cookies.get('token') const decoded = jwtdecoded(token) const id = decoded.data.user.id_usuario + + /** + * Función para manejar el cambio de archivo. + * + * @function + * @name handleFileChange + * @param {Object} e - Evento de cambio de archivo. + * @returns {void} + * + * @example + * const eventoCambioArchivo = e; + * handleFileChange(eventoCambioArchivo); + */ const handleFileChange = (e) => { const file = e.target.files[0] setSelectedFiles(file) } - // Manejador para cambios en los campos del formulario - // const handleInputChange = (event) => { - // const { name, value } = event.target - // setFormData((prevData) => ({ ...prevData, [name]: value })) - // setFormDirty(true) // Se activa cuando hay cambios en los campos - // } + /** + * Función para cambiar la sección visible entre empresa y aprendiz. + * + * @function + * @name handleChangeSection + * @param {string} section - Sección a mostrar. + * @returns {void} + * + * @example + * handleChangeSection('empresa'); + */ const handleChangeSection = (section) => { setShowDataEmpresa(section === 'empresa') setShowDataAprendiz(section === 'aprendiz') } + /** + * Estado local para almacenar los valores seleccionados en los select del formulario. + * + * @constant + * @name selectedValues + * @type {Object} + * + * @example + * const valoresSeleccionados = selectedValues; + */ const [selectedValues, setSelectedValues] = useState({ tipo_documento_inscripcion: '', modalidad_inscripcion: '', @@ -64,9 +88,18 @@ export const RegisterStudent = () => { arl: '' }) - // ... - - // Define una función para actualizar los valores seleccionados + /** + * Función para actualizar los valores seleccionados. + * + * @function + * @name handleSelectChange + * @param {string} name - Nombre del valor seleccionado. + * @param {string} value - Valor seleccionado. + * @returns {void} + * + * @example + * handleSelectChange('modalidad_inscripcion', 'Presencial'); + */ const handleSelectChange = (name, value) => { setSelectedValues((prevValues) => ({ ...prevValues, @@ -74,7 +107,19 @@ export const RegisterStudent = () => { })) } - // Validación de campos y capturación de los valores + /** + * Función para manejar el envío del formulario. + * + * @async + * @function + * @name handleSubmit + * @param {Object} e - Evento de envío del formulario. + * @returns {void} + * + * @example + * const eventoEnvioFormulario = e; + * handleSubmit(eventoEnvioFormulario); + */ const handleSubmit = async (e) => { e.preventDefault() // capturar los valores de los inputs del formulario @@ -92,7 +137,6 @@ export const RegisterStudent = () => { const classNumber = formValues.id_ficha_inscripcion const archivo = formValues.link_documentos.name - formValues.fecha_creacion = Date.now() formValues.observaciones = observation formValues.link_documentos = archivo @@ -104,19 +148,6 @@ export const RegisterStudent = () => { formValues.id_instructor_lider_inscripcion = response } - // if (archivo) { - // try { - // const res = await saveDocuments(archivo) - // const response = res.data - // // formValues(prevFormValues => ({ - // // ...prevFormValues, - // // link_documentos: response - // // })); - // } catch (error) { - // console.error('Error al guardar documentos:', error) - // } - // } - if (classNumber) { const res = await GetClassByNumber(classNumber) const response = res.data.data[0].id_ficha @@ -148,14 +179,13 @@ export const RegisterStudent = () => { // validar que los campos de tipo number sean numeros ValidateInputsTypeNumber(formValues.numero_documento_inscripcion, formValues.numero_telefono_inscripcion, formValues.numero_ficha_inscripcion) - // validar que el numero de documento sea valido // enviar los datos al backend const responsable_inscripcion = `${decoded.data.user.nombres_usuario} ${decoded.data.user.apellidos_usuario}` const estado_general_inscripcion = 'Pendiente' - const form = {...formValues, responsable_inscripcion, estado_general_inscripcion } + const form = { ...formValues, responsable_inscripcion, estado_general_inscripcion } const dataToSend = Array(form) const data = await sendDataInscription(dataToSend) // mostramos una alerta de exito @@ -167,14 +197,35 @@ export const RegisterStudent = () => { deleteData() } - // enviar los datos al backend + /** + * Función para enviar los datos de inscripción al backend. + * + * @async + * @function + * @name sendDataInscription + * @param {Object[]} data - Datos de inscripción a enviar. + * @returns {Promise} - Mensaje de respuesta del backend. + * + * @example + * const datosInscripcion = [{ /* ... *\/ }]; + * const respuesta = await sendDataInscription(datosInscripcion); + */ const sendDataInscription = async (data) => { const response = await InscriptionApprentice(data) const { message } = response.data return message } - // vaciar los inputs + /** + * Función para vaciar los campos del formulario. + * + * @function + * @name deleteData + * @returns {void} + * + * @example + * deleteData(); + */ const deleteData = () => { if (formRef.current) { formRef.current.reset() @@ -184,8 +235,16 @@ export const RegisterStudent = () => { } } - // Leer archivo excel - // TODO: Cambiar el lector de excel porque este NO FUNCIONA + /** + * Función para manejar el cambio de archivo Excel. + * + * @function + * @name handleExcelFile + * @returns {void} + * + * @example + * handleExcelFile(); + */ const handleExcelFile = () => { const currentFile = excelFileRef.current.files[0] @@ -317,7 +376,7 @@ export const RegisterStudent = () => { /> ) : item.type === 'textarea' ? (
    - +
    ) : ( diff --git a/client/src/components/Search/Search.jsx b/client/src/components/Search/Search.jsx index 2f49707a..1d03c7c8 100644 --- a/client/src/components/Search/Search.jsx +++ b/client/src/components/Search/Search.jsx @@ -7,6 +7,17 @@ const Search = ({ searchStudent, searchFilter = false, filter = false, icon = fa const search = useRef() const debounceTimeout = useRef(null) + /** + * Función para manejar la búsqueda con debounce. + * + * @function + * @name handleSearch + * @param {Event} e - Evento de búsqueda. + * @returns {void} + * + * @example + * handleSearch(event); + */ const handleSearch = (e) => { e.preventDefault() const searchTerm = search.current.value @@ -17,10 +28,31 @@ const Search = ({ searchStudent, searchFilter = false, filter = false, icon = fa }, 200) } + /** + * Función de evento para prevenir el comportamiento predeterminado. + * + * @function + * @name evnt + * @param {Event} e - Evento. + * @returns {void} + * + * @example + * evnt(event); + */ const evnt = (e) => { e.preventDefault() } + /** + * Efecto de limpieza para cancelar el temporizador de debounce. + * + * @function + * @name cleanupEffect + * @returns {void} + * + * @example + * cleanupEffect(); + */ useEffect(() => { return () => { clearTimeout(debounceTimeout.current) diff --git a/client/src/components/Siderbar/Sidebar.jsx b/client/src/components/Siderbar/Sidebar.jsx index 9d60ca75..7ec71522 100644 --- a/client/src/components/Siderbar/Sidebar.jsx +++ b/client/src/components/Siderbar/Sidebar.jsx @@ -20,6 +20,16 @@ const Siderbar = () => { const { setUserId } = userStore() const { userId } = userStore() + /** + * Efecto para manejar el redimensionamiento de la ventana y la apertura/cierre del menú en pantallas pequeñas. + * + * @function + * @name handleResize + * @returns {void} + * + * @example + * handleResize(); + */ useEffect(() => { const handleResize = () => { const isSmallScreen = window.innerWidth < 640 @@ -34,11 +44,41 @@ const Siderbar = () => { } }, []) + /** + * Obtener el ID de rol almacenado en el almacenamiento local. + * + * @constant + * @name idRol + * @type {number} + * + * @example + * const idRol = idRol; + */ const idRol = Number(localStorage.getItem('idRol')) + /** + * Función para eliminar el ID de rol del almacenamiento local. + * + * @function + * @name removeIdRolFromLocalStorage + * @returns {void} + * + * @example + * removeIdRolFromLocalStorage(); + */ const removeIdRolFromLocalStorage = () => { localStorage.removeItem('idRol') } + /** + * Efecto para manejar la autenticación del usuario y cargar sus datos. + * + * @function + * @name handleAuthentication + * @returns {void} + * + * @example + * handleAuthentication(); + */ useEffect(() => { const token = Cookies.get('token') @@ -61,16 +101,48 @@ const Siderbar = () => { } }, []) + /** + * Función para cerrar la sesión del usuario. + * + * @function + * @name logout + * @returns {void} + * + * @example + * logout(); + */ const logout = () => { Cookies.remove('token') removeIdRolFromLocalStorage() navigate('/') } + /** + * Función para aplicar estilos a un elemento en función de la ruta actual. + * + * @function + * @name styles + * @param {string} path - Ruta de destino. + * @returns {string} - Clases CSS aplicadas. + * + * @example + * const className = styles('/ruta'); + */ const styles = (path) => { return location.pathname === path ? 'flex items-center relative pl-10 py-2 font-semibold bg-white rounded-s-2xl w-[115%] h-8' : 'flex items-center relative pl-10 py-2 hover:bg-white rounded-s-2xl w-[115%] h-8 transition ' } + /** + * Función para aplicar estilos a un elemento span en función de la ruta actual. + * + * @function + * @name spanStyle + * @param {string} path - Ruta de destino. + * @returns {string} - Clases CSS aplicadas. + * + * @example + * const spanClassName = spanStyle('/ruta'); + */ const spanStyle = (path) => { const color = colorIcon[path] return location.pathname === path ? `absolute inset-y-0 left-0 flex items-center ${open === true ? 'pl-3 text-md' : 'pl-5 text-lg'} font-bold ${color}` : `absolute inset-y-0 left-0 flex items-center ${open === true ? 'pl-3 text-sm' : 'pl-5 text-md'} ` diff --git a/client/src/components/Student-monitoring/StudentMonitoring.jsx b/client/src/components/Student-monitoring/StudentMonitoring.jsx index 89e5b698..d9f4adfd 100644 --- a/client/src/components/Student-monitoring/StudentMonitoring.jsx +++ b/client/src/components/Student-monitoring/StudentMonitoring.jsx @@ -26,23 +26,79 @@ export const StudentMonitoring = () => { const [pageNumber, setPageNumber] = useState(0) const [dates, setDates] = useState({}) + /** + * Función para manejar el clic en el icono. + * + * @function + * @name handleIconClick + * @returns {void} + * + * @example + * handleIconClick(); + */ const handleIconClick = () => { setModalFilter(!modalFilter) } + /** + * Función para manejar el modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { setModalFilter(!modalFilter) } + /** + * Función asincrónica para mostrar el modal del estudiante y obtener sus datos. + * + * @async + * @function + * @name modalStudent + * @param {string} userID - ID del usuario del estudiante. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * modalStudent('12345'); + */ const modalStudent = async (userID) => { setInfoStudent(true) getUser(userID) } + /** + * Función para manejar el modal de información del estudiante. + * + * @function + * @name handleModalInfo + * @returns {void} + * + * @example + * handleModalInfo(); + */ const handleModalInfo = () => { setInfoStudent(!infoStudent) } + /** + * Función asincrónica para obtener los datos del usuario por su ID. + * + * @async + * @function + * @name getUser + * @param {string} userID - ID del usuario. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getUser('12345'); + */ const getUser = async (userID) => { try { const response = await GetStudentsDetailById(userID) @@ -55,6 +111,19 @@ export const StudentMonitoring = () => { } } + /** + * Función asincrónica para buscar aprendices por nombre de usuario. + * + * @async + * @function + * @name searchApprentices + * @param {string} searchTerm - Término de búsqueda para el aprendiz. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * searchApprentices('John Doe'); + */ const searchApprentices = async (searchTerm) => { if (searchTerm.trim() === '') { setError(null) @@ -79,6 +148,18 @@ export const StudentMonitoring = () => { } } + /** + * Función asincrónica para obtener la lista de aprendices. + * + * @async + * @function + * @name getApprentices + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getApprentices(); + */ const getApprentices = async () => { try { const response = await detailInfoStudents() @@ -94,14 +175,62 @@ export const StudentMonitoring = () => { getApprentices() }, []) - // const filterStudents = filter.filterStudents - + /** + * Número de aprendices a mostrar por página. + * + * @constant + * @name studentsPerPage + * @type {number} + * @default 6 + * + * @example + * const aprendicesPorPagina = studentsPerPage; + */ const studentsPerPage = 6 + /** + * Calcula el número de páginas necesarias para la paginación de aprendices. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const numeroDePaginas = pageCount; + */ const pageCount = Math.ceil(apprentices.length / studentsPerPage) - + /** + * Índice de inicio de la lista de aprendices a mostrar en la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * studentsPerPage + /** + * Índice de fin de la lista de aprendices a mostrar en la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + studentsPerPage + /** + * Opciones de modalidades para filtrar aprendices. + * + * @constant + * @name option + * @type {Array} + * + * @example + * const opcionesModalidades = option; + */ const option = modalities.map((modality) => ({ value: modality.name, key: modality.value diff --git a/client/src/components/Students/Students.jsx b/client/src/components/Students/Students.jsx index 755fb1bc..38ecea11 100644 --- a/client/src/components/Students/Students.jsx +++ b/client/src/components/Students/Students.jsx @@ -30,6 +30,19 @@ export const Students = () => { const [activeFilter, setActiveFilter] = useState(false) const [loadingData, setLoadingData] = useState({ course: true, students: true }) + /** + * Función asincrónica para obtener la lista de estudiantes por curso. + * + * @async + * @function + * @name getStudents + * @param {number} payload - Número de curso. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getStudents(123); + */ const getStudents = async (payload) => { try { const response = await GetStudentsByCourse(payload) @@ -46,6 +59,19 @@ export const Students = () => { getCourseData(courseNumber) }, []) + /** + * Función asincrónica para obtener los detalles del curso. + * + * @async + * @function + * @name getCourseData + * @param {number} payload - Número de curso. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getCourseData(123); + */ const getCourseData = async (payload) => { try { const response = await GetClassByNumber(payload) @@ -59,6 +85,19 @@ export const Students = () => { const handleStateModal = () => setShowModalStudent(false) + /** + * Función asincrónica para obtener la información detallada de un estudiante por su ID. + * + * @async + * @function + * @name handleDetailInfoStudent + * @param {number} id - ID del estudiante. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * handleDetailInfoStudent(456); + */ const handleDetailInfoStudent = async (id) => { try { setShowModalStudent(true) @@ -72,12 +111,62 @@ export const Students = () => { } } + /** + * Número de estudiantes a mostrar por página. + * + * @constant + * @name studentsPerPage + * @type {number} + * @default 5 + * + * @example + * const estudiantesPorPagina = studentsPerPage; + */ const studentsPerPage = 5 + /** + * Calcula el número de páginas necesarias para la paginación. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const numeroDePaginas = pageCount; + */ const pageCount = Math.ceil(studentsCourse.length / studentsPerPage) - + /** + * Índice de inicio de la lista de estudiantes a mostrar en la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * studentsPerPage + /** + * Índice de fin de la lista de estudiantes a mostrar en la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + studentsPerPage + /** + * Deshabilita la visualización de los filtros después de un breve retraso. + * + * @function + * @name disableShowFiltros + * @returns {void} + * + * @example + * disableShowFiltros(); + */ const disableShowFiltros = () => { setTimeout(() => { setShowFiltros(false) @@ -85,15 +174,48 @@ export const Students = () => { }, 100) } + /** + * Maneja la visualización de los filtros. + * + * @function + * @name handleShowFiltros + * @returns {void} + * + * @example + * handleShowFiltros(); + */ const handleShowFiltros = () => { setShowFiltros(!showFiltros) } + /** + * Muestra u oculta el filtro especificado. + * + * @function + * @name ShowFilter + * @param {string} filterType - Tipo de filtro ('modalidad' o 'estado'). + * @returns {void} + * + * @example + * ShowFilter('modalidad'); + */ const ShowFilter = (filterType) => { if (filterType === 'modalidad') setFiltersButtons({ modalidad: !filtersButtons.modalidad, etapa: false }) if (filterType === 'estado') setFiltersButtons({ etapa: !filtersButtons.etapa, modalidad: false }) } + /** + * Maneja la selección de filtro de modalidad o estado y actualiza la lista de estudiantes. + * + * @function + * @name handleModalidadFilter + * @param {string} filterType - Tipo de filtro ('modalidad' o 'estado'). + * @param {string} filter - Valor del filtro seleccionado. + * @returns {void} + * + * @example + * handleModalidadFilter('modalidad', 'Presencial'); + */ const handleModalidadFilter = (filterType, filter) => { if (filterType === 'modalidad') { const filterMap = studentsCourseOriginal.filter((student) => student.nombre_modalidad === filter) @@ -107,6 +229,16 @@ export const Students = () => { setActiveFilter(true) } + /** + * Restablece los filtros y muestra la lista original de estudiantes. + * + * @function + * @name handleResetFilter + * @returns {void} + * + * @example + * handleResetFilter(); + */ const handleResetFilter = () => { setStudentsCourse(studentsCourseOriginal) disableShowFiltros() diff --git a/client/src/components/Teacher-class/TeacherClass.jsx b/client/src/components/Teacher-class/TeacherClass.jsx index b859fb5c..96f6a25f 100644 --- a/client/src/components/Teacher-class/TeacherClass.jsx +++ b/client/src/components/Teacher-class/TeacherClass.jsx @@ -26,6 +26,19 @@ export const TeacherClass = () => { getUser(id) }, [id]) + /** + * Función asincrónica para obtener el rol del usuario por su ID. + * + * @async + * @function + * @name getUser + * @param {number} id - ID del usuario. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getUser(123); + */ const getUser = async (id) => { try { const response = await getUserById(id) @@ -36,6 +49,15 @@ export const TeacherClass = () => { } } + /** + * Efecto secundario para obtener y establecer la lista de clases del usuario según su rol. + * + * @function + * @name useEffect + * @param {number} rol - Rol del usuario (3 o 4). + * @param {number} id - ID del usuario. + * @returns {void} + */ useEffect(() => { if (rol && (rol === 3 || rol === 4)) { const apiRoute = rol === 3 ? 'getClassByTeacherId' : 'getClassByLiderTeacherId' @@ -54,6 +76,19 @@ export const TeacherClass = () => { } }, [rol, id]) + /** + * Función para obtener los datos de las clases según el rol y el ID del usuario. + * + * @function + * @name getClassData + * @param {number} id - ID del usuario. + * @param {string} apiRoute - Ruta de la API para obtener los datos de las clases. + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {Promise} Promesa que devuelve los datos de las clases. + * + * @example + * getClassData(123, 'getClassByTeacherId'); + */ const getClassData = async (id, apiRoute) => { return (await apiRoute) === 'getClassByTeacherId' ? getClassByTeacherId(id) : getClassByLiderTeacherId(id) } @@ -62,9 +97,50 @@ export const TeacherClass = () => { setLoading(false) }, []) + /** + * Número de cursos a mostrar por página. + * + * @constant + * @name coursesPerPage + * @type {number} + * @default 6 + * + * @example + * const cursosPorPagina = coursesPerPage; + */ const coursesPerPage = 6 + /** + * Calcula el número de páginas necesarias para la paginación de cursos. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const numeroDePaginas = pageCount; + */ const pageCount = Math.ceil(teacherClass.length / coursesPerPage) + /** + * Índice de inicio de la lista de cursos a mostrar en la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * coursesPerPage + /** + * Índice de fin de la lista de cursos a mostrar en la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + coursesPerPage return ( diff --git a/client/src/components/Teachers/Teachers.jsx b/client/src/components/Teachers/Teachers.jsx index 40eda720..cbf11421 100644 --- a/client/src/components/Teachers/Teachers.jsx +++ b/client/src/components/Teachers/Teachers.jsx @@ -18,6 +18,18 @@ export const Teachers = () => { const [loading, setLoading] = useState(true) const [teacher, setTeacher] = useState([]) + /** + * Función asincrónica para obtener la lista de instructores. + * + * @async + * @function + * @name getInstructores + * @throws {Error} Error en caso de fallo en la solicitud. + * @returns {void} + * + * @example + * getInstructores(); + */ const getInstructores = async () => { try { const response = await getTeachers() @@ -32,14 +44,63 @@ export const Teachers = () => { getInstructores() }, []) + /** + * Número de instructores a mostrar por página. + * + * @constant + * @name instructoresPerPage + * @type {number} + * @default 8 + * + * @example + * const instructoresPorPagina = instructoresPerPage; + */ const instructoresPerPage = 8 + /** + * Calcula el número de páginas necesarias para la paginación de instructores. + * + * @constant + * @name pageCount + * @type {number} + * + * @example + * const numeroDePaginas = pageCount; + */ const pageCount = Math.ceil(teacher.length / instructoresPerPage) - + /** + * Mapea los colores para las filas impares de la lista de instructores. + * + * @constant + * @name allColors + * @type {Array} + * + * @example + * const coloresFilasImpares = allColors; + */ const allColors = teacher.map((_, index) => ({ ...colorsOddRow[index % colorsOddRow.length] })) - + /** + * Índice de inicio de la lista de instructores a mostrar en la página actual. + * + * @constant + * @name startIndex + * @type {number} + * + * @example + * const indiceInicio = startIndex; + */ const startIndex = pageNumber * instructoresPerPage + /** + * Índice de fin de la lista de instructores a mostrar en la página actual. + * + * @constant + * @name endIndex + * @type {number} + * + * @example + * const indiceFin = endIndex; + */ const endIndex = startIndex + instructoresPerPage const navigate = useNavigate() @@ -48,6 +109,17 @@ export const Teachers = () => { setLoading(false) }, []) + /** + * Función para navegar a la página de fichas de instructor por su ID. + * + * @function + * @name handleCourse + * @param {number} id - ID del instructor. + * @returns {void} + * + * @example + * handleCourse(123); + */ const handleCourse = (id) => { return navigate(`/fichas-instructor/${id}`) } diff --git a/client/src/components/User/User.jsx b/client/src/components/User/User.jsx index fcdb390d..5457d9b8 100644 --- a/client/src/components/User/User.jsx +++ b/client/src/components/User/User.jsx @@ -13,6 +13,18 @@ const User = () => { const idRol = Number(localStorage.getItem('idRol')) const cookie = Cookies.get('token') + /** + * Función asincrónica para redirigir al usuario a la página de inicio si ya está autenticado. + * + * @async + * @function + * @name earlyReturn + * @throws {Error} Redirección si el usuario ya está autenticado. + * @returns {void} + * + * @example + * earlyReturn(); + */ const earlyReturn = async () => { if (idRol && cookie) goto('/home', { replace: true }) } @@ -25,6 +37,16 @@ const User = () => { const divRef = useRef(null) + /** + * Configuración del formulario de inicio de sesión. + * + * @constant + * @name loginForm + * @type {Array} + * + * @example + * const configuracionFormularioLogin = loginForm; + */ const loginForm = [ { icon: , @@ -39,6 +61,16 @@ const User = () => { nameInput: 'contrasena' } ] + /** + * Configuración del formulario de registro. + * + * @constant + * @name registerForm + * @type {Array} + * + * @example + * const configuracionFormularioRegistro = registerForm; + */ const registerForm = [ { icon: , placeholder: '1017924888', type: 'text', nameInput: 'num_documento' }, { icon: , placeholder: 'Juan', type: 'text', nameInput: 'nombre' }, @@ -47,8 +79,29 @@ const User = () => { { icon: , placeholder: '********', type: 'password', nameInput: 'contrasena' } ] + /** + * Estado para controlar el botón seleccionado ('login' o 'register'). + * + * @state + * @name selectedButton + * @type {string} + * + * @example + * const botonSeleccionado = selectedButton; + */ const [selectedButton, setSelectedButton] = useState('login') + /** + * Función para manejar el cambio de botón seleccionado ('login' o 'register'). + * + * @function + * @name handleButtonClick + * @param {string} button - Botón seleccionado. + * @returns {void} + * + * @example + * handleButtonClick('login'); + */ const handleButtonClick = (button) => { setSelectedButton(button) } @@ -61,6 +114,16 @@ const User = () => { } }, [selectedButton]) + /** + * Títulos para las secciones de inicio de sesión y registro. + * + * @constant + * @name title + * @type {Object} + * + * @example + * const titulos = title; + */ const title = { login: 'Bienvenido de vuelta', register: 'Bienvenido a SENA' diff --git a/client/src/components/Utils/Card/Card.jsx b/client/src/components/Utils/Card/Card.jsx index 9b03f541..afb37037 100644 --- a/client/src/components/Utils/Card/Card.jsx +++ b/client/src/components/Utils/Card/Card.jsx @@ -3,11 +3,7 @@ import { Link } from 'react-router-dom' // Icons import { BsJournalBookmark } from 'react-icons/bs' -export const Card = ({ title, titleColor, description, buttonText, bgColor = 'bg-white', link, scale, subtitle, shadow, cardHome = false, cardVisits = false, borderColor, roundedLink, info1, info2, icon, isButton = false, showModal, modalClicked, transition = 'transition-none', userID, height = 'h-auto', width = 'w-auto', shadowColor }) => { - const userInfo = () => { - modalClicked(userID) - } - +export const Card = ({ title, titleColor, description, buttonText, bgColor = 'bg-white', link, scale, subtitle, shadow, cardHome = false, cardVisits = false, borderColor, roundedLink, info1, info2, icon, isButton = false, showModal, transition = 'transition-none', height = 'h-auto', width = 'w-auto', shadowColor }) => { return (
    @@ -35,11 +31,7 @@ export const Card = ({ title, titleColor, description, buttonText, bgColor = 'bg {buttonText} )} - {isButton && showModal && ( - - )} + {isButton && showModal && }
    ) } @@ -109,4 +101,3 @@ export const CardStudent = ({ nameStudent, emailStudent, programStudent, courseS ) } - diff --git a/client/src/components/Utils/Modals/Modals.jsx b/client/src/components/Utils/Modals/Modals.jsx index 2e691020..0aea5acc 100644 --- a/client/src/components/Utils/Modals/Modals.jsx +++ b/client/src/components/Utils/Modals/Modals.jsx @@ -13,6 +13,16 @@ import { modalOptionList } from '../../Register-list/RegisterList' import { getTeachers, inscriptionDetailsUpdate, updateTeacherSeguimiento } from '../../../api/httpRequest' const BitacoraModal = ({ closeModal, title }) => { + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } @@ -73,6 +83,16 @@ const BitacoraModal = ({ closeModal, title }) => { } const FilterModal = ({ closeModal, width = 'w-2/5', title, children }) => { + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } @@ -94,15 +114,45 @@ const FilterModal = ({ closeModal, width = 'w-2/5', title, children }) => { } const PasswordModal = ({ closeModal, title }) => { + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } + /** + * Iconos para mostrar y ocultar la contraseña. + * + * @constant + * @name passwordIcons + * @type {object} + * + * @example + * const iconosContraseña = passwordIcons; + */ const passwordIcons = { openEye: , closeEye: } + /** + * Estados para mostrar u ocultar contraseñas. + * + * @constant + * @name passwordStatus + * @type {object} + * + * @example + * const estadosContraseña = passwordStatus; + */ const passwordStatus = { shown: 'text', hidden: 'password' @@ -113,10 +163,52 @@ const PasswordModal = ({ closeModal, title }) => { const [showConfirmPassword, setShowConfirmPassword] = useState(passwordStatus.hidden) const formValuesRef = useRef({}) + /** + * Función para manejar el cambio de visibilidad de la antigua contraseña. + * + * @function + * @name handleOldPassword + * @returns {void} + * + * @example + * handleOldPassword(); + */ const handleOldPassword = () => (showOldPassword === passwordStatus.shown ? setShowOldPassword(passwordStatus.hidden) : setShowOldPassword(passwordStatus.shown)) + /** + * Función para manejar el cambio de visibilidad de la nueva contraseña. + * + * @function + * @name handleNewPassword + * @returns {void} + * + * @example + * handleNewPassword(); + */ const handleNewPassword = () => (showNewPassword === passwordStatus.shown ? setShowNewPassword(passwordStatus.hidden) : setShowNewPassword(passwordStatus.shown)) + /** + * Función para manejar el cambio de visibilidad de la confirmación de contraseña. + * + * @function + * @name handleConfirmPassword + * @returns {void} + * + * @example + * handleConfirmPassword(); + */ const handleConfirmPassword = () => (showConfirmPassword === passwordStatus.shown ? setShowConfirmPassword(passwordStatus.hidden) : setShowConfirmPassword(passwordStatus.shown)) + /** + * Función para manejar el cambio en la entrada de datos del formulario. + * + * @function + * @name handleInputChange + * @param {Event} e - Evento de cambio de entrada de datos. + * @param {number} index - Índice del elemento en el formulario. + * @returns {void} + * + * @example + * handleInputChange(event, 0); + */ const handleInputChange = (e, index) => { const { name, value } = e.target formValuesRef.current = { @@ -193,6 +285,16 @@ const PasswordModal = ({ closeModal, title }) => { } const InfoStudentModal = ({ closeModal, title, emailStudent, documentStudent, cellPhoneNumber, program, courseNumber, academicLevel, formationStage, modalitie, lectivaEnd, productiveStart, company, innmediateSuperior, positionSuperior, emailSuperior, celphoneSuperior, arl }) => { + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } @@ -287,12 +389,33 @@ const InfoStudentModal = ({ closeModal, title, emailStudent, documentStudent, ce } const AsignTeacherModal = ({ closeModal, title, numero_ficha, programa_formacion, setNotify }) => { + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } const [teachers, setTeacher] = useState([]) + const [selectedOptionKey, setSelectedOptionKey] = useState('') + /** + * Función para obtener la lista de instructores. + * + * @function + * @name getInstructores + * @returns {void} + * + * @example + * getInstructores(); + */ const getInstructores = async () => { try { const response = await getTeachers() @@ -307,17 +430,47 @@ const AsignTeacherModal = ({ closeModal, title, numero_ficha, programa_formacion getInstructores() }, []) + /** + * Opciones de instructores para un select. + * + * @constant + * @name option + * @type {array} + * + * @example + * const opcionesInstructores = option; + */ const option = teachers.map((teacher) => ({ value: teacher.nombres_usuario + ' ' + teacher.apellidos_usuario + ' - ' + teacher.email_usuario, key: teacher.id_usuario })) - const [selectedOptionKey, setSelectedOptionKey] = useState('') - + /** + * Función para manejar el cambio de opción seleccionada en el select. + * + * @function + * @name handleSelectChange + * @param {string} optionKey - Clave de la opción seleccionada. + * @returns {void} + * + * @example + * handleSelectChange('claveOpcion'); + */ const handleSelectChange = (optionKey) => { setSelectedOptionKey(optionKey) } + /** + * Función para actualizar el instructor asignado. + * + * @function + * @name updateTeacher + * @param {Event} e - Evento de envío del formulario. + * @returns {void} + * + * @example + * updateTeacher(event); + */ const updateTeacher = async (e) => { e.preventDefault() @@ -382,10 +535,30 @@ const AsignTeacherModal = ({ closeModal, title, numero_ficha, programa_formacion } const ModalConfirm = ({ closeModal, title, loadingFile, setModalOption }) => { + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } + /** + * Función para continuar con la carga de un archivo. + * + * @function + * @name continueLoadFile + * @returns {void} + * + * @example + * continueLoadFile(); + */ const continueLoadFile = () => { setModalOption(modalOptionList.loadingExcelModal) } @@ -426,10 +599,31 @@ const ModalConfirm = ({ closeModal, title, loadingFile, setModalOption }) => { const DenyModal = ({ closeModal, title, id, setNotify }) => { const formRef = useRef() + /** + * Función para manejar el cierre del modal. + * + * @function + * @name handleModal + * @returns {void} + * + * @example + * handleModal(); + */ const handleModal = () => { closeModal() } + /** + * Función para manejar el envío del formulario. + * + * @function + * @name handleForm + * @param {Event} e - Evento de envío del formulario. + * @returns {void} + * + * @example + * handleForm(event); + */ const handleForm = async (e) => { e.preventDefault() const formData = new FormData(formRef.current) diff --git a/client/src/components/Utils/Select/Select.jsx b/client/src/components/Utils/Select/Select.jsx index abf18b5b..db4a1bbb 100644 --- a/client/src/components/Utils/Select/Select.jsx +++ b/client/src/components/Utils/Select/Select.jsx @@ -7,6 +7,20 @@ export const Select = ({ options, placeholder, placeholderSearch, hoverColor, ho const [open, setOpen] = useState(false) const [selected, setSelected] = useState('') + /** + * Función para manejar la selección de una opción. + * + * @function + * @name handleSelectOption + * @param {object} option - Opción seleccionada. + * @param {string} option.key - Clave de la opción. + * @param {string} option.value - Valor de la opción. + * @returns {void} + * + * @example + * const opcionSeleccionada = { key: 'clave', value: 'valor' }; + * handleSelectOption(opcionSeleccionada); + */ const handleSelectOption = (option) => { if (onChange) { onChange(option.key) diff --git a/client/src/import/staticData.jsx b/client/src/import/staticData.jsx index d1683f25..ab76ed1a 100644 --- a/client/src/import/staticData.jsx +++ b/client/src/import/staticData.jsx @@ -1,5 +1,15 @@ import { LuCalendarCheck2, LuCalendarX2 } from 'react-icons/lu' +/** + * @description Nombres de roles y sus correspondientes identificadores. + * @type {object} + * @property {string} 1 - Líder prácticas + * @property {string} 2 - Coordinador + * @property {string} 3 - Instructor de Seguimiento + * @property {string} 4 - Instructor Líder + * @example + * const nombreRol = rolesNames[1]; // Devuelve 'Líder prácticas' + */ export const rolesNames = { 1: 'Líder prácticas', 2: 'Coordinador', @@ -15,10 +25,18 @@ export const colorTextStatus = { export const keysRoles = Object.keys(rolesNames) -/* - * src: src\components\Home\Home.jsx +/** + * @src src\components\Home\Home.jsx + * + * @description Datos de tarjetas de roles. + * @type {object} + * @property {Array} 1 - Datos de tarjetas para el rol 1 + * @property {Array} 2 - Datos de tarjetas para el rol 2 + * @property {Array} 3 - Datos de tarjetas para el rol 3 + * @property {Array} 4 - Datos de tarjetas para el rol 4 + * @example + * const tarjetas = rolesCard[1]; // Devuelve un arreglo de objetos con datos de tarjetas para el rol 1 */ - export const rolesCard = { 1: [ { @@ -210,8 +228,15 @@ export const rolesCard = { ] } -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src \components\Register-student\RegisterStudent.jsx + * + * @description Datos de inscripción de estudiantes. + * @type {object} + * @property {Array} dataAprendiz - Datos de inscripción del aprendiz + * @property {Array} dataEmpresa - Datos de inscripción de la empresa + * @example + * const datosAprendiz = dataInscription.dataAprendiz; // Devuelve un arreglo de objetos con datos de inscripción del aprendiz */ export const dataInscription = { dataAprendiz: [ @@ -384,8 +409,13 @@ export const dataInscription = { ] } -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src src\components\Register-student\RegisterStudent.jsx + * + * @description Tipos de identificación. + * @type {Array} + * @example + * const tiposIdentificacion = idTypes; // Devuelve un arreglo de objetos con tipos de identificación */ export const idTypes = [ { value: 'CC', name: 'Cédula de ciudadanía' }, @@ -394,8 +424,11 @@ export const idTypes = [ { value: 'PEP', name: 'Persona expuesta políticamente' } ] -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src src\components\Register-student\RegisterStudent.jsx + * + * @description Modalidades de formación. + * @type {Array} */ export const modalities = [ { value: 1, name: 'Pasantías' }, @@ -405,50 +438,97 @@ export const modalities = [ { value: 5, name: 'Vinculación laboral' } ] -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src src\components\Register-student\RegisterStudent.jsx + * + * @description Etapas de formación. + * @type {Array} */ export const etapasFormacion = [ { value: 'lectiva', name: 'Lectiva' }, { value: 'practica', name: 'Práctica' } ] -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src src\components\Register-student\RegisterStudent.jsx + * + * @description Niveles de formación. + * @type {Array} */ export const nivelFormacion = [ { value: 'tecnico', name: 'Técnico' }, { value: 'tecnologia', name: 'Tecnología' } ] -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src src\components\Register-student\RegisterStudent.jsx + * + * @description Opciones de apoyo de sostenimiento. + * @type {Array} */ export const apoyoSostenimiento = [ { value: 'FIC', name: 'FIC' }, { value: 'jovenes en accion', name: 'Jóvenes en Acción' }, { value: 'apoyo de sostenimiento sena', name: 'Apoyo de sostenimiento Sena' }, - { value: 'ninguno', name: 'ninguno' } + { value: 'ninguno', name: 'Ninguno' } ] -/* - * src: src\components\Register-student\RegisterStudent.jsx +/** + * @src src\components\Register-student\RegisterStudent.jsx + * + * @description Opciones de pago de ARL. + * @type {Array} */ export const pagoArl = [ { value: 'empresa', name: 'Empresa' }, { value: 'SENA', name: 'SENA' } ] -/* - * src: src\components\Form\Form.jsx +/** + * @src src\components\Form\Form.jsx + * + * @description Estados de contraseña. + * @type {Object} PasswordStatus + * @property {string} shown - Clase de texto para contraseña visible. + * @property {string} hidden - Clase de texto para contraseña oculta. + * @example + * const passwordStatus = { + * shown: 'text', + * hidden: 'password' + * }; */ export const passwordStatus = { shown: 'text', hidden: 'password' } -/* - * src: src\components\Siderbar\Sidebar.jsx +/** + * @src src\components\Siderbar\Sidebar.jsx + * + * @description Colores de iconos en la barra lateral. + * @typedef {Object} ColorIcon + * @property {string} /home - Clase de color para la página de inicio. + * @property {string} /seguimiento-aprendices - Clase de color para la página de seguimiento de aprendices. + * @property {string} /bitacoras - Clase de color para la página de bitácoras. + * @property {string} /registros - Clase de color para la página de registros. + * @property {string} /aprov - Clase de color para la página de aprobaciones. + * @property {string} /instructores - Clase de color para la página de instructores. + * @property {string} /fichas - Clase de color para la página de fichas. + * @property {string} /visitas - Clase de color para la página de visitas. + * @property {string} /config - Clase de color para la página de configuración. + * @example + * const colorIcon = { + * '/home': 'text-salmon', + * '/seguimiento-aprendices': 'text-third', + * '/bitacoras': 'text-seventh', + * '/registros': 'text-lima', + * '/aprov': 'text-secondary', + * '/instructores': 'text-rosa', + * '/fichas': 'text-coffee', + * // '/fichas-instructor/:id': 'text-coffee', + * '/visitas': 'text-primary', + * '/config': 'text-fifth' + * }; */ export const colorIcon = { '/home': 'text-salmon', @@ -463,16 +543,24 @@ export const colorIcon = { '/config': 'text-fifth' } -/* - * src: src\components\Visits\Visits.jsx +/** + * @src src\components\Visits\Visits.jsx + * + * @description Íconos para visitas dependiendo del estado. + * @type {Object} EstadoIcons + * @property {JSX.Element} visitado - Ícono para estado "visitado". + * @property {JSX.Element} visitadont - Ícono para estado "visitado (no)". */ export const estadoIcons = { visitado: , visitadont: } -/* - * src: src\components\Bitacoras\Bitacoras.jsx +/** + * @src src\components\Bitacoras\Bitacoras.jsx + * + * @description Bitacoras de prueba. + * @type {Object} TestInscriptions */ export const testInscriptions = { data: [ @@ -535,6 +623,12 @@ export const testInscriptions = { ] } +/** + * @src src\components\Teachers\Teachers.jsx + * + * @description Colores para card de instructores. + * @type {Array} + */ export const colorsOddRow = [ { hrcolor: 'border-purple-400', From f23f36711731d86562eb0c3715ae56929ffcf2c2 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Wed, 20 Sep 2023 10:25:15 -0500 Subject: [PATCH 134/180] fix: order inscription by fecha_creacion des --- server/src/controllers/inscriptions.controllers.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/server/src/controllers/inscriptions.controllers.ts b/server/src/controllers/inscriptions.controllers.ts index 45077143..ab3e20ad 100644 --- a/server/src/controllers/inscriptions.controllers.ts +++ b/server/src/controllers/inscriptions.controllers.ts @@ -15,7 +15,7 @@ import { errorCodes } from '../models/errorCodes.enums.js' */ export const getInscriptions = async (_req: Request, res: Response): Promise => { try { - const [inscriptions] = await connection.query('SELECT i.*, m.nombre_modalidad, COUNT(d.estado_aval) AS avales_aprobados FROM inscripciones i INNER JOIN modalidades m ON i.modalidad_inscripcion = m.id_modalidad LEFT JOIN detalles_inscripciones d ON i.id_inscripcion = d.id_inscripcion AND d.estado_aval = "Aprobado" GROUP BY i.id_inscripcion ORDER BY CASE WHEN i.estado_general_inscripcion = "Pendiente" THEN 0 WHEN i.estado_general_inscripcion = "Aprobado" THEN 1 WHEN i.estado_general_inscripcion = "Rechazado" THEN 2 END') + const [inscriptions] = await connection.query('SELECT i.*, m.nombre_modalidad, COUNT(d.estado_aval) AS avales_aprobados FROM inscripciones i INNER JOIN modalidades m ON i.modalidad_inscripcion = m.id_modalidad LEFT JOIN detalles_inscripciones d ON i.id_inscripcion = d.id_inscripcion AND d.estado_aval = "Aprobado" GROUP BY i.id_inscripcion ORDER BY CASE WHEN i.estado_general_inscripcion = "Pendiente" THEN 0 WHEN i.estado_general_inscripcion = "Aprobado" THEN 1 WHEN i.estado_general_inscripcion = "Rechazado" THEN 2 END, i.fecha_creacion DESC;') return res.status(httpStatus.OK).json({ data: inscriptions }) } catch (error) { return handleHTTP(res, error as CustomError) @@ -92,10 +92,7 @@ export const getInscriptionById: RequestHandler<{ id: string }, Response, inscri const { id } = req.params const idNumber = Number(id) try { - const [inscription] = await connection.query( - 'SELECT id_inscripcion, nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, DATE_FORMAT(fecha_fin_lectiva_inscripcion, "%Y-%m-%d") as fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, estado_general_inscripcion, fecha_creacion, responsable_inscripcion FROM inscripciones WHERE id_inscripcion = ?', - [idNumber] - ) + const [inscription] = await connection.query('SELECT id_inscripcion, nombre_inscripcion, apellido_inscripcion, tipo_documento_inscripcion, documento_inscripcion, email_inscripcion, inscripcion_celular, etapa_actual_inscripcion, modalidad_inscripcion, nombre_programa_inscripcion, nivel_formacion_inscripcion, numero_ficha_inscripcion, DATE_FORMAT(fecha_fin_lectiva_inscripcion, "%Y-%m-%d") as fecha_fin_lectiva_inscripcion, nombre_instructor_lider_inscripcion, email_instructor_lider_inscripcion, apoyo_sostenimiento_inscripcion, nit_empresa_inscripcion, nombre_empresa_inscripcion, direccion_empresa_inscripcion, nombre_jefe_empresa_inscripcion, cargo_jefe_empresa_inscripcion, telefono_jefe_empresa_inscripcion, email_jefe_empresa_inscripcion, arl, link_documentos, observaciones, estado_general_inscripcion, fecha_creacion, responsable_inscripcion FROM inscripciones WHERE id_inscripcion = ?', [idNumber]) return res.status(httpStatus.OK).json({ data: inscription }) } catch (error) { return handleHTTP(res, error as CustomError) From a2451670f5c6c4748d97d7c34d077e2c91657c1c Mon Sep 17 00:00:00 2001 From: Loren Q Date: Wed, 20 Sep 2023 10:25:46 -0500 Subject: [PATCH 135/180] v3.18.1-alpha --- server/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/package.json b/server/package.json index 21e074b5..cc7f30d5 100644 --- a/server/package.json +++ b/server/package.json @@ -1,6 +1,6 @@ { "name": "server", - "version": "3.18.0-alpha", + "version": "3.18.1-alpha", "type": "module", "description": "Back-end para el proyecto de practicas en el sena", "main": "./src/index.js", From cd641ccf4f4933bff40edf7187ba270d9198a595 Mon Sep 17 00:00:00 2001 From: Loren Q Date: Thu, 21 Sep 2023 12:12:53 -0500 Subject: [PATCH 136/180] feat: added component InfoStudent --- client/src/App.jsx | 2 + .../components/Info-student/InfoStudent.jsx | 105 ++++++++++++++++++ .../Register-detail/RegisterDetails.jsx | 14 ++- client/tailwind.config.js | 5 +- 4 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 client/src/components/Info-student/InfoStudent.jsx diff --git a/client/src/App.jsx b/client/src/App.jsx index 1d158d92..e9cbb128 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -16,6 +16,7 @@ import { RegisterDetails } from './components/Register-detail/RegisterDetails' import { Courses } from './components/Courses/Courses' import { Students } from './components/Students/Students' import { TeacherClass } from './components/Teacher-class/TeacherClass' +import { InfoStudent } from './components/Info-student/InfoStudent' const App = () => { const idRol = Number(localStorage.getItem('idRol')) @@ -36,6 +37,7 @@ const App = () => { {/* No está bien hecho, deberia ser anidado */} } /> } /> + } /> }> diff --git a/client/src/components/Info-student/InfoStudent.jsx b/client/src/components/Info-student/InfoStudent.jsx new file mode 100644 index 00000000..5a0bd8f9 --- /dev/null +++ b/client/src/components/Info-student/InfoStudent.jsx @@ -0,0 +1,105 @@ +import { Footer } from '../Footer/Footer' +import { Siderbar } from '../Siderbar/Sidebar' + +export const InfoStudent = () => { + return ( +
    + +
    +
    +

    Eyson Quiceno Giraldo

    +
    +
    +
    +
    +

    Info. Personal

    +
    +
    +
    +

    Email:

    +

    eysonquiceno@gmail.com

    +
    +
    +

    No. Documento:

    +

    1093229059

    +
    +
    +

    Contacto:

    +

    3135189268

    +
    +
    +
    +
    +
    +
    +

    Info. Acádemica

    +
    +
    +
    +

    Programa:

    +

    Análisis y Desarrollo de Software

    +
    +
    +

    Ficha:

    +

    2473196

    +
    +
    +

    Nivel académico:

    +

    Tecnologo

    +
    +
    +

    Etapa:

    +

    Prácticas

    +
    +
    +

    Modalidad:

    +

    Vinculación laboral

    +
    +
    +

    Fin lectiva:

    +

    2023-02-10

    +
    +
    +

    Inicio prácticas:

    +

    2023-04-01

    +
    +
    +
    +
    +
    +

    Info. Laboral

    +
    +
    +
    +

    Empresa:

    +

    Telepermance

    +
    +
    +

    Jefe Inmediato:

    +

    Alejandra Quecam

    +
    +
    +

    Cargo:

    +

    TAM

    +
    +
    +

    Email:

    +

    rousy@teleperformance.co

    +
    +
    +

    Contacto:

    +

    302124145

    +
    +
    +

    ARL:

    +

    Empresa

    +
    +
    +
    +
    +
    +
    +
    +
    + ) +} diff --git a/client/src/components/Register-detail/RegisterDetails.jsx b/client/src/components/Register-detail/RegisterDetails.jsx index 65898311..195050af 100644 --- a/client/src/components/Register-detail/RegisterDetails.jsx +++ b/client/src/components/Register-detail/RegisterDetails.jsx @@ -141,12 +141,12 @@ export const RegisterDetails = () => {
  • setSelectedTab('infoEmpresa')}> Info. Empresa
  • - {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[3])) && ( + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && (
  • setSelectedTab('raps')}> RAPS
  • )} - {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1])) && ( + {(idRol === Number(keysRoles[0]) || idRol === Number(keysRoles[1]) || idRol === Number(keysRoles[2])) && (
  • setSelectedTab('documentos')}> Documentos
  • @@ -1024,8 +1024,14 @@ const FunctionsApproval = ({ idRol, avalFunciones }) => {
    {idRol === Number(keysRoles[2]) ? (
    - + +
    ) : (
    {avalInfoFunciones.estado_aval}
    diff --git a/client/tailwind.config.js b/client/tailwind.config.js index 1be2bc47..4b57d4d8 100644 --- a/client/tailwind.config.js +++ b/client/tailwind.config.js @@ -38,6 +38,7 @@ export default { '2-20r-80': '20rem auto', '2-16r-84': '16rem auto', '2-45-55': '45% auto', + '2-40-60': '40% auto', '2-50-50': '50% 50%', '2-90-10': '80% 20%', '2-60-40': '60% 40%', @@ -53,7 +54,8 @@ export default { '2-25-75': '10rem auto', '2-50-50': '50% 50%', '2-90-10': '90% 10%', - '2-80-20': '80% 20%' + '2-80-20': '80% 20%', + '2-20-80': '20% 80%' }, borderWidth: { 1: '1.5px' @@ -75,4 +77,3 @@ export default { }, plugins: [] } - From fa13ba68137c36786a11f1b44e4bd7b2c302a1ec Mon Sep 17 00:00:00 2001 From: Loren Q Date: Thu, 21 Sep 2023 12:13:24 -0500 Subject: [PATCH 137/180] v2.12.0-alpha --- client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/package.json b/client/package.json index ef249442..e1dc135d 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "client", "private": true, - "version": "2.11.0-alpha", + "version": "2.12.0-alpha", "type": "module", "scripts": { "dev": "vite --open", From c74fedf14111a6368ad83f2a59929b1e840d4848 Mon Sep 17 00:00:00 2001 From: ConanGH-S Date: Thu, 21 Sep 2023 16:23:32 -0500 Subject: [PATCH 138/180] feat(client): info student page works --- client/package.json | 3 +- client/src/App.jsx | 3 +- .../components/Info-student/InfoStudent.jsx | 64 ++++++++++++++----- .../Student-monitoring/StudentMonitoring.jsx | 1 + client/src/components/Utils/Card/Card.jsx | 8 +-- client/src/store/config.js | 1 + 6 files changed, 56 insertions(+), 24 deletions(-) diff --git a/client/package.json b/client/package.json index e1dc135d..b119a402 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "client", "private": true, - "version": "2.12.0-alpha", + "version": "2.13.0-alpha", "type": "module", "scripts": { "dev": "vite --open", @@ -44,3 +44,4 @@ "vite": "4.4.9" } } + diff --git a/client/src/App.jsx b/client/src/App.jsx index e9cbb128..d9ab72e2 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -29,6 +29,7 @@ const App = () => { } /> } /> } /> + } /> } /> } /> } /> @@ -37,7 +38,6 @@ const App = () => { {/* No está bien hecho, deberia ser anidado */} } /> } /> - } /> }> @@ -54,3 +54,4 @@ const App = () => { } export default App + diff --git a/client/src/components/Info-student/InfoStudent.jsx b/client/src/components/Info-student/InfoStudent.jsx index 5a0bd8f9..ca3e55bc 100644 --- a/client/src/components/Info-student/InfoStudent.jsx +++ b/client/src/components/Info-student/InfoStudent.jsx @@ -1,13 +1,42 @@ +import { Link, useParams } from 'react-router-dom' import { Footer } from '../Footer/Footer' import { Siderbar } from '../Siderbar/Sidebar' +import { useEffect, useState } from 'react' +import { GetStudentsDetailById } from '../../api/httpRequest' +import { IoReturnDownBack } from 'react-icons/io5' export const InfoStudent = () => { + const { id } = useParams() + + const [{ cargo_jefe, celular_aprendiz, email_aprendiz, email_jefe, etapa_formacion, fecha_fin_lectiva, fecha_inicio_practica, nivel_formacion, nombre_arl, nombre_completo, nombre_empresa, nombre_jefe, nombre_modalidad, nombre_programa_formacion, numero_contacto_jefe, numero_documento_aprendiz, numero_ficha }, setInfoStudent] = useState({}) + + const getInfoStudent = async () => { + try { + const { data } = await GetStudentsDetailById(id) + const info = await data.data[0] + let { fecha_fin_lectiva, fecha_inicio_practica } = info + fecha_fin_lectiva = new Date(fecha_fin_lectiva).toLocaleDateString('es-ES') + fecha_inicio_practica = new Date(fecha_inicio_practica).toLocaleDateString('es-ES') + setInfoStudent({ ...info, fecha_fin_lectiva, fecha_inicio_practica }) + } catch (error) { + console.error(error) + } + } + + useEffect(() => { + getInfoStudent() + }, []) + return (
    -

    Eyson Quiceno Giraldo

    + + + Regresar + +

    {nombre_completo}

    @@ -17,15 +46,15 @@ export const InfoStudent = () => {

    Email:

    -

    eysonquiceno@gmail.com

    +

    {email_aprendiz}

    No. Documento:

    -

    1093229059

    +

    {numero_documento_aprendiz}

    Contacto:

    -

    3135189268

    +

    {celular_aprendiz}

    @@ -37,31 +66,31 @@ export const InfoStudent = () => {

    Programa:

    -

    Análisis y Desarrollo de Software

    +

    {nombre_programa_formacion}

    Ficha:

    -

    2473196

    +

    {numero_ficha}

    Nivel académico:

    -

    Tecnologo

    +

    {nivel_formacion}

    Etapa:

    -

    Prácticas

    +

    {etapa_formacion}

    Modalidad:

    -

    Vinculación laboral

    +

    {nombre_modalidad}

    Fin lectiva:

    -

    2023-02-10

    +

    {fecha_fin_lectiva}

    Inicio prácticas:

    -

    2023-04-01

    +

    {fecha_inicio_practica}

    @@ -72,27 +101,27 @@ export const InfoStudent = () => {

    Empresa:

    -

    Telepermance

    +

    {nombre_empresa}

    Jefe Inmediato:

    -

    Alejandra Quecam

    +

    {nombre_jefe}

    Cargo:

    -

    TAM

    +

    {cargo_jefe}

    Email:

    -

    rousy@teleperformance.co

    +

    {email_jefe}

    Contacto:

    -

    302124145

    +

    {numero_contacto_jefe}

    ARL:

    -

    Empresa

    +

    {nombre_arl}

    @@ -103,3 +132,4 @@ export const InfoStudent = () => {
    ) } + diff --git a/client/src/components/Student-monitoring/StudentMonitoring.jsx b/client/src/components/Student-monitoring/StudentMonitoring.jsx index d9f4adfd..a82d7c91 100644 --- a/client/src/components/Student-monitoring/StudentMonitoring.jsx +++ b/client/src/components/Student-monitoring/StudentMonitoring.jsx @@ -313,3 +313,4 @@ const SkeletonLoading = ({ number = 6 }) =>
    )) + diff --git a/client/src/components/Utils/Card/Card.jsx b/client/src/components/Utils/Card/Card.jsx index afb37037..c1baad4d 100644 --- a/client/src/components/Utils/Card/Card.jsx +++ b/client/src/components/Utils/Card/Card.jsx @@ -80,9 +80,6 @@ export const Card3D = ({ title, subtitle, header, item1, item2, item3, item4, it } export const CardStudent = ({ nameStudent, emailStudent, programStudent, courseStudent, height, userID, modalClicked }) => { - const userInfo = () => { - modalClicked(userID) - } return (
    @@ -94,10 +91,11 @@ export const CardStudent = ({ nameStudent, emailStudent, programStudent, courseS

    {nameStudent}

    {emailStudent} - +
    ) } + diff --git a/client/src/store/config.js b/client/src/store/config.js index b4552d7a..169f4b85 100644 --- a/client/src/store/config.js +++ b/client/src/store/config.js @@ -9,3 +9,4 @@ export const userStore = create((set) => ({ userId: null, setUserId: (data) => set({ userId: data }) })) + From 959c242232a318d570f79d42e243898e0ef6dc53 Mon Sep 17 00:00:00 2001 From: ConanGH-S Date: Fri, 22 Sep 2023 20:51:22 -0500 Subject: [PATCH 139/180] feat: next-pagination add --- client/package-lock.json | 752 +++++++++++++++--- client/package.json | 5 +- .../Student-monitoring/StudentMonitoring.jsx | 5 +- client/src/main.jsx | 9 +- client/tailwind.config.js | 7 +- 5 files changed, 665 insertions(+), 113 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index a9106ebf..5abf3b37 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,15 +1,19 @@ { "name": "client", - "version": "2.11.0-alpha", + "version": "2.13.0-alpha", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "client", - "version": "2.11.0-alpha", + "version": "2.13.0-alpha", "dependencies": { + "@nextui-org/pagination": "^2.0.22", + "@nextui-org/system": "^2.0.10", + "@nextui-org/theme": "^2.1.9", "axios": "1.4.0", "classnames": "^2.3.2", + "framer-motion": "^10.16.4", "joi": "17.9.2", "js-cookie": "3.0.5", "jwt-decode": "3.1.2", @@ -55,7 +59,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -403,6 +406,21 @@ "node": ">=6.9.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -826,6 +844,50 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz", + "integrity": "sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg==", + "dependencies": { + "@formatjs/intl-localematcher": "0.4.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.2.tgz", + "integrity": "sha512-nF/Iww7sc5h+1MBCDRm68qpHTCG4xvGzYs/x9HFcDETSGScaJ1Fcadk5U/NXjXeCtzD+DhN4BAwKFVclHfKMdA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/icu-skeleton-parser": "1.6.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.2.tgz", + "integrity": "sha512-VtB9Slo4ZL6QgtDFJ8Injvscf0xiDd4bIV93SOJTBjUF4xe2nAWOoSjLEtqIG+hlIs1sNrVKAaFo3nuTI4r5ZA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz", + "integrity": "sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -872,11 +934,43 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@internationalized/date": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.0.tgz", + "integrity": "sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/message": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.1.tgz", + "integrity": "sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw==", + "dependencies": { + "@swc/helpers": "^0.5.0", + "intl-messageformat": "^10.1.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.2.1.tgz", + "integrity": "sha512-hK30sfBlmB1aIe3/OwAPg9Ey0DjjXvHEiGVhNaOiBJl31G0B6wMaX8BN3ibzdlpyRNE9p7X+3EBONmxtJO9Yfg==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/string": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.1.1.tgz", + "integrity": "sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -890,7 +984,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -899,7 +992,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -919,24 +1011,138 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nextui-org/pagination": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@nextui-org/pagination/-/pagination-2.0.22.tgz", + "integrity": "sha512-kQTAhWSOJZIuzr15jWTpX+DFFCAQx8/hGRIzbjHBrmQMrGsCuLtpaMyawddjC22ZWAyCK7N+Q4CvoUZYWjZnPQ==", + "dependencies": { + "@nextui-org/react-utils": "2.0.9", + "@nextui-org/shared-icons": "2.0.4", + "@nextui-org/shared-utils": "2.0.3", + "@nextui-org/system": "2.0.10", + "@nextui-org/theme": "2.1.9", + "@nextui-org/use-pagination": "2.0.3", + "@react-aria/focus": "^3.14.1", + "@react-aria/interactions": "^3.18.0", + "@react-aria/utils": "^3.20.0", + "scroll-into-view-if-needed": "3.0.10" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@nextui-org/react-rsc-utils": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@nextui-org/react-rsc-utils/-/react-rsc-utils-2.0.9.tgz", + "integrity": "sha512-RrA6LzLPj6y9LJIILeqJ5JKmXUFZDbTRZDTTz0rd8qv3yyt5zNgOI07dkG6P43+q5cLNnG9j+P11+Nr0W81cDg==" + }, + "node_modules/@nextui-org/react-utils": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@nextui-org/react-utils/-/react-utils-2.0.9.tgz", + "integrity": "sha512-UK4/9uy7A6A2vMnbIWprJo7b/8+N/zg4D5Hf36pI6xR0mkt4RY9OGuo24I/ZBwoU0k5kjaod/hTW6nCQwCPtvg==", + "dependencies": { + "@nextui-org/react-rsc-utils": "2.0.9", + "@nextui-org/shared-utils": "2.0.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@nextui-org/shared-icons": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nextui-org/shared-icons/-/shared-icons-2.0.4.tgz", + "integrity": "sha512-I0gzreq1E3ji+OSTtsOYBnbdLboHoCAzPa+r//Qkf16I2gq6xxjjkfeNXFdFJjouRnPCLtR5eihlxt/ozWK8oA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@nextui-org/shared-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nextui-org/shared-utils/-/shared-utils-2.0.3.tgz", + "integrity": "sha512-4Q4RfYU+fRUPbisjq6RYw3+oq4kn9nEp3eP5+0oD+nS9at8uSlovn7Kj3N2iz6clN6vVxxbyXi35DPTs63heRQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@nextui-org/system": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@nextui-org/system/-/system-2.0.10.tgz", + "integrity": "sha512-5F6739zMOYSYR5CM/N8FQsRlQn8yCKiU5VNNPFkk022P5cA2NZXrhZ08mQSmFw2BU7OWxa/ieLivjDptKcRozQ==", + "dependencies": { + "@nextui-org/system-rsc": "2.0.6", + "@react-aria/i18n": "^3.8.2", + "@react-aria/overlays": "^3.17.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@nextui-org/system-rsc": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nextui-org/system-rsc/-/system-rsc-2.0.6.tgz", + "integrity": "sha512-Q3ojwiFggjLONG8Lyv1xuP8AhrVk7ShuiHkJ08dpNnJ7HQTYaKlwoFR3CFSWvgJbGsK6YkLLFSFFPTFvTuNpUg==", + "dependencies": { + "clsx": "^1.2.1", + "tailwind-variants": "^0.1.14" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@nextui-org/theme": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@nextui-org/theme/-/theme-2.1.9.tgz", + "integrity": "sha512-DmSv6yWb8zp3dQ4ic5XDWGc1rNjEOPphrfc5E4tzUZqgsLisNjr2Gm3bMzM51Kquepv8OzYojoaB2nO2zmI6mw==", + "dependencies": { + "@types/color": "^3.0.3", + "@types/flat": "^5.0.2", + "@types/lodash.foreach": "^4.5.7", + "@types/lodash.get": "^4.4.7", + "@types/lodash.kebabcase": "^4.1.7", + "@types/lodash.mapkeys": "^4.6.7", + "@types/lodash.omit": "^4.5.7", + "color": "^4.2.3", + "color2k": "^2.0.2", + "deepmerge": "4.3.1", + "flat": "^5.0.2", + "lodash.foreach": "^4.5.0", + "lodash.get": "^4.4.2", + "lodash.kebabcase": "^4.1.1", + "lodash.mapkeys": "^4.6.0", + "lodash.omit": "^4.5.0", + "tailwind-variants": "^0.1.14", + "tailwindcss": "^3.2.7" + }, + "peerDependencies": { + "tailwindcss": "*" + } + }, + "node_modules/@nextui-org/use-pagination": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nextui-org/use-pagination/-/use-pagination-2.0.3.tgz", + "integrity": "sha512-FEL//pNtAEjoVE7nCRWmn8kTbgmifMU0xFcAalHA3KRnzeLMqsXa/5y5a+QU4Wa1K7ZCLRby5fp5Cy2fsJtXRg==", + "dependencies": { + "@nextui-org/shared-utils": "2.0.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, "node_modules/@nodelib/fs.scandir": { "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" @@ -949,7 +1155,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" } @@ -958,7 +1163,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" @@ -987,6 +1191,173 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@react-aria/focus": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.14.1.tgz", + "integrity": "sha512-2oVJgn86Rt7xgbtLzVlrYb7MZHNMpyBVLMMGjWyvjH5Ier2bgZ6czJJmm18Xe4kjlDHN0dnFzBvoRoTCWkmivA==", + "dependencies": { + "@react-aria/interactions": "^3.18.0", + "@react-aria/utils": "^3.20.0", + "@react-types/shared": "^3.20.0", + "@swc/helpers": "^0.5.0", + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/i18n": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.8.2.tgz", + "integrity": "sha512-WsdByq3DmqEhr8sOdooVcDoS0CGGv+7cegZmmpw5VfUu0f0+0y7YBj/lRS9RuEqlgvSH+K3sPW/+0CkjM/LRGQ==", + "dependencies": { + "@internationalized/date": "^3.5.0", + "@internationalized/message": "^3.1.1", + "@internationalized/number": "^3.2.1", + "@internationalized/string": "^3.1.1", + "@react-aria/ssr": "^3.8.0", + "@react-aria/utils": "^3.20.0", + "@react-types/shared": "^3.20.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.18.0.tgz", + "integrity": "sha512-V96uRZTVe2KcU5HW+r2cuUcLIfo0KuPOchywk9r48xtJC8u//sv5fAo0LMX6AgsQJ7bV09JO8nDqmZP0gkRElQ==", + "dependencies": { + "@react-aria/ssr": "^3.8.0", + "@react-aria/utils": "^3.20.0", + "@react-types/shared": "^3.20.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/overlays": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.17.0.tgz", + "integrity": "sha512-wfQ00llAIMLDtIid+0MvNqvbLP6Fqi2/hfvAxhDaRqrkiARwuCAclWNCIdCzF599IpZOMcjjBgIILEXdfA0ziw==", + "dependencies": { + "@react-aria/focus": "^3.14.1", + "@react-aria/i18n": "^3.8.2", + "@react-aria/interactions": "^3.18.0", + "@react-aria/ssr": "^3.8.0", + "@react-aria/utils": "^3.20.0", + "@react-aria/visually-hidden": "^3.8.4", + "@react-stately/overlays": "^3.6.2", + "@react-types/button": "^3.8.0", + "@react-types/overlays": "^3.8.2", + "@react-types/shared": "^3.20.0", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.8.0.tgz", + "integrity": "sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.20.0.tgz", + "integrity": "sha512-TpvP9fw2/F0E+D05+S1og88dwvmVSLVB4lurVAodN1E6rCZyw+M/SHlCez0I7j1q9ZWAnVjRuHpBIRG5heX1Ug==", + "dependencies": { + "@react-aria/ssr": "^3.8.0", + "@react-stately/utils": "^3.7.0", + "@react-types/shared": "^3.20.0", + "@swc/helpers": "^0.5.0", + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-aria/visually-hidden": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.4.tgz", + "integrity": "sha512-TRDtrndL/TiXjVac7o1vEmrHltSPugH0B6uqc1KRCSspFa1vg9tsgh9/N+qCXrEHynfNyK9FPjI70pAH+PXcqw==", + "dependencies": { + "@react-aria/interactions": "^3.18.0", + "@react-aria/utils": "^3.20.0", + "@react-types/shared": "^3.20.0", + "@swc/helpers": "^0.5.0", + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/overlays": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.2.tgz", + "integrity": "sha512-iIU/xtYEzG91abHFHqe8LL53ZrDDo8kblfdA7TTZwrtxZhQHU3AbT0pLc3BNe3sXmJspxuI1nS1cszcRlSuDww==", + "dependencies": { + "@react-stately/utils": "^3.7.0", + "@react-types/overlays": "^3.8.2", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.7.0.tgz", + "integrity": "sha512-VbApRiUV2rhozOfk0Qj9xt0qjVbQfLTgAzXLdrfeZSBnyIgo1bFRnjDpnDZKZUUCeGQcJJI03I9niaUtY+kwJQ==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/button": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.8.0.tgz", + "integrity": "sha512-hVVK5iWXhDYQZwxOBfN7nQDeFQ4Pp48uYclQbXWz8D74XnuGtiUziGR008ioLXRHf47dbIPLF1QHahsCOhh05g==", + "dependencies": { + "@react-types/shared": "^3.20.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/overlays": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.2.tgz", + "integrity": "sha512-HpLYzkNvuvC6nKd06vF9XbcLLv3u55+e7YUFNVpgWq8yVxcnduOcJdRJhPaAqHUl6iVii04mu1GKnCFF8jROyQ==", + "dependencies": { + "@react-types/shared": "^3.20.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-types/shared": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.20.0.tgz", + "integrity": "sha512-lgTO/S/EMIZKU1EKTg8wT0qYP5x/lZTK2Xw6BZZk5c4nn36JYhGCRb/OoR/jBCIeRb2x9yNbwERO6NYVkoQMSw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, "node_modules/@remix-run/router": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", @@ -1013,6 +1384,35 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/color": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.4.tgz", + "integrity": "sha512-OpisS4bqJJwbkkQRrMvURf3DOxBoAg9mysHYI7WgrWpSYHqHGKYBULHdz4ih77SILcLDo/zyHGFyfIl9yb8NZQ==", + "dependencies": { + "@types/color-convert": "*" + } + }, + "node_modules/@types/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-GwXanrvq/tBHJtudbl1lSy9Ybt7KS9+rA+YY3bcuIIM+d6jSHUr+5yjO83gtiRpuaPiBccwFjSnAK2qSrIPA7w==", + "dependencies": { + "@types/color-name": "*" + } + }, + "node_modules/@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, "node_modules/@types/eslint": { "version": "8.44.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz", @@ -1033,6 +1433,11 @@ "optional": true, "peer": true }, + "node_modules/@types/flat": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/flat/-/flat-5.0.3.tgz", + "integrity": "sha512-uG/4x6EXYbq4VDsBJLNDHQAQmtRPg3x4tAXcBspxlnEknz8NiJxnHoxSiJKGNExiS00q4mJNvuEBgVA3jsDIdQ==" + }, "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", @@ -1047,6 +1452,51 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.198", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.198.tgz", + "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==" + }, + "node_modules/@types/lodash.foreach": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@types/lodash.foreach/-/lodash.foreach-4.5.7.tgz", + "integrity": "sha512-YjBEB6/Bl19V+R70IpyB/MhMb2IvrSgD26maRNyqbGRNDTH9AnPrQoT+ECvhFJ/hwhQ+RgYWaZKvF+knCguMJw==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/lodash.get": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@types/lodash.get/-/lodash.get-4.4.7.tgz", + "integrity": "sha512-af34Mj+KdDeuzsJBxc/XeTtOx0SZHZNLd+hdrn+PcKGQs0EG2TJTzQAOTCZTgDJCArahlCzLWSy8c2w59JRz7Q==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/lodash.kebabcase": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/lodash.kebabcase/-/lodash.kebabcase-4.1.7.tgz", + "integrity": "sha512-qzrcpK5uiADZ9OyZaegalM0b9Y3WetoBQ04RAtP3xZFGC5ul1UxmbjZ3j6suCh0BDkvgQmoMh8t5e9cVrdJYMw==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/lodash.mapkeys": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.mapkeys/-/lodash.mapkeys-4.6.7.tgz", + "integrity": "sha512-mfK0jlh4Itdhmy69/7r/vYftWaltahoS9kCF62UyvbDtXzMkUjuypaf2IASeoeoUPqBo/heoJSZ/vntbXC6LAA==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/lodash.omit": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@types/lodash.omit/-/lodash.omit-4.5.7.tgz", + "integrity": "sha512-6q6cNg0tQ6oTWjSM+BcYMBhan54P/gLqBldG4AuXd3nKr0oeVekWNS4VrNEu3BhCSDXtGapi7zjhnna0s03KpA==", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/node": { "version": "20.6.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.1.tgz", @@ -1166,14 +1616,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1185,8 +1633,7 @@ "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==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -1386,8 +1833,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/big-integer": { "version": "1.6.51", @@ -1402,7 +1848,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -1423,7 +1868,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1433,7 +1877,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" }, @@ -1564,7 +2007,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -1607,7 +2049,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -1634,7 +2075,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" }, @@ -1655,6 +2095,18 @@ "node": ">=6" } }, + "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": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1667,8 +2119,37 @@ "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/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/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color2k": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz", + "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -1685,16 +2166,19 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -1720,7 +2204,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -1757,6 +2240,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", @@ -1830,14 +2321,12 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -2620,7 +3109,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2636,7 +3124,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" }, @@ -2660,7 +3147,6 @@ "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" } @@ -2681,7 +3167,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" }, @@ -2705,6 +3190,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", @@ -2779,17 +3272,38 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "10.16.4", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz", + "integrity": "sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -2802,8 +3316,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -2908,7 +3421,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -2962,7 +3474,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -3097,7 +3608,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3106,8 +3616,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/internal-slot": { "version": "1.0.5", @@ -3123,6 +3632,17 @@ "node": ">= 0.4" } }, + "node_modules/intl-messageformat": { + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.3.tgz", + "integrity": "sha512-TzKn1uhJBMyuKTO4zUX47SU+d66fu1W9tVzIiZrQ6hBqQQeYscBMIzKL/qEXnFbJrH9uU5VV3+T5fWib4SIcKA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.6.2", + "tslib": "^2.4.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -3137,6 +3657,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -3168,7 +3693,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -3208,7 +3732,6 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -3250,7 +3773,6 @@ "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" } @@ -3286,7 +3808,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" }, @@ -3337,7 +3858,6 @@ "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" } @@ -3550,7 +4070,6 @@ "version": "1.19.3", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.3.tgz", "integrity": "sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -3680,7 +4199,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -3688,8 +4206,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/locate-path": { "version": "6.0.0", @@ -3706,12 +4223,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==" + }, + "node_modules/lodash.mapkeys": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapkeys/-/lodash.mapkeys-4.6.0.tgz", + "integrity": "sha512-0Al+hxpYvONWtg+ZqHpa/GaVzxuN3V7Xeo2p+bY06EaK/n+Y9R7nBePPN2o1LxmL0TWQSwP8LYZ008/hc9JzhA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -3742,7 +4284,6 @@ "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" } @@ -3751,7 +4292,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" @@ -3795,7 +4335,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3822,7 +4361,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -3833,7 +4371,6 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, "funding": [ { "type": "github", @@ -3863,7 +4400,6 @@ "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" } @@ -3916,7 +4452,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -4034,7 +4569,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -4144,7 +4678,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4161,20 +4694,17 @@ "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/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "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" }, @@ -4186,7 +4716,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4195,7 +4724,6 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, "engines": { "node": ">= 6" } @@ -4204,7 +4732,6 @@ "version": "8.4.24", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4232,7 +4759,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -4249,7 +4775,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -4268,7 +4793,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -4297,7 +4821,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -4316,7 +4839,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4328,8 +4850,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -4396,7 +4917,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", @@ -4531,7 +5051,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -4540,7 +5059,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -4589,7 +5107,6 @@ "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", - "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -4615,7 +5132,6 @@ "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" @@ -4760,7 +5276,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", @@ -4819,6 +5334,14 @@ "loose-envify": "^1.1.0" } }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", + "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4869,11 +5392,18 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "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/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5014,7 +5544,6 @@ "version": "3.34.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -5036,7 +5565,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5068,7 +5596,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" }, @@ -5101,11 +5628,34 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tailwind-merge": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz", + "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.1.14.tgz", + "integrity": "sha512-qfOkSGP+cSolTTkJboldGmiM+w5uE77pazCRkwixEBsuaml9CmhN0E8qgH7QnZNmOTVSsgRK1tn/MsKOvOKVWA==", + "dependencies": { + "tailwind-merge": "^1.13.2" + }, + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwindcss": "*" + } + }, "node_modules/tailwindcss": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -5176,7 +5726,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -5185,7 +5734,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -5218,7 +5766,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" }, @@ -5229,8 +5776,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tsconfig-paths": { "version": "3.14.2", @@ -5259,8 +5805,7 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", @@ -5425,8 +5970,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/vite": { "version": "4.4.9", @@ -5605,8 +6149,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "3.1.1", @@ -5618,7 +6161,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", - "dev": true, "engines": { "node": ">= 14" } diff --git a/client/package.json b/client/package.json index b119a402..e0b938d9 100644 --- a/client/package.json +++ b/client/package.json @@ -10,8 +10,12 @@ "preview": "vite preview" }, "dependencies": { + "@nextui-org/pagination": "^2.0.22", + "@nextui-org/system": "^2.0.10", + "@nextui-org/theme": "^2.1.9", "axios": "1.4.0", "classnames": "^2.3.2", + "framer-motion": "^10.16.4", "joi": "17.9.2", "js-cookie": "3.0.5", "jwt-decode": "3.1.2", @@ -44,4 +48,3 @@ "vite": "4.4.9" } } - diff --git a/client/src/components/Student-monitoring/StudentMonitoring.jsx b/client/src/components/Student-monitoring/StudentMonitoring.jsx index a82d7c91..84ec14b1 100644 --- a/client/src/components/Student-monitoring/StudentMonitoring.jsx +++ b/client/src/components/Student-monitoring/StudentMonitoring.jsx @@ -9,7 +9,8 @@ import { CardStudent } from '../Utils/Card/Card' import { FilterModal, InfoStudentModal } from '../Utils/Modals/Modals' import { Footer } from '../Footer/Footer' // import { filter } from '../../import/staticData' -import { Pagination } from '../Utils/Pagination/Pagination' +// import { Pagination } from '../Utils/Pagination/Pagination' +import { Pagination, PaginationItem, PaginationCursor } from '@nextui-org/pagination' import { GetUserByName, detailInfoStudents, GetStudentsDetailById } from '../../api/httpRequest' import { Button } from '../Utils/Button/Button' import { Select } from '../Utils/Select/Select' @@ -298,7 +299,7 @@ export const StudentMonitoring = () => { )}
    - +