
    1$jW                    p   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mZm	Z	 d dl
mZ  ee                                          j        Zedz  dz  Zedz  Zedz  Zed	z  Zed
z  ZdZh dh dh dh dh dh dh ddZi Zd@dZe                                D ]\  ZZeD ]Zee ee          <   dAdZdBdZefdCdZd@dZ dDd"Z!dEd#Z"d@d$Z#dFd'Z$dGd*Z%dHd,Z&dId.Z'dJd/Z(dKd1Z)dLd2Z*dMd3Z+dNd4Z,dOd6Z-dPd9Z.dBd:Z/efdQd<Z0eefdRd=Z1dSd>Z2e3d?k    r e4 e2ej5                            dS )T    )annotationsN)datetimetimezone)PathDATABASEzGRAFO_D_DATABASE.sqliteGRAPH_IMPORTzgraph_inbox.txtimportedrejectedUncategorized>      TÍTULO DEL GRAFO
GRAPH NAMEGRAPH TITLENOMBRE GRAFONOMBRE DEL GRAFOTITULO DEL GRAFOGRAFOGRAPHTITLETITULO   TÍTULO>   
EVENT NAMENOMBRE DEL EVENTONAMEr   EVENTONOMBREr   r   >
      AÑO   CUÁNDOANODATETIMEWHENYEARFECHACUANDO	TIMESTAMP>      REGIÓN
   UBICACIÓNSITELUGARPLACEREGIONLOCATION	UBICACION>      QUIÉN   ORGANIZACIÓNWHOACTORQUIENACTORSAUTHORAUTHORSAUTORESPERSONAPERSONASORGANIZACIONORGANIZATION>      DESCRIPCIÓNBRIEF DESCRIPTIONBRIEFNOTASNOTESDETAILDETALLERESUMENABSTRACTDESCRIPCIONDESCRIPTION>      BIBLIOGRAFÍAURLLINKURLSLINKSFUENTESOURCEFUENTESSOURCES
REFERENCIAREFERENCIASBIBLIOGRAFIA)
graph_namenamedateplacewhobrief_descriptionsource_linkvaluestrreturnc                0   t          | pd          } t          j        d|           } d                    d | D                       } |                                 } t          j        dd|           } t          j        dd|                                           S )N NFKDc              3  B   K   | ]}t          j        |          |V  d S Nunicodedata	combining.0chs     import_graph_inbox.py	<genexpr>z_norm_label.<locals>.<genexpr>7   s2      HH2k.CB.G.GHBHHHHHH    
[^A-Z0-9]+ \s+)rZ   rb   	normalizejoinupperresubstrip)rY   s    rg   _norm_labelrs   4   s    E!&%00EGGHHHHHHHEKKMMEF=#u--E6&#u%%++---ri   c                 d    t          j        t          j                                      d          S )Nz%Y-%m-%dT%H:%M:%SZ)r   nowr   utcstrftime ri   rg   now_isory   B   s#    <%%../CDDDri   Nonec                    t                               d           t                              d           t                              d           t                                          st                              dd           d S d S )NT)exist_okr]   utf-8encoding)
IMPORT_DIRmkdirIMPORTED_DIRREJECTED_DIR
INBOX_FILEexists
write_textrx   ri   rg   ensure_import_dirsr   F   s    d###%%%%%% 4b7333334 4ri   db_pathr   sqlite3.Connectionc                    t          j        t          |           d          }t           j        |_        |                    d           |                    d           |                    d           |S )N   )timeoutzPRAGMA foreign_keys = ONzPRAGMA journal_mode = WALzPRAGMA busy_timeout = 5000)sqlite3connectrZ   Rowrow_factoryexecute)r   cons     rg   
connect_dbr   N   sc    
/#g,,
3
3
3CkCOKK*+++KK+,,,KK,---Jri   c                   t          | pd                              dd                              dd          } g }|                     d          D ]G}|                                }|                    d          s|dk    r2|                    |           Hd                    |                                          } t          j        dd|           } |                     d	          S )
Nr]   

