
    ij              	       ,   d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
mZmZ 	 ddlmZmZmZ  G d d      Zd Zed	k(  r e        yy# e$ r? ej$                  j'                  d e ee      j,                               ddlmZmZmZ Y ^w xY w)
ua  
QC Center Code Validator
품질 검증 시스템 - 워크플로우, 코드 품질, 보안 검증

사용법:
    python3 code-validator.py all <파일경로> [--json]
    python3 code-validator.py workflow <파일경로> [--json]
    python3 code-validator.py code <파일경로> [--json]
    python3 code-validator.py security <파일경로> [--json]
    N)Path)AnyDictListOptional)	log_errorlog_executionsetup_loggingc                   6   e Zd ZdZddedefdZdefdZdefdZdefdZ	de
eef   fd	Zde
eef   fd
Zdede
eef   fdZdede
eef   fdZde
eef   fdZde
eef   fdZde
eef   fdZde
eef   fdZddefdZdefdZd Zd Zd Zd Zd Zy)QCValidatoru   품질 검증 클래스	file_pathjson_outputc                     t        |      | _        || _        t        d      | _        t        | j                        di d| _        t        | j                  ddt        | j                        i       y )Nzqc.code_validatorT)file
all_passeddetailszQCValidator initializedr   )r   r   r   r
   loggerstrresultsr	   )selfr   r   s      F/home/jay/workspace/.worktrees/task-2116-dev1/memory/code-validator.py__init__zQCValidator.__init__    sY    i&#$78 #DNN 34TVWdkk#<vs4>>GZ>[\    returnc                 0    dt        | j                        v S )u$   requirements.txt 파일인지 확인requirements.txt)r   r   )r   s    r   is_requirements_filez QCValidator.is_requirements_file'   s    !S%888r   c                     | j                   j                         scd| j                    }|| j                  d<   d| j                  d<   t        | j                  t        |      dt        | j                         i       yy)u   파일 존재 확인zFile not found: errorFr   r   T)r   existsr   r   r   FileNotFoundErrorr   )r   	error_msgs     r   validate_file_existsz QCValidator.validate_file_exists+   si    ~~$$&*4>>*:;I$-DLL!).DLL&dkk#4Y#?&#dnnJ]A^_r   c                 ~    | j                   j                  j                         }dddddd}|j                  |d      S )u!   파일 확장자로 언어 감지python
javascript)z.pyz.jsz.tsz.jsxz.tsxunknown)r   suffixlowerget)r   extlang_maps      r   detect_languagezQCValidator.detect_language5   sC    nn##))+  
 ||C++r   c                    di d}| j                         sd|d<   |S 	 | j                  j                  d      }g d	}g }|D ];  }t        j                  ||t
        j                        }|s+|j                  |       = t        |      d
k(  t        |      |r|dd ng d|d   d<   t        t        j                  d|            }t        t        j                  d|            }	|xs |	||	d|d   d<   t        t        j                  d|t
        j                              }
t        t        j                  d|            }|
xs ||
|d|d   d<   t        t        j                  d|            }t        t        j                  d|            }|xs |||d|d   d<   t        d |d   j                         D              |d<   |S # t        $ r}d|d<   t	        |      |d<   |cY d}~S d}~ww xY w)un   
        워크플로우 검증 (Module B 체크리스트)
        WORKFLOW-QUALITY-CONTROL.md 기준
        T)passedchecksFr/   utf-8encodingr   N)zTODO:zFIXME:u   나중에\s*연동u   나중에\s*구현placeholderPLACEHOLDERNotImplementedErrorzpass\s*# TODOr      )r/   founditemsr0   no_placeholdersztry\s*:z(except|raise|Error))r/   has_try_excepthas_error_handlingerror_handlingz	""".*?"""z#\s*\w+)r/   has_docstringhas_commentsdocumentationz	def\s+\w+zclass\s+\w+)r/   has_functionshas_classescode_structurec              3   &   K   | ]	  }|d      yw)r/   N ).0checks     r   	<genexpr>z0QCValidator.validate_workflow.<locals>.<genexpr>   s     'hEh'hs   )r#   r   	read_text	Exceptionr   refindall
