
    ei*|                        d dl mZmZ d dlZd dlm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Zd dlZd dlZd dlmZ d dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl Z d dl!Z!d dl Z d dl"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(m)Z)m*Z* d dl%m+Z+ d dl,m-Z- d dlm.Z. d dlm/Z/ d d	l0m1Z1 d d
l2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dlm:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEZEd dlFZFd dlGZGd dlHmIZI d dlJ d dlK d dlL d dlM d dlN  G d deO      ZPd ZQd ZRd ZSd ZTd ZUd ZVd ZWd ZXd  ZYd! ZZd" Z[d# Z\d$ Z]d% Z^d& Z_d' Z`d( Zay))    )HTMLCSSN)datetime)SMTP_SSLSMTPSMTPAuthenticationError)create_default_context)EmailMessage)date)	randrange)encoders)MIMEBase)MIMEMultipart)MIMEText)MIMEApplication)urlretrieve)default_backend)hashes)
PBKDF2HMAC)Fernet)relativedelta)Image)*c                       e Zd Zy)NoPumpsErrorN)__name__
__module____qualname__     1/var/www/reporter.gc-track.com/app/lib/htmlgen.pyr   r   =   s    r    r   c                      t        |       d   }y)Ndetectora!  <div class="detectorInfoTable">      <div class="row">          <div class="cell">id</div>          <div class="cell">"+str(data["id"])+"</div>      </div>      <div class="row">          <div class="cell">detectorstate_id</div>          <div class="cell">"+str(data["detectorstate_id"])+"</div>      </div>      <div class="row">          <div class="cell">label_title</div>          <div class="cell">"+str(data["label_title"])+"</div>      </div>     <div class="row">          <div class="cell">label_subtitle</div>         <div class="cell">"+str(data["label_subtitle"])+"</div>     </div>      <div class="row">          <div class="cell">tag</div>          <div class="cell">"+str(data["tag"])+"</div>     </div>      <div class="row">          <div class="cell">type</div>          <div class="cell">"+str(data["type"])+"</div>      </div>      <div class="row">          <div class="cell">serial_number</div>          <div class="cell">"+str(data["serial_number"])+"</div>      </div>      <div class="row">         <div class="cell">technician</div>         <div class="cell">"+str(data["technician"])+"</div>     </div>     <div class="row">         <div class="cell">installation_date</div>         <div class="cell">"+str(data["installation_date"])+"</div>     </div>     <div class="row">         <div class="cell">is_online</div>         <div class="cell">"+str(data["is_online"])+"</div>     </div>     <div class="row">         <div class="cell">is_active</div>         <div class="cell">"+str(data["is_active"])+"</div>     </div>     <div class="row">         <div class="cell">using_battery</div>         <div class="cell">"+str(data["using_battery"])+"</div>     </div>     <div class="row">         <div class="cell">baudrate</div>         <div class="cell">"+str(data["baudrate"])+"</div>      </div>     <div class="row">         <div class="cell">model</div>         <div class="cell">"+str(data["model"])+"</div>     </div>     <div class="row">         <div class="cell">brand</div>         <div class="cell">"+str(data["brand"])+"</div>     </div>     <div class="row">         <div class="cell">maker</div>         <div class="cell">"+str(data["maker"])+"</div>     </div>     <div class="row">         <div class="cell">tz</div>         <div class="cell">"+str(data["tz"])+"</div>     </div>     <div class="row">         <div class="cell">last_transmission</div>         <div class="cell">"+str(data["last_transmission"])+"</div>     </div>     <div class="row">         <div class="cell">sw_maintenance</div>         <div class="cell">"+str(data["sw_maintenance"])+"</div>     </div>     <div class="row">         <div class="cell">has_securitycontact</div>         <div class="cell">"+str(data["has_securitycontact"])+"</div>     </div>     <div class="row">         <div class="cell">is_battery_enabled</div>         <div class="cell">"+str(data["is_battery_enabled"])+"</div>     </div>     <div class="row">         <div class="cell">is_reset_enabled</div>         <div class="cell">"+str(data["is_reset_enabled"])+"</div>     </div>     <div class="row">        <div class="cell">is_sd_enabled</div>         <div class="cell">"+str(data["is_sd_enabled"])+"</div>    </div>     <div class="row">         <div class="cell">is_sd_healthy</div>         <div class="cell">"+str(data["is_sd_healthy"])+"</div>     </div>     <div class="row">         <div class="cell">flag_version</div>         <div class="cell">"+str(data["flag_version"])+"</div>     </div>     <div class="row">         <div class="cell">slave_id</div>         <div class="cell">"+str(data["slave_id"])+"</div>     </div>     <div class="row">         <div class="cell">has_panelmap</div>         <div class="cell">"+str(data["has_panelmap"])+"</div>     </div>     <div class="row">        <div class="cell">is_protocol_disconnected</div>         <div class="cell">"+str(data["is_protocol_disconnected"])+"</div>     </div>     <div class="row">         <div class="cell">connection_mode</div>         <div class="cell">"+str(data["connection_mode"])+"</div>     </div>     <div class="row">         <div class="cell">count_bad_transmissions</div>         <div class="cell">"+str(data["count_bad_transmissions"])+"</div>     </div>     <div class="row">         <div class="cell">vendor_id</div>         <div class="cell">"+str(data["vendor_id"])+"</div>     </div>     <div class="row">         <div class="cell">buyer</div>         <div class="cell">"+str(data["buyer"])+"</div>     </div>     <div class="row">         <div class="cell">carrier</div>         <div class="cell">"+str(data["carrier"])+"</div>     </div>     <div class="row">         <div class="cell">icc</div>         <div class="cell">"+str(data["icc"])+"</div>     </div>     <div class="row">         <div class="cell">sim_phonenumber</div>         <div class="cell">"+str(data["sim_phonenumber"])+"</div>    </div></div>)getDetectorInfo)facilitydatas     r!   getDetectorInfoHtmlr'   @   s    8$Z0DLr    c           	         	 | d   }| d   }d}d}d}d}t        |d         t        |d         z   }|dz  }|d|d    dz  }|d|d    dz  }|d| dz  }t        |d         t        |d         z   }|d	z  }|d|d    dz  }|d|d    dz  }|d| dz  }t        |d
         t        |d
         z   }	|dz  }|d|d
    dz  }|d|d
    dz  }|d|	 dz  }|rd| d| d| d| d	}
