
    h'b                     	   S SK JrJrJr  S SKJr  S SKJrJr  S SK	J
r
  S SKJr  SSKJrJrJrJrJrJrJrJrJr  SSKJr  SS	KJrJrJr  S S
KrS S
Kr\" 5       r\ " S5        \ " S5        \ " S5        Sr!Sr"\ " S\! 35        \ " S\RF                  RI                  \!5       35        \ " S\RF                  RK                  \!5       35         \&" \!SSS9 r'\RP                  " \'5      r)S
S
S
5        \ " S\*" \)5       S35        \ " S\" 35        \ " S\RF                  RI                  \"5       35        \ " S\RF                  RK                  \"5       35        S0 0r-\RF                  RI                  \"5      (       Ga`   \ " S5        \&" \"SSS9 r'\'R]                  5       r/\ " S\*" \/5       S35        \ " S\/S
S  S35        S
S
S
5        \ " S 5        \&" \"SSS9 r'\RP                  " \'5      r-S
S
S
5        \ " S!5        \ " S"5        \ " S#\0" \-5       35        \ " S$\1" \-Re                  5       5       35        S\-;   a  \-S   r3\ " S%\0" \35       35        \ " S&\*" \35       35        \ " S'5        \4" \3Re                  5       S( S)9 HQ  r5\3\5   Rm                  S*S+5      r7\3\5   Rm                  S,/ 5      r8\ " S-\5 S.\0" \55      Rr                   S/\7 S0\8 35        MS     O\ " S15        O\ " S75        \ " S85        S0 0r-\ " S5        \ " S95        \ " S:5         " S; S<\5      r? " S= S>\5      r@S? rAS@ rBSA rC0 rD \1" \E" \SB/ 5      5      rF\G" \F5       H-  u  rHrI\J" SC \R                  " 5        5       S
5      rL\L\ISD.\D\H'   M/     \ " SF\D5        SG\MSH\
SI\\M   4SJ jrNSK\MSI\\M   4SL jrOSM\\M   4SN jrPSO rQ\R                  SP5      \" \5      4SQ\@SH\
4SR jj5       rSg
! , (       d  f       GN= f! \+ a  r,\ " S\, 35        / r) S
r,C,GNS
r,C,ff = f! , (       d  f       GNE= f! , (       d  f       GN,= f! \Rt                   a<  r,\ " S2\, 35        \ " S3\,Rv                   S4\,Rx                   35        S0 0r- S
r,C,GNxS
r,C,f\+ a8  r,\ " S5\, 35        S S
K=r=\ " S6\=R|                  " 5        35        S0 0r- S
r,C,GNS
r,C,ff = f! \+ a  r,\ " SE\, 35         S
r,C,GNPS
r,C,ff = f)S    )	APIRouterHTTPExceptionDepends)	BaseModel)ListOptional)Session)select   )	odd_classifierodd_label_encoder	odd_namesnature_classifiernature_label_encodernature_namescible_classifierindicateur_classifierhierarchy_data)get_db)Activity	DirectionMinistryNzQ
================================================================================u9   🔍 DÉBOGAGE DÉTAILLÉ DU CHARGEMENT DES FICHIERS JSONzP================================================================================z9C:\Users\dev29\xamp\htdocs\models\cibles_indicateurs.jsonz;C:\Users\dev29\xamp\htdocs\models\ministry_odd_mapping.jsonu   
📁 Vérification de: z   Existe? z   Chemin absolu: rzutf-8)encodingu      ✅ Chargé avec succès: u    élémentsu      ❌ Erreur: mappingsu      📖 Lecture du fichier...u      📏 Taille du fichier: u    caractèresu"      📝 Premiers 200 caractères:
   ...u   
   🔄 Parsing JSON...u       ✅ JSON parsé avec succès!u   
   📊 Structure du JSON:z      Type: u         Clés principales: z      Type de 'mappings': u         Nombre de ministères: u*   
   🔑 Toutes les clés dans 'mappings':c                     [        U 5      $ Nintxs    TC:\Users\dev29\xamp\htdocs\model ia 1\micro-service python\app\routers\activities.py<lambda>r%   D   s    SV    keyministry_nameN/Aodd_idsu         • Clé: '	' (type:    ) → u    → ODDs: u8         ⚠️  Clé 'mappings' non trouvée dans le JSON!u      ❌ Erreur de parsing JSON: z      Position: ligne z
, colonne u      ❌ Erreur inattendue:       Traceback:
u      ❌ Fichier non trouvé!u7      💡 Essayez de créer le fichier à cet emplacementu   ✅ CHARGEMENT TERMINÉzQ================================================================================
c                   *    \ rS rSr% \\S'   \\S'   Srg)ActivityItem^   nameid N)__name__
__module____qualname____firstlineno__str__annotations__r!   __static_attributes__r4   r&   r$   r0   r0   ^   s    
IGr&   r0   c                   &    \ rS rSr% \\   \S'   Srg)ActivitiesRequestb   
activitiesr4   N)r5   r6   r7   r8   r   r0   r:   r;   r4   r&   r$   r=   r=   b   s    \""r&   r=   c                 b    U (       d  gU S   n[        U[        5      (       a  U(       a  US   $ U$ )u9   Retourne le premier dict d'une liste ou liste imbriquée.Nr   )
isinstancelist)predsfirsts     r$   get_first_predictionrE   f   s.    !HE%5QxLr&   c                     SS K n[        XR                  5      (       a  [        U 5      $ [        XR                  5      (       a  [        U 5      $ [        XR                  5      (       a  [        U 5      $ U $ )Nr   )numpyrA   integerr!   floatingfloatbool_bool)objnps     r$   	to_nativerO   o   sT    #zz""3x#{{##Sz#xx  CyJr&   c                 T    SSS.SSS.SSS.SS	S.S
.nSS	S.nUR                  X5      $ )NP      )sensitivityappreciation_id<      (   r         )rY   r   rV   rR   g      4@get)	nature_idmappingdefault_valuess      r$   get_dynamic_valuesr_   y   sD    !4!4!4!4	G &+qAN;;y11r&   classes_c              #   T   #    U  H  u  pU[         :X  d  M  [        U5      v   M      g 7fr   )
label_namer!   .0kvs      r$   	<genexpr>rg      s"     Q)=jfc!ff)=s   ((r3   r2   z2Erreur lors de la construction du nature_mapping: u,   Mapping du modèle Nature → IDs métiers :activity_iddbreturnc                 
   [        SU  S35        [        SS 35         SSKJn  [        SU  S35        UR                  [        5      R                  U" [        R                  5      R                  [        R                  5      5      R                  [        R                  U :H  5      R                  5       nU(       d  [        S	5        g
[        SUR                  S
S  S35        [        S5        [        SUR                   35        [        S[        UR                  R                  5       5       35        S
nSUR                  ;   a  UR                  S   n[        SU 35         [!        USS
5      n[        SU 35        Uc  Un [%        US5      (       a:  UR                  (       a)  UR                  R                  n[        SU 35        Uc  UnU(       d  [        S5        g
[        SU S35        UR                  [        5      R                  [        R                  U:H  5      R                  5       nU(       d  [        S5        g
[        SUR                  S
S  S35        [        S5        [        SUR                   35        [        S[        UR                  R                  5       5       35        S
n	SUR                  ;   a  UR                  S   n	[        SU	 35         [!        USS
5      n
[        S U
 35        U	c  U
n	 [%        US!5      (       a:  UR                  (       a)  UR                  R                  n[        S"U 35        U	c  Un	U	(       d  [        S#5        g
[        S$U	 S35        UR                  [&        5      R                  [&        R                  U	:H  5      R                  5       nU(       a  [        S%UR                   35        O[        S&U	 S'35        [        S(U	 S)[)        U	5      R*                   S35        [        SS 35        U	$ ! ["         a  n[        SU 35         S
nAGNS
nAff = f! ["         a  n[        SU 35         S
nAGNS
nAff = f! ["         a  n[        SU 35         S
nAGNS
nAff = f! ["         a  n[        SU 35         S
nAGNYS
nAff = f! ["         aD  nSS
Kn[        S*5        [        S+U 35        [        S,UR.                  " 5        35         S
nAg
S
nAff = f)-uc   
Récupère l'ID du ministère à partir de l'ID de l'activité.
VERSION AVEC DÉBOGAGE DÉTAILLÉ
u:   
   🔍 DÉBOGAGE get_ministry_from_activity(activity_id=)      ──────────────────────────────────────────────────────────────────────r   )
joinedloadu(      1️⃣  Recherche de l'activité ID=r   u%      ❌ Activité non trouvée en baseNu      ✅ Activité trouvée: 2   u!      📊 Attributs de l'activité:u         • activity.id: u$         • activity.__dict__.keys(): direction_idu0         • Méthode 1 (__dict__): direction_id = u/         • Méthode 2 (getattr): direction_id = u         • Méthode 2 échec: 	directionu0         • Méthode 3 (relation): direction_id = u         • Méthode 3 échec: u-      ❌ Impossible de récupérer direction_idu*   
   2️⃣  Recherche de la direction ID=u      ❌ Direction non trouvéeu      ✅ Direction trouvée: u"      📊 Attributs de la direction:u         • direction.id: u%         • direction.__dict__.keys(): ministry_idu/         • Méthode 1 (__dict__): ministry_id = u.         • Méthode 2 (getattr): ministry_id = ministryu/         • Méthode 3 (relation): ministry_id = u,      ❌ Impossible de récupérer ministry_idu(   
   3️⃣  Recherche du ministère ID=u      ✅ Ministère trouvé: u      ⚠️  Ministère ID=u    existe mais pas récupéréu(   
   🎯 RÉSULTAT FINAL: ministry_id = z (type: u      ❌ ERREUR EXCEPTION:z      Message: r.   )printsqlalchemy.ormrp   queryr   optionsrs   r   ru   filterr3   rD   r2   rB   __dict__keysgetattr	Exceptionhasattrr   typer5   	traceback
format_exc)ri   rj   rp   activityrr   direction_id_attredirection_id_relrs   rt   ministry_id_attrministry_id_relru   r   s                 r$   get_ministry_from_activityr      s   
 
G}TU
VW	Cz
n-8SIJ88H%WZ 2 23>>y?Q?QRSVHKK;./UW 	
 9;+HMM#2,>+?sCD13'}564T(:K:K:P:P:R5S4TUV  X...#,,^<LD\NST	7 '.$ GCDUCVWX#0
	7x--(2D2D#+#5#5#8#8 HIYHZ[\'#3L AC;L>MNHHY'..y|||/KLRRT	13+INN3B,?+@DE24(785d9;M;M;R;R;T6U5VWX  I...#,,];KCK=QR	7&y-FBCSBTUV".
	7y*--)2D2D"+"4"4"7"7GGXYZ&"1K @B9+cJK88H%,,X[[K-GHNNP/?@-k]:VWX9+htT_O`OiOiNjjklmH:O  	71!566	7  	71!566	7B  	71!566	7  	71!566	7(  (*s#$"9#7#7#9":;<s   B*R7 
BR7 ( P 	AQ R7 'A$R7 BR7 * Q+ AR R7 )B5R7 
Q)P=7R7 =QR7 
Q(Q#R7 #Q((R7 +
R5R	R7 	RR7 
R4R/)R7 /R44R7 7
T:T  Trt   c                 D   [        SU  S35        [        SS 35        [        S5        [        SU  35        [        S[        U 5      R                   35        [        S[        U 5       35        [	        U 5      n[        S	5        [        S
U S35        [        S[        U5      R                   35        [        S[        U5       35        [        S[        U5       35        [        S5        [        S[        [        5       35        [        S[        [        R                  5       5       35        [        R                  S0 5      n[        S[        U5       35        [        S[        U5       35        U(       GaV  [        S5        [        [        UR                  5       S S95       HS  u  p4X$   R                  SS5      n[        SUS-   S SU S[        U5      R                   S[        U5       SU 3
5        MU     [        S5        [        S U S35        [        S!X;    35        [        S"XR                  5       ;    35        [        S#5        UR                  5        Hj  nXA:H  nUR                  5       (       a5  [	        U 5      R                  5       (       a  [        U5      [        U5      :H  OS$n[        S%U S&U S'U S(U 35        Ml     O[        S)5        X;   aR  X!   S*   nX!   R                  SS+5      n[        S,5        [        S-U 35        [        S.U 35        [        SS 35        U$ [        S/U S35        [        S05        [        S15        U(       a{  UR                  5        V	s/ s H%  n	[	        U 5      U	;   d  U	[	        U 5      ;   d  M#  U	PM'     n
n	U
(       a  [        S2U
 35        [	        U 5      U;   a  [        S35        [        S45        O[        S55        [        S6[         35        [        SS 35        [        [        SS75      5      $ s  sn	f )8ul   
Retourne la liste des IDs des ODDs autorisés pour un ministère donné.
VERSION AVEC DÉBOGAGE DÉTAILLÉ
u=   
   🔍 DÉBOGAGE get_allowed_odds_for_ministry(ministry_id=rm   rn   ro   u      📊 Analyse de ministry_id:u         • Valeur: u         • Type: u         • repr(): u   
   🔑 Clé de recherche:u         • ministry_key: ''u         • Longueur: u   
   📋 État du mapping:u(         • Type de ministry_odd_mapping: u)         • Clés de ministry_odd_mapping: r   u         • Type de mappings: u+         • Nombre d'entrées dans mappings: u4   
   🔑 TOUTES les clés disponibles dans mappings:c                 F    U R                  5       (       a  [        U 5      $ S$ )Ni  )isdigitr!   r"   s    r$   r%   /get_allowed_odds_for_ministry.<locals>.<lambda>*  s     RSR[R[R]R]AHfcfHfr&   r'   r)   r*   z      rY   2du	   . Clé: 'r,   z, repr: r-   u    
   🔍 Test de correspondance:u!         • Recherche de la clé: 'u$         • ministry_key in mappings: u+         • ministry_key in mappings.keys(): u-   
   🧪 Comparaison exacte avec chaque clé:Fu         • 'z' == 'z': z | int comparison: u+      ❌ Le dictionnaire 'mappings' est vide!r+   Inconnuu   
   ✅ MAPPING TROUVÉ!u         • Ministère: u         • ODDs autorisés: u*   
   ❌ MAPPING NON TROUVÉ pour la clé 'u9         • Utilisation de tous les ODDs (1-17) par défautu   
   💡 SUGGESTIONS:u&         • Clés similaires trouvées: uH         • ⚠️  ATTENTION: La clé existe mais la comparaison échoue!u9         • Vérifiez les espaces ou caractères invisiblesu1         • Le fichier JSON est vide ou mal chargéu         • Vérifiez le chemin:    )rv   r   r5   reprr9   lenministry_odd_mappingrB   r|   r[   	enumeratesortedr   r!   ministry_odd_map_pathrange)rt   ministry_keyr   idxr(   r)   is_equalis_equal_intallowed_oddsre   close_matchess              r$   get_allowed_odds_for_ministryr   	  s   
 
J;-WX
YZ	Cz
 
+-	{m
,-	T+.778
9:	tK01
23 {#L	(*	%l^1
56	T,/889
:;	 \!2 3
45	tL12
34 
')	4T:N5O4P
QR	5d;O;T;T;V6W5X
YZ#''
B7H	(h(8
9:	7H
GHEG!&>f"ghHC$M--ouEMF3q5*IcU)DI<N<N;OxX\]`XaWbbhivhwxy i 	131,qAB4\5M4NOP;LMMO<[;\]^ 	>@==?C+H>AkkmmPST_P`PhPhPjPjCHL(99puLKuF<.H:EXYeXfgh #
 	;= -i8 .22?IN)+&}o67+L>:;H:;L>KLIK 	&((0j13{;Kq;PTUY\]hYiTiQMj>}oNO ;8+`bQSEG34I3JKLH:E!RL!! ks   4"PPallowed_odd_idsc                    U (       d  / $ [        U S   [        5      (       a  U S   OU n/ nU H~  nUR                  SS5      n[        U[        5      (       a1  UR	                  S5      (       a  [        UR                  SS5      5      O
[        U5      nXa;   d  Mm  UR                  U5        M     UR                  S SS9  [        S	[        U5       S
[        U5       S35        USS  H  nUR                  SS5      n[        U[        5      (       a1  UR	                  S5      (       a  [        UR                  SS5      5      O
[        U5      nUR                  SS5      n[        SU SUS 35        M     U$ )u|   
Filtre les prédictions du modèle ODD pour ne garder que celles
qui correspondent aux ODDs autorisés pour le ministère.
r   labelLABEL_0LABEL_ c                 &    U R                  SS5      $ )Nscorer   rZ   r"   s    r$   r%   (filter_odd_predictions.<locals>.<lambda>n  s    gq 1r&   T)r(   reverseu       🔍 Prédictions filtrées: /u    ODDs conservésNrV   r   z      - ODD z: score=.4f)rA   rB   r[   r9   
startswithr!   replaceappendsortrv   r   )predictionsr   
preds_listfilteredpredr   odd_idr   s           r$   filter_odd_predictionsr   \  sS   
 	#-k!nd#C#CQJH),5?s5K5KPUP`P`aiPjPjU]]8R01pstypz$OOD!  MM14M@	,S]O1S_<MM]
^_!),5?s5K5KPUP`P`aiPjPjU]]8R01pstypz!$VHHU3K89	  Or&   c                   ^  [        U [        5      (       aC  U R                  5       R                  S5      (       a  [	        U R                  SS5      S   5      nO[	        U 5      n Sm [        [        S5      (       a  [        R                  " U/5      S   mTc(   [        [        SS5      nUb  [        U5      U:  a  X!   mT(       a0  [        U4S	 j[        R                  " 5        5       S5      nUb  XT4$ [        R!                  U5      nU(       a"  XR!                  S
5      UR!                  S5      4$ UST4$ ! [         a     gf = f! [         a    Sm Nf = f! [         a    Sm Nf = f)z[
label: 'LABEL_0' ou '0' ou 0
retourne: (model_idx, metier_id_or_None, class_name_or_None)
r   _rY   )NNNNinverse_transformr   r`   c              3   N   >#    U  H  u  pUT:X  d  M  [        U5      v   M     g 7fr   r    )rd   re   rf   
class_names      r$   rg   ,map_model_label_to_nature.<locals>.<genexpr>  s#     U-ATQQ*_&#a&&-A   %%r3   r2   )rA   r9   upperr   r!   splitr~   r   r   r   r}   r   nextr   itemsnature_mappingr[   )r   	model_idxclasses_attr	metier_idinfor   s        @r$   map_model_label_to_naturer   z  sb   
 eS!!ekkm&>&>x&H&HEKKQ/23IE
I J')<==-??LQOJ 	"#7TJL'C,=	,I)4
 U\-?-?-AUW[\	 33i(D((4.$((6*:::dJ&&7      
  	J	s<   AD> D> */E 'E  >
E
EEE E/.E/z/analyse-activitiesrequestc           
        ^+^,  [        SS 35        [        S[        U R                  5       S35        [        S 5        / n[        U R                  5       GHs  u  p4UR                  nUR
                  n[        SS 35        [        SUS-    S[        U R                  5       35        [        S	U 35        [        S
U S35        [        S 5        [        S5        [        Xa5      nUc!  [        S5        [        [        SS5      5      nO[        U5      n[        S5        [        U5      n	[        SU	(       a  [        U	S   5      OS S35        [        X5      n
U
(       d  [        S5        GM  U
S   n[        SU 35        UR                  SS5      n[        U[        5      (       a1  UR                  S5      (       a  [!        UR#                  SS5      5      O
[!        U5      n[$        R                  " [        U5      SU 35      nUR                  SS5      n[        SU SU SUS 35        [        S5        ['        U5      n[)        U5      nU(       dQ  [!        [+        S  [,        R.                  " 5        5       S!5      5      n[,        R                  " [        U5      S"5      nGOUR                  SS5      n[1        U5      u  nnm,Ub  UnT,nOT,(       a  [+        U,4S# j[,        R.                  " 5        5       S 5      nU(       a  UnT,nO[!        [+        S$ [,        R.                  " 5        5       S!5      5      n[,        R                  " [        U5      S"5      nOO[!        [+        S% [,        R.                  " 5        5       S!5      5      n[,        R                  " [        U5      S"5      n[        S&5        [2         Vs/ s H"  n[        US'   5      [        U5      :X  d  M   UPM$     nnS nU(       a  [5        U5      n[)        U5      nS m+U(       a~  UR                  SS(5      n [        U[        5      (       a1  UR                  S5      (       a  [!        UR#                  SS5      5      O
[!        U5      m+[+        U+4S* jU 5       US   5      nOUS   n[        S+5        S nS,nU(       a  S-U;   a  US-   (       a  US-   n [7        U5      n![)        U!5      n"U"(       a  U"R                  SS(5      n# [        U#[        5      (       a1  U#R                  S5      (       a  [!        U#R#                  SS5      5      O
[!        U#5      n$U$[        U 5      -  n$U U$   n%U%R                  S.5      nU%R                  S/S,5      nUUUXS0.UUS0.U(       a  US)   OS U(       a  US1   OS2S0.UUS0.S3.n&UR9                  U&5        [        S4US-    S535        GMv     [        SS 35        [        S6[        U5       S735        [        S 5        S8U0n'U'$ s  snf !   US   S)   m+ GN= f!   Sn$ N= f! [:         aA  n(SS Kn)S9[        U(5       S:U)R>                  " 5        3n*[        S;U* 35        [A        S<U*S=9eS n(A(ff = f)>N
z<============================================================u   🚀 DÉBUT DE L'ANALYSE - u    activité(s) à traiterz(========================================u   📝 ACTIVITÉ #rY   r   z   ID: z	   Nom: 'r   u,   
🏢 ÉTAPE 0: Récupération du ministèreuV      ⚠️  Impossible de déterminer le ministère - Tous les ODDs seront considérésr   u9   
🎯 ÉTAPE 1: Prédiction ODD (filtrée par ministère)u      Prédictions brutes ODD: r   u    prédictionsuM      ⚠️  Aucune prédiction ODD valide après filtrage - Activité ignoréeu'      Meilleure prédiction ODD filtrée: r   r   r   r   zODD r   u      ✅ ODD sélectionné: ID=z, Nom='z	', Score=r   u"   
🌿 ÉTAPE 2: Prédiction Naturec              3   :   #    U  H  u  pUS :X  d  M  Uv   M     g7fSoutienNr4   rc   s      r$   rg   %analyse_activities.<locals>.<genexpr>  s     %[4HDAAQZNaa4H   	4r   c              3   N   >#    U  H  u  pUT:X  d  M  [        U5      v   M     g 7fr   r    )rd   re   rf   mapped_names      r$   rg   r     s&     ,i@TXY]hXhVSVV@Tr   c              3   :   #    U  H  u  pUS :X  d  M  Uv   M     g7fr   r4   rc   s      r$   rg   r     s     1g@TXY]fXf!!@Tr   c              3   :   #    U  H  u  pUS :X  d  M  Uv   M     g7fr   r4   rc   s      r$   rg   r     s     -c<PDATUYbTbaa<Pr   u/   
🎯 ÉTAPE 3: Recherche des cibles pour l'ODDodd_code0cible_idc              3   <   >#    U  H  oS    T:X  d  M  Uv   M     g7f)r   Nr4   )rd   cr   s     r$   rg   r     s     '`?a
mW_F_?s   	u*   
📊 ÉTAPE 4: Sélection de l'indicateurzAucun indicateur disponibleindicateursr3   r2   rh   cibleInconnue)r   ri   rt   oddnaturer   
indicateuru   
✅ Activité #u    traitée avec succès!u   🏁 FIN DE L'ANALYSE - u    résultat(s) généré(s)resultszErreur analyse : z
Traceback: u   
❌ ERREUR GLOBALE: i  )status_codedetail)!rv   r   r?   r   r2   r3   r   rB   r   r   r   r   r[   rA   r9   r   r!   r   r   r   rE   r   r   r   r   cibles_datar   r   r   r~   r   r   r   )-r   rj   r   iactivity_itemact_nameri   rt   r   odd_predictionsfiltered_odd_predictionsodd_pred	odd_labelr   odd_name	odd_scorenature_predictionsnature_predr\   nature_name_strnature_labelr   	mapped_idapprox_matchr   possible_ciblescible_matchcible_predictions
cible_predcible_labelindicateur_idindicateur_nameindicateurs_disponiblesindicateur_predictionsindicateur_pred	ind_labelind_idselected_indicateurresult_itemfinal_responser   r   error_detailsr   r   s-                                              @@r$   analyse_activitiesr    sg   QC6(m+C0B0B,C+DD\]^ )'*<*< =A$))H'**KBvh- $QqSE3w/A/A+B*CDEGK=)*IhZq)*VH AB4[EK"no"&uQ|"4"?"L NO,X6O0O_Q5G1Hab0ccpqr'=o'_$+ef/2H;H:FG Wi8I=G	SV=W=W\e\p\pqy\z\zS**8R89  AD  EN  AOF }}S[D/BH Wa0I1&
)T]^aSbcd 78!28!<./ABK%[L4F4F4H%[]` ab	"."2"23y>9"M*w	B4Ml4[1	9k( )I&1O"'+,i@R@R@T,iko'p'(4I.9O(+D1g@R@R@T1gil,m(nI.:.>.>s9~y.YO$'-cL<N<N<P-ceh(i$j	*6*:*:3y>9*U DE*5[+QQz]9KsSY{9Zq+O[K$4X$>!12CD
",..#">KBMWXcehMiMiny  oE  oE  FN  oO  oO3{':':8R'H#I  UX  Yd  Ue #''`?'`bqrsbt"uK"1!"4K ?@ M;O};M@Z*5m*D')>x)H&"67M"N" / 3 3GS AI#IST]_bIcIchqh|h|  ~F  iG  iGY%6%6x%D!E  MP  QZ  M[ $c*A&BBF*A&*I'$7$;$;D$AM&9&=&=fFc&dO %**$7!*OD;FJ 7Dr}ZefmZn  DN  O%2OLK NN;'%acU*ABC{ !>~ 	6(m(W6PQR#W-} \B#21#5j#A(#!"<  C+CF8=AUAUAW@XY&}o67MBB	Csd   N>X% X%X+<X% (AX9A9X% 3AXCX% X% 
XX% X" X% %
Y0/<Y++Y0)Tfastapir   r   r   pydanticr   typingr   r   rw   r	   
sqlalchemyr
   	ml_modelsr   r   r   r   r   r   r   r   r   databaser   modelsr   r   r   jsonosrouterrv   	json_pathr   pathexistsabspathopenfloadr   r   r~   r   r   readfile_contentr   rB   r|   r   r   r(   r[   r)   r+   r5   JSONDecodeErrorlinenocolnor   r   r0   r=   rE   rO   r_   r   r}   classesr   r   rb   r   r   matchr!   r   r   r   r   postr  r4   r&   r$   <module>r     sR   5 5  ! "     2 2  		 m  A B fH	V  !)- . BGGNN9-./ 0 277??9567 8	iw	/1iil 
0	)#k*:);;
GH !"7!89 : BGGNN#89:; < 277??+@ABC D"B' 77>>'(($0-/'w?1668L/L0A/B,OP7Tc8J7K3OP @
 	)+'w?1#'99Q<  @ 	02,.T"6789:)$/C/H/H/J*K)LMN--+J7H.tH~.>?@1#h-AB?Ahmmo3CD ( 1 1/5 I"3-++Ir:)#iS	8J8J7K6R_Q``klsktuv E
 LN 
')	CE&+ m     m 9 #	 #2 D7/R@AG$W-ZQ););)=QSWX%*J?s . 4n EvC vW v# vrP"s P"tCy P"fc <%'P "#AH RC 1 RCw RC $RCG 
0	/  	OA3
 K @? @?(  0/s34&qxxj
177)DE *B/ 0*1#./"9#7#7#9":;< *B/	0v  D	>qc
BCCDs   
O O%O 8P 2O8:P P
%C(P P %A	R' 
OO O5O00O58
PP 

PP R$,1Q##	R$,-RR$'S-R>>S