IGNORECASEextendlenboolsearchDOTALLallvalues)r   workflow_resultcontenteplaceholder_patternsplaceholders_foundpatternmatchesr;   r<   r>   r?   rA   rB   s                 r   validate_workflowzQCValidator.validate_workflowA   s   
 &*R8((*(-OH%""	#nn...@G	 
  + 	3Gjj'2==AG"))'2	3 ,-2+,/A'+r8
!"34 bii
G<=!")),CW"MN %:(:,"47
!"23 RYY|WbiiHIBIIj':; $3|*(6
!/2 RYY|W=>299^W=> $2{*&7
!"23 %('h_U]E^EeEeEg'h$h!}  	#(-OH%'*1vOG$""	#s   G	 		G1G,&G1,G1c                    di i d}| j                         sd|d<   |S | j                         }| j                  |      |d<   | j                  |      |d<   |d   j	                  dd      xr |d   j	                  dd      |d<   |S )u,   코드 품질 검증 (문법, 정적 분석)T)r/   syntaxstatic_analysisFr/   r^   r_   )r#   r-   _check_syntax_check_static_analysisr*   )r   code_resultlanguages      r   validate_codezQCValidator.validate_code   s    !%K((*$)K!'') !% 2 28 <H *.)D)DX)N%& !,H 5 9 9(E J !
{[lOmOqOqeP
H r   rc   c                    dg d}|dk(  re	 t        j                  dddt        | j                        gddd      }|j                  d	k7  r#d
|d<   |j
                  j                         g|d<   |S |dk(  re	 t        j                  ddt        | j                        dgddd      }|j                  d	k7  r#d
|d<   |j                  j                         g|d<   |S d| |d<   |S # t        $ r	 d|d<   Y |S t         j                  $ r d
|d<   dg|d<   Y |S t        $ r}d| |d<   Y d}~|S d}~ww xY w# t        $ r	 d|d<   Y |S t        $ r}d| |d<   Y d}~|S d}~ww xY w)u   문법 검사T)r/   errorsr%   python3-m
py_compile   capture_outputtexttimeoutr   Fr/   rf   zpython3 not foundwarningzSyntax check timed outzCould not run syntax check: Nr&   npxeslintz--no-eslintrcnpx/eslint not foundCould not run eslint: zSyntax check not supported for )
subprocessrunr   r   
returncodestderrstripr!   TimeoutExpiredrJ   stdout)r   rc   syntax_resultresultrW   s        r   r`   zQCValidator._check_syntax   s   #'26xN#lC4GHY]dhrt $$).3M(+/5}}/B/B/D.EM(+2 ! %
H#Hc$..&9?K\`gkuw $$).3M(+/5}}/B/B/D.EM(+  *I
'SM)$1 % ?+>i(. - ,, E*/h'+C*Dh'( '  N-I!+Mi($ 'N % B+Ai(   H-CA3+Gi(
 HsC   A"C$ 6A"D3 $D05D0D0D++D03EEEEc           	      f   dg d}|dk(  r	 t        j                  ddt        | j                        gddd      }|j                  dk7  ru|j
                  j                         r[|j
                  j                  d	      D cg c](  }|j                         sd
|j                         v s'|* }}|rd|d<   |dd |d<   |S |dk(  rf	 t        j                  ddddt        | j                        gddd      }|j                  dk7  r#d|d<   |j
                  j                         g|d<   |S d| |d<   |S c c}w # t        $ r	 d|d<   Y |S t         j                  $ r	 d|d<   Y |S t        $ r}d| |d<   Y d}~|S d}~ww xY w# t        $ r	 d|d<   Y |S t        $ r}d| |d<   Y d}~|S d}~ww xY w)u   정적 분석T)r/   issuesr%   pylintz--errors-only<   rk   r   
r   Fr/   Nr7   r~   zpylint not installedro   zStatic analysis timed outzCould not run pylint: r&   rp   rq   z--max-warnings0rj   rr   rs   z"Static analysis not supported for )rt   ru   r   r   rv   rz   rx   splitr)   r!   ry   rJ   )r   rc   analysis_resultr|   linerf   rW   s          r   ra   z"QCValidator._check_static_analysis   s   %)R8xJ#DNN0CDUY`dnp $$)fmm.A.A.C/5}}/B/B4/HutDJJL]dhlhrhrht]tduFu4914:2AJ16 ' %J#H&6S=PQ#'	 $$)05OH-171D1D1F0GOH-  ,NhZ)XOI&= v % D-C	*2 1 ,, I-H	*. -  J/EaS-I	** -J % D-C	*   J/EaS-I	*
 Jsa   A5D; D6D6*D6.D; A#F 6D; ;FF&F.E<<FF0F0F++F0c           	         ddg g d}| j                         sd|d<   |S dt        | j                        vrd|d<   |S d|d<   	 t        j                  d	d