```z***z\n{3,}z

z 	
`)	rZ   replacesplitrr   
startswithappendrn   rp   rq   )rY   lineslinestrippeds       rg   clean_valuer   W   s    $$VT22::4FFEED!!  ::<<u%% 	U):):TIIe""$$EF9fe,,E;;x   ri   r   boolc                J    t          t          j        d| pd                    S )Nz^\s*(?:\*{3,}|-{3,}|_{3,})\s*$r]   )r   rp   match)r   s    rg   is_separatorr   d   s!    :DJBGGHHHri   c                d   t          | pd                                          }|rt          |          rdS t          j        dd|                                          }t          j        dt          |                    rdS |                    d                                          }d}d|v r0|                    dd          \  }}|}|                                }n|}|                    d                                          }t          	                    t          |                    |fS )Nr]   Nr]   ^\s*#{1,6}\s*z^(NODO|NODE)\s*[-#:]?\s*\d*\b*:   )
rZ   rr   r   rp   rq   r   rs   r   _ALIAS_TO_FIELDget)r   rawprobeinlineleftright
label_parts          rg   label_from_liner   h   s   
djb//


!
!C ,s## xF#R--3355E	x0+e2D2DEE xKK""$$EF
e||kk#q))e

!!#&&,,..J{:6677??ri   c                |    t          | pd                                          D ]}t          |          }|r|c S dS r   )rZ   
splitlinesr   )rY   r   s     rg   first_nonempty_liner      sQ    EKR  ++--  4   	KKK	2ri   startintc                ^   g }t          |t          |                     D ]l}| |         }t          |          r|r nPt          |          \  }}| n9t	          j        d|t          j                  r n|                    |           mt          d	                    |                    S )N^\s*#{1,6}\s+(NODO|NODE)\bflagsr   )
rangelenr   r   rp   r   Ir   r   rn   )r   r   	collectedjr   field_s          rg   read_value_afterr      s    I5#e**%%  Qx 	 "4((qE814rtDDD 	Etyy++,,,ri   blockdictc                   |                      dd                               dd                              d          }i }d}|t          |          k     rmt          ||                   \  }}||dz  }4g }|r|                    |           |dz   }|t          |          k     rt          ||                   r	|rn||dz  }1t          ||                   \  }}	|n[t          j        d||         t          j                  rn3|                    ||                    |dz  }|t          |          k     t          d
                    |                    }
|
r=|dk    r2t          j        d	|
          }|rd
                    |          n|
||<   n|
||<   t          ||dz             }|t          |          k     m|S )
Nr   r   r   r   r   r   r   rX   https?://\S+)r   r   r   r   r   r   rp   r   r   r   rn   findallmax)r   r   fieldsir   r   value_linesr   
next_fieldr   rY   urlss               rg   extract_fieldsr      s   MM&$''//d;;AA$GGEF	A
c%jj..'a11v=FA 	'v&&&E#e**nnE!H%%  Q+E!H55MJ%x5uQxrtLLL uQx(((FA #e**nn" DIIk2233 	&%%z/59937 B		$Uu %u1q5MMI c%jj..L Mri   textc                   t          |           }|                    d          rt          |d                   S |                     dd                              dd                              d          }t          |          D ]\  }}t          |          \  }}|dk    rc|r;t          |                                          d         	                                c S t          ||dz             }|rt          |          c S |d d         D ]}t          j        dd	|          	                                }|	                    d
          	                                }|rt          |          rct          |          t          v rzt          j        d|t          j                  rt%          |          dk    r|c S dS )NrR   r   r   r   r   r   r   r   r]   r   ^(NODO|NODE)\br   x   GRAPH_INBOX)r   r   r   r   r   	enumerater   r   r   rr   r   rp   rq   r   rs   r   r   r   r   )	r   r   r   r   r   r   r   rY   ss	            rg   extract_graph_namer      s   D!!Fzz, 9"6,#7888LL&&..tT::@@FFEU## 2 24'--vL   C"6**5577:@@BBBBB$UAE22E 2*511111crc
 
 
F#R..4466GGCLL   	LOO 	q>>_,,8%q555 	q66S==HHH  =ri   listc                4   |                      dd                               dd          } t          j        d          }t          |                    |                     }|rg }t          |          D ]\  }}|                                }|dz   t          |          k     r||dz                                            nt          |           }| ||                                         }|r|	                    |           |S t          j
        d|           }	g }
|	D ]n}t          |          t          fddD                       }|d	k    r<                    d
          r'|
	                    |                                           od |