|
S d}
|
S # t         t        f$ r Y yw xY w)Nconteo_arranques_bombasconteo_arranques_bombas_mant diesel_activations<th> Bomba Diesel </th><th></th>electric_activations<th> Bomba Electrica </th>jockey_activations<th> Bomba Jockey </th>z<table class="count-table">
            <caption>Arranques de motor</caption>
            <thead>
                <tr><th></th>\</tr>
            </thead>
            <tbody>
                <tr><th>En mantenimiento</th>9</tr>
                <tr><th>Fuera de mantenimiento</th>(</tr>
                <tr><th>Total</th>+</tr>
            </tbody>
        </table>KeyError	TypeErrorintstateRecordsr&   dataMant	pumpNames	mant_runsnormal_runs
total_runsbd_totalbe_totalbj_totalcontents              r!   getNewPumpRunCountrG      s   56 >?
 IIKJ 4,-.X>R5S1TTH**I4!567u==IT$345U;;KD
%((J 4./03x@V7W3XXH--I4!789??IT$567u==KD
%((J 4,-.X>R5S1TTH**I4!567u==IT$345U;;KD
%((J ([ ). /8[ 944?= A##-, /
 N N[ i     
C4 4DDc           	         	 | d   }| d   }d}d}d}d}t        |d         t        |d         z   }|dz  }|d|d    dz  }|d|d    dz  }|d| dz  }t        |d         t        |d         z   }|d	z  }|d|d    dz  }|d|d    dz  }|d| dz  }t        |d
         t        |d
         z   }	|dz  }|d|d
    dz  }|d|d
    dz  }|d|	 dz  }|rd| d| d| d| d	}
|
S d}
|
S # t         t        f$ r Y yw xY w)Nconteo_alertas_generalesconteo_alertas_generales_mantr+   r,   r-   r.   r/   r0   r1   r2   r3   z~<table class="count-table">
            <caption>Alertas generales</caption>
            <thead>
                <tr><th></th>r4   r5   r6   r7   r8   r<   s              r!   getNewAlertCountrL     s   67 ?@
 IIKJ 4,-.X>R5S1TTH**I4!567u==IT$345U;;KD