ddt        | j                        ddgddd      }|j
                  |j                  z   }d|v rd|d<   g |d<   |S |j                  dk7  rCd|d<   |j                  d      D cg c]  }|j                         sd|vs| }}|dd |d<   |S d|d<   	 |S c c}w # t        $ r |d   j                  d       d|d<   Y |S t        j                  $ r |d   j                  d       d|d<   Y |S t        $ r'}|d   j                  d|        d|d<   Y d}~|S d}~ww xY w)u-   의존성 검사 (requirements.txt인 경우)TF)r/   is_requirementsvulnerabilitieswarningsr/   r   z!Not a requirements file - skippednoter   rg   rh   	pip_audit-rz--disable-pipz	--no-depsr   rk   zNo known vulnerabilitiesr   r   r   WARNINGN
   r   zpip-audit not installedzDependency scan timed outzCould not run pip-audit: )r#   r   r   rt   ru   rz   rw   rv   r   rx   r!   appendry   rJ   )r   deps_resultr|   full_outputllinesrW   s          r   validate_dependenciesz!QCValidator.validate_dependencies   s   !%%TVdfg((*$)K! S%88"EK)-%&!	*^^D+tS5H/[fg#	F !--&--7K *[8(,H%13-.* % $$),1K)(3(9(9$(?d11779QZbcQcQdEd5:3BZK 12  -1K)  e
 ! 	*
#**+DE$)K!  (( 	*
#**+FG$)K!
 	  	*
#**-Fqc+JK$)K!		*sO   AC> 'C> C9C9!C9%
C> 1C> 9C> >"F #+F F E;;F c           	         dg g d}| j                         sd|d<   |S | j                         }	 | j                  j                  d      }g d	}|D ]?  \  }}t        j                  ||t        j                        s,|d
   j                  |       A |dk(  r	 t        j                  ddddt        | j                        gddd      }|j                  dk7  rr	 t        j                  |j                        }	|	j!                  dg       D ]<  }
|d
   j                  |
j!                  dd       d|
j!                  dd       d       > 	 n|dk(  r	 | j                  j(                  dz  }|j+                         rt        j                  g d dddt        | j                  j(                        !      }|j                  dk7  r	 t        j                  |j                        }|j!                  d
i       }|j-                         D ]I  \  }}t/        |t0              s|j!                  d"d      dkD  s-|d
   j                  | d#|d"    d$       K 	 t3        |d
         dk(  |d<   |S # t        $ r}d|d<   t        |      |d<   |cY d}~S d}~ww xY w# t        j"                  $ r Y `w xY w# t$        $ r |d   j                  d       Y zt        j&                  $ r |d   j                  d       Y t        $ r!}|d   j                  d|        Y d}~d}~ww xY w# t        j"                  $ r Y w xY w# t$        $ r |d   j                  d%       Y t        $ r"}|d   j                  d&|        Y d}~,d}~ww xY w)'u   보안 취약점 분석T)r/   r   r   Fr/   r1   r2   r   N)	)z	eval\s*\(z(Use of eval() - potential code injection)z	exec\s*\(z(Use of exec() - potential code injection)z__import__\s*\(z(Dynamic import - potential security risk)z*subprocess\.call\s*\([^)]*shell\s*=\s*Truez1Shell=True in subprocess - command injection risk)zos\.system\s*\(z)Use of os.system - command injection risk)zpickle\.loads?\s*\(z!Pickle can execute arbitrary code)z password\s*=\s*["\'][^"\']+["\']zHardcoded password detected)zapi_key\s*=\s*["\'][^"\']+["\']zHardcoded API key detected)zsecret\s*=\s*["\'][^"\']+["\']zHardcoded secret detectedr   r%   banditr   z-fjsonr   rk   r   r   
issue_textzUnknown issuez (severity: issue_severityUNKNOWN)r   z-bandit not installed - skipping security scanzSecurity scan timed outzCould not run bandit: r&   zpackage.json)npmaudit--json)rl   rm   rn   cwdtotalz: z vulnerabilitiesz"npm not found - skipping npm auditzCould not run npm audit: )r#   r-   r   rI   rJ   r   rK   rQ   rM   r   rt   ru   rv   r   loadsrz   r*   JSONDecodeErrorr!   ry   parentr    r9   
isinstancedictrO   )r   security_resultrc   rV   rW   dangerous_patternsrZ   messager|   bandit_outputissuepackage_jsonaudit_outputr   	vuln_typecounts                   r   validate_securityzQCValidator.validate_security*  s   %)bbQ((*(-OH%""'')	#nn...@G

 !3 	CGWyy'2==9 1299'B	C
 xQ#tT63t~~3FGX\cgqs $$)(,

6==(A%2%6%6y"%E E+,=>EE#(99\?#K"LLY^YbYbcsu~Y  YA  AB  !C %T#~~44~E&&('^^2'+! " 5 56F ((A-	!+/::fmm+DL.:.>.>?PRT.UO4C4I4I4K & 0	5#-eT#:uyyRS?TWX?X$34E$F$M$M+4+Rg7GGW(X%&& %(8I(J$Kq$P!Y  	#(-OH%'*1vOG$""	#F  //  % d
+223bc,, N
+223LM Q
+225KA33OPPQ2  $33 ! !$ Y
+223WX T
+225Nqc3RSSTs   I* A J/ A0J 
J/ A1L; AL" L" 4L" L; *	J3JJJJ,(J/ +J,,J/ /L&L6L>LL"L85L; 7L88L; ;NN#N  Nc                 0   dddddd}| j                         sd|d<   |S | j                         }|dk7  rd|d<   d	| d
|d<   |S 	 t        | j                  j	                               }t        j                  d|dgddd      }|j                  |d<   |j                  j                         dd |d<   |j                  dk7  rA|j                  j                         dd xs |j                  j                         dd |d<   |S 	 t        j                  |j                         d|d<   d|d<   |S # t        j                  $ r d|d<   d|d<   d|d<   Y |S w xY w# t
        j                  $ r	 d|d<   Y |S t        $ r}t        |      |d<   Y d}~|S d}~ww xY w)uM   실제 실행 테스트 - python3 <파일> test 실행 후 JSON 출력 확인FN)r/   rv   output
valid_jsonr   zFile not foundr   r%   Tr/   z/Execution test only supported for Python (got: r   ro   rg   test   rk   rv   i  r   r   i,  r   zOutput is not valid JSONzExecution timed out (15s))r#   r-   r   r   resolvert   ru   rv   rz   rx   rw   r   r   r   ry   rJ   )r   exec_resultrc   abs_pathr|   rW   s         r   validate_executionzQCValidator.validate_execution  s   !&ddZ_jno((*#3K '')x$(K!'VW_V``a%bK	"	*4>>1134H^^Y&$ARV]akmnF(.(9(9K%$*MM$7$7$9$3$?K!  A%'-}}':':'<Tc'B'afmmFYFYF[\`]`FaG$""B

6==),0L)(,H%  '' B,1L)(-H%'AG$ B
 (( 	?#>K    	*#&q6K 	*s=   B=E )D0 0"EE EE F4F<FFc           	      t   	 t        | j                  d       | j                         s| j                  S | j	                         ru| j                         | j                  d   d<   ddd| j                  d   d<   ddd| j                  d   d<   ddd| j                  d   d	<   ddd| j                  d   d
<   n| j                         | j                  d   d<   | j                         | j                  d   d<   | j                         | j                  d   d	<   | j                         | j                  d   d<   | j                         | j                  d   d
<   t        d | j                  d   j                         D              | j                  d<   t        | j                  dd| j                  d   i       | j                  S # t        $ ri}t        | j                  |dt        | j                        i       t        |      | j                  d<   d| j                  d<   | j                  cY d}~S d}~ww xY w)u   모든 검증 실행zStarting all validationsr   dependenciesTzSkipped for requirements.txt)r/   r   workflowcodesecurity	executionc              3   @   K   | ]  }|j                  d d        yw)r/   FN)r*   )rF   details     r   rH   z2QCValidator.run_all_validations.<locals>.<genexpr>  s     ,xVVZZ%-H,xs   r   zAll validations completedr   r   FN)r	   r   r#   r   r   r   r\   rd   r   r   rS   rT   rJ   r   r   r   )r   rW   s     r   run_all_validationszQCValidator.run_all_validations  s   )	 $++'AB,,.||# ((*:>:T:T:VY'7AEOm6nY'
3=AKi2jY'/AEOm6nY'
3BFPn7oY'4 7;6L6L6NY'
3 372D2D2FY'/ 7;6L6L6NY'
3 ;?:T:T:VY'7 8<7N7N7PY'4 *-,xW[WcWcdmWnWuWuWw,x)xDLL&$++'B\SWS_S_`lSmDno<< 	 dkk1vs4>>/B&CD$'FDLL!).DLL&<<		 s$   1G FG 	H7AH2,H72H7validation_typec                     | j                   r,t        t        j                  | j                  dd             y| j                  |       y)u   결과 출력   F)indentensure_asciiN)r   printr   dumpsr   _print_human_readabler   r   s     r   print_resultszQCValidator.print_results  s2    $**T\\!%HI&&7r   c                    d| j                   v rt        d| j                   d           yt        d       t        ddz         t        d| j                          t        d|        t        ddz         d	| j                   d
   v r| j                          d| j                   d
   v r| j	                          d| j                   d
   v r| j                          d| j                   d
   v r| j                          d| j                   d
   v r| j                          t        dd        | j                   d   rt        d       nt        d       t        d       t        d d       y)u+   사람이 읽기 쉬운 형식으로 출력r   u   ❌ Error: Nu!   
📋 QC Center Validation Report=2   zFile: zType: r   r   r   r   r   r   r   z2==================================================r   u   ✅ ALL CHECKS PASSEDu   ❌ SOME CHECKS FAILEDz"   Review details above for issues)r   r   r   _print_workflow_results_print_code_results_print_security_results_print_dependencies_results_print_execution_resultsr   s     r   r   z!QCValidator._print_human_readable  sE   dll"KW 567824Rit~~&'('()Rii00((*T\\),,$$&i00((*T\\)44,,.$,,y11))+ 	8*o<<%)**+67
"or   c                 @   | j                   d   d   }|d   rdnd}t        d|        |j                  di       j                         D ]R  \  }}|d   rdnd}t        d| d	|        |d   r&|j                  d
      s8|d
   dd D ]  }t        d|         T y)u   워크플로우 결과 출력r   r   r/      ✅   ❌u   
🔄 Workflow Validation: r0       r9   N         - )r   r   r*   r9   )r   r   status
check_namecheck_resultcheck_statusitems          r   r   z#QCValidator._print_workflow_results  s    <<	*:6"8,%,VH56(0Xr(B(H(H(J 	-$J$0$:5LC~Qzl34)l.>.>w.G(1"15 -DHTF+,-		-r   c                 x   | j                   d   d   }|d   rdnd}t        d|        |j                  di       }|j                  dd      rdnd}t        d	| d
       |j                  d      r|d   dd D ]  }t        d|dd          |j                  d      rt        d|d           |j                  di       }|j                  dd      rdnd}t        d	| d       |j                  d      r|d   dd D ]  }t        d|dd          |j                  d      rt        d|d           yy)u   코드 검증 결과 출력r   r   r/   r   r   u   
💻 Code Quality: r^   Tr   z Syntax Checkrf   Nr   r   d   ro   u         ⚠️  r_   z Static Analysisr~   r   r   r*   )	r   r   r   r^   syntax_statusr   analysisanalysis_statusr   s	            r   r   zQCValidator._print_code_results  sb   ||I&v.x.e%fX./ (B'!'Hd!;M?-01::h)"1- 0t./0::i N6)#4"567 88-r2#+<<$#?%UO$$456<<!!(+BQ/ 0t./0<<	"N8I#6"789 #r   c                    | j                   d   d   }|d   rdnd}t        d|        |j                  d      r|d   dd	 D ]  }t        d
|         |j                  d      r|d   dd D ]  }t        d|         yy)u   보안 검증 결과 출력r   r   r/   r   r   u   
🔒 Security Check: r   Nr7         ❌ r   r         ⚠️  r   )r   r   r   vulnro   s        r   r   z#QCValidator._print_security_results.  s    <<	*:6"8,%'x01<<)* !23BQ7 (v&'( <<
##J/3 /G9-./ $r   c                    | j                   d   d   }|d   rdnd}t        d|        |j                  d      rt        d|d           y	|j                  d
      rt        d       |j                  d      r|d   d	d D ]  }t        d|d	d          |j                  d      r|d   d	d D ]  }t        d|         |d   r|j                  d      st        d       y	y	y	)u   의존성 검사 결과 출력r   r   r/   r   r   u   
📦 Dependencies Check: r   u      ℹ️  Nr   u"      📄 Requirements file detectedr   r7   r   r   r   r   r   u%      ✅ No known vulnerabilities foundr   )r   depsr   r   ro   s        r   r   z'QCValidator._print_dependencies_results<  s   ||I&~6x.e+F84588FKV~./88%&6888%&./3 .Tc
|,-. 88J
+BQ/ /G9-./ >$((+<"=9; #>>r   c                    | j                   d   d   }|d   rdnd}t        d|        |j                  d      rt        d|d           y	|j                  d
      t        d|d
           |j                  d      rt        d       |j                  d      r|d   d	d }t        d|        |j                  d      rt        d|d           y	y	)u   실행 테스트 결과 출력r   r   r/   r   r   u   
🚀 Execution Test: ro   r   Nrv   z   returncode: r   u      ✅ JSON output validr      z   output: r   r   r   )r   r   r   output_previews       r   r   z$QCValidator._print_execution_resultsT  s    LL+K8	#H-5'x01==#K	) 4567==&2OIl$;#<=>==&,.=="&x0#6NK/01==!GIg./01 "r   N)F)rS   )__name__
__module____qualname____doc__r   rP   r   r   r#   r-   r   r   r\   rd   r`   ra   r   r   r   r   r   r   r   r   r   r   r   rE   r   r   r   r      s*   !]# ]D ]9d 9d 
, 
,K4S> KZtCH~ .$c $d38n $L)s )tCH~ )V2tCH~ 2hY4S> Yv(DcN (T+ T#s(^ + Z8S 8"S "H-:4/<02r   r   c                     t        t        j                        dk  r6t        d       t        d       t        d       t        j                  d       t        j                  d   j                         } t        j                  d   }dt        j                  v }| dvr/t        d	|  d
       t        d       t        j                  d       t        ||      }| dk(  r|j                          n| dk(  rU|j                         r|j                         |j                  d   d<   |j                  d   d   d   |j                  d<   na| dk(  rU|j                         rK|j                         |j                  d   d<   |j                  d   d   d   |j                  d<   n| dk(  rS|j                         r|j                         |j                  d   d<   |j                  d   d   d   |j                  d<   n| dk(  rS|j                         r|j                         |j                  d   d<   |j                  d   d   d   |j                  d<   nW| dk(  rR|j                         rB|j                         |j                  d   d<   |j                  d   d   d   |j                  d<   |j                  |        t        j                  |j                  d   rd       yd       y)u   메인 함수r   z<Usage: python3 code-validator.py <type> <file_path> [--json]z=Types: all, workflow, code, security, dependencies, executionzCExample: python3 code-validator.py all memory/task-router.py --json   r   r   )rS   r   r   r   r   r   z Error: Unknown validation type ''zCValid types: all, workflow, code, security, dependencies, executionrS   r   r   r/   r   r   r   r   r   r   N)rO   sysargvr   exitr)   r   r   r#   r\   r   rd   r   r   r   r   )r   r   r   	validators       r   mainr   l  s   
388}qLMMNSThhqk'')OIchh&Kbb00ACDSTI{3I%%%'	J	&))+7@7R7R7TIi(4.7.?.?	.J:.VW_.`Il+	F	"))+3<3J3J3LIi(0.7.?.?	.J6.RS[.\Il+	J	&))+7@7R7R7TIi(4.7.?.?	.J:.VW_.`Il+	N	*))+;D;Z;Z;\Ii(8.7.?.?	.J>.Z[c.dIl+	K	'))+8A8T8T8VIi(5.7.?.?	.J;.WX`.aIl+O, HH)##L1Q9q9r   __main__)r   r   osrK   rt   r   pathlibr   typingr   r   r   r   logging_configr   r	   r
   ImportErrorpathinsertr   __file__r   r   r   r   rE   r   r   <module>r     s   	  	 	  
  , ,GFFL	2 L	2^-:` zF I  GHHOOAs4>0012FFGs   
A ABB