D             S )Nr   r   r   z8(?im)^\s*(?:#{1,6}\s*)?(?:NODO|NODE)\s*[-#:]?\s*\d*\b.*$r   z"(?m)^\s*(?:\*{3,}|-{3,}|_{3,})\s*$c              3  F   K   | ]}                     |          d V  dS )r   N)r   )re   kr   s     rg   rh   z$split_node_blocks.<locals>.<genexpr>   s8      iiQ[a[e[efg[h[hiqiiiiiiri   )rS   rT   rU   rV   rW      rT   c                    g | ]}||S rx   rx   )re   cs     rg   
<listcomp>z%split_node_blocks.<locals>.<listcomp>   s    '''!Q'A'''ri   )r   rp   compiler   finditerr   r   r   rr   r   r   r   sumr   )r   node_rematchesblocksidxr   r   endr   chunks
candidateschunkevidencer   s                @rg   split_node_blocksr      s   <<%%--dD99DjTUUG7##D))**G #G,, 	% 	%JCKKMME.1AgG.D.D'#'"((***#d))CsO))++E %e$$$X;TBBFJ - -&&iiii"Wiiiiiq==VZZ//=ekkmm,,,''z''''ri   c           	        t          |           }t          j        dd|                                          }|                    dd          }t          j        dd|          }|st          d          dd}t          j        d	|          }|rm |t          |                    d
                    t          |                    d                    t          |                    d                              S t          j        d|          }|rM |t          |                    d
                    t          |                    d                    d           S t          j        d|          }|rm |t          |                    d                    t          |                    d                    t          |                    d
                              S t          j        d|          }|r- |t          |                    d
                    d d           S t          j        d|          }|r- |t          |                    d                    d d           S t          d|            )Nz
\[[^\]]+\]r]   u   −-rl   rk   zdate is requiredc                   t          |           } | dk    s| dk     s| dk    rt          d|            |t          |           | d d fS t          |          }|dk     s|dk    rt          d|           || dk     r|  d|d	n| d
d|d	| |d fS t          |          }|dk     s|dk    rt          d|           | dk     r|  d|d	d|d	n| d
d|d	d|d	| ||fS )Nr   ii?B zyear out of range: r      zmonth out of range: r   02d04d   zday out of range: )r   
ValueErrorrZ   )ymds      rg   checkzparse_date.<locals>.check  sW   FF66Q[[AJJ61667779q661dD((FFq55AFF7A778889%&UUa>>!>>>>10B0B0B10B0B0BAq$NNFFq55AFF5!55666)*Q!%%a%%%a%%%%q4N4N4Nq4N4N4Nq4N4N4NPQSTVWWWri   z9^\s*(-?\d{1,6})\s*[-/]\s*(\d{1,2})\s*[-/]\s*(\d{1,2})\s*$r   r      z&^\s*(-?\d{1,6})\s*[-/]\s*(\d{1,2})\s*$z9^\s*(\d{1,2})\s*[-/]\s*(\d{1,2})\s*[-/]\s*(-?\d{1,6})\s*$z^\s*(-?\d{1,6})\s*$z(?<!\d)-?\d{1,6}(?!\d)r   zunsupported date format: )NN)	r   rp   rq   rr   r   r   searchr   group)rY   r   r   r   s       rg   
parse_dater     s&   
e

