From d9da1b58a412a17c14d0e74f3545ee0c2953e4a6 Mon Sep 17 00:00:00 2001 From: Pascal Lafourcade Date: Thu, 13 Feb 2020 09:45:53 +0100 Subject: [PATCH] debut --- COURS/PLSQL-sol.tex | 1544 ++++++++++++++++++++++++++++++++++++++ COURS/PLSQL.tex | 1028 +++++++++++++++++++++++++ COURS/ProC.tex | 1309 ++++++++++++++++++++++++++++++++ COURS/compil.sh | 3 + COURS/hopital-q1.pc | 150 ++++ COURS/hopital-q2.pc | 142 ++++ COURS/iut-uca.png | Bin 0 -> 233220 bytes COURS/menu.pc | 312 ++++++++ COURS/td.pc | 420 +++++++++++ EXOS/Exam2019-annexe.tex | 174 +++++ EXOS/Exam2019.tex | 663 ++++++++++++++++ EXOS/Partiel2019.tex | 288 +++++++ EXOS/Partiel2020.tex | 288 +++++++ EXOS/hopital-setup.sql | 68 ++ EXOS/nba-q1.sql | 48 ++ EXOS/nba-q2.sql | 41 + EXOS/nba-q3.sql | 72 ++ EXOS/nba-setup.sql | 88 +++ 18 files changed, 6638 insertions(+) create mode 100644 COURS/PLSQL-sol.tex create mode 100644 COURS/PLSQL.tex create mode 100644 COURS/ProC.tex create mode 100755 COURS/compil.sh create mode 100755 COURS/hopital-q1.pc create mode 100755 COURS/hopital-q2.pc create mode 100644 COURS/iut-uca.png create mode 100755 COURS/menu.pc create mode 100644 COURS/td.pc create mode 100644 EXOS/Exam2019-annexe.tex create mode 100644 EXOS/Exam2019.tex create mode 100644 EXOS/Partiel2019.tex create mode 100644 EXOS/Partiel2020.tex create mode 100644 EXOS/hopital-setup.sql create mode 100644 EXOS/nba-q1.sql create mode 100644 EXOS/nba-q2.sql create mode 100644 EXOS/nba-q3.sql create mode 100644 EXOS/nba-setup.sql diff --git a/COURS/PLSQL-sol.tex b/COURS/PLSQL-sol.tex new file mode 100644 index 0000000..534c6d2 --- /dev/null +++ b/COURS/PLSQL-sol.tex @@ -0,0 +1,1544 @@ +\documentclass[a4paper,11pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{lastpage} +\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes} +\usetikzlibrary{decorations.pathreplacing} +\usepackage{url} +\usepackage{comment} +\usepackage{amsmath} +\usepackage{amsthm} + +\usepackage{eurosym} + + + +\theoremstyle{definition} +\newtheorem{exemple}{Exemple}[section] +\newtheorem{exercice}{Exercice} +\newtheorem{remarque}{Remarque}[section] +\newtheorem{definition}{Définition}[section] + +\usepackage{makeidx} +\usepackage[columnsep=9pt]{idxlayout} + +\usepackage{fancyvrb} + +%\makeindex +\selectlanguage{french} + +\usepackage[font=small,labelfont=bf,justification=centering]{caption} +\captionsetup[table]{name=Tableau} + +\usepackage{latexsym} +\usepackage{amsfonts} +\usepackage[normalem]{ulem} +\usepackage{array} +\usepackage{amssymb} +\usepackage{graphicx} + +\usepackage{subfig} +\usepackage{wrapfig} +\usepackage{wasysym} +\usepackage{enumitem} +\usepackage{adjustbox} +\usepackage{longtable} +\usepackage{changepage} +\usepackage{setspace} +\usepackage{hhline} +\usepackage{multicol} +\usepackage{float} +\usepackage{multirow} +\usepackage{slashbox} + +\usepackage{color, colortbl} +\definecolor{Gray}{gray}{0.9} + +\usepackage{fancyvrb} +\usepackage{fancyhdr}% fancy header +\usepackage{varwidth} +\usepackage{alltt} + + + \fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + + +\newcommand{\plsql}{PL/SQL} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries\leftmark} + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + + \pagestyle{monstyle} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1.5}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +\cachefalse % version prof +%\cachetrue % version etudiant + + \makeindex + + \begin{document} + + + +\begin{titlepage} +\begin{center} + +\textsc{\Large IUT Informatique Aubière \hfill 2018 - 2019} \\[.5cm] + +\hrule + +\ \\[.5cm] + +\vfill + +\textsc{\LARGE Bases de données} + +\vfill + +\textsc{\LARGE \plsql{}} + +\vfill + +{\Large Pascale \textsc{Brigoulet}, Franck \textsc{Glaziou}, } + +{\Large Pascal \textsc{Lafourcade} et Marie-Fran\c{c}oise + \textsc{Servajean}} + + +\vfill + + +\begin{tikzpicture} + +%%% un triangle + +%% horizonatale +\draw[blue,line width=1pt] (-1,0) -- (1,0); +\draw[blue,line width=1pt] (-2.5,-.875) -- (1.5,-.875); +\draw[blue,line width=1pt] (-1.5,-1.75) -- (3,-1.75); +\draw[blue,line width=1pt] (0,3.5) -- (1,3.5); + +%% Croissante +\draw[blue,line width=1pt] (0,0) -- (1,1.75); +\draw[blue,line width=1pt] (-2.5,-.875) -- (0,3.5); +\draw[blue,line width=1pt] (-1,0) -- (1,3.5); +\draw[blue,line width=1pt] (3,-1.75) -- (3.5,-0.75); + +%% Decroissante +\draw[blue,line width=1pt] (0.5,.875) -- (1.5,-.875); +\draw[blue,line width=1pt] (1,1.75) -- (3,-1.75); +\draw[blue,line width=1pt] (1,3.5) -- (3.5,-0.75); +\draw[blue,line width=1pt] (-2.5,-.875) -- (-1.5,-1.75); + + + +\end{tikzpicture} + +%% \begin{tikzpicture} + +%% %%% un cube + +%% \draw[red,line width=1pt] (0,.5) -- (1,0); +%% \draw[red,line width=1pt] (2,.5) -- (1,0); + +%% \draw[red,line width=1pt] (0,1.5) -- (1,1); +%% %\draw[red,line width=1pt] (0,1.5) -- (1,2); +%% \draw[red,line width=1pt] (0,1.5) -- (.5,1.75); +%% %\draw[red,line width=1pt] (2,1.5) -- (1,2); +%% \draw[red,line width=1pt] (2,1.5) -- (1.5,1.75); +%% \draw[red,line width=1pt] (2,1.5) -- (1,1); + +%% \draw[red,line width=1pt] (1,1) -- (1,0); +%% \draw[red,line width=1pt] (0,1.5) -- (0,.5); +%% \draw[red,line width=1pt] (2,1.5) -- (2,.5); + +%% %% droite + +%% %\draw[red,line width=1pt] (1.5,1.25) -- (2.5,0.75); +%% \draw[red,line width=1pt] (2,1) -- (2.5,0.75); +%% \draw[red,line width=1pt] (3.5,1.25) -- (2.5,0.75); + +%% \draw[red,line width=1pt] (1.5,2.25) -- (2.5,1.75); +%% \draw[red,line width=1pt] (1.5,2.25) -- (2.5,2.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (2.5,2.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (2.5,1.75); + +%% \draw[red,line width=1pt] (2.5,1.75) -- (2.5,.75); +%% %\draw[red,line width=1pt] (1.5,2.25) -- (1.5,1.25); +%% \draw[red,line width=1pt] (1.5,2.25) -- (1.5,1.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (3.5,1.25); + +%% %% Haut +%% \draw[red,line width=1pt] (0,2) -- (1,1.5); +%% %\draw[red,line width=1pt] (2,2) -- (1,1.5); +%% \draw[red,line width=1pt] (1.5,1.75) -- (1,1.5); + +%% \draw[red,line width=1pt] (0,3) -- (1,2.5); +%% \draw[red,line width=1pt] (0,3) -- (1,3.5); +%% \draw[red,line width=1pt] (2,3) -- (1,3.5); +%% \draw[red,line width=1pt] (2,3) -- (1,2.5); + +%% \draw[red,line width=1pt] (1,2.5) -- (1,1.5); +%% \draw[red,line width=1pt] (0,3) -- (0,2); +%% %\draw[red,line width=1pt] (2,3) -- (2,2); +%% \draw[red,line width=1pt] (2,3) -- (2,2.5); + + +%% \end{tikzpicture} + +\vfill + + +\includegraphics[width=5cm]{iut-uca.png} +\end{center} + +\vfill + +{\Large Nom : \\ + +Prénom : \\ + +Groupe : \\ +} +%\url{http://mocodo.wingi.net/} + +%\url{http://mirror.hmc.edu/ctan/graphics/pgf/contrib/tkz-orm/tkz-orm.pdf} + + + +\end{titlepage} + +%% \section*{Avant Propos} + +%% L’objectif de ce cours de base de données avancées est de +%% présenter + + TD 1 : → Exo3 + TD 2 : Exo 3, 5, 6 7 + TD 3 : Reste + TD 4 : Partiel + +%% \newpage + +\tableofcontents + +\newpage + +\begin{center} +\LARGE {\bf \plsql{}} +\end{center} + +PL/SQL (Procedural Language / Structured Query Language) est un +langage fondé sur les paradigmes de programmation procédurale et +structurée. C'est un langage propriétaire, créé par Oracle et utilisé +dans le cadre de bases de données relationnelles. Il permet de +combiner des requêtes SQL et des instructions procédurales (boucles, +conditions...), dans le but de créer des traitements complexes +destinés à être stockés sur le serveur de base de données (objets +serveur), comme des procédures stockées ou des déclencheurs. + +\section{Fichier de commandes SQL/PLUS} + +SQL/Plus est un utilitaire en ligne de commande d'Oracle qui permet +aux utilisateurs d'exécuter interactivement des commandes SQL et +PL/SQL. Il est ainsi possible de paramètrer les fichiers de commandes +SQL. Pour cela il est important de stocker des informations dans des +variable : \code{variable vnoproduit CHAR(6)}. Cette commande déclare +une «bind variable» utilisable dans une commande SQL. Les diff\'eretns +formats autorisés sont : \code{NUMBER}, \code{CHAR(n)} et +\code{VARCHAR2(n)}. Afin d'interagir avec l'utilisateur il faut +pouvoir il existe deux commandes : + +\code{PROMPT taper le N° du produit} + +Cette commande affiche le texte placé après prompt (pas de quote) + +\code{ACCEPT vnoproduit} + +Cette commande permet la saisie d'une variable au clavier (la déclare +si elle ne l’était pas). + +\code{SELECT * FROM tproduit WHERE N°produit = ‘\&vnoproduit’;} + +\&{vnoproduit} permet d'acc\'eder \`a la chaîne de caractères +stock\'ee dans \code{vnoproduit}. + +\code{PRINT vnoproduit} + +Cette commande affiche la variable. + + + +\section{Exécution du code PL/SQL} + + +En SQL, les commandes sont transmises les unes après les autres et +traitées séparément par le moteur SQL, comme le montre la +Figure~\ref{fig:plsql1}. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{plsql2.png} +\end{center} +\caption{}\label{fig:plsql1} +\end{figure} + + +En extension procédurale de SQL (\plsql{}), les blocs de commandes +sont transmis globalement au moteur SQL, comme le montre la +Figure~\ref{fig:plsql2}. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{plsql1.png} +\end{center} +\caption{Interaction entre PL/SQL et SQL.}\label{fig:plsql2} +\end{figure} + + +\section{Exemple de programme \plsql{}} + +Le fichier de commandes ci-dessous permet la saisie de la référence +d’un produit et l’affichage de sa désignation ou d’un  message +d’erreur si le N° de produit n’existe pas. + +\begin{verbatim} +set echo off +set verify off +set feed off + +variable vnoproduit char(4) +variable vdesignation varchar2(30) +prompt taper la référence du produit à rechercher : +accept vnoproduit +\end{verbatim} +\begin{SaveVerbatim}{VerbEnv} +declare +dnoproduit char(4); + +begin +dnoproduit := ‘&vnoproduit’; +select designation into :vdesignation +from tproduit where noproduit = dnoproduit; + +exception +when no_data_found then + :vdesignation := ‘référence inconnue’; +end; +\end{SaveVerbatim} + \fbox{\BUseVerbatim{VerbEnv}} +\begin{verbatim} +. +/ +print vdesignation + +set verify on +set feed on +set echo on +\end{verbatim} + +\begin{remarque} + Ce fichier comporte trois parties : + \begin{itemize} + \item des commandes SQL+ pour la saisie de la référence produit, + \item un bloc \plsql{} pour accéder à la base, + \item des commandes SQL+ pour afficher le résultat. + \end{itemize} +\end{remarque} + +\plsql{} ne comprend pas d’instruction de saisie ou d’affichage. Les +commandes \code{SET} positionnent des variables d’environnement pour +éviter que le système n’affiche des informations « polluant » le +résultat : +\begin{itemize} +\item \code{set echo off} évite que le système n’affiche la commande + du bloc PL/SQL au moment où il l’exécute, +\item \code{set verify off} évite que le système n’affiche l’opération + de substitution au moment où il la fait, +\item \code{set feed off} évite que le système n’affiche le nombre de + lignes sélectionnées, +\item \code{.} le point indique la fin du mode PL/SQL, +\item \code{/} (seul sur une ligne) déclenche l’exécution du bloc PL/SQL ou de l’ ordre SQL stocké dans le buffer. +\end{itemize} + +\section{Structure d'un bloc \plsql{}} + +\plsql{} n'interprète pas une commande, mais un ensemble de commandes +contenu dans un "bloc" \plsql{}. Un bloc est composé de trois +sections. +\begin{itemize} +\item Les sections \code{DECLARE} et \code{EXCEPTION} sont facultatives. +\item Chaque instruction, de n'importe quelle section, est terminée + par un \code{;} +\item Possibilité de placer des commentaires : \code{/* commentaire + sur plusieurs lignes commençant par au moins un espace */} +\end{itemize} + +Attention aux points virgules: en cas d’oubli, Oracle affiche un N° de +ligne attendant la suite de commande SQL. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{bloc.png} +\end{center} +\caption{Structure d'un programme \plsql{}.}\label{fig:bloc} +\end{figure} + +\section{Types de variables utilisés en \plsql{}} + +Variables locales déclarées dans \code{DECLARE} et il est important de +mettre le type adapt\'e en suivant la syntaxe suivante : + + \verb+nom_variable type := valeur;+ + +Les diff\'erents types possibles sont : \code{CHAR, NUMBER, DATE, + VARCHAR2}. + +Il est n\'ecessaire de choisir le type \`a l'initialisation lors de la +déclaration et aussi sa valeur intiale comme le montre les deux +exemples suivants : +\begin{itemize} +\item \code{NB NUMBER := 1;} +\item \verb+nom_variable nomtable.nomcol %type+ +\end{itemize} + +\begin{exemple} Cr\'eation de variable. + +\code{dnoprod tproduit.noproduit \%type;} + +\code{ddesignation tproduit.designation \%type ;} +\end{exemple} + +Il est possible de cr\'eer des tableaux en \plsql{}. % +%% Variables de l'environnement extérieur à \plsql{}: +%% \begin{itemize} +%% \item champs d'écran en SQL*Forms, +%% \item variables définies en langage hôte dans PRO*. Les variables de +%% l’environnement sont toujours préfixées. +%\item + Les variables définies dans SQL*Plus par \code{VARIABLE} ou +\code{ACCEPT} sont préfixées de : pour affectation, de "\verb+&+" pour +substitution. + +% \end{itemize} + +\begin{exemple} Exemple simple d'utilisation de variable. +\begin{verbatim} +dnoproduit := '&vnoproduit'; +select designation into :vdesignation +from tproduit +where noproduit = '&vnoproduit'; + +select designation into ddesignation +from tproduit +where noproduit = dnoproduit; +\end{verbatim} + +Tableaux PL/SQL. + +Déclaration : + +\begin{verbatim} +DECLARE +... +TYPE tchar4 IS TABLE OF CHAR(4) +INDEX BY BINARY_INTEGER ; +table_noprod tchar4 ; +p BINARY_INTEGER ; +\end{verbatim} + +Utilisation : + +\begin{verbatim} +BEGIN +... +p := 1 ; +table_noprod(p) := ‘p001’ ; +\end{verbatim} +\end{exemple} + +\section{Les traitements du bloc \code{BEGIN}} +\subsection{L'ordre SELECT :} +\begin{itemize} +\item Syntaxe : + \begin{verbatim} + SELECT coll, col2 + INTO var1, var2 + FROM table + [WHERE condition]; +\end{verbatim} + \item + Règle : + \begin{itemize} + \item La clause \code{INTO} est {\bf obligatoire}. + \item Le \code{SELECT} doit obligatoirement ramener une ligne + et une seule, sinon erreur. Pour traiter un ordre + \code{SELECT} qui pourrait ramener plusieurs lignes, il faut + utiliser un curseur. + \end{itemize} +\end{itemize} + Les autres ordres de manipulation sont inchangés; des + variables peuvent être utilisées : +\begin{verbatim} +INSERT INTO table VALUES( var1, ‘chaine’, 123, var2); +UPDATE table SET col2 = var1 WHERE col1 = var2; +\end{verbatim} + +\begin{exercice} + Nombre de fournisseurs d’un produit donné : le résultat sera écrit + dans une table \code{ligne}. Les tables utilis\'ees sont donn\'ees + dans la Figure~\ref{fig:bd}. +\end{exercice} + +\begin{verbatim} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)); + +set echo off ; +set verify off ; +set feed off ; +variable vnoproduit char(4) +prompt Entre le numero du produit: +accept vnoproduit + +DECLARE + +dnbfournisseur number ; + +BEGIN + +SELECT count(*) into dnbfournisseur +FROM Tproduitfourn +WHERE noprod ='& vnoproduit'; + +INSERT INTO tligne VALUES ('NB fournisseur='||to_char(dnbfournisseur)| +|' du produit '|| '&vnoproduit'); + +END; +. +/ + +SELECT * FROM tligne ; + +set verify on ; +set feed on ; +set echo on ; +\end{verbatim} + + + +\subsection{Traitements conditionnels \code{IF...THEN...END IF;}} +\begin{verbatim} + IF condition1 THEN traitement1; + ELSE traitement2; + END IF; +\end{verbatim} + +Les opérateurs utilisés dans les conditions sont les même que dans SQL +: + +\verb+ =, <, >, !=, >=, <=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, ...+ + + +\begin{exercice} +Nombre de fournisseurs d’un produit donné : s’il n’y a pas de +fournisseur, compter le nombre de produits : il doit être 1 ou +0. \'Ecrire dans une table de lignes soit le nombre de fournisseurs +soit le message ‘\code{le produit n’existe pas}’. +\end{exercice} +\begin{verbatim} +DROP TABLE tligne; +CREATE TABLE tligne (ligne varchar2(100)); + +set echo off; +set verify off; +set feed off; + +variable vnoproduit char(4) +prompt Entre le numero du produit: +accept vnoproduit + +DECLARE + +dnbfournisseur number; +dnbproduit number; + +BEGIN + +SELECT count(*) into dnbfournisseur +FROM Tproduitfourn +WHERE noprod ='& vnoproduit'; + +IF dnbfournisseur = THEN + +SELECT count(noproduit) into dnbproduit +FROM Tproduit +WHERE noproduit = & vnoproduit'; + +if dnbproduit = 0 then +INSERT INTO tligne VALUES ('Le produit ' || '&vnoproduit'|| ' n''existe pas'); +else +INSERT INTO tligne VALUES ('NB fournisseur='||to_char(dnbfournisseur)| +|' du produit ' || '&vnoproduit'); +end if; +END IF; +END; +. +/ + +SELECT * FROM tligne; + +set verify on; +set feed on; +set echo on; +\end{verbatim} + +\subsection{Traitements répétitifs \code{WHILE ...LOOP ...END LOOP;}} + + La boucle \code{WHILE}: L'exécution de la boucle se fait tant + que la condition de la clause de \code{WHILE} est vérifiée. +\begin{verbatim} + BEGIN + WHILE condition + LOOP + instructions; + END LOOP; + END; +\end{verbatim} +La condition est une combinaison d'expressions au moyen d'opérateurs : +\verb+<, >, =, !=, AND, OR, LIKE, ...+ + +\begin{exemple}Calcul de factorielle. +\begin{verbatim} +CREATE TABLE tligne (ligne VARCHAR2(200)); +VARIABLE n NUMBER +PROMPT taper n +ACCEPT n + +DECLARE +fn NUMBER := 1; +i NUMBER :=1; +n NUMBER :='&n'; +BEGIN + WHILE i1000 + then UPDATE Tproduit SET prixv=dprix*1.1 WHERE CURRENT of r; COMMIT; + else UPDATE Tproduit SET prixv=dprix*1.05 WHERE CURRENT of r; COMMIT; + end if; + FETCH r INTO dprixv; + END LOOP; +CLOSE R; + +END; +. +/ + +set verify on; +set feed on; +set echo on; +\end{verbatim} + +Erreur utilisateur : \code{EXCEPTION, RAISE} + +Le traitement de l’anomalie doit être déclenché en passant dans la +partie \code{EXCEPTION} par \code{RAISE}. +\begin{verbatim} +DECLARE +... +nom_erreur EXCEPTION; +... +BEGIN +... +IF anomalie +THEN RAISE nom_erreur; +... +EXCEPTION +WHEN nom_erreur THEN +traitement à effectuer en cas d’anomalie; +END ; +\end{verbatim} + +Sortie du bloc après exécution du traitement. + +\begin{exemple} +Accèder au stock d’un produit de Numéro donné. Erreur Oracle quand le +produit n’existe pas Erreur utilisateur quand le stock est nul Les +anomalies sont placées dans une table \code{terreur(z1 varchar2(30), + z2 varchar2(30))} + +\begin{verbatim} +DECLARE +... +stock_nul EXCEPTION; +dstock number; +... +BEGIN +SELECT stock INTO dstock FROM tproduit WHERE noproduit = ‘&vnoproduit’; +IF stock = 0 +THEN RAISE stock_nul; +traitement quand le stock n’est pas nul... +EXCEPTION +WHEN NO_DATA_FOUND THEN +INSERT INTO terreur VALUES (‘&vnoproduit’, ‘produit inconnu’); +WHEN stock_nul THEN +INSERT INTO terreur VALUES (‘&vnoproduit’, ‘stock nul’); +END; +\end{verbatim} +\end{exemple} + +\begin{exercice} Pour remplacer l’erreur Oracle par une erreur utilisateur, compter le nombre de produits ayant le numéro donné et déclencher une exception si ce nombre est nul. +\end{exercice} + +\begin{verbatim} +DROP TABLE tligne; +CREATE TABLE tligne (ligne varchar2(100)); + +set echo off; +set verify off; +set feed off; + +variable vnoproduit varchar2(4) + +prompt Entrer le numereo du produit: +accept vnoproduit + +DECLARE +nbproduitnull EXCEPTION; +dnbproduit number; + +BEGIN + +SELECT count(*) INTO dnbproduit +FROM Tproduit +WHERE noproduit ='&vnoproduit' + +if dnobproduit =0 the raise nbproduitnull; +end if; + +EXCEPTION + when nbproduitnull then + INSERT INTO tligne VLAUES ('&vnoporduit)'||'n existe pas'); +. +/ +SELECT * FROM tligne; +set verify on; +set feed on; +set echo on; +\end{verbatim} + + +\newpage + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=18cm]{BD.png} +\end{center} +\caption{Base de donn\'ees pour les exercices.}\label{fig:bd} +\end{figure} + +\newpage + +\begin{center} + {\bf Commandes utiles pour les TP} +\end{center} + +\paragraph{Premi\`ere s\'eance :} Connexion : \verb+sqlplus /@KIROV+ + +\verb+source /etc/profile+ + +Lancer \verb+sqlplus+ avec cette commande \verb+rlwrap sqlplus+ vous +permet d'avoir l'historique. + + +Lors de votre première connexion modifier votre mot de passe avec la +commande SQL : \verb+PASSWORD;+ + +Ce qui est équivalent à : +\verb+ALTER USER dupond IDENTIFIED BY password;+ + +Si vous avez perdu votre mot de passe se connecter en \code{ssh} sur +\code{londres} et faire \code{oracle\_passwd} + + +Pour lancer un fichier \verb+.sql+ en sqlplus, il suffit de taper : +\verb+@toto.sql;+ + +Pour quitter sqlplus, il suffit de taper : \verb+quit;+ + + +\paragraph{Mise en forme : } + +Sous sqlplus : +\begin{verbatim} +Set linesize 150 -- positionne la taille d'une ligne +Set pagesize 300 -- positionne le nombre de lignes avant de réafficher les entêtes +Set pages 0 -- n'affiche pas les entêtes +Col for A10 -- défini que la colonne nom_colonne va être affiché sur +10 caractères alphanumériques, 999.99 pour les valeurs numériques. +\end{verbatim} + + +\paragraph{Corbeille :} Vider les tables \verb+BIN$$xxxx+ : +\verb+PURGE RECYCLEBIN;+ + + +\paragraph{D\'ebug :} Connaître l'utilisateur connect\'e : \verb+show user;+ + +Liste des tables d'un \verb+user+ : \verb+SELECT table_name FROM user_tables;+ + +Lister les tables accessibles par l'utilisateur +:\verb+ SELECT table_name FROM all_tables;+ + +Lister toutes les tables possédées par un utilisateur +\verb+SELECT * FROM all_tables WHERE owner='PALAFOUR';+ + +Liste des vues d'un user : \verb+SELECT view_name FROM user_views;+ + +Liste des contraintes : \verb+SELECT * FROM user_constraints WHERE table_name=’’;+ + +\verb+SELECT * FROM user_cons_columns WHERE table_name='
";+ + + +\paragraph{Contraintes :} Description d'une table : \verb+describe
+ ou +\verb+desc
+ + +Liste des colonnes concernées par les contraintes : +\verb+SELECT * FROM user_cons_columns;+ + +Lire une table d'un autre schéma : + +\verb+SELECT * FROM .; -- ou schma = login de connexion de l'utilisateur+ + +\paragraph{Affichage :} ~ \\ + +\verb+SET HEADING OFF+ + +\verb+SET FEEDBACK OFF+ + +\paragraph{Acc\`es fichiers} +\begin{verbatim} +https://homeweb.iut-clermont.uca.fr/pydio/ +\end{verbatim} + +\paragraph{Aide en ligne} +\begin{verbatim} +http://cr2i.intranet.iut.local/site/ +\end{verbatim} + + %\newpage + +%\printindex + \end{document} diff --git a/COURS/PLSQL.tex b/COURS/PLSQL.tex new file mode 100644 index 0000000..47c455a --- /dev/null +++ b/COURS/PLSQL.tex @@ -0,0 +1,1028 @@ +\documentclass[a4paper,11pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{lastpage} +\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes} +\usetikzlibrary{decorations.pathreplacing} +\usepackage{url} +\usepackage{comment} +\usepackage{amsmath} +\usepackage{amsthm} + +\usepackage{eurosym} + + + +\theoremstyle{definition} +\newtheorem{exemple}{Exemple}[section] +\newtheorem{exercice}{Exercice} +\newtheorem{remarque}{Remarque}[section] +\newtheorem{definition}{Définition}[section] + +\usepackage{makeidx} +\usepackage[columnsep=9pt]{idxlayout} + +\usepackage{fancyvrb} + +%\makeindex +\selectlanguage{french} + +\usepackage[font=small,labelfont=bf,justification=centering]{caption} +\captionsetup[table]{name=Tableau} + +\usepackage{latexsym} +\usepackage{amsfonts} +\usepackage[normalem]{ulem} +\usepackage{array} +\usepackage{amssymb} +\usepackage{graphicx} + +\usepackage{subfig} +\usepackage{wrapfig} +\usepackage{wasysym} +\usepackage{enumitem} +\usepackage{adjustbox} +\usepackage{longtable} +\usepackage{changepage} +\usepackage{setspace} +\usepackage{hhline} +\usepackage{multicol} +\usepackage{float} +\usepackage{multirow} +\usepackage{slashbox} + +\usepackage{color, colortbl} +\definecolor{Gray}{gray}{0.9} + +\usepackage{fancyvrb} +\usepackage{fancyhdr}% fancy header +\usepackage{varwidth} +\usepackage{alltt} + + + \fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + + +\newcommand{\plsql}{PL/SQL} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries\leftmark} + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + + \pagestyle{monstyle} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1.5}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +\cachefalse % version prof +%\cachetrue % version etudiant + + \makeindex + + \begin{document} + + + +\begin{titlepage} +\begin{center} + +\textsc{\Large IUT Informatique Aubière \hfill 2019 - 2020} \\[.5cm] + +\hrule + +\ \\[.5cm] + +\vfill + +\textsc{\LARGE Bases de données} + +\vfill + +\textsc{\LARGE \plsql{}} + +\vfill + +{\Large Pascale \textsc{Brigoulet}, Franck \textsc{Glaziou}, } + +{\Large Pascal \textsc{Lafourcade} et Marie-Fran\c{c}oise + \textsc{Servajean}} + + +\vfill + + +\begin{tikzpicture} + +%%% un triangle + +%% horizonatale +\draw[blue,line width=1pt] (-1,0) -- (1,0); +\draw[blue,line width=1pt] (-2.5,-.875) -- (1.5,-.875); +\draw[blue,line width=1pt] (-1.5,-1.75) -- (3,-1.75); +\draw[blue,line width=1pt] (0,3.5) -- (1,3.5); + +%% Croissante +\draw[blue,line width=1pt] (0,0) -- (1,1.75); +\draw[blue,line width=1pt] (-2.5,-.875) -- (0,3.5); +\draw[blue,line width=1pt] (-1,0) -- (1,3.5); +\draw[blue,line width=1pt] (3,-1.75) -- (3.5,-0.75); + +%% Decroissante +\draw[blue,line width=1pt] (0.5,.875) -- (1.5,-.875); +\draw[blue,line width=1pt] (1,1.75) -- (3,-1.75); +\draw[blue,line width=1pt] (1,3.5) -- (3.5,-0.75); +\draw[blue,line width=1pt] (-2.5,-.875) -- (-1.5,-1.75); + + + +\end{tikzpicture} + +%% \begin{tikzpicture} + +%% %%% un cube + +%% \draw[red,line width=1pt] (0,.5) -- (1,0); +%% \draw[red,line width=1pt] (2,.5) -- (1,0); + +%% \draw[red,line width=1pt] (0,1.5) -- (1,1); +%% %\draw[red,line width=1pt] (0,1.5) -- (1,2); +%% \draw[red,line width=1pt] (0,1.5) -- (.5,1.75); +%% %\draw[red,line width=1pt] (2,1.5) -- (1,2); +%% \draw[red,line width=1pt] (2,1.5) -- (1.5,1.75); +%% \draw[red,line width=1pt] (2,1.5) -- (1,1); + +%% \draw[red,line width=1pt] (1,1) -- (1,0); +%% \draw[red,line width=1pt] (0,1.5) -- (0,.5); +%% \draw[red,line width=1pt] (2,1.5) -- (2,.5); + +%% %% droite + +%% %\draw[red,line width=1pt] (1.5,1.25) -- (2.5,0.75); +%% \draw[red,line width=1pt] (2,1) -- (2.5,0.75); +%% \draw[red,line width=1pt] (3.5,1.25) -- (2.5,0.75); + +%% \draw[red,line width=1pt] (1.5,2.25) -- (2.5,1.75); +%% \draw[red,line width=1pt] (1.5,2.25) -- (2.5,2.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (2.5,2.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (2.5,1.75); + +%% \draw[red,line width=1pt] (2.5,1.75) -- (2.5,.75); +%% %\draw[red,line width=1pt] (1.5,2.25) -- (1.5,1.25); +%% \draw[red,line width=1pt] (1.5,2.25) -- (1.5,1.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (3.5,1.25); + +%% %% Haut +%% \draw[red,line width=1pt] (0,2) -- (1,1.5); +%% %\draw[red,line width=1pt] (2,2) -- (1,1.5); +%% \draw[red,line width=1pt] (1.5,1.75) -- (1,1.5); + +%% \draw[red,line width=1pt] (0,3) -- (1,2.5); +%% \draw[red,line width=1pt] (0,3) -- (1,3.5); +%% \draw[red,line width=1pt] (2,3) -- (1,3.5); +%% \draw[red,line width=1pt] (2,3) -- (1,2.5); + +%% \draw[red,line width=1pt] (1,2.5) -- (1,1.5); +%% \draw[red,line width=1pt] (0,3) -- (0,2); +%% %\draw[red,line width=1pt] (2,3) -- (2,2); +%% \draw[red,line width=1pt] (2,3) -- (2,2.5); + + +%% \end{tikzpicture} + +\vfill + + +\includegraphics[width=5cm]{iut-uca.png} +\end{center} + +\vfill + +{\Large Nom : \\ + +Prénom : \\ + +Groupe : \\ +} +%\url{http://mocodo.wingi.net/} + +%\url{http://mirror.hmc.edu/ctan/graphics/pgf/contrib/tkz-orm/tkz-orm.pdf} + + + +\end{titlepage} + +%% \section*{Avant Propos} + +%% L’objectif de ce cours de base de données avancées est de +%% présenter + +%% TD 1 : → Exo3 +%% TD 2 : Exo 3, 5, 6 7 +%% TD 3 : Reste +%% TD 4 : Partiel + +%% \newpage + +\tableofcontents + +\newpage + +\begin{center} +\LARGE {\bf \plsql{}} +\end{center} + +PL/SQL (Procedural Language / Structured Query Language) est un +langage fondé sur les paradigmes de programmation procédurale et +structurée. C'est un langage propriétaire, créé par Oracle et utilisé +dans le cadre de bases de données relationnelles. Il permet de +combiner des requêtes SQL et des instructions procédurales (boucles, +conditions...), dans le but de créer des traitements complexes +destinés à être stockés sur le serveur de base de données (objets +serveur), comme des procédures stockées ou des déclencheurs. + +\section{Fichier de commandes SQL/PLUS} + +SQL/Plus est un utilitaire en ligne de commande d'Oracle qui permet +aux utilisateurs d'exécuter interactivement des commandes SQL et +PL/SQL. Il est ainsi possible de paramètrer les fichiers de commandes +SQL. Pour cela il est important de stocker des informations dans des +variable : \code{variable vnoproduit CHAR(6)}. Cette commande déclare +une «bind variable» utilisable dans une commande SQL. Les diff\'erents +formats autorisés sont : \code{NUMBER}, \code{CHAR(n)} et +\code{VARCHAR2(n)}. Afin d'interagir avec l'utilisateur il existe deux +commandes : + +\code{PROMPT taper le N° du produit} + +Cette commande affiche le texte placé après prompt. Attnetion il n'y a +pas de quote. + +\code{ACCEPT vnoproduit} + +Cette commande permet la saisie d'une variable au clavier et la +déclare si elle ne l’était pas. + +\code{SELECT * FROM tproduit WHERE N°produit = ‘\&vnoproduit’;} + +\code{\&vnoproduit} permet d'acc\'eder \`a la chaîne de caractères +stock\'ee dans la variable \code{vnoproduit}. + +\code{PRINT vnoproduit} + +Cette commande affiche le contenu de la variable. + + + +\section{Exécution du code PL/SQL} + + +En SQL, les commandes sont transmises les unes après les autres et +traitées séparément par le moteur SQL, comme le montre la +Figure~\ref{fig:plsql1}. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{plsql2.png} +\end{center} +\caption{}\label{fig:plsql1} +\end{figure} + + +En extension procédurale de SQL (\plsql{}), les blocs de commandes +sont transmis globalement au moteur SQL, comme le montre la +Figure~\ref{fig:plsql2}. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{plsql1.png} +\end{center} +\caption{Interaction entre PL/SQL et SQL.}\label{fig:plsql2} +\end{figure} + + +\section{Exemple de programme \plsql{}} + +Le fichier de commandes ci-dessous permet la saisie de la référence +d’un produit et l’affichage de sa désignation ou d’un  message +d’erreur si le N° de produit n’existe pas. + +\begin{verbatim} +set echo off +set verify off +set feed off + +variable vnoproduit char(4) +variable vdesignation varchar2(30) +prompt taper la référence du produit à rechercher : +accept vnoproduit +\end{verbatim} +\begin{SaveVerbatim}{VerbEnv} +declare +dnoproduit char(4); + +begin +dnoproduit := ‘&vnoproduit’; +select designation into :vdesignation +from tproduit where noproduit = dnoproduit; + +exception +when no_data_found then + :vdesignation := ‘référence inconnue’; +end; +\end{SaveVerbatim} + \fbox{\BUseVerbatim{VerbEnv}} +\begin{verbatim} +. +/ +print vdesignation + +set verify on +set feed on +set echo on +\end{verbatim} + +\begin{remarque} + Ce fichier comporte trois parties : + \begin{itemize} + \item des commandes SQL+ pour la saisie de la référence produit, + \item un bloc \plsql{} pour accéder à la base, + \item des commandes SQL+ pour afficher le résultat. + \end{itemize} +\end{remarque} + +\plsql{} ne comprend pas d’instruction de saisie ou d’affichage. Les +commandes \code{SET} positionnent des variables d’environnement pour +éviter que le système n’affiche des informations « polluant » le +résultat : +\begin{itemize} +\item \code{set echo off} évite que le système n’affiche la commande + du bloc PL/SQL au moment où il l’exécute, +\item \code{set verify off} évite que le système n’affiche l’opération + de substitution au moment où il la fait, +\item \code{set feed off} évite que le système n’affiche le nombre de + lignes sélectionnées, +\item \code{.} le point indique la fin du mode PL/SQL, +\item \code{/} (seul sur une ligne) déclenche l’exécution du bloc PL/SQL ou de l’ ordre SQL stocké dans le buffer. +\end{itemize} + +\section{Structure d'un bloc \plsql{}} + +\plsql{} n'interprète pas une commande, mais un ensemble de commandes +contenu dans un "bloc" \plsql{}. Un bloc est composé de trois +sections. +\begin{itemize} +\item Les sections \code{DECLARE} et \code{EXCEPTION} sont facultatives. +\item Chaque instruction, de n'importe quelle section, est terminée + par un \code{;} +\item Possibilité de placer des commentaires : \code{/* commentaire + sur plusieurs lignes commençant par au moins un espace */} +\end{itemize} + +Attention aux points virgules: en cas d’oubli, Oracle affiche un N° de +ligne attendant la suite de commande SQL. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{bloc.png} +\end{center} +\caption{Structure d'un programme \plsql{}.}\label{fig:bloc} +\end{figure} + +\section{Types de variables utilisés en \plsql{}} + +Variables locales déclarées dans \code{DECLARE} et il est important de +mettre le type adapt\'e en suivant la syntaxe suivante : + + \verb+nom_variable type := valeur;+ + +Les diff\'erents types possibles sont : \code{CHAR, NUMBER, DATE, + VARCHAR2}. + +Il est n\'ecessaire de choisir le type \`a l'initialisation lors de la +déclaration et aussi sa valeur intiale comme le montre les deux +exemples suivants : +\begin{itemize} +\item \code{NB NUMBER := 1;} +\item \verb+nom_variable nomtable.nomcol %type+ +\end{itemize} + +\begin{exemple} Cr\'eation de variable. + +\code{dnoprod tproduit.noproduit \%type;} + +\code{ddesignation tproduit.designation \%type ;} +\end{exemple} + +Il est possible de cr\'eer des tableaux en \plsql{}. % +%% Variables de l'environnement extérieur à \plsql{}: +%% \begin{itemize} +%% \item champs d'écran en SQL*Forms, +%% \item variables définies en langage hôte dans PRO*. Les variables de +%% l’environnement sont toujours préfixées. +%\item + Les variables définies dans SQL*Plus par \code{VARIABLE} ou +\code{ACCEPT} sont préfixées de : pour affectation, de "\verb+&+" pour +substitution. + +% \end{itemize} + +\begin{exemple} Exemple simple d'utilisation de variable. +\begin{verbatim} +dnoproduit := '&vnoproduit'; +select designation into :vdesignation +from tproduit +where noproduit = '&vnoproduit'; + +select designation into ddesignation +from tproduit +where noproduit = dnoproduit; +\end{verbatim} + +Tableaux PL/SQL. + +Déclaration : + +\begin{verbatim} +DECLARE +... +TYPE tchar4 IS TABLE OF CHAR(4) +INDEX BY BINARY_INTEGER ; +table_noprod tchar4 ; +p BINARY_INTEGER ; +\end{verbatim} + +Utilisation : + +\begin{verbatim} +BEGIN +... +p := 1 ; +table_noprod(p) := ‘p001’ ; +\end{verbatim} +\end{exemple} + +\section{Les traitements du bloc \code{BEGIN}} +\subsection{L'ordre SELECT :} +\begin{itemize} +\item Syntaxe : + \begin{verbatim} + SELECT coll, col2 + INTO var1, var2 + FROM table + [WHERE condition]; +\end{verbatim} + \item + Règle : + \begin{itemize} + \item La clause \code{INTO} est {\bf obligatoire}. + \item Le \code{SELECT} doit obligatoirement ramener une ligne + et une seule, sinon erreur. Pour traiter un ordre + \code{SELECT} qui pourrait ramener plusieurs lignes, il faut + utiliser un curseur. + \end{itemize} +\end{itemize} + Les autres ordres de manipulation sont inchangés; des + variables peuvent être utilisées : +\begin{verbatim} +INSERT INTO table VALUES(var1, ‘chaine’, 123, var2); +UPDATE table SET col2 = var1 WHERE col1 = var2; +\end{verbatim} + +\begin{exercice} + Nombre de fournisseurs d’un produit donné : le résultat sera écrit + dans une table \code{ligne}. Les tables utilis\'ees sont donn\'ees + dans la Figure~\ref{fig:bd}. +\end{exercice} + +\subsection{Traitements conditionnels \code{IF...THEN...END IF;}} +\begin{verbatim} + IF condition1 THEN traitement1; + ELSE traitement2; + END IF; +\end{verbatim} + +Les opérateurs utilisés dans les conditions sont les même que dans SQL +: + +\verb+ =, <, >, !=, >=, <=, IS NULL, IS NOT NULL, BETWEEN, LIKE, AND, OR, ...+ + + +\begin{exercice} +Nombre de fournisseurs d’un produit donné : s’il n’y a pas de +fournisseur, compter le nombre de produits : il doit être $\geq 1$ ou +0. \'Ecrire dans une table de lignes soit le nombre de fournisseurs +soit le message ‘\code{le produit n’existe pas}’. +\end{exercice} + +\subsection{Traitements répétitifs \code{WHILE ...LOOP ...END LOOP;}} + + La boucle \code{WHILE}: L'exécution de la boucle se fait tant + que la condition de la clause de \code{WHILE} est vérifiée. +\begin{verbatim} + BEGIN + WHILE condition + LOOP + instructions; + END LOOP; + END; +\end{verbatim} +La condition est une combinaison d'expressions au moyen d'opérateurs : +\verb+<, >, =, !=, AND, OR, LIKE, ...+ + +\begin{exemple}Calcul de factorielle. +\begin{verbatim} +CREATE TABLE tligne (ligne VARCHAR2(200)); +VARIABLE n NUMBER +PROMPT taper n +ACCEPT n + +DECLARE +fn NUMBER := 1; +i NUMBER :=1; +n NUMBER :='&n'; +BEGIN + WHILE i/@KIROV+ + +\verb+source /etc/profile+ + +Lancer \verb+sqlplus+ avec cette commande \verb+rlwrap sqlplus+ vous +permet d'avoir l'historique. + + +Lors de la première connexion modifier le mot de passe avec la +commande SQL : \verb+PASSWORD;+ + +Ce qui est équivalent à : +\verb+ALTER USER dupond IDENTIFIED BY password;+ + +Si le mot de passe est \'egar\'e quelque part, il faut se connecter en +\code{ssh} sur \code{londres} et faire \code{oracle\_passwd} + + +Pour lancer un fichier \verb+.sql+ en sqlplus, il suffit de taper : +\verb+@toto.sql;+ + +Pour quitter sqlplus, il suffit de taper : \verb+quit;+ + + +\paragraph{Mise en forme : } + +Sous SQL/PLUS : +\begin{verbatim} +Set linesize 150 -- positionne la taille d'une ligne +Set pagesize 300 -- positionne le nombre de lignes avant de réafficher les entêtes +Set pages 0 -- n'affiche pas les entêtes +Col for A10 -- défini que la colonne nom_colonne va être affiché sur 10 caractères +alphanumériques, 999.99 pour les valeurs numériques. +\end{verbatim} + + +\paragraph{Corbeille :} Vider les tables \verb+BIN$$xxxx+ : avec la +commande \verb+PURGE RECYCLEBIN;+ + + +\paragraph{D\'ebug :} Afficher la strucutre de la table \code{nba} : \verb+describle nba;+ + +Connaître l'utilisateur connect\'e : \verb+show user;+ + +Liste des tables d'un \verb+user+ : \verb+SELECT table_name FROM user_tables;+ + +Lister les tables accessibles par l'utilisateur +: \verb+ SELECT table_name FROM all_tables;+ + +Lister toutes les tables possédées par un utilisateur +\verb+SELECT * FROM all_tables WHERE owner='PALAFOUR';+ + +Liste des vues d'un \code{user} : \verb+SELECT view_name FROM user_views;+ + +Liste des contraintes : \verb+SELECT * FROM user_constraints WHERE table_name=’
’;+ + +\verb+SELECT * FROM user_cons_columns WHERE table_name='
";+ + +\verb+show errros+ affiche les erreurs des fonctions. + +\paragraph{Contraintes :} Description d'une table : \verb+describe
+ ou +\verb+desc
+; + +Liste des colonnes concernées par les contraintes : +\verb+SELECT * FROM user_cons_columns;+ + +Lire une table d'un autre schéma : + +\verb+SELECT * FROM .; -- ou schma = login de connexion de l'utilisateur+ + + + +\paragraph{Affichage :} +\verb+SET HEADING OFF+ + +\verb+SET FEEDBACK OFF+ + +\paragraph{Travailler \`a la maison} + +Il est possible d'acc\`eder par SSH \`a la machine +\texttt{londres}. L'adresse de la passerelle est +\texttt{ssh.iut-clermont.uca.fr} qui n'est accessible que par une +authentification avec des clefs SSH. + +Cet acc\`es vous permettra d'acc\`eder au serveur de base de donn\'ees +comme lorsque vous travailler \`a l'IUT. Avant de pouvoir se +connecter, il faut activer l'acc\`es \`a l'IUT sur +\texttt{http://erlin.iut.local} ce qui peut prendre 30 minutes. + +Pour d\'eposer vos clefs vous pouvez utiliser +\url{https://homeweb.iut-clermont.uca.fr} + +%.ssh/authorized_keys +%londres.iut.local +%SSH http://cr2i.intranet.iut.local/site/page/documentation/ssh/ + + +%% Faire du SQLPLUS depuis chez-vous en faisant du SSH en tapant cette +%% commande où vous devez remplacer LOGIN par votre login pour vous +%% connecter sur Linux à l'IUT: \verb+ssh LOGIN@193.49.118.206+ + +%% Le workflow le plus propre est d'avoir un fichier sur votre machine +%% personnelle que vous copier en faisant un \code{scp} sur la machine + +%% Par exemple la commande ci-dessous copie le fichier +%% creation-donnees.sql de mon ordintaeur sur la machine virtuelle + +%% \verb+scp creation-donnees.sql palafour@193.49.118.206:.+ + +%% Par contre une fois que je suis déconnecté de ma connexion ssh tous +%% les fichiers peuvent \^etre détruits car votre repertoire personnel +%% (home) sur ce serveur est TEMPORAIRE. Vos donnees peuvent etre +%% perdues a tout moment. Ne stocker RIEN ici. + + + +\paragraph{En cas de blocage :} + +Dans un terminal executer la commande suivante pour voir les \code{pid} +des processus zombies : \verb+ps -aux | grep sqlplus+ + +Ensuite tuer ces zombies gr\^ace \`a la commande \code{kill -9 numerodepid} + \newpage + %\newpage + +%\printindex + \end{document} diff --git a/COURS/ProC.tex b/COURS/ProC.tex new file mode 100644 index 0000000..180c2c7 --- /dev/null +++ b/COURS/ProC.tex @@ -0,0 +1,1309 @@ +\documentclass[a4paper,11pt]{article} +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{lastpage} +\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes} +\usetikzlibrary{decorations.pathreplacing} +\usepackage{url} +\usepackage{comment} +\usepackage{amsmath} +\usepackage{amsthm} + + + +\theoremstyle{definition} +\newtheorem{exemple}{Exemple}[section] +\newtheorem{exercice}{Exercice}[section] +\newtheorem{remarque}{Remarque}[section] +\newtheorem{definition}{Définition}[section] + +\usepackage{makeidx} +\usepackage[columnsep=9pt]{idxlayout} + +\usepackage{fancyvrb} + +%\makeindex +\selectlanguage{french} + +\usepackage[font=small,labelfont=bf,justification=centering]{caption} +\captionsetup[table]{name=Tableau} + +\usepackage{latexsym} +\usepackage{amsfonts} +\usepackage[normalem]{ulem} +\usepackage{array} +\usepackage{amssymb} +\usepackage{graphicx} + +\usepackage{subfig} +\usepackage{wrapfig} +\usepackage{wasysym} +\usepackage{enumitem} +\usepackage{adjustbox} +\usepackage{longtable} +\usepackage{changepage} +\usepackage{setspace} +\usepackage{hhline} +\usepackage{multicol} +\usepackage{float} +\usepackage{multirow} +\usepackage{slashbox} + +\usepackage{color, colortbl} +\definecolor{Gray}{gray}{0.9} + +\usepackage{fancyvrb} +\usepackage{fancyhdr}% fancy header +\usepackage{varwidth} +\usepackage{alltt} + + + \fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + + +\newcommand{\proc}{Pro$^{*}$C} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries\leftmark} + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + + \pagestyle{monstyle} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +%\cachefalse % version prof +\cachetrue % version etudiant + + \makeindex + + \begin{document} + + + +\begin{titlepage} +\begin{center} + +\textsc{\Large IUT Informatique Aubière \hfill 2019 - 2020} \\[.5cm] + +\hrule + +\ \\[.5cm] + +\vfill + +\textsc{\LARGE Bases de données} + +\vfill + +\textsc{\LARGE \proc{}} + +\vfill + +{\Large Pascale \textsc{Brigoulet}, Franck \textsc{Glaziou}, } + +{\Large Pascal \textsc{Lafourcade} et Marie-Fran\c{c}oise + \textsc{Servajean}} + + +\vfill + + +\begin{tikzpicture} + +%%% un triangle + +%% horizonatale +\draw[blue,line width=1pt] (-1,0) -- (1,0); +\draw[blue,line width=1pt] (-2.5,-.875) -- (1.5,-.875); +\draw[blue,line width=1pt] (-1.5,-1.75) -- (3,-1.75); +\draw[blue,line width=1pt] (0,3.5) -- (1,3.5); + +%% Croissante +\draw[blue,line width=1pt] (0,0) -- (1,1.75); +\draw[blue,line width=1pt] (-2.5,-.875) -- (0,3.5); +\draw[blue,line width=1pt] (-1,0) -- (1,3.5); +\draw[blue,line width=1pt] (3,-1.75) -- (3.5,-0.75); + +%% Decroissante +\draw[blue,line width=1pt] (0.5,.875) -- (1.5,-.875); +\draw[blue,line width=1pt] (1,1.75) -- (3,-1.75); +\draw[blue,line width=1pt] (1,3.5) -- (3.5,-0.75); +\draw[blue,line width=1pt] (-2.5,-.875) -- (-1.5,-1.75); + + + +\end{tikzpicture} + +%% \begin{tikzpicture} + +%% %%% un cube + +%% \draw[red,line width=1pt] (0,.5) -- (1,0); +%% \draw[red,line width=1pt] (2,.5) -- (1,0); + +%% \draw[red,line width=1pt] (0,1.5) -- (1,1); +%% %\draw[red,line width=1pt] (0,1.5) -- (1,2); +%% \draw[red,line width=1pt] (0,1.5) -- (.5,1.75); +%% %\draw[red,line width=1pt] (2,1.5) -- (1,2); +%% \draw[red,line width=1pt] (2,1.5) -- (1.5,1.75); +%% \draw[red,line width=1pt] (2,1.5) -- (1,1); + +%% \draw[red,line width=1pt] (1,1) -- (1,0); +%% \draw[red,line width=1pt] (0,1.5) -- (0,.5); +%% \draw[red,line width=1pt] (2,1.5) -- (2,.5); + +%% %% droite + +%% %\draw[red,line width=1pt] (1.5,1.25) -- (2.5,0.75); +%% \draw[red,line width=1pt] (2,1) -- (2.5,0.75); +%% \draw[red,line width=1pt] (3.5,1.25) -- (2.5,0.75); + +%% \draw[red,line width=1pt] (1.5,2.25) -- (2.5,1.75); +%% \draw[red,line width=1pt] (1.5,2.25) -- (2.5,2.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (2.5,2.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (2.5,1.75); + +%% \draw[red,line width=1pt] (2.5,1.75) -- (2.5,.75); +%% %\draw[red,line width=1pt] (1.5,2.25) -- (1.5,1.25); +%% \draw[red,line width=1pt] (1.5,2.25) -- (1.5,1.75); +%% \draw[red,line width=1pt] (3.5,2.25) -- (3.5,1.25); + +%% %% Haut +%% \draw[red,line width=1pt] (0,2) -- (1,1.5); +%% %\draw[red,line width=1pt] (2,2) -- (1,1.5); +%% \draw[red,line width=1pt] (1.5,1.75) -- (1,1.5); + +%% \draw[red,line width=1pt] (0,3) -- (1,2.5); +%% \draw[red,line width=1pt] (0,3) -- (1,3.5); +%% \draw[red,line width=1pt] (2,3) -- (1,3.5); +%% \draw[red,line width=1pt] (2,3) -- (1,2.5); + +%% \draw[red,line width=1pt] (1,2.5) -- (1,1.5); +%% \draw[red,line width=1pt] (0,3) -- (0,2); +%% %\draw[red,line width=1pt] (2,3) -- (2,2); +%% \draw[red,line width=1pt] (2,3) -- (2,2.5); + + +%% \end{tikzpicture} + +\vfill + + +\includegraphics[width=5cm]{iut-uca.png} +\end{center} + +\vfill + +{\Large Nom : \\ + +Prénom : \\ + +Groupe : \\ +} +%\url{http://mocodo.wingi.net/} + +%\url{http://mirror.hmc.edu/ctan/graphics/pgf/contrib/tkz-orm/tkz-orm.pdf} + + + +\end{titlepage} + +%% \section*{Avant Propos} + +%% L’objectif de ce cours de base de données avancées est de +%% présenter + + + +%% \newpage + +\tableofcontents + +\newpage + +\section*{Interface \proc{}} + +\proc{} est une interface entre le langage C et le SGBD Oracle. Il +s'agit d'une interface de précompilation, c'est-à-dire que le +programmeur écrit ses ordres SQL dans son code C et ceux-ci sont +traduits par un précompilateur. Le rôle du précompilateur est de +traduire un programme comprenant des commandes SQL en un programme ne +comprenant que des instructions du langage C et pouvant accéder à la +base de données (voir Figure~\ref{fig:proc}). Il s'agit de remplacer +les commandes SQL par des appels à des modules Oracle combinant ainsi +les avantages d'un langage procédural C à ceux d'un langage non +procédural SQL. + +\begin{figure}[htb] +\begin{center} + \includegraphics[width=12cm]{proc.png} +\end{center} +\caption{Illustration du processus permettant d'utiliser un fichier \proc{}}\label{fig:proc} +\end{figure} + +La précompilation, la compilation et l'édition de liens de tels programmes sont masquées par l’exécution d’une commande sur les fichiers sources qui doivent être suffixés par « \code{.pc} ». + +\section{Structure d’un programme \proc{}} + +Un fichier \proc{} se structure de la même manière qu’un fichier C. En +plus des commandes SQL, il faut simplement penser à la connexion et la +déconnexion à la base de données. Il est donc important de préparer la +liaison entre C et Oracle. Pour cela il faut déclarer un ensemble de +variables de communication et une zone de communication pour récupérer +les comptes rendus Oracle. + +\subsection{La section \code{INCLUDE} : (même fonction que le include du C).} + +Le fichier \code{SQLCA} permet de connaître le résultat d'une commande +\proc{} (erreur, nombre de lignes résultant de la requête, ...). La +syntaxe est la suivante : \code{EXEC SQL INCLUDE SQLCA.H;} + +\subsection{La déclaration de variables} + +La déclaration des variables hôtes, c'est-à-dire les variables +utilisées dans les commandes SQL, s’effectue exactement de la même +manière qu’en C. +\begin{verbatim} +int pemno; +VARCHAR pname[11]; +int pdeptno; +\end{verbatim} +Il est important de noter qu’une variable hôte : +\begin{itemize} +\item doit être précédée de '\code{:}' lorsqu'elle est utilisée (sauf + lors de la déclaration), +\item ne doit pas être un mot réservé SQL. +\end{itemize} + +\proc{} permet l'utilisation du type \code{VARCHAR} pour travailler +avec les chaînes de caractères de longueur variable. C’est le seul +type SQL qui peut être utilisé. Il est important de toujours choisir +avec attention les types C car ils vont contenir les informations +issues des types SQL. Par exemple, \code{NUMBER(8,2)} ne peut pas +tenir dans un \code{int}. Il est important de noter que chaque +variable de type \code{VARCHAR} va être traduite par le précompilateur +par une structure C. \code{VARCHAR poste[40];} Le code ci-dessus va +être traduit ainsi : +\begin{verbatim} +struct { + unsigned int len; /* longueur de la chaîne */ + unsigned char arr[40]; /* la chaîne elle-même */ +} poste ; +\end{verbatim} +L’utilisation de \code{VARCHAR} permet donc de s’abstraire de la +gestion du \verb+‘\0’+ qui n’est pas reconnu par Oracle. Ainsi la +longueur de la chaîne est celle située dans l'entier \code{len}. En +sortie d'une commande, Oracle complète la chaîne avec des espaces à +droite et met à jour la longueur. Pour entrer une commande, il faut +faire attention \`a cela. + +\subsection{La connexion à la base de données} + +Le plus simple est souvent de définir une fonction \`a réutiliser à +chaque fois. + +\begin{verbatim} +void connexion() +{ VARCHAR uid[50]; + char login[20]; + char passwd[20]; + printf("Donner votre login : "); + scanf("%s",login); + printf("\nDonnez votre mot de passe Oracle : "); + scanf("%s",passwd); + printf("\n"); + strcpy(uid.arr,login); + strcat(uid.arr,"/"); + strcat(uid.arr,passwd); + strcat(uid.arr,"@kirov"); + uid.len=strlen(uid.arr); + + EXEC SQL CONNECT :uid; + if (sqlca.sqlcode==0) + printf(" Connexion réussie avec succès.\n\n"); + else + { + printf ("Problème à la connexion.\n\n"); + exit(1); + } +} +\end{verbatim} +Pour la déconnexion, le même principe est à utiliser. Cela permet +d’appeler la fonction déclarée à chaque fois que nécessaire. Il est +possible de pr\'evoir le cas où il faut valider les transactions et +les cas où il faut les annuler. +\begin{verbatim} +void deconnexion(int validation) +{ + if (validation == 1) + { + EXEC SQL COMMIT WORK RELEASE; + } else + { + EXEC SQL ROLLBACK WORK RELEASE; + } + printf("Déconnexion sans problème.\n"); +} +\end{verbatim} +\subsection{Le corps de l'application} + +Il contient essentiellement des ordres SQL aussi bien pour la +manipulation de données que pour la définition des données. La syntaxe +utilisée est la même que celle de PL/SQL avec en plus l'utilisation +possible de variables hôtes partout où une constante peut être +employée (nom de relation, nom d'attribut,...). + +\begin{verbatim} +EXEC SQL CREATE TABLE empTest(empno NUMBER(2)); + +EXC SQL INSERT INTO tligne VALUES('exception produit inexistant'); + +EXEC SQL SELECT job INTO :function FROM emp WHERE noemp=301; + +EXEC SQL UPDATE emp SET sal = :sal WHERE noemp = :noemp; + +EXEC SQL DELETE FROM emp WHERE noemp = :noemp; +\end{verbatim} +Toutes les sortes de requêtes peuvent être utilisées. Les requêtes +\code{SELECT} suivent exactement les mêmes règles qu’en PL/SQL. Dans +l’exemple précédent, le \code{SELECT} doit retourner une et une seule +ligne. L’utilisation des curseurs pour les multi-lignes est présentée +après. + +\begin{exercice}~ +\begin{enumerate} +\item \'Ecrire un programme Pro-C qui se connecte à Kirov puis affiche + le nombre de produits contenus dans la base de données, puis se + déconnecte. + +\begin{SaveVerbatim}{countprod} +int q1(void) { + int nbProd; + EXEC SQL SELECT COUNT(*) INTO nbProd FROM TPRODUIT; + printf("Il y a %d produits en base.\n", nbProd); + return nbProd; +} +\end{SaveVerbatim} +\cache{\tiny \BUseVerbatim{countprod}} + +\item \'Ecrire un programme Pro-C qui demande à l’utilisateur un + produit et l’ajoute à la BD. + +\begin{SaveVerbatim}{addprod} + void q2(void) { + char codeRayon[REFERENCE_LEN], dateStock[DATE_LEN], nCodeRayon[REFERENCE_LEN], + nDateStock[DATE_LEN], noProd[REFERENCE_LEN]; + int choix, nStock, stock; + float nPrixV, prixV; + VARCHAR des[VARCHAR_LEN], nDes[VARCHAR_LEN]; + printf("Saisir numéro produit : "); + scanf("%s%*c", noProd); + EXEC SQL SELECT des, stock, prixV, codeRayon, dateStock + INTO :des, :stock, :prixV, :codeRayon, :dateStock + FROM TPRODUIT + WHERE noProd = :noProd; + printf("1 - Désignation : %.*s.\n", des.len, des.arr); + printf("2 - Stock : %d.\n", stock); + printf("3 - Prix de vente : %.2f euro.\n", prixV); + printf("4 - Code rayon : %s.\n", codeRayon); + printf("5 - Date : %s.\n", dateStock); + while (choix != 9) { + printf("Que voulez-vous modifier (9: quitter) ?\n"); + scanf("%d%*c", &choix); + switch (choix) { + case 1: + printf("Entrez la nouvelle désignation : "); + fgets(nDes, sizeof nDes, stdin); + if (nDes[strlen(nDes) - 1] == '\n') { + nDes[strlen(nDes) - 1] = '\0'; + } + EXEC SQL UPDATE TPRODUIT SET des = :nDes WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) {erreur_sql(STOP);} + break; + case 2: + printf("Entrez le nouveau stock : "); + scanf("%d%*c", &nStock); + EXEC SQL UPDATE TPRODUIT SET stock = :nStock WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) {erreur_sql(STOP);} + break; + case 3: + printf("Entrez le nouveau prix : "); + scanf("%f%*c", &nPrixV); + EXEC SQL UPDATE TPRODUIT SET prixV = :nPrixV WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) {erreur_sql(STOP);} + break; + case 4: + printf("Entrez le nouveau code rayon : "); + scanf("%s", &nCodeRayon); + EXEC SQL UPDATE TPRODUIT SET codeRayon = :nCodeRayon WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) {erreur_sql(STOP);} break; + case 5: + printf("Entrez la date : "); + scanf("%s", &nDateStock); + EXEC SQL UPDATE TPRODUIT SET dateStock = :nDateStock WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) {erreur_sql(STOP);} + break; + default: + printf("Choix inconnu.\n"); + break; } + EXEC SQL COMMIT;}} +\end{SaveVerbatim} + +\cache{\scriptsize \BUseVerbatim{addprod}} + +\end{enumerate} +\end{exercice} + +\subsection{Le traitement des erreurs} +\subsubsection{Le fichier \code{SQLCA.H}} +Il définit une structure de données '\code{sqlca}' dont les champs +sont mis à jour après chaque exécution d'un ordre SQL et qui en donne +le compte rendu. + +\begin{verbatim} +struct { + long sqlcode; /* code resultant de l'exécution + =0 -> ok, + >0 -> ok avec un code d'état, + <0 -> erreur */ + + struct { + unsigned short sqlerrml; /*longueur du message*/ + char sqlerrmc[70]; /*message d'erreur*/ + } sqlerrm; + + long sqlerrd[6]; /* seul sqlerrd[2] est utilisé -> donne le nombre de lignes modifiées + UPDATE ou rajoutées par INSERT ou ramenées par un SELECT*/ + + char sqlwarn[8]; /*sqlwarn[0] 'W’ -> warning*/ + sqlwarn[0] = '' /*-> pas de warning*/ + sqlwarn[1] = 'W' /*-> troncation numérique ou char*/ + sqlwarn[2] = 'W' /*-> valeur Null est ignore*/ + sqlwarn[3] = 'W' /*-> plus de champs dans SELECT que de variables pour recevoir*/ + sqlwarn[4] = 'W' /*-> toutes les lignes d'une table sont touchées (par DELETE ou UPDATE par + exemple)*/ + sqlwarn[5] /*inutilisé*/ + sqlwarn[6] = 'W' /*-> Oracle a dû exécuter un rollback*/ + sqlwarn[7] = 'W' /*-> la donnée ramenée par un FETCH a été modifié depuis que la clause + SELECT a été execute*/ +} sqlca; +\end{verbatim} +Après chaque commande SQL il est possible de tester le champ de +\code{sqlca} correspondant à une erreur possible dans le cadre de +cette commande. +\subsection{La commande \code{WHENEVER}} + +Oracle permet d'utiliser des directives qui spécifient le traitement à +effectuer en cas d'erreur. +\begin{verbatim} +EXEC SQL WHENEVER [SQLERROR|SQLWARNING|NOT FOUND][STOP|CONTINUE|GOTO
’;+ + +\verb+SELECT * FROM user_cons_columns WHERE table_name='
";+ + +\verb+show errros+ affiche les erreurs des fonctions. + + + +\paragraph{Contraintes :} Description d'une table : \verb+describe
+ ou +\verb+desc
+; + +Liste des colonnes concernées par les contraintes : +\verb+SELECT * FROM user_cons_columns;+ + +Lire une table d'un autre schéma : + +\verb+SELECT * FROM .; -- ou schma = login de connexion de l'utilisateur+ + + + +\paragraph{Affichage :} +\verb+SET HEADING OFF+ + +\verb+SET FEEDBACK OFF+ + +\paragraph{Travailler \`a la maison} + +Il est possible d'acc\`eder par SSH \`a la machine +\texttt{londres}. L'adresse de la passerelle est +\texttt{ssh.iut-clermont.uca.fr} qui n'est accessible que par une +authentification avec des clefs SSH. + +Cet acc\`es vous permettra d'acc\`eder au serveur de base de donn\'ees +comme lorsque vous travailler \`a l'IUT. Avant de pouvoir se +connecter, il faut activer l'acc\`es \`a l'IUT sur +\texttt{http://berlin.iut.local} ce qui peut prendre 30 minutes. + +Pour d\'eposer vos clefs vous pouvez utiliser +\url{https://homeweb.iut-clermont.uca.fr} + +%.ssh/authorized_keys +%londres.iut.local +%SSH http://cr2i.intranet.iut.local/site/page/documentation/ssh/ + + +%% Faire du SQLPLUS depuis chez-vous en faisant du SSH en tapant cette +%% commande où vous devez remplacer LOGIN par votre login pour vous +%% connecter sur Linux à l'IUT: \verb+ssh LOGIN@193.49.118.206+ + +%% Le workflow le plus propre est d'avoir un fichier sur votre machine +%% personnelle que vous copier en faisant un \code{scp} sur la machine + +%% Par exemple la commande ci-dessous copie le fichier +%% creation-donnees.sql de mon ordintaeur sur la machine virtuelle + +%% \verb+scp creation-donnees.sql palafour@193.49.118.206:.+ + +%% Par contre une fois que je suis déconnecté de ma connexion ssh tous +%% les fichiers peuvent \^etre détruits car votre repertoire personnel +%% (home) sur ce serveur est TEMPORAIRE. Vos donnees peuvent etre +%% perdues a tout moment. Ne stocker RIEN ici. + + + +\paragraph{En cas de blocage :} + +Dans un terminal executer la commande suivante pour voir les \code{pid} +des processus zombies : \verb+ps -aux | grep sqlplus+ + +Ensuite tuer ces zombies gr\^ace \`a la commande \code{kill -9 numerodepid} + \newpage + %\newpage + +%\printindex + \end{document} + + + diff --git a/COURS/compil.sh b/COURS/compil.sh new file mode 100755 index 0000000..6884021 --- /dev/null +++ b/COURS/compil.sh @@ -0,0 +1,3 @@ +make -f /etc/oracle/proc.mk build EXE=$1 OBJS=$1.o +./$1 + diff --git a/COURS/hopital-q1.pc b/COURS/hopital-q1.pc new file mode 100755 index 0000000..bec4dc4 --- /dev/null +++ b/COURS/hopital-q1.pc @@ -0,0 +1,150 @@ +#include +#include +#include +#define size_t long + +EXEC SQL INCLUDE SQLCA.H; +EXEC SQL INCLUDE SQLDA.H; +EXEC SQL INCLUDE ORACA.H; + + +void connexion() +{ VARCHAR uid[50]; + char login[20]; + char passwd[20]; + printf("\n"); + strcpy(uid.arr,"palafour"); + strcat(uid.arr,"/"); + strcat(uid.arr,"1s;ph;;1"); + strcat(uid.arr,"@kirov"); + uid.len=strlen(uid.arr); + EXEC SQL CONNECT :uid; + if (sqlca.sqlcode==0) + printf(" Connexion réussie avec succès.\n\n"); + else + { + printf ("Problème à la connexion.\n\n"); + exit(1); + } +} +void deconnexion(int validation) +{ + if (validation == 1) + { + EXEC SQL COMMIT WORK RELEASE; + } + else + { + EXEC SQL ROLLBACK WORK RELEASE; + } + printf("\nDéconnexion sans problème.\n"); +} + + +void sql_error(char *msg) +{ + char err_msg[128]; + long buf_len, msg_len; + EXEC SQL WHENEVER SQLERROR CONTINUE; + printf("%s\n", msg); + buf_len = sizeof (err_msg); + sqlglm(err_msg, &buf_len, &msg_len); + if (msg_len > buf_len) + msg_len = buf_len; + printf("%.*s\n", msg_len, err_msg); + deconnexion(0); + exit(1); +} + + +void traitErreur(char *msg) +{ + EXEC SQL WHENEVER SQLERROR CONTINUE; + printf("%s\n", msg); + deconnexion(0); + exit(1); +} + + +int main(int argc, char** argv) +{ +varchar vnom[20]; +varchar vprenom[20]; +varchar vhopital[20]; +char vidhopital[6]; +int fini; +int fin=1; +int vnbnom; +int vnbhopit; +int nb=1; + + EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); + printf("\n Appel de la fonction connexion"); + connexion(); + printf("\n Appel de la fonction deconnexion"); + + /*----------------------------------lecture----------------------------*/ + EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); + + /* SELECT p.Nom, p.Prenom, h.Nom FROM PERSONNEL p, HOPITAL h WHERE h.id_hopital = p.id_hopital and p.id_personnel='PE01'; */ + /* printf("\nUn exemple PE01 \n");*/ + + EXEC SQL SELECT p.Nom, p.Prenom, h.Nom INTO :vnom, :vprenom, :vhopital FROM PERSONNEL p, HOPITAL h WHERE h.id_hopital = p.id_hopital and p.id_personnel='PE01'; + + vnom.len=strlen(vnom.arr); + vprenom.len=strlen(vprenom.arr); + vhopital.len=strlen(vhopital.arr); + + printf("\n TEST pour PE01 : Nom : %.*s prenom : %.*s hopital : %.*s \n", vnom.len, vnom.arr, vprenom.len, vprenom.arr, vhopital.len,vhopital.arr); + + printf("\n Affichage les hopitaux \n"); + + /* SELECT COUNT(h.Nom) FROM HOPITAL h */ + EXEC SQL SELECT COUNT(h.Nom) INTO :vnbhopit FROM HOPITAL h; + printf("\nNombre d'hopitaux est %d\n",vnbhopit); + + EXEC SQL DECLARE hopitaux CURSOR FOR SELECT Nom, id_hopital FROM HOPITAL ORDER by Nom; + EXEC SQL OPEN hopitaux; + + EXEC SQL FETCH hopitaux INTO :vhopital, :vidhopital; + if (sqlca.sqlcode == 1403) {fin = 0;} + while (fin!=0) + { + vhopital.len=strlen(vhopital.arr); + printf("\n Affichage des personnels de l'hopital %.*s : \n",vhopital.len,vhopital.arr); + + /* SELECT COUNT(p.Nom) FROM PERSONNEL WHERE h.id_hopital = p.id_hopital; */ + EXEC SQL SELECT COUNT(Nom) INTO :vnbnom FROM PERSONNEL WHERE id_hopital = :vidhopital; + printf("\nNombre de personnel de l'hopital %.*s est %d\n",vhopital.len,vhopital.arr, vnbnom); + + /* SELECT p.Nom, p.Prenom FROM PERSONNEL p, WHERE h.id_hopital = p.id_hopital ORDER by p.prenom ; */ + EXEC SQL DECLARE personnels CURSOR FOR SELECT Nom, Prenom FROM PERSONNEL WHERE id_hopital = :vidhopital ORDER by prenom; + + EXEC SQL OPEN personnels; + fini=1; + EXEC SQL FETCH personnels INTO :vnom, :vprenom; + if (sqlca.sqlcode == 1403) {fini = 0;} + + while (fini!=0) + { + vnom.len=strlen(vnom.arr); + vprenom.len=strlen(vprenom.arr); + + printf("%d) Nom : %.*s Prenom : %.*s \n", nb, vnom.len, vnom.arr, vprenom.len, vprenom.arr); + nb++; + EXEC SQL FETCH personnels INTO :vnom, :vprenom; + if (sqlca.sqlcode == 1403) {fini = 0;} + } + EXEC SQL CLOSE personnels; + + EXEC SQL FETCH hopitaux INTO :vhopital, :vidhopital; + if (sqlca.sqlcode == 1403) {fin = 0;} + } + printf(" Fini \n"); + EXEC SQL CLOSE hopitaux; + + deconnexion(1); + return(0); +} + + diff --git a/COURS/hopital-q2.pc b/COURS/hopital-q2.pc new file mode 100755 index 0000000..fe78035 --- /dev/null +++ b/COURS/hopital-q2.pc @@ -0,0 +1,142 @@ +#include +#include +#include +#define size_t long + +EXEC SQL INCLUDE SQLCA.H; +EXEC SQL INCLUDE SQLDA.H; +EXEC SQL INCLUDE ORACA.H; + + +void connexion() +{ VARCHAR uid[50]; + char login[20]; + char passwd[20]; + printf("\n"); + strcpy(uid.arr,"palafour"); + strcat(uid.arr,"/"); + strcat(uid.arr,"1s;ph;;1"); + strcat(uid.arr,"@kirov"); + uid.len=strlen(uid.arr); + EXEC SQL CONNECT :uid; + if (sqlca.sqlcode==0) + printf(" Connexion réussie avec succès.\n\n"); + else + { + printf ("Problème à la connexion.\n\n"); + exit(1); + } +} +void deconnexion(int validation) +{ + if (validation == 1) + { + EXEC SQL COMMIT WORK RELEASE; + } + else + { + EXEC SQL ROLLBACK WORK RELEASE; + } + printf("\nDéconnexion sans problème.\n"); +} + + +void sql_error(char *msg) +{ + char err_msg[128]; + long buf_len, msg_len; + EXEC SQL WHENEVER SQLERROR CONTINUE; + printf("%s\n", msg); + buf_len = sizeof (err_msg); + sqlglm(err_msg, &buf_len, &msg_len); + if (msg_len > buf_len) + msg_len = buf_len; + printf("%.*s\n", msg_len, err_msg); + deconnexion(0); + exit(1); +} + + +void traitErreur(char *msg) +{ + EXEC SQL WHENEVER SQLERROR CONTINUE; + printf("%s\n", msg); + deconnexion(0); + exit(1); +} + + +int main(int argc, char** argv) +{ +char vidperso[20]; +char vidfonction[20]; +char vidhopital[6]; +VARCHAR vnom[20]; +VARCHAR vprenom[20]; +char eidperso[20]; +char eidfonction[20]; +char eidhopital[6]; +VARCHAR enom[20]; +VARCHAR eprenom[20]; +int nbhopital=0; +int nbfonction=0; +int nbperso=1; + + + EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); + printf("\n Appel de la fonction connexion"); + connexion(); + printf("\n Appel de la fonction deconnexion"); + + /*----------------------------------lecture----------------------------*/ + EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); + + printf("Saisir un nouveau personnel \n"); + printf("Entrer son nom : "); + scanf("%s",vnom.arr); + vnom.len=strlen(vnom.arr); + printf("Entrer son prenom : "); + scanf("%s",vprenom.arr); + vprenom.len=strlen(vprenom.arr); + + do{ + printf("Entrer son id hopital : "); + scanf("%s",vidhopital); + EXEC SQL SELECT COUNT(*) INTO :nbhopital FROM HOPITAL WHERE id_hopital=:vidhopital; + //printf("nbhopital %d\n",nbhopital); + } + while (nbhopital !=1); + + do{ + printf("Entrer son id personnel : "); + scanf("%s",vidperso); + EXEC SQL SELECT COUNT(*) INTO :nbperso FROM PERSONNEL WHERE id_personnel=:vidperso; + if (nbperso==1){ + printf("Ce numero de personnel existe deja\n"); + EXEC SQL SELECT * INTO :eidperso, :eidfonction, :eidhopital, :enom, :eprenom FROM PERSONNEL WHERE id_personnel=:vidperso; + printf("ID PERSO : %s \n",eidperso); + printf("ID FONCTION : %s \n",eidfonction); + printf("ID HOPITAL : %s \n",eidhopital); + printf("NOM : %s \n",enom.arr); + printf("PRENOM : %s \n",eprenom.arr); + } + } + while (nbperso !=0); + + do{ + printf("Entrer son id fonction : "); + scanf("%s",vidfonction); + EXEC SQL SELECT COUNT(*) INTO :nbfonction FROM FONCTION WHERE id_fonction=:vidfonction; + } + while (nbfonction !=1); + + EXEC SQL INSERT INTO PERSONNEL VALUES (:vidperso,:vidfonction,:vidhopital,:vnom,:vprenom); + + EXEC SQL COMMIT; + + + deconnexion(1); + return(0); +} + + diff --git a/COURS/iut-uca.png b/COURS/iut-uca.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd0daa2cc05c4149c08facfff1cf4de90279f0c GIT binary patch literal 233220 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 z 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�{>^B^nS_-_oqq#n_j5L)ckw)+V;%vNK*e$_La7_zHxI}nO$ zYPQj-h3{OMmVh)?i0|LOe*(r+yVMOwnIe#5WwYW94BmS^n{fXJx z<2@*U8IHcxt{^+o_Uf(}4C9=8ds%5`3e;MhB-prl1L3Ar=)dNH5k+HQN_;^HaHu&b zftnXh@s%f>gt+&Tac)nROgPw+1=s+j{6fvv%HWdj(~d>77t^pgqxpIwY$$(q!T2es zQms+8klPc^MFO9x0x-IT<>h6QQwqrKY-1x~braB{Ph@ULKaU{>d?MrL z<8R2C7C+yXj6mz4#b$cPnw>G{r#wIcr}yUh+>-uoO-;=ggT)S`7#gGTlGq8ZM>u!( zaL0E^jy?^o+i^k-iatyoQ%*A7jDfw{2&m@l1E4IlvN>yH>u-l=d#_~d&H`VDHTV+p z2!EaNMOU{3_8N};ymcBED zKfyPG%(ygTH4v)hI{^9Bdaz;mt{w-MHApsTu8@-*&2%6S?^lg8m*F?p6WtEEGFdnu z29^lszRF5(jnM5bS^>d43Yz_oCn59#-@UFu%zbH(nE?Ckp1A`i`&>`m{_K0m)DJ^% zVqx'Z@L+2;Ax50s*9bj@Z0YB7{35(z1vwt+Me63meSvMn+fjTGcm!uM-RY1 zNL2n6!%oWYwZ_6%B8UCh+&7?it8h@;xSt?OWTg(=u9l?JwV_*ja{VDxONVL}-Mps1 zCd&FOoo(9%*+n*JTaiBf^5*=NSOlEePxFDaNTy?BdnV z#Qbl=NA#u_0(!Gg218i{x6u(%x$L7?>U6dGFk*HnOqUT{DeayVj@u3`%V2iJgy+fA z`Q74QM|wib^im~LYoe7<+JGZvK@(T&-0B8^_DS#eoRKg&q~9Xqy=z}jl;v6Wa|h;4Q*#=h znUrP~VnI)=8=88>=adWd{%B1<(6~a%28<8Eh6v*j2E|DwaCNNF77w(Z? zTvD=e83sL9RP+-k;7(NE))$WbUEs6FKNt6ph$hP3Aav+b9D^C=P0LQkJ|BPW*A2#s zAJ7+J_MaPOsNBU7DV$&zF2_Z(pp172Ftym2V6-^Ho2dY+?XLv(62?$Wq4oinJXOtP<(ucUe0+A9A(~5q>YqiS?)##cnnka^kVc~bgQ;KPQcV>A39FzrWu zUw|lR76AiwAT|!;M|ho8Lv^&w@QYXZ@5GlbGFf5fkX7di1&YE-r1#HDzP=;J>f~Qp zuBNMeK7cQ6E0D3av-5$BCDnzZ4Yq6qWEm#FSX5|@HV&Bg2}c)tvqVjsg@)5A?SE4B zzNQl(?N||LF5*~qIL3Ex?|whc5rd~3@}d2a6kAwZ%&Y2W$5U9NX~j-mEuN@$Nld5x z6pP9Z7NW@la5q~}NXX2U;sKc{0T~Ypp%3{0$NWmeK)7YvKjU_RJC#@dg9tSQdU*|A z+&phJV!!VB@}{3N9ehMz$>+Nb2yGm%BErH2FUJ{^b0hKjYJNREI!d{*nUL0B zx1FsG*)Jv?wU6LNRGxq2A@C{!XE-7DCZtQo(_5Rgg!L4t-@K^dZ#bmJiZ^O5&|#oq zw+u=X{RV-XI&hLbin8;Ii+e;wMK`oCr!D5t^v_Flyh}M6Mfk`q&2;8NKb>@z>I;6# zL#>>NTYpOj-clhL5z)&jvai`o+sR+Q=A_)u--+}taM74Pe*L?*Uz)WLv&NVvm_DUs zl@@Q3wEOp}C+zcu9`fqy>WB;8WO&uP#CHbSym@Wfvf&wa{NGx2zi-l%moidAY^Y$hPYL;)EPR28pX8YF&Du zluqiDsR^=-lJ;4jk#5I?Xd;nF5GNarIVUeaCFYwce}8b`_&gprClq>p&VgOpKRxA* zd{InvbPANbT(P>@`V}6J-Q72GIINB1XZORQYbp4uCK7!wS=$z7ymW#Yw=i--Zqax9 z4|;U+<;}oVq3nbU5O|^8WMplpQf%3k*SYD)!NFk+Rkfjs+54fwa1Z6$bvndSsSzIuXrBR$ zx3*IEo3;t6zQACPapkGtg=e0;Wa(1dwxorS(9o>8RZ;LYKVo8HBt6*RT=?<%byl<$ zvF){hK z=2c~K?1M2SS=rhSTbvybm>hv80L*duB=o7diN}FeARDG2w z+BrD5jl|b+;K`<^E!VpUItKPdOW&OP-)m#}lvaiEUE=zj#2SX|Wb%=6Gsr%dp1uf| zP7rc94?fH{`gm9a({fUQA8)FS{`}p8^qC6k%+0)KSXjI=AXTX7_aT**YMa~1rV!(4 z>!_bxS1B5_dW~s4G%h#iSo5_-`AR{GXhQ!c^G9^vo&O$BG=_6X-)BU6l$B%tR@4D7 zmU;xPK#q|mJnLPcRuFEy9BkCn%pwi9bTU=)D&n?dy>|bz<(nh ze;D4-dw!ank>sU{nDxF|T1j{qOBp%225nDIiaSw)V>ckPJ0`pCIyGGz>%f(&w8QNv zvp6w-t-ehPh1A>A6WKR6bB&X;&fMHwnjo4w@hz4=JP371YJQksc&%PHKg?N^^Q2$| zLm~PsSyx#k!yV)YVDRBwzu|2}-6W0kPo#56Kv0mezrWuu-7-lHy;0~HEdDB?#>y^D zB4wVZc_1~Rz=)(YatqQ@4jyFaLkwUy{)3gPKpq>04EvlU$&Yt!MkL%ydNr1)>EN8b zaCjK^_&AQA{6wr$QCWK^^&S!hr4c{d4ixj&6fq+A&fOjQ<1;z5b#x*;JUw@{tK~MN z%_@ebOGIC zZF#>SqY)*-lar5zX}*6R&xKh7?W$d6azGh2q`$~+4R{1`g*fBtf+eQ_1C*S|2~V8N zgBA`}yG~nx$54t$q>z=Jl@$uW6d_>G$ygqez5+K%FoWul3T%3r|4x*Q7Dyg>B#kkq z1aTZ+!pv(tOyRjd^PJ{sH5uBL9qE3bfvjsk9PmL8MM>Oh)Jm&-hMX%;!-L*@N5Xfh zRz^-~3}Lb}+QiDrsusvrm-qAp5?t*69FC4}-`=q>GgI=sBeQh(H}Xh7qJKY!^_MyK zD3qAbC?Kph*a?u?;`i#OGiBJ;7-73ELRQx5jECu1B<*MUM}-kJysndnCZ6?@@8##k zrH<=EF8|Fquh-fO`n^H4QRt6z5&S(&*$eqC??P329{Mcprb@*RUts7rD9kvcCN7b$ zsENgH|E#L2+BoDs4~j0Y!CM%r@}}gpNRZs+O;^sWUZP11KbIz>nZJ|RS23*;9`wZ| z4+ODvDuR&@q|E&1FggNrSeTAYVqGrfu`C5t#0l}(s4lv`K7$s+(`2!=Hm#*}mOGI- zH3#VXvIP?uOwvBc8G|j4o)i7OlAD`5b;!K};y7a@H-)tB{!(M6dulgt_CjT)Mo!l7 z>aglsa>=}HetJo&yU}h-dYQv${e4*5;B&}B>|dvIh2L)LKGa;=pF0L@jju&!u z5S%rmL8FA_U#Nr}zA%sL6k1HWUh@p2cu`5QL2GZEQ;*MT&K+J*-!kz6ankHF&!gx}*u>J`3cs%S;w*YZu*`{~(PFYyyEuSNa(lrGSi zeo-Gno?(j+zHdEugSulh4qNsOT6FSur4$CF)ZAa2@qn1!6;2Nm`%fZry51|M>dZ|j z#_%Xo(pPIMB1_)LU(#VZdGgF@q)wc0uvPFh0uFq`gJkPA51{mEmRG>NK_YpQ#&|PP z40s_K=f3e^l=>@}(4VE^X{B2mSM{hhmL>Euw2E>8@h5V@4 zSg&(XF-f z!0-_$Okj>p9kR^s)&U1d9?*YqSbN?xwsCG+?N&cW)KvkxQ0R>e z-`Uv-KjcmT{_1XHV`F4|Hw$|x{k&^v^w}+F;U+z7OXk@VmQ@p0T!ot{cZRY{djm6P zVz(bSng~P%-%?*%B?JGt!j|y@CZ>7QSn)`mZ{HQMnJ`Ai$g8oSW$Wx=4VG93+JK8s z2i3V$tVZG+;2JtBTdgziCysKSbl{F=j}A}_>i#`|n3>!O)o1NU0ETDY3&1S3!6ojY z2&x7K(&>ePmiejp^MmHvi(lRzYeaLrK0H6a^sG+HM}9PQrQRtWdq$kq9P=jKNV#FR zC)d~q<`c!azv{kw>1`z(qqiQ4^ll>6v0+KRo(?`?3L>O}f^U^2B~ylb5er&s*kmsO znR)*Fx!G+wInoa`M-xVS5ze(jbT<{{qwH1H?N1Lp(s-AnzTa!mU^GEBF@&bq$TyTg z2jLu?m-Iu}5EH)Bk#TX7rsIJYqs4=ZKVN)LqPM(U<&0)t8h;Eh!1v$3`D_rSUSG?d z1^2y_oS0QoQeqGK|E>ySnnE!ISHDm{bff$$BlK%09Q8?p9*|};-=ljNUZkJ-T9B)H z|JGdRVj&Td=O#p(;x>SSl9N_Fj`cYCOa04Uiq6^{T1(ebDHg=fYsTWyVTuXU{3DSv z1CW2bhUp`FKypHK+n-H5O9RJi2Dy$8L-ZAf&af_2J;cxDGRJ7xHy5>Iw0}=I%%2RV zC=k>NuYMLFFesdQAoV&oED0OS3>f18AYQ^yf>5Db5`%EvIhrZu%pJ$t16e(|;V_DO zEUnF;jVNP%HiWuh-i7$yz{kD5avo_cu8L2XPK5rkfm19jTOQzOI_bzL5!hKJfwDI1 zz$d4FH>PG${~5DE8-$Hz&;=vut9(RZPQ$7NrfC@XM0RTesRuBZBJmq?UFio=k=-9H zt$j*|Up1=!_fd#ml~FO!Ef&pLxl!9#oY!WiV5$dPlk=nqo219`{X=wYv7QXsukR(-z{_4J zwe>qj{G$5HP(LQ&sCbLgb{y}pU~2TW1fgs=`rf9d7aOl2XO;Z&EfNjP-bGZtAKH-! zRTsdFiE}a@xirZmZ8`ddkMpc+pDtMx_4)CLz1tXog1ZZyO43*mw9Hz*G9(Kc=m3D= z>x>jfo}+!6Ju{9rXuh>xXdwk)kF}g`QEg%NFWwYSDuM4A4~4nDYl!j11n$8jo+>a4 zaUMG2h9yDmIwEexSG!4ofRhz{#}ZxnnWjBe@aozu@o}>@ ze>iL*>6Xod+U>nwUNNgXt|Nv!75PJk`b+f|?OK(#yDb*PqEi=;%uMa_-m#h0f{A9m zO!{skZGC-xt&;!&y^3oZo0g|YEY%jWSy5lm@YfpB6~mnK#9O9C_Z^H@kC>m9!h}Ro zoF(6W5rC+Ow1{-l%Qmb$sPyKGvd)>1ZDm;io_m%uCT9F))Dg0fZCdEUlMIh*<~5kP z&NDB-`?3ZjlO2@fL~{4ejSzGXfcDi-_N%(>HrsAC+LKq^c)ROZ-$V&!%PY%V`R(>d zmnan*>hH(L->PjcPnqRR`yG!!fb_4e^Oj``54bo$0Gz#Z>qC^IUqxTOCCSu+2B?RUA2$*jwA_ za0M4Rpl4vMWgHC>ymo!JUW;yKJ+R6 zQ?q8Y?>#F}Z~bJHTM}X5yx)H%uKieIPiof;5 zphy6lgxyYB;;vl(K~gW?DAt#L`(=G@lufXqPc2KdL5IM!#By==6YHyz3WtHNHrYGs>2Kru0ohi``U9yFjNoImIiR~?r4C@DaUJ&Zbx5p32_p2Y;>%~y>W8PY9bEq=Ptn`fjd-y;h!=*`) zNZ$F$NjD0doZWdCP(qLUCiB6AEg%-7qR(1+H!&=J4ZF&E>_- z)kO{)S6x@J@hU~1{e?&BoCej6KEjoKr)zg({((PG-pk~*`Rpu_I)M*o269ztgCEeJ z)yND`r*gsX@GzQ=A9C0hp9uK1rJo_>SR}Po+@R*|0`;I76pORosA>H@NStqJK%}tK z+vdIMDxGfM?7ncZLJo6$8auVE=6w+FYtKC|h>8%%GBz%+i#CotAIhNQJG2&%N;uBC zmim-Ym1GGXUA-5$M@rd3p1FvzQjDo`E`w zy@D~m#OJIqfqG3vr!tP3+EFJlkv2j;k0L19IwlSnZQw@X5Bk;rEDFPO08f<2g0ZY?kkg4^|OL*~XvYB^!s^oL)Px%4zP? z^>E`rE$zRIvFZ2ZV^%G!od$>4iyCa*-Q3o#l%%(pV?drN{qn}n+}fz~Aw$KlBgS*Q zksJ1;FkZ(7FYab-6~W@u5w7s{7fXF-?TyOY-A1IqjS>(8v)>v~rh zY9LD+FlyKG%=~WqrAWgsH%#Ygb0+cUfoG@Z95n_+jgwd3-k`C7PMvNj{;!5Zm@{l` zVd4H`pI`cXZye^r16kw`T49J^y6*gEK?)xL^I@~uT*@&QQl?!AkQe0u zD1X<~UqU-ZKK$I~4c&0%6q&~KkEq!I=Z1lSnUE-+<^%WpAQySt`MyIKdO0If72`Jh zKnqp~KepY!KzQVL)U_&iIP`)`>SOQ7Kwi%sA2sZqAf!Pcp>(hQOtqF^nFr=3o9^h* zSVRR1QM~?A zD3Q9L=nIr~cI_cKT+l0dJf?w|a|UXt(J)fZX&ZA8Q2dfZYHvlWwKhm4Egm;Z2{Wj! z0+*=HXor5^dbPyJF8_J<8HMn`bX|uosUx$?J#+EH2i(IKvVRN4uEn_G>rh!Uw;W0C zim9xonxh>cEr!gGBLJSw0rIUGWH;*zuU}AC6r8?5Y)ck zGF35y{FpJhGT@R#cA+xTds3yhhw)Zn0d`wMa}0PEHsue#$H~QRIbAJmu68ey#9<%Isni7H~M+VR3Oy*lK%2Z;4tlY7#aQ8 z290CV>>7n1@Y>!33aCn?-E)Q!9o4_N)+%=E1`Quu*yRlSW{IM*6HR&*rqowejDpqN%hDac%ytHDE$&YXOFH8O2N4|j3^+`wvff)xo2w1=QpN!&O8_gcn@qI*;(R2n}#KJ$&kE5fn zZwo5U%xBoyeFTA2cU3L$=K1>`nY8f(m@^e$&2;QuaBXBIJ6Wy zH7awbE1|Ey+4YWNU8aF~r7^G|I);S)fbe2}Y-ZS9s47(tnayVKL*a6vwYgcKPltr9 z@PUWE9DdIkh;3ptD)_JH-9x3rIQ23iSJQ}9rl7hP^ska(ev+ni)r^DU*RhPFpPR#$ zFS$8lUPR?&ve-`%rNu;ZaNI1%vilidQ>o3? z+Pb`wNE`zMDeTc)9@OFIkv6IVJG$PrmFWgo)qhid-R2x*_$gA|D~BJ64w4^D zUX94S@!azPvkHA^xKhsc&O2&zig{xCq5y`zx3Gie&4I+Kmm?VCixy42mjNS4si;6-xD+O}ckc56J5}kU(=Vpe|PE zXZP`q&-G7fUVERnpt=&d8V;yJ`;fta-IE>{s}Sjhq>>8%f?nN%KT*S_tO1U>JI2|Jqjy=hLM{S`PpE@W zX)sR#J_ zZUBAZmS+>+iLl$i=D~xmG>lqNm5yths6~A~#puO?VeZpG$Fy{bTOE2|n+Kpk5zzVe zrdj3F zedWh9I(W0HN_gi?pj2Mf(_lP4a%w(6QppQdSFUf@S~7>x1kPCZAEQ$Grw^#A5)Ruv zpm11OhMU_hLY?a}IHYNzq^EI@LQVLhZWFba-6XUrc7msl+SZRQa^8mQjw;P|i*z1& z?J9JD$p*9rEkUsJ6qQ$@fbr{NTXm0}&V4Kb(+~HT&MqwMDgqxc`T>Fz;h8UE;Rj@u z2QUL8945sG8H~ey7$V;#IAj79;#ut?W)@=s(x$b}OwHHEAeLn?t;;@_N9U=7o zFrDBj`5w*x=vbtCLXP}Q7(nBkd$XjjuZ%uJ@M0b?-A_w{DW?Rg) zIYCxrhp6q$hd>PQcR%j^U0slQ=e~XZwYa$d!)M0plh67r2+)zU4U{YF@?<--K%EKP z8+5C@e^;^%sU=fYg@Lw{VnIPcED%&_U5`l05|*3mAI;gBd0)Abk)6%Xe(IE_ksAC> z-@dJ5n{7)~CD-)m4?+t!R``Xndq^F@F zoUxL8>Yv%0m}l_fC%`crJaov84@pz6&;6Ot;){X>J_5M&x+Q=P=mWVl^7n6b>OY`- z(^d*MEB%HgtDCNV)V@*LudHs&(Kx7nU|O?`J-h9vcPK2!67Wlyy&U(R^u~4MD^W4R znYs^qf*zhUqkk`sjie9WaGqN6a6~FZcIW0Yjw<8F^1q(>U48XbrzzBa)DGiE@$Lz{ zE71If2?O^QHwUJ;d5;%D^ruG(vs68|?d%qGq5dFTQ2);Fgbn1>+ln-=+w|_L*)Xa; zGp2K|nOzx2Hz+$^uZ|3b`nbj9)RcQ?{N*Emum$7YiodI`G(9=_ISybUW;~0Ef8^@b zYY%unH0J)M4eyT0u)g?+n!hH!FBQ#8lLUCm5Q_o*8}xqwEycj3%L)io**Ue!#%iT{%Zz==FUtz54mv>mm4YE9V;~*m zej5cBNc$hb*{5z2`eL97gu=Nr8XFdieO7YxI@hCax!fpq#=^vNJ7 z7P7()w8OzSJ_I)P&qQ^>=D**+0qK&CjESMtLle@!L`^3eLwA}hrCC@!pUT4&EKygI zrU_iTj@h6nrRU`I^t2h0bpdN6;xA#N{tHq&q#8(tvXr+7@>LNS>enYd!ExKmnll6% zhX{QAz|1RF5&Q2-bE5Wd_tbhV*)Llo|I8kT_+v*(9Xx8rTZvS9BjHvEPXtN~I)=i3|XKKsv~-I9YSDwT^slEZ{jhW@QaUV`ea zv7RAAZF7XzPhtU(o9_aG_{_5IarvmKxL{o5PaKHo+X4GYzkAL}3>m@bj8bEWo>B=n z4OX-1>@!A`Gvk8rqM+&Vj1Aet22l?2SqH z0^Y_lW^R5n{ANetphzjl7K3m4Z>5HNHVnim@43!RV~EjK!Zq|aD!{lOO+xlPbZGA( z3cq~g-N&O&!*pioufSkT%zWVBe~UJu+bl1z7}$1;QYcd3NkLaO<~jvDLRC2pFg%L( z$;P6ZL9uYw5h@6FfQomYHiSz)Tp0PdH-&|*CfB&ZmIXdu+tP;DO^h6>p6yo9Etxzy z>Dyvl_!H1Xjoq%lV6qS+^G_kB*2l%V%5(YYp; z_)#Xu4_`N6ykITm$WqXy3B%Gl9n;>(hZ}=~TL6$YXm}QEA#V*lWYy5v9z%la`v?f1 zq#&ZM(yHrxl9Jo1D1(6~r#R`^>0E!A;%m`Q`7!=c4KTkTVQGQk-G)=Fn&>zfcj#{O zSx<*)qTE1J$_u`RtU%G9K)&k2V+2Y!%3a6!^Fd6X%2?G?wj?eY|9!SS{b++z*@q9A zxE>8) zq|RrTEvq{;fhzlL#!rFe`z%?HXXrGe7LXKz8anWi-UI&T$X&7A;d5zk#>^_+UXg;z z?GqGhE7v>jb8p*%Qh>jc*x)+=<_j)GrJJa%yix5{bHa!+4l8h7cG!jNS45y+7;QX33qsii_`h59Y2bY ztWqGO-(H5~*(aHp1*SN!hDT2WqXk>R@sK3mMdfSKwzLDaMs8?VrT7yib%iap-oe{KaGZ}eW2xgvwo$77Az z8G%=!yDI9vFUp!>7B*aUh{gUi?6oW4EWWnO_{q2e!ZbHQb{}V2#}vi`czw*b1|Nz3UE$8R6p@X0M#$ zConKhBaKdj2EFRa5fq1i@*1yy4SsT3I3%2w)p<%S*qwMVR_3m!{1RARpDlp@aW5N2 zw@9~;J79xRNK8ky{tS>4w^o<}`wJ%EZMT3od;(Ez1FbW4O2^$BVKsb`Lz%MU$68k% z$(m#4-Nli->6v(b0u#^)H^EWZpMPD9jGFOr1#MRy_}8(2X!tCD{i5HSFCQoRh*opZ zy}h>A?{kX_ign@jdIXEs0>DPW# zk(-M1-fRm92w<9-o))1+Lax6dqEgNJy4y0)lev+eW`wXci8OARNpj}De^2WxfA}Mc z-(RY$tpef&<@7a1<|$kEZpMH-}*cm5;a97hQqxrP_=TD5%)uH2!|z zw+<7nthWKZ-FvzDo5~iimH0yZCRNCQ#M!T(j(VDd7{K*$7 zn4b-jLlRvQL%JIFX-$AO#{+=rtY^cZu%ZXs+@c)emGOf6+yrKn6PSf3y~yi)Z)gqL z1AwT$e}Qo@>a)#J{Mpbj>vQ8=B>F>a!sU$qOULuU?7jmL0T24vxoY2Fx zA^iM)Qbns#%6CR0@X4_`pHrb8@0b4OUYNr|Ml^j}fSdIA@YIr+@oQefNe~UW20JVT zk?X$bS@w0W>ki4H)_ay1{=7mO7u1@DprvQs|H!Vir)$xLy6~QTxCrEh`wK= z&n$>(nHux9qXSReN+J9lTBm)Kg*DtdP(|NU`TdL=wI{CXpL_4<2qx+euH6c~m0$LK zh09=n{llko%e?1Ox`cS<;*f5hA+X8WnB5z@1|4(kE!G^=mB0S z(KiM!^!5ZYf!paDZ1d6$R}y6~3n`n_Ic-u91eHbRLraYC@X^Evr;K=x7Kt#wBO9%q z)ltaK38*da9rOJ5xVud+gG6W8J6Pt5J2pdt9^6G3c(%K3E=}nr0jYZ7_d}lb`XPu< zGN+^W(DAP}BO4~{K3j|NP~_Zgfj-M!OCauEhFMNKBfu2Pe*Qhp<5I6{+YG)ojpv)u z`k=&(-h1b|?w#viYq{`Ddxfv7x^I*^uh)<62P)8SWUxLYUn?fMF)R;}$aiCfvd zYvdbU+SGYD^5=4n?9*D;K4d`GmVc~aTAAQc*^{bMXkC&A20qMtX9>4E<5X(N4O?RT z;#mk2?|em6-8Uzb!n_{?)1E|`v-6>}!JP)#Jl?^igpJ#REF-H6T$}jBf6N0!GiB3y zzfZSuofNiS-yEv&?3Yo-_!y9~hWY!CWJV9Cc<8VE3gd5+_r%A`33~k)L?GjgUu8Kg zBa$omI*?xi;!;v3ywj`jaGr5Gv$YuJGvEmYF`O6FYJJ4F-I1ZctkUb%bhdW=g>&~9gKba? zwEHyIH-9O=Tv_8-IT5q1H<_$1yU zGP}XjmD;H`gGg_Z8$6G{$LCs)p1R(NCz#Ie5sJs1Prc@0Evt88XsdH0Xlb6;K&^jy}aPZ3T-d{CtFI_ow-=o|c)+##9X4dTWW7dlM<(oH@Dg$npQh z-di|D`Mz!AONSsRA|L_=Esb=Sigb4fEZq%Di3&=Jgwi41-DSYiAl-`~EZq&u{;vH# z^L^fV|ApVY_k3nP(ZVi((}RFDVV_-)y4B~ z6}1ReK1pYg#U$*CxpzQIhd=QFRp?938V%EYNvR-;HN&&A5-0#oNO{L!Q9(uK@0`(R zo=Gf`nnKbOc8b=O9ad*yD9P8-p%dL0aT~8y&kv^%-i?v^TYuCPCrOuCB%Cl^B~&CC zn^si58qJ6`@|YG>DLyxi=u#^FR`dcc6u$0>#J`tv3G)ui~o?S4iUx31pH$+{#LHXQ$JcA zpg-@@NsuB`7<1w}z_76)nnXIKD6;$1MbGQNzXDx23vN-H_Oh7qk!AL6;|f|{i0?;W z)q4K?+03cko_41zN$OuXA%{B>YMweSB#DYvX!miAx4jgtuV~jhKJt@mlH8*-pR5!; zJHBXghorLrXThDXkV`(6$+gOO)|gy{P`-IYi}eMHx1zeIB->fr6ZUQHodP=SFXyec z9*FhUMf>Rk{B?0)fj>u9zp`PCZ$4P`=zWwS%ENGCo1P@f7pwiA-jYpxuVnY{WPy{% zD@xpbmP|!iwdw{+Jn0r-WuElruHc=Q=n}rH|;k#&%2#;dsflHq&Duko|+!Wjj^y) zTLCp>_A&UJ%ToGs#?=tE=d-lVc;l367So;LeHkuW8gW6~rDqXAxXs^xl0JewBN~1> z7Eh9e2ae>d;mh%l!qp;=i`_-(c7FH|Xdy`>f(Wbv?OeCD_AJ16)1xjBD(;XtBFqaB zQziV$D2o-_d0f7~9Xl>}lIP{`GL@*%vD;lCS3MrBEe4528M~|VLViERypXNFiTbG` zYMbU!`S{-Cq7)oPcI?}7`i5{Y{DUsrifoy+91p~QW->|}ip@T)q zuvc%=V@?8sRoeb~>L0^=)k2!KdMRwENb3m6G4i_W@gtqyxyUVHj^iiqre&XM_x(CZ zvFyFDFwj zN9Jp;e-vrN#2MqJRv;hyAzhfab}ov8yX`wxJMzKO@0qS_3y5tP7?f8xPpb4YvtJCU z6dZVp3Z^esm^SPPq%!2Z7J1IjZ!nx#s@LOQF3Rw*WQZu<%P=OvAP@O{|8Qw5kr%ZpE$w6`g@JjRHm*Oo@IP1TD?y2eoUwPj_8?a|&5N(bMgQUr!c3+i54x$a@hP9Qb*A-M+6D z^y>~J78Hp>2xM0#lJSvxLd)Izx^BU&1^H1F3)b0KjgEiO?<0qQm9%zNpo8xD&4ht7 zDQ4HV&a!{30KdRv;@*SdIl}Dz_x<*4qX_SXAAmh}O3!b%6ycFO>tm_ZMm3q8v(mP- z2+pB%Fb#UNrbvA+!}Et8v&a{sHy6;+w|u@|97^|R%+0E9A^|=fo-PQSP0|RkC zvavU6lTFd7%(8y%hNURxM4#e{D!J-+9%(Jjk8nSwGcfbLw<4WH@Jb1(1~^+S4s$2# z4+=~kY>JDq@1B`*8JSLwZ~29&P8SkFLf&^dQ)fPR{d*Dki*LxmR_KvsRcysLr@*mL zk?{CWv~3Q74`HtbVw&gG^|iW?D2}HADqy*5^Lk{>=F1Q8VoHKoodFnYSS-6@upRl6 z`2k|<7E<4sI=;p=U_(a445fZ*8yFskWH_zUq7&^1$eg;1$Z!#T|Mva+;j5!#o}sD? z0(~E_-5%-u>N#Sd8YC5<$Z(-5dF-jK^0|aRVkz!a=vau2HS%1Dq;+DcwOmNN<3w1k zyIy;pi8Pn#y`@u_m2(2lw|LCrpLpAI6x{H`uWNU8dHGwK%9Eih<7Ma(qt~xWmMfX< z6Jg3XW@40nXwo^U6I#~Wln}e3Or4o-*GRc8QXU4(VNm>y>V169h4hx^?^VjraWz|? zhFVBPB;Ij&t2M5C8f=L6fYQED=m^8YJG^i_^uL8>5f4|UBjO?WpC3mz^ZLW0BYmTH z#I|pfce#^IzB&JfNK^<8v!#2H=2O_gLX_@eee#A-rL8CA-UknO(fu2>qC%`mRbUr# zS-oS!_1oGkNT=3*eoN~j@f|wJ3P_r);@au=du&a%G%dG(8&>HQTeub?Pv`PC_@Vj$ z!~t{mY2K@O{QS9YxBWeamnklGUmscWo}ndit*+>gT2K-*1QrB=D?LYOXb$|Pku0I4 z<^&c|%Dn?vT+?mHw_nT(5D25K*>Attr$bk=xfiiJche7ltOWTjZ(Gpz?>pZKUav3z z=!HDaeTAm6lDRF>)A#X6QtvmdX;rjn>vpeTP>rokA>aN*o+O6COKTNu}7r zm;D*r1iVu#Q=DaT1CN|X;&%dGB@!^&m&OpRGh=2Z=bO)K)qC8GZ=R>e$fpHU`7eFA zEd2C_{_B&;?<=$O0zyrfKP`@XAOeJ;uxTLiX2H(QQsOiecGEf#1u?If&@MKoOQ> zyY;e4E&?&{C~WZ!kvz-~Ej}th9tm_$6Il2c0F(BcJUDxigW+;U^JP+5KQreIFdTcI z=yY(ULoFtc@|N-RF|AmgI1~zynJFx|SiSNTZE>nKPSqQ^{>cv^rL}X`1&*!^`0MWi zBYytb)Vhf1yzcf+wo0HAX)hNN?s)gX^&TWd1RSK0kogbU*knEd7i$7@4yBIf zK^^sTm9JH#5Ng~Y@38itJf!>mp9Oki?NKZEYrKW|=F{p;KkQrQ_OD;?Up@C@FBq%a zINlLenR3L2yh;U@0n(#Gt;ze|a*9HK(hcWGpFPFzW;%C&pgX~MZ^S*#-Zki5*s0B^ z&iyUgFT}Q3kKBMk3L$vzDNQdchcX)5IC&E7%3+%WpM0B>EdAFQUeC1QSg|4quplPD zSu>~4dy-`{|LL|L;hXdJ-$_lMY=S*NVZ;1JSdAPYP_r!>&@~0ta^G3yg&n z;N^ypRuTFUMe8syx^JsRT)2?47K~NCh0@s62G=qb91S<_lZZW%D(8oYVmyugkjM8Q z53k%b_fRABbr>yCuhrbMY~dE1A_Iq;4h`oEx|w@MqurzBTQZ>qqv)u%XHomiEVdh?wjhc~Cq=Y5#OdA}#O1Zl6|0!`Tb_ zPa|hS|5_W0DR+aPs<86s#=QTFg2@>d#HG9`t-nt5n8$KOTqs3G_6a6f5|zAyblxQg z`w%aPSpa_2&bu7QutQvU zC3SYIR&^gmv)Dzfx|j5C82e8I;_rIS0}BzQ-nft|OwcF@i& zU%u{^lKpLZkF7ua!FRwQdIy>;ZDyY>`KO-FYnr-M#qbH`5fCrIvIRaStAqnEY*y{O3(s44I+G z7~!lr*Zw$n^oMnw!gRm%deI+3PTa9_SVaSQLazjx$C4~WSaRsIgzv~uy%Uq@m-_Rd zkL2zB6dYseAD@r|-)AW@I7VOTwqOU>F#WtrQ6~tMq{*3rZj?0yhH>5QWItk4Td#qK zNxC&AZvlNdY-}q?NSOKpEBjyIZyB3O(-$!@cy^5Ci4=L@UxXjvc=T1Dy zV`X6Zdi5=65(n}}ZHkPWUl2#y^AT90`o#s}N*&)t$A7%LUu>uIfcTffUw38GUC$T_ zu9&y0I<(96XzBOpy}#biU(d?3aw6Rgi0gGeoTGxC_Qh-N90avmDKGO#Q2TnJR<=_NglHz zL_9`IiE7o=awJxpuG)HT*hsoulaea!KUne|(+n>VxOMy^Lh(7(J;!O(XT^btJp~Uk z%L{fW+Ic*V6gM3n4YgA9lkKRrD2$C(zf2>5JTXi3K$V2(*C2P6rsH@z!l??u@HG2I zKp@81k|ZqKW`_ShHBU8V5yEk;ZmF2-H0<10Tj!S;Z+|wp!XJ5^Uhq>LKd!bm;xf63 z^7^VpJdQUmc#iMzE6B8-Yjuj%r zKT}SXB@-0+yq;h-$!7)kCOQ+$u-v2eXIF+NFl(B*4#Av#$`2A)#9=W8avAGG9Or4_ z5SsgolbN~HOWpP8PrnAOz$Eiw*3T~a5EFi;JN;?QkhxAq1B-a^&+{Prq8lBx9S-9y zl*3(9iX2YWIeVhZ3}&TFLXWH4aCZyoTnC~9UWTF-LM4uNbR*(!cl$XJ(yhepO@YTE z#jf<0M~S&HnGGGbbgf^^6G+Ia44CoxY;U}qHB~jMZG`OU^ybvEAB=D36VJ^cyP7ZG zz1{bDIw2$0LQsW$w8TFmGxEo?-I`F(K(>Kke$8$?1JWzsGI`7m%{yK|^qH$b1X~)E zDLg;F?6xOq{L&7~n6X?le|}&ER}Ar2m{S1WM6Wn+9Qw*qK}W; z1L>47T|#%;x2qpFx`+(g6nQVDuOP~XG}{}V|67)HubbytUK7O)nY$nXE^|K^IY=Y? zi0e9&D8{X-hnLixEk^$Q>K1%7+~#}j?mbp_BYe#=8!x;l8YE;XKj?-cJk@~>tUO7~ zqnHLh)iVDvG(L6VuUf9Y^&%F=r&8HxX)i$X`iC4?x%8(zo0 z8}@@hj!@z=mXOM8uz^Eb8ri-_1U{Qrq>3IcJ47GQkb%Dn%94C-CT5)BEkiq^B9m#_ zwbPRH>tRTL*;)`iME4#rP_A)m51pM48d)NvRw);@#xf>a=2K$c?B)~vgwx{f@g~6D zmxVzL%4|+-5~Owv7W$+3cClPr3I^-0$-BT{#bO34mNv;+>s0@i&W>TTuW=a-PKn4l z0f#~%wuspGrQizEzYYv0Ogk$ZIsvBpp*AN35VNJ$+aZw>TW^5vC8WV@3_jKSGxnxI z>OXK!Z9=)8WEw%yV;;s2aT<267K)kPql0(Y?HSZ6Mw^3YnRe1V#30VOv?2P2cObGK zF>eshOcQpFsO$@ztr1NkSXrj-l)e0D>pPgJ-O_idk-jCqk>im;CES6t^s@>j6M+Sh zjl}%yb4}2Ned|i&WKDC;N~LfK^l*f}LYV}6k2~SYwaF{F>r!W0)iY*)p8dj1vhDTO zy0_(Hq%UOtCq7&lO%Ou<6tkc5#N718#r6@ye;*-4e1rb3 zahMV}S|ABWlP6{rl;A93P$;Ea1J(Ct3iQ~W$;pXwpFibqTkaQI z+7#SEqieVv#D+ysE>7>;xSyflJoIev285 z5x>O}jevm_%s8$T6ieEjA++0)t939pc+Xep!3ZX078<}Qgm2{;lWnfeIL~TT)BR-U zMa-+8xqKnEN1^=PR$_tFC^3jU1mhPN*&Vb>7*zBo&l37dopQCjBAtI*-=5%YqSAt& zq`>-4REm-bTKN#A9|>QW5drUc$e*#VW?DR-c`9!$Xq4;sFsdw$kcJ4Io{`z^Uxs7-FV~j zVMNHvD!-}}DuJI%`@{ZT+fv$IE4d7+%bnrnugAWzeYnBalyx2I8A8oYGvgDI8Q~Ub zk@*9ESE;v>j#{6d`&&%=wP$PzKtA5)1rV47Y)In>Rg4Z|r()CMpBr+;eXpPIpRsy;I2;bHA1xUv9W>9e+!m_PMw2e>Zloa#k`At4{;2#;e>xUX ze1jn-ExAPlhPSKuq!kv522Mju@iPe*HR>5@*?r`X(7pVcOo!0Iu3xx!o`lb?dSozg zL~5?qZlq+@@0_&yd>OA_d0Y^f=_NT@kM*c|CJLgajz)*@OKRh#Q!I!ljT4}PN{*_M zmNB(dU3&1O|6Z<%`oKl_@8v8DcGQ2b^8fb-$p0Gy$p8Pw;I0~mKLvB?D`L9iFELt7 zHh?~hV8;Up8gGF8T?N?YoER>8Ufxva=30IEf(_xI0_N|3F5Llu*r~>l4y6K}uuF4U z*`HRLnxpc@#`6Hc>6>&he|EkSE0vg*CN8Il1xca+zQzAs&n!U4=h|{t;1y--}1_!3kUvymX?f( znfbCC4nJaMVHq2Q&zF{#mIJtzREPCoirZ`A|ND1vRb<6NeyT;r>)J+0n7p5aaWcW7S^CS zLv3<=JOHtEGNh^bfB#H1UDPWJ=wrwL3O7kWydR&EB1%q(%Lj;#@9qM$AEKhT_(5(0 z1d@%3pZ;@6Pd^tF%x3`L9Un?^et+xhfX1(*@ zK_tHqIunRMFA)Ri9Z2qbn3|EHI$0e77%SPp0NOCXwyUI+)YMpn@gamF|2ySBa~c{j zdS+v2#Y}itmkJA*GG*|u!0UPMAUe>ogK)doL=f`Z|7X%FF$nwkt)tUUm8bi*VdP-g>Z3Z1R3neFE4oy-89>`de}A%xtS*P18i-hY2Iu)c1q z{Ne>ZMI0pLBPN>p?^XU2l>GmDxl;b`aDncLL`>+3xy}G>b%ctta@x@qstQmu8G!Zb z@gnL%xFpse3?V!@GZ}Cl_X2uz6xeiQV3>G`h=@D@U-+uDCgRs6 zO4M`~6#A}6!T}*!JFjPfu)Bd#zz`c+@0PdHzVRJNiAqO)s zFz``T9b)vVJ9m3+SwGtn!(!7KF+trviX3~ES5d)jih9e26HUPDbLl7MJuAs_?srvp zNtsSD!>hZxEiQ%j7;5?kP_l&G88srJ)Im$sA1F|d-_*3uqL8f)icwrZ(K%W1I0@rYb-dl2gKPhwCe zFx-7X08yw0wX!-+xn-(wHy>jaRa$6gL03tp1i)jOjWMzdT-I|3U-V1)0kpW85L6%; ztUzj7TCts@3-{uZ5;Jkovx5Y9%88vYcWP?tk5{_@3;TY9BIxO}XIqzG+f-e$svM_C zE_DOBrkkGHbUnR833g#`zzcfl60kyRMuLk?V~+rafK4^aygDamd6gwI;IM{?i7CFM zt$i`zXfUTDVD*_$DBwH$-=Tf$f)G!rEk;*0pa zgH02KLq*Ez=jptDnwC-B|5Q>1Q44@av_s3lU?v@~iX3_#(7>Ru-H?gW`4Kw46A*4v?9b9hej1v1uuC?Lc3 z>cO1Z4Dz_f`r+&P3RnRzJZd2si0_~rJch2n0+^zQiV13~<7P|MWB0Ii<2!+~&WlqK zqof~FmhktfnJp7Xx87{^U6(PQ=;W)8zE)B)yILZUIybT&XjfIkfizNpBr+t@noIib zphBScix=G?TqNLVKHBaoxM;Ov+M}OTIN0BJ4FdMQqm5N?k5_<~_m7Z(K%%PaHbDaE zo6QnOSJz7Q)%-}Mz=t$6Z2m`sLcx>cE-*K@13lnVAaxttx;DyBfqPKFl_J1a&;o$e zevS@pQ?*x&iC_J=^pv1Yc@I62uE17LcXmowT{52-Z4xA) z%r7ghK}RPH5XGvNSp`F5I?jPUnuOJ+BFeVhZVpRjX+t9ArM0Q)qR5y{lf{>r>y9dR zoFlZu6HXH^>zJJoyOtxY>Qt72=Nb%aLAH{vMS1_`XB)nWeiDLfCG&k6csg{<+3U?W zOA}17(-b0E%(=Caj%{@rSm$TcI^>#kH0GO-*V&K3&eu@z&29 znEY4~S+>@slFw!Q70dGG%xY}dk#C1>?wEhYXH&{?X_BaKcn0ZMIY87(khat-W~a2) zWR*@eeWR3FvNJabdJA7B;qw&9&lW9PvZasYk5d9$nYYF}s4{;4U}oxX}k37`MmD z2@+3oyg}1yl0!yI1>m!cd?wN>DJq&WKRJ1dg@>o9r4@d1^L)c<(aa6V=A3{dJ_y0t zZ(;vaIX>Ro_|HL^q%oFT;BeDX@T_%pVY*lcRY%B_sU}Od^xK;Z8a?K9GYcCPGw~cz zcjmYWso1$swgshHJET;%dU4e+W(RKD82j6NF+%XeH@xYnh?f~zSYnec&lUkn-v{7` z4;U~E*Rwe}Ic)wnA4EU{Z5Ti^OL~Krr(iL0apSD2iG&T?{qxNPujWt-;>mTGw}lbb zt<;I{?c+q|0}QdmSsNn2DHISE*5`fxTssipp>GKY2n@RbDD_<$XoIAU!0KFqd6Wdc za-i~tHPIM>YGbYP8h@czse`g{k5|{=%*#__xMV@S<6J$RS{g62%+#%+y}Y>reWdlr zPamQfn%z1#;1&zoYD0dFv&8_pv1vHM7F-AA^!aAnKNf>H#V1CldG^Kpy$n(h?B=%K zovs7l*Y3w0`?=9=jy3fCZu0b|zavVB;jha~eX2_N#O zyaV1SXmF5c4q2sGKzf+J~5ZxaQ) zTT0NF>s;4Awjn~x(LX%gp{}nlyqnZq?UUkAtwOPF-;y#u{!(SKB$E%3>K!CFshYxN zMO3;3jA z(B9fO#l1RBX^^+A>!Fw!pucXf2TJy6KhU#TJ9g9|wWD$Y+V%q1L3dC`X_bkLDwIad zvIILJ{=qZANP0`#j5q+a{wCU?d7;GYzGeQ^{o`y|-zyR|tS?J0mQpsAhm*Z|3xWp5 zwR(XWOe`t@9m6}pKA>x_qREb^`Ge~zp$-9mQIPUUR<&o$r{p~Rv+u{(&>QAYOYN(- zkspt+ytQ;|1dsHmm{l_cwm7g-%BFN^Cwy~;z0%2nZgP7!zJ40h)uPCmaVPARs}T>g zF#mu-n2wNwa*?sl&CpT& zim?PtRiJJ)diAF(&O^_lw9Pyx-+9njK7Ug!OGDv)?;ht`)3ixijed$#cI77b&OKD^AIG-A7YkL~}NL)fvhNPsW zDTDsS`Hl`u>{b4Iv}E=vVCaIiRa*dUU>DZLrP?i#on&1T6I5BE>7pl7%u$vjub7{p z%{!Yu$BEyqvkjZa&S%e>B7^vT^u{O}_A-e)eG^a@7~xdnKZM_{Ejg5aO_B0Zw~4K> zIz-Ze+4qx_&8I)U6IGJHao8TkZIINP8=?2|w^i%_8cspgfGGBd^rQV=&>~>!F~{p6 zhVfMGEArDUF!Avcrme;xv52Ps>fXOvB_noo9zH(JLPhH_GgDXQrg-I!>9R+4&ZX)Q zEd~{dVFC)}w)_j!&BLAK!l{j|Eu#{DJzDijc<TH!t1tIZmBcHv_EU* zTZ4wUYN#J7yA27&JCUz@2O}O5*bQwBHJ9!T3IAY))kF+FiK$zu*|7}$YEE+dH5Xi@ zXo%?f&~(T5v!y7y2MrYKPzdA}CJd@{yk9-8L(Mh4O}FbI#65LyQ*oTNti~tw<4{*= zH8#bz{67$Sm!IC7seJRRAFz=+8vniJW@0<%pOz`@Roz$EV>DjGufemW{GidBue!1E z+#j%g>A8AG&bBcB0pxwBQ86*y1$lWNBwA_<3Rtu#t^}#ASoWT?eFM3LM!T{6G3Vlf zB|-cC-+*j+_<`n#dNT9}DuE9#ZJ0tXP&qF*m&E=F;Emzv9*n;d;)DuHP1=*uS4@?x zIBHvl4GxTqM%FVlFE|u)>q#rf2(a+vE4LXOrCnC|;#nR`)ZMDX!s|btwWksh5i#le z=zq{fg)R|ELeJrliK`>m9$E7k-9~^GNd};y{M%&?dM{CMHW+@bGdH(6_bEm;&}cqI|M`LAcxtBcnN0&R%gz$qW}$A5mXB0WB5NSI%J`B=o0OR>k{NAj)g@GJv`1k{oYweAlaHU=U`z@NlGQ3?>*{fhafs zn^P~gHUB8iwkC|SP;+jA{=?ASvZ5bSu#)!RqA6<`WV3fs|3$2|xV^!;q&ozH0Wr)c zE|pfj>U%Qg4jYn}lihD;wu)=plYei*&NgYV$YH)mKXtaFuves2AgKWev5XuhOAX?f z5NR!bmd;)p%J?&|zRmPJ*7U4j+p^3>de17R#MuvpIj;VWlxIOt8kJ{#R4}nGjNfQ-n zSen>xO4hM|?xjUzpX;5XpIySXvyXRgrcMXJOmgN2Nw$E~a|I-i#suR#4Fvyq6hK{_ zBt$Dp0$Gr7M~?t2lNN8ME3kG?0XbTb4Ol=bN;vp7jD-v9A|B#S5*}*<1z+Oh(fvSy z!#CrB|JPT%flWFb!|g%ro{WFO3*VDS}5rIIdI4DX)hlkf>; zw1D){aZ*CU^_NSmBlXIYdT3TASou+2Ng?TbF57z~BqX^v6K1Fhy+BE`7?Tt|C$k@X zV~b`1|KeWWWaZ>obZ+!78jQ|0&FrS%puMr*hE!YI3^av38?FkSE9;v)e*ASne;)y& zW)qk0H5!|lUrkF@om@KG^T+kM9TimuNQgftENJQM$_ph_qJv9~_rI3l$*Sxkmxjkt z7wuwylbj#3?YkXZ7Tf!Ti)Q7(MvlF<+pXA_#Hv0Mm&?jniEHWkduqLi0u!bhRb;Jufw= zS(_TTkd1RLE&>c)J|HvoOElx<%a=z3XWR^c!NTWkXYMS;=pE7C*x8^c@{N{^(i8Yh z9@WBnzVyz#$uYyxbr3or^PiQ7ibJMEOF~}X%rWKD{7eITBTuMNJyung;~vdb0FWJj zB_ku#$ajR$x&fqv+ajb8{d<@rxuuCU!mlGTk1*MhFvE7Dnf4$hB!A7>z{brR!E2*+ ze9`9ZxR%Z-w{U=(b*KpJGu}7F&~PMD7LFODl2UrUq2I%O2h4QBgo@91_={1~w|{e2 z_kjaGw~cn0i)Qv1uQxI@qz4Hsbk~t2g=6-}++6BB0@2ZRs+CeZrYXM`Xa!7qhB4@U zv}>qeNQHk}LcOj$wCotXT{B$dJnjt^M7-RAP&)KHA1FV)1pT(LUz3s~y#S+xnVpkU zV5e%|=6RLD@Y?k3VK=SIwX254AG2_`P{Ah{YMeJ(sYjPDtTGH2?w=T#4nOttL!C?opMo}0k-tHi-oY`cUr)#B zrocjw?^#^9u?fZb{exkForMLir=j7dO(9Y*Rp}$?5c~y%xL;h`GeJVv3*>9h*0~&P z)M_u-Ev|L-+ZKRhbwW&+BSSMZyj} zYa-iqUAN<2()+P#2M7NOBYi4$2>uf~18f6($?a$3H>fLgr?@>)OdIl{vXTKo8qZ>`BRN@-nKr zS4$d3X6B(Ckb+mj!djPJAXhTiKotfGdMrgdJsf%@39LnhRE~d>7Ew(;*6f>YuLpFDrgUo)wX{I zOqBKJ6G@y#_-T23ZnVV(Sso4xrT?@-!oL{IURaLYUDz}1)>~D9xNoeyy}ZAJ+~k;$ zbaJuJeh-0Yc+q3z0hV@e8K*X7#}dEau+V$U(-NQqT&SPlEGfCV z07RWE8lfNW1B%J^(9lqilt*J<997lLl&Xe6N_`s$mG_XsuXx}p&Pe+K0YiOWF4e_3&H@fN$3p~mkMzil#xoTK@q*^;1HY;_?Dbgc`kjf)^1D+ ze&GXT%qE)6|>`Kwp22yypNfJtw3(9Ne5C?FsY zCGCc|DyZjQK0e&yoDbHL$p9rB%!ysl+xz*!n4AnBzn~v*$9$TrxB%4@AK=9h8Zg@y z!;;&P$j^(PDlEm>y9ODjlo0TaQq$7|{m?h4 zOa$0mUk9g5@hH*)t?$+`eh;c>Z@)nTMKZ%zL{AJ85)x{C+ZJEoVLYwyITHF6$1wchhugUa6iT}Lpx#G+S;}Esi-=NX~nlk zJBe|VS74y}SX$cDBr@RywYb?MS->?v+kK8oN8pp+A|`%dC*XRdFUtl>E~##zpf;+@ z%ggIH@DQ3d_;;n&3?!fXJ~NX)uhIwEio+2(GL#oMQb?6*D^kQBenA z*8i-?_T<60dhvv~xIflk$tM0)&3c19p%3({aDeHcmAg2b1Jqi8BU5n0!zPx7PLEeK z11tv9zTx3Lu+ryS#}m_g7~hdJSax$jg~&G7ZnGHK2c?Z7UyOp3dP-`aoIxcJ`&%$z z7n#|u%dMc~0Sbe(0%SRZaT8}%;|vf;C-D;ymWT9KaX9hkLXL6gEBvvp2;52Ht)j4#)1Y6+c{2o5Z_}DDLj}jll=`(qK&P=pQtlpxuPho!Y-wE@%iyItS?6w?4P{E9 z$3Pwhn(!n?24vr%V;N>+^0}9sb(Uhu;?JMg7S+`7^WF>g@%0r3^|ym?0RuWv#-Mw6 z{^ur$l9KW(NVgKd~BGo;tMu0~OyKx#9(%DtZn9u*|{tAbPP~Pg|0FpR#(5BG} z3LOkO2P6t85Y{w+UHzqw#PSjOx8cw~NWhKd0BCY<Y$E`Y8 zoh9_urZ6=PO_8mG!?W967|CuGUU;8%VEHFls!TrWt-HH>`6?1grYY9B%+}}>v%*HF z1Wwa0d_B)&nmBR(;CGHUu&Eaw7&8p&ONdHHr1J?2ujh4j4mSP;{35N$hbd1W5RNfC z8)ZfndA6s&t?OpQUN*6|TP6>R&T#S%-HqH!n8H|NZ$O?P1*l#%06 zj;5xII6YIp)o@^t8kMN-l-1TgSJ%)uD3+Z1R~7p6(s<@GrWRffVk(3?dJq^xeUB)| zw3L+BI?Ulo-s4BA_4zJi`6|I%C;lunFV|`=t?Qnf?)%Cj=rmS-&zE(_BtAqZ3gm}; zBgJPk&p#`&oQqP^axTt{ii&CiM=iaL%O70mySb3;YN(2z@@T}qVCZ(rfrG!Xpr^jo6h1S`W)wVOL1oEjaj)2m_FR+}1Ixr1* zF@On|ZvP5J1J)F}9!U7%FnxOU6&zt-Gc$t+4Gei@D0=)&ua1vTPj{Q#R$g4Y-?YWW z#r+0Uh3|$K*Q5CT=#U&R!8V|ug{j4H1mbgi2^}`P)XT(_dit7ANwYl||HTL}Gt{QX^gF8qCDzu~^&18_` zIYxJNX#holw{R8#`kHWHRy0`^<*UI_b^}fe7cr&CA)5~NlKz=+$8@`2c>Nb=ptjx$ z_!k+}d6a|U7ceZ&y>CEDGjK3PK&X(?`~V1y#Si#u7b;uBNVcZklhjCa3kuX4%alPH z9kpq6+!TuTW-|agACrfUO+Jh$SOu>Malya=A}3`MBN1hHe{f7-0h?;)8B2k zY=+odUvF$EFW-Ht-;_ZM)+2>_bN z#G#v4MBbUXz`Oek&e|2j`_YD2_g%mab^>->8D4%mUETleGN3&QRGI$(*}W;ep5>Jl z8(<5!5_qjM`B(YNX^p`53WDiP`~$KVkdTJ|;2JbT`s6$48{T3>sw!69cdV6=b zoG3{32UJD3AV2>!)p7%BkJ~5)nEK7;rluNnXa>E5rRc`igjJQnYxMxtJU63cU<>f- zo#sxVCwAUN3W=Ypx1XD40%d13&<1!shEeI*$0S-Hdn>3@#%J8zXAD4PLJcH1VLOMO zK=(?L(;;t-rf$i>i{+b z55y5y34e1G1310%JNSVa_zX^BFVyA9&NzOhFIW?7Q^0^{16oaXyrAPWk@o98#v}i> zHUJAj&g*l5R7MS;@&BqK#a|XkInlAf46)RnSp;c!jP5ClXiSLd4+iqEYG%d&OMmnPlz~)02)*;n zn}(0G%C-ZLQm132AQk||L&?FHICHxa;2bSD8L zA#O9=u81O~a{&98Dl#JCK_QX3TP-|~#^|*fP^eZ*8IA-~edX!6@g~9EOxZgVfQam;FyJiUTPy>Ak1z?4 zRCVfL;I&B;fD+dD_icX}nkS9Wg+ZH`nciA4RO{4Mdf@rr@JvoFt{@X7_=d=iLjEHI z;OwXaY(kP{OvK`IB-R?fvf?#2QGDU&`~f>ZU>Az z5)`yzPtMLay1aL0T-Ly$rODZWB&>2C40GeRxv*Fa3MeQ|N|86F;< zkHCeC>Dk8%RPumB#G7`Z zUEC!kzwvRMB>OvCMJoA&1LBB$c1t;f5&t&87m8E^__!3X$BLeY57xV$rbSiJ;AE$e zPiRJf+S&|=@D21p6w(2R%|Uq*{Q?>}W1c=psNp&=K0(SqBn|^2+j@m%4Il$JB#r^f zXwbC*-?_uFuLwi}?}%eIUO@0@2I2Dj`DEWLdF(7Kp7bM+{7zc()k^6Z7`XXRfZk8= z@#8n*PoI7tq-O#CCwCdBXRC~5s%&V0G-knXtf}Z*HQoU{mL8!SLX(*oGY?!`L?Q3b zV>&w_R4dVT|YGd<|v1o;AOUERyu^y23i z85tQV;NS>Qsi&!G{;nOr09a6&xI3;7D{QQ-Z}OXb>GFP)D}wSVOnJ`nQ*^XMR_{ZV zyAD5D01C4bICxdSvDu@%chA^td&?VO%|KFix5{kGSN(pnX-jeOW*z{~c)vyyY~NKO zRuwf<6NCNg`sO}w(dY5i1bdQeBbQGgR)2@KA)&+Rk^_1=I0FZ13QZ72{{bMqhHoyz z>S8W6P?xP&W+f_W%F6%JrGjrP^DBm@&gzu&Ygnce22+fCwl>caI13R67Xb!+jN4mV zb5K($#KUlc;~HYF5~u0RsX=NG6)9oufKw!JBRib_a%};>R<8u?sEu%jpmQUT{4WEw z;Y>i!Th0qj&Eeo%_?;sw+uuZsB^;zU zO((1x*wBxUe1@Kl=z{%T3v9hf&;sac~K8>o#0i z;<2e2b{3MHx4S;|Z{Yr#dTZiJ_*tTHhb<&Qmcl*rYg@4FGHvw*j!0L$$CBg$S^e0svL$Fc8Zr zD(wvpBNaesZgh2Rd-v5_p;R3M9i6aS^4|+D!u}D*W?~Iw10hR1bzZjyMvo~Lfbpk=h;2z+c%p7?tJYBey z$A`05I~?1-w~a;ZuxY3i*S&G3sj1ohe8zs$LfYWlkXx=Lzo3YSpS~H;5z=NY^Z>NF z2uYyl=L6EMh5(y$Odz@c_7Z@85%#vW!s7s`A%oYaz1#PIf5qz&FR$Bx$o>5E>KKeG zH+7KJJc(2ddH#opu>h1=cfVgQEUj9Czd}qmx~-r&*w~tkLGpA#e0?iK=d}>Ka6bpL zuuwPNbFS1I#-ZN6%z9Mog5LNkzjxE3SnG`wj;&~crnDLA^W0fFE`;N+VFCz$AWC_W zqktDK4Wwo-h5)&uls$LYAl~8iU0Z;itivQGfOiDj1jV?r1nMV>US223fUGwkB#;o6 zXKkaom3*JTp*tBB9ZhHEC@61fx$;g1X2@QZeQIfw{EE?c@w+bd92$8{Nc^_rjr*^eQW z{0BHb(VF`Dul_&w-tr;KwA%wkl#oWc!JxZ4Rg?x%x}+OHIt2t3q@){>lul_7rMnxE zl5UVb>zR4qefIfw{(${um{D|i?)$n{{9-MKO&lP}=FO;mfxt>IHdFBVoSC_JgUTAB z!O!)Ba>nOXh9HA1MG z-n{J74_s^=6uiH2KeJ6Uw9i&C_&wuCxN%|UwX4Xn!viA}cfCJ~ZLVS(&zOJwVsudpf&me4yDF}YP zRj}`{WGY|pti59X_He2z?1u1lIzQg>#`JCgxZLDGgeC!0f{w8q@+IAaG11W@398YoHBU&M#!{bN@3-N{g{*zB^K;maIt|*MzdXYywoRaOY64h#(sZ3&k&H|!HZ`_R;q|(9 z`@=FPUFL3%!I4M#YaErn25{z4hF@bP%u~n#RHTk~0CNdpyN~Cwx%goQ?&WX5RUJZU z$x3P&NzLrJODFeT@~n1(O*0eI0b!d93aH5pot0?imE|;=CR`H2yh6-)~!grGKEi15Gf4y06SG5C?>OJoYKae zVb}G?$GQW2VwvdW8v7~{x5I)-VzghH{^vH~m(oe=?Cl&Z)1DrS1Wl{uv1QU^{Or{V z-1w<)VH7cG>q^~6mfuI%liWp^tx=i|$ua!aPPQ5~h0S_OqjRdbKnfL|lr*ghU0eI}jwASu|kwz0Vw=;(No z8iqS72~6hj^BwYWqJgS6Hutn_TQBVVXYHRH2vbaj^wcBE^V&1%N#3MgS zl8dY1H!B)7VxF`pG1*BTQf~aFm%qGw-KxH!bz|NI>s24hg?8RcFE7!cO)sS8S%k~> zTT(~{>1v;Y-r@b(iW^Rwa*YCYhp}@>+lH@WkK%PYsNUJFj;vj9zfdA$KfC*^dqC{( zuYh@LdwbtqScE50kRH!dTG(Lv`1OL<_DoG0RALsq60SaPc0#(eX7i2YZT9VPw^jAx9E7n3JT6P5tn@6H79cdCOz5>hhU>m>YH3lM9C9Yz`G}2lg*i+0C z{nzu{PVsZzOeODEZuJp^FIic$h{&peAScJG6w#DRW)&rl#Eqv!Jk2a=3Lu@*6_0oC zISrHI&s0w=vk~1=)k`pDkYCP`{NVm&dcUGOb}swE7+b+PAf9^M)fW)&en=I9R=Xibtuvq^xU1JolH+h$`v=|vPI`yi%_mr zt54ZGo63g_Og4+u5Eh z&-oPfj+Nh9Qp*owKOzNx-s$v`+E&?guD6M z68U#8VH*U$+Ij{FC23!8?b-dW#>VS^TT(6TS4 z4~nplPE<&eBmWF4s7T^&d%5Wpd55xY^!#1mCcl7?!!Jo|1B3arlfy$B*D{OjqP z=Bi*6tFIe$zx{Jt*3Pc347znLTe6@m-sd$F>^}KvDZ%62)X?Cq3|+vZG7gQ@*e`rE zD<>H|-Y@MH6??0X++j!KOW*^N5c7e#hSBDXZyI;~a6V@IFk0$$yg7OO4PMspCKcL4 ziInk;OgpQAA%xTBpu1cRX3yl3_cOxOj+e89q{CC{!^fU1DGmER-C3+l>@KXuu+gs` zMDxcSFhw7%xF;-w`&!y|Pd}NglwK(nms85;);x76No?Nz4af?wXT#ivi{spOi0PE| zF;r?aFmAujw!+24y1h~7d_S?meOO=!M zuKS5d%boKc6d&<)u?|Niw};bQtHZi!j4afLNAY6j<=!C0`EXZwZl|Jv9jNo5+XP6> zpDhg{)3b<(+&*-KF8%t2bRO|GEmnC3w7KH|?4Q{Ze_WUBcC?IANVtJWRyELmM2n2v zV=_U<1cnI&frr^VYdlT&zs71GLivCIG-2tuLhbAhoTe`Zh}X!=Wpn=MTzjQv4|21< z-07Gd33_-)h%rZM2kA3ofBUf8MQO|EKXztn4s4*HhaR^ZRAma~t7O8d0G*Wea%m3F z&-bf!;w#Ay`uvfh@wh@TCwUYogp|W-2~s!u|3bZw3p63&Gi}L{@Y(V{zOjp%u-Nj| zdMYG5TSP-l+-nxWSai=ljRV>^9Y4@ zRWGl4J81?r^Gr>Rlv1iyuF3BN+~E&iW_*sL;}mY>cLG*&b63@)-JM5E#;XRS3Yvg+na$G~6?ie5f@=3%LB)_ls*@iiwln%AHS zlC_I#8G=oBQt}^!g(%6ASllvkUAc_P^O!mq%`E@%=XY|3{6kVt31Gnj*C0Tg|=8A``S7M2;rfjt}e!B zzWI^~dEGR?meYk`z1!Xs5-g8zum|q_{ToaWH}jWElRN}y((@Hz9?2u!fD8gfp8qDZtI%xnlw1qtUeA#nR*jB85;LP_?%?$}-!E*+4oxA7zgb%Ko@w z>zM*HLp=bT${=!_b1Z(qM&tn{uWjPr(K3fFk5^@eYS2`(gJ^q;HOq6{7-!8G{{?P~ zK*~gedF-OSg?l5M>m7uBXG0ULd}LjBpQS4p7{JQZb`JgeZ>dx7aA52@SuWs**~rN) zWJ~K50MM~O36v{O+f{tq{>&qYivkX6yyOieR&7v)r~^s)Ew-VI1<^M~8+SmtaY~^31yH)@)v1 zRH~E9O^2LRb3oc}r#GCF8oqpaTfs9CF(f-qJuEwo0#T~JI3ISj2Xq$&2(X&!vj!H8 zBAd7{!}T5`)$Q{|9~ASW1rCS z>ZP)emmmk;34vPhZyQ)lVuh&D2y^+{4Qh|?!V)E>JfQmDzJGsP4I}d*WZ0Coo5kx+ zY?ZmoR?p*B4sJbbcc;|Y5iVK@e~?3C($uibWN`KYFV%V~>D^|0p-Z<~2%L3<3$Mfi zFqC0_f+wzFXv!VMukpIJZ5KArGfjt(yMC!SJYZt7jF{39I)PE@r3ik~O5|}By(k3y z;FyF=tT(VjPF6Wtu=JSUImvM2#nGm2bUT;onVm@ln zrJp1quua=n{+I^WN1nTS?nmKnp1z%$)guoP5K9%Sl{J573@HHDRIU(e`|B{HIFU-J zZ-aw_We`kKdNLV}&YJ9oi>q>}kDLcSvX`%j(k{AqMj*dybW-$>f)CZ&$p{x1%(V0| zH@@@-aCey9TL{z8i(b1FdQ;|hPJJ|o2r9V^F_};MAr)O(0_Bae#gX}-{Ix*MCrh45 zxSN+h-V-#zzOiJFgB?_JRAxi``gVc`=U2&>$eoNj_lF;&jW$NteEt(=!JxCRv(AD|rU6S$+e(iCmFnq8c)o;s8hP@p{TDC*&TTCoN~hlZoQHiAFv)mz@DFQ4 z2vP@xvDitKm*&gBmv%sq%jS3bwK`8$4o=_c7z&0`CHF@SVz6cL_c=c?#Gz zm-phkvxlQbyHS;AjnnPUTUq3~sG+m(h^uB%i|K!h_KV&_qRr=YfJDm%caIt1)KMk1 zHR&e=)GPP{s{rOcVA*SgU4oy`P*JNGHFIwB8LN>|t$4QqO@X_zy6URt$pUGrs~TW$ zj@6~53af;lzd|gBs~&^-4HKc@_cegE12X*y9?6yS)d{ygAFp1pzxAL{sG3cI_oqK> zkCk^l@TF)fi8}k^8N^nXq;{`!_4J;K(eOl%>GvDSTUAenYy+=~&!2 zb|k}P^&p48s4o*3Jz;s0?Swte&#qtp_Xl(Z$ECQYCP^UbRn3mK(=S`Ba!PI&bQYFj z!dGuzx2VSWtHzADxlc*q<^qPz0OH1?H77+k!B6e)UC8R8Qc8?*Gk|X09omqj=$J2< z{A|U!k_q%CJx-T!!7fMiO(sf=WTsmJ(0nzv9+3&RxGH}Yv&{P`Fz2>Nx3v|Wn7Cd( zudyp7Kap3s=Ct}U85z55=p3ntSlg@=bW0WVzf+cpaz>6TME^j8Lk$>5?m)k@i;G!U zXlOLbyi}o&Y&gQ5!zUr(8$G0}QnxJG=BfVtxij>rsbhlMuwMEo+23R({?L;08wg37 zEUm1%GQQl^fX%Lnd39dqmOllZ=HfRGBWr7{dP4V#^w<+9yh^m&Hh)QyEeavgP9fM) zR&8)|*?=IeuFRKr!ALxeSw}vB7|vi8g2o&K_i>5xP<3UcE&O~Fh2H*~SL*y0IhP!u zY?&-)mRzHM_BCM3kAX1sssf<|E=7VG)t> zgoAQD?S1Vx+-zTSZ6u$CuXS}T)5lexH~q>oO%V^zT90+NY1xncdN4prMKj`K&g6t7 zS%H|!@Qnpn)CmxIIb(`yN)V* z`3dwwH;jBzF<%8f1d#iok&)5t#6-Ntq_I`-lr<}GDJE`iZd(Xb&?ms{(N>i6Q*54J zhSK{Xaz`PYM5HWq){kd@0p=Djwo&3yGKoJ3H9~p8d;2RFEG<3_fL&c^OnI(Q)V$}q zd=?eUteL^NVMet z`Zs!d6cjb7`uqCqK8A!ORk=E`ILQolJ+GnBrx z<{xc+7XHzSTlnifMPTqLJDn(QZko!rL*~5fc?c$mK5*}P>yqJ5J!AM=WI62P4Pp(0 zXR-IQzVRy6l-<&~g()jh4|?YVcpa7G3^ptNeL_8@#GI>SC@Y#56L7?Naz9ox3A+6L z@!tFTQ2F{WO({*hLB^o?$GISAVzQy?!kub(?CcW{^=dv>eQoWT=gLJv_>}a!^BmH) z$cXS^r{iptbG|HOq<8cR%r}s>rvP+qud|&T zcwq`d18n~DT{5|IgmB}p-_?8*3+R)!ii*Q4&{Pzw>O_7mC}1rCqlpBN*R|=(YZWFr zv8p37=h2K#3ZE?d?yz$m_o>5)0TD_|N{aW7QF+Jl<2wN6G`NDsU5HB1(?#&i|bSxePE3fmvA0{)r#f?%DlJ zD}XQOg&5?ap*Vk+pT@fyF%R^WPZ)JUc4L=qa`ObQ6c1kolA){4aCGtZWm2$<5qa*bf-eYb(RE5HhaWBU3){I_#tws&Fl zTB+~#mBb8;9>BI@E(2DqvUg-SO{9Cc;S*K1-`9p|UE7}9Dm}hMJ0dL@730poUN~re%yw0=615`6ZUG*UvvXs zb6qQh+wrLRF9no0x0t*zcv>LlC(l|2!5~6O%8DFvXw^B$ttmSBSv| ztsr(;TX3TRQCI@P;2jQ<8ot{1Kv)gtBf!O(YD7gGvXC`PY3ru=s>IqLQVkL;F1Q!HB`Vm|9txNI;r6VssDg|=Q8uiYNvr! zo_as(M1ivS$2}aA$Y|-V>@3OKgyeEe$yJBZz8N`eivxGMGT7cOA!WP?jQFt^8VAQV z!c?oftf1ku~1Qi(V(JEgK`z$P=Y=a+U}MGH6BufLYkJJ9O@`#XCN3?#BOaAVTb| zzVf~6^kDV+1D}Aq%7lw2j~+D{yut=p5+=sD;YEV=@>iwdsa?r&-R$Ti^{@z~rCZteZ1|)R7R1d*9~8YA z5T>O~pZz`G`hl|jXM20vG_ze!b<}_a6l2;Q zd-F*Cvg^GaL-%KIvs;+%M_J6g4#B#vv#Q@CpbpyrlYBA1Fo^8eBp%oSeFW zPy+C6wi|vM85sB_qBRbc@BVeKy-)cbJiALDAD=6<5emu;epWqQ@|Rrbbk-ULny;p? zQqdEXY-pa+lXM?s2ie>#z?Vj+a~(OL|LO;i?BV;+P|B%#_k$3)LJ0`0?#aW45BXSY zB7)_n4V(Z|x?l$Us#R{5f*^69yGM|Ref-$45J1S<0u|RK=+f`PfTUI3 zMz7NwZXa8^(dqhV3tsHpHCTGkas(~vK0+~933U^HRbR?az@tL4J~lC2{u#zAkcv0M zouS7&vN81XHi{HCoWGqQ2ghRuZk2?n_u1iUfwHuFh^}x)LXP(!i4p1Y2{rRdd)V8i zp@F;rB|7@`XugMjn^YbMgC@bGtmuc*cYHKmG>q*7=7#s3ppj85D|Qp2r#EZ6ZHdU# zqH{3UXmdp3M7RyBht})71PcNJ!d&NzdWy zrup~$+;xHH7UTZOIjE5^VYZMjH6^7k1Y#O0s@ZpxJbm?d!H(MEctIIx2~ye_ZB^CM z@BRJ79E^;)e4Lzk`o=Qk`kf@iOCB^eK>eQ6z^IYBt`}rUyUmf;-HRy?=5uC;DKm)Y zFSlK$f zd$k8~I_EhZZgC9l2-iA^zd(;Y6iv?D#SP8m6f}w5y_tByBzXl?v$?AvkRP3#oIHYu zwY5L15k^r_@^#xsO)H4LCyC@102 z_fl&_otpA%KyAxBjNt%{(s^j;G+8BX#N`O5V-buXyHIKC8bw5!2j{t@jN7GX0ghOY zA6f8(vMtfWjID{dr5zuLQ05Tkak_T400}x(^L-?kGri?vgxwb3TI=8c7qSqOQrmJA zXha{Cy(k84Lwt_yz&&e6k+Yj;=+gJ^Vew-nn#{)`>PcVCGLxqS=5^JZO+l=_1Xvuq zWVZB8xMeQ%VUNirX|}7;Ni>ajC(n4uG#bK0i`RH=IjXi=FzTjG60a^VSL$58+$vez zOM2u(+B+pS#fZ;6?l$d%h9gU6K#Qb(smd`Ch&zG+s&p%w`iwR=BYUt z=oUNhksp!WN=DziY5h`@Q})p#_j-1OhJFu(LMrIy>3`MiIqlJ(?b4b)o!z78gA&jQ zW z9&}F6nwEuX#-?qUBhL5Z+;dH#8BD7MbTB;l?c3gtQ&ek?b!1fL{CC0TLwMg;70u_! z&_zM*b=eKlSy=~~T}?>|)huV4v!@Uai$KeK{X|aAqurC)h|QJ!gXH@gQ69kgTp-I1-QJ1lf4J@8{xhx^^J-8Wd79fb~Em<_n zy6TcNc!w~?!$5Une8K);rPouctq(Vk(vt;mMaMH;X)s(hI9H&zx{J@#|0u*KFGDk+ zr&;bJ%P-Z=vy^5Jq({-)-C}J7`|A){Q=CCoQ%oc7<)*UY$C-0St(6mJBl+d^N!6U$ zvDZGoEtY9LuYHqjLh)jUa_a2^gnWMzn}R>Ov=W^za0ZLH1HLFQgFbyWT z@Byx@?=#3D;Cz}`C<#5%OqFp9UtD>^fAw+cMmdx%QLc$SqY46I5z~Hu$x7^QK zD#FEY)$BSv827e?U6AvsBCd95I!3PrQLN}qs&wVfetC57^EThy9m*uY;&i)tXWWPnkdd{fi0F!<;3L^ecP^aV9Y zASBk-x|hU3xO#ue*G~o07YXr`iX{+T( z(GWCvJn9i_^tfr+>~+`%!aju%SbK5>J7(8y&j{omiTDXW^lsIZ)XykL>6|1;U=Wj> zkKNIqGOuAslx(nST+P!jdnU+U}!3BV7jZ||F0r{#%W zN)bEWL^dzKqu!s6k0}$J#UR>S3!anKWiKwr)FS9Vy}xP{`#hfOX7nNxQOmhug|fcd zagWnNE>_3g9<;|N9FVGcfQy^)nzMgA&qyrx`0BQ=U_{j{nqHIR#dbn5 zm$N^&)aZYUQM$prtUbTCW@Ru$2vu73S+wHGWyjPt4K#-vBf}He#S}-nJHXUDWrNnr zckuJ0EFLbBgvh9<-##!|VEFZMa&C^Ah?saR)R_o_r?6b#jiXajy06KO zOv6aiI?MK^I+xYLT99FZ|Iw{$bE9y!ALNblvkcu_Vo*I?R{}qiW@=^@3vBan{PLM` zmwe1iabkY*o!WM(*|ItMs-jT0Z`zEnW>-J=+2_$sh}wPH~_K4({NrIg*n@QyS(8QZ_9{EoD=bPx%kfwPT^ zkMC#(y4Pzuaq&i4I0$9QO(}fhJ{8zO>a-t&wG0%iyya0YA?|EwLWAoY6BlRy_Sek5 zrR5)n1L{38TOWTi`U=vD5@S+pr3Dl+3Hex7CSjLNO&QR-UojT{DNo>m%##+tsL>Bz*TNI810lGBAv8xM=KB-=L)6r+ zW#(rs$wE#z&owkSVufrzZnnSR<>fV@{ZUzA^esqsbMQi=)of%*^BL=PPJ8R^cB3Xg zuIa%+{EvGqPD>$RiEl#3#_L>+6ocU_j(FIc`emQSmYv{$p za*DdAeu1R(0g7RZbpKHJ5*-yEKfzGk4T1G~wJV0Dcx-gk6jDinowaq+%^T*x_OhPZ z-Uy2c&ZYHq;0vb@Gz<+1sSEwFSAqj~u%2;MxW=%>zbwIqNSv&h09h^vl!g<~zAHQ0 zF2zNy1D#VbB0<<9xX;>Nn-?$f5CZ65+)A^E|ina{h*eg`qRr zvJx`gihGjmBT})Jg0+(T?%lh)32FS@GcibSO0}Py-@kv~1P(aQj}1X79B%X~lkN9` zyA3e$leFocFFxVYy3s-=UCJ5nOg_VpZFQCoP9F!h83IuoGY1M3D=MrEJr#zI^Sg!( zyJ_3!Zy4sI9>^clCV$@Kc(EW*U{o8t3%Z^jVNidLgLiB`yrDyZ#+Y07sC&b|;FJV} z*0oKgrCb^H^S%#ynZZ;tm%ZLNnhq|+~(HF%#%UJ+c{vc5D3YDgSNg-lI= zhxeC z=`qLAG`nB>STh@xDO3e{d8fGU1K7h6g48U7zkdC)a@*<|aWEHn2@_RH^FRFlHokMG~t zc(80gg?*e__ZpdO5A2S1177vg?qjwf-P(8v0~~WVB@zX@=I-CU`|^oC_C9_wAZ@}; z5VaUH8cgkpHNdKqwmD3kXa1~d%ru=xzy`(zTP7Uf7}}#g=z}Ap*|dlxguU9EbP|%D zp6?MN#-&RXzd7wW&d|j{?`-u|9#2ca{Pll6@JOgZ0+81IY*ZPRwSdhw^tQl=Q;2@ zUP7U%FW5Fc?dj&=Fd*wg0r}1X;`3Hae=Cg13D_q$V}qLOf39vD@;}!$J0&)jc<0TV z8#@rse*u0(1h(Zj;^N}opsl0ugRqm2i)T+qPn zgKBPSDt7&r!)xJS^EMpa?OW-To(peD#C>402#1j(4m$duAGJYE3wmQ!co)=}w0vp~S9f7@gxus^;5(0|$+5)B%FQDe=S7}9)h+ASDV zX>aXLXJ?0p2_~WRLjQRu`XzZ;o&+aniM$VP%uxX#dYWTQ0$%;Clp? zZE@&Kz?PL*>kIFo7>WT`WoI({7Z}nqUa{Pjzx6X_4!}7WEREYG5vYrWfw3N8j5fgn zhhT<@kc5N-JZxRBYjnjl`%Btd;(v}AYpq`F3A7Z0tYZ7ej~@mw{El`KbQ&Y%1VHC&2axr}K}Vj$nq3n8 zGxHmqz1soEJz#_;Ik`o5m(WM$)@MdWiS49@0K}`1w6^~03X@H;;lf43sdUk564@2O zdQs9RWwhd0BV5XFOoh;Ue+nUH6ON9GQtO`j?@8KLc_Ir}VCaqH*5AEFYsBogUN9ZH z0}N1jOVJ?*TdQF*iukcRh4`8Z1}ELwdca@$0Mu_-Ye7ql7a?KN2y$+i-w{iyEg@O zO#9~loF+u*uNM2aaOogRqLJ%58RGA+Q71z=yi@4V=PyRPU1Gj^^e_4j_fq^NIA z-}To>xS%%cVn3~GzdL(1o{*#<))|!kE@~0gursV52Epv9#J3o;2nv3~rvr;~;?T+F zEdzzWFB0ppU4h;RRU@T&R#{gAxO%*@C*G~yTAfS+A*5k6N@k!mrOqkBdP4$n%- z7L=d(w`|cTZ}oFCM$%feUjIVj;0k2@QAa7^cO9&Pvl_LC-#5@-U$w;GW{2HXQ=1+S zhU1VH_YBrnz7HQh%(0By&Vd%?>nAEZd})p7uP`hUdG1wyJ;lQsRh*g3+eFKPG{=O1 zm3sk)djZ2LVsJqb+o&NHb#r0%)*?zmQXPWtiR8e1Obo=N5HJ)M>(IJcYdVeRl$Q^G z{qkiA-#r`~3+ti95)x^Zp|?!KZ_jFrB@E84{Q81>98#b6T8Pui?YP!y72-Vsdji>b&gj0-FB4Nynm~rams`RKUw$>+Zf~6DzN9#qm(A`Qnuw;}q}f zPsIbp(t_a{2|;X>D$D9L(aL`f7`uO21`R0Z-`{Ad{3Yf$5DqZ^C^*DK$;iotEmKVd zB|MQK@@cbP6fxN(w~?$Yf1z%?NqiP}!48>U91uMUwx;am{)Z`(<^}U*eW=<#Dtf_U z?lJ&at-|X$gYjmZq5moDm#W_W6AlUJ!BV*lP;S!B%uijfeT8u+Wgecb z0`|&Lpew0r^IHw^@B*>;;G;(L(hqo z$YeYtJGZ*2j+rlmKxw`r-gg2$^ z#eXlW9q-7kit3ykrN6br7yoc!DFA{!6#uIQ~#Y z6?=4p0&AAvr01VL!CzeH2pBYF7{SKv;(5%~!HD=(0U ze)Awa7yHg7At4dIT;ma5vsVN0nN?i;Y6yP()TuJlZfhpMFq1zWpVt=h$NCO5UKZ)OKp2)`Xt*!{#ub1HGu zByIQV?94-AjQKz1l1m`6D15HP&!A!Z=l*q^qJ(py_w#bxF6h+53vKyK`GK3UmzEO~ z2ghy-h8tg>6uCBRbeJ%%?F{TdPuK;thZLO{d zHGTcYuT@np-@n%-G5!1_1mME(%@yP4E1`_7n+KH(B%L~N?_5R!Gdvb$^zb|pk!Hcs z>f^%9LN_M8z((cNG*?|^kNYaSLAFQYjVMMdtEL&{d2!x{7|jlHTN1GA|F~C8 zN@$1|C>4P!MHa0ph}txX*<=snGd7a=ZM#zQJ);idI!~{O=?IOEw(A9Y-}2jZackB< zRV0Tm90l*F%J%cP%gVPJ{`rrKBI9~+XzrR632@Lab?&!`O6(8ZYnq%|+GWjVnB-ep zUS@-MF@a!-=$)4yQ~l1`u&AEi!f`Iz$qzlOtW*wLiJpbN;mDY|D^k!yry#=~1tMlKFgHvBtH7Nl zWI)WWtBG)0+2>03_XoPg%KQxDF$Jg?X31+!Dq-xPgWRL7yL*HE`IuWP<&lQ(dc}TrRbVQgQ{!;aUoM zH*{-2ju6q-u};c}7HAi);fV>-SFpBd3r8xGVJ0d_?X{3tc6u@fE-uGB91X<9M9Vpw z0|~sU|fq9QbcM-EI&o-_C=sl|-)Q8~YvU4yq3Y zBFEcbh1%;!zt&8DXR{JC{BgPUX+EA}ND3xA)I;{IL0r`ix({cqXSt_8y%rt>)ykv} z!dr~fDAYdMg29~0kZU=QXlXd@d2G=*_&)F1T3N|$|M_G1ME*Yk#uf$T4Sa+)n4=`G z=ISbN>!tT!oJY~xp}6rU@eTKAG;M5bwqMT~Jbd_LV14wfL94e^1lmIG?R8qgpIrI8 z2Z8T?*u$}+fT@Kwh#x!U!XeX$s1(&GRhF7H@T^j$Ze0=UXSn=|m&Dk_wKDwVE~HJ( zb>xp9tPo|>5k?vmOpo;gJTLH~P}>=X4y=`oyeb*x7<-OsX(=Z+iS`;urbd_nMIT+M z@Skj)vTI6&IL?>=J~Tqgv&8dRs9W)PWo>syg6M;L%NeC~XKrrpZ>XTsQn$~OC47B6 z-Q51hKsz+~O#t&Kut_VGmnhnU&>WbOZ~=aPaUkM{g~2S?wS~EyULOpx`e%k>md`Km z;Q34Z&uVjeuU@?xg&9Ls`_-^1WZ){Vk3m2WW*bXIh0Tc2RaREs2FY5BTAO%WHws;; zJqWH1L9QbMk1iy-M)~Z}mL#zd64?W9u`h5skZrRsr=|%J4f!?!5J0rzNzG2y^`xP*78z=gYi*i-!?`l|h!n}#_K+NtO zHhvI}yv$8IoHVrjN;-1mn9PDh%QZ{Of6A0bpW%Fmda@mRCg0hm-dm+DAv~Jx$??}t zO@jiPGu@R*4f)9_lj4a$ug|;avJ+l?FX2jL-~6Yk41GRJ;ig61NYW)^p3nS4v`d5_EZ2b+y{QG6+J6THlenTU z!sRd)Z5PR1MKQOySUFDPg{|#YE##OOJU`kEL`+OJ~4Lw{T)ITCiQsOws_uSoFb=)|atbM?cHV8A}c;Hk&z*Bod^}5U2u;2t& zs$ztzp0!?m&`;1oW}kwPjTp6WSQ)5;@mHA#FgB%b>1r`4G4allcV)%$?Edrz&<{8~ zS3A)`7jpCLXh@58Tmpxuex&f)yAL1Msfzuw8X9IXFJ;%66^at*oT(TV&22#xATuP+ z^{vW0^K?ZFt4kM;)A#Da+i@#X&HT}RenjK&{gdHWb2g(U$7D3{d>%wC` zsy~JJvyt(zk~?1@zZheWy^BgTy+NENheF+%*d`ph|no8y4nhikrH5`DvWlj zenO=ibv4Evvm9GW?$2evNVP2O8+|2!YdbVQPvhrKbIAdyj9%{ycr|*uV#I`uac>0%r#2QrQ*U z@Vj@qPT&aN<1Q|2EzK6>x3~4Xj&ll@yPl+V`YE)=Ff6_TGgR+#(R^kbG_MdvZ+Xwx zsCl{~ zy|gdyF@5@iCcbqy$`j{PtzG2NadjCz)!SDHwLViq|ArxKt(e#8;I%6d1+(U+s; zJeduKzf_kGw+qqa)+s((GC4&=3#fIaJUA-3PR+rIT2HS{?OwUeLGu0I?5NUo7od8Hp!HZ)vVl`Gu6~2^jovco;3kO?33JPU8b9a-K(f;b=6r5#GyGR zO?b4X^3f-RmIu6(5?c{h-U3q-sXVXQABX*U10{90nntl)LJ@$e0&;a}Kb?Z2E5nt4 zAtJ|}eTLJlb-pYAD;*$1?N{VXW;~#gCDiyF_wSABy-;#*v;b$He;$A zMm*aTtGvqhDTDWa{QODez5glAtG_aKSg;*|nZi_pD+aYNTSk_8?xW=JQaF8oQEF0}BfaZ=~U zJ^RiJ4Gr^*LN1(N*zY~LvWTY;gOK;$Go-rh56aSbUwSzG07F<>w9m1s<)Q=8{d+xg zob^9@ZelhWiO2BKDXg#K_8Q}FC8ee|?!au7^EOc6ZqV0-s)Swc21{II^^BJ*Fl8>h z7TbtA{ORJxm4qK$ubaIzSpP|dy*S$AEV7r19~X%QZHmGl)WR!Up6huzR}N(j9QGt8 zg~!6aSE5tGsLr={IPwVklTD0>NB<(}o3ag6otxt9U9c}U+ynPa+Q_Q5SG#sdX>kT| z!^rRe4e~CG_k8ZC`}Z})=Z;#UBQV}xqP20?t2r2~OnwkI*5_r++@!$qS-MAaI=n|J zQBS3U0}F3ilv9PB*PS#aUWxUbRJA3lP+h97yzc^q|E%wQr`LniOch|CA-Oork+`fZ z4Cr&87k#%^*YhYtt!NS4p*|j?`Oin6X^jIormEK0#Lmp@f#fZliFG(#Yvc63HwPD1 zEy_~6{dz<2$=SO=8BBNO2rnT@O>jzXI1ohIn>Sy1Yt?OR`KTzzw{xat;x;2muJk%j zkaS+GVw(=a#G^*`MG57xh2u5OmF7!{>x%bu2@Z*pz8bzO17MuQBz$+x znkerb2CZl415n2*%O{MrrekjquRJXH$9R#GuljuNTFt<@jGiX$vgHIO zignTF4+NDdZ8I6do>=9s)QwM!!FnXdl10v{nJQRXnlCU{nV0|aPHlmt-Ut{jVK(cv z`Hn>G*ISKG#x`=zQ{Byq3+obn9S3T}Tk({xcD^Gt%ZFyh8)oTYS!uosT?eRrc>#&@hf@k~xf{5}6e zo$pBI5KXSJcZ}Wp7~^lJ210qKWwe0r0$?YN!D5pL$GBaaLH~C&O;3?g~{p_alHVWDI*@O0X z{;1#YSLEC_hO;NVJ4;B7$JmlzT~_8Oc1vh~Ad&6pGF0@7LE?G|2mL$0f%aQ;|L_qb zGP!qgNAb_Z+6wGbkl%yX(s&Wn#jw?k0|M-+G>3vdc)tY34ws`)u9gzIsA^Qx-d{9gc}gNx9^5 zJE*9xX3)x&NLDWF_TIdhvTIQxPS@?L^((Ui<@3Cd=dsNkgu$jtkeOg+;?Fc(oo$3e zhwDpvvI1a>LPrRRqnOqc5zBxlISv@U&x-4*lNfgEqL<}m!>KQ6O76^qiP1M<;PS-{ z%tP>vT&cRdpI)j}@22jBynC1HjM1P_!eY8DmBxvJd`2^c(OFbd#2tGx%b-bPec|aL z89EV{Z2W43_K$N5ce>qUjT?Xcjzus<$k3O!4*CHk1t0o(*35M!+>4-2=6h${fmV1G z3qG9U%S09!Hwt9e#dv5>R&!1W4Y%Gcs!03|-Ji54_E817{YSH9QU_|;8I+kRMB-9LRT-2y#os?$;jemJ*cSjd3;WTuxSjg)K4w+JDY z=PTjZyDt*@_FL{@n!eecjIJF+8;~6^Q2Z6zc;EZwPy-jpnoCoqg+q6ZBKhqnlJmTA zFm5tda0MUEEBL`;Uo|@CYgEx@+e?}GaY|30Y|d6~rVTyar%yY{wTgYjVw~Bmf6qd| z(HWeZGN^S97xZ&SbHW=#b9*gK#$?KvQefQ#ezfTfzZQ=G>yFf-$(pqPho!R&t3vCx zut;|!xhd)HZUg}(M5If)yQNE|L%O@9L%O89yQI6j?&5scKmPPQXYak%nsbctjtaj1 zX^oOFjNXN&%zKT&wWXU-VRWe0l136>rEUd>c%wHL=u!)(!yWETV!01sH@koLDTr3t z`JYXJGEw{)frZ&~O+Ui{=8JH{M=)`+a}ndfHS2|b4@I<4fPUem{2}8ZL4iqx@^11) zh$zcfNEfaE;gn+#N97977i8T5LW?SdAN(Vv*@E^fvkpOgVRV)xc7rQ_*2uR1d$a{Dd}A1nStBqgpPhE#+76{DX)Nl! zQ?UIc3Vr#C?Ld_zm+(M~AqUP3h_g@uP{l($(3`fF!yyjfm^rd6_)ip}-q5Fh@#e}0 zvUJ{!?mBPXj>Gdsz~%^UI4$?zrw)&L*D+9MLw6+~QFn|cWMH6I&@)01S&Y$Z z?^chyB?KYHDpBh|8sb1@+SUg3Q7!-_m<3j?%|H!#5Lw5~3&jl{fBhPIW9U@1ti-Ec z#2Z-!0p#ZSzCVwOF`#xbTTNX9# zPdT7uFnuUAS+@DYGacmq8!A+#i3}s|ymSs6lQS;}`^RhV=WE?RW1fIn`V~)b8qlts z{|S%jDz3PaUyyA<2Si;Qo`5NNjm;FjgqLsA+D0yCQ;q>N4i|mm&N&H$)x7|I|Y1tOmpi z*NtA{2CZOm_-F~9de5iMYaBGy_3^?1S6{^PTiuWnu;jK+5$Y8J$cQU=MSvqQ3wVTI zI@wEnBhh-2^HBpd5};2=Hb1Qyu$DBYc8K9x-z{j31L2I~@-`>d^CNJ<@_Z@N@${9;w^kfBY~5Aea`$ZCR&{yT4ilrVdywo$CtI z87lUR788lVqw~XjH2l*Tx?FIlV^=LkR{HDRyQ$C4?^9h~7_P6^&R0FNHg|Y7{pj*p zS31Zfx9&Z1k93oY8iJvIhF;^8FtL+5Csa;tAv9$xtX2`fRLnQ%>I`8w9|7vXKhRrz z{cczHyh6A`fGF)#En3n)RouE3G;~s3gnw+_3wJvSx(}@J2Bm*>zDzGi4Dfrm4(hKg zfpdJf4`IwDTUbxZg!{RF#2+n}W~&~89A&B(VGEL_sFgjy->dZZ38u%)O{m}ed`t4a z;Ov=MJ6OWKAjpZ{S`wKa*->AnVZDC36bGJ-|vPuKM@9$_s&Bz%S9{+S@i zX)1e1;$Bavy^+91O+=|P*o$MQjqOHvvGF1`09;2;OlNQdUK~VH>Pd3UAFiERYPpkL zc4|DjWl}V)`Qs*g`yGhEYZbgbNhRU%s9XUD(Afz37ZHzTcl3 z)JH3!PA|Om7uct6{A1S|K$$)6J9_L=e9k$*j(`7rA6jxLxAqvgqVMB(CE>=JrU+Lu z!OdN;go+X@p_?5cPr)^n#FK%d~@+-knj(}2ai*~sYscCb*H z?s|3>=tpS2;dR{zgzO=zYS}>`DN{aeP4Z$mITO7#e2FK3ZN@k`Oobpi21;_UPfh0L zCq?qE3`C2;%K0^Iwi5klxC1c~H{tn(1rajz$_fw;8F|qm4C!%V<;nBa;gbXZY?5?9 zbBVk6T?%lv4j*JoN4(^*UEdrLrF|fr9@UjVzbt55Tp-x$3E0C!>efd+#xypaO*;Yq zue`}9D6-VKYP*=sm+t6L@{-3UpqOZ4^9MXUmb1ri1Db3UF9n4jc#y`a{Z+|o9 zgjmJ!NrB{w-80BKw|;-ncuCXk$&B0lB)=R!=UU683{XxF%0B;;8Qv<@npC%5)2LwKB^G(okqr_`thU`%v^R!b?wt|@_U#ocOEWTys9e@=WN&E;S{-H<9=<$_KdOKi% z)ga?B-VD{~Fo4Z#>e;;lxK|(f4)>u?d_JMe)uqbac~^&4biD|M$|QToNo;J<#pCr} zyw@!9flt2;tNYnry_*52sXTBU=Rqv|hm?%}Y~Z*0D}Eoi(a};@C!l+t;l#bx0buv} zxj8;$S)^p>q2%)+@@r#jQDi$X?H_Ppt4#MT)+k=_db@zZL*?XZ>K4BL{#EdqevZyZ zHbW1>QeT4JLcfvq}V%4RzG3bd5Fyg>u_e2PV)rhuH`*C|1q^Fh#fcv$yD z$POU}8IE&cfP!}Q-p7VFNG1XYI22vj(B6R|^&!Z0TvGin+#ko~uI)$_EF86L; zoJ^eVo5)f;ST8$o>F3GPjHHzSGZ=HM^(Pzf5sZNB5H}O1;ERvN5Zx)gsfBi(5^BU# zF;r#+ajZErqP8pYNC`S+ANh&e=p=Tk`}Z$Ih&^EkQQC5^r-0ma35^j7wd}pO3E-T; z9#4+;ylh|I{BQe$xM84#tT$k^?)IwAmh_Hw!|i*I1Xi?c)wDG#M$$_yPkLnVbUxWd z4|H+Y9Zv*4a)p7PRdp(&67jMR^`BE`gwW>Ck^kZx+)FBRe-oYBY62oiV_~70Z_2ru zn`<-YoNT2z&X?SIBVf3GxO^?XLqq%OagajY%RxX8@$O@r zsW>8n&W8enej2ULfRDi11iFs&xjqF;@L7*0TYgwN>I)7d-{~JT!NesYnJCKp=c39OruF<>j2iC&w?%hV5Qw&}kW92p zVgcLLwkz%#YLv@exODt)#5JK5&ba}U5=FQH+a_m1Jj=MFKZ_wEkD;Rf!A)F-M6_t@Hb=wW7>(qWJUscUtXoz4l|*s5XBCkadDLD!qFJQ++1l zOO3;gj>o0p!!9VbRrMQeen#X~)z<4QIxS|R$6Nyz<$JZ3FtM>?j!(=l?P$NTxm*^` zpot?l0YDZU{CfU-){G8|N_plI*V0rb>Qqjfr#kqy}rrQ-Ee@}g;Ps}CVE?`c3 zQ#w6Hynxx{UXuM2Q^BdrhY78@C2I(va^hr-W-TzxiP$34O>Yj;hLUws$v57eBjFo{ zk$^z8k4(v{30+~*rh}B0J#Nw<)mZuxveyMI70Y2yCKmAB@hRub7RU>#yIvF6PviC7 z31VS`L|c9Ph(xHH7*}>cZRaiHyI zIONy{JGJ9Z9kf=;i`;iBis(yFO9m^sNSX?UuV`a)b(&Js>TU4OhZKwO-nC^BW-PuW z+yf5Ut8$jp;@oPj=czN17qtU#(}0QFEXW}EH1W|`u(m=8oUZI za^{cD`>$<+7K71m&>Jy266#(-oI$*Ps~Hs3>hb|3M@J!TI^vImwFPlrJ|?Tv1@O~d z@c^F)3)m5|^a%a)U4r@N>cfL!$J12M-vaYCP|+L|&Ta zqLSUZMQ?oXY9HjCN2q6&VB?8&1c4!I7wn?aTS1fy8Y4(-$K=|y-niuObH?~FLgDsl z37ZYgz>mOh_(>6iO+&9g7y3U~Fq@U-kE9CJ;oo)xFK6pHczUh)yy{fi#-GuStAqc^ zgRPPHNvad3#!RO=D(6x|r_SBvvast<#HB>Qych|YBpyx@*f@u!@3B>azZE3-@*o~o zMK{&uT2Hj`)7bsdf zh%s%0Z(dH~HJXJ`a$SBPFS6qCYu$hY$tSGE?9Jd#z7GY~w_+bKjWW}1QSRcxNOA3* z_{3=vKVkBHqEHk$p|u9FM8226c()9hVNM*}9Z z=cUxS>$~}Z(?=2uMKxvRb$amSwuHpo3>7}8jIfEI{+?4(PxLvCIkcQ3Ju z$t~>EKo`vEvibMXK*1N9;jy`umD5L6zEqv@nNmu5@~X~-op3XWjem(E-cMzQ*5+dA zHEciXb%ZqFEj|BgF;)1wO&~Ok9(J#^qPn~(wBGR5&$|ytP#iQ z;#vf_-=XuLeGChz{`hpc_wz?kY|2W`1|)|4BL&8Bu}JsME7iYt)$4L$Kh1vomu0ZdH9lk zYMDC|O9uUI17k$Z5whmsz4m=s#9=Dtqv(Ryt~U6k_ex&t{{IL-zWd>%0Npu{_FQEx zm`?W_C*t`li^J}?JY^_xB#ItiLC&X&t)KP+*rOJWVYK!qw&op}HD3;WE8Aey&lDm0 z{pi?^{7m9Q`;tPRGepgLoB&2c)zHMmo0*4)$F69gd6tHw*Op5O2 zbfBCw+VP2F+?uNMGc87QOlH-tmD5Qp(g61&CNN`ly`0;+fWOFO!--c?9__q^RCS)@ z^2;qR5u*gSq9g*H9>eX?%xDP*#MmzyN_DV4ZwW@_pya-F;~oj)`!jXJ;keYk}KWbaA>t<;RZY zss0NFTK-+0TR>s-RCjnC-NNUL&Em8i=)4m4%!J2Q%J{igC9Pn!fd|T!_F_OR9WkZN z)g?#-g!mlP=Fn#cng%R~E9?99QS{QX{jYfLt;;N6vyO2HeNwdwQ|qFChdV=P0!2%s&~tijVIG9TlcSutbO zZn$6+Kg+VN8JVATNdD9@?F)vM`ZJ_dzZM)ui?2b4+qEjEl}hhOaKt5Aap4*Sa!N++L7PI$$zTPp7S zV_2m)V{Dz9wLp4}p3gr7REX(4HV0gV;?AshTO@q?Cc!F4WyCx;?q(o-e)XjkK}dQx zWK1w}O#Y@6sY363ShAkUGK&&EBce9mjle^_{-c|@PQXqb8WqLx42licL1s8m_c*s; zgv~%SC=mgr;ys8LeCX{&3g~^hI}yq-y}AQEL zbe>|PxBH;%?&$;+g+Gx4zRY-RF4|^SBpqvt-&<@lF};Gd=LfFI$ar-M3A0Q$&2NL* z-H`dI{x|)E5%Gx_W=4L298WC30IUZf11qzD7Ctw&%md?>Brqrrr+!2)B27zA+E|LT zBh|r@#8s=Yb4PZNxQHB^^f=r^Hw{S&`OE0kcvyw__<_!Er2JLTDAemXa6(Y+5#X63 zv710J_)5o`{6|e}b+nMLskW~s6yqVA-YTp0h7B!tXEVm-kPyG~G z?Do5Ol*E1|>wU7pEYVnGi!5HOL;GCLt@d38*B(}##Qc`>Ln2!4C1|;->rFY?a}{qE z`)+v~SE5ymmKZraRwl?70b)XfGKQ}Wus8T;SWMnCAEF=ssmTHkt|jpi9U{W1!qK*r zH*em=3xIjJ4%MRp*o9RG`uicEr7w}nK);t9;Zk}1r|7wSY=vjp#dUh0S~@pnl113( zgL|&m^O{9(i4@)|Y;;6dIF=R_nTNR}T<^{v*lh*G#^*PUOUVI#DB8!jgS$2FJ&gMv zR@F(#4(d+A6VNTwGt>U00uV4C7`(LC>(S0gNI?G|2RkW^IG=Gph9=AA`THZbCe0n0 zMdWFY5{25<3cK**hOMN!LW0*Q8eSifMNBg_PF)gv4AzX8EG8SN8S)`bZ^~3EO>az1 z(j=4j;TemdTNVf-xQK5*a|J6G1T~V_2bf+Q9IpQMzeOj<9h0who)c_wJ^e>|JX^6Y z4G3OGW3@vsX`jxUxXY5)`W~4jVn&)P(-?<;oEzPBB53<_gek4Oq{?J))Hl#0NGXz_Yz@Df>W=aX8*IQTX!C_E)KX`cJEG!evSF%Q44guaD}$JL9d|~z z!Q%DVzS{E_u;)Z1a9}L8wzrfbF1>_a3+|AAR z-c>Qj^9TF16CDO(2mqI)CI}@}k$sLf_+Se~o=7KiPm*alKSemV66<(kUl}QfCxvlM z=c&*Aq`SwgspFCJydjs$nUsabvg@G_%#H*I(1F5c5LY~F_#X>)+6WFc&F)j@?dxXL zR*|vk>CaEV>+vRh+TD}0ZTx1kP+6hx@ts*X3PKz|*=No&mc?Y{_P6VA2|Ff0mR*SE z(i6moia_IcJmREX=%h?aXxOju719{?{9+!z9%aPWB(dt9xM+!4>ZQ9%NPxB5ybrje z9)<@bX$2H>bg>-dMPb;uDOr)iMSl*yL`dqQGVJBAeS$V*=4El{PylJsVkMo8-H9v0 zST+nt@Z|h8-sAit3iye`7@!`87>ue8V(AD8EGoL2Gjm2zsLihx0+ov-%4?Brn!Vrc zn-TF};J@w>9X0Owd}!dg_1o}r?Ib)#p4Gsp|&GgVEQ1GC*Qlf4$;sM@cl;yBxI zw(Y;`Hlf~A?6wYbcU5zJ=RIIxdP(k?v1*K@ML=o<4CD;&TKG`A_zfQi_VAYJ71eq* zF8_k!23?=+xzF)ag%2EEwdaj-w{ad3e9gw)cdhKwkY5$9JUD5_uCH=yhRWm(5DM>u z@c{ZtcDiP`Zx3ubwB6Bhp7Zp4*L>+sDM%oeUhL`By$RlIfd4Rf$m~!OQ9^aC-}1Kw zPKso!K5MyE2oDQS7JD%QaWmKE>BCkvHhXK_I;6a;LYVH6P4VvF0OScoTwja{Mph>Q zA24SjN+p>^!ED~9vx|E5`4RnmtwL$_2XK#53-hC9uMFW{<&APj=$6FCnP7T| zJSYJFY2d{VA<#(0=R;gLJ2NW`wJ#4|q1`VFrC6b1v<*NvaveTIwx29!gkO~Oeb|!ZXLuv4ifHeC$igUajoMm*|>|#Sm3W)FZJ9kq3L99k=u~NvegyM zB=j^o01D8E+=}GQyxce*tFc4jT8|-*@@?Fak3HiZ(lF}KG1zq9$WcNC+0ere{yj98%B|KJD^2%Est{T%Y3 zkXo%R`rs;z** z^XnRFZEU&OLj=~hhAxOx3!^0Uo>4F>@S}t<8G^#rNc!^t7=%N>+NP#lvbBBJ0_YFJ zhK7b4z5aJdV56uCnI|2GIS@)h&g{et@6A5(jl@Aed1?Nz2Sk!9Lxjju)rc)OBR|aZ zRXbN$*A4_=J*JW&Z~)MX)3Q&?;&cj+s3kiLn`Q{^z=Gv5M}Jb7M3zP@-YL0OhCx?W$7p`~**e2()_M>E=MLLDE&rEg9yZ z1}G-CFD$R$iymJ<1VuVy(l1(ic*+8=HLrtSebe)r>7#7S`ev$Qp6m3n{L z%hqnW*4>7f1I};6DgFukqNSV7lkWm!FAFA(8e*@}bF7Y~ zMU)~sy{ck)7;J-Q{$x09$YD8kFbezH)T_hJr`#6 zEu|C42`kEBNoktn8&fsZ;a3A?eCT&Rf!9?HQhT=%-K_ccNu}fxOjvYVnzXkzZTjxG>5$mx zpKYhzPplT`li5I`Q@>xOE6~pOkOW4n! z4KMK@B(bIg0WaEpWnb`Q0Zu0K<}u#5^#L%Ex@t_Pa3&7af+i{%Fds5ooZ)b&o*K&)r~!4;e9b+ z?BBsr8PsiY5LKW2ic6p9*z9;EzqNi3%#k|3o|f1NjHJW)2uP2WY=miPqB^-nJ9Y00 z*}{7=Was(hudv)I^KTT~TFZeo>nor2jnq2mMQT>NBFhIQBykj$c^8G+(>5hq;X+}W zWvC<0EywyRJ1OW9dYjQ?kFE%5M-rJ7 z=lfSxtBEcw@g7VGXLn&ZTn6NTrtf8Ece*|=(#UBUk-o{Gl!@GA_>emiB;);CtJ1J9 z!ue?N*5M*JIaLJAgt|Jaxg!sn;DcBLTNE#({@0hK7aLn*Lgwsu&T4AKF6z8Ze4ESM zpx<3pp;k2v>B}Q0igJ9=rDI|nqEURU6{vvdTLwE`9w`ptQOH@5Zmp%dCs1hn0B*OE zys3&c#ZpCAiz+SP z72c-bb`qlESkKy+kCWWqjbH5fn;0t2rinJj2Z2YL`?rOCPJN{DHRH9!1W5wyak8((G+)~#kK2f~GEV71CKz2B?Tsk;@T zZQpFmbs;L>>0Yw`2MtH%gx0@@p<8&1L_NEu2FO$KQdQ0wPa9LhAO;|)Zh~w$)WoeKbM9_ue#S>WzyC}?NQ7CNal~a zl{$~koQFv7{F=Pn!KTKNZlA`;yIlS%@cCuy_BaO)ij&azij+l==E&)1+Xz6Ov^(a` z<-N-(^<7h=%utNwyYV(qaI3Nqtw4lkaNFz`!V~@B3LYxg$rwk^< z4b6K;^jxp?S-`*G#JPORo`2O_tk`XVIj?qwn;uoG5!RBwJSJwW6}WE-5mtDloaAr1 z*}T=ODRIIM|3~IgP>_|Cb=?6i0J5(43MPl!Nl`< zkLB~UvTzwx>6(PnTsPOz36DQfSD6m+kKk@N`HlRqx0h~KshV(r&(A7qv}^Zz14J5&;-bU(2Ss;We^&^ z@wL5~942GpUI~^3VQg39g+TjaGZ=F{6Kq=m#KJv31a45<@ie&h3oqxj_JxXW@Vh@W z7usM`WDhp_u>j;UA-P8)F6au~Q6<{E{bALwWzWVa5Cba>4G6I{80E4{&HRL$3D^iU z06?Qf=J^ObNtaV)WDgNr`sY&(+MhDr!!5A%x~nj4K6Zd6`<{cS zAD-{tzwhNSl24#IckOc(d<+Q*;rYrmv8bdSM>9omhNsgE0^7f}3?j6y8(+Y5`1>{G z!5$~=@Xwgtc%QZvC{{A*LM(@QIw6xwzajDbXc+dag6!;-#8O|bmt0orE7IWaksi_y zvRlsPEy_FrJb~KcB(c?s)c-MNle850{3yKBBK=T2Xy+P*z^W9ErQI5NwoNU}7xmGs+4#TQB07((tI(7_Oy4DFXhG_RE_a7QEf(*j^a=ilgx-gt zBRZQH7w4=7(Rl8WJm(j)ySQ180J(Fj%>qH*;Nq^L0Z0-PX(Zwv#y@}>r-w$Li_!K{ z=3RBaK{E;ubnY+-Py$Tp1(8q{KI7hJ^!8#nz8>lVVvhkeJ9h(f-byd&KM)0B3|D>8 z40fH(1gPA+*tK*n#;Ap;W8?R~;I9b#Rt&EZ^;JQ4)&Ss^K5a@yXGom<0i*e|PQ}-* z>jNI#G`Cpao%E|lcWC$6Q{a~wpiY98?Ur^0K0YMWXa49J)a_uG+@O5|Ois{dbZ`$o zt~s7Bn+Y*s_~Ze|qesa*1rX`~UDhfX+%!3yLo@7|VU%PK0(zdz83ct;r7v`c3gR^Ge3QsX{X22DK4mROIW! zd)5&lzfYLQ6sw@ zPF=y=dwQ$*rC@v^rW3K_18pu-4#WH_3vkg%u&bW*kqZeu{tR8i?%m%&z}&OA=R%hI zZbxo$+5nt6IX`ri=UIq<%5w$ma9$IItg5A2;k zrTen6uaHD>x7;Xr7l9E?5&lGN&5H+hw2kf7v|enU(-x*g2bU&iddTg~yC}spqc;T(pcq;qOb3`DsocMk(J> zZ-jVZlJ-@hqN6v0xmozf2ezFLj-RrpiLcyIZO@83Yqy{7kDs$`Qw?C)`-RVOKu^_p5DE&~ zB$_*MWn$&x!li`ou*Z+6PK(y$h{Q8v6b(Z0D%EX$`pZ ze4TQX|NOfS0CmS3*c54wD!>?;2d+X-xzxAJVS?dQzmlX#S$3PX9ZTAF$^qo3H4u|& z(Zd0)y}cF)t@(PR8(M*4X-?W|@QCZdghbz$j}H!-7@`|QL8SS`uUKP?Ws!5rNDE7# zEuW7$pKT@B0%Bb~stxkY!NB^J5?g;=SMnU3Zr<47YC0tr64aK2b#a7sP?pX z+v0XhS0g1Q?*XphNf=9-42r&L!KU?*1>~Yuu-rcToO0~AuA2!?Sx#iM*R{5`LS15$ zxCr*gPa%xN)VT-t_T(uR&M;NFxmp z_c6fRu>4C)x4V@Nqz?RsZ(mjQn64U1VH+v}vTKVeAFeeg*{dATWo#5>fJlDdA3dFj z!oN;#0y@P)^xlVGq*Z!_1P28bi92>=a3HP^CP}i7tnzxEoA3BajDdkw5D=UsrX2}4 zY4(}Lg7nHTglN$n)Gwlr`-L~vv<2okMgZ&J(q_$a^zK`T6t`ETIp!IxC;j0-jA!29 zuH94ylCgd>r82?@F!h3PfF=M$+t|gecE1yG_${^P41(xv;}87ZeuO z0Hk_S%cJxNfN!%YT zrmrvZ&q_q%T0Ee_r4DEC9azRhiFq7(qbx}A@$uhR3HX7edtjHW9*N=qzW07I>An7B zVF#)=ExBr;>_FpO1Z)`6E^_>+99Qy=ab98%y~rRtfciKN13rP$gqFi4w6oq1(f-d7 zVz9j$9E2)|*%PoqSojG1{QO6;ofa~mV+ntY`SJyCcRBcDRR9abCis3ewcvI4JD%Zp zEf5$rwb5E!yeZ6nDV$LIlW3FaBjErr@*?@2(cL)XQc;iz%Qq-n0G)9+1E$~av=)PW z01z(R1n4ZJ;O&Ak`ln-_OR70V&zU4egS}^8Ed9+<^QO1K2mtKUjq_Dn!*diQOyykI zJS8O&_S_LW&DL5k-DM4Su6H{yMMK_)_5LuQ)JRB6V+K*~5ocE`n9zEzvKnzLC&sG* zVhg)H9rjWoz|AW2l?ri?<(OGy{kkTg@n$T0Jy{6Aw^mmPHRGW1<#Jt6b_C!1>7(O> zu;MR&zwZL1y>9?bXwBO^#xnTDNDuny%Pm34f|{=G^NnmO;k$S59@$rPJA`=QIkQdW zdqj3HE?os%FsFvf5{Sd}N#NC)fzU(wbC(BcIaJ$#FlOO-;J zB~zcRkFE*zd_{d$b-t*nxqjJFQVTBzjWS2#&9aH{Ri+~Q429W3?+f$gqkMLFo>vV~ zr46T+?RrR_H=G-L@U_}T3_W4Ya<~#YY3xf1K>Jwwgh4-l;@~h3u|med2)?bKc{11wyT zf%{Wlvh{0~I!brgt(zg9m511AOl{}IPw8J@p*h(;2nz}lJ9pFiId7!cr4zX3%P&y< zmJkeYdGkmm0Ro@pOuTb-8JaIGMc0?hr;f2~a=+HY9fEqRh0f^f8h!u!>i!%as6}Rc z`9tCBhB4J@P`cG-x>jIEk>A|>=+F9z?UODY-jex;MEFM;uw?uJ+4^gIcrJx-9xJNCeU!?$!(??GlRNIW9mx!_# z{`F3;sHUmyXcpxH!7Fs6}$r49w+OB`~qG3rSvtsbagWPNIXIlzxd(ukzK29Xl@j$DLqJm1mQe$|SM zl$Z<}IKd1P5mbsjO5JS;?_x*9T=SSeGZWMZ__Ke$8n+(XZz#?EKtMz^kU0_V+2Iy^ zn}Iw0lz+z-v|Lbs<1>zu4)Q|0V$Ape&4V5GE->vOF z?I(9Dl{yGVJ7ZN6JMkHLZ3TO+a7-AdwH4L1VY4J`spE&Q7 z?#i$k@ryX%Vt2{X+KuMp>`FS1j*e3I|NBxhetES|Rs}MsN|nsV>Vsjjq8oDJ7UF$V6*V$B$ku0O2H8YVb{1 z-FVz=KnCa%k$2sAg-@o8Ja-&zd;ym!F)Cv(p8Bd&+McmLhPK2j6n^zYIg zS&VLX<8jx=fcmvX@cYIj@DT7wg=i+$4V^XFjEe?)m^a6M?x+2QChJtM}^y@2h zl@{+e2bzZY-f*PKGzX^_EKLIQO7$?s*Y720mVmSLonKMQQ4!zbZ2}iUcI^%tRlyu5=4^I^x-(np+LQMsd(|7JAUzi|EX&^Ko;3$*N@V<%}YH&kheyO#JS} z>U^C&mXAOtO6>x!Lil~d4k#HyvuTmQ?AI11rlzzsi+7(?3nkhxas20Ba>pz_^H&-} zJi8Hk(~+fS@%#&g>x>n@Z-^fKA62$?N|djqgKB$|@Dic>k^&ETNaBsJHfmlQ>Va3z zNXj>BZIc3rI|T}x;EH9`qIQ^4fxRyYWf>5(I_~&Elab!u_jDVG(21PT-a7uC<#<|^ zx`HqDC^2I@(uw;9m1wOICYz9~`#whhl2zJH4V*+J%KM+WM>Q|szCU*kIft*oM}i!J z3mG(UJK4=vNcLDs+sd+fJ=@hKn(}bCvmDZS1gb4z z>Hh7Ej-o{AUBN8G{Q5P8_nQzGJj;-QH}K=&s-M3s>T>}q-YE1TW2lDx_jlZiv)zh@ zo~&}H-E96H7JQU`H6=M8dz3$Y%9}2sxN;`>1^auhqRmo3N-IA%7q!=cw>c=PoePFg z-f3`DA4}pVgx9(nq68W`&C`3<6CLj60PN)T8R1{g(?Jav%lctt4p`IgQP-WN%3N%0 zQH3~K$ejJj^4LX>)C%wV_%)kqat@9v3$P@M??|aK!>2K9va|lDzB)Md;galkcJDN#K7!?^=RAC3 z-Y^{cCA~xX>+%;{(a+AMI+;$($+y~H^Vpm$mx(<79H?%WUVfWsgMY(Ok@!(6AGNAs zRgV$G>8YaUHRJt5+rPc^yOx^0*(SF*`rVz>vM8KaGqzYHjoOyE`8Fp#Do~(H<6B8* zpj{iprdDp#mVM8$^g_76VR2g=?ovI-jeRp}{D)WGc|~qT*sLdN30T zn3SS5p}ny<@%6;gakpR1fa35cFOs``#iAgG6dYie?b8zQZD-ikyDCa zB9!1;2HX)v&IJni8S-qsx^x2K8a8p0SenM(e>EUxpJuh%M3|V3Ur65MCfhZJ4Yx=69D4j+O?*0NLcIQ z4;ZBFoCmWZN+UN(B^5aK(}GV^3`)YS>)7D^E_5d*Ch7tCEDmdcoa`o}w)QIcr7}nZ zoiSX>lE0M9g>2vG8#{OaIH{qQ|QhYoQ-f#*D zAt8ML2YMn!3P*y(D9t2PFTb2^G)&f1ex(9abRHJ4^djtdf80ix=K!Z4q0G>rBEFN@ zO8Y1oyYpKSk=AXEVJ^32HD2xdxUnzO-#fMZDV5Wq9=TJ&8F1)G1ls0lHmBsMq5K=% zKk_z?p;uDVq)ua9)LZIK&)**&gn_efc1$xW-pKP! zGK#UC*YJDgVUGn|>63w7v>@R%cy9NSA*~8?vKEP%{kT+7BLbbVHI%@POOM$OGTU#& zHoIF8c9UHU-2;-1Hm>j2!6iVyd%{r`b}Ipmb@y5w0q_-+*m(Q3Qb4<_Fmm>fgMYziQHT=3(V`WO!EMIG}m zV@-f?WAR!(0z{8zIxklThLCZsUw2Yyt~XW8Si+1WqYjg9x*Itosx@#AK2g~KOly_J*T zEhPMsSNbX~XpV%2f-`Jx|8{h|H!jPkz0=~6i4v|4eFM>6O1vA z$P6-~fM$NFF3*~axA$xZb2O658lYUWiy(ko`eXy_nYw920VOxZq)R$E|v$M zjE#-4_roe8B(|hR3%>K4jc?)PAN@8U7*i_ zbPlqY83sbgGsG3q3_V9e&oW_@Rtq?bq@iG^aXc6sAKwZi{d&JW$~?*=VEhzT^!}v< z{6qa?l|g%A+b?>T)Jx&+-|=)J-^K~CYJc7}1I zyL|xTM(HlC3*-(pc}&G|nMUsR6Pr&}=GrxG{P#xbDbai$!t;+wzkWHvT~ka^8Zn5> z@PGJGIbD1A=#|gm^QKV2?(mkW_ylQ{cWk&oK_lTaPa!J+zoJCsHZwfmOsi z(|SYvqvapKri<_N0WQ$M@3u~i;E%0PDCNFEg)uQox01>$ZD!*ICfeM2dvcEpD%9u$ zxk+d7YpHA|&gy{h;wC(qd#QCj-kEseFpzQ^n%-}C-;+y#HX!BBUy>t|HGK`-of2vh zp(n;eIG(ke8ss`)O73^MkiMqJBEP+Cz zci?)4-y)#hJ5jcXqEZZ^;DD_m0$_T6ie?ijDLD4Trxu`P-T(b78Pv0WTHGXK@XG%a za~4`A(D680-Oq=3NF%6Kmcw2Tt$JV$JI_U&tJ_4+3Be6npqR3XRVAdRE_rj!K=AQT z$aX}-&Ia*<1vS5-zBN905#H{>Eu_x}zxoXfS;cEwMyX1}bB2#4Se@ZgD zs(_P*t;Q=2IsDaZBXvd87>PQHYZM4!bnOEyGhV|2l-nVpiWu z${u~}U3A-np5kW~lTiC6OqgI4xhT|M6g^R9+`(M_PPF@QBO`V{*k;ss<~QcK9mROR zy!j0I+jmPYGwtyV4owIx>1M+Z+fkys=PYA;Y9HgVBbfhPIaZ_<+Irw;ps#QD_!ZQ! zOQV$rYAE-YUHG+kvQc!ayCC2=C>F+wBF!Xi10)<2D{-FC^7EZEl^768nS{iyM zD&6H}DlUh}>LvuaRk4WQQ)0mr5Q`O5b-EGWS>Cz$#A=Ua#RN~jW0Gw6MS9#an* z$sLkG8)ik^vUJTdRm<5j25di^#WAKWY zf2D2!2P3)_m4;%lGCS)k4Xm&VFZEIrnM>2tUjiHSG`tzx3$%j|q9u)E`#eg)Jp&2I z=1jSwymv7-FY@uA2-|MTKRR_7j|&C)CCQX&=L`4BIZMy5s-RbX8$dc3oQp8ITfDVrY<(PU#LM1*E%%QW~T? zL6A|C{`dHP|A9vycsbABd#!b^JIMUvelY2Fv5%hLGs`o%PJ4mX zyj{m89btOt^dx8_D*8;DouydTYRoap`a{lA-)DP5xNy?R5@=gge;LMjw3-t~yhN$a zKXPqPhggk*0$nkBq}VN_-AJE$qVt`CH)yq@!lGpSgGXx~C{8W4wP!UT7R_W2EBnou zM7 z=8H-4+HI8v8BPacsG(fw_8l#KaCRJ;@Fl}=Y_83-LEsdyz6nBu-KMpjii*jv>MK78e`ZL z=9?n#+bKVT(hAnqi*aPXB)>sH*GeAj7N?!{^Yj#?7Z8}*qx<(T?3dV2u^~rkFiiWR ztfP}D>#kT#Ep{SIDfACt(46VKnde|RXP0v%ibC;EVdqe6$ItGnquRyFaC4F7H{n=x z?Gq%}TGT1c`}4C>X3C*Ly5sRB252bn9UXmU^tYFDf+YWPso$YFHRFjCa`~Ftg+rV7 zZXO~2a7G71iVi!q@KA9RCrQzhqa=ohz^%e zg)^M4cS+V8+Sto4v9Lr|`2;=;si*}$yxUAiCWzn_6n5CHKMj^yLR_44DX@fH_;r;O zAKw((!0ABtIf%c_wOb$?H(ea~;Lw6CC*R+N`WCU|*jTPW&Z5fu)vt!n&h;vD?sJLp z$+xaIO`agTSaNdm_uIZ9J``gfzO>w&+V;xFk&g9e5#aimsBZ@AQ>*A0E=oYc4IsU$MgKkP{rGn=4>CgMieRDo;SP$zAK48eT2HrES2X@y#J_FK zOqU4{KSs*T6=};wwtpD-sRBbu3DZ)WwQ_5FT=_+@2p_i=SKwP>mXk||XQDd=A3 z4vBeRuAv(v^jF0qrK z@lX=F`yD{S$liPn3Ay-LS4T{8CNAu|Jb%9F)Ok6aC~mAgaR2D=+~7?}FDxa^lWNod zRaTTD-&R=8*kYmCoAvo>1FC@UOwGr7|Rfipx_Rph*@qMQ;zR{rQtY zB|}8U+*Bq=ObEYu-qP6Ubp&#&#>vV2;p@*XGkuCliX|GfT+REeHBGX=eAzVFyy{~% zumuh39x^TmMuk0}mX?NvE4a#+HEIrNPk^?she(Zlu_Z&EQvk;L~mlwEa=66|kU`r(9KeD#`dMQIdPbc#(4pQ+G=u;)B1Z zDiGVZ@^Esh!ad_$6jPjI+OZrAk=q(SK&Zx+%VPzrJ9{wgxdpOe;S#o#ktm{Yt0Tv_ z+sw?&w?ct2sPW}sGGhQV)642sf=!3qB~o0vp=Tg9U}tk{>ub|UHGu9$Kp^XZV}GH% z_>JJm6lWavq_Vs`6qqrH5;GaFTF)@%0rakiZ-W4=mn{>UB=*TTn7lKhXT}`aYkkK! z@SqY|JqN(3OL8tMMHuD}sq7~9r*WnifO=9|9dA6tw5a{=VCZLpUMlgW?zram@xGiJ zUFAtid5<$j8Ga8JKGXNL{stJ-YDvw*c>TXUn@0QpdLT_SX_Af)y{#l)id+oXMju6f zaPgpWo^S>QvRav6hwG!@9vgV(QaS^iDU!V z^BMm59fuxcmaXHRJt-rSa}GLSZ+=bo_Zc92sd(AQEpD_YeUFO&W~qH99daL7$YrGQ5~DN zr)SHF#%}uB+8@_#9UTqGm^Nq)vg%rUg5FdO@4Bf_nL*DId9Aw_{-GXQ$I3Gg{yitm zJlcKD21d;8j4|B5^zUCRSvycGjr8>?7B-E%EtA0`hLE7vcCUDZ4O5R<^MT_El63gF z#l*7s!CP!13mbLEHxV)|eNt{KNbf)iU~QJNSwI;5{gSqim1Q0)|2RN3tlB2|r0p$q zqD!xY*Ou6kNNU^R&_}&gS35Wete5ARyc}vK-iDj?zsi#}a~Pmqfpqn2fuyHTpU8y> zi~j`ee_i5c8*?OsUf9DR!7X8TNjKKo(=ji&xYRlulI2f`1}|mOuQ1jQJe%tQw|xdM zG@`&ZOIOY@7}49C#>&p_cZhs)0F1MbN|!wmkk-lHw)E%h3d{Hn1@K4U=jV3^R2tDs3IyGE)HY68$df-QJyUgnNZSFVb$PfOX%gKTumTqA8qJ}DNMqJnJm*)( z;fjKHt7klF>mvdyZ4?#6YItvdd8_QD6{om6L>DZ!jId+A_%R!}g0^xGlCW2Tl{AWy zqDsUX7P2XfGj~@K$KpiZGo~bY@^pthTU$eC@v%-;OC9kCi-ksg%;GXq+v2Q(AsOdtz{;T?A|muam}_z<{&;#E&%ANQ&;e>gsg;18s`Dpa5**J? z8Cs}U%#;X+KG^6gPY+jO5G8j5iV$T=X667&GYy$xvXR4EMmmGwX4z;ECt?Vf0Bbx0pn~X(4jM5x+)NMuX-)k=qi7H^IpnseJL0`_m-uG(PN|w#* z@6nME2l|dJOvpqyyR!X|t`#`dx@^*d55=yjq0ww@2$qAiwdLi9+{6mzwg*0alueN4 zM+3isKB^piQEufi;(~eq8XI(T8u($ly8O(#MAu7@X%_%UCD+Y;`yTxi5p;B>`RMLu zWgj?gccHw|RF&nKrsWGSN$0>4)CYXkSV!%!@+8ZFH{HJiRZ(ALR(DsmE{~ZkF}hGZ zOZH;6D-+~&S#oE7K(n* zdB{0XokN>D@eS-}cwh41uV3XT|L!TF)`S0F|KbBmec|f(C^yKX611Um2L1@PKeXwEU zKOq?;sMAMzC+rOP2S-4qD7VW}Qx`*J>-TEncyV>rJm*!?Q(ZjlGO(a~5~G7CbeWY1 zoo060rTW9dJ=HfYSR7vH;x4K-tOIT{zzV#lu0FmJ>h_RBt(b^;IC2=shv$XKku9B?n4+!$D*LHu>SkakpgnSFZJq* zf~|rZOd7fZ7zx{M{9Bw9WLO*4cC|C#Jk_n`-)M<63M_l%TrhYY}nbA{RwI zKv?#ans+*pUye~O+JgRyimb|6xd!D)glHCfgbtjVM0sNVDYZF{@?o(hdfQEzt~uLS zjiSEp!#a!Itn%%le-Eo?um zEK{|f3zy1V*jM?^{d-v!b*)E|~$#_~>u?bpxF{K3%o@D?eAwdlzoC4Pa4KKsd<&Kf74%$#Ysc zpjUZ|q?ow9f4@J>nWFZ!Q@g)T-k%ICMMrbl9l`2JPeG;&%0>Py6pMW(bYe zp{+%3JZ-09)W;G70-a3u=g*yG$6c>D{5{m#F}VGX+a z6hN0BHzdb1#9=%Ee^R{Cke-q8Dk~+WyqNmGzPhNt?Z3@o=R-VsXRtOj^E_~|j(i+^ zNI$aiUbDfJ zlMY~wJLRw^wG|!x_L16W))4Q>;l(HX-K!UZo5$P{quV*In%lw8F1=fx2?b5kTeYb| zEXPi`Wp7i@S`sm=2i2@N-Qz@E3jAZn!IMrrrX2z8&qSMMBlMhX;H2>AlvyDGb#57a zOed4qFcF@DRICXp^@~SEs%MonwnabG_RP$ZwmqW-WBn@2B7HwK6CMeto@sWkIK6vu zx@$3^J9|~l*AJHRe}OQ_*I@08XN|woJ2@w0-saDGK@}uQz3rwsp|JEtz34fO=s}CpI8nNN zwyXJ^k~%%{F0No@9`Buoy>6Y_T!&TvEAuX-**#hpDXs!stef1Wv~VEM*WSiv8gaL~ zv(vY~y*)!anLMO8lfCnkU#% zZRho>f9Q?&k_oYDht1EELw~dtBDjf-Ij(FLZLBj00zBbZR0ul?|T8jYTmtZ+?8d9Co)y0;2!Z^Ru81;9lC_mr*&w*fZyj(cX{bf;N z${UfFF?2q$ww4Fe-I2t*Z=oN{VB{re+5Uk+aFWsn`oK_bbGq+?2@jw9y1DT^Pf2vz zB?cEoex*rgC7f4R``at5fx)Tq?|(g{yOUEidO2UcL%HAyb{RkE*BybEXy01q26Gc)dEVuydVf<8X#6 z>u0E-nAak>%>y)NK*)TSsT&DMJ$;j1op={_XtI*hBo;SzZrU575FK2RvuMk z9gWd=BYc+#$ZZrWk0zKz?C*0&F-=-f^yRJ<>~jA1De)&HU`T|%oW|V3f)xm*UCL#{ zDa6;Uk2P#MiJ^3$JL&cE^mHqA6Jj@Lh!+Drr;6uOS=q{oa9B(E{GcL`+F?0iU^7oY zQ5`6*HZ^Z&nS^my5~mNOzEn^M3VJ){(!`mY)g?;!yGz@>d7fA(g0+;0e~Ben-Du(! zURe<@gaCfhDBev1FRoC|HC>GH`uRa|`fbns0%ooZf%14F@U)D&p%-I^cF@K+4fUmt zG}{b+sjnvF6c*mu0!-|19n!wzVW=@izQdJwi=x^x=V(M!$l+Hn5b><}H^G8MJM!@ZJXhVTeoDCqY97jRSaVQB^D<}NhL?5m|I zTb<%XucM@oREiV{P1>GY15WN_A)tt_ZKh+wNK=pZ31iwpT)3*G^4Z7WA(419933%H zQA4(hj*2KHG=`WBISGU_2xL=3y+^3`e@6O|G_) ze*}5d%GRB_0 zL~T^W3HKfK4{{%qDk&}XRd;#Zy&6^J`~`r(;Zv{r$js=m(p};glJ&qqRy z?bofKq8xMA$1CQ^@=Uz7n07%hPBN{m{`N4ov3V|gJS`|?sXIW7>w2IU4AGf65)cq5 z%1I-BQ;p%DJUZ#A0yNmn(ch?j|7vhuw)r1Cxu*9xh*dts8;mx;CyssEj^Jg5cY1@SCIm1McuGnt^uLAkD#zcq^t7_t0I|J>dI(>f<%iW)ruN@O zwc%aPW(Ii!*`;^xynXB(M+sAA=j2r`AW=Il@6ekDGFn(vRLR7y;r4xCG`A=0-YO>J z&<|doGTDr>>WAj(R?%JQf+8GUh&KVj{Tt9J?R@6xe@q29km16R)OIK+?>qhEo%-ZuY;YTgdut~ zEb*j9;F@%^K9J!he%XR9h<5dGVbtS6cRW_R06?bLdtJNJ-!g9%J|!YLGo)W+Y!inx z4b6i&a}^8$jm3QB4dOKx;A~T+CnZnj&y3c`ysXc4`Rbruubd^?`~cUCVb2fr`Ln>s zCX7R@K2)RY=YrLhQ5Eo>1E@yULf_?Q*^J+RjL~~|1uWktihTZYn)(l)J3;@(^ABAw zCI%BrC4j)#M}7x)aAa`iL)1HDOeH0M@H}*;1b%~JK-Nv#Ic%3kmZ*+Qana+i0_ELt zg4|>#FfEHLbMv$Ot5+l-#?PG|RIwdTvCk4+mvpisgix9!I6Q$))pHv` zb;lR?h1+8HRB=mr!B^FAL)R;okseJ>NK1=IRd7aBnOAXV(1n(J;wzs38dc;6`S*Ws zInYl}PBgyXK4wx?N|k{L0SbvnWo4zx3<>@O*+11}T&*foqdaRV=JO~rH1BP^o zV^-BzRjkMWDk(5oQA+bL<))f=2jMGMVyxi^R=N}Kyl%A}EmTsGQ*)Nydpgv>6yfrd zq^s-?suvFu49dPBwfvU1GCXnK!iP6?p!z|U`NYY z1+4C0O?Dvz{uiIlR^PMF$kbb!tFft@FC*=O6^F@xxas#&G(Q{UWjy=4`I~(k#pM#H zl9b1hz#K0Z*K+dF6W%f4igP5fK_jm~Y$mv=MGC+Va&Y(7WgzmVYY>avO`gzEYbU3Q zw!U+$f*$G9M7VRA{*fuq^usy8P2BPCOLDCGG=PUt>PI&$UHNbdGMsEw@_9j7K-U>W z(OFsl-fDuEw~}s4Y!>W_mqF%v2CTTcz*w{Oa-Z2OV{&4`EeqD&W##`naMQaG*AD-% z-d^oEw!_66y54NeC%Ssim2_w;0$0P_tN*_#Jh1n_QBH;*L;*nu`ug5VWv~Nq5{))V zcD18z`G*9iU(f^wI<eZJXB>Gr1ip!TJb-S1P(WxW4+j z;a9Qcs#86oF~2w=C2ko%0=x&i?l&isl!^Oycpj&p$Hg|mtOKY3Cq2DThSK|~GEeNi zmdSmVljE?*yugo4M2%&BQzGZr>xls!OGcr!eTJLzC|gI^X%&$q&34_OepCwzTMdA@ zB+SFg_flSMcUgwC>rOa(fv&bpeb7!2&CXw-gJsPhDxbvjnkq)eGhc(J(qx`}V{dQ% z`IUIa%xaU#|PEDg@M{iO_dO&=i6{ndQgaKDJV3s*7o;qkVl_bJVR_^8pma~_>FSE2K$1tq=#v9* zt=JdDT(`#T0Yf4Ek%t(xXOo#A+JC7;7eR_k>g7x^sNiXF{_HFSG1v=Qb57t2! zJHtq-E%jL9frF-5@!>6K>oU?iTfPIw39%2FUeO8cR|a1Z-!CdExU$Hp|M!q_|40A$ zAqnh6ufck<1tJG5&>#@A0;P{~IQPjytNC^EF2}ho2UhvV38fRnE;sV< zkT%e*-(0N2b-h^Jt#T!xt$8JXZ}S1d2XI2`DS+gj(YR{<62X@dL0!S#lX=eY4r_~| z9V6>QOWPUnXx7?W)m~j+AJo#&AP+&sg=h|0w=;#_7A_I&1`-gw(Lx&Qte#97Ej*6& zpq~8Xu^i5@=e<+jeY*w1pRR(*;!7NtpSQ8lRQek5FhL@xg(7Tol*4qwwjbUQsFJD< z+5(T3yARa?81GL}CNL)0xRlFb)PqBWF-#A_@F-hIj|4_6g@EJF1ONzbRcdFN^*g$~ zDI(iKIR|+G?=lsbdgvJ#h>$FK>ke!*tEQV>HaUc1zecwWz7n=2EEmP;B5i*Nj!tcp zQ6@Rb7>#|cG35{L4*V__N;P>?qo23%eV|ox1I~|Ga6(5W^CvXFh9#99~$0x^XL88(xd#+ zprtgPWci}?(+h7B3|||dW_ral^L)}ishm`%L?aGIocr+pG(Bae8JIUaKz5&B-nVbP z@wgox&Yy9SD zX$o+XPm#wAtpSb12@jsW|*$$zKXw_?-bpT2fzs0o-`b{FHFJg;creV%?ffCiE_x zFs^on^W^TVz|v0p%Tr4d>QWb~c3rD$N@?mmLP?;cJK|`PZbE_}7Ut$v9VlSXoi{V! zyHz#|s46cmDS5a4^Jj3Lmjigu{D9w%0HM6x0n>+A6~xP3-{zN1Brv{;3u+gzZ`9NjRLJ2b0o-@>|6(kUo%Zo z)Nc}eip5|Q8M+~nzJ7mmv$I` zA(?Z`FYH)HcCCNb*YOM$$a8`AkAvHfU)hRu;#n8geojBa>GA4&7niq~lh&+*UiT*h z)X6*pHeFs%x4GkFW2%W}3OKJVkO{hc=8LtIuBk)B^aB=h*8S@A(wlqR*)gGey2q^> zb{&5&JCQ^#i8H7ze?rojBl;Y*p=~rP#|HYOf5*d=df?kZlsBcxuc06>Zzvrdu;r{? zy!(+)sw@StJqj{ifhmnj&u@{{swFbPxD6ho0B5Z*ZsU~s>clc|xd5Iv76;<&%>?Eos z1GXz-J;Z+c)+5~llq4AUESZ96ULM)u3%s^f9)Q}L?obh#D^_f-z8DZV${tA=d_;Uq z>NGKfBe3y?)B)ywxmjc{29i0oEXe1*L0FLyG83wMRX@R84uNa|XdY_^CHy{EWT(#gNdnANP_z zK%djn(pmuPE3syvv}ef37L31Q$(2RlpqCg7U4PJ=V~v(XiGXPbI%b0lvs63px&0OZ zXbKV%0kp#Hb$+(b8%FB*sw~TM4sxUBWt_vP6Na*80Hpm?N*AoKlV~$4tXrB`pTJZ9?AMl!;RedKRX(JEb}zvHG2%fBd&8?{ z?>jMhBVRMn)_=~a$vyc5g=NRY`y57OH^n5^#ei1{;#gcM(No{a^R9tXq-sK?hv z?tVa1epTQT7gPKWP4I*8g8M2W=I+^%eVo26#^5IwlCg;dk0aNZ83TtQp{g^Z_b2#E z2Z^p1`NxBHG0h&igP*?a$lR3ExyG`ZDl?7#KyKS%AXHs;v%|iZIOFluO>FTftrL23 zqNBl>V`mDr@}+0cMp9P1YrRrw)~D?c=~-$JwhAs(mk}#}@sX<-*)u2iS{BZ6TJkTy z!dzQGp=eD5c7)JVEv{fj1zF*3k{<#e%l&6NQe#eUzND)t%Sv`UEPSMMXH63)#_Tn> z?vNSh!6hmrl=j?ndf%FqqPD8&-%e!d|LLkUKS~W68|J-_`iZKdy@c^>d3dO~$U+&& zqW-j{1`ay9%d4p1AqlO(MttWCmt62T0px+*{K z&~tLn(z5Bc9$~Qdi&n!t>7gIK1$m}xW#H)eQti4+W_pq7Sh*{|4*tdcz^})Zuyo=x z(EC*&69bI&!FCvJ3vRv8+1d1N{G-Ohm!D+AAdx5Fz>W`!UhViLiQa_ac`u^g#iyhQ zI9JPx^FMbauMfTY5rUP5#1A0Z1%WXSPpCL3fYjjelnsMQ=5-)^uK$zpUqsSGnbCgj zx3xJO@*mAH<);>1OHP~yg+eKSOgy=q_Nl0JW)w}3 zI8!rW{3&ztE6E-`ILam2-_4TR`O7A_-Y|F_Zc9P22b^=KAtrx8o#+k>fAP731i_b@ z1QkU;KSf4rsKbUZg9JKRY@pxD8Kh(*SnM9~PFKHu54?`U;FGF4aX1`qwy;U3w5mih zD{6IVOJXv>lwiDqRWJ5)taYaE6zx_(_D#jC59Edau-QicniryFA8MPsMh5w6rBE6X z`7E)HDa+9JCIq^llW>_JbG{<>BE}tVsjV<3`8MB`xjqU$epS>Lqz?A<2^bX1`kbd( z_cG3tUu<#cnYSs~+1XV#O>5?rJ*lj{qWXAF=``-L7$qq>zSq11Fw zLv&38l?ts11Zf4#*B3Z04q8#&H)jnThvoZmoDty^F>m=^S~SC#8b>Bygd6(x9j1( zrZ)>k=lx0j65lMOg=k96cd;#?HTLkvR$yP4?Jw+YLA$JRPP9k4!a#)4lPOPv(}%*$ z8{`(ZaLF=3P~rR%c|B*OKrrzi(6l&y!_+~7U&T-UhkfF6?ltbW?DzNeJuzrU@-+?dYvYHS5{&@ea_Fx14}}Nx|5hw`MFh+JEJk(~#aQA7;%^cq`pbC=b?6Jilz z*l~|BY{;CX?1ankMRiThZ7i8~tw}M*DTm>rSAIS9yF{|6TG7+rW=1g`+mod(@362s zhEVe+{(8ROY5Ox0fJ;?g}Y|%c!WR zIQk2f6rnqsc2YuSo7eW}UP=SDK}H>4?uPYGi%5ZyB$G%EJ)F=Z;LT(S{y=v(L^Egy6n9OVAR31(??J!0ym(>|VwqCpFM`&u zMy+GsCI?_WiC%?!9r`%@&TY4{j1v zKPE;rd=RWO`Hs)dULaaqNCs|zVL3>M-bw`Kug|B#AUx4@R#uZfj!~foBWlWEs$T#> zpJ&o9tmTYxCj0;}EB(2W%*A)4M!()I#{2B-&z=1DJ&CKn^`+$K(`2r7U6KQ=hY#tc z*RGGigmNc6y~$+*?^mVFxs|<;NrAJl4iix@1NpIbWX+FqI?VWQHxQ?((-2Fhp2g_ zB&3t<$Fy45LF``GHk@~VqOIf}8Kw67XcU-c{6tf#R?jK%k8H493I~@5Jcu?r5iiQZ4ZQ z8ZiC77atB*xfV1>%o2GYxN%B@1Oji`Tvk^oMxuyy8XG}h9I_Bo+hUgSKLeZ)*XVzD zRT>TufCUio(DEP;#fBRQ3SkEv5l|EdZ0cOCO%G%IToh~_3p?UyhqmRD#h)gy2cj=F z5Xl;Zma@4&rle6{Y-bz_If-Mb`Dcqh*fTOT^gW-@v-cqj6=1kB24Sf|AlX^O0R(7= z>1-HAE;{n){|G?qAdU!C5Gz=!AJ)>%LVLp{VIzH`D{@_GG$2cDnTN>^l_+n;ND^vI!|@=ns-i~iR7!i<(d z5L5c;m%jHhvPzMqA2oe~mdX`b0dhR7vv>wqicHB?kgq+{y){e&EtqpLp(UW%VXuz#ra#o~(7MRk`3 zjX6soPy7$|&e@=`w%Y8fx>sgqX4PC>woW2FO%Wmh99kdp738McUYg}jZ;_ZP^E%}C zEKHj-?)n(nxMw9LO+NE-5j|7d5y__vHpAS;;fZk11TPnBg)b!*!;mSkgk68o4Hm7t2N?A6|JCAP*7N)q0899@*U67FC+`TmAvS@3o9oL5coE3xS_-4 zCMHgpa_rhL;>lhu6be~i;=_4O- zLGsj`7;S9=NpF6+16IX2L?>hg-%he|Nh*^2izU$TaBy+$kde~#A{2udYl0J0+>IWh zvDHbTy5ITjtuiL0VP8|KQvbHLzt!xgQA8G#qCYJce=i$0Jbm1%{xPab3IA8~mM}nv zGrwY}Q@I$v@UtOJ3mi^oHp`dHRFcGC2DtXnaVr zt1PyO6L3%=c!OXOQ#S8&Hs|+P`6l)o54Q09=%{m86CWs(DnlIEF(p`V;V3WCUJ^Q< z#Iylsvg_5hTGI{!cqVdOJM$4W;_E``BIo}eJr3!>&28a*=m~YDsbU+1Pl)$`QKm=z zGMjkx5jrYKX~zP7=PxPtNFoRCuM$5$DT)+ulFAjLlleRC!hsVBO`~op_GvxuhBV#> z{}#}iw5*?a_Fi3H*2LV`SUZZ1`NP>Q_|e6kR?YM6+v3NeI<)GR_2MGw&$VfF(=1bY z%mp(QY>tm@HD!g(X>K7Y=}5a$tTBPgycO&k`vu=ZfS=qQ930p)joW>1O>p9fN+}_x zB{r{4?1|lD@P*M?(W~Yn%6Yekk_6JDc5DUXH(aR4Ik^qKpDjA4*f#@$VqKl)w2`Xn zFsQ~?QsxFGb8W<5b-a5|f|ARF;EF>mnIJFP2vq3Xgn2Ai4Eu)7LP}g5oH?|x7hUB0 z-^!n&JP)6})7Fy9C~*Aj__3HcMUHn&E8oDbzKhHPC1Wl%e645&e$_A{+(Qvppk>GG0r31l+WvT=f#qu5XB*7v|Tuf6otB?kECO zqI;j`B>^yY(BF4_VLcuOO}VBRlL=Ioh0wby7zkm-Z(g<{K4yi|z7bXCI(|Lh8)C~z z`mn+r(6mvXjA`|}_G(4dsR8)ql_g191u{C9%%?B_qrKRn6cat>I|a$4{{&vxt|KwOuY^v$n6j)s`;P%c2&V?d(7mg3gGfkLGb{b@bC za-eCevac(2MT8i`zw#cpGbe;f%2jb;*w6wZ(JaW{Iu}2lBcYz(xh9}ynZ(X&k>dvkjq!p(2F2uHG+>E>u~*_?MT<$ zZ2IZbKZTZd2wHwvo_MQh-J(4Cu09-bt6gZF%As=l}_eaCPVBF$yi8QO3DT9XF}CJGT8^x3wisG9^jY} zk%e)brwkuSbc!<-D#}Gp5kjNJ{892`11aPQk~tYCGm6?t%mz^%fzt05w5nIzd|rLa zx~M4_73jC;Uy3p>*|7h(tK?;wZAiC!C9k_=E2^kic4&XRR62);+6hup^?pxGN%^^h zB{;XiK~y}t^IMwu+Ct=dv9xi|Q!u__n8v&9Wur+)XcD+Jr`X_~dGk?pf?BHo1$zc8 z8>OS}3jwX{A5M$?+@5x0oL|-GV@*gdL$~4A0TTZ6wU>J67vG#+$Z^Jzbc4yq{qF$A z=nYsszk(om=$n<_!$`e+9mqCVIx5@0dxDKM&E(yTo=Dh}vAXH%A0H*6Wq4Sc9B zQ8^Su6FeDu`CdQQwePf#&c%q=>s8bUKdbsp#RO)79qzpqklg)IJQsWK%;l$H?`_fr zhq}7@(FTCSeF?S$aOuz~IK};^1Z<*}i@{b}x9go%^$ZrnddB)6Lx$V|z^af9UH%+@ME&L&M&%8-1A5_HQ)C4yB@c!6^c!Q44S90!lsLrFdGl z2jrC1q~ijzRNsJ~E#+>7u}sl6->tF%O;v%5Z>}}f$(R<+>cNEg;mzE zZH*T_b-j$0u@cj8NwtNS$2ai1QF-?yP^nu`%|4K2`}s~9yuY#L$uPSIr$N4r;j{K) z+a`-XRqet&v8Rs)I7Mb-J)I;XxfNod1Nr1cdre0J?7%;^dPUbk?T~vYXK~SHKIk3I z4JoaAQC9h;b0im~Lb|*D0l{b7 zaFO0>JNN}eN(-1|bm@C920(m;z#VD1m23ksyFIs`D4$4+Zyb~m5XgjF-=FJ$8f{qpjJQJnuu!)&ki;r_J1x#8e zkG&m-GwaPDEo6D{3tmcm@-Ef-h5ZCp9(>Kv4n5*~`fUHl!#ol>rZJ@Xe>-Q7^Ka{?o55kIQf;wRlB9X>aRw?*do^ zbsI@SWW_Pg7;vOh)(k%jriERJrciQFCJ5sF^?aDct$;bO3wTs_`$)@J+`uFAPs%y- zCCYJhm2TxzVag+^sa`T0=laS;jV4-l?9`CIP3*Bf|Lz$WL+u>x7$F2a@GiV z_e5{(y3(?^wcCUhjPZV)LnY8qMxHOfugVx33&s9>p2(@L)ny(Mfr{d!MVWMGY3Rla^yZuYI#G$WjKV=`{0{0KdclTp%{ZYJqfTc zKm9N736)kzGbw#?yCMY$Szj=zx+5a&laAI;G?@ip-PKrDV+{Gie<(;ON9{yY*ohmS~lT8~o@UVb8@X&-tcehQ% zDt-03HN69Egy87P2=eBS2Ed?*lkG756IO#u@;*;ok2L!IWvYkJmrstpX z6uC3L%Q^(DSjGaEsDl2q7g_Vb*D^_InrURe=LoXR7%FInsZOyisN?MQ&feaB7|;lL z&t8orayH_lU?HW@%as)ssXzniIXUf|Ur=yi&MNv97cSjH+mG>43sR|2nM`PG{0>m0 z!?7D2_QH7I-`$+u(Vbeu^3u3)|Ds<(TnTu&AjuCp+{BG?e19muZ5h145m3|6I5|SD zKg_cd)2@f%YEeQI<0PF?Bk((uCyV1q622$6& zd#-|;5m9m!9;|CQ=sxAmhTPo}fUs`y zxVjAs)TPPGQ#Mq#l3jM9GsJ`DuJZ?vJ)1+^?RIkb#b&{ozWcOsx)4T-8=uH!cW9nm z2giOdOofUNETk918shm#G*=uf%%gOSK`*SGm?n5~s zHAPvnY$>%J8c^J^&mUnzUO|pc)%G5K^g+(3cRQ-O&~a^X>X9?W@g&qgI-9316I^0S z?;SJBtBi5M?SB(})7}5O+^V85YKoqGQSn&;ugwsV147~nZ@P)@5go}CN$OIFjq0{jZuR!;L>;&$EOMYETU8rth56D4(8Wl6$L$+@gyKcpzYN9iRzJ`;n~)c(j(%S9)${c)U0; zt`bC9qHsNkGhe=X_D*s_l}ewXqfsK0Tb5gZP;zq(`;se)7jCRdVlr~!nng%Zo{LrzB`cM@i?mEEIu3=NOl?ru{1e{L>OFvydJZ;6yT;0 zrUZSTk}xBFI=}RVY-{9}z|d*QWygYW5<{w!rlDN5(v-d$U7L4_&8Oc0Y|AQ)x9Gf6 zPCXTF=lY>LZa%L4wY$pk1%q_i-S`zqZ+kUV`L(n*%Bf>akDbVS^~q-f)fbrKI*MT= zBzU=|eQ_72T+hGb!4=13T*p+>cHJI2#LoF%?e+ugdML?Zt^KzR>!3g;-b+h(`I@I0 z2l+(agnlM<S;$bYIb=w29~g7dp-LuIR0T1DaD8EE=m~~?F{A9?2%j ziSaJb>o7eBA`&J@wNYGF5)cy>Ir6s>4*HHNy}pf^1%X|6UKIteEoaH8h*`xXH)C<%`uvAOO~ zMP^;EGPJrZ{|wJ+Mbd+W1O;{N#w0#!H58&jnd@;CpUXp?thBrLxz7F`sF!NRf!)@3 zki*oPaB_|eC2Y*qC<;}b&adX}9?myVL-l(bKmC0m`&^G>o%_o}rH+CsIvdN!uQNfs zg-e-u`y5D%rvsY4Lr1Uj;a)RW4W?TlgqXwEmdg-QWMe_OARN>b3n( zAVJ(4JtZLFCgdv=Cw>3gCuk|>U)6e3K9v2UfZML4nx2{ZO&&H7xE zo`2%|YJQlX<};t|zOMVeuj{>xb%SdTwf4rdsA_*>f3sPAuLHKxJPEa1F`#0|U98X+ zru0lkMsE$-cflsd_R~h!nD?wkTz|p*i4a>5o?!^CglSGqS47JJbEoa$pt|*Oizn7E z+IOrw7-gP;2=0|`ikTwdDQ#_7REg9qvKurdzYEpQ{7I4HpL& z9KOYmDm>M^r`qYY^}bH^&nGnIXpWb~eaXm_QfCzu%--DhWJ zeo)0xR0U!}t91F#GTpI~Kt(mSu$-_V>TmtHl7LLl>NmW1?Y5SkaW3OWB=798k?kza zz?R*J;E22uFneq-1z)92X zzDh~BOyg?UCO0N!ZKi2=l{g@o0 z|MS6L>}+hnIMG3!Z4X0F&!r9kI!r0jQd>)cvn)8lLfP>w;~|v@LUQs>dcK_g z+q+)CEpP(3uD(x%+FAPSM39P7ZON$W>%=K@{#!-^2o!vIS=p_}ViXE)i^t=*SclH44nFEs#K3+b)&cqAzV#3Ff;O^0T-$x~apjwe3?oVo0x=ylDe&vCE3W|~hbUK#h( zKEH~<%||M72QQmv;pI*?4Z_oay2|xtYZ*ZAc9Gkecup zxihnV4Qx60=_lWm79v7l$zu-}EYRzoYO-$Pzc4+j{-LD2$kax2orUTH^1{pHzClZ5 z!pW5ropegV>OB>96G~GlKBL&Lak>umKdzomdAd0k#T!hS0)Ws*(0m#h9vlqn92l@r zBGk)aTJZk6J0kJND348MFSEUk;L z(qKuhY2SvOiMhGDV6a(ALA+h9-^{<_|BmW`5|7@NaR*_wcvPInv7H4I@J#s`2W_#1 zk&%~e(~2%*r`hlC;&lPnTt?UzwDs>@!>mLU?;K z=C%8B-pg zU9r!C+6lW1yR9S$eu$In0@6z6^@geVsCR$-3U5+AV$eZK1K8-*DCtqZBdZRj8^! z&}KmiCF^xz4XXUNf+q%_yAo{8*}qO2#gT1 zp(Cm;fg4nx6emDu&FMwGX9yA3TI}8u9Q-%qx|@d@^~Ez^IK5>xQ#C=%xg>S{avZNW ztN<2Ztz#_xuJvgLwJ2tI!{W=XLwXR=%v8#Uec>I~ht5vVShKRkRgz}c^LJg%?#kKh zRuY@IGOS95J&J6s(1wnSkkEI~Gk0^F6NTDo4a%X{R`FUFZ;G!D;pSy~?6n8)g5(KV zx8ii03UsH*R^K^awbod0!)hf8{2YUVi3F5m%@Iuxk%fX!(ZO8fG%pP?7oDM2@uAz9 zChZpVs&%PlD9?(|i^$r2l@b&GkEGc^dTrbW{^D3eiwOSa4;auC_EPIjTlM#ZP z{yPqaZMkC2PFUWKASK}4;^CqnAKPl2;DT?I4ycU12P@PPpLEX;VOF%9_C+*{bl97y zI5yyrx0nCJ%Vca2}@UKXQLU1 zghOq_e5ws-Zhv>^6lGN{iI}H*X(Tsr^r7Z}=x#UO-#Zr;aE1>~staL;c|9In<6LP- z7Ps27qm(^8dXq;yo82+}E!O1&=a0ResyUWfu@#u$G~;70?IofUw(^e@J=~L9t;RWA zd6E2tQnT$?xX#a=Irk*fcjQ}2OJqO-vn=SLcZ-GyDC}EL`w7obIx4eFqEsZ)56h2AE+`Wz@+B=3ZYpq}6 zD~oooiavEoDSXvVG=SyjqIN?Pon?CcXGnq=EtnjniO^p<>Cm697P|Ej%m_nGj=nX_ zM=D?&1U*9`^%_oUgdW*HdROT`e#5r0jDWMe4~V{2*bxYSza0uF1yw1d)Fb}9d(yno zqa$DfnFwsJ>pqkWkWk<*uXSDyBY~)=JNO_kf}sK$JR|Pzgk=`QAMU$)9RyB{X@J7z z358u1C{@p1xqLabFh4()py~`7me0$}*+0F?1NM^+Oc(o#CmnMd594}ZmNgqZx~~() z6m#oe%*_~70Z*EeuMj<_7o-k4fqG9ch^a_f^WZ$8wR?n#Ibpc-adL776!J2)rS7+^ zMJ$krwYq%Dew1~nxbF!M&>4~Y!TB*zPE?#~(=$))oD+bM5K~4rVbOeGys%?BHx z8W5Fw!O-3l9IlrAuU$Y3d2%xCk^knSo%!Q7ZMmF9W_6ZSsEqcXzuJb>TG-Fe^9ruu zMu3}exRr*6+l%*#5i6A8Cf@U?gXf0fi%YF2sCRbwBl4I$P#VWqsn-zP%o8X# zm{A?(h^GQe|Ngrtn)plK^MC)me6FZT!z~@Nq;5eTSc`&3srX6$i0S!PvdbBL4`WT& z?QICm_MS~ zW${tP!(Wvow0Y|oL-__xJ0FXjbUr+ypYxY=Ccr6Nru3U?cK#EJ{w|7 zVRd8ZIcv8R(!gAPxAO_Xr?7ZKZE+wrB@c5V;KQ5*18bBT)i^S;(ahW&6XI@DgWD}Y z?-w&*)`Dwa%=G14`R8V+E21Il4+rWYDssSr9ByiE4!pSYz>)Qz_$doZ=`ev<5-rM_ zJ>I(jL_U^)R`Eei2{GPCD?>emmkaKGP91#A$iu_K?11x|y^^iSt0{IErCoyktTKv{ zc;dOXx@x_icL))9tc7|E);SFfSC=Rh3Ogpg7Wv+f*^=Lcx+7);VSS6E(m`^Wbw@`S~_Dx0*s2Q$G(tZ=|t?lSU&Kq^Ul5bk3JvU1v52Li$8WV3_k zqTWe`IiwXNz~=!>zn^t2&j3*A?K-bgfu6~NkBW*4SCf(Xz6~3il<8vs4ov1O^EJR( zOa+bxk&l9t`j2&x+QBi{6_=vLa^Yk{n5E*rQj6=Vk*Hz|>sV~SxAC`2Dl6@>;a2rw zwd!Gq5PbX(55al8?5GIRUfBEXDhilFPAg=v@D2$Jt1CAV>1gsZe_sF~Cp)#}_s4Z# z_s&`abk+c%%epyj0%ZV#^Bx8yky<#+TAm{n-WVr17x3iMEKw-oqR+2+4@n3$qw`1= zfd-FY@-&?YR9M>HqpG=fKv{@xj0y40``2^UGq}qGD40qGSk~qO%%Xf_%M$GE*}sUa z)4uL?ofCYj^XY*L0U&kZIuwx;|IyFBCcKV}=`wY%%Vk;es9Oq<0$!4(x`IM~eMLnD ze@-LXRcw)y{D3r}wGv{!vKNDFo(R-F72}4^7sJ(WPQ=)S&*tUsec?Wg*kiwa@F@C0 zd*Ud*c75n56>e&qXObF2Vb$lp*y383aX-4(Sxz8~^{c;FyrR1Lm@J%$y<1eva^y_T zN3@n$QCtJ-bJ36TW3qM1Lg2}Bzc&Exc^cAY*pqSB$@N+ zy)O{kju4@3)0QM^UPq{?80Z}wRO$(t#|^ORpX_rbE70#e?jw3jL=FyBYVB|bEDZTm00b8mdLGem z#$^Rb9b{fqJyG)d(%60*V2oi2xOVMi%p2BXkz|$FZ>&9-Wfd*6_jm@Y4ma20sDYs$ zWff{d@6j@1i%5t-KlF&3hi5S^8ndh%Ho=Shj20$g$6)shSE;SrOsYWp?M9ab<5YKnq-`iC`$;qiyY2SDx5rb&R6*?FvW3bik ztKD9#zDuQS!}XL%f|0Al2beD zVe!5`7+gCFBlD(Uhz>$D>9Vi4he0F><0c{&iJF&WJMQRqJCRh1vUhRG8ws&J$;GwR zlc9P$tQr=WG0>7dIb0Lu`}qtLV&v!@Mi>wg^tV7JX#ohccL5Z(EhHqQ26}V#mDUnt z?nB-SLqyfW-By8nByH4lqgUn0Mg_gDNf5gA0sj6Foi^frfr0U6uY1D*gtF@hxI2uR z4Prd(UV-w})5G^e4V zc`@Y^G}EoiS8JMQvV%N|z}`5>4G6@wU&9xHczFNk{DDAdh#b6j1S0Psh!BXE0zcml z{OG~&AN_s=zemCEK=_>tAjkg>g#TZUV23-umi@4``LlNFl1@+Os& +#include +#include +#define size_t long + +EXEC SQL INCLUDE SQLCA.H; +EXEC SQL INCLUDE SQLDA.H; +EXEC SQL INCLUDE ORACA.H; + +void connexion() +{ VARCHAR uid[50]; + char login[20]; + char passwd[20]; + printf("\n"); + strcpy(uid.arr,"palafour2"); + strcat(uid.arr,"/"); + strcat(uid.arr,"palafour2"); + strcat(uid.arr,"@kirov"); + uid.len=strlen(uid.arr); + EXEC SQL CONNECT :uid; + + if (sqlca.sqlcode==0) + printf(" Connexion réussie avec succès.\n\n"); + else + { + printf ("Problème à la connexion.\n\n"); + exit(1); + } +} +void deconnexion(int validation) +{ + if (validation == 1) + { + EXEC SQL COMMIT WORK RELEASE; + } + else + { + EXEC SQL ROLLBACK WORK RELEASE; + } + printf("\nDéconnexion sans problème.\n"); +} + + +void sql_error(char *msg) +{ + char err_msg[128]; + long buf_len, msg_len; + EXEC SQL WHENEVER SQLERROR CONTINUE; + printf("%s\n", msg); + buf_len = sizeof (err_msg); + sqlglm(err_msg, &buf_len, &msg_len); + if (msg_len > buf_len) + msg_len = buf_len; + printf("%.*s\n", msg_len, err_msg); + deconnexion(0); + exit(1); +} + + +void traitErreur(char *msg) +{ + EXEC SQL WHENEVER SQLERROR CONTINUE; + printf("%s\n", msg); + deconnexion(0); + exit(1); +} + + +void saisie(void) +{ +varchar nocl[4]; +varchar nom[80]; +varchar ville[80]; +int cp; + + printf("Saisir une nouveau client \n"); + printf("Entrer le nom du client : "); + scanf("%s",nom.arr); + nom.len=strlen(nom.arr); + printf("Entrer la ville du client : "); + scanf("%s",ville.arr); + ville.len=strlen(ville.arr); + + printf("Entrer le code postal du client : "); + scanf("%d",&cp); + + printf("Entrer le code du client : "); + scanf("%s",nocl.arr); + nocl.len=strlen(nocl.arr); + + EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); + + EXEC SQL INSERT INTO TClient2017 VALUES (:nocl,:nom,:ville,:cp); + + EXEC SQL COMMIT; +} + +void modification(void){ +varchar noclchange[4]; +varchar nomnew[80]; +varchar villenew[80]; +int cpnew; + +varchar nomold[80]; +varchar villeold[80]; +int cpold; + + printf("Modifier un client \n"); + + printf("Entrer le code du client a modifer : "); + scanf("%s",noclchange.arr); + noclchange.len=strlen(noclchange.arr); + + EXEC SQL WHENEVER SQLERROR DO sql_error("Oracle error\n"); + + EXEC SQL SELECT nom, ville, postal INTO :nomold, :villeold, :cpold FROM Tclient2017 WHERE NOCLIENT = :noclchange; + + printf("Nom: %s \n",nomold.arr); + printf("Ville: %s \n",villeold.arr); + printf("CP courant du client: %d \n ",cpold); + + printf("Modifier le nom du client : "); + scanf("%s",nomnew.arr); + nomnew.len=strlen(nomnew.arr); + printf("Modifier la ville du client : "); + scanf("%s",villenew.arr); + villenew.len=strlen(villenew.arr); + printf("Modifier le code postal du client : "); + scanf("%d",&cpnew); + + EXEC SQL UPDATE TClient2017 SET nom = :nomnew, ville = :villenew, postal = :cpnew WHERE noclient = :noclchange; + + EXEC SQL COMMIT; +} + + + +void suppression(void){ + +varchar noclchange[4]; +varchar nomnew[80]; +varchar villenew[80]; +int kmdeb; +int kmfin; +varchar noveh[4]; +varchar datedeb[30]; +varchar dateretour[30]; +int fini=1; + + printf("Supprimer un client \n"); + + printf("Entrer le code du client a supprimer : "); + scanf("%s",noclchange.arr); + noclchange.len=strlen(noclchange.arr); + + EXEC SQL DECLARE locencours CURSOR FOR SELECT noveh, datedeb, kmdeb, dateretprev FROM Tlocation2017 WHERE noclient =:noclchange ; + + EXEC SQL DECLARE locretour CURSOR FOR SELECT noveh, datedeb, kmdeb, kmfin, dateretour FROM Tlocatretour2017 WHERE noclient =:noclchange ; + + EXEC SQL OPEN locencours; + + while (fini=1) + { + EXEC SQL FETCH locencours INTO :noveh, :datedeb, :kmdeb, :dateretour; + printf("noveh: %s datedeb: %s kmdeb : %d date retour: %s \n",noveh.arr,datedeb.arr,kmdeb,dateretour.arr); + if (sqlca.sqlcode == 1403) fini=0; + } + + printf("en retour \n"); + + EXEC SQL CLOSE locencours; + + EXEC SQL OPEN locretour; + + fini=1; + while (fini=1) + { + EXEC SQL FETCH locretour INTO :noveh, :datedeb, :kmdeb, :kmfin, :dateretour; + printf("noveh: %s datedeb: %s kmdeb : %d kmfin : %d date retour: %s \n",noveh.arr,datedeb.arr,kmdeb,kmfin,dateretour.arr); + if (sqlca.sqlcode == 1403) fini=0; + } + + printf("Suppression en cours"); + + EXEC SQL CLOSE locretour; + + EXEC SQL DELETE FROM Tlocation2017 WHERE noclient =:noclchange ; + EXEC SQL DELETE FROM Tlocatretour2017 WHERE noclient =:noclchange ; + + EXEC SQL COMMIT; +} + + +void afficherclient (void){ + +varchar noclient[4]; +varchar nom[80]; +varchar ville[80]; +int postal; +int fini=1; + + printf("Affiche les clients \n"); + + EXEC SQL DECLARE clients CURSOR FOR SELECT noclient, nom, ville, postal FROM Tclient2017; + EXEC SQL OPEN clients; + + while (fini=1) + { + EXEC SQL FETCH clients INTO :noclient, :nom, :ville, :postal; + printf("numero client: %s nom: %s ville : %s CP: %d \n",noclient.arr,nom.arr,ville.arr,postal); + if (sqlca.sqlcode = 1403) fini = 0; + } + printf(" Fini \n"); + EXEC SQL CLOSE clients; +} + + +void afficherlocation (void){ + +varchar nocl[4]; +varchar nom[100][10]; + +varchar noveh[5]; + +varchar immat[50][10]; +varchar datedeb[50][30]; +varchar dateretour[50][30]; +int i; + + printf("Affiche les locations d'un client \n"); + printf("Entrer le numera du client : "); + scanf("%s",nocl.arr); + nocl.len=strlen(nocl.arr); + + EXEC SQL SELECT immat, datedeb, dateretour INTO :immat, :datedeb, :dateretour FROM Tvehicule2017, Tlocatretour2017 WHERE Tlocatretour2017.nocl = :nocl and Tlocatretour2017.noveh = Tvehicule2017.noveh ; + + printf("Il y a %d lignes selectionnees\n",sqlca.sqlerrd[2]); + i=0; + + while (i +#include +#include +#include + +EXEC SQL INCLUDE SQLCA.H; +EXEC SQL INCLUDE SQLDA.H; +EXEC SQL INCLUDE ORACA.H; + +#define CLEAR system("clear") + +/********** Constantes **********/ +#define CONTINUE 0 +#define DATE_LEN 11 +#define DEPT_LEN 3 +#define NOM_LEN 21 +#define NOT_FOUND 1403 +#define REFERENCE_LEN 5 +#define SQL_COMMIT 1 +#define SQL_ROLLBACK 0 +#define SQL_SUCCESS 0 +#define STOP 1 +#define UID_LEN 30 +#define VARCHAR_LEN 51 + +/********** Liste des fonctions **********/ +void connexion(void); +void erreur_sql(int arret); +void deconnexion(int validation); +void q1(void); +int q1bis(void); +void q2(void); +void q3(void); +void q4(void); +void q5(void); +void q6(void); +void q7(void); +/* + * Fonction de connexion à Oracle. + * + * Les identifiants sont rentrés en dur pour ne pas avoir à les retaper + * à la main à chaque test, mais dans l'idéal, on demande à l'utilisateur + * de les rentrer et on concatène les identifiants à uid.arr. + */ +void connexion(void) { + VARCHAR uid[UID_LEN]; + char identifiants[UID_LEN] = "danguyen1/danguyen1@kirov"; + printf("Connexion avec les identifiants suivants : %s .\n", identifiants); + strcpy(uid.arr, identifiants); + uid.len = strlen(uid.arr); + + EXEC SQL CONNECT :uid; + if (sqlca.sqlcode == SQL_SUCCESS) { + printf("Connexion réussie avec succès !\n\n"); + } + else { + printf("Connexion échouée !\n\n"); + exit(EXIT_FAILURE); + } +} + +/* + * Fonction qui affiche les code et message d'erreur SQL. + * + * Paramètres : + * arret STOP(1) pour quitter, n'importe quoi pour continuer + */ +void erreur_sql(int arret) { + printf("Code d'erreur : %d.\n", sqlca.sqlcode); + printf("Message erreur : %.*s.\n", sqlca.sqlerrm.sqlerrml, sqlca.sqlerrm.sqlerrmc); + if (arret == STOP) { + deconnexion(SQL_ROLLBACK); + exit(EXIT_FAILURE); + } +} + +/* + * Fonction de déconnexion. + * + * Paramètres : + * validation SQL_COMMIT(1) pour COMMIT, n'importe quoi pour ROLLBACK + */ +void deconnexion(int validation) { + if (validation == SQL_COMMIT) { + EXEC SQL COMMIT WORK RELEASE; + } + else { + EXEC SQL ROLLBACK WORK RELEASE; + } + printf("Déconnexion réussie, travail %s.\n", validation == 1 ? "enregistré" : "annulé"); +} + +/* + * Affiche le nombre de produits contenus dans la base (utilisée dans la question 3 + * car pas d'intérêt à être utilisée toute seule). + * + * Retourne : + * le nombre de produits contenus dans la base + */ +int q1(void) { + int nbProd; + EXEC SQL SELECT COUNT(*) INTO nbProd FROM TPRODUIT; + printf("Il y a %d produits en base.\n", nbProd); + return nbProd; +} + +/* + * Modifie un produit en affichant ses anciennes valeurs. + */ +void q2(void) { + char codeRayon[REFERENCE_LEN], dateStock[DATE_LEN], nCodeRayon[REFERENCE_LEN], nDateStock[DATE_LEN], noProd[REFERENCE_LEN]; + int choix, nStock, stock; + float nPrixV, prixV; + VARCHAR des[VARCHAR_LEN], nDes[VARCHAR_LEN]; + + printf("Saisir numéro produit : "); + scanf("%s%*c", noProd); + + EXEC SQL + SELECT des, stock, prixV, codeRayon, dateStock + INTO :des, :stock, :prixV, :codeRayon, :dateStock + FROM TPRODUIT + WHERE noProd = :noProd; + + printf("1 - Désignation : %.*s.\n", des.len, des.arr); + printf("2 - Stock : %d.\n", stock); + printf("3 - Prix de vente : %.2f€.\n", prixV); + printf("4 - Code rayon : %s.\n", codeRayon); + printf("5 - Date : %s.\n", dateStock); + + while (choix != 9) { + printf("Que voulez-vous modifier (9: quitter) ?\n"); + scanf("%d%*c", &choix); + + switch (choix) { + case 1: + printf("Entrez la nouvelle désignation : "); + fgets(nDes, sizeof nDes, stdin); + if (nDes[strlen(nDes) - 1] == '\n') { + nDes[strlen(nDes) - 1] = '\0'; + } + EXEC SQL + UPDATE TPRODUIT + SET des = :nDes + WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) { + erreur_sql(STOP); + } + break; + case 2: + printf("Entrez le nouveau stock : "); + scanf("%d%*c", &nStock); + EXEC SQL + UPDATE TPRODUIT + SET stock = :nStock + WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) { + erreur_sql(STOP); + } + break; + case 3: + printf("Entrez le nouveau prix : "); + scanf("%f%*c", &nPrixV); + EXEC SQL + UPDATE TPRODUIT + SET prixV = :nPrixV + WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) { + erreur_sql(STOP); + } + break; + case 4: + printf("Entrez le nouveau code rayon : "); + scanf("%s", &nCodeRayon); + EXEC SQL + UPDATE TPRODUIT + SET codeRayon = :nCodeRayon + WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) { + erreur_sql(STOP); + } + break; + case 5: + printf("Entrez la date : "); + scanf("%s", &nDateStock); + EXEC SQL + UPDATE TPRODUIT + SET dateStock = :nDateStock + WHERE noProd = :noProd; + if (sqlca.sqlcode < SQL_SUCCESS) { + erreur_sql(STOP); + } + break; + default: + printf("Choix inconnu.\n"); + break; + } + EXEC SQL COMMIT; + } +} + +/* + * Affiche le nombre de produits en base et les affiche. + */ +void q3(void) { + char noProd[REFERENCE_LEN], codeRayon[REFERENCE_LEN], dateStock[DATE_LEN]; + int cpt = 0, nbProd, stock; + float prixV; + VARCHAR des[REFERENCE_LEN1]; + + nbProd = q1bis(); + if (nbProd > 0) { + EXEC SQL + DECLARE cprod CURSOR FOR + SELECT noProd, des, stock, prixV, codeRayon, dateStock + FROM TPRODUIT; + EXEC SQL OPEN cprod; + EXEC SQL FETCH cprod INTO :noProd, :des, :stock, :prixV, :codeRayon, :dateStock; + + while (sqlca.sqlcode != NOT_FOUND) { + printf("----- Produit n°%d -----\n", ++cpt); + printf("Numéro produit : %s.\n", noProd); + printf("Désignation : %.*s.\n", des.len, des.arr); + printf("Stock : %d.\n", stock); + printf("Prix de vente : %.2f.\n", prixV); + printf("Code rayon : %s.\n", codeRayon); + printf("Date stock : %s.\n", dateStock); + EXEC SQL + FETCH cprod INTO :noProd, :des, :stock, :prixV, :codeRayon, :dateStock; + if (sqlca.sqlcode < SQL_SUCCESS) { + erreur_sql(STOP); + } + } + EXEC SQL CLOSE cprod; + } +} + +/* + * Ajoute un produit saisi. + */ +void q4(void) { + char choix, noProd[REFERENCE_LEN], dateStock[DATE_LEN]; + int stock; + float prixV; + short indicateurDes = 0, indicateurStock = 0, indicateurPrixV = 0, indicateurCodeRayon = 0, indicateurDateStock = 0; + VARCHAR des[VARCHAR_LEN]; + + printf("Saisir numéro produit : "); + scanf("%s%*c", noProd); + printf("Saisir une désignation (O/*) ? "); + scanf("%c%*c", &choix); + if (toUpper(choix) == 'O') { + printf("Saisir la désignation : "); + fgets(des, sizeof des, stdin); + if (des[strlen(des) - 1] == '\n') { + des[strlen(des) - 1] = '\0'; + } + } + else { + indicateurDes = -1; + } + + printf("Saisir un stock (O/*) ? "); + scanf("%c%*c", &choix); + if (toUpper(choix) == 'O') { + printf("Saisir le stock : "); + scanf("%d%*c", &stock); + } + else { + indicateurStock = -1; + } + + printf("Saisir un prix de vente : "); + scanf("%c%*c", &choix); + if (toUpper(choix) == 'O') { + printf("Saisir le prix de vente : "); + scanf("%f%*c", &prixV); + } + else { + indicateurPrixV = -1; + } + + printf("Saisir un code rayon (O/*) ? "); + scanf("%c%*c", &choix); + if (toUpper(choix) == 'O') { + printf("Saisir le code rayon : "); + scanf("%d%*c", codeRayon); + } + else { + indicateurCodeRayon = -1; + } + + if (indicateurStock == 0) { + EXEC SQL + SELECT SYSDATE + INTO :dateStock + FROM DUAL; + + } + else { + indicateurDateStock = -1; + } + + EXEC SQL + INSERT INTO TPRODUIT + VALUES( + :noProd, + :des INDICATOR :indicateurDes, + :stock INDICATOR :indicateurStock, + :codeRayon INDICATOR :indicateurCodeRayon, + :dateStock INDICATOR :indicateurDateStock + ); + + EXEC SQL COMMIT; +} + +/* + * Affiche les produits d'un fournisseur saisi. + */ +void q5(void) { + char noProd[REFERENCE_LEN], refFourn[REFERENCE_LEN]; + printf("Saisir référence fournisseur : "); + scanf("%s%*c", refFourn); + + EXEC SQL + DECLARE cprod CURSOR FOR + SELECT noProd + FROM TPRODUITFOURN + WHERE pf.refFourn = :refFourn; + + EXEC SQL OPEN cprod; + + EXEC SQL FETCH cprod INTO :noProd; + if (sqlca.sqlcode == NOT_FOUND) { + printf("Aucun produit trouvé !\n"); + } + + printf("Liste des numéros de produits pour ce fournisseur :\n"); + while (sqlca.sqlcode != NOT_FOUND) { + printf("\t%s\n", noProd); + EXEC SQL FETCH cprod INTO :noProd; + + } + + EXEC SQL + CLOSE cprod; +} + +/* + * Enregistre un fournisseur saisi. + */ +void q6(void) { + char refFourn[REFERENCE_LEN], dept[DEPT_LEN]; + VARCHAR nom[NOM_LEN]; + + printf("Saisir la référence fournisseur : "); + scanf("%s%*c", refFourn); + printf("Saisir le département : "); + scanf("%s%*c", dept); + printf("Saisir le nom du fournisseur : "); + fgets(nom, sizeof nom, stdin); + if (nom[strlen(nom) - 1] == '\n') { + nom[strlen(nom) - 1] = '\0'; + } + + EXEC SQL + INSERT INTO TFOURNISSEUR + VALUES(:refFourn, :nom, :dept); + + EXEC SQL COMMIT; +} + +/* + * Supprime un fournisseur en prenant le soin de supprimer ses produits de la table de liaison. + */ +void q7(void) { + char refFourn[REFERENCE_LEN]; + + printf("Saisir la référence du fournisseur à supprimer : "); + scanf("%s%*c", refFourn); + + EXEC SQL + DELETE FROM TPRODUITFOURN + WHERE refFourn = :refFourn; + + EXEC SQL + DELETE FROM TFOURNISSEUR + WHERE refFourn = :refFourn; +} + +/* + * Fonction principale. + * + * Paramètres : + * argc Le nombre d'arguments + * argv Le tableau d'arguments + * + * Retourne : + * le code de retour défini dans stdlib.h + * (EXIT_SUCCESS = 0) + */ +int main(int argc, char const *argv[]) { + int validation; + + CLEAR; + + connexion(); + + EXEC SQL + WHENEVER SQLERROR + DO erreur_sql(STOP); + + // qX(); + + printf("Enregistrer le travail ? (1 = oui, * = non)\n"); + scanf("%d%*c", &validation); + deconnexion(validation); + + return EXIT_SUCCESS; +} diff --git a/EXOS/Exam2019-annexe.tex b/EXOS/Exam2019-annexe.tex new file mode 100644 index 0000000..e585b23 --- /dev/null +++ b/EXOS/Exam2019-annexe.tex @@ -0,0 +1,174 @@ +\documentclass[a4paper,11pt]{article} + +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{url} +\usepackage{comment} +\usepackage{fancyhdr}% fancy header +\usepackage{multirow} +\usepackage{slashbox} + +\usepackage{color, colortbl} +\definecolor{Gray}{gray}{0.9} +\usepackage{adjustbox} +\usepackage{slashbox} +%\usepackage{times} +\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes} +\usetikzlibrary{decorations.pathreplacing} + +\usepackage{pdfpages} + +\usepackage{fancyvrb} + +\fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries ~\leftmark } + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + +\usepackage{amsmath} +\usepackage{amsthm} + + + +\theoremstyle{definition} +\newtheorem{exercice}{Exercice} + +\pagestyle{monstyle} + +\usepackage{amsmath} +\usepackage{amsthm} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} +\usepackage{setspace} + + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +\cachefalse % version prof +%\cachetrue % version etudiant + + + +\begin{document} + +\section*{NBA} + +\begin{verbatim} + +CREATE TABLE JOUEUR(id_joueur CHAR(6) PRIMARY KEY, +Nom VARCHAR2(20), +Prenom VARCHAR2(20), +Date_de_naissance DATE, +Taille NUMBER, +Poste char(2) constraint c_poste CHECK (Poste IN('PG','SG','SF','PF','C'))); + +CREATE TABLE EQUIPE(id_equipe CHAR(6) PRIMARY KEY, +Nom VARCHAR2(20), +Ville VARCHAR2(20), +Conference VARCHAR2(5) constraint c_conf check (Conference in('Est','Ouest')), +Date_creation DATE); + +CREATE TABLE GAME(id_game CHAR(6) PRIMARY KEY, +Date_game DATE, +id_equipe_domicile CHAR(6) references EQUIPE, +id_equipe_exterieur CHAR(6) references EQUIPE, +Ville VARCHAR2(20), +Categorie char(7) constraint c_type check (Categorie in('Amical','Saison','Playoff','Allstar')), +Score_domicile NUMBER, +Score_exterieur NUMBER, +Prolongation NUMBER); + +CREATE TABLE JOUE(id_joueur CHAR(6) references JOUEUR, +id_game CHAR(6) references GAME, +Points NUMBER, +Rebonds NUMBER, +Interceptions NUMBER, +Contres NUMBER, +Passes NUMBER, +Balles_perdues NUMBER, +Fautes NUMBER, +PRIMARY KEY(id_joueur,id_game)); + + +CREATE TABLE APPARTIENT(id_contrat CHAR(6) PRIMARY KEY, +id_joueur CHAR(6) references JOUEUR, +id_equipe CHAR(6) references EQUIPE, +Date_debut DATE, +Date_fin DATE, +Salaire_jour NUMBER); +\end{verbatim} +\newpage + +\subsection*{HOPITAL} + +\begin{verbatim} + +CREATE TABLE FONCTION(id_fonction CHAR(6) PRIMARY KEY, +Designation VARCHAR(20), +Salaire NUMBER); + +CREATE TABLE HOPITAL(id_hopital CHAR(6) PRIMARY KEY, +Nom VARCHAR(20), +Ville VARCHAR(20), +Date_creation DATE); + + +CREATE TABLE PATIENT(id_patient CHAR(6) PRIMARY KEY, +Nom VARCHAR(20), +Prenom VARCHAR(20), +Date_naissance DATE); + +CREATE TABLE PERSONNEL(id_personnel CHAR(6) PRIMARY KEY, +id_fonction CHAR(6) references FONCTION, +id_hopital CHAR(6) references HOPITAL, +Nom VARCHAR(20), +Prenom VARCHAR(20)); + + +CREATE TABLE AFFECTATION(id_contrat CHAR(6) PRIMARY KEY, +id_personnel CHAR(6) references PERSONNEL, +id_patient CHAR(6) references PATIENT, +Date_debut DATE, +Date_fin DATE); +\end{verbatim} + + +\end{document} diff --git a/EXOS/Exam2019.tex b/EXOS/Exam2019.tex new file mode 100644 index 0000000..300dae7 --- /dev/null +++ b/EXOS/Exam2019.tex @@ -0,0 +1,663 @@ +\documentclass[a4paper,11pt]{article} + +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{url} +\usepackage{comment} +\usepackage{fancyhdr}% fancy header +\usepackage{multirow} +\usepackage{slashbox} + +\usepackage{color, colortbl} +\definecolor{Gray}{gray}{0.9} +\usepackage{adjustbox} +\usepackage{slashbox} +%\usepackage{times} +\usepackage{tikz,pgflibraryarrows,pgffor,pgflibrarysnakes} +\usetikzlibrary{decorations.pathreplacing} + +\usepackage{pdfpages} + +\usepackage{fancyvrb} + +\fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries ~\leftmark } + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + +\usepackage{amsmath} +\usepackage{amsthm} + + + +\theoremstyle{definition} +\newtheorem{exercice}{Exercice} + +\pagestyle{monstyle} + +\usepackage{amsmath} +\usepackage{amsthm} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} +\usepackage{setspace} + + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +\cachefalse % version prof +%\cachetrue % version etudiant + + + +\begin{document} + + +\begin{center} + NOM : \hfill Examen \hfill~\\ + PRENOM : \hfill 90 minutes, 75 points \hfill ~\\ + GROUPE : \hfill Aucun document autoris\'e \hfill~\\ + +\end{center} + +\section*{PL/SQL : NBA Statistiques} +Ci-dessous un mod\`ele de la base de donn\'ees de statistiques de la +NBA (National Basketball Association), o\`u PG, SG, SF, PF et C sont +les diff\'erents postes occup\'es par les joueurs sur le terrain. Un +joueur ne peut pas \^etre en activit\'e dans deux \'equipes en m\^eme temps. + +\begin{center} + \begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}] + +\node (i) at (6,0) {\begin{varwidth}{1.5in} +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}CONTRAT\\ +\hline +\underline{id\_contrat}\\ +\#id\_joueur\\ +\#id\_equipe\\ +Date\_debut\\ +Date\_fin\\ +Salaire\_jour\\ \hline +\end{tabular} +\end{varwidth} +}; + + +\node (a) at (0,0) {\begin{varwidth}{2.5in} +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}JOUEUR\\ +\hline +\underline{id\_joueur}\\ +Nom\\ +Pénom\\ +Date\_de\_naissance\\ +Taille\\ +Poste('PG','SG','SF','PF','C')\\ +\hline +\end{tabular} +\end{varwidth} +}; + + +\node (f) at (8,-5) {\begin{varwidth}{2.5in} +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}Match\\ +\hline +\underline{id\_match}\\ +Date\_match\\ +\#id\_equipe\_domicile\\ +\#id\_equipe\_exterieur\\ +Ville\\ +Categorie(Amical,Saison,Playoff,Allstar)\\ +Score\_domicile\\ +Score\_exterieur\\ +Prolongation\\ +\hline +\end{tabular} +\end{varwidth} +}; + +\node[draw,rectangle] (g) at (0,-5) {\begin{varwidth}{2in} +\begin{tabular}{l} + \rowcolor{Gray}JOUE\\ + \hline + \underline{\#id\_joueur}\\ + \underline{\#id\_match}\\ + Points\\ + Rebonds\\ + Interceptions\\ + Contres\\ + Passes\\ + Balles\_perdues\\ + Fautes\\ +\end{tabular} +\end{varwidth}}; + + + +\node[draw,rectangle] (c) at (11,0) { +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}EQUIPE\\ +\hline +\underline{id\_equipe}\\ +Nom\\ +Ville\\ +Conference('Est','Ouest')\\ +Date\_creation\\ +\hline +\end{tabular} +}; + +\draw[-latex] (i) -- (a); +\draw[-latex] (i) -- (c); +\draw[-latex] (10,-2.6) -- (10.65,-1.5); +\draw[latex-] (c) -- (f); +\draw[latex-] (f) -- (g); +\draw[latex-] (a) -- (g); + + \end{tikzpicture} +\end{center} + +% \newpage + +\begin{exercice}[NBA, PLSQL] (30 points) +Le MLD ci-dessus stocke les donn\'ees des matchs NBA. + +\begin{enumerate} +\item (15 points) \'Ecrire un code PL/SQL qui, pour un + \code{id\_joueur} saisi par l'utilisateur, liste dans une table + \code{TLIGNES} son maximum de points lors d'un match de sa + carri\`ere. La solution propos\'ee doit mettre en place deux + m\'ecanismes un avec et un sans \code{EXCEPTION} pour traiter les + cas d'erreurs suivants : + \begin{itemize} + \item \code{'joueur inconnu'}, il n'y a pas le joueur dans la table \code{JOUEUR}, + \item \code{'joueur n a pas fait de match'}, il n'apparait pas + dans la table \code{JOUE}. + \end{itemize} + +\begin{SaveVerbatim}{Maxpoints} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off; set verify off; set feedback off; + +variable vidjoueur char(4) +prompt Entrer la reference du joueur : +accept vidjoueur + +DECLARE +dmaxpoint number; +dnbjoueur number; +didjoueur char(4); + +BEGIN +SELECT count(Nom) INTO dnbjoueur FROM JOUEUR WHERE id_joueur ='&vidjoueur'; + +if dnbjoueur != 0 then + +SELECT max(points) INTO dmaxpoint FROM JOUE +WHERE id_joueur ='&vidjoueur'; + +INSERT INTO tligne VALUES ('Max points de'||'&vidjoueur'||' : '||to_char(dmaxpoint)); +ELSE +INSERT INTO tligne VALUES('count detecte numero du joueur pas bon'); + +SELECT id_joueur INTO didjoueur FROM JOUEUR +WHERE id_joueur ='&vidjoueur'; +end if; + +EXCEPTION +when no_data_found then +INSERT INTO tligne VALUES('exception numero du joueur pas bon'); +end ; +. +/ + +SELECT * FROM tligne ; +set verify on; set feedback on; set echo on; +\end{SaveVerbatim} + +%% \cache{%\begin{small} +%% \BUseVerbatim{Maxpoints} +%% % \end{small} +%} + + +\item (15 points) \'Ecrire un code PL/SQL qui liste dans une table + \code{TLIGNES} les joueurs en activit\'e (ayant une date de fin de + contrat non nulle) du plus vieux au plus jeune. + +\begin{center} +\begin{verbatim} + Nom Prenom Date de naissance Nom Equipe Actuelle + XXXXXX XXXXXXX XX/XX/XXXX XXXXXXXX + XXXXXX XXXXXXX XX/XX/XXXX XXXXXXXX + XXXXXX XXXXXXX XX/XX/XXXX XXXXXXXX + ... +\end{verbatim} +\end{center} + +\begin{SaveVerbatim}{Joueur} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off; +set verify off; +set feedback off; + +DECLARE +dnom varchar2(20); +dprenom varchar2(20); +ddate date; +dnomequipe varchar2(20); + +CURSOR c IS SELECT j.Nom, j.Prenom, j.Date_de_naissance, e.Nom FROM JOUEUR j, APPARTIENT a, EQUIPE e +WHERE a.id_joueur = j.id_joueur and e.id_equipe = a.id_equipe and a.Date_fin is NULL +Order by Date_de_naissance; + +BEGIN +OPEN c; + +INSERT INTO tligne VALUES ('Nom Prenom Date de naissance Nom Equipe Actuelle'); +FETCH c INTO dnom, dprenom, ddate, dnomequipe; + +WHILE c%found +LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||to_char(ddate)||' '||dnomequipe); + FETCH c INTO dnom, dprenom, ddate, dnomequipe; +END LOOP; + +CLOSE C; +END; +. +/ + +SELECT * FROM tligne ; +set verify on; +set feedback on; +set echo on; +\end{SaveVerbatim} + +%% \cache{%\begin{small} +%% \BUseVerbatim{Joueur} +%% % \end{small} +%% } + +%% \item (20 points) Lister dans une table \code{TLIGNES} tous les +%% joueurs ayant particip\'e \`a un ALLSTAR de la conf\'erence Est et +%% ceux de la conf\'erence Ouest avec les informations suivantes : +%% \begin{center} +%% \begin{small} +%% \begin{verbatim} +%% ALLSTAR MATCH +%% EQUIPE de l'EST +%% Nom Prenom Poste Equipe Actuelle +%% XXXXXX XXXXXXX XXXXXX XXXXXXXX +%% XXXXXX XXXXXXX XXXXXX XXXXXXXX +%% EQUIPE de l'EST +%% Nom Prenom Poste Equipe Actuelle +%% XXXXXX XXXXXXX XXXXXX XXXXXXXX +%% XXXXXX XXXXXXX XXXXXX XXXXXXXX +%% \end{verbatim} +%% \end{small} +%% \end{center} + + +\begin{SaveVerbatim}{Allstar} +DECLARE +dnom varchar2(20); dprenom varchar2(20); +dposte char(2); dnomequipe varchar2(20); + +CURSOR Cest IS SELECT j.Nom, j.Prenom, j.Poste, e.Nom FROM JOUEUR j, +APPARTIENT a, EQUIPE e WHERE a.id_joueur = j.id_joueur and e.id_equipe += a.id_equipe and e.conference='Est' and j.id_joueur in (SELECT +id_joueur FROM JOUE je, GAME g where g.Categorie='Allstar' and +g.id_game=je.id_game); + +CURSOR Couest IS SELECT j.Nom, j.Prenom, j.Poste, e.Nom FROM JOUEUR j, +APPARTIENT a, EQUIPE e WHERE a.id_joueur = j.id_joueur and e.id_equipe += a.id_equipe and e.conference='Ouest' and j.id_joueur in (SELECT +id_joueur FROM JOUE je, GAME g where g.Categorie='Allstar' and +g.id_game=je.id_game); + +BEGIN +INSERT INTO tligne VALUES ('ALLSTAR GAME); +INSERT INTO tligne VALUES ('Conference Est'); +INSERT INTO tligne VALUES ('Nom Prenom Poste Nom Equipe Actuelle'); +OPEN Cest; +FETCH Cest INTO dnom, dprenom, dposte, dnomequipe; +WHILE Cest%found LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||dposte||' '||dnomequipe); + FETCH Cest INTO dnom, dprenom, dposte, dnomequipe; +END LOOP; +CLOSE Cest; +INSERT INTO tligne VALUES ('Conference Ouest'); +OPEN Couest; +INSERT INTO tligne VALUES ('Nom Prenom Poste Nom Equipe Actuelle'); +FETCH Couest INTO dnom, dprenom, dposte, dnomequipe; +WHILE Couest%found LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||dposte||' '||dnomequipe); + FETCH Couest INTO dnom, dprenom, dposte, dnomequipe; +END LOOP; +CLOSE Couest; +END; +. +/ +SELECT * FROM tligne ; +\end{SaveVerbatim} + +%% \cache{\begin{footnotesize} +%% \BUseVerbatim{Allstar} +%% \end{footnotesize} +%% } +\end{enumerate} + +\end{exercice} + + + +\begin{center} + \begin{tikzpicture}[every node/.style={inner sep=0,outer sep=0}] + +\node (a) at (5,-4) {\begin{varwidth}{1.5in} +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}AFFECTATION\\ +\hline +\underline{id\_contrat}\\ +\#id\_personnel\\ +\#id\_patient\\ +Date\_debut\\ +Date\_fin\\ \hline +\end{tabular} +\end{varwidth} +}; + + +\node (f) at (0,0) {\begin{varwidth}{2.5in} +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}FONCTION\\ +\hline +\underline{id\_fonction}\\ +Designation\\ +Salaire\\ +\hline +\end{tabular} +\end{varwidth} +}; + + +\node (p) at (5,0) {\begin{varwidth}{2.5in} +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}PERSONNEL\\ +\hline +\underline{id\_personnel}\\ +\#id\_fonction\\ +\#id\_hopital\\ +Nom\\ +Prenom\\ +\hline +\end{tabular} +\end{varwidth} +}; + +\node[draw,rectangle] (pa) at (0,-4) {\begin{varwidth}{2in} +\begin{tabular}{l} + \rowcolor{Gray}PATIENT\\ + \hline + \underline{id\_patient}\\ + Nom\\ + Prenom\\ + Date\_naissance\\ +\end{tabular} +\end{varwidth}}; + + + +\node[draw,rectangle] (h) at (9,0) { +\begin{tabular}{|l|} +\hline +\rowcolor{Gray}HOPITAL\\ +\hline +\underline{id\_hopital}\\ +Nom\\ +Ville\\ +Date\_creation\\ +\hline +\end{tabular} +}; + +\draw[-latex] (p) -- (f); +\draw[-latex] (p) -- (h); +\draw[latex-] (p) -- (a); +\draw[latex-] (pa) -- (a); + + \end{tikzpicture} +\end{center} + +\begin{exercice}[Pro C] (45 points) + \begin{enumerate} + \item (30 points) En utilisant les curseurs, \'ecrire un programme + Pro C qui permet d'afficher le nom et pr\'enom des membres du + personnel par hopital en indiquant pour chacun le nombre de + patients suivis et par ordre alphab\'etique des pr\'enoms ayant la + forme suivante : \\ + +\begin{SaveVerbatim}{Affichage} +Personnels de l’hopital XXXXX : + 1) Nom : XXXXXX Prenom : XXXXX Salaire: XXXXX Nombre de patients : ZZ + 2) Nom : XXXXXX Prenom : XXXXX Salaire: XXXXX Nombre de patients : ZZ + 3) Nom : XXXXXX Prenom : XXXXX Salaire: XXXXX Nombre de patients : ZZ + ... +Nombre de patients total sur l'hopital : ZZ1 +Nombre de personnels total sur l'hopital : ZZ2 + +Personnels de l’hopital XXXXX : + 1) Nom : XXXXXX Prenom : XXXXX Salaire: XXXXX Nombre de patients : ZZ + 2) Nom : XXXXXX Prenom : XXXXX Salaire: XXXXX Nombre de patients : ZZ + 3) Nom : XXXXXX Prenom : XXXXX Salaire: XXXXX Nombre de patients : ZZ + ... +Nombre de patients total sur l'hopital : ZZ1 +Nombre de personnels total sur l'hopital : ZZ2 +... +\end{SaveVerbatim} + +% \cache{%\begin{small} + \BUseVerbatim{Affichage} + %\end{small} + % } + + Sachant que la valeur de \code{salaire} peut ne pas \^etre + renseignée, il faudra donc g\'erer ce cas. + \item (15 points) \'Ecrire un programme Pro C qui permet d'ins\'erer un nouveau + membre du personnel. Les valeurs saisies par l'utilisateurs seront + ins\'er\'ees dans la table \code{PERSONNEL}. + \begin{itemize} + \item V\'erifier que la fonction existe d\'ej\`a ainsi que l'hopital. + \item + V\'erifier aussi que l'\code{id\_personnel} n'existe pas d\'ej\`a, s'il + existe alors afficher les caract\'eristiques du personnel existant. + \end{itemize} + %% \item 'Ecrire un programme Pro C qui permet de renter une nouvelle + %% affectation entre un patient et un membre du pesonnel. V\'erifier + %% que le patient et le personel existent d\'ej\`a. + + \begin{SaveVerbatim}{Insertion} +TODO +\end{SaveVerbatim} + +%% \cache{%\begin{small} +%% \BUseVerbatim{Insertion} +%% % \end{small} +%% } + + \end{enumerate} +\end{exercice} + + + +\section*{Rappels} +Les fonctions \code{connexion}, \code{deconnexion} et \code{sql\_error} +sont rappell\'ees ci-dessous. Elles ne sont pas \`a r\'e\'ecrire sur +vos copies, mais \`a utiliser dans les exercices si besoin. + +\begin{verbatim} +void connexion() +{ VARCHAR uid[50]; + char login[20]; + char passwd[20]; + printf("Donner votre login : "); + scanf("%s",login); + printf("\nDonnez votre mot de passe Oracle : "); + scanf("%s",passwd); + printf("\n"); + strcpy(uid.arr,login); + strcat(uid.arr,"/"); + strcat(uid.arr,passwd); + strcat(uid.arr,"@kirov"); + uid.len=strlen(uid.arr); + + EXEC SQL CONNECT :uid; + if (sqlca.sqlcode==0) + printf(" Connexion réussie avec succès.\n\n"); + else + { + printf ("Problème à la connexion.\n\n"); + exit(1); + }} +\end{verbatim} + + +\begin{verbatim} +void deconnexion(int validation) +{ + if (validation == 1) + { EXEC SQL COMMIT WORK RELEASE; + } else + { EXEC SQL ROLLBACK WORK RELEASE;} + printf("Déconnexion sans problème.\n"); +} +\end{verbatim} + +\begin{verbatim} +void sql_error(char *msg) +{ char err_msg[128]; + long buf_len, msg_len; + + EXEC SQL WHENEVER SQLERROR CONTINUE; + + printf("%s\n", msg); + buf_len = sizeof (err_msg); + sqlglm(err_msg, &buf_len, &msg_len); + + if (msg_len > buf_len) + msg_len = buf_len; + + printf("%.*s\n", msg_len, err_msg); + deconnexion(0); + exit(1); +} +\end{verbatim} + + +\section*{MEMO} +\subsection*{Langage PL/SQL} + +\begin{verbatim} +DECLARE + variable_PL/SQL {type SQL | nom_table.nom_colonne%TYPE | nom_table%ROWTYPE} ; + CURSOR curseur IS SELECT … ; + nom_exception EXCEPTION; +BEGIN + OPEN curseur ; + FETCH curseur INTO liste de variables ; + curseur%FOUND + CLOSE curseur ; + RAISE nom_exception ; + SELECT liste_de_sélection INTO liste de variables FROM … WHERE … ORDER BY ... ; + Variable PL/SQL := ‘&variable_ SQLPlus’ … + IF … THEN … [ELSE …] END IF ; + WHILE … LOOP … END LOOP ; +EXCEPTION + WHEN nom_exception THEN …; + WHEN NO_DATA_FOUND THEN … ; + WHEN OTHERS THEN … : +END ; +\end{verbatim} + +\subsection*{Langage PRO*C} +\begin{verbatim} +struct {long sqlcode;/* code resultant de l'exécution + =0 -> ok, + >0 -> ok avec un code d'état, + <0 -> erreur */ + struct { + unsigned short sqlerrml;/*longueur du message*/ + char sqlerrmc[70];/*message d'erreur*/ + } sqlerrm; + long sqlerrd[6];/* seul sqlerrd[2] est utilisé -> donne le nombre de lignes modifiées + UPDATE ou rajoutées par INSERT ou ramenées par un SELECT*/ + char sqlwarn[8];/*sqlwarn[0] 'W’ -> warning*/ + sqlwarn[0] = '' /*-> pas de warning*/ + sqlwarn[1] = 'W'/*-> troncation numérique ou char*/ + sqlwarn[2] = 'W'/*-> valeur Null est ignore */ + sqlwarn[3] = 'W'/*-> plus de champs dans SELECT que de variables pour recevoir*/ + sqlwarn[4] = 'W'/*-> toutes les lignes d'une table sont touchées (par DELETE ou + UPDATE par exemple)*/ + sqlwarn[5] /* inutilisé */ + sqlwarn[6] = 'W'/*-> Oracle a dû exécuter un rollback */ + sqlwarn[7] = 'W'/*-> la donnée ramenée par un FETCH a été modifié + depuis que la clause SELECT a été executé */ +} sqlca; +:var_hote INDICATOR :indicateur +:var_hote :indicateur +\end{verbatim} + +%\includepdf[pages=-]{MEMO.pdf} + +\end{document} diff --git a/EXOS/Partiel2019.tex b/EXOS/Partiel2019.tex new file mode 100644 index 0000000..84a28fe --- /dev/null +++ b/EXOS/Partiel2019.tex @@ -0,0 +1,288 @@ +\documentclass[a4paper,11pt]{article} + +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{url} +\usepackage{comment} +\usepackage{fancyhdr}% fancy header +\usepackage{adjustbox} +\usepackage{slashbox} +%\usepackage{times} + +\usepackage{fancyvrb} + +\fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries ~\leftmark } + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + +\usepackage{amsmath} +\usepackage{amsthm} + + + +\theoremstyle{definition} +\newtheorem{exercice}{Exercice} + +\pagestyle{monstyle} + +\usepackage{amsmath} +\usepackage{amsthm} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} +\usepackage{setspace} + + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +%\cachefalse % version prof +\cachetrue % version etudiant + + + +\begin{document} + + +\begin{center} + NOM : \hfill Partiel \hfill~\\ + PRENOM : \hfill 90 minutes, 75 points \hfill ~\\ + GROUPE : \hfill Aucun document autoris\'e \hfill~\\ + +\end{center} + +\begin{exercice}D\'efinitions (15 points) + \begin{enumerate} + \item (3 points) Expliquer ce qu'est une exception. + \cache{Une exception permet de r\'ealiser un traitement lors + qu'une erreur SQL se produit.} + \item (4 points) Donner un exemple d'utilisation de l'exception + \verb+NO_DATA_FOUND+. + \newsavebox\avecalter + \begin{lrbox}{\avecalter} + \begin{minipage}{\textwidth} +\begin{verbatim} +Declare +begin +Select nom into dnom FROM ELEVE Where age < 0; +EXCEPTION +when no_data_found then +INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||'Age negatif') ; +End; +. +/ +\end{verbatim} + \end{minipage} +\end{lrbox} + \cache{\usebox\avecalter} + + \item (2+2+4=8 points) Donner un exemple simple qui n’est pas possible de + traiter sans un curseur, expliquer pourquoi et montrer comment + créer un curseur et comment l'utiliser dans ce cas là. + + \begin{SaveVerbatim}{VerbEnv} +Declare +dnom Etudaint.nom%TYPE ; +Cursor r is Select nom from Etudiant FOR UPDATE; +BEGIN +OPEN r ; +FETCH r INTO dnom ; +WHILE r%FOUND +LOOP + UPDATE Etudiant SET nom=dnom||'old' WHERE CURRENT of r ; + FETCH r INTO dnom ; +END LOOP ; +COMMIT; +CLOSE R ; +END ; + \end{SaveVerbatim} + \cache{\code{Select nom into dnom from Etudiant ;} + + ici la liste des noms ne va pas pouvoir rentrer dans dnom. + + Il faut donc utiliser un cureur : +\BUseVerbatim{VerbEnv} + +} \end{enumerate} +\end{exercice} + +\newpage + +\begin{exercice}[Soldes] (20 points) +Afin de préparer les soldes d’hiver, écrivez un fichier de commandes +SQL qui, pour un produit saisi par l’utilisateur, si le stock est plus +grand que 100 alors le prix est diminué de 10\% et si le stock plus +grand que 200 alors le prix est diminué de 20\%. Enfin si le stock est +vide alors ajouter dans la table \code{Tligne} une phrase pour +indiquer qu’il faut recommander ce produit en donnant son numéro de +produit. +\end{exercice} + +\begin{SaveVerbatim}{VerbSolde} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; +set echo off ; set verify off ; set feed off; + +variable vnoproduit char(4) +prompt Entrer la reference du fournisseur : +accept vnoproduit + +DECLARE +dstock number; + +BEGIN +SELECT count(stock) INTO dstock +FROM Tproduit +Where noproduit=’&vnoproduit’; + +If dstock = 0 then + INSERT INTO tligne VLAUES (‘Stock Null pour ce produit + ’||’&vnoporduit’||’Recommander ’) ; + End if; +If dstock >200 then + UPDATE Tproduit SET prixv=dprix*1.2 WHERE noproduit=’&vnoproduit’; + Else If dstock > 100 then + UPDATE Tproduit SET prixv=dprix*1.1 WHERE noproduit=’&vnoproduit’; +End if; +End; +. +/ +SELECT * FROM tligne ; +set verify on ; set feed on ; set echo on ; +\end{SaveVerbatim} +\cache{%\begin{small} + \BUseVerbatim{VerbSolde} +% \end{small} +} + +\newpage +\begin{exercice}[Fournisseur] (20 points) +Ecrire un fichier de commandes SQL qui demande un numéro de produit et +qui retourne le message ‘le produit n’a pas de fournisseur’ ou ‘le +produit a plusieurs fournisseurs’, ou le 'Nom' du fournisseur s’il +n’en a qu’un. Le résultat sera placé dans une table \code{Tligne + (LIGNE varchar2(200))} et contiendra le message et le code d’erreur +produit par Oracle. +\end{exercice} + +\begin{SaveVerbatim}{Verbfour} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off ; set verify off ; set feed off ; + +variable vreffourn char(4) +prompt Entrer la reference du produit : +accept vnoproduit + +DECLARE +dnomfour char(20) ; +dreffour char(4) + +BEGIN +SELECT refourn INTO dreffour FROM Tproduitfourn +WHERE nopoduit ='&vnoproduit' ; + +SELECT Nom INTO dnomfour FROM TFounisseur +Where ref-fourn='dreffour; + +INSERT INTO tligne VALUES (dnomfour) ; + +EXCEPTION +when no_data_found then +INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||' Le produit +n''a pas de fournisseur' ) ; +when too_many_rows then +INSERT INTO tligne VALUES(O_CHAR(SQLCODE)||' '||SQLERRM||' Le produit a +plusieurs fournieeurs) ; +End ; +. +/ +SELECT * FROM tligne ; +set verify on ; set feed on ; set echo on ; +\end{SaveVerbatim} + +\cache{%\begin{small} + \BUseVerbatim{Verbfour} +% \end{small} +} + +\newpage +\begin{exercice}[Curseur] (20 points) +Ecrivez un fichier de commandes SQL qui diminue de 10\% les prix des +produits qui ont un stock de plus de 500. +\end{exercice} +\begin{SaveVerbatim}{Verbcinq} +set echo off ; set verify off ; set feed off ; + +Declare +dprix Tproduit.prix%TYPE ; + +CURSOR r IS SELECT prixv FROM Tproduit WHERE Tproduit.stock >500 +FOR UPDATE ; + +BEGIN +OPEN r ; +FETCH r INTO dprix ; +WHILE r%FOUND +LOOP +UPDATE Tproduit SET prixv=dprix*1.1 WHERE CURRENT of r ; + FETCH r INTO dprix ; +END LOOP ; +COMMIT ; +CLOSE R ; +END ; +. +/ +set verify on ; set feed on ; set echo on ; +\end{SaveVerbatim} +\cache{%\begin{small} + \BUseVerbatim{Verbcinq} +% \end{small} +} + +%\newpage + +\section*{Rappel} + \begin{center} + \includegraphics[width=14cm]{BD.png} + \end{center} + +\end{document} diff --git a/EXOS/Partiel2020.tex b/EXOS/Partiel2020.tex new file mode 100644 index 0000000..84a28fe --- /dev/null +++ b/EXOS/Partiel2020.tex @@ -0,0 +1,288 @@ +\documentclass[a4paper,11pt]{article} + +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage[a4paper,hmargin=20mm,vmargin=30mm]{geometry}%\usepackage{fullpage} +\usepackage{url} +\usepackage{comment} +\usepackage{fancyhdr}% fancy header +\usepackage{adjustbox} +\usepackage{slashbox} +%\usepackage{times} + +\usepackage{fancyvrb} + +\fancypagestyle{monstyle}{ +%\fancyhead{} +\renewcommand{\headrulewidth}{1pt} +%% %\renewcommand{\footrulewidth}{0.4pt} + +% \fancyhead[LE]{\slshape \thepage/ \pageref{LastPage}} +%% \fancyhead[RO]{\slshape \thepage/ \pageref{LastPage}} + + +%\fancyhf{} +%\fancyhead[LE]{\slshape LE} +%\fancyhead[CE]{\slshape CE} +%\fancyhead[RE]{\slshape RE} + +\fancyhead[LO]{\bfseries 2018-2019 BD PLS/SQL\rightmark} +%\fancyhead[CO]{\slshape APF} +\fancyhead[RO]{\bfseries ~\leftmark } + +%% %\fancyfoot{} +% \fancyfoot[LE,RO]{} + \fancyfoot[CO,CE]{}%\slshape\thepage/\pageref{LastPage}} +%% %\fancyfoot[LO,RE]{\small\slshape \ddmmyyyydate version du \today} + +} + +% \pagestyle{fancy} + +\usepackage{amsmath} +\usepackage{amsthm} + + + +\theoremstyle{definition} +\newtheorem{exercice}{Exercice} + +\pagestyle{monstyle} + +\usepackage{amsmath} +\usepackage{amsthm} + +\newcommand{\code}[1]{\texttt{#1}} + +\usepackage{boxedminipage} +\usepackage{setspace} + + +\newsavebox\svbx +\newif\ifcache +\long\def\cache#1{\ \newline + \setbox\svbx=\vbox{\leavevmode \newline \begin{spacing}{1}#1\end{spacing}} + \smallskip\par\noindent + \begin{boxedminipage}{\linewidth} + \ifcache + \leavevmode\hrule height 0pt\vskip \ht\svbx\hrule height 0pt + \else \unvbox\svbx + \fi + \end{boxedminipage} + \par\smallskip} + + +%\cachefalse % version prof +\cachetrue % version etudiant + + + +\begin{document} + + +\begin{center} + NOM : \hfill Partiel \hfill~\\ + PRENOM : \hfill 90 minutes, 75 points \hfill ~\\ + GROUPE : \hfill Aucun document autoris\'e \hfill~\\ + +\end{center} + +\begin{exercice}D\'efinitions (15 points) + \begin{enumerate} + \item (3 points) Expliquer ce qu'est une exception. + \cache{Une exception permet de r\'ealiser un traitement lors + qu'une erreur SQL se produit.} + \item (4 points) Donner un exemple d'utilisation de l'exception + \verb+NO_DATA_FOUND+. + \newsavebox\avecalter + \begin{lrbox}{\avecalter} + \begin{minipage}{\textwidth} +\begin{verbatim} +Declare +begin +Select nom into dnom FROM ELEVE Where age < 0; +EXCEPTION +when no_data_found then +INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||'Age negatif') ; +End; +. +/ +\end{verbatim} + \end{minipage} +\end{lrbox} + \cache{\usebox\avecalter} + + \item (2+2+4=8 points) Donner un exemple simple qui n’est pas possible de + traiter sans un curseur, expliquer pourquoi et montrer comment + créer un curseur et comment l'utiliser dans ce cas là. + + \begin{SaveVerbatim}{VerbEnv} +Declare +dnom Etudaint.nom%TYPE ; +Cursor r is Select nom from Etudiant FOR UPDATE; +BEGIN +OPEN r ; +FETCH r INTO dnom ; +WHILE r%FOUND +LOOP + UPDATE Etudiant SET nom=dnom||'old' WHERE CURRENT of r ; + FETCH r INTO dnom ; +END LOOP ; +COMMIT; +CLOSE R ; +END ; + \end{SaveVerbatim} + \cache{\code{Select nom into dnom from Etudiant ;} + + ici la liste des noms ne va pas pouvoir rentrer dans dnom. + + Il faut donc utiliser un cureur : +\BUseVerbatim{VerbEnv} + +} \end{enumerate} +\end{exercice} + +\newpage + +\begin{exercice}[Soldes] (20 points) +Afin de préparer les soldes d’hiver, écrivez un fichier de commandes +SQL qui, pour un produit saisi par l’utilisateur, si le stock est plus +grand que 100 alors le prix est diminué de 10\% et si le stock plus +grand que 200 alors le prix est diminué de 20\%. Enfin si le stock est +vide alors ajouter dans la table \code{Tligne} une phrase pour +indiquer qu’il faut recommander ce produit en donnant son numéro de +produit. +\end{exercice} + +\begin{SaveVerbatim}{VerbSolde} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; +set echo off ; set verify off ; set feed off; + +variable vnoproduit char(4) +prompt Entrer la reference du fournisseur : +accept vnoproduit + +DECLARE +dstock number; + +BEGIN +SELECT count(stock) INTO dstock +FROM Tproduit +Where noproduit=’&vnoproduit’; + +If dstock = 0 then + INSERT INTO tligne VLAUES (‘Stock Null pour ce produit + ’||’&vnoporduit’||’Recommander ’) ; + End if; +If dstock >200 then + UPDATE Tproduit SET prixv=dprix*1.2 WHERE noproduit=’&vnoproduit’; + Else If dstock > 100 then + UPDATE Tproduit SET prixv=dprix*1.1 WHERE noproduit=’&vnoproduit’; +End if; +End; +. +/ +SELECT * FROM tligne ; +set verify on ; set feed on ; set echo on ; +\end{SaveVerbatim} +\cache{%\begin{small} + \BUseVerbatim{VerbSolde} +% \end{small} +} + +\newpage +\begin{exercice}[Fournisseur] (20 points) +Ecrire un fichier de commandes SQL qui demande un numéro de produit et +qui retourne le message ‘le produit n’a pas de fournisseur’ ou ‘le +produit a plusieurs fournisseurs’, ou le 'Nom' du fournisseur s’il +n’en a qu’un. Le résultat sera placé dans une table \code{Tligne + (LIGNE varchar2(200))} et contiendra le message et le code d’erreur +produit par Oracle. +\end{exercice} + +\begin{SaveVerbatim}{Verbfour} +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off ; set verify off ; set feed off ; + +variable vreffourn char(4) +prompt Entrer la reference du produit : +accept vnoproduit + +DECLARE +dnomfour char(20) ; +dreffour char(4) + +BEGIN +SELECT refourn INTO dreffour FROM Tproduitfourn +WHERE nopoduit ='&vnoproduit' ; + +SELECT Nom INTO dnomfour FROM TFounisseur +Where ref-fourn='dreffour; + +INSERT INTO tligne VALUES (dnomfour) ; + +EXCEPTION +when no_data_found then +INSERT INTO tligne VALUES(TO_CHAR(SQLCODE)||' '||SQLERRM||' Le produit +n''a pas de fournisseur' ) ; +when too_many_rows then +INSERT INTO tligne VALUES(O_CHAR(SQLCODE)||' '||SQLERRM||' Le produit a +plusieurs fournieeurs) ; +End ; +. +/ +SELECT * FROM tligne ; +set verify on ; set feed on ; set echo on ; +\end{SaveVerbatim} + +\cache{%\begin{small} + \BUseVerbatim{Verbfour} +% \end{small} +} + +\newpage +\begin{exercice}[Curseur] (20 points) +Ecrivez un fichier de commandes SQL qui diminue de 10\% les prix des +produits qui ont un stock de plus de 500. +\end{exercice} +\begin{SaveVerbatim}{Verbcinq} +set echo off ; set verify off ; set feed off ; + +Declare +dprix Tproduit.prix%TYPE ; + +CURSOR r IS SELECT prixv FROM Tproduit WHERE Tproduit.stock >500 +FOR UPDATE ; + +BEGIN +OPEN r ; +FETCH r INTO dprix ; +WHILE r%FOUND +LOOP +UPDATE Tproduit SET prixv=dprix*1.1 WHERE CURRENT of r ; + FETCH r INTO dprix ; +END LOOP ; +COMMIT ; +CLOSE R ; +END ; +. +/ +set verify on ; set feed on ; set echo on ; +\end{SaveVerbatim} +\cache{%\begin{small} + \BUseVerbatim{Verbcinq} +% \end{small} +} + +%\newpage + +\section*{Rappel} + \begin{center} + \includegraphics[width=14cm]{BD.png} + \end{center} + +\end{document} diff --git a/EXOS/hopital-setup.sql b/EXOS/hopital-setup.sql new file mode 100644 index 0000000..ff6c0bd --- /dev/null +++ b/EXOS/hopital-setup.sql @@ -0,0 +1,68 @@ +DROP TABLE PERSONNEL cascade constraints; +DROP TABLE AFFECTATION ; + +DROP TABLE FONCTION cascade constraints; +DROP TABLE PATIENT cascade constraints; +DROP TABLE HOPITAL cascade constraints; + +CREATE TABLE FONCTION(id_fonction CHAR(6) PRIMARY KEY, +Designation VARCHAR(20), +Salaire NUMBER); + +CREATE TABLE HOPITAL(id_hopital CHAR(6) PRIMARY KEY, +Nom VARCHAR(20), +Ville VARCHAR(20), +Date_creation DATE); + + +CREATE TABLE PATIENT(id_patient CHAR(6) PRIMARY KEY, +Nom VARCHAR(20), +Prenom VARCHAR(20), +Date_naissance DATE); + +CREATE TABLE PERSONNEL(id_personnel CHAR(6) PRIMARY KEY, +id_fonction CHAR(6) references FONCTION, +id_hopital CHAR(6) references HOPITAL, +Nom VARCHAR(20), +Prenom VARCHAR(20)); + + +CREATE TABLE AFFECTATION(id_contrat CHAR(6) PRIMARY KEY, +id_personnel CHAR(6) references PERSONNEL, +id_patient CHAR(6) references PATIENT, +Date_debut DATE, +Date_fin DATE); + +insert into HOPITAL values ('H01','CHU G MONPIED','CLERMONT','01-Jan-1980'); +insert into HOPITAL values ('H02','CHU ESTAING','CLERMONT','01-Jan-2010'); +insert into HOPITAL values ('H03','Chataigneraie','BEAUMONT','01-Jan-2000'); + +insert into FONCTION values ('F01','Docteur',8000); +insert into FONCTION values ('F02','Psy',11000); +insert into FONCTION values ('F03','ORL',10000); + +insert into PERSONNEL values ('PE01','F03','H03','Who','John'); +insert into PERSONNEL values ('PE02','F02','H01','Jekyll','Henry'); +insert into PERSONNEL values ('PE03','F01','H02','Watson','James'); +insert into PERSONNEL values ('PE04','F02','H03','Palmer','Jimmy'); +insert into PERSONNEL values ('PE05','F01','H01','Mallard','Donald'); +insert into PERSONNEL values ('PE06','F03','H02','Blacke','Penelope'); + +insert into PATIENT values ('PA01','Marley','Bob','04-Apr-2001'); +insert into PATIENT values ('PA02','Hendrix','Jimmy','04-Apr-1998'); +insert into PATIENT values ('PA03','Dupont','Paul','04-Apr-1990'); +insert into PATIENT values ('PA04','Springsteen','Bruce','24-Apr-1990'); +insert into PATIENT values ('PA05','Jackson','Michael','14-Apr-1990'); +insert into PATIENT values ('PA06','Georges','Paul','04-Apr-1991'); + +insert into AFFECTATION values ('A01','PE01','PA01','04-Jan-1980',NULL); +insert into AFFECTATION values ('A02','PE02','PA02','04-Jan-1981',NULL); +insert into AFFECTATION values ('A03','PE03','PA03','04-Jan-1981','04-Jan-2010'); +insert into AFFECTATION values ('A04','PE04','PA04','04-Jan-1981','04-Jan-2010'); +insert into AFFECTATION values ('A05','PE05','PA05','04-Jan-1981','04-Jan-2010'); +insert into AFFECTATION values ('A06','PE06','PA06','04-Jan-1981','04-Jan-2010'); + + + + + diff --git a/EXOS/nba-q1.sql b/EXOS/nba-q1.sql new file mode 100644 index 0000000..e6b1e9a --- /dev/null +++ b/EXOS/nba-q1.sql @@ -0,0 +1,48 @@ +@nba-setup.sql; + +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off; +set verify off; +set feedback off; + +variable vidjoueur char(4) +prompt Entrer la reference du joueur : +accept vidjoueur + +DECLARE +dmaxpoint number; +dnbjoueur number; +didjoueur char(4); + +BEGIN + +SELECT count(Nom) INTO dnbjoueur FROM JOUEUR +WHERE id_joueur ='&vidjoueur'; + +if dnbjoueur != 0 then + +SELECT max(points) INTO dmaxpoint FROM JOUE +WHERE id_joueur ='&vidjoueur'; + +INSERT INTO tligne VALUES ('Le maximum de point du joueur '||'&vidjoueur'||' est '||to_char(dmaxpoint)); +ELSE +INSERT INTO tligne VALUES('AVEC COUNT : Joueur inconnu'); +end if; + +SELECT id_joueur INTO didjoueur FROM JOUE +WHERE id_joueur ='&vidjoueur'; + + +EXCEPTION +when no_data_found then +INSERT INTO tligne VALUES('AVEC EXCEPTION : Joueur n a pas fait de match'); +end ; +. +/ + +SELECT * FROM tligne ; +set verify on; +set feedback on; +set echo on; diff --git a/EXOS/nba-q2.sql b/EXOS/nba-q2.sql new file mode 100644 index 0000000..f4b44a2 --- /dev/null +++ b/EXOS/nba-q2.sql @@ -0,0 +1,41 @@ +@nba-setup.sql; + +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off; +set verify off; +set feedback off; + +DECLARE +dnom varchar2(20); +dprenom varchar2(20); +ddate date; +dnomequipe varchar2(20); + +CURSOR c IS SELECT j.Nom, j.Prenom, j.Date_de_naissance, e.Nom FROM JOUEUR j, APPARTIENT a, EQUIPE e +WHERE a.id_joueur = j.id_joueur and e.id_equipe = a.id_equipe and a.Date_fin is NULL +Order by Date_de_naissance; + + +BEGIN +OPEN c; + +INSERT INTO tligne VALUES ('Nom Prenom Date de naissance Nom Equipe Actuelle'); +FETCH c INTO dnom, dprenom, ddate, dnomequipe; + +WHILE c%found +LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||to_char(ddate)||' '||dnomequipe); + FETCH c INTO dnom, dprenom, ddate, dnomequipe; +END LOOP; + +CLOSE C; +END; +. +/ + +SELECT * FROM tligne ; +set verify on; +set feedback on; +set echo on; diff --git a/EXOS/nba-q3.sql b/EXOS/nba-q3.sql new file mode 100644 index 0000000..c7c5c7e --- /dev/null +++ b/EXOS/nba-q3.sql @@ -0,0 +1,72 @@ +@nba-setup.sql; + +DROP TABLE tligne ; +CREATE TABLE tligne (ligne varchar2(100)) ; + +set echo off; +set verify off; +set feedback off; + +variable vannee number +prompt Entrer une annee : +accept vannee + +DECLARE +dnom varchar2(20); +dprenom varchar2(20); +dposte char(2); +dnomequipe varchar2(20); + +CURSOR Cest IS SELECT j.Nom, j.Prenom, j.Poste, e.Nom FROM JOUEUR j, +APPARTIENT a, EQUIPE e WHERE a.id_joueur = j.id_joueur and e.id_equipe += a.id_equipe and e.conference='Est' and j.id_joueur in (SELECT +id_joueur FROM JOUE je, GAME g where g.Categorie='Allstar' and +g.id_game=je.id_game); + +CURSOR Couest IS SELECT j.Nom, j.Prenom, j.Poste, e.Nom FROM JOUEUR j, +APPARTIENT a, EQUIPE e WHERE a.id_joueur = j.id_joueur and e.id_equipe += a.id_equipe and e.conference='Ouest' and j.id_joueur in (SELECT +id_joueur FROM JOUE je, GAME g where g.Categorie='Allstar' and +g.id_game=je.id_game); + +BEGIN + +INSERT INTO tligne VALUES ('ALLSTAR GAME'||'&vannee'); +INSERT INTO tligne VALUES ('Conference Est'); + +OPEN Cest; + +INSERT INTO tligne VALUES ('Nom Prenom Poste Nom Equipe Actuelle'); +FETCH Cest INTO dnom, dprenom, dposte, dnomequipe; + +WHILE Cest%found +LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||dposte||' '||dnomequipe); + FETCH Cest INTO dnom, dprenom, dposte, dnomequipe; +END LOOP; + +CLOSE Cest; + +INSERT INTO tligne VALUES ('Conference Ouest'); + +OPEN Couest; + +INSERT INTO tligne VALUES ('Nom Prenom Poste Nom Equipe Actuelle'); + +FETCH Couest INTO dnom, dprenom, dposte, dnomequipe; +WHILE Couest%found +LOOP + INSERT INTO tligne VALUES (dnom||' '||dprenom||' '||dposte||' '||dnomequipe); + FETCH Couest INTO dnom, dprenom, dposte, dnomequipe; +END LOOP; + +CLOSE Couest; + +END; +. +/ + +SELECT * FROM tligne ; +set verify on; +set feedback on; +set echo on; diff --git a/EXOS/nba-setup.sql b/EXOS/nba-setup.sql new file mode 100644 index 0000000..d194e06 --- /dev/null +++ b/EXOS/nba-setup.sql @@ -0,0 +1,88 @@ +DROP TABLE JOUE; +DROP TABLE GAME; +DROP TABLE APPARTIENT cascade constraints; +DROP TABLE JOUEUR cascade constraints; +DROP TABLE EQUIPE cascade constraints; + +CREATE TABLE JOUEUR(id_joueur CHAR(6) PRIMARY KEY, +Nom VARCHAR2(20), +Prenom VARCHAR2(20), +Date_de_naissance DATE, +Taille NUMBER, +Poste char(2) constraint c_poste CHECK (Poste IN('PG','SG','SF','PF','C'))); + +CREATE TABLE EQUIPE(id_equipe CHAR(6) PRIMARY KEY, +Nom VARCHAR2(20), +Ville VARCHAR2(20), +Conference VARCHAR2(5) constraint c_conf check (Conference in('Est','Ouest')), +Date_creation DATE); + +CREATE TABLE GAME(id_game CHAR(6) PRIMARY KEY, +Date_game DATE, +id_equipe_domicile CHAR(6) references EQUIPE, +id_equipe_exterieur CHAR(6) references EQUIPE, +Ville VARCHAR2(20), +Categorie char(7) constraint c_type check (Categorie in('Amical','Saison','Playoff','Allstar')), +Score_domicile NUMBER, +Score_exterieur NUMBER, +Prolongation NUMBER); + +CREATE TABLE JOUE(id_joueur CHAR(6) references JOUEUR, +id_game CHAR(6) references GAME, +Points NUMBER, +Rebonds NUMBER, +Interceptions NUMBER, +Contres NUMBER, +Passes NUMBER, +Balles_perdues NUMBER, +Fautes NUMBER, +PRIMARY KEY(id_joueur,id_game)); + + +CREATE TABLE APPARTIENT(id_contrat CHAR(6) PRIMARY KEY, +id_joueur CHAR(6) references JOUEUR, +id_equipe CHAR(6) references EQUIPE, +Date_debut DATE, +Date_fin DATE, +Salaire_jour NUMBER); + +insert into JOUEUR values ('J00001','Jordan','Michael','01-Jan-1980','193','SF'); +insert into JOUEUR values ('J00002','Bird','Larry','02-Jan-1980','194','SF'); +insert into JOUEUR values ('J00003','Johnson','Magic','03-Jan-1980','201','PG'); +insert into JOUEUR values ('J00004','Thomas','Isiah','04-Jan-1980','185','PG'); +insert into JOUEUR values ('J00005','Oneil','Shaquille','04-Jan-1992','185','C'); +insert into JOUEUR values ('J00006','Parker','Tony','04-Jan-1996','185','PG'); + + +insert into EQUIPE values ('E00001','Bulls','Chicago','Est','04-Jan-1970'); +insert into EQUIPE values ('E00002','Lakers','LA','Ouest','06-Jan-1970'); +insert into EQUIPE values ('E00003','Pistons','Detroit','Est','07-Jan-1970'); +insert into EQUIPE values ('E00004','Celtics','Boston','Est','09-Jan-1970'); +insert into EQUIPE values ('E00005','Spurs','San Antonio','Ouest','06-Jan-1971'); + +insert into APPARTIENT values ('C00001','J00001','E00001','04-Jan-1980',NULL,10000); +insert into APPARTIENT values ('C00002','J00002','E00004','04-Jan-1981',NULL,1000); +insert into APPARTIENT values ('C00003','J00003','E00002','04-Jan-1981','04-Jan-2010',3000); +insert into APPARTIENT values ('C00004','J00004','E00003','04-Jan-1982',NULL,5000); +insert into APPARTIENT values ('C00005','J00005','E00002','04-Jan-1990',NULL,5000); +insert into APPARTIENT values ('C00006','J00006','E00005','04-Jan-1990',NULL,5000); + +insert into GAME values ('G00001','04-Jan-2001','E00002','E00001','Londres','Saison',100,101,0); +insert into GAME values ('G00002','04-Jan-2001','E00003','E00004','Boston','Saison',102,101,0); +insert into GAME values ('G00003','04-May-2001','E00004','E00003','Detroit','Playoff',107,101,0); +insert into GAME values ('G00004','04-Apr-2001','E00001','E00002','Miami','Allstar',105,101,0); +insert into GAME values ('G00005','04-Apr-2001','E00001','E00003','Miami','Allstar',105,101,0); +insert into GAME values ('G00006','04-Apr-2001','E00001','E00004','Miami','Allstar',105,101,0); + +insert into JOUE values ('J00006','G00004',17,18,1,0,1,3,4); +insert into JOUE values ('J00005','G00004',17,18,1,0,1,3,4); +insert into JOUE values ('J00002','G00004',17,18,1,0,1,3,4); +insert into JOUE values ('J00003','G00004',17,18,1,0,1,3,4); +insert into JOUE values ('J00001','G00006',17,18,1,0,1,3,4); +insert into JOUE values ('J00003','G00006',17,18,1,0,1,3,4); +insert into JOUE values ('J00003','G00005',17,18,1,0,1,3,4); +insert into JOUE values ('J00004','G00004',17,18,1,0,1,3,4); +insert into JOUE values ('J00001','G00003',20,10,4,1,2,2,3); +insert into JOUE values ('J00001','G00002',19,11,3,2,2,1,2); +insert into JOUE values ('J00001','G00001',18,12,2,3,1,0,1); +