%((J 4./03x@V7W3XXH--I4!789??IT$567u==KD
%((J 4,-.X>R5S1TTH**I4!567u==IT$345U;;KD
%((J ([ ). /8[ 944?= A##-, /
 N N[ i  rH   c                 H   t        | |      d   d   }|j                  dg       }|j                  dg       }d}d}d}d}|D ][  }	|dz   |	d   z   dz   }|dz   t        |	d	         z   dz   }|dz   t        |	d
         z   dz   }|dz   t        |	d	   |	d
   z         z   dz   }] |D ]L  }
|dz   }|dz   t        |
d         z   dz   }|dz   t        |
d         z   dz   }|dz   t        |
d         z   dz   }N |dk7  r+|dk7  r&|dk7  r!|dk7  rd|z   dz   |z   dz   |z   dz   |z   dz   }|S d}|S )Nfacility_datar   pump_running_alerts_countjockey_pump_activations_countr+   r.   	pump_namer/   current_month_count_maintenancecurrent_month_countz<th>Bomba Jockey </th>last30days_maintenancemonth_activationstotala<  <table class="count-table">                                    <caption>                                        Arranques de motor                                    </caption>                                    <thead>                                        <tr><th></th>                                            </tr>                                    </thead>                                    <tbody>                                        <tr>                                            <th>En mantenimiento</th>                                                                                    </tr>                                        <tr>                                            <th>Fuera de mantenimiento</th>                                                                                    </tr>                                        <tr>                                            <th>Total</th>                                                                                    </tr>                                    </tbody>                                </table>)getMonthActivationsgetstr)
facilityIdmonthfacility_infopumpRun	jockeyRunr?   r@   rA   rB   pumpnjockeyrF   s               r!   getPumpRunCountre   6  s   '
59/J1MM ;R@G!!"A2FIIIKJ |&u['99'A	&s51R+S'TTU\\	!F*3u5J/K+LLWT&(U3T-UV[\qVr-r)sst{{
	|  F 88	&s62J+K'LLWT	!F*3v6I/J+KKGS&(VG_)==gE
	F B9?{b/@ZSUEU. /889.. /889.. /::;..& /9'9&:*'*4 N Nr    c                 @   | d   }d}d}d}d}d}|D ][  }|dz   |d   z   dz   }|dz   t        |d         z   dz   }|dz   t        |d         z   dz   }|dz   t        |d   |d   z         z   dz   }] |dk7  r)|dk7  r$|dk7  r|dk7  rd|z   d	z   |z   d
z   |z   dz   |z   dz   }|S )Npump_trouble_alerts_countr+   r.   rQ   r/   rR   rS   a;  <table class="count-table">                                    <caption>                                        Alertas generales                                    </caption>                                    <thead>                                        <tr><th></th>                                            rW   rX   rY   rZ   )r]   )
reportDatara   r?   r@   rA   rB   rF   rc   s           r!   getPumpAlertCountri   i  s6   45GIIKJG |&u['99'A	&s51R+S'TTU\\	!F*3u5J/K+LLWT&(U3H-I%PqJr-r)sst{{
	| B9?{b/@ZSUEU. /889.. /889.. /::;..& /9'9&:*'*. Nr    c                 L   | d   }| d   }	 |d   }|d   }||z   }dt        |d         z   dz   t        |d         z   dz   t        |d	         z   dz   t        |      z   d