C
&C
(
(
.
.
0
0C
++eS
!
!C
&c
"
"C -+,,,X X X X* 		NPSTTA HuS__c!''!**oos1771::GGG
	;SAAA =uS__c!''!**oot<<<
	NPSTTA HuS__c!''!**oos1771::GGG
	(#..A 2uS__dD111
	+S11A 2uS__dD111
888
9
99ri   rS   c                D   t          j        dt          | pd                    }d                    d |D                       }|                                }t          j        dd|          }t          j        dd|                                          }|pdd d         S )	Nr^   r]   c              3  B   K   | ]}t          j        |          |V  d S r`   ra   rd   s     rg   rh   z$row_key_from_name.<locals>.<genexpr>:  s2      FF"K,A",E,EF2FFFFFFri   rj   rk   rl   r   P   )rb   rm   rZ   rn   ro   rp   rq   rr   )rS   r   s     rg   row_key_from_namer  8  s     TZR99D77FFFFFFFD::<<D6-d++D6&#t$$**,,D!M3B3''ri   c                   g }|                                  D ]}t          |          d         t          j        d|t          j                  r:t          j        d|          rPt          |          s'|                                                    d          r|	                    |           t          d                    |                    S )Nr   r   r   z	https?://r   r   )r   r   rp   r   r   r   r   rr   r   r   r   rn   )r   r   r   s      rg   fallback_descriptionr  A  s    E  "" 	 	4  #/814rtDDD 	9\4(( 	 	!8!8!?!? 	Ttyy''(((ri   c                l   t          | pd                                          } | st          d          t          |           }t	          |           }|st          d          g }g }t          |d          D ]\  }}t          |          }t          j        d|          }|r-|	                    d          sd
                    |          |d<   t          |	                    d	d                    }	|	sct          j        d
|          }
|
D ]K}t          j        d|                                t          j                  s|                                }	 nLt          |	                    dd                    }|	r|s|                    d| d           #	 t          |          \  }}}}n6# t           $ r)}|                    d| d|d|            Y d }~gd }~ww xY w|	                    dd          pt#          |          }|                    t%          |          dz   |	|||||	                    dd          |	                    dd          ||	                    dd          dd           |s3|rd
                    |dd                    nd}t          d|           |||fS )Nr]   zgraph_inbox.txt is emptyzno node/event blocks detectedr   r   r   rX   r   rS   z(?m)^\s*#{1,6}\s+(.+?)\s*$r   r   rT   znode z skipped: missing name or datez skipped: invalid date z: rW   rU   rV   graph-inbox-txt)index
event_name	date_text	date_year
date_monthdate_dayrU   rV   rW   rX   api_textz; zno valid nodeszno valid nodes parsed: )rZ   rr   r   r   r   r   r   rp   r   r   rn   r   r   r   r   r   	Exceptionr  r   )r   rR   r   nodeswarningsr   r   r   r   rS   headingshdate_rawr	  r
  r  r  excbriefdetails                       rg   parse_graph_textr  P  s
   tzr??  ""D 53444#D))Jt$$F :8999EHa000 ) )
U&&z/511 	4

=11 	4$(IIdOOF=!"6::fb#9#9:: 	z"?GGH  x 117799BDIII 7799DE 'vzz&"'='=>> 	8 	OOGCGGGHHH	9CH9M9M6Iy*hh 	 	 	OOSCSSSScSSTTTHHHH	 

.33R7KE7R7RZZ!^""$ ZZ,,::eR((!&!::mR88)
 
 	 	 	 	  =-5K8BCC=)));K;6;;<<<uh&&s   F22
G%<G  G%c                N   t                      }|                     d|f                                          }|r@|                     d|t          |d                   f           t          |d                   S |                     d|||f          }t          |j                  S )Nz%SELECT id FROM folders WHERE name = ?z5UPDATE folders SET is_open=1, updated_at=? WHERE id=?idzNINSERT INTO folders(name, is_open, created_at, updated_at) VALUES (?, 1, ?, ?))ry   r   fetchoner   	lastrowid)r   rS   tsrowcurs        rg   ensure_folderr     s    	B
++=w
G
G
P
P
R
RC
 KbRUVYZ^V_R`R`Mabbb3t9~~
++X	r2 C s}ri   basec                    t          |          }|}d}|                     d|f                                          r5| d| }|dz  }|                     d|f                                          5|S )Nr   z'SELECT id FROM graphs WHERE row_key = ?r   r   )r  r   r  )r   r!  	candidatens       rg   unique_row_keyr%    s    T""DI	A
++?)
N
N
W
W
Y
Y MMaMM		Q ++?)
N
N
W
W
Y
Y  ri   row_keyfolder_namec                   t                      }|                     d                                          }|r0	 t          j        |d         pd          }n# t
          $ r i }Y nw xY wi }t          |t                    si }|                    dg            |                    di            |                    di            |                    dg            |                    dg            ||d         vr|d         	                    d	|           ||d         <   d
|d         |<   fd|
                    dg           D             |d<   g |d<   |                     dt          j        |dd
          ||f           d S )Nz3SELECT value_json FROM ui_state WHERE key='folders'
value_jsonz{}foldersgraphFolderopendeletedRows
deleteRowsr   Tc                :    g | ]}t          |          k    |S rx   )rZ   )re   xr&  s     rg   r   z!sync_ui_state.<locals>.<listcomp>  s*    YYY!s1vvQXGXGXAGXGXGXri   z
        INSERT INTO ui_state(key, value_json, created_at, updated_at)
        VALUES ('folders', ?, ?, ?)
        ON CONFLICT(key) DO UPDATE SET
            value_json=excluded.value_json,
            updated_at=excluded.updated_at
        F)ensure_ascii	sort_keys)ry   r   r  jsonloadsr  
isinstancer   
setdefaultinsertr   dumps)r   r&  r'  r  r  states    `    rg   sync_ui_stater:    s   	B
++K
L
L
U
U
W
WC
 	Js<08D99EE 	 	 	EEE	 eT"" 	Y###	]B'''	VR   	]B'''	\2&&&%	***i;///$/E-!!%E&M+YYYYuyy'C'CYYYE-E,KK	 
