
    h              
          d dl mZmZmZm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mZ d dlmZ d dlZd dlmZ d dlZd dlZd dlmZmZmZ  ej        ej        d	            ej        e          Zd
ededee         fdZ dededee         fdZ!dee         dededee         de"f
dZ#dedefdZ$dedeeef         fdZ%ddededee         fdZ&dS )    )capture_exceptioncapture_messageset_tagset_contextNWorkbookFontPatternFill	AlignmentBorderSide)dataframe_to_rows)datetime)OptionalListDictz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatcontent	base_namereturnc                 n   |r| s+t                               d           t          d           dS t          j                            dd          }| d}t          j                            ||          }	 t          j        |d           t          |d	d
          5 }|                    |            ddd           n# 1 swxY w Y   t           	                    d|            |S # t          $ r@}t                               d| d|            t          d| d|            Y d}~dS d}~ww xY w)zSave test script to file.

    Args:
        content (str): Content to write to file
        base_name (str): Base name for the file

    Returns:
        Optional[str]: Filename if successful, None otherwise
    z$Filename and content cannot be emptyu(   ❌ Filename and content cannot be emptyNtests	generatedz.txtTexist_okwzutf-8)encodingz Test script saved successfully: zError saving file : u   ❌ Error saving file )loggererrorprintospathjoinmakedirsopenwriteinfo	Exception)r   r   
output_dirfilename	file_pathfilees          ?/var/www/html/testcasegenerator.evdpl.com/utils/file_handler.pysave_test_scriptr2      s     G ;<<<8999tg{33J!!!HZ22I	
J....)S7333 	 tJJw	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 AxAABBB   9(99a99:::6x66166777ttttts<   6(C* C 4C*  CC* C!C* *
D445D//D4
test_casesc           	         |r| s+t                               d           t          d           dS | d}t          j                            dd          }t          j        |d           t          j                            ||          }	 t          |           }|s*t                               d	           t          |           }nmt                               d
t          |           d           g }|                                D ]+\  }}t          ||          }	|                    |	           ,|rt          j        |          nt          j                    j        rJt                               d           t          d           t          j        dgdgdgdgdgdgd          dj        vrdd<   nd                             d          d<   g d}
|
D ]}|j        vrd|<   dj        v rd                             d           d<                       d          g d}j        D ]}||vr|                    |           fd|D             }                    |          t          j        |d          5 }                    |dd           |j        d         }t3          j                  D ]\  }}t5          |                             t8                                        t                                                    t          |                    }t;          |dz   d           |j        t?          d!|z                      _         	 ddd           n# 1 swxY w Y   t                               d"|            |S # tB          $ r:}t                               d#|            t          d$|            Y d}~dS d}~ww xY w)%zSave test cases to Excel file.

    Args:
        test_cases (str): Test cases content to write to Excel
        base_name (str): Base name for the file

    Returns:
        Optional[str]: Filename if successful, None otherwise
    z'Filename and test cases cannot be emptyu+   ❌ Filename and test cases cannot be emptyNz.xlsxr   r   Tr   z6No TEST TYPE sections found, using traditional parsingzFound z TEST TYPE sections)default_sectionzNo test cases could be parsedu$   ⚠️ No test cases could be parsedzNo test cases found )SectionTitleScenarioStepsExpected ResultActual Resultr7   General)r8   r9   Preconditionsr:   r;   r<   StatusPriorityr:   c                     t          | t                    r,d                    d t          |           D                       n| pdS )N