z   t        |d         z   dz   t        |d         z   dz   t        |d	         z   dz   t        |      z   dz   t        |d   |d   z         z   dz   t        |d   |d   z         z   dz   t        |d	   |d	   z         z   dz   t        |      z   dz   }|dk7  r|S t        d      # t         $ r
 d}d}d}Y w xY w)Nalarm_panel_events_counteralarm_panel_events_mant_counter	SEGURIDADr   u  <table class="count-table">                                    <caption>                                        Alertas de panel de alarmas                                    </caption>                                    <thead>                                        <tr>                                            <th></th>                                            <th>Alarmas de Fuego</th>                                            <th>Alarmas de Falla</th>                                            <th>Alarmas de Supervisión</th>                                            <th>Alarmas de Seguridad</th>                                        </tr>                                    </thead>                                    <tbody>                                        <tr>                                            <th>En Mantenimiento</th>                                            <td>NORMALz5</td>                                            <td>ALARMASUPERVISORIOz</td>                                        </tr>                                        <tr>                                            <th>Fuera de Mantenimiento</th>                                            <td>z</td>                                        </tr>                                        <tr>                                            <th>Total</th>                                            <td>z</td>                                        </tr>                                    </tbody>                                </table>r+   +A descriptive message about the type error.)r:   r]   )rh   r#   detectorMansegsegmsegtotalrF   s          r!   getDetectorCountrv     s   67H>?K{#;'82  36k(6K2L!M N2!2" 36k(6K2L#M"N2#2$ 36k.6Q2R%S$T2%2& 36d)'<&=2'2. 36hx6H2I/J.K2/20 36hx6H2I1J0K2122 36h~6N2O3P2Q2324 36c(5;4<252< 36hx6HU]I^6^2_=`<a2=2> 36hx6HU]I^6^2_?`>a2? 2@ 36h~6N{[iOj6j2kA l@m2A!2B 36h-C!@BA*C$*GJ "}EFF[  s   D D#"D#c                     t        |       d   }d}d}|D ]*  }|dz   }|D ]  }|dz   t        ||         z   dz   } |dz   }, ||z   dz   S )	Ncomponent_lista  <table class="details><tbody>        <tr><thead>        <th>id</div>        <th>componentclass_id</th>        <th>componentstate_id</th>        <th>componenttype_id</th>        <th>redbox_id</th>        <th>facility_id</th>        <th>name_es_mx</th>        <th>name_en_us</th>        <th>description_es_mx</th>        <th>description_en_us</th>        <th>has_countrecord</th>        <th>has_information</th>        <th>has_staterecord</th>        <th>has_valuerecord</th>        <th>graph_type</th>        <th>graph_component_id</th>        <th>building_id</th>        <th>output_states</th>        <th>componentstate</th>        <th>componenttype</th>        <th>output_list</th>        </thead></tr>r+   <tr><td></td>z</tr>z</tbody></table>)listComponentr]   )	componentr&   row	cell_datacell	cell_texts         r!   getComponentListHtmlr     s    #$45DC2 I (&	 	HI!F*3tI+??GI	H'		( y=+++r    c                     t        | ||      d   }d}|D ]1  }|dz   }|dz   |d   z   dz   }|dz   t        |d         z   dz   }|dz   }3 d|z   d	z   }|S )
Ndetectormessage_listr+   ry   rz   subject_es_mxr{   
panel_time  <table class="alerts-table">                                    <caption>                                        Notificaciones del panel de alarmas                                    </caption>                                    <tbody>                                        <tr>                                            <thead>                                                <th class="alerts-description">Descripción</th>                                                <th class="alerts-start-date">Fecha</th>                                            </thead>                                        </tr>                                   T                                    </tbody>                                </table>)listDetectorMessageByDateformatDateAlertsr^   	startDateendDater&   r   r   tables          r!   generateAlarmTableByDateHtmlr     s    $Z	'BCYZDI &v%	v%d?&;;GC	v%&6tL7I&JJ7R	v%		&% &//0**E Lr    c                    t        j                  t        |      d      }t        |j                        }t        |j
                        }t        ||d      }t        ||dz   d      }	 t        | |j                  d      |j                  d            d   }d}|D ]1  }	|dz   }|dz   |	d   z   d	z   }|dz   t        |	d
         z   d	z   }|dz   }3 d|z   dz   }
|
S # t        j                  j                  $ r Y yw xY w)Nz%Y-%m   z%Y-%m-%dr   r+   ry   rz   r   r{   r   r   r   )r   strptimer]   r;   yearr_   r   strftimer   jsondecoderJSONDecodeError)r^   r   selectedDater   r_   r   r   r&   r   r   r   s              r!   generateAlarmTableByMonthHtmlr   
  s0   $$SYw7L|  !D""#EeA&ItE!GA&G(I4F4Fz4RSZScScdnSop  rH  I	 	*D!6)I!6)$*??GI!6)*:4;M*NNwVI!6)I		*% &//0**" L <<'' s   (A.C C87C8c                    t        |       d   }d}|D ]a  }|dz   }|d   }|d   du rd}|dz   |z   dz   }|dz   t        |d	         z   dz   }|dz   t        |d
         z   dz   }|dz   |d   z   dz   }|dz   }c d|z   dz   }|S )Nredboxmessage_listr+   ry   r   u   ActivaciónArranque de Motor de Bombarz   r{   
start_timeend_timeactive_timeQ  <table class="alerts-table">                                    <caption>                                        Alertas fuera del mantenimiento -d                                    </caption>                                    <tbody>                                        <tr>                                            <thead>                                                <th class="alerts-description">Descripción</th>                                                <th class="alerts-start-date">Inicio</th>                                                <th class="alerts-end-date">Restablecimiento</th>                                                <th class="alerts-duration">Duración<br>(hh:mm:ss)</th>                                            </thead>                                        </tr>                                   r   )listAlertHistoryr   )r^   r&   r   r   subjectr   s         r!   generateAlertHistoryHtmlr   /  s    J'(<=DI &v%	 ' M12Gv%g-g5	 v%&6tL7I&JJ7R	v%&6tJ7G&HHP	v%d=&99'A	v%	&"% &//0**E" Lr    c                    d}d}| d   }t        |      dk  rd}|S |D ]  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d      }|j                  d
d      }	|d| d| dt        |       dt        |       d|	 dz  } |r	|d| dz  }|dk7  r|S t        d      )Nr+   activaciones_generalesr   zM<caption>No se encontraron Alertas generales fuera de mantenimiento</caption>output_nameN/Acomponent_typer   r   r   <tr><td>	</td><td>
</td></tr>uV  
        <table class="activations-table">
            <caption>Alertas generales fuera de mantenimiento</caption>
            <thead>
                <tr>
                    <th class="activations-description">Descripción</th>
                    <th class="activations-duration">Equipo</th>
                    <th class="activations-start-date">Inicio</th>
                    <th class="activations-end-date">Restablecimiento</th>
                    <th class="activations-duration">Duración<br>(hh:mm:ss)</th>
                </tr>
            </thead>
            <tbody>
                &
            </tbody>
        </table>rq   lenr\   r   r:   
r=   rF   	tabledatadetailspumpruneventdevicestartenddurations
             r!   generateAlertHistorybyMonthHtmlr   X  s&   GI34G
7|aa  XM51-u5L%0kk*e,;;}e4xwixyAQRWAX@YYbcstwcxby  zC  DL  CM  MW  X  	X	X     	" "}EFFr    c                    d}d}| d   }t        |      dk  rd}|S |D ]  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d      }|j                  d
d      }	|d| d| dt        |       dt        |       d|	 dz  } |r	|d| dz  }|dk7  r|S t        d      )Nr+   activaciones_generales_mantr   zG<caption>No se encontraron alertas generales en mantenimiento</caption>r   r   r   r   r   r   r   r   r   uP  
        <table class="activations-table">
            <caption>Alertas generales en mantenimiento</caption>
            <thead>
                <tr>
                    <th class="activations-description">Descripción</th>
                    <th class="activations-duration">Equipo</th>
                    <th class="activations-start-date">Inicio</th>
                    <th class="activations-end-date">Restablecimiento</th>
                    <th class="activations-duration">Duración<br>(hh:mm:ss)</th>
                </tr>
            </thead>
            <tbody>
                r   rq   r   r   s
             r!   #generateAlertHistorybyMonthHtmlMantr     s$   GI89G