E	>	>	>BG	 	 	 	 	s   A A&%A&c                   	 t                      }|                     d                                          d         }|                     d                                          d         }|                     d                                          d         }|                     d                                          d         }|                     d                                          d         }|                     d                                          }|rM|                     dt          |d	         pd          d
z   dd||||||t          |d                   f
           d S d S # t          $ r Y d S w xY w)NzSELECT COUNT(*) FROM graphsr   zSELECT COUNT(*) FROM eventszSELECT COUNT(*) FROM foldersz!SELECT COUNT(*) FROM api_registryzPRAGMA integrity_checkzCSELECT id, revision FROM persistence_audit ORDER BY id DESC LIMIT 1a4  
                UPDATE persistence_audit
                SET revision=?, dirty=0, last_operation=?, last_status=?, last_error=NULL,
                    sqlite_integrity=?, graph_count=?, event_count=?, folder_count=?,
                    api_count=?, updated_at=?
                WHERE id=?
                revisionr   zimport-graph-inboxokr  )ry   r   r  r   r  )r   r  graph_countevent_countfolder_count	api_count	integrityr  s           rg   update_auditrC    s~    YYkk"?@@IIKKANkk"?@@IIKKAN{{#ABBKKMMaPKK CDDMMOOPQR	KK 899BBDDQG	kk_``iikk 	KK J,1--1( D	NN    	 	,    s   E#E) )
E76E7
inbox_pathc                P   t                       t          |           } |                                 s0|                     dd           ddddt	          |           ddg g d		S |                     dd
          }|                                sddddt	          |           ddg g d		S 	 t          |          \  }}}n=# t          $ r0}dddt	          |          t	          |           ddg g d	cY d}~S d}~ww xY wddddt	          |           |t          |          d |D             |d		S )z
    Read GRAPH_IMPORT/graph_inbox.txt without writing to SQLite.
    Returns graph name, detected node count, node names and parser warnings.
    r]   r}   r~   TF%GRAPH_IMPORT/graph_inbox.txt is emptyNr   )	r=  preview
importablemessagefilerR   nodes_detected
node_namesr  r   r   errors)	r=  rG  rH  errorrJ  rR   rK  rL  r  zGraph inbox preview completedc                V    g | ]&}t          |                    d           pd          'S )r  r]   )rZ   r   )re   r$  s     rg   r   z'preview_graph_inbox.<locals>.<listcomp>0  s1    EEE!s155..4"55EEEri   )
r   r   r   r   rZ   	read_textrr   r  r  r   )rD  r   rR   r  r  r  s         rg   preview_graph_inboxrR    s   
 j!!J 
b7333>
OO

 

 
	
 CCD::<< 
>
OO

 

 
	

&6t&<&<#
E88 
 
 
XX
OO

 

 
	
 
	
 
	
 
	
 
	
 
	

 2J e**EEuEEE
 
 
s   'B; ;
C5%C0*C50C5c                D	   t                       t          |          }|                                s.|                    dd           ddd| t	          |          dS |                    dd	          }|                                sddd
t	          |          dS t          j        |	                    dd                    
                                d d         }	 t          |          \  }}}n# t          $ r}t          j        t          j                                      d          }t$          | d| dz  }	|	                    |d           ddt	          |          t	          |	          t	          |          dcY d }~S d }~ww xY wt'                      }
t)          t          |                     5 }|                    d           t-          |t.                    }t1          ||          }|                    d||||
|
f          }t3          |j                  }t7          |d          D ]C\  }}d| d| d| }|                    d|||t	          |d                   t	          |d                   t3          |d                   |                    d          |                    d          ||dt	          |                    d          pd          t	          |                    d          pd          t	          |                    d          pd          t	          |                    d           pd          t	          |                    d!          pd"          ||
|
f           Et;          ||t.                     t=          |           |                                 d d d            n# 1 swxY w Y   t          j        t          j                                      d          }tA          j!        d#d|          "                    d$d%          d d&         pd'}tF          | d%| d%| dz  }|                    |d           |                    dd           dd||t.          d(tI          |          |t	          |          dd)S )*Nr]   r}   r~   TFzcreated empty inbox: )r=  r	   rI  rJ  r   rM  rF  )rN  r   z%Y%m%d_%H%M%S
_rejected_z.txt)r=  r	   rO  rejected_copyrJ  zBEGIN IMMEDIATEz
            INSERT INTO graphs(row_key, visible_name, folder_id, color, created_at, updated_at)
            VALUES (?, ?, ?, NULL, ?, ?)
            r   r  zINBOX:r   a  
                INSERT INTO events(
                    legacy_id, graph_id, row_key, event_name,
                    date_text, date_year, date_month, date_day,
                    start_col, end_col, duration,
                    place, who, brief_description, source_link, api_text,
                    sort_index, created_at, updated_at
                )
                VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
                r  r	  r
  r  r  rU   rV   rW   rX   r  r  z[^A-Z0-9_ -]+rk   r   r   r   )r&  visible_namefolder)r=  r	   graphnodes_importedr  archived_copyinbox_cleared)%r   r   r   r   rZ   rQ  rr   hashlibsha256encode	hexdigestr  r  r   ru   r   rv   rw   r   ry   r   r   r   TARGET_FOLDERr%  r   r  r   r   r:  rC  commitrp   rq   r   r   r   )r   rD  r   digestrR   r  r  r  ts_filer
   r  r   	folder_idr&  r  graph_idr   node	legacy_idsafe_keyimported_copys                        rg   import_graph_inboxrj  5  s   j!!J 
b7333;z;;
OO	
 
 	
 CCD::<< 
>
OO	
 
 	
 ^DKK	KBBCCMMOOPSQSPSTF
&6t&<&<#
E88 

 

 

,x|,,55oFFW"D"D"D"D"DDD7333XX ]]
OO
 
 	
 	
 	
 	
 	
 	
	

 
B	DMM	"	" 5c%&&&!#}55	 j11kk j)R4
 
 s}%% a000 "	 "	GAt777177v77IKK	 \*++[)**[)**HH\**HHZ(())/R00-2..!455;<<//5266,,A0ABB'       D 	c7M222S

k5 5 5 5 5 5 5 5 5 5 5 5 5 5 5n l8<((11/BBGv&G44<<S#FFssKVwH g#G#G#G#G6#G#G#GGMTG444"w/// &#
 

 e**]++  s2   #C7 7
FBFFF?G9OOOc           
     "   t                       t          |           dk    r| d         dk    rt          t          j        dt          t                    t                                          t                                          rt                                          j	        ndt          ddd                     dS t          |           dk    rt| d         d	k    rht                              d
d          }t          |          \  }}}t          t          j        dd|t          |          |ddd                     dS t                      }t          t          j        |dd                     |                    d          rdndS )Nr   z--statusTr   )r=  inboxr   bytestarget_folderFr   )r1  indentz	--dry-runr}   r   rM  )r=  dry_runrR   rK  r  r=  )r   r   printr3  r8  rZ   r   r   statst_sizer`  rQ  r  rj  r   )argvr   rR   r  r  results         rg   mainrv    s   
4yy1}}aJ..dj__ ''))2<2C2C2E2ELZ__&&..1*
 
 a) ) ) 	* 	* 	* q
4yy1}}aK//##WY#GG&6t&<&<#
E8dj$!%jj 
 
 a) ) ) 	* 	* 	* q!!F	$*V%
:
:
:;;;

4  '11a'ri   __main__)rY   rZ   r[   rZ   )r[   rZ   )r[   rz   )r   r   r[   r   )r   rZ   r[   r   )r   rZ   )r   r   r[   rZ   )r   rZ   r[   r   )r   rZ   r[   rZ   )r   rZ   r[   r   )rY   rZ   )rS   rZ   r[   rZ   )r   rZ   r[   rZ   )r   rZ   )rS   rZ   r[   r   )r!  rZ   r[   rZ   )r&  rZ   r'  rZ   r[   rz   )rD  r   r[   r   )r   r   rD  r   r[   r   )r[   r   )6
__future__r   r\  r3  rp   r   sysrb   r   r   pathlibr   __file__resolveparentROOTDBr   r   r   r   r`  FIELD_ALIASESr   rs   itemsr   aliasesaliasry   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r%  r:  rC  rR  rj  rv  __name__
SystemExitrt  rx   ri   rg   <module>r     s   " " " " " "   				  



     ' ' ' ' ' ' ' '      tH~~&	J22N"
++
J&J&              - 8 . . . . $))++ 4 4NE7 4 4.3E**++4E E E E4 4 4 4  "     
! 
! 
! 
!I I I I@ @ @ @.   - - - -,+ + + +\   <( ( ( (42: 2: 2: 2:j( ( ( () ) ) )=' =' =' ='@      % % % %P! ! ! !J ,6 = = = = =@ (*j q q q q qh( ( ( (< z
*TT#(^^
$
$$ ri   