From 29f5fc3d08c75b55810f13ae875cd729347b990d Mon Sep 17 00:00:00 2001 From: Marklogo Date: Tue, 2 Apr 2024 13:54:03 +0200 Subject: [PATCH] CRUD --- .../codigo/INTRO_SQL_EVENTOS.sql | 42 +++++ .../codigo/INTRO_SQL_FUNCTION.sql | 148 +++++++++++++++ .../INTRO_SQL_PROCEDIMIENTOS_ALMACENADOS.sql | 169 ++++++++++++++++++ .../codigo/INTRO_SQL_TRIGGERS.sql | 35 ++++ .../Practicas_SQL/codigo/INTRO_SQL_VISTAS.sql | 18 ++ .../ejercicios/tienda/crud/connection.php | 14 ++ .../ejercicios/tienda/crud/css/style.css | 156 ++++++++++++++++ .../ejercicios/tienda/crud/delete_pedido.php | 20 +++ .../tienda/crud/delete_producto.php | 20 +++ .../ejercicios/tienda/crud/delete_user.php | 27 +++ .../ejercicios/tienda/crud/edit_producto.php | 27 +++ .../ejercicios/tienda/crud/edit_user.php | 34 ++++ .../tienda/crud/explicaciones/CRUD.jpg | Bin 0 -> 66373 bytes .../crud/explicaciones/CRUD_clientes.jpg | Bin 0 -> 119919 bytes .../crud/explicaciones/Esquema_CRUD_1.jpg | Bin 0 -> 290224 bytes .../crud/explicaciones/Esquema_CRUD_2.jpg | Bin 0 -> 327192 bytes .../crud/explicaciones/Index_productos.jpg | Bin 0 -> 133706 bytes .../ejercicios/tienda/crud/index_clientes.php | 112 ++++++++++++ .../ejercicios/tienda/crud/index_pedidos.php | 104 +++++++++++ .../tienda/crud/index_productos.php | 89 +++++++++ .../tienda/crud/insert_producto.php | 35 ++++ .../ejercicios/tienda/crud/insert_user.php | 69 +++++++ .../tienda/crud/update_estado_pedido.php | 23 +++ .../tienda/crud/update_producto.php | 40 +++++ .../ejercicios/tienda/crud/update_user.php | 50 ++++++ 25 files changed, 1232 insertions(+) create mode 100644 Practicas/Practicas_SQL/codigo/INTRO_SQL_EVENTOS.sql create mode 100644 Practicas/Practicas_SQL/codigo/INTRO_SQL_FUNCTION.sql create mode 100644 Practicas/Practicas_SQL/codigo/INTRO_SQL_PROCEDIMIENTOS_ALMACENADOS.sql create mode 100644 Practicas/Practicas_SQL/codigo/INTRO_SQL_TRIGGERS.sql create mode 100644 Practicas/Practicas_SQL/codigo/INTRO_SQL_VISTAS.sql create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/connection.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/css/style.css create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/delete_pedido.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/delete_producto.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/delete_user.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/edit_producto.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/edit_user.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/explicaciones/CRUD.jpg create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/explicaciones/CRUD_clientes.jpg create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/explicaciones/Esquema_CRUD_1.jpg create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/explicaciones/Esquema_CRUD_2.jpg create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/explicaciones/Index_productos.jpg create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/index_clientes.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/index_pedidos.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/index_productos.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/insert_producto.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/insert_user.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/update_estado_pedido.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/update_producto.php create mode 100644 Practicas/Practicas_SQL/ejercicios/tienda/crud/update_user.php diff --git a/Practicas/Practicas_SQL/codigo/INTRO_SQL_EVENTOS.sql b/Practicas/Practicas_SQL/codigo/INTRO_SQL_EVENTOS.sql new file mode 100644 index 0000000..cc8a17b --- /dev/null +++ b/Practicas/Practicas_SQL/codigo/INTRO_SQL_EVENTOS.sql @@ -0,0 +1,42 @@ +---------Eventos en MySQL +--Capacidad de MySQL de ejecutar tareas en intervalos regulares o en momentos específicos. +--Para que? +--Tareas de mantenimiento en tu base de datos, limpieza de registros antiguos, optimización de tablas, promociones o períodos de prueba... + +--Verificar si esta activado el programador de eventos +SHOW VARIABLES LIKE 'event_scheduler'; + +--Activarlo si no esta encendido +SET GLOBAL event_scheduler = ON; + +--Mostrar los eventos existentes +SHOW EVENTS; + +--Crear un evento estructura básica +CREATE EVENT event_name +ON SCHEDULE schedule +DO +event_body; + +--Creación de un evento (aumenta los precios un 5% cada mes) +CREATE EVENT actualizar_precios +ON SCHEDULE + EVERY 1 MONTH +DO + UPDATE productos SET precio = precio * 1.05; + + +--ON SCHEDULE (momento de ejecución del evento) +--AT(en una fecha determinada) +ON SCHEDULE AT 'YYYY-MM-DD HH:MM:SS' +-- A una hora determinada(todos los días) +ON SCHEDULE AT '09:00:00' +--ON SCHEDULE EVERY(para indicar evento que se repite a intervalos entre dos fechas) +ON SCHEDULE EVERY interval_type [STARTS initial_date] [ENDS ending_date] +ON SCHEDULE EVERY 1 DAY +STARTS CURRENT_DATE +ENDS CURRENT_DATE + INTERVAL 1 WEEK + + + + diff --git a/Practicas/Practicas_SQL/codigo/INTRO_SQL_FUNCTION.sql b/Practicas/Practicas_SQL/codigo/INTRO_SQL_FUNCTION.sql new file mode 100644 index 0000000..1e5433d --- /dev/null +++ b/Practicas/Practicas_SQL/codigo/INTRO_SQL_FUNCTION.sql @@ -0,0 +1,148 @@ +---Uso de funciones en MYSQL + +--Pensadas para realizar cálculos y devolver resultados mediante RETURN, devuelven un valor con un tipo definido. + +--Pueden ser invocadas desde una consulta, por ejemplo: +SELECT nombre_funcion(parametros) FROM tabla +--No pueden operar con transacciones + +----Vocabulario básico para crear una función en MySQL: + + CREATE FUNCTION: sentencia para crear la función. + + NOMBRE_DE_LA_FUNCION: nombre de la función debe ser único en la base de datos. + + RETURNS: Especificamos el tipo de dato que vamos a retornar como INT, VARCHAR, FLOAT, etc. + + BEGIN ... END: Define el cuerpo de la función. + + DECLARE: declarar variables. + + SET: asignar valores a variables. + + INTO: Se utiliza en combinación con una consulta SQL para asignar los resultados de la consulta a variables. + + RETURN: sentencia para devolver el resultado. + + PARAMETROS: son los parametros que le pasamos a la función (parametro1 INT,parametro2 FLOAT) + +---Tipos de función + -- DETERMINISTIC: Indica que la función siempre produce el mismo resultado para los mismos valores de entrada. + -- NO SQL: no realiza operaciones en la base de datos. + -- READS SQL DATA: puede leer datos de la base de datos, pero no modificarlos. (Hay que indicarlo cuando sea el caso) + + +--- Estructura básica de una función MySQL +DELIMITER // +CREATE FUNCTION nombre_funcion (variable tipo) +RETURNS tipo +BEGIN + --INICIO DE ACCIONES + DECLARE numero INT; -- Declara la variable numero como INT + SELECT count(*) INTO numero FROM clientes; --Realiza una consulta para contar el número de filas en la tabla clientes y asigna el resultado a la variable numero. + RETURN numero; + --FIN DE ACCIONES +END// +DELIMITER ; + + +--Ejemplo + +CREATE FUNCTION calcular_area_circulo (radio FLOAT) +RETURNS FLOAT +BEGIN + DECLARE area FLOAT; -- Declaración de variable local + SET area = PI() * POW(radio, 2); -- Cálculo del área + RETURN area; -- Devolución del resultado +END; + +--Llamada a la función +SELECT calcular_area_circulo(5); + +--Podemos llamar a una función desde diferentes contextos, incluyendo consultas SQL, procedimientos almacenados, disparadores (triggers) y funciones definidas por el usuario. + + +--Otro ejemplo función que devuelve el nombre del mes en español +DELIMITER // + +CREATE FUNCTION nombre_mes(numero_mes INT) RETURNS VARCHAR(20) +BEGIN + DECLARE nombre VARCHAR(20); + + CASE numero_mes + WHEN 1 THEN SET nombre = 'Enero'; + WHEN 2 THEN SET nombre = 'Febrero'; + WHEN 3 THEN SET nombre = 'Marzo'; + WHEN 4 THEN SET nombre = 'Abril'; + WHEN 5 THEN SET nombre = 'Mayo'; + WHEN 6 THEN SET nombre = 'Junio'; + WHEN 7 THEN SET nombre = 'Julio'; + WHEN 8 THEN SET nombre = 'Agosto'; + WHEN 9 THEN SET nombre = 'Septiembre'; + WHEN 10 THEN SET nombre = 'Octubre'; + WHEN 11 THEN SET nombre = 'Noviembre'; + WHEN 12 THEN SET nombre = 'Diciembre'; + ELSE SET nombre = 'Mes no válido'; + END CASE; + + RETURN nombre; +END // + +DELIMITER ; + + +-- Principales estructuras para controlar el flujo de código + +--IF-THEN-ELSE: Permite ejecutar un bloque de código si una condición especificada es verdadera y otro bloque si la condición es falsa. + +IF condición THEN + -- Código a ejecutar si la condición es verdadera +ELSE + -- Código a ejecutar si la condición es falsa +END IF; + +--CASE: Evalúa una lista de condiciones y devuelve un valor único correspondiente a la primera condición verdadera. Se puede usar en su forma simple o en su forma de expresión, donde se puede utilizar para asignar valores a una variable. + +CASE + WHEN condición1 THEN valor1 + WHEN condición2 THEN valor2 + ... + ELSE valor_por_defecto +END; +Ejemplo de asignación de valor mediante CASE: + +Otro ejemplo: +SET variable = + CASE + WHEN condición1 THEN valor1 + WHEN condición2 THEN valor2 + ... + ELSE valor_por_defecto + END; + + +--WHILE: Permite ejecutar un bloque de código repetidamente mientras una condición especificada sea verdadera. + +WHILE condición DO + -- Código a ejecutar mientras la condición sea verdadera +END WHILE; + + +--LOOP: Se utiliza para crear bucles que se ejecutan indefinidamente hasta que se alcanza una condición de salida. + +LOOP + -- Código a ejecutar + IF condición_de_salida THEN + LEAVE; -- Termina el bucle + END IF; +END LOOP; + + +--ITERATE: Se utiliza dentro de un bucle para saltar a la siguiente iteración del bucle. + +ITERATE; -- Salta a la siguiente iteración del bucleç + + +--LEAVE: Se utiliza dentro de un bucle para salir del bucle. + +LEAVE; -- Sale del bucle \ No newline at end of file diff --git a/Practicas/Practicas_SQL/codigo/INTRO_SQL_PROCEDIMIENTOS_ALMACENADOS.sql b/Practicas/Practicas_SQL/codigo/INTRO_SQL_PROCEDIMIENTOS_ALMACENADOS.sql new file mode 100644 index 0000000..5b06481 --- /dev/null +++ b/Practicas/Practicas_SQL/codigo/INTRO_SQL_PROCEDIMIENTOS_ALMACENADOS.sql @@ -0,0 +1,169 @@ + +--Stored Procedures--Procedimientos almacenados + +-- Que son ? +-- Son bloques de código SQL que se almacenan en la base de datos y se pueden llamar y ejecutar repetidamente(funciones????) + +--Direfencias con las funciones +--Tipo de retorno: +---Funciones: Devuelven un único valor como resultado y pueden ser utilizadas en cualquier lugar donde se espera una expresión. +---Procedimientos almacenados: No devuelven valores explícitos, aunque pueden producir resultados indirectos, como modificar datos en tablas o generar resultados a través de cursores de salida. + +--Uso en consultas: +---Funciones: Pueden ser invocadas directamente dentro de consultas SELECT, INSERT, UPDATE o DELETE. +---Procedimientos almacenados: No pueden ser directamente invocados dentro de consultas, pero pueden ser llamados desde aplicaciones o desde otros procedimientos almacenados. + + +--Cambios en la base de datos +---Funciones: No pueden realizar operaciones de modificación de datos directamente sobre las tablas. +---Procedimientos almacenados: Pueden contener sentencias SQL que modifican datos en las tablas, como INSERT, UPDATE o DELETE. + +--Parametros +---Funciones: Pueden aceptar parámetros de entrada y devolver un valor como resultado. +---Procedimientos almacenados: Pueden aceptar parámetros de entrada y/o salida, pero no devuelven un valor explícito. + + +-- Vocabulario + + CREATE PROCEDURE: crear un nuevo procedimiento. + + BEGIN y END: para delimitar el cuerpo del procedimiento almacenado, donde se encuentra las instrucciones a ejecutar. + + DELIMITER: para cambiar el delimitador de sentencia temporalmente) + + DECLARE: para declarar variables locales dentro del procedimiento almacenado. + + IN indica que el parámetro es de entrada, + OUT indica que es de salida + INOUT indica que es tanto de entrada como de salida. + + IF, ELSEIF, ELSE, END IF: para condicionar la ejecución de bloques. + + CASE: para evaluar múltiples condiciones. + + LOOP: para crear un bucle infinito. + + REPEAT: para ejecutar bucles. + + LEAVE: para salir de un bucle o de un bloque de código etiquetado. + + ITERATE: para saltar a la siguiente iteración de un bucle. + + RETURN: para devolver un valor de un procedimiento almacenado. + + CALL: para llamar y ejecutar un procedimiento almacenado. + + +--Para que ? +---Procedimiento para insertar datos: + + DELIMITER // + +CREATE PROCEDURE insertar_usuario( + IN p_nombre VARCHAR(50), + IN p_apellido VARCHAR(50), + IN p_email VARCHAR(100) +) +BEGIN + INSERT INTO usuarios(nombre, apellido, email) VALUES (p_nombre, p_apellido, p_email); +END // + +DELIMITER ; + + + +---Procedimiento para actualizar datos: + +DELIMITER // + +CREATE PROCEDURE actualizar_usuario( + IN p_id INT, + IN p_nombre VARCHAR(50), + IN p_apellido VARCHAR(50), + IN p_email VARCHAR(100) +) +BEGIN + UPDATE usuarios SET nombre = p_nombre, apellido = p_apellido, email = p_email WHERE id = p_id; +END // + +DELIMITER ; + + + +---Procedimiento para eliminar datos: + +DELIMITER // + +CREATE PROCEDURE eliminar_usuario( + IN p_id INT +) +BEGIN + DELETE FROM usuarios WHERE id = p_id; +END // + +DELIMITER ; + + + +---Procedimiento para obtener datos filtrados: + +DELIMITER // + +CREATE PROCEDURE obtener_usuarios_por_apellido( + IN p_apellido VARCHAR(50) +) +BEGIN + SELECT * FROM usuarios WHERE apellido = p_apellido; +END // + +DELIMITER ; + + + +---Otro ejemplo con parametros de entrada +CREATE PROCEDURE calcular_precio_total( + IN producto_id INT, + IN cantidad_comprada INT, + OUT precio_total DECIMAL(10,2) +) +BEGIN + -- Declarar una variable para almacenar el precio del producto + DECLARE precio_unitario DECIMAL(10,2); + + -- Obtener el precio unitario del producto + SELECT precio INTO precio_unitario FROM productos WHERE id = producto_id; + + -- Calcular el precio total + SET precio_total = precio_unitario * cantidad_comprada; +END; + + +---Llamar al procedimiento +CALL calcular_precio_total(1, 5, @precio_total); +SELECT @precio_total; + + + + + +---Procedimiento para realizar cálculos y retornar resultados: +DELIMITER // + +CREATE PROCEDURE calcular_total_pedidos_periodo( + IN p_fecha_inicio DATE, + IN p_fecha_fin DATE, + OUT total_pedidos DECIMAL(10,2) +) +BEGIN + SELECT SUM(total) INTO total_pedidos FROM pedidos WHERE fecha BETWEEN p_fecha_inicio AND p_fecha_fin; +END // + +DELIMITER ; + +---Llamada al procedimiento +CALL calcular_total_pedidos_periodo('2024-01-01', '2024-03-31', @total_pedidos); +SELECT @total_pedidos; + + + + diff --git a/Practicas/Practicas_SQL/codigo/INTRO_SQL_TRIGGERS.sql b/Practicas/Practicas_SQL/codigo/INTRO_SQL_TRIGGERS.sql new file mode 100644 index 0000000..1719b8e --- /dev/null +++ b/Practicas/Practicas_SQL/codigo/INTRO_SQL_TRIGGERS.sql @@ -0,0 +1,35 @@ +---------Que son los triggers ? + +--Son bloques de código SQL que se ejecutan automáticamente en respuesta a ciertos eventos en una tabla, como la inserción, actualización o eliminación de registros. + +---------Consideraciones: +--Eventos de Activación: Los triggers se activan en respuesta a eventos específicos que ocurren en una tabla, como INSERT, UPDATE o DELETE. + +--Momento de Activación: Los triggers pueden ser "BEFORE" (antes de que ocurra el evento que lo activa) o "AFTER" (después de que ocurra el evento que lo activa). + +--Acceso a los Datos: Dentro de un trigger, puedes acceder a los datos antiguos y nuevos utilizando las palabras clave OLD y NEW respectivamente. + +--Tablas y Disparadores Relacionados: Es posible tener múltiples triggers asociados con una sola tabla para diferentes eventos (INSERT, UPDATE, DELETE), y también es posible tener múltiples triggers para el mismo evento en una tabla. + +--Cascada de Triggers: Si un trigger modifica la tabla en la que está definido, esto puede activar otros triggers. + +--Restricciones de Transacción: Los triggers se ejecutan dentro del contexto de la transacción que activa el evento, lo que significa que los cambios realizados por un trigger pueden ser revertidos si la transacción es revertida. + +--Rendimiento: pueden afectar el rendimiento de las operaciones en la base de datos. + +--Seguridad y Privilegios: el trigger es controlado por su creador. + +--Depuración y Mantenimiento: Es importante probarlos y documentarlos. + + + +--------Estructura básica de un TRIGGER +CREATE TRIGGER nombre_trigger +{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON nombre_tabla +FOR EACH ROW | FOR EACH STATEMENT -- Por cada fila afectada o una vez por todo el evento. +BEGIN + -- Código del trigger aquí +END; + + + diff --git a/Practicas/Practicas_SQL/codigo/INTRO_SQL_VISTAS.sql b/Practicas/Practicas_SQL/codigo/INTRO_SQL_VISTAS.sql new file mode 100644 index 0000000..c886779 --- /dev/null +++ b/Practicas/Practicas_SQL/codigo/INTRO_SQL_VISTAS.sql @@ -0,0 +1,18 @@ +---------Vistas en MySQL + +--Es una consulta SQL almacenada representa una tabla virtual que no contiene datos físicos, pero proporciona una representación lógica de los datos almacenados en una o más tablas. + +--Para que? +-- Para simplificar las consultas SQL y para restringir el acceso a ciertos datos. + +-- Codigo básico Vistas +CREATE OR REPLACE VIEW nombre_vista AS +SELECT columna1, columna2, ... +FROM tabla1 +JOIN tabla2 ON condiciones +WHERE condiciones +GROUP BY columna_grupo +HAVING condiciones_grupo +ORDER BY columna_orden +LIMIT cantidad_filas; + diff --git a/Practicas/Practicas_SQL/ejercicios/tienda/crud/connection.php b/Practicas/Practicas_SQL/ejercicios/tienda/crud/connection.php new file mode 100644 index 0000000..ec685f5 --- /dev/null +++ b/Practicas/Practicas_SQL/ejercicios/tienda/crud/connection.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/Practicas/Practicas_SQL/ejercicios/tienda/crud/css/style.css b/Practicas/Practicas_SQL/ejercicios/tienda/crud/css/style.css new file mode 100644 index 0000000..2035ba0 --- /dev/null +++ b/Practicas/Practicas_SQL/ejercicios/tienda/crud/css/style.css @@ -0,0 +1,156 @@ +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + font-family: 'Segoe UI', sans-serif; + text-align: center; +} + +a{ + text-decoration: none; +} + +.users-form form{ + display: flex; + flex-direction: column; + gap: 10px; + width: 30%; + margin: 10px auto; + text-align: center; +} + +.users-form form input{ + font-family: 'Segoe UI', sans-serif; +} + +.users-form form input[type=text], +.users-form form input[type=password], +.users-form form input[type=email]{ + padding: 8px; + border:2px solid #aaa; + border-radius:4px; + outline:none; + transition:.3s; +} + +.users-form form input[type=text]:focus, +.users-form form input[type=password]:focus, +.users-form form input[type=password]:focus{ + border-color:dodgerBlue; + box-shadow:0 0 6px 0 dodgerBlue; +} + +.users-form form input[type=submit]{ + border: none; + padding: 12px 50px; + text-decoration: none; + transition-duration: 0.4s; + cursor: pointer; + border-radius: 5px; + background-color: white; + color: black; + border: 2px solid #60a100; +} + +.users-form form input[type=submit]:hover { + background-color: #60a100; + color: white; +} + +.users-table table{ + border: 1px solid #ccc; + border-collapse: collapse; + margin: 0; + padding: 0; + width: 100%; + table-layout: fixed; +} + +.detail-table table{ + border: 1px solid #ccc; + border-collapse: collapse; + margin: auto; + padding: 0; + width: 60%; + table-layout: fixed; +} + +table tr { + background-color: #f8f8f8; + border: 1px solid #ddd; + padding: 4px; +} + +table th{ + padding: 10px; + text-align: center; + font-size: .85em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 200px; +} + + +.users-table--detail{ + background: #09adc8; + padding: 6px; + color: #fff; + text-align: center; + font-weight: bold; +} + +.users-table--edit{ + background: #009688; + padding: 6px; + color: #fff; + text-align: center; + font-weight: bold; +} + +.users-table--delete{ + background: #b11e1e; + padding: 6px; + color: #fff; + text-align: center; + font-weight: bold; +} + + /* Estilos básicos para el menú */ + nav { + background-color: #333; + padding: 10px; + } + + nav ul { + list-style-type: none; + padding: 0; + margin: 0; + text-align: center; + } + + nav li { + display: inline; + margin-right: 20px; + } + + nav a { + text-decoration: none; + color: #fff; + font-size: 18px; + padding: 10px 20px; + border-radius: 5px; + transition: background-color 0.3s ease; + } + + nav a:hover { + background-color: #555; + } + + /* Estilos para los enlaces activos */ + nav .active a { + background-color: #007bff; + } \ No newline at end of file diff --git a/Practicas/Practicas_SQL/ejercicios/tienda/crud/delete_pedido.php b/Practicas/Practicas_SQL/ejercicios/tienda/crud/delete_pedido.php new file mode 100644 index 0000000..6cfb90e --- /dev/null +++ b/Practicas/Practicas_SQL/ejercicios/tienda/crud/delete_pedido.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/Practicas/Practicas_SQL/ejercicios/tienda/crud/edit_producto.php b/Practicas/Practicas_SQL/ejercicios/tienda/crud/edit_producto.php new file mode 100644 index 0000000..81c01d1 --- /dev/null +++ b/Practicas/Practicas_SQL/ejercicios/tienda/crud/edit_producto.php @@ -0,0 +1,27 @@ +S+`Z3tzyFSL#($U0wPupJ=9=%C^KH-jPTBqJ zanL~%Lt{e_2L}h}Ch!l$9s=ou_Hc0g{QL9ZzWv<$f42Cq9qex)q5XT(_I}~yI0o7y z#K9@V!LA2^K_Ct;V6;C6{O7^3hjTC2K43@(c!37R2Z7;pa_#{J%e8ke&^j3S9kf@7 z>(H;KFYFUGyTyIX>+qQ;uio#MxtL!gV%|xXRlEK0DbE2>u_H&t<&MiMC@QIIoYg$1 zrLBL-z|iQjv5CbEODnjwjjhui=esWVT;05Vd>{Gw2Ly&ZdmbA0;$?VDY+QUo;_Ej_ zAJRUif6B+G2Y#+914v^&hoAZu|eDgB!87MZ90bw}>KApu=Vc|GzHUf?EqLa;{Qq2s02< zsciE2fWn8rEXs?}MQ(cUwLG^!u77#M-|6(fa~mn{-Ay*g-zxrY4XX+|Dw2Ml>#*5h z7LhIR7AJEt1FrGM^)GMuJDvXbZDXEYh>H{6JPi7R!NaznyIP@6mAye*E$Uc3|642y z@4@s4ZfC!BBv|@nD?=FEBi4{xW9nT?Fhf9cPm zhOo-d1T&!b$iJTXe>h3@tTvbxWAUxqbuP^E^cJ!W`}_H`*?AE_n#T4Lw4uMB^9?}y zRJkoTNPTs#h1vOo%$LEo$;_10+@0QVg*^o7!@$xxquKbgWEE%a~K@{ z=Zcm3+SVL%5dY^D^!18m=@KO&A-8{C z`>L)+Yxl}ks>mFaj}016!*H@rF23rY#~f0ZNd5s?Hcu>-XR)$LEl{$<$e#HH9KY^` z&vwIZ2>wlnJ4Tbd=bYEA&bL(9aYrYYZ{~tufXN1HPuZZNj5xEw?*|9# zk%dC_gzcl(zqdWxz+U&>5Z_jqq4^qWv z(gWdPnDJ_sWH-vN1g%9wPPTI!4mbPHwZ0U~U#C>01}nM5!qHUeZmciMkmjgfV{*39 zF>d!$DwgE5c_w^gY+#L=PF7vfn@H%b6v5jrQWxs;vxfA(Zu+;k5MJOf>XKs3Qx=+I z+*)>r&mK=WmXu>?VitVe%uwNT>(g+BcYFR$DONtg*O&gcWZJ*NJTVAjgQQz&8147) zHO$liL2&NIKW|^=i2LnsuvXxIUP1Q%3PTlGqGU9*E7uYj=>+2*X9TT|oTyKmB9q`` z+>6gsgwEoeM^7i^rK|Sqy}*ZJ#&Hl8iu|$^-O3GD=n|FpsYh2Q8`)C{4qU4^y>6>E zHp>QeY%C$(4>X{-*&wbjWU09j!Md@iBwbGpLC~U^f!~Z*@@;yUWTYoiGT5EeG^Rnu zP9%(03BH<))a;$&Yl|paSQ{W_y9|s;LKJGqh>5E07kNc*^{w-}zmP`A!)y?@Q%^?6=Geh|wwXgEi#;bg&tS`gLd^r=zT<*NT-hKow3KUL10hi^ z^sAFpQ`)WG7=yNMMmC`a`E*z88*=Z-kO`VJ@8Kk4YN6*&$~5V4PFoTxH%q>Qntm-+ zMJcu@O)ePQwl*lw;*p>cM$c8UII%p60u) z55IYyTiQ6Y8-jTE;!*4 z$s|?<2Gk#0@|IguPpN{XjPEr0YpF~eJ=d`1b?v)ieduAK($QE*@ASqa$Oi{(iz-cd zZJC&jZUGDXKnGl0)pv2U@6F(ahr^dzGwz5~|GrM8{Kk zhHWpwWh|O?j>a_^?{1groUk|`#k!O#Q*ynMV?#kTWn-Px(Va+oAc&*Iu|YB$JNk49 zJri7okx=)CH@hzlKxPPS^s~Q|-t(Bg10LGot*4LGe?4O2dsg-9wZErA{*IdYi#Gf5 ze<}kd<{BeNbAqw>_sr~nM3jirH8#i*Gm^daXXPDl+`quF7J-|y1c|$r*?%l$g*}-^ zH3aaArTK42Yx~Ez^&l1&*Xz78q<&<57KaD{6L;hku69gp_BW3TF~BmX?}yI}(1X?l!^Cw$ICrSYc*lt4xG^19SuEKPyW22z>`a zKSiztg357^5?(=8RQ`J#S{X*lmj*1NdpOb!%)?g=<1cuA6o`NH_f(CN#1C7A8b_@L zxY$FXZNdeM7W~aXvCM4afM3Bun;ClbA!+FNi?j1~9|~C{&22V_(s@m+028#C*5bUV zlma)0QqXZzI=D%uqBnbM(Cy4MdcxA2$l3cB?fz#~7RtzCA*)7hZCbHKWBA3_t^AU=j!hWlU~M7~$| zmZEsdbBX4ARIelaZTmKMNWGa}*HqU@?U2c%*?8GaU6{{pAJQ2JjY*XvxJC#{>%(iTfq)!QmK@T zI_Qf&#C|sDo;z133Vv$fqkFBTyPm6&dk1-_+M{nHp)LY`~ytNaT zskhzLG?!jmtftUKwchN3*A7+Y4kTV~IBe!K3BPsRsqUXG4G5wQE9MD>pkwf1Ym`7@TYKG7_@*LB`l- zNqd-=X3_OT`Ju&VT{fsjh;W}E>;^8D+YZ&WnRL*%&8HYd1n8TWpLv}Tc_-lJwr7}h zFP%pi6>n2wqsxVH(hSz@PdzeeadH+<*%@^+R6V4MYpvTlKF8wTB+uyX`Yjm36WS%<12seECsSq9VsBX;FYsLb zAwxx-(`(?X$RRhgcwFe#v<(~PS6$(cOVX!ETPjfN01vs6@=DiR_cJ(M7m}FYjdv-Q zDb8n_7qcJwl@o5Cvv}$1V(s!GLrg-)T9RTavnO1+d3g72ZTRUBgZ-Djtz>>GJNP8Q zY)fNytf+K_(}fJKp^TXFl=rBrN#%ZEG$dnR?<#C<<6ofQ6w)MjBVOpWQ;)CWr?T%) zyJ{TOEjOERvwH3u0%{a}&R4zGN4n!}+n0&EE<+FI_D*`+o~hqZ@*%-@!5>|->f}cf z7IyauvHsZ-9`-%wJ>DGq}6?CuPy4_jOc zf~BLT=+>;k2=b7*2X|c#eXEyCL460G@oKnUnUv5kMerKR@rlTM>1Ki z;jVxD^V*yr%pZO(op88NUDP_)X6sr0i;8Lmm#2yLnkEcV5vf{+;Y5I!lvDQQw68r= zDPP&)`E zPM0(EFH^!bGu1X50=x2wCbUv2l37`-B5YaOg}S9ZYHj@dO5fzY;42vahkBKhf)stp9jQV?}}1WCfNcFCVdm6rrg(2E(sc_Q*z4 zEcw>g)_WAjgS~g*5h0XA(K0Wbe>04ojbbh>?4UDz(SkX!<2LO@_Iaag4zQ1DO9)XG zfDDo^tMapYY@eknk)wK~c`4HYuRPPvmyn`J+ut}he0CC(=;n~H@H?+=6K>Q_x=lE@ z8!w{0-^}>i*WwE58&h0|e7JqXWM`=FtHt=@$d1@^eReBE=ze(yF4?q*yF$nw9_Cfj*pl?@6w9(A;BUVl2_+Uvd4 z6}!oNb;==XO15fliHm?m!sHk5@_KR>EG@A<(PiY3o_Tn*=1qbo0%03dram8h@P8q; zI5aBRpfkCSpUJ0f|5CR7mF)YwzjKKEo2!GUVuP@E8PK=a|F;}2?hAj!du;xUS^O>d zVXyd;dd?-p3k2B~yvH7O6`0wNfDHn5k@XsN7k~7|l?PLPG~pU-22q-X-F?E^LZ4@i z1)`EN7-HVvC>JX}+H7i3SWTkxyYTJ@pLb4MB;G6C0VmVmgi?3zEBa-L?BE0#$0_J6 zx(2#K{A78QR4yCz%s0;US(>|I)R$()2BJ%>jtx3$!#GcNjL&mj4@d|s&bF@|&8|B} z-~pWde9YcYv*+pT3skk3oF=5GAD8_OdwZ4nuXJGfje zj8Y+08l#3(HiHyTTF>F)?%XE4#VtdH&?Kk`!z*uat(;&N)GlOS$Y^*6!$HR6A-%gK zz(*UW0kJk-f>Zmlj?KrA>y-3$>*Jlo{U?ZG!a~ zGefd@4m;O4JH&L~<)TsO`ZRayJ(`Pr1j@!&E;WMhRfB9(a*5iUBwBmJ12)d%Wl znQ@>j{A5O*3iy5dM5wBeK4)Y`Xz^4w;r$QBPp9@H<0$hzTBe_7Q3sI=szRELQ2oV6 zV$s^`=nvH|Z*01;?y-1jyL4(GjsAYA+9s4=p8Kp= zwHd?=nU!35-Bi66-)N*UPT2>8sm@SU%9`DAzTZ#|@N-cn{vXrMsTb{};8x`5<}^*J z1v$OCa7yJ0UAt)&Sy)T=uA+Tox?`Ddq2nJ2KzPXwC*JzbU)4U@yyxBHVO@{=Kc4Ru z(8KKZQra1kzEd-$WO&`$e!SYq@RcCN<%^%XUu_Z5TOn-FzG;-w8#OpHq_2Oo2&>>kQvBDTA&0!6M8;w7dNEC?=zWhnnBj(- zF(0DC9Ueo!!#w~mVUYX@d-B!iMTk9Si08p8wbIcWyn}g|n)B6r#{A2hNDWCS6<_a9 z4Kt3%1m8@q8lbw#AybC=WQ+PK^Dc3{f|JcJWa)+Y_fXs%qRwXaq`e*yd#1(pt9e|q z=~CJvc7?ByZzEdB`YK;nW70#7~(dq(V$;7*}LAPkIjKLg_m__DUto=TX$uTl)yTbrFnP^{<~|YRpnRn$ zbaZs|RM_qDuTrh|{4?sTAS#`oy0>_(J##$|rV)?rQWb>6nI+z!MDqR4qQeF~^VQ@VLxAc`Vgyk*I zETR>paq4g+zB0jBQJe~ zBE}4sXFXLem1Tos-@toWhFWpRZ*kR#BuMHz$?N_f2wAXNeXXDHHRnIV%l`d$B3U-R z>2n#|q>XpnW~LictX-B5?~8T{e(t=$ha_1G#+99}HR%tJMgPF_T0w^`u4Y4DVzhOq zq4k8fAnkBuDsBwXhSh^s|KE@QrMGeB-;n#fk)~YFZ)akO`ZqHFw^FaH1_z|RW}%1V z0kp-;?EE2S32Y7h6kGCxxz=&x#`V1fk68NHyR?;`Ad85|VGh-yJFM+_g+JgC0|U?% z>HxHA_Wle9slPtwnz3)2{L zB12M{EJ*jBPz^=@GFV@Ye(B46`)ES*T)6%6?gWz{PDapvktf1va3DIIkTt%PgFo5c zC`zAt8P?R@kjPyk&=If;UxcpU$tK`IF!d(I@A+H170tdg5*8`m=W460$rz^>l%iqBsLC8)XIGXY(2Da(a ziz7Q?uuyU#)LjR|XZzi@z2=d-=eM_=&Az{m`fq~bmzFm1ooh6C{4xXM!Upw&>#C&_ zM$h3@eX@}FUjLRZ1$oLW;aBM0cHS}8FqnK@1-$aTRsLl$sTVmV?;k#5|GjxA&fJ>@ z-{kRglCleFkWnC^Ywbbic1HX(&!|1h@r7Zqk z+G;9@mORzYJ91Wi<;oQg=NqN_$>7&du&X73)U=~u{PdUXVlTC3HzS$J#W*FMi|H#H z{gc3YtAZW|0+6Sf#cWW%lLwV0-Zc>p@eYkW$p&TOs|e#SG5ZDURQp4W%3s5z#$MhH zHop`1FuB?iyxoK~VZ5Lv<}PANG*?2h9r}x6?EUNN_W}kHxj{BNn}ZFyb91T+qd&%5 zDI!>h3@e8`xu2g~9qX3RxgueB*eM-$&~mrh?#kY3W$7?bXFx*G%eFg3rXQK6jZf}i z`Sx}9h?9|6=$FzkmVE2k_aD=%BXTbDoOs2WwHSJcopao&2shN&k@l{8Ejbz1ODXC} zOzI6(+vQYjJ8gZSdWcu^DEJLn3<9FXj<*gOW!qGoHy-fXKXN!^fKU%lLpP6=ptHzy zYwT6h+DX+-<1dd}8a@_5zUo!Euc*F+aCftg`5SH+_q?;o_55(>rjb&xQ5Qi~W8_z# zs@v-$_60+2AqA+ zaaq=wsAwH^awXTPS3YdwK8NRL#_0x#J%*f{-;OQ$?tHiOq0ZVAc&-co!pjpYag)+( znPz5@I9kkTL*e#jlk?>F6~}8`gZd8a8VqDQ;%rUn39*m3Fb*3J8`O5zKlBlaII@Kk z_K3ebs|w)7js|&#uu?ljiE?6yFf%GLXhe5OA@S1Dv|YiYD37xx1v|gFo}J{cdw<*b z9NrT!eLQI<9%2*DqgfElr28XV2=vLRv>jm@X}!(J^sb|ke zxn+{Keud)4zyb^GDPRZuuQv}! z{6(Pkof4Glr0VW2jJen94VaPARE=Nf^TB^BVuM!3TEQ^sqU(X3h#ukuhXLqrNDbg< znk)XT%nJ_v+lg&RTaUvW$40(~Nc^r(vXvC}Ahcm?=11?ytljXrzNauzx9eXJWBd1} z$p7iO$WHTAmA0u7OF+DVB5$ z`K!=lZXnfSiS#~kQpUKo`Lit~2-37TxyAt6yTj25`6vGS@*2_pR{j?VbzFiSP{|2aiBSka5fJ$M=!PLYAisyQj;7viM?- z$|e{#+PvPIw`$()85@u8j^znJF6*3#7PXq~V|`|M5bmoS*At|Eps;X) zyA^tYE8NuxXdmGbbUax+lSH@;4)c>n#78L}8>;XdY1*2~Q=^gIGR^~w^fXEcki!lZ zj=h^zwt#@O`Wlq=8c`6F4A}u4obRvbWuW_*KUnJSUO|jQXl1=XBpk z)#(fJW=Jz($>Y_6jWhnc{Yh=Qg;m81K`HQ+4e~|RK~BJ_O$=>O)aY%9fVouA?qX+Q zeFPjn3@2Q9fvj)ci!;J4Ym%%A7rehi)|Deqaj)a&NmK0&Zw1G(wNc3WRGEsW?Z(}? zvH`Y+ps$S=GgpawLCQPzSkr16kz%>*BL!JppQ;y6NrM$X*CezJTv}P^t3vZvy54wJ zy|+D{;u$HeEU0wIu`@>}5a*1k;U?VGrx;NqdQix0n~zD*r|(*>5_Q(VtH0^oRAl5( z-v+`%Sl=)O8n|Uwy7mG@H0sx2b7wKz&kJmjN}e@p?D4$v@Kmf$*%Cr6b&6FS{xD+O zDxwpd{@|JcGcmp~EV_Z0H9+@OD_Gks1p15L=XsO<6_!9L+Y#02Zc67*j^y$bHIpLSm4={PHpL2)cL@q6$pb zBbu^9#l~k_`V~|R>gyFnYRwAbsn1xz8}9U{EBqLXu~RjLjhsoT3w58k71pXy z)}+&_*RD(sN2e^p0w$IT7I>mr1EuL;qWHz6_h9&vYQ#uMw}9!&_>RjZzA3D<25KcWs| zo12nw_d5mmTci&a--eF_^K2nQ95pMtk?)c;!Y_Kv%D4?14fGMNU1Y?EO(8?I!Sz+@ zgG;t3vHbDJ4u)3M8}(3rR~MS~3FRA$7RClUDzDa2;KuleDVJuss*t(w0Oio} z_hQlqI#krLLN><1QrY|8mpw*r+?(Rx%tc0E$YyVRJ;bj-`4-e{+kg4R(f-tq-Zvtt z%FlM2A?#N(__iiybn1G6!&Su?EIgTn>HbDDHV(SB~ zVVO$#Zc0DK>;l(lIGYpQA#&lnLm4V-o{5_fGnxgtjXs5~*9q3jyCv*!W!7QX9z4E! zervm3WY=^Y$zw;8sih`)Bz=BF%|CIO`zG`U{ux?>)mW`SlgbV*yzKt=TH795<>Uvb zrTdsdRv^3#{f!M0X1GlCtEz0l#YUwHv3IO{xLLhr zV7m`#C*W=BFAwipE6g4dr}#Kg&$_b&U(F%N<^Yr=2D=PsGY&?>LtG(r#UA700lr?u zYL30`anUz9u)3q{2vKBfyMZteTL+au=?kRi>dOr4i^ZhdfmI#?{IQow-Vdd$c=uqy zRlY9LQWW7y?SVE6^V74)c!I`!n{H`j!MW+{O@&9AtO_65y5hat>{th0G!a>fZwPA? z{4JUs{n7}^kLHo>ZtED&r)Fc)X>=I-_0C{L!8LBj_!odZ0$T%#A~)Tm31j$6G-I;6 z5$*KE5A{~*v(cljx(k|;2@gT?nNu2TXKO-XO+P1v5NLR=t3ay^+qeq&;i z-nTu3w`fgg=I0e51s1d$3*Q&N4b6Jw;nx5duZ2n}VqPIDL{e8NOA6g1#JJR}k$J0Y z;8vF>x~1^Vsgr?>Z&UqVYj*IlLTso8SYTkmPjtQ2#YwiHF?xsNV;c;XF=GzEfdDr0 zjE`_DdJ?QBW5k?uc>FjpD2e)oc1_kYZAIB=VBk^3b};nyy4&q_xQVfaTdG=@LwxdF^@_co``W2(s@WVZH*0zy<(fG-Dj zpsWK!lbDE60osL$)+-YdZV{PwZqF8vHE8CCHQo0FkBlI!uU~V&uZMKDyixFIz8$Lm zjfvz{5{eCRH!KG~Mj!jaOow{521n;wDqvr4Gu%EKf}KR@1ke*3Y5xI-$fV0>QW^N$;A~!XC%@?GSVSIp;pmp zOe9EMIBCw>R(CN&wQ9K2GAZI|;OQ1a1^FlXk>*OPxjT6+P7*Iu@3kJb-28eWN#Vms zZqHAh1`?0|7onQJ8(sOm-2s{^ix*F~qRml#X#wNG@-?<2#4y06JDEh)yGU){_IveN zSwK`#yAhT&;Jj1rR295{c#R=Hyx#bR?9Hm)f-(1XRpm)#h`)J$uJw5FSSL=o@pX7n zK~i*Fiepmlwo#)a4=smojxy=09(hO0n99Sur0_;KAS`2~X*-drqwxhml%QlkV&?#> z14>itVS{Mp%zS2?Pem{<)s4(wm0ML+Rqh}7P4>a3Uc~0T)aFkf&l-p0hz0kb}Gck{yTx zge!u8_Jpr?mtqPnSS1#i4SvC;X`gCP5*zdyfD#dEWL~-vwU!NfSGvN*28HOs*r14X zRwwfdVP1uP0W;oi!3Iq(Z7+cJvZ|fIOU{~X(5VhqHGt66LvT#4_T3%aV>W0IQ6k3V zBHV-iF^&M{_DUF~`3j+|xPn$lxi&aC!1yW?TfbcsUv+wxwCOqVpbj~TpIw`}TE_gW zYsv;W*^lj7ZEf1?y}q@fbxlOUP&a!QEY)xn*!XxO#p_U_PRZvb)UWg)6q+VM5s-*z ze}UEw)`valT0sBOv+DWY3s<30+2XJJ*dITD>=&jo$YU#=)K6Y>cKrWC+7AGE1w)Z5M4ZuhJOjJKtGkxXGPKbdO{vp=TuMb@6zj zAg}+>q}Z}5{i2bt8&X$wN|4w7NM7!py*&E@qKJDgO9~JgqWkkMPkcE#!YwXzJx5|; zcqt>Q#ozmIy5qH6o^(8N{T}PL7W>W_(lZvIH%m%F=-v#WQp(xH{oPwSnxf^^DRy4@ zWt``@%TMd{kSdH2DOPFbQE-#&LZfACUFQ>~3Vk2eL_<3bMBeoLLvQH1p+X}dWFyVO z_e>ZZNjvgq^zd}J_I0tJqO$BC^3nOD?;@{*v`O)-eq3>A82t!Jw2V^vLY--0UKqa0 zt5MS3YwLO^@kvw*H$HF^D@2QFuMN~|OV4t&S=bGZG}UP6?WsL-(_pb>?lGiz2Us~= zj{tKKhk`IO(ZZ#5V9?3;lM*j|&z-~+o9%rRvlFm$n|nLvj^_2WBX~Rc=8TBEH21od zN2OUC!x!G_bB3hs^tgD4`OW(xz=ZK}%s$%E_}oi%1h0P(aaZuAhUwWL2Q@P`$N-UV zUoH}T^>aPBUVI(g4`uPXOs);AHhKt77C~evvtef!)K|_o&n><>d*RL*lk=%3{dY?9 zf|q3K2IW@_DEidkVlp~{3~6kybNxU}E86gXG&;IEDZ?F4X!&}_`}o+D{gbt%-BPMO zK+g3aK(vErz-e4CLi}oyV1$aVPV)+6R_k`slJTK){WsEto*s7g9;|K_;>+N<(4EEA zG~=G-c$v}76F$j@ma}@VC4XeZ@oWU9dDaTY5>TTdz>M!K2$U=VW9gZJY3Jr9(3oih z$~JSu6@a^P<_IBUhjjG;k)A{w9ur`x`Rkif1Rt->&<%3e7dnRn+y?f|_FW`E{LdH; zM{D0DSVE-zbtV!Uko)^-A$8^8r@m2Q7B5WQ{X8-*Qd%;)!`CLe!KK-sWCLXr$s=*BS`owWnt1XDdYicmWs6n2FwgV`X|AcnF? z$FmM2L!k38GLCiN78`T`Ml-ACmB(_^00F^uiVb=m027N_+wxBQihZ2A+uxuT;3tl}&<%y3813&*L7!sSGl2{_w|1JsHc@aN?b;P7dFxK}P>$=P zS*~!2(5T#=i~W;&qmM){bcA$Ooyd!ZN6m%FWH<+nE=ZsBif$_yb20Z7x#lX@?5?(b zD4YS9kWUeq8knkuec1S1qw&WshQp_G-9AhsbI6U-lPSEeKiHszVMZ=PUt?DVq4U~# z>r}knTUhLTC-n^kX>=-W#T7-mQ5&w1$JzIf4U<+glCIrH|7)_bR=w)XGg@}{J^UX0 z_A#t`RwiRB<1Y1><*(qE{gqmIh$&dZ2zXqxcEr1Z^-J>dF67C*ZNHOR9y$F2(>*wH zIpdI#^eJ* zRF$!x0ga`WGIO9#Fp2&}X(bZmn5}FKdUdSfjJ=}`;@FhT{pVjE1S*VupCs4-s3RLx zdK^plMI8dd>EUf-bTymqS<$4%WWs}D+`XIMy;?j4;DZ23PU@E~w8oNg3Z&X*5(u zTG{_0Zo13L#pvBX)DM51-S=Oz!Tz&nz-Pe>Ngyu$3pRwXwVjQbKO4Ur@VoIPCJwC` z+hz1ZH+fCA{ax&v-U8V<$5CNYnD0qINI;MkhwXq3WTRMZqnuML=Os=yD5jGXSU~r| zLzzjK>5)oqHt6;$UVay(GnQ>pWj7T!K75Zy`i2=>ePc)H!SVmsfY zp&FeY=ah-Rf}ouxS;??WT5%H-r9@U7JeD;c199Xe^cktcxo6$Pzx-j{4OHt68}y3ub-FCcTCwh^A*78IbUzx;;vb<% z?)t45P4NqyJ=T7myzF;Pt@a1s;^8UQpg8k|)d(VDjEpo|1#&MBV)}Ev*r0ULExMir zsom=Xpa!(;3LryuZ!oo&;K_hAtiDPg2i&;-7{BD4!qHTqE0$BZfh*Ji@@m$&6q3$u z-n%vPC3V`i?!hR0VD`7nLusnVPY+g#)v}}jA^p<7y{;Uc<2phq9D=Ci>7n;zmKQuLiI&7n7z5&vs0>|EVuLmX1sR+yp3W1v zeMP&|0PLWSQuP~Gr718!@-0o~LOcj{VpL^KmLAeNP@W;;O$}p)Gi;nbGEii_#`Lsd zXaea~zuenz*9A}OV&>OzRJ1uXHze%touxp>Ijls&=(jW|2+aH3_0wNfmdSd(5i*{9=gff#?Hql zB(t8Z+jEUcXlB#l^QDYK7A&6aG*&Z?(+7Ll-PXs#f2qFjWl)f>wrB8JMXf77?N^U$ z`i&&bXT{xo@L+cai9W-UgfBkmZr_k>#0+eT6~rM|FTWC(+}BS7);5O z$8p97!4G7*!S^CbF zjldOanUmarUdO$a0SmkR&?krxRN#uYXwTNQ$M5weHQktRF;hQBBt*8+N8D+jl>^RLf7I-i;rGrT43Gt}6HzrP6 zY$|CS9{=>>-iL7hpF;e1K`tqto9CW@7Vq>d=B2+_xxf6ubuPY5RQVs+%6YkR?vMXS}3tB+~#Sy;MGX)6^C=W&{Dj(%EEE4*(3OzTNy7* zR+Z*=1gA6`VZc^$z*ZhqtmGOOE$>2$-7Cy#en_c&Q0X>6_iaDlGKBFGyQTx5S6v2F z&R!}FNtc*^lr_N=?W5Zn)DQMX9c%?oYJWT+?$bfhUGbAl7O{s zYG>BNVt2bWJtbXdg;xDjAF~>WNoQS4hb{#Z0EYCU<&fR$z=i3fQ55rDU-wpXO;&yP z3F_HQ7v*A?C*?*(u^XjFITsLWm>NR0AT2-5Kg_=Oc+z6`gh2ZJ8I{#WrwYQ!3deqF z$b4+j$?N0Z7OX}n*#sks?v_4>j2J75Z_Ehx&AFWTs2W_2YW2mvfpl>T8GNq?jJ7?* z5&U}~4+1-wI3>26HHqPy$L&W8;f~z%6A#j>8(a`eJZ-K0#qzmn*@1nXDdMEmcuAdR z1r4n$kH*TYpe?hWRrYXdpOQeztq-oE4+(yR%fNp3*h?|ajA95EA` zIiz>2CJgyHbWneCdqrddE8yQejvAF9SErw7&UEXVFOMo8;3^F`xD);8q>b5`QQDHD z%GFq*{a=lVur-;5Q^S_e>TleLi9uG{Y&WedQ!*OCM|FegV!&f8(I@@aF4Np61x1Ki z!^8c=gC$Al92ISk?rlCML!lR(+hQnF5$6skU+~1GJ15*Vt7)<)&zf7gQJF_OantL> z+N9@3+}tg1^UwmU5h&PqZ3qc3?juZGSQ-_iIOixCXAczj)+b&Uu+q9s*M3;}+w@#) z^wu_zKcYN3hfGEFGKMcqxQ&9QIM zq;If=sr?~bd7{1N>7T;k--N`^tH95oW$$*K-~f?0dc3Q}J&Wd7S00^l&%saiEq_tW zaU-v<7l_4ZFaykthiGGJuIifR&{F%{#}5AB`=nguVpqLBzOm1X@2dA>?G>zq8YzjH z%`6MW+y?Y4f+`Pe=-SoSKm`Nq-i}#B^D$vi5VkEwLhS{wF!M&ovYsJn_z1J7dD*_ng#BtWgH={SQm;toXfO zFTm97L+c^|R~iFkx{eQEYCi#qOzp(m1j^b3f+3El!I!WM4Zm8#uA<{!V79k1*dR%u z)WK28Y|w}JaRdWwi=i|v+uJ0mhVo#BA_2?5;-O|5pj^nZ=u1G$=PX_D&Mlxf300ao zrY;n%EBO1z-#aHTG%&SzpmP8*{IhdRozd6UDd{hNjIM!T?Ztjq zr9EgTVt2O5fRPDjC;*v3d<=hJ$LH^4^kQlWH=z?bED<)S(}b+b63m6tX5<+fVgGMB z(wJ^7gt=i1d7tW*sw{AKJHVAj)2fVfE>lDX`DfpW3`OV!0AEO}0p(|ZH9-35b95!9 z&XS?>`wM_Fqz3^H)Q3Rs#qnb1Khgk?k-Kk<;b1b^(#;CSGq_?|>C>ukK-`btV}t=C z?|307NgBm38_G$+ad$U#)<1M;kj! zeZ>!|(%cBo37h6WU6GI>B)w;PP7_cem|R?zYkL3UX-Csc zlg=;J&+b{TKO1_MwDOt`% zshhgjKt(I{4=0xMf2r#BjVRblI>o)e(`48)p7(g)x1|-tM=LRk+oR4_&m~#4#)8JF zv@{=?B}5w@*zS9ZR!7BCAQhizkls&U^SehUee~C}E3zX6TUa8@{iqWiv*e6A1ph+e zifa+`SYO{oZPCl|u=PA?)o&AI+H>;=ctWnqt9cqG+3ECa__cBmBUebymiC_027712 zchok2hIIa;3-EvBGrk2%)8b~GALGU>ZQKAdW;~QP*9oV9X`Ke|a54ZR4c`g?Sm%rI zLC?odI$vX9Vj-|-8B`LUSphgUGHZe%smHP32nFC!jjSnGk4?;eTgR)}=-aPsxbLH_ z8SWckzySz}ME?T&JZzi}1X8VbQ8B`vCtcoV+yl^pYHmbxF8U*@?X1@#xX|y(#2c9y ztxC_SHtq>P; zjj*3){L%@+VcIpbuOl^%%=lXBC|9tg1Ya64B%u^L*0Z&}rOZluOw>6{P2HHt1{-wD zOF_4-Dj7T9c zRK!z^L_{p3&~A(en3@TMq#N|0j~zzXA6yrE&kt_QKSuS54bIlMy>D|EG^I7SiO-n? zm`DQMb_w%63%~;Ypuvh%r%IDSd;>qPKG((22bQxcMy+Bi5m%u^sR1TC&|;~}v^Y{=2<#ILe&x3) z38Qe>$lxbTpE0pjN3hbL2yA_IIm(Z!JJ)^L#sQZwEeXG(^y9EqvEOY%h~6jHnh&F5x_#j}q4Z^Ov#z|P-movRv( z=6yr<-F~^5uU^)+O2p<8UwbzghEv~jhL>x7)&#cM0z!s(qjFPin_ z?f*gCdxkZ&b!)@8E!YqXh%}=Dg3`8yq9AKq009*{DoRuY1cZo)^ejaw(z5A_LR3IR zgebix(nXL+mzspoYeEStWM%nH+|NGGbIxSy!@V)|_LGG46Ym8Gph} z;>=aMw|_@hB$bTMp5AqbcnVC?MR;I6oINEdvcTeZQfL{}Rkvw5O89xF}J2G*|?i!$)p^kZBkMd8ElbbAh;^}3M^iFZ!%BB+8RK#zp ze7=Yga7X=3t9o=!Ue`_k+G-8>pX|3!$5Vb*w!< zh1`Y0MSF#>a`6=>0DanDG!_O7)?o%;Rd>kG9%Q2B!p!5dAtVIIFEcuJLe49dWZeTc zs6!>p3-go;hM6H`N!XSYEl&)SKY| za}JB+4ik!+*{yRejPAnb%t(c~9l-bBJv45xf!GO(>wk(!j!duwVMqJ&18*fbeap?R zOY8h9u4lD*$0ZSL0e!`>%DeQmD|X8}`d6S;U(Wr0-#Hb(bho|lJH6cbt&8Ns0kHqw zJOsS=$UG;c(rej4$;yMfGe|)@BhA&4&0N-|d?u8{qCkJ!G#CI9w$L6UrN1-QAgu!OpUSP#o$D{m8JqRg6| zP@4x*S99YVos*+IdEEVnxn1=xg~y>3fYX;NB2fZUNBpMygqrbB5%~;&-a{d<#1@%u~4!xp82cm%SV)w!QtiQ+crl6bVu~jL3nm@ezY;!XmaS~dZ zvX-NrgdbAok)6k18_%4nthcgXbzS29Pm%VEbD46!w~N;Opu(zJuHWnK=H3W?LVfdk zFgby=O86SECP6_|8ITTd&;=Z>sq{h6aKs!?eVnjW%sQJZdxU~DrmqyiA3Hb>$xMA^(Sx7pWq+Z+H%i1`JZq6<_hqY!uPe3&tmyKkFOCLG z_c2)J4+sCOQ9I#6aQ<-9{oGHHLz$OX^wN~|?`#tSOS=38V*Co-41SSqCqk$==tPZr zGjcHZ$$HBpzrS1JNFtV+z?uDZ6bTN2~(=f5aAZ9w{tWFQoPsq2xxek)I^} zuC|`|!pKD$lS-Q=rBCtP>NJIE_>-2B%Fmn2&NaQ1kDM9xF~X_hf5d#6n@c;Z&ZtZM zGC^J9qw<0shi)X4V`~GZ4;_RheDw31t&2RKq&qitEECV+xD;yvH@ysknc-Wdgwcc~ zu5z%my3aLsx&_1W!44Puw{Y%S0!V>8AQ(!FnZ$FasUMMl6& zn22uAv>NfsCsAwC?DO|_^c)sGeP=RYCL8V6y{)WFa^QTGwQt59t!3R;Upz3*HCq!~ zzU7YXz8Kx|T?h0OhOc=#-{1(*JXov$cfB&)Jj1>dn)+Zd2y9cH=mf7G>ia&tXxm`S zgz`2SOlJe}+prNM=tVX|Aaxo@yaWzWqmQ#=AkIhHbjUkE1AFLesEWZnJH7dk@B4g= z@L>aad(P!g*E){+G(e71UE?Ia;z1p3CBOoaz)=h+5mL**%cFonWCDMRzmxhBkEpee zGeyy8P4tZe4!!vjW@eMKNkR$meiXbf-FoL7ei9(MC3bOYJC{#9qoHD3UkkP(#Wlo( z!bE*24L#Y&0&HTq#%6dz-9V+}6Cvd3Ma?*G_Wc{OQ@B#Al$^xeX)vr`1NMyx*B-$k zN-YplrGw$j1-iSy&w2DyB--idB8mN2KVAMnq4z3PUWh@ec!Et!S~akoM2w{&CtX<8v(k% z@lZeAVvvTeww0n1x8G065AYRcM}t);FATnb z?e=eNcB+vOrW4fX{%DS{ZnW|FY=YNUUjyE@2mFuqVX~pTub-snDHWioE)Lz~PrH7| z)wrk`J=V#4)aRY{Cfn>$)+D3OaGObW`&gLJ7i>-UvO(G&8na(Re-9@eE0+nx9>&aF zRR~I7d*A->h&pCMUfQ?L;z*{Ynxz%0ZtGJl01SaFaVN1EzhXaL?zT>^OkT5Aj{P>v z;?&Cz0;zbY+;-O&yGz@=>DbYUexs2b^b(>wE--4(&y zmQPx{jM~oH-}dC=e;X(WmES#GIv~-T+Bc6L9pk>h{Cd{_6VMJKz$!o?`V#j7U}ITE zMr4&iC?Ee|v3|<07!e1t(qOi&B2mSC6I2Y$U{Vbj(50=BVrhHwp~777W<|A;F@k>=^gi zPmy}dGWZ`Ox)Gak91Hw!SUoQ1TWW=`wPCyFEqr#E`T4xnZ3{PEsv4~h&3XBI!=6ym zm4({V5#%uo%cnEJ8$w5uqhs1$Bwf{9dh6L!Q;DIS?42i^9YJJ-N$kOLc|?O+Nu zN@+ep@9MV=F&A!}tr=LhH1TEPK71oSc!j=J8r=SYwy=a!0V4_$1{SDz zttmeSBKOlH*kt~u3xF?%XOn$d9Ipj|iSSQ-9nX}`l*tS`)*Ab9ryn42RylTSt$jHE z`U+JJtp>+AL+ktv-r}I1?qkBWeg01P=BS&^TJkN+18eebPUnRc%u;%xjt^{}I|nBW zX9Lkv09B7Dh*G|{H(ec!!k92w!MMhje1Qj4>0T`|!YQc?`+*C{yo=cyh{ZUeGL~LByJ!fDnr$8;QkDx z8GMem(4ve=xU-`b$RUZplMZP!o@yz44TSjkGC={{EYcEHimb#8n|jLhnnDc@|0CjsH8U7XR#~aiKh8|9YD<&W{vo(-eIscH4 z(GJ~b=|{x0>7ndX+bUQeUCRjvBeKluIXfHXj$MqryspJi+RosiMZ19#_+9(a3!I_x zGy-?4nJxKh7w-jqP0gLR$!-{0Ns>+(b4l2Ww0SXy??i?V}Cfk81kxjx20=^^1#>LxkDp{AZpBH=OXs)m$itlj}<9jkFK#vG&r*^#)OWpx8@(eeHFeDIX*qu`CusVA$yy(BX5iFDSAfW?qiM7 zb1dKa=-J&>YM*=VzPCKIEA&QTkN!h17sM4et|t&jig}|*_D=G3nP$VhIC{HQVbr}& zXOYmg*feWeHl=Pj5WLE7)K!ZYA= z^_hypyPL02t2h*~o38Gw3#x^oS|)ST_%v@;Y8g!o1wC2F>+H3QEcN$T)+w6JoQMb& z>n%O$cBZ8q&}vd6e+1&H7A*R+D^J}UO3WaaoO`nC@VU1iBIG58w!Ce5@gLpBP0qAL zZ&H5E2TEZ1M4`X!NG@s?8u z=soRDwyR@=AH=L#cmTQ4H=?{n`we)A=3}k%u^DXICR9WC_`cAw%u5_qGEiT|Jn&-HOC;?P0)S!g(GC3{obl%g!;LgL}YaMrZ29-RD z*?YlkY+s7fL5Y4^u_KzhGvUOJ_^`DnFX^WsI$EcI-gmm2g)4xO|xF3Glmf~tIV1fF1a%`hCXvM8LK zI$EUPtHNz*`{oMTX9ZIT(hXZL|G25;RPc53rm^YJc|OZOIF+89!=KYrK<`-dsPs!? z1dYJDgSbG@4+P%y+bF&>!o!_DV(+TuPo)cNt-*qkF3^!PWX>7$1r-@{AqG~JExB${ zrxSw)l5IU5UZ;NrkQk?_e^}_uZJX&eXGr+1Z*AQllfEEkhfYQVR%*AePz4CT9 z@BTYVF-nKxG~-Gq#_GP|(cq&@VChYMiVVKCPsb*zfz&F0n4p~hJmJ-_- zTZslfCT%%W!T8nYk7m8))q1Wl!Zb#|)ZJAI^Pw=l937DE8rULxFj2Lk-p1;ZJAJha zz9$#hiuT&r)wfB<7t=oY(f<~zTEt~k_0aH+R6CO|`1GxOP<`-O^ z9hz7T141c)#uLx`Dbl1j$|qrK*1Lk4P(tFsHy=O?ggi=0t&NYN=EBTEQoo0vcDV&` z=clG2JDOb*`5{sCUlDYsCeI6i3sEL4kQ#?(6Aw;^UqPEUpeA0~yqDq}>tPVH`>^iw z-!TJ9BG?D-psYcfzzX}aKzZV`PwVADdRGSFy5-vrIqLZrC8dmt#K(_A+rLNm9|F}B z_Gi;&KKAInMC#S{?6*1MZE}eVC<6s%>?eT^_9bx@=M;_ipmkOjw{zf?FIQBf{s{SS zF>Z(?2IO)f6wH7Du+QTD=DO5M#&^y0lym|9Bep=C=w=#!M=8NhD+R<102WV(-MwZ4=%~*S0I8Z}M42qyG+_pq zeF}`siGpCZA^kxLvv}k)8P%FyYJI_1)|#1fU)y$A~wZKa9h0 zR793#Nm|{NvsJ2~NgaPYEaJ}^+Z*PJH=aVHJPZya0+}sa0rj(Jw%qqMHJc~d#^^ISL%yOpNpsY^)mEWs!O_nBSuMXPV6lpYo{ad z@gPiqM^xZYsv5D;N|A#jm6-VUX-*6eP#Y&TZ*_BOm*Vy=!*$qgos)fpVN?jXn*#Ix{1nDJ9&cop8H9G>2nI)gsvb^~R&!<433zwj7aISI3Y!z2ce zHJA(K=4J5uUZE|!Fc0GR6=5rDoc>)qi z`BG(0Aj1h5g_?zIt}?c!0cIPdf@}kW7a(X>O04t&G8n1Jf&@!Dz+Ls-kQt!-fb>M6 z1^@h11qvW?r20QUb$K2Qxl0nz`fbXolWwFrpntuq9uq+E-ojiQpx?C+Fw4tq7MX04 z2LUUc!wHwC&&yUZrqvv9b7PvApCgBjt*rYgvTHjBY_wEgAjyXvGNr&OIBPbewQO;| z>~&ephMzQV6nt^ZZ;{l!7mY`{{3XsD|JNn`Uw!>oaCPf_7-aME|23Oe9DRhXga3km zS1bxEpy|DfqBHH|BHP~zPcVeLaPB@zO`0W!0vtj()ifCvp7hScsI#}Nf1Oi`qt>cz z{r8fGGKk6^kFizi0z-R)9W6Uvurf2!P4m}Lyq6DTr?A!@jC%Bka(Px|G478-fwDQxi<~-Na_pi4OiMxDR1Ux{|u`u8cBU-!xL|BUmWc+iFifc zQfqX_S&m0Js$6A#cW%^dl{xvEbEc=hVeEiMz4lh!QEEfoNhjjapeTAUiWdM93e5Y& z1t5$C#OF3h6*x=$4x}XVpBEixyWuh)sz}675!_aF-24idn}p$598ru|VhI-iGE_~C zygYc1ApjKkXY-h!A{P)>>@hTbi+BsJNP}+^78HB8ft|>sp$~#+%xH4XzHT*`lQzdK zroFKFDN@xwLPMbnrZ_6}$Oj^o1p>7kAlDC}nYlg&y0I41+Sf1>OY4clezP|ZD7dF7 zoZ{m9eU}K<`RwE3%FH{Ce#WG@Zrqj<Dbk31F%VH`XI=h=)Mu-E+Q2V|D(CT2#2Cq7I%!rW;;8v8IoE8L7iAav z=PQ1x*dEBAz`uYwE`%Cb^$16^Le+jBZxCKTdS*yA>1x#-D&KmaHTK-1^7`+tHP)@7 zNm0&L#>1X@HfE}|JzncZcd0Na)_shwDc(F+YNC;QjA7;3wsm7uPrGrGBxw@F_3KQe zkmNh-U{l@{vOVAthf;~#no`2OAEHUhu-@ch+c_(qbt)-J(Ni$L+hAngIR;plWlzD} z-$u-NImivRxunNn!zkN4f_(J*t*4#1Z0(+=YdhB+3$DEW5u{1%1_n@6OT0sr7vAcl zYTu{obZY94*aO#F_m7l)>3{p+r%3wqgL`jHY%Qd;+SjalnsQF1ytdipV$mp3es{qK zgB`KH;ijhMcFnE0RG4!SoExBs|7}|-V#nzn-KFoMNVH0MXVjJS-P(DbILbQ|2v$$C zf$_tUr_6Pq7~;lX)2KGFZe;ywP8oAe&+1Cjo|FzyOgwR4VY+5N&04%evl7aWn^=Pj zxHBi7UD;R*a{3aQrIUjhUaPKZqPfp|szux1s?MkKe1(ZVnu5JPdzw)tmg>q`p{BX{ ziQ4-JKRJRHY*cMB>8m>A@+@9jQu#^6*o6%I7_hGk!Tu0DZ6P0S69~pb#)jN_x{zT^6YsxrDb*2)9%>nPc`U9@n3)r z_|U%qT^e_g&bujmJWG*xkntT%vwwx$E4Rf(K=(^Ty@XWkI`p9c;J)Uz<=Mil<(F53orNCTNg9yY11!N2SO^>UCt>|jcH2eh~ zVt}u?{T;wVu_cRA9$P=y^`$GiKro$0it(-P;(43^NmpZbLm6aRm5x(qjiJeNEipMgy zi`P?^9>^>{4aO-X)_Q$_?Z}q7k=mmamTDe$*FyCjRu6rm0|M!6072BD(<&yz@@u}- zDpp<4Y;j%6&>HoewC~IW?2-?u^kids^VOz`2J(Cq{LUzEcXogH?ij*kP7K`u+?`>W zLYc4>=zdVBBTcX!G<)!~f~|hk6k%@38Nne`n)`snri5I919x(@qP_RKC;sSWe0g2i zA=;yBJ>N;a0B+G`-#9|fl^UnpiPy@f{0M`4EQ__4&QgG_zC-_^$)r_l2FJryxZwDl zPMgHXw_|6jT+@}ppS#NJ%i?!^^ynpyQN}JC7@Lbt$VKK*<$H@IPqtrhY48i15)ZMN zoSN2G1)j&_P)vTfsN|zPwv_8MQS@-LUHr)&_2Cj`A%(y6jSDs`s=Rl3PXHS@NP%&B;- z%>{+A2VO_`w1&Ptm*gW9zcW|%VG8lVji>J7mz!66KkaA_}WI`Tf zOS7Z!xBXw>LcuRwI9LDgxbT&njLIv~4Ug~=;5mGLiVWZ^7(Cf5fU;wFS>cX-WJEI+ zO&S$o6|s21+0qjv%t%6bhQ-w`bb~qBT{LDQn=rnQ6NgnD(gU&GCMpg|0z23jS;fLV z?Nw}?qAsz|pYObw>Sp8Ws+5@U;`v4+qbQ9R;Y0F5$4MNbTn4tX%&%xcf&pCKRrJn%+ci%3l~*ed+7_63bKOcFrGWh8|Y-eUvbuXyM$fMhrp<`3?-u zWm*Ss=?vEJKoykN$=GAj02=r;6X^<=QyXxcMF5!DNjnFz)-}SzYmxzC*$w+^l}NwI zN6YS$(dFixOvc0=QIsEttpGt87HRFE8HQi{;#0mI@BvbViSTd_U=o&|0P&*RIL;OG zjv;8;xeY=zn_(ng2rfTS1*+?nMif9?PcaF&T=I=L-){s$R+3p}0?Q>oMGSzG@rX7f zQDC>X$AW|{*)-h)F>^rE3Yt(hBM@6NOUHIT1CKJ*!N9`k0F#vwUtp38vHFs4Nc_k4 z5VD%g!fynZjbY}y#O1=+)DjN-=zgheC3*eVEgdC6opeLjYTG;VP3z2~4`93%hWA-} zbbT(E+Z=fU)U6z8-`;ZT-zBcyIkkJ2#>w5&v_PfVlI-pjc#=?ebJ zW&c0a`eG&S2dkU@wf9=> zK-FqtreKi%ZelL2oRw-O7WxWP`kFCw(B)F+xk?)(%|wx(>vi9t2P|o{k8h6f1IECukAbzv!~Uq27%z>0Zl9>%HDfmJhy`)+b@!2M5kT1Bs$( z-*8>?EICLHVkRfbBgV|JJz{`8IkY0sX|1}Sf?ua&$$e}?j`g91_R@;kwChdft-U5+ zeIv)|(S2X%_URv~IZabkOcK}b9V=Y80URbS67|jpFAOi))OYgoyn{@_2dbmpfex3w z;@?;ElFBICgij3C<9${OBTHmiCy(s(n>X>h6{|g3oT=oppyh>}44~;%*Xo}&p0n`bP=1vSY`Fmxw>Lca4^DXToKhlyV`Vk?X;l<#42s~Vh;WJOY~Nxj3X@IY zOD^X1whI9@@Gxffr7|E<55iC_S+<5Yt&~2E(%(VMa8R)mP70vS4Jl*cUJEy=U_1Ef z%fV#_sIqW-Gbp1beI7r5WzD5^Sb%)(6o@^RPQcG~#8T!0myjm^7* zl7m2AF^-!r=8o0K;uoQ*J1v+R5(4@AgUn$*Zu{pZs1~)e4+6jsFw1tyS_+pcJ(WXy*=JO|%0g&~P!T^W`7-39-tBS4Z z1{f6B#g7I+w*U-U<+C1uihV4cU}-132tk2owtN!DC7*+T;7$RI-b=elTnX21;gE!W z>Wi#e^C5r}Z8xD%zjb+5o*RhTjOEXRZY&a^Uv`Hrp%~SU)j-S56-(TvhmDE-!e*rlQ$+- z&fVy!qhN-_y{>u7f6}=oL;LXE9TPNbr=CgG*=!!bfKmSpFuHHbWacK~4pd!#-?ETX z=sd@l>GN=3^89bf$r;ov91&LZ1F4#c6CNBo?0Ug62#O$IEyi7y03g8Rw z0wL!RN*iS_X>T#yzP1@75?6x2K_9N4HZvg{M*(E~w~r@b+bg*re~QGXut1YQ`XWjk zvv_{$vNoV*aAQQU86arcRUd=e{C?P57wX7nx{=3QIjR)~%bO=NHSeH0xAM~UhxVT8 zP;2NNzZ8!uf$bCNpTti8!eA2Du@Ts1s#N(237 zPdL;-)cxXeX95J9qW+#nMp0n7Z;!2vR69(-Iyk(Jw!}@dCQH` ztN9SeIXU$hm+jY8%c3tGae8O@mOdeW_~hK!I`WuJw{hcLT{(+*xXdL9?B``eTnlJs zLlbc9AAN6cVigp{Ts^PC+NGG>o&pFtxn|!joscD0JQ$tJ4KX7 zZ~p`mp;PEsbZ7hc;P0y3KuoO99I5{)vdEwBO##)rT^1AKF*92o2a%?x`mSl?Hsl_S zwH4~y0qR%!^P$5aT>s~PQjCiMvmG|73e(=$>MWRj8lOG%kL1+G#n4L*J_MIV3GmVD zQ(Yr(d9hLF8FLAVxb4V&2^@B1XO6 z+;Sph?Rz!-tirHMj|C0ICq1b^_?CSYe$2_xZfj%k9_IV?b}9y_u(>iDdD^{9t|zG(C*<$63B5AZv)exgUT_PR?s9 zzMp-~$C-R`#sIzNk%{t&WVJIfbCasEZ>6Ng+3bzJ(J#>OPLI%~?P76-8fY5Pt{tRN z9Tpr+MVn~i0NCAn36IbHK*fcjR4MG6OwV8n6IwB1Alss~QY>eti(nhMw=6HA-uSe* zDdJ_0>uic2v%hY6w^ipDGbD-YObXa2|<`*sd>j;sEqUmsF_cCNB#~5 zJo+ZFG+4w{2MY5!2c7{mfL}H53$j&<7c)N{f3N!MDxmaz8SoG1Iv~y#DUn}0{Gsz6 zK43%c=xoD`ykT?`8#`ggQWge#xnof&-l`fbD=jd)0BA;SLCpRmjnk^GGpioz9rdEs zkJp0eI^MXEczl_(JZx$dNbqtIyooG0;Ou^{n-F)}A&%FnK|a(v@C|g#$~n0|i@q&f zx6vzm4|7Rkt}PX;mtP%5$87-X0(WHg(pkdRdhUq3x_kO?Y*UV_<6Tc{hfD_T<3I_G z-JoY-yE@d-B5YS(j85_JJzL#0*2iYb%EE$-VzL3&1#!TmYyxqX198l$@e#ZCR-;~z zUwDUkebcVHYrd=trt20BvPg1X7KR)PY~`FCpvAyctaqE*aIAL^QuyBE+}ZFJr+tRj zF6ueO)(=1N2fIaPT%tO&VCEAVs7yl~&5Ah(N3<~+B^pJn*@v@c6(n*12aiaKGlW+E!xHAG`8cR@pTjtnP?e$;NYGP06+2%ubAl5ct zg%2n0dT|AL;Yna-Y~>A1QnrP$<9UNd4}9J$PqM$a9Rmk=pRT9Rk4Tg_ZZpLG#i z4Bdm20SyzR45AsP63hr2){`bD<+*&tVuNN10)o z6~wKd@|$L_$@Dlmsb4>twp!)0h=umSq|Yon!@BrV^N?$C1gjzErQ-T^lB?g7HMU00 zTe$c36w59fjInf5+MPMdKS`p79(xn4qVlhKs{dW+EOlu-S_7PfaJc`{VsoP#YkmQo z5nXf4=>B3AnjXml-Eo0Wv}G{ zo4>Z)r7;1FVta@ShkhZM)i5&y4}gr+KY>iHs3D~sLR5{>6wQB$u}vOswC5gkdQt|= zHWu(w3fyKb3`F-LQ3==^s2>~rCyuEAN`aaG1RmdD55N((olQffiZSz1f?(+gV?nlk z+_+4+hl4N2^F*^DzNWm|JZAXJoC9DBd5w2R8`M5$JO7l{f4K$Z+jW8_*X^u!bOVf? zJi7bx(ols=oX`uXl2`Gl9#9FIATn2Gi~?J9RZCpB{CxrbM6uK&gfZ=i z6-CWvj3@ndwOb{0tF);auNQ1tf3wm5FaG}ntbkzIKf%gBlO;v}C0TN6?a1?U`Tr$Z zlIVxkqZsIj1IT8t3czb6WzID?(rGr=jxf#$pQB4%9QEB#o3SSJlY{PkSe|n*+L`l0dV$3A{19uI$X_ROWr2|iyC(CQ0-pyj`}({4DKl`lX6vxg1}EZW%d6O*|j zS9*K5betPligY{^*@qS)vtWwL$y=adQ6NSFE|_a6d>S}e!FZg+ndiN08oy((&Ep=U za`VEi0B;i+&+CajU&?kIe~yo+k?aS)-m+`Lc#G5u8cK1%qY?OP(Sy<_)eeU54!JjL zK4-A>(AVtvAF2AAw;PGy>a8g|imls(lo+EAOK?9$h=Ai{$CLtu4R#S%_5u=;)PaOl z7|2o^2^59ABFhVrvi|G3jw(1SY>Oz9JLac<>i`-~&#Kny{<%J}|!Z(DBbEojc@qXtJS?~m@P zlZc;#`+X(1D8ak=QrMa|F5r0pY7joT&k(8wQ%nAkbYug-%+LZy420Xx0l(DZWcQXQj!<_b>KmTfv2Ehmglul^IF6 zE05AChsGdaZC7x+j>C>q8+&$7hU3Ifx}Dwt4RML&3hBPT*=Lrc$0#zXS22ZNfCAe!`{xW$_G_qw653T5;(U%q~r?+ z(?(&AAw-HuhOC8erjoztpLbUfk2BbB|UsI9K@S(bsh>dN{nqIiNiSo+5nlYH@A!n&-V^iHUtxmINm@9ERA_?Etl=Dcf#I3+& zk+(HvUN&h(1zAVhX&nh>d#)Qy9yT~-ve4dy%K|Prjma1fV>)i}QRWzCmfZOyp6j4f zyue*n?!XZa zA7hAvq&K{DG9lN|#pCP&Q5B5|buU46)@&8=En&g>`?}=^s5h*9Tu1NErUd%US=fEr zx(V2c-aRo&!~8RRE0`Gv=P8p~Ev=C5yn8z5g!%UchlqWduuL96FUO`xHJI~e0xInQ zqh7Q#o8^0kZ$Fs-@KdDi#92hbBKZt$ffUy{9nBDy(Cc4=eQ*@%DuJtw9T@JI7wA$N zb(x3b5X^(M%r{u!J;>~h4pBYES!PLZ&9v$>AH3?GKJGfb1f&fTla;qMAG0J~k=n#= zuTZ3#p}{_zVor5`ckbzDjNU|+mXkSt9->FTqfK;|10;P=lp`^E(lAYN8TSwAl&WpInd)bTt6sf&xq6S$9>Zsa5ga@!Q4EqA zM5{|rvHS4lT^{@KLA)&4x{%wl;~&Q~4y=>+G_7qnfT+pi7xE^)EIU zovRtRVnXpcq%;`k%7TB8uvKMj3Zi0O9zxl24ZYTuQ>x^4;Qm;M*;5U|&gd!$WoW;^ zqu1DLF`%&*tHOz6`+V*pNj7Zx&EgxXIM`^neeK=X*X_4jKI=3#tY!zDOPj!Zf3L zb#?W)TNgP-3IWT<-!Hcc;32Vg{h9lOQGuHysWGrg}gb3tMEWf${X)>~pml+eR!ucWK~A z_xz^r?4Babi26mVD&bu8o>ouV^Mr1_v-|2)rh$DzN!5%_h^LPvfbvB|^-xt0*>A4) zeuj0`=Ay8?G&ymlz#o;3diBk&G81^#*cTMC(HVS}o|hPq`g?s!u)l7tWrStRVvtoc z;c~N+zy$vt1?J4}4Y39WFa_8dP^$l+dyclX>=07He*b9>GDNmv!zz09@;$?4~R#AeQ>1N zFoNJskdwUL70#63+|&m9B3^{OJ;8u{z1>7&L?Ov|mzBb{mjmIdb9h#OzY7Zvz;MkP zgjK5dRK+!FcU|Xdx%}?#Cf{LE zS>j=L7O>y;zu0eJ&zecdF3|w+tpK2^UhScD&^s0S0^&G$CMj6|T*gVlinuo;QQcSd z1BFq!#IOkRJ4!VT*`D{<9mE$^jGlW+cq=sB52+KBz2xiV8Rs*m5@FK?1G$TJE@wvw zjb!EO3kv77J~stceS1(6WjuNAWwZUI>#I!>d()wjy8v{*`(Mq@`WxSa{~~Ubhk#fp zVPq?ZVS1=G#~_zEv5sB20nzT`Ih|_zPAJ}B`myggTY7KAfP9(fY=f9D|75&U;)<~L zdj*|`CsnhTgvM?zajd!T`Mlavu0m8_F(JAriJ!|M)X;+Qt8)1JuSr!|X>%q%Y~1X< z#{0Qbo76VD`OAFqrH?Eh^Qw_n5?_U}9^xGI685)1*7zr0FL8IL-XkekqBc-91y1_}Cm zY!-DHc-4^Ikv>Edw173R>Di5kO>yTDJ$#3ct#YDSd|9`tZ_=Lh@3H`DE z!~FrXfAu46R$S;?NfCE7Usw&d*Z=qTh8BOi$4?QEZZfGlAA)TmF&V;*Z~%;)xD0cP zAl6d@F%mx+U_g+VkOe&8`*7wZ!h$G9Wm@5EL$I6Vxfy7sC9e)?0Y#+vARK~ox#S*C zuOfgmLSoz8rL45L*vAjVI(vny*RrBMcR~-j^WTUV?g#m=foRBy4lqy~M|r%A)5U5i zicby1K-~LiOVTo9x76VWdD+U15le(1;Bj?W-Tr$vRuYI?x2GAN*b>X0F#ypEKL~7Z zhysG1{$6i0`hwWzvL2r++Z&ApZ<=3)Zjz_Mr8BYC4JJ$TpIX6)8dxG0OjZm)`qvl0_Nf}Ayf^Khmg`;P6pEn`JWE|1N-_~+QZ zl@qKBOV-109{iREvBDt2qn{#Lq~l;xS{Ue4e9DL7G{?@LB9|QIQpC|^{7ZMOwnAbK zWMmVx4`zif_8D7Hi#NyC0sP!=3jNy^;odi-IlokN0W=rHFObbJ7@*?M&-s8}Uu!4u zfg5i%!5nuWkUP%&+ZBtE7zy};Bs2ulvDbt4Pa`mW;eQ^OMtJ=9FYjLb&>-j6oa|0DFciHGi{|Z2)fK%m19x`u9GW0U{KNPmKR3Udq_ZTq+;X8nFJ^F8 zoG``Nu}LLkS4+%+_kZ^2J?pzWJJu8<^OYN!4T(%TVLHJ5pxu_5psugcMuB~|M*n5Y@?4v*3%=?-R@;}a*^mJZk(^&;SMGgw@a^0Wor^$>^ZhWxk z$)tpSeyUDUZ}K3IX0Fs-uvpFbge!X~j^u#t3cTp}#r=ALx2aEU=Z>c88!ah4hv*Hg zGX7i1f`K1#TXeG9=b(L1p8_cep52CMataDTv@Z?rQ=kOlXU$QdtsY51=mladT(Qvy zynAEL0ZMAs3mm3pjP6k`BQGfaHPG`wRSZaWiG~m@8Ktdm_F9m<2-+FqFinFgTU)3V1kbkvb`N0OV%aIhYlM0Xn5o86kko zk=8gs1ttkBl!5g$N1sOt11o`x@M{FnMEpMwupRJSVMN8_2KYegx+tty14iBpHGV10 zeZQ0@4cl}Pk2(OQtoc}ZQQyPp&JQ%Cb@As5e}nt$p;l~%SBV{yR7C;@GL9~4BTzsh$PQ`4_k9I=pV^sp|c%5#LJ70$7TbWR2|-ZH?h zJoH*{&rA#Fjv(!uZzOtO!Cfq`IzqnXeye0Br+|{#H+nGUpw4&THiBAp=6_XB|Igol zlh^>N=ab|b|Bs6Czu8vdxBusEU7`P~W^ac6b>hHkm8yR^ROR0~N&h;bKwm#;Y#15fU#SQM*F=j>z-CV;a1RET} zTCFxBOIVlVMi2(_b%BIB_|oY?N+si;vh9!NCr|$BCnus@YvXH)~2sz z(^q;U`p{t7yMTzH=(*11J}q4N3a|Ku-JZlX;(=jzs?nxar60(Zjt2YCnhO;+_V=0_ z3!R8H$;5ha94O8o&Yh^_5m#}ym9%DD7aUt~`j(S7e_FG^hEIL}&FX7LQHd+h4cKTR zsF92=@y+mv`dqZO$l!IRrBX60Gr1sq|HYnZPygp8lkQtvx$c#q*F3FKozV9nmqiYw ztxRrBZgft~xAnB6CfbDM@e@z%iIiZ@L0=2)2O!II&GA|O1?tY2Os|-INc&h1;`cPE=lfqMg{_kqig-Cl zwc(OcDYF{<27R~pmgqLb*riWh+_-zn*Hx^lzNwd zyBne8gR$gwm1cjF{Hf8H-2B(z#EM4zPGEU;K?+)t`9z1o>sO51_dLw2J55)mG{>_W zf(PY)>^)ZhzFThK@?kkQ`W6}oG%!@rtRi$ov8_lfTp)SPWQmP1Bl&HrF!^ks2RkMu zRy**HNxtg93P=adktFdhDvUuF9GYehTER~|3_~B^d)#c8LC+SItVCUe$@<~~Z4YAC zd2ajD9NJp@`Ey&g$4?t=b!97V>(7_t;>EGWlM&RtEfB6X6ACr>4JcUUGp(6z4YKb- zKW5~F3(hD9+lb}gI}@_s?}uzE6Mh zId{Zk^|O+lnTaDwvqvke6hCp@1IOL2X|ptPgr>`i@}7&=?RS116WAhC;MG1r8}9-7 z)E{}Bd?mEozVq1Lprb~q_VFeM)eaXZf>xr5dB(xv+fSQLOxQl}^6v{3yQ