7|a[ XM51-u5L%0kk*e,;;}e4xwixyAQRWAX@YYbcstwcxby  zC  DL  CM  MW  X  	X	X     	" "}EFFr    c                    	 t        | ||      d   }d}|D ]V  }|dz   }|dz   |d   z   dz   }|dz   t        |d         z   dz   }|dz   t        |d         z   dz   }|dz   |d	   z   dz   }|dz   }X d
|z   dz   }|S # t        $ r Y yw xY w)Nr   r+   ry   rz   r   r{   r   r   r   r   r   )listAlertHistoryByDater   	Exceptionr   s          r!   generateAlertHistoryByDateHtmlr     s    #JyABVWdi ($')'_(==gE)'(8l9K(LLWT)'(8j9I(JJ7R)'](;;GC)')(% &//0**e& L  s   A5A9 9	BBc                 <    t        | |      }|dk7  ryt        d      )Nr+   u   <div class="graph"><h3 class="graph-title">Comportamiento de presión de sistema</h3><img src="./images/graph_pressure.svg" /></div>rq   )generatePressureGraphr:   componentIdr_   paths      r!   generatePressureGraphHtmlr     s'     U3Drz VEFFr    c                 <    t        | |      }|dk7  ryt        d      )Nr+   z<div class="graph"><h3 class="graph-title">Conteo de arranques de bomba jockey</h3><img src="./images/graph_jockey.svg" /></div>rq   )generateJockeyGraphr:   r   s      r!   generateJockeyGraphHtmlr     s'    {51Drz REFFr    c                 p   d}d}| d   }t        |      dk  rt        d      |D ]s  }d}|j                  dd      }|j                  dd      }|j                  d	d      }|j                  d
d      }	|d| d| dt        |       dt        |       d|	 dz  }u |r	|d| dz  }|dk7  r|S t	        d      )Nr+   arranques_bombasr   rq   r   r   r   r   r   r   r   r   r   uN  
        <table class="activations-table">
            <caption>Arranques fuera de mantenimiento</caption>
            <thead>
                <tr>
                    <th class="activations-description">Descripción</th>
                    <th class="activations-duration">Equipo</th>
                    <th class="activations-start-date">Inicio</th>
                    <th class="activations-end-date">Restablecimiento</th>
                    <th class="activations-duration">Duración<br>(hh:mm:ss)</th>
                </tr>
            </thead>
            <tbody>
                r   )r   r   r\   r   r:   r   s
             r!   generatePumpDetailsr     s   GI-.G
7|aHII X,-u5L%0kk*e,;;}e4xwixyAQRWAX@YYbcstwcxby  zC  DL  CM  MW  X  	X	X     	" "}EFFr    c                 b   d}d}| d   }t        |      dk  rd}|S |D ]s  }d}|j                  dd      }|j                  dd      }|j                  d	d      }|j                  d
d      }	|d| d| dt        |       dt        |       d|	 dz  }u |r	|d| dz  }|dk7  r|S t        d      )Nr+   arranques_bombas_mantr   z?<caption>No se encontraron arranques en mantenimiento</caption>r   r   r   r   r   r   r   r   r   uH  
        <table class="activations-table">
            <caption>Arranques en mantenimiento</caption>
            <thead>
                <tr>
                    <th class="activations-description">Descripción</th>
                    <th class="activations-duration">Equipo</th>
                    <th class="activations-start-date">Inicio</th>
                    <th class="activations-end-date">Restablecimiento</th>
                    <th class="activations-duration">Duración<br>(hh:mm:ss)</th>
                </tr>
            </thead>
            <tbody>
                r   rq   r   r   s
             r!   generatePumpDetailsMantr     s   GI23G
7|aS X,-u5L%0kk*e,;;}e4xwixyAQRWAX@YYbcstwcxby  zC  DL  CM  MW  X  	X	X     	" "}EFFr    )b
weasyprintr   r   timer   
subprocessosr   pandaspdmatplotlib.patchespatchesmpatchesnumpynppylabpltrequestsmatplotlib.pyplotpyplotmatplotlib.datesdatesmdate
matplotlibmplrandomstringsysreurllib.requesturllibunicodedatalocalepdfkitargparseshutilfnmatchsslsmtplibgcr   r   r   r	   email.messager
   r   r   emailr   email.mime.baser   email.mime.multipartr   email.mime.textr   email.mime.applicationr   r   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.kdf.pbkdf2r   cryptography.fernetr   dateutil.relativedeltar   cairosvg	traceback
dateparserPILr   lib.apicalls	lib.utilslib.htmlgenlib.graphsgenlib.langstringsr   r   r'   rG   rL   re   ri   rv   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   <module>r     s,        	   %          
  	     	       
  	 ; ; & &    $ . $ 2 & 8 1 @ & 0         	9 	N`1f1f1f'R5Gn$,L6#J'R'GR&GP!FGG%GN&Gr    