c                 (    g | ]\  }}|d z    d| S    z.  .0isteps      r1   
<listcomp>z7save_excel_report.<locals>.<lambda>.<locals>.<listcomp>t   s1    @n@n@nV]VWY]AaCAQAQ4AQAQ@n@n@n    r6   )
isinstancelistr&   	enumerate)xs    r1   <lambda>z#save_excel_report.<locals>.<lambda>t   sd    s}~  BF  tG  tG  7Vdii@n@najklamam@n@n@n6o6o6o  NO  NU  SU rL   )	r7   r8   r9   r>   r:   r;   r?   r<   r@   c                 &    g | ]}|j         v |S rF   columns)rH   coldfs     r1   rK   z%save_excel_report.<locals>.<listcomp>   s%    IIIsbj7H7H7H7H7HrL   rS   openpyxl)engineF
Test Cases)index
sheet_name   2   A   z!Excel report saved successfully: zError saving Excel report: u   ❌ Error saving Excel report: )"r!   r"   r#   r$   r%   r&   r'   extract_test_type_sectionsr*   parse_traditional_formatlenitemsextendpd	DataFrameemptywarningrT   fillnaapplyappendreindexExcelWriterto_excelsheetsrO   maxastypestrmincolumn_dimensionschrwidthr+   )r3   r   r-   r,   filepathsections	test_datasection_namesection_contentsection_datarequired_columnsrU   column_orderwriter	worksheetidx
max_lengthr0   rV   s                     @r1   save_excel_reportr   2   s     J >???;<<<t"""Hg{33JK
T****w||J11HQ-j99  		/KKPQQQ0<<II KKCXCCCDDDI191A1A / /-o7Yefff  .... )2ER\)$$$r|~~8 	NN:;;;8999129:D$&4"$   B BJ&&%ByMMyM00;;ByM E  E  E# 	 	C"*$$3 bj  W+++  -V  -V  W  WBwK YYr]] L  L  L: 	) 	)C,&&##C((( JIII|IIIZZZ-- ^HZ888 
	[FKKeKEEEl3I &bj11 [ [S sGNN3''--c226688HH 
 DGzTU~WYCZCZ	+CSMM:@@[
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 
	[ 	BBBCCC   6166777333444ttttts>   HN  CM6*N  6M::N  =M:>!N   
O$*/OO$status_valuessource_typeitem_idsc           	      	   	 ddl m} ddlm}m}m}m}m}	 ddlm	}
  |            }|
                    |j                   |                    d          }d| |d<    |dd	
          |d         _        dt          j                                        d           |d<   d| |d<   dd                    |           |d<   dt%          |            |d<   i }| D ]J}|                    dd          }|                    |d          }|                    |d          dz   ||<   Kd|d<    |d          |d         _        d}|                                D ]\  }}| d| |d| <   |dz  }|                    d          }g d }t+          |d          D ]A\  }}|                    d||!          } |d          |_         |d"d"d#$          |_        Bt+          | d%          D ]\  }}|                    dd&          }d&}d'|v r8d(|v r4|                    d'          d)                             d(          d         }|                    |d|                    dd&          !           |                    |d%|                    d*d&          !           |                    d+d&          }t3          |t4                    r,d,                    d- t+          |          D                       }|                    |d.|!           |                    d/d&          }t3          |t4                    rd,                    |          }|                    |d0|!           |                    dd&          }|                    |d          }|                    |d1|!           |                    |d2|!           |j        D ]}d} |
|d         j                  }|D ]P}	 t%          t;          |j                            |k    r!t%          t;          |j                            }J#  Y NxY wt?          |d%z   d3          }||j         |         _!        dd4l"m#}   |             }!|$                    |!           |!%                    d           |!&                                S # tN          $ r$}"tP          )                    d5|"            |"d6}"~"ww xY w)7ab  Create an Excel report from test cases data.
    
    Args:
        test_cases (List[Dict]): List of test case dictionaries
        status_values (Dict): Status values for test cases
        source_type (str): Source type (e.g., 'Jira', 'Azure')
        item_ids (List[str]): List of item IDs
        
    Returns:
        bytes: Excel file as bytes
    r   r   r	   )get_column_letterSummaryzTest Cases Report - A1T   )boldsizezGenerated on: z%Y-%m-%d %H:%M:%SA3zSource Type: A4z
Item IDs: z, A5zTotal Test Cases: A6r8   Unknown
Not TestedrE   zStatus Summary:A8)r   	   r    ArY   )r8   r9   r:   r;   r?   zItem ID)rowcolumnvalueCCCCCCsolid)start_color	end_color	fill_typer\   r6   ()r9   r:   rB   c                 (    g | ]\  }}|d z    d| S rD   rF   rG   s      r1   rK   z'create_excel_report.<locals>.<listcomp>   s.    "T"T"T4ac#3#3T#3#3"T"T"TrL      r;            r]   )BytesIOzError creating Excel report: N)*rW   r   openpyxl.stylesr
   r   r   r   r   openpyxl.utilsr   removeactivecreate_sheetfontr   nowstrftimer&   ra   getrb   rO   cellfillsplitrM   rN   rT   r   rq   r   rr   rs   ru   ior   saveseekgetvaluer+   r!   r"   )#r3   r   r   r   r   r
   r   r   r   r   r   wb
summary_wsstatus_countstctc_idstatusr   counttc_wsheadersrU   headerr   titleitem_idstepsexpected_resultr   r   column_letteradjusted_widthr   outputr0   s#                                      r1   create_excel_reportr      s   g%%%%%%NNNNNNNNNNNNNN444444 XZZ 			") __Y//
 @+??
4 $$R 8 8 8
4ZHLNN,C,CDW,X,XZZ
48;88
4=		((;(;==
4AJAA
4  	E 	EBFF7I..E"&&ul;;F$1$5$5fa$@$@1$DM&!!,
4 $$
4*0022 	 	MFE'-$8$8$8$8Jy3yy!1HCC -- YXX %Wa00 	a 	aKC::!Cv:>>D$DI#HX_```DII !Q// 	9 	9GCFF7B''EGe||u++c**2.44S99!<JJ3qw0C0CJDDDJJ3qz20F0FJGGG FF7B''E%&& V		"T"T9UCSCS"T"T"TUUJJ3qJ666 !ff%6;;O/400 ="&))O"<"<JJ3qJ@@@ FF7B''E"&&ul;;FJJ3qJ777JJ3qJ8888 m 
	J 
	JFJ--fQi.>??M  3tz??++j88%(TZ%9%9
D a44N;IE#M288 	
A      8Q88999s2   O'R, *AP10R, 1P53A8R, ,
S6SS	test_casec                 	   	 |                      d          rC| d                                                             dd                                          | d<   |                      d          rD| d                                         }|r"|dk    rt          j        dd|          }|| d<   nd| d<   nd| d<   |                      d          rF| d         }t          |t                    rg }|D ]}|r|                                r}|                                                    dd                                          }t          j        d	d|          }t          j        d
d|          }|r|                    |           |r|nd| d<   nt          |t                    rj|                                rV|                                                    dd                                          }t          j        dd|          }|| d<   nd| d<   nd| d<   |                      d          rD| d                                         }|r"|dk    rt          j        dd|          }|| d<   nd| d<   nd| d<   |                      d          r7| d                                         }|rt          j        dd|          }|| d<   |                      d          dk    r|                      d          rt          | d         t                    r| d                                         r| d                                         }|	                                
                    d          s=t          |          dk    r(d|d         	                                z   |dd         z   nd}|| d<   n#|                      d          rd| d          | d<   |                      d          sd| d<   |                      d          rC| d                                                             dd                                          | d<   | S # t          $ r6}	t                              dt          |	                      | cY d}	~	S d}	~	ww xY w)zFValidate and clean up test case data to ensure quality and consistencyr8   **r6   r9   zNo scenario provided\s+ r:   z^\s*\d+\.\s*z^\s*[-*]\s*zNo steps providedr;   zNo expected result providedr<   )verifyensurevalidatecheckrE   zVerify r   NzVerify resultzExecute the steps to validate: r?   r   r@   zError validating test case: )r   stripreplaceresubrM   rN   rj   rq   lower
startswithra   r+   r!   rg   )
r   scenarior   cleaned_stepsrJ   cleaned_stepexpectedactualderivedr0   s
             r1   _validate_and_clean_test_caser     s   S==!! 	V!*7!3!9!9!;!;!C!CD"!M!M!S!S!U!UIg ==$$ 		; ,2244H ?H(>>>6&#x88(0	*%%(>	*%%$:Ij! ==!! 	5g&E%&& 9 "! ? ?D ?

 ?'+zz||';';D"'E'E'K'K'M'M')vor<'P'P')vnb,'O'O' ?)00>>>6C%\]]I\	'""E3'' 9EKKMM 9--dB77==??vsE22%*	'""%8	'""!4Ig ==*++ 	I !2399;;H MH(EEE6&#x88/7	+,,/L	+,,+HI'( ==)) 	4/5577F 4V44-3	/* ==$$(>>>}}.// _JyIZ?[]`4a4a _fo  qB  gC  gI  gI  gK  gK _#$56<<>>}}112[\\ tNQRYll]^N^N^i'!**:*:*<*<<wqrr{JJdsG(/	*%%w'' _(^)T[J\(^(^	*% }}X&& 	/".Ih ==$$ 	\$-j$9$?$?$A$A$I$I$PR$S$S$Y$Y$[$[Ij!   >c!ff>>???s   P>Q 
R+Q<6R<Rc                    i }d}t          t          j        ||                     }|si S t          |          D ]\  }}|                    d                                          }|                                }|dz   t          |          k     r||dz                                            nt          |           }| ||                                         }	|	||<   |S )zExtract sections from test cases content based on TEST TYPE markers.
    
    Args:
        test_cases (str): The full test cases content
        
    Returns:
        Dict[str, str]: Dictionary of section name to section content
    zTEST TYPE:\s*([^\n]+)rE   )	rN   r   finditerrO   groupr   endra   start)
r3   rw   section_patternsection_matchesrI   matchry   	start_posend_posrz   s
             r1   r_   r_   e  s     H /O2;
CCDDO  	 o.. 1 15{{1~~++--IIKK	23A#O8L8L2L2L/!A#&,,...RUV`RaRa$Yw%67==??!0OrL   r=   r5   c           	      (   g }i }|}d}g }t                               d|            t                               d| dd                     d| v rd| v s#d| v rt          j        d|           s
d	| v rd
| v rt                               d           t          j        d|           }|D ]p}|                                }|rt          |          dk     r-d|v s,d	|v s(t          j        d|                                          ri }	||	d<   t          j        d|          }
|
rQ|
                    d                                          	                    dd                                          |	d<   nt          j        d|          }|rQ|                    d                                          	                    dd                                          |	d<   nm|                    d          d                                         }t          j        d|          r+|	                    dd                                          |	d<   t          j        d|t          j
                  }|r|                    d                                          	                    dd                                          }t          j        dd|          }t          j        dd|          }||	d<   nAt          j        d|t          j
                  }|r|                    d                                          	                    dd                                          }t          j        dd|          }t          j        dd|          }||	d<   nt          j        d|t          j
                  }|r~|                    d                                          	                    dd                                          }t          j        dd|          }t          j        dd|          }||	d<   t          j        d|t          j
                  }|r}|                    d                                          	                    dd                                          |	d<   t                               d|	d         dd           d!           n&t                               d"|dd#          d!           t          j        d$|t          j
                  }|r|                    d                                          }t                               d%|dd#          d!           t          j        d&|t          j                  }|rBd' |D             |	d(<   t                               d)t          |	d(                    d*           nCd+ |                    d          D             }||	d(<   t                               d)t          |	d(                    d,           nt          j        d-|t          j
                  }|r|                    d                                          }t                               d.|dd#          d!           t          j        d&|t          j                  }|rBd/ |D             |	d(<   t                               d)t          |	d(                    d*           nd0 |                    d          D             }||	d(<   t                               d)t          |	d(                    d,           nt                               d1|dd#          d!           t          j        d2|t          j
                  }|rT|                    d                                          }t                               d3|dd#          d!           |g|	d(<   n&t                               d4|dd#          d!           t          j        d5|t          j
                  }|r|                    d                                          	                    dd                                          }t          j        dd|          }t          j        dd|          }||	d6<   nAt          j        d7|t          j
                  }|r|                    d                                          	                    dd                                          }t          j        dd|          }t          j        dd|          }||	d6<   nt          j        d8|t          j
                  }|r~|                    d                                          	                    dd                                          }t          j        dd|          }t          j        dd|          }||	d6<   t          j        d9|          }|r*|                    d                                          |	d:<   t          j        d;|t          j
                  }|ri|                    d                                          }|r@|                    d<          s+|	                    dd                                          |	d=<   t          j        d>|          }|rP|                    d                                          	                    dd                                          |	d?<   |	                    d          rt#          |	          }	|                    |	           t                               d@|	d                     t                               dAt)          |	                                                      t                               dB|	                    ddC                      t                               dD|	                    d(dC                      r|r-t                               d)t          |           dE           |S t                               dF           |                     d          } d}!|!t          |           k     r[| |!                                         }"|!dz  }!|"s6|"                    dG          r+|"	                    dHd                                          p|}vt          j        dI|"          }
|
rt|r|r||d(<   |                    |           ||
                    d                                          	                    dd                                          dJ}d}g }t          j        dK|"          }|rT|rR|                    d                                          	                    dd                                          |d<   lt          j        dL|"          }|r|r~|                    d                                          	                    dd                                          |d<   t                               dM|d         dd           d!           t          j        dN|"          }|r9|r7dO}g }t                               dP|                    ddQ                      S|rt          j        dR|"          rd}||d(<   t                               dSt          |           dT|                    ddQ                      t          j        dU|"          }#|#rP|#                    d                                          	                    dd                                          |d6<   t          j        dV|"          }$|$r|$                                dW         r|$                    dX          n|"}%|%                                	                    dd                                          }&|&r2|                    |&           t                               dY|&            |"                                rp|"                                	                    dd                                          }'|'r2|                    |'           t                               dZ|'            Xt          j        dU|"          }|rT|rR|                    d                                          	                    dd                                          |d6<   t          j        d[|"          }(|(r.|r,|(                    d                                          |d:<   t          j        d\|"          }|rT|rR|                    d                                          	                    dd                                          |d=<   st          j        d]|"          }|rT|rR|                    d                                          	                    dd                                          |d?<   |r{|sy|"rwd?|v r|d?xx         d|"z   z  cc<   n_d=|v r|d=xx         d|"z   z  cc<   nGd6|v r|d6xx         d|"z   z  cc<   n/d|v r|dxx         d|"z   z  cc<   nd|v r|dxx         d|"z   z  cc<   |!t          |           k     [|r|r||d(<   |                    |           t                               d^|                    dd_                      t                               d`t)          |                                                      t                               da|                    ddC                      t                               db|                    d(dC                      t                               d)t          |           dc           |S )da
  Parse test cases using the traditional format.
    
    Args:
        test_cases (str): Test cases content to parse
        default_section (str): Default section name if none is specified
        
    Returns:
        List[Dict]: List of test case dictionaries
    Fz)Parsing test cases with default section: z)Raw test case content (first 500 chars): Ni  zTitle:zSteps to reproduce:zTC_[A-Z]+_\d+z**Test Case ID:**z**Test Steps:**zDetected test case formatz\n\s*\n
   r7   zTitle:\s*(.*?)(?:\n|$)rE   r   r6   r8   z%\*\*Test Case ID:\*\*\s*(.*?)(?:\n|$)rB   r   zYScenario:\s*(.*?)(?:\n\s*Preconditions:|\n\s*Steps to reproduce:|\n\s*Expected Result:|$)r   r   r9   zR\*\*Test Scenario:\*\*\s*(.*?)(?:\n\s*\*\*Test Steps:|\n\s*\*\*Expected Result:|$)zHDescription:\s*(.*?)(?:\n\s*Steps to reproduce:|\n\s*Expected Result:|$)zJPreconditions:\s*(.*?)(?:\n\s*Steps to reproduce:|\n\s*Expected Result:|$)r>   zFound preconditions: d   z...z!No preconditions found in block:    zX(?:\*\*)?Steps to reproduce:(?:\*\*)?\s*\n([\s\S]*?)(?=\n\s*(?:\*\*)?Expected Result:|$)zFound steps text: zK(?:^|\n)\s*(?:\d+\.\s*|\*\s*|\-\s*)(.*?)(?=\n\s*(?:\d+\.\s*|\*\s*|\-\s*)|$)c                     g | ]P}|                                 |                                                     d d                                           QS r   r6   r   r   rH   rJ   s     r1   rK   z,parse_traditional_format.<locals>.<listcomp>  sO    -|-|-|Y]osoyoyo{o{-|djjll.B.B4.L.L.R.R.T.T-|-|-|rL   r:   z
Extracted z steps using numbered formatc                     g | ]P}|                                 |                                                     d d                                           QS r   r   r   s     r1   rK   z,parse_traditional_format.<locals>.<listcomp>  sN     { { {Dnrnxnxnznz {!5!5dB!?!?!E!E!G!G { { {rL   z  steps using line-by-line formatzA\*\*Test Steps:\*\*\s*\n([\s\S]*?)(?=\n\s*\*\*Expected Result:|$)zFound test steps text: c                     g | ]P}|                                 |                                                     d d                                           QS r   r   r   s     r1   rK   z,parse_traditional_format.<locals>.<listcomp>  sd      2A  2A  2A]asws}s}ss  2A$**,,2F2FtR2P2P2V2V2X2X  2A  2A  2ArL   c                     g | ]P}|                                 |                                                     d d                                           QS r   r   r   s     r1   rK   z,parse_traditional_format.<locals>.<listcomp>  sO    $$$PTrvr|r|r~r~$TZZ\\%9%9$%C%C%I%I%K%K$$$rL   zNo steps found in block: z)Steps:\s*(.*?)(?:\n\s*Expected Result:|$)z&Found steps with alternative pattern: z*No steps found with any pattern in block: zMExpected Result:\s*(.*?)(?:\n\s*Actual Result:|\n\s*Status:|\n\s*Priority:|$)r;   zP\*\*Expected Result:\*\*\s*(.*?)(?:\n\s*\*\*Actual Result:|\n\s*\*\*Priority:|$)zNExpected Outcome:\s*(.*?)(?:\n\s*Actual Result:|\n\s*Status:|\n\s*Priority:|$)z\n\s*Status:\s*(.*?)(?:\n|$)r?   z*Actual Result:\s*(.*?)(?:\n\s*Priority:|$)z	Priority:r<   zPriority:\s*(.*?)(?:\n|$)r@   zExtracted test case: zTest case fields: z
Scenario: z	NOT FOUNDzSteps: z test cases using block parsingz)Using line-by-line parsing for test casesz####z/^(?:\d+\.\s*)?(?:\*\*)?Title:(?:\*\*)?\s*(.*?)$)r7   r8   z%^(?:\*\*)?Scenario:(?:\*\*)?\s*(.*?)$z*^(?:\*\*)?Preconditions:(?:\*\*)?\s*(.*?)$z%Found preconditions in line-by-line: z+^(?:\*\*)?Steps(?: to reproduce)?:(?:\*\*)?Tz(Started collecting steps for test case: r   z#^(?:\*\*)?Expected Result:(?:\*\*)?zFinished collecting z steps for test case: z,^(?:\*\*)?Expected Result:(?:\*\*)?\s*(.*?)$z^(?:(\d+)\.|\-|\*)\s*(.*?)$r   r\   zAdded step: zAdded step (no pattern): z^Status:\s*(.*?)$z*^(?:\*\*)?Actual Result:(?:\*\*)?\s*(.*?)$z%^(?:\*\*)?Priority:(?:\*\*)?\s*(.*?)$zFinal test case: zNO TITLEzFinal test case fields: zFinal Scenario: zFinal Steps: z& test cases using line-by-line parsing)r!   r*   r   searchr   r   ra   r   r   r   DOTALLr   rg   findall	MULTILINEr   r   r   rj   debugrN   keysgroups))r3   r5   rx   current_testcurrent_sectioncollecting_stepscurrent_stepstest_case_blocksblockr   title_matchtest_case_id_match
first_linescenario_matchscenario_texttest_scenario_matchalt_scenario_matchpreconditions_matchsteps_match
steps_text
step_linesr   test_steps_matchalt_steps_matchexpected_matchexpected_texttest_expected_matchalt_expected_matchstatus_matchactual_matchactual_resultpriority_matchlinesrI   lineer_match
step_match	step_textr   cleaned_linestatus_alones)                                            r1   r`   r`     s    IL%OM
KKMOMMNNN
KKNJtt<LNNOOO 	J#8J#F#FLaeoLoLotvt}  O  Q[  u\  u\Lo  bu  yC  bC  bC  HY  ]g  Hg  Hg/000 8J
;;% Y	R Y	REKKMME CJJOO 5  $75$@$@BHM]_d_j_j_l_lDmDm$@	'6	)$ !i(A5II V)4):):1)=)=)C)C)E)E)M)MdTV)W)W)])])_)_Ig&& *,3[]b)c)c&) V-?-E-Ea-H-H-N-N-P-P-X-XY]_a-b-b-h-h-j-j	'** &+[[%6%6q%9%?%?%A%A
8$4jAA V1;1C1CD"1M1M1S1S1U1UIg. "$  ,H  JO  QS  QZ  "[  "[! B$2$8$8$;$;$A$A$C$C$K$KDRT$U$U$[$[$]$]M$&F:sM$J$JM$&F63$F$FM,9Ij)) +-)  5J  LQ  SU  S\  +]  +]'* B(;(A(A!(D(D(J(J(L(L(T(TUY[](^(^(d(d(f(f(*z3(N(N(*vsM(J(J0=	*-- .0Y  8C  EJ  LN  LU  .V  .V*- B,>,D,DQ,G,G,M,M,O,O,W,WX\^`,a,a,g,g,i,iM,.F:sM,R,RM,.F63,N,NM4AIj1 ')i0}  @E  GI  GP  'Q  'Q#& Y1D1J1J11M1M1S1S1U1U1]1]^bdf1g1g1m1m1o1oIo.KK ]	/8RSWTWSW8X ] ] ]^^^^NN#WuTcT{#W#W#WXXX !i  )D  FK  MO  MV  W  W &j!,!2!21!5!5!;!;!=!=JKK JZ5E J J JKKK!#,z  }G  IK  IU  "V  "VJ! l-|-|ak-|-|-|	'*$fYw5G1H1H$f$f$fgggg !| {T^TdTdeiTjTj { { {-2	'*$jYw5G1H1H$j$j$jkkkk (*y1uw|  A  H  (I  (I$' j%5%;%;A%>%>%D%D%F%F
$Sj#>N$S$S$STTT%'Z0~  AK  MO  MY  &Z  &Z
% p 2A  2Aeo  2A  2A  2AIg."KK(jS79K5L5L(j(j(jkkkk %@$XbXhXhimXnXn$$$E16Ig."KK(nS79K5L5L(n(n(noooo'S5#;'S'S'STTT*,)4`bgikir*s*s* j)8)>)>q)A)A)G)G)I)IJ"KK(fQ[\`]`\`Qa(f(f(fggg2<Ig.."NN+hX]^b_b^bXc+h+h+hiii "$+{  ~C  EG  EN  "O  "O! I$2$8$8$;$;$A$A$C$C$K$KDRT$U$U$[$[$]$]M$&F:sM$J$JM$&F63$F$FM3@I/00 +-)  5H  JO  QS  QZ  +[  +['* I(;(A(A!(D(D(J(J(L(L(T(TUY[](^(^(d(d(f(f(*z3(N(N(*vsM(J(J7D	"344 .0Y  8I  KP  RT  R[  .\  .\*- I,>,D,DQ,G,G,M,M,O,O,W,WX\^`,a,a,g,g,i,iM,.F:sM,R,RM,.F63,N,NM;HI&78  "y)H%PP H*6*<*<Q*?*?*E*E*G*GIh'  "y)VX]_a_hii ]$0$6$6q$9$9$?$?$A$AM$ ]]-E-Ek-R-R ]5B5J5J4QS5T5T5Z5Z5\5\	/2 "$+G!O!O! f,:,@,@,C,C,I,I,K,K,S,STXZ\,],],c,c,e,eIj) ==)) R =i H HI$$Y///LL!M79K!M!MNNNLL!Nd9>>;K;K6L6L!N!NOOOLL!VimmJ.T.T!V!VWWWLL!P9==++N+N!P!PQQQ 	KKTS^^TTTUUU KK;<<< T""E	A
c%jj..Qx~~	Q 	 ??5!! 	"ll33399;;NO hQSWXX 	 /# :,9L)  ... +$**1--3355==dBGGMMOO L  %M "JDQQ 	l 	'5';';A'>'>'D'D'F'F'N'NtUW'X'X'^'^'`'`L$ !h'TVZ[[ 	< 	,?,E,Ea,H,H,N,N,P,P,X,XY]_a,b,b,h,h,j,jL)KKh_@]^b_b^b@chhhiii hMtTT 	< 	#MKKi<CSCST[]fCgCgiijjj  	x>EE 	#( (5W%  D3}3E3E  D  D]i]m]mnu  xA  ^B  ^B  D  D  E  E  E 8$SUYZZ j6>nnQ6G6G6M6M6O6O6W6WX\^`6a6a6g6g6i6iL!23 "@$GGJ 3=3D3D3F3Fr3JTJ,,Q///PT	(0088rBBHHJJ @!((666LL!>!>!>??? #zz||33D"==CCEE M!((666LL!K\!K!KLLL "QSWXX 	l 	.<.B.B1.E.E.K.K.M.M.U.UVZ\^._._.e.e.g.gL*+ x 4d;; 	L 	%1%7%7%:%:%@%@%B%BL" x MtTT 	L 	,8,>,>q,A,A,G,G,I,I,Q,QRVXZ,[,[,a,a,c,cL) "JDQQ 	l 	'5';';A'>'>'D'D'F'F'N'NtUW'X'X'^'^'`'`L$  	7 0 	7T 	7\))Z(((C$J6(((( L00_---t;----"l22.///3:=//// L00_---t;----|++Z(((C$J6(((o c%jj..t  O 	2$1L!&&&P)9)9':)N)NPPQQQK\5F5F5H5H0I0IKKLLLS(8(8[(Q(QSSTTTM\%5%5g{%K%KMMNNN
KKSS^^SSSTTTrL   )r=   )'utils.error_loggerr   r   r   r   r$   pandasrd   rW   r   r   r
   r   r   r   r   openpyxl.utils.dataframer   r   r   uuidloggingtypingr   r   r   basicConfigINFO	getLogger__name__r!   rq   r2   r   bytesr   r   r_   r`   rF   rL   r1   <module>r)     sR   W W W W W W W W W W W W 				           F F F F F F F F F F F F F F 6 6 6 6 6 6 				         ' ' ' ' ' ' ' ' ' '  ',/e f f f f		8	$	$c c hsm    >e# e# e(3- e e e eNsDJ st sRU saefiaj sot s s s sjUT Ud U U U Un3 4S>    >C C Cs CSWX\S] C C C C C CrL   