
    hL                    9   d dl Z d dlZ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mZ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mZmZ d d	lT 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 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(m)Z) d dl*m+Z+ d dl,m-Z- d dl.Z.d dl/Z/d dl0Z0d dl1Z1dZ2 G d d          Z3 G d d          Z4 G d d          Z5 G d d          Z6d Z7d Z8ddZ9d Z:ddZ;ddZ<d  Z=d! Z>d" Z?d# Z@dd$d%ZAd& ZBdd'ZCd( ZDdd)ZE	 	 	 	 	 dd.eFd/eFd0eFd1eGd2eHd3eHd4eFfd5ZIdd6eFfd7ZJdd6eFd8e+eF         d9e+eF         d4eFfd:ZKd6eFd4eFfd;ZLd< ZMd= ZNd> ZOd? ZPd@ ZQ G dA dB          ZRddCZSdD ZTdE ZUdF ZVdG ZWddHZXdI ZYdJeFd4eFfdKZZdJeFd4eFfdLZ[ddJeFd6eFfdMZ\dN Z]dddRZ^dS Z_dT Z`dU ZadV Zb G dW dX          ZcdY Zd	 	 	 dd\Zee-d]             Zfd^d_d`dadbdcdddedfdgdhdidjZg e/jh        dk          Zi e/jh        dl          Zjdm Zki dndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddēddƓddȓddʓdd̓ddΓddГddғi ddԓdd֓ddؓddړddܓddޓddddddddddddddddddddddi dddddddddddd ddddddddd	d
ddddddddddddi dddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8i d9d:d;d<d=d<d>d?d@dAdBdCdDdCdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXi dYdZd[dZd\d]d^d_d`dadbdcdddedfdgdhdidjdkdldkdmdndodpdqdrdsdtdudvdwdxi dydzd{d|d}d~ddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddÓdĐdœdƐdǓdȐdɓdʐd˓d̐d͓dΐdϓdАdѓdҐdӓdԐdՓd֐dדdؐdٓdڐdۓdܐdݓi dސdߓddddddddddddddddddddddddddddddddi ddd ddddddddd	d
d	ddddddddddddddddddddi dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@i dAd@dBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dai dbdadcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddÐdēdŐdƓdǐdȓdɐdʓdːdʓd̐d͓dΐdϓdАdѓdҐdӓdԐdՓd֐dדdؐdٓdڐdۓdܐdݓdސdݓi dߐdddddddddddddddddddddddddddddddddi dddd ddddddddddd	dd
dddddddddddddddddi dddddddd d!d d"d#d$d%d&d'd(d)d*d)d+d,d-d.d/d.d0d1d2d1d3d4d5d6i d7d8d9d8d:d;d<d=d>d?d@dAdBdAdCdDdEdDdFdGdHdGdIdJdKdLdMdNdOdPdQdRdSdTi dUdVdWdXdYdZd[d\d]d^d_d^d`dadbd,dcd,dddedfdgdhdidjdkdldmdndodpdqdrdqi dsdtdudtdvdwdxdwdydzd{d|d}d~dd~dd~ddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddÓdĐdÓdŐdÓdƐdÓdǐdȓdɐdʓdːd̓d͐d̓dΐdϓdАdϓdѐdϓdҐdӓdԐdՓd֐dדdؐdדdِdדdڐdדi dېdܓdݐdܓdސdߓddߓddddddddddddddddddddddddddi ddddddddddddddddddd ddddddddddd	d
dddi dddddddddddddddddddddddddddddd d!d d"d#i d$d#d%d#d&d'd(d'd)d'd*d'd+d,d-d,d.d/d0d1d2d3d4d3d5d3d6d3d7d3d8d3d9d3i d:d;d<d;d=d;d>d?d@d?dAdBdCdBdDdBdEdBdFdBdGdHdIdHdJdHdKdHdLdMdNdOdPdOi dQdOdRdOdSdOdTdOdUdVdWdVdXdVdYdZd[dZd\dZd]dZd^dZd_dZd`dadbdadcdadddei dfdedgdedhdedidjdkdjdldjdmdjdndodpdodqdrdsdrdtdrdudrdvdrdwdrdxdrdydri dzd{d|d{d}d~dd~dd~dd~dd~dd~ddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddddddddddddddddddÐddĐddŐddƐddǐdi dȐddɐddʐddːdd̐dd͐dΓdϐdΓdАdΓdѐdΓdҐdΓdӐdΓdԐdΓdՐdΓd֐dΓdאdΓdؐdΓdِdΓdΐdΐdڐdڐdڐdڐdڐdڐdڐdڐdڐdڐdڐdڐdۜZli ddodݐdޓdߐdddddddddddddddddddddddddddddi ddddd ddddddddd	d
dddddddddddddddddddi ddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?i d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.dUdVdWdXdYdZd[d\d]d\d^d\i d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddi dddddddddddddddddddd~ddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdޓdߐdi ddddddddddddddddddddddddddddddddddi ddd ddddddddd	d
dddddddddddddddddddddi dddd d!d"d#d$d%d&d'd4d(d)d*d+d,dEd-d.d/d0d1d2d3dKd4dMd5d6d7d6d8d9i d:d9d;dOd<d=d>d?d@dAdBdAdCdDdEdFdGdHdIdHdJdKdLdMdNdOdPdQdRdfdSdTdUdli dVdWdXdndYdZd[dZd\d]d^dpd_d`dadbdcdddedfdgdfdhdidjddkddldmdndodpdi dqdrdsddtdduddvdwdxdydzd{d|d}d~dddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddƓddddȓdddddddd͓ddddӓddddddddddddۓddddi dddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐ddΐdϓdАdѓdҐdѓdӐdԓdՐd֓dאddؐddِdړi dېddܐdݓdސddߐddddd ddddddddddddddddddddddi dddddddddd'dd'dddddd.d d4dddd8dd?dddddd	d
di dddddddddddddddddddd,dd,ddddddd d!d"dgd#dgi d$d%d&d%d'dmd(dmd)d*d+dqd,d-d.dzd/dzd0d|d1dd2dd3dd4dd5dd6d7d8di d9dd:dd;d<d=d<d>d?d@ddAddBdCdDddEddFdGdHdGdIdJdKdJdLdMdNdMdOdMi dPddQdRdSdTdUdTdVdTdWddXdYdZdȓd[dȓd\dʓd]d̓d^d̓d_d̓d`dӓdadדdbdדdcdדi dddߓdeddfddgdhdidhdjdhdkdhdldmdndmdoddpddqddrddsddtdduddvdi dwddxddyddzd{d|d{d}d{d~ddddddddddddddd	dd	dd	ddi dddddddddddddddddddddd dd dd dd#dd#dd#dd'i dd,dd,dd,dd,dd/dd1dd1dd1dd3dd3dd;dd?dd?ddBddBddHddHi ddOddOddVddVddVddVddVddVddZddZddZddZddaddeddjddjddji ddoddoddoddoddrdÐdrdĐdrdŐdrdƐdrdǐd{dȐd{dɐd~dʐd~dːd~d̐d~d͐d~dΐdi dϐddАddѐddҐddӐddԐddՐdd֐ddאddؐddِddڐddېddܐddݐddސddߐdi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddΓddΓddΓddΓddΓddΓd dΓddΓi ddΓddړddړddړddړddړddړd	d
dd
dd
dd
dd
dd
dd
dd
dd
dd
i dd
dd
dd-dd-dd-dd-dd-dd-dd-dd-dd-dd-d d!d"d!d#d!d$d!d%d!i d&d!d'd!d(d!d)d!d*d!d+d!d,d!d-d!d.d!d/d!d0d!d1d!d2d3d4d3d5d3d6d3d7d3i d8d3d9d3d:d3d;d3d<d3d=d3d>d3d?d3d@d3dAd3dBd3dCd3dDd3dEd3dFd3dGd3dHd3i dId3dJd3dKd3dLdMdNdMdOdMdPdMdQdMdRdMdSdMdTdMdUdMdVdMdWdMdXdMdYdMdZdMi d[dMd\dMd]dMd^dMd_dMd`dMdadMdbdMdcdMdddMdedMdfdMdgdMdhdMdidMdjdMdkdMi dldMdmdMdndMdodMdpdMdqd drd dsd dtd dud dvd dwd dxd dyd dzd d{d d|d d d d d d d d d d d d d d d}Zmd~ ZndZodZp eq ereoep                    Zs eq erepeo                    Ztd Zud ZvddZwddZxddZyddeFdeFdezdezfdZ{dS (      N)urlparseparse_qs)LockNotOwnedError)datetimedate	timedeltatimezone)Linker)g)Path)timeitProfilerDataCtxprofiler_data_log)*)AES)is_dataclass)OrderedDict)deepcopy)List)contextmanagerz******c                   &    e Zd ZdZddZd Zd ZdS )disable_aclt   Отключение проверки прав доступа в ORM для системных частей кодаreturnNc                     d | _         d S N)save_acl_flagselfs    ./cmf/util/cmfutil.py__init__zdisable_acl.__init__(   s    !    c                 R    dt           v rt           j        | _        dt           _        d S )Ndisable_permissionsT)r   r$   r   r   s    r    	__enter__zdisable_acl.__enter__+   s&     A%%!"!6D $r"   c                 (    | j         t          _        d S r   )r   r   r$   r   excvaluetbs       r    __exit__zdisable_acl.__exit__0   s     $ 2r"   r   N__name__
__module____qualname____doc__r!   r%   r+    r"   r    r   r   &   sL        ~~" " " "% % %
3 3 3 3 3r"   r   c                   &    e Zd ZdZddZd Zd ZdS )
run_systemr   r   Nc                 "    d | _         d | _        d S r   )current_usercurrent_acl_admin_moder   s    r    r!   zrun_system.__init__7   s     &*###r"   c                     t           j        | _        t          j                            t           j                   t           j        | _        dt           _        d S )NT)r   r6   cmfappset_current_personsystem_useracl_admin_moder7   r   s    r    r%   zrun_system.__enter__;   s=    N""1=111&'&6#r"   c                 p    t           j                            | j                   | j        t
          _        d S r   )r9   r:   r;   r6   r7   r   r=   r'   s       r    r+   zrun_system.__exit__C   s,    ""4#45556r"   r,   r-   r2   r"   r    r4   r4   4   sL        ~~+ + + +     7 7 7 7 7r"   r4   c                   &    e Zd ZdZddZd Zd ZdS )disable_notifyr   r   Nc                     d | _         d S r   )save_notify_flagr   s    r    r!   zdisable_notify.__init__J   s     $r"   c                 R    dt           v rt           j        | _        dt           _        d S )Nr@   T)r   r@   rB   r   s    r    r%   zdisable_notify.__enter__M   s&    q  $%$4D!r"   c                 (    | j         t          _        d S r   )rB   r   r@   r'   s       r    r+   zdisable_notify.__exit__R   s    0r"   r,   r-   r2   r"   r    r@   r@   H   sL        ~~% % % %     
1 1 1 1 1r"   r@   c                   f    e Zd Z ed          Z	 d	dZd Zd Zed             Z	ed             Z
dS )
enable_import_modez/tmp/eva_app_import.lockr   Nc                 "    d | _         d | _        d S r   )save_import_flagsave_cache_flagr   s    r    r!   zenable_import_mode.__init__Y   s     $#r"   c                     dd l }|j                            dd          | _        dt          v rt          j        | _        dt          _        d|j        d<   |                                  d S )Nr   NO_CACHE import_modeT1)osenvirongetrI   r   rM   rH   import_heartbeat)r   rO   s     r    r%   zenable_import_mode.__enter__]   sc    			!z~~j"==A$%MD!!$
:r"   c                     dd l }| j        t          _        | j        |j        d<   | j                                        r| j                                         d S d S )Nr   rK   )	rO   rH   r   rM   rI   rP   	LOCK_PATHexistsunlink)r   r(   r)   r*   rO   s        r    r+   zenable_import_mode.__exit__f   s^    			-!%!5
:>  "" 	$N!!#####	$ 	$r"   c                     t          | j        d          5 }|                    t          j        t
          j                                      d                     d d d            d S # 1 swxY w Y   d S )Nzw+tzz%Y-%m-%d %H:%M:%S %Z%z)openrT   writer   nowr	   utcstrftime)clsfs     r    rR   z#enable_import_mode.import_heartbeatp   s    #-&& 	V!GGHLHL111::;STTUUU	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	V 	Vs   AA))A-0A-c                 x   dd l }t          j                            | j                  sdS t          | j        d          5 }|j                            |                                          }d d d            n# 1 swxY w Y   t          j
        t          j                  |z
                                  dk     S )Nr   FrrX     )dateutil.parserrO   pathrU   rT   rZ   parserparsereadr   r\   r	   r]   total_seconds)r_   dateutilr`   	lock_times       r    import_is_runningz$enable_import_mode.import_is_runningu   s    w~~cm,, 	5#-%% 	8 --affhh77I	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 ---	9HHJJWTTs    -A99A= A=r,   )r.   r/   r0   r   rT   r!   r%   r+   classmethodrR   rl   r2   r"   r    rF   rF   V   s        /00I#$ $ $ $     $ $ $ V V [V U U [U U Ur"   rF   c                    t          t          d          sd S d|  }|t          j        v rd S t          j                    }t          j        j                            |d          }|                    dd           t          j                    |z
  }|dk    rt          j	        d|d	d
|            |dk    r&t          j                            d|d	d
|            |dk    rLt          j                    t          ddd          k    r&t          j                            d|d	d
|            |t          j        |<   t          j                    t          j        |<   d S )Nacquired_locksCmfCacheObjLock:   timeoutT)blockingblocking_timeout333333?cache_obj_lock_get long time: 0.3sec    ,DEV: cache_obj_lock_get long time CRITICAL:      #DEV: cache_obj_lock_get long time: )hasattrr   ro   timeAPPREDIS_DBredislockacquiredebugr9   include	cmf_alertr   todayacquired_lock_timigns)obj_idlock_keyst_timer   acquire_times        r    cache_obj_lock_get_redisr      sh   1&'' *&**H1###ikkG
 <""8R"88DLL$L4449;;(Ld	QQQQxQQRRRam\mmmckmmnnna:<<$tQ++++K!!"h"h"h"h^f"h"hiii!%AX(,	AH%%%r"   c                     t          t          d          sd S t          j                    } t          j                                        D ]O}	 |                                 # t          j        j        $ r!}t          j	        d|            Y d }~Hd }~ww xY wt          j                    | z
  }|dk    r7t          j	        d|ddt          j        
                                            i t          _        d S )Nro   z*cache_obj_lock_release_all release error: 皙?z%cache_obj_lock_release_all too slow: rx   zsec. Locks:)r   r   r   ro   valuesreleaser   
exceptions	LockErrorr   keys)r   r   eunlock_times       r     cache_obj_lock_release_all_redisr      s   1&'' ikkG '')) F F	FLLNNNN) 	F 	F 	FGDDDEEEEEEEE	F)++'KS	mmmmTUTdTiTiTkTkmmnnnAs   A!!B5BBFc                    dd l }t          t          d          sd S d|  }|r|t          j        v rd S n|t          j        v rd S  |j                     }d}d}d}d}|rd}t          j        d| d	|            ||k     rw|d
z  }t          j        j        j	        
                                                    |d|i          }	t          |	          d         d         }
|
rn |j        |           ||k     wt          j        d| d	|            |
s&t          j                            d||z   d            |j                     |z
  }|dk    rt          j        d|dd|            |dk    r&t          j                            d|dd|            |d
k    rLt#          j                    t#          dd
d          k    r&t          j                            d|dd|            |r0 |j                     t          j        |dz   <   dt          j        |<   d S  |j                     t          j        |dz   <   dt          j        |<   d S )Nr   ro   rp   r      zKSELECT pg_try_advisory_xact_lock(('x' || md5(:lock_key))::bit(64)::bigint);zRSELECT pg_try_advisory_xact_lock_shared(('x' || md5(:lock_key))::bit(64)::bigint);zRun pg_try_advisory_xact_lock(z	) shared=r|   r   zDone pg_try_advisory_xact_lock(ua   DEV: CRITICAL cache_obj_lock_get не смог взять блокировку в течение u   секrv   rw   rx   ry   rz   r{   r}   rq   r~   __shT__ex)r   r   r   acquired_locks_shro   r   models	CmfPersondp_ddSessionexecutelistsleepr9   r   r   r   r   r   )r   rh   r   r   r   
sleep_time
wait_itersiterlock_sqllock_reslock_resultr   s               r    cache_obj_lock_get_pgr      s   KKK1&'' *&**H q***F + q'''FdikkGJJD ]H hgGFXFFFFGGG


	#&*2244<<XH
   8nnQ'* 	
: 

 GGhGGGGHHH a  `  CM  NX  CX  `  `  `  	a  	a  	a49;;(Ld	QQQQxQQRRRam\mmmckmmnnna:<<$tQ++++K!!"h"h"h"h^f"h"hiii *3<49;;0(,H%%%3<49;;0%)"""r"   c                 x    i t           _        i t           _        | st          j                            d           d S )Nu   DEV: ручной вызов cache_obj_lock_release_all не снимает блокировки! Блокировки будут сняты в конце транзакции)r   ro   r   r9   r   r   near_commit_or_rollbacks    r    cache_obj_lock_release_all_pgr      sC    AA" Q  P  	Q  	Q  	Q
Fr"   c                 V    t          t          d          sd S t          | |          }|S )Nro   )rh   )r   r   r   )r   rh   ress      r    cache_obj_lock_getr      s3    1&''   T
2
2
2CJr"   c                 $   t          t          d          sd S t          |           }t          j                                        D ]=\  }}t          j                    |z
  }|dk    rt          j        d| d|dd           >i t          _        |S )Nro   r   r   z(cache_obj_lock_release_all lock >100ms:  rx   sec)r   r   r   r   itemsr   r   )r   r   	lock_namelock_strk   s        r    cache_obj_lock_release_allr      s    1&'' 
'@W
X
X
XC5;;== _ _	7IKK')	s??G]y]]9]]]]^^^ AJr"   c                     t          t          d          rt          j        rt          j                    } t          j        D ]}t	          j        j        j        |  t          j                    | z
  }|dk    rHt          t          j                  }t          j	        d| d|            t          d| d|            g t          _        d S d S d S )Ndelayed_redis_eventsr   zPROF emit_delayed_events > 0.1 z, len(g.delayed_redis_events)=)r   r   r   r   r   r   r   publishlenr   print)r   eventpublish_timecounts       r    emit_delayed_eventsr   
  s    q()) $a.D $)+++ 	/ 	/EL&...y{{W,#.//EGiliibgiijjjgLgg`egghhh!#$ $ $ $r"   c                 6    t          t                    |          S r   )varsr   )
class_names    r    get_model_by_namer     s    <<
##r"   c                 T    t          |           }t          t                    |         S r   )get_class_name_by_idr   r   idr   s     r    get_model_by_idr     s     %b))J<<
##r"   c                     |                      d          rdS t          |                               d          d         }|S )Nzobj/CmfRFile:r   )
startswithstrsplitr   s     r    r   r   "  s=    	}}V zRs##A&Jr"   )simplec                    t          | t          j        j                  r	| j         }n|  }t          |          }|r|j        n|j        } ||d|i|S )Nr   )
isinstancer9   r   	CmfEntityr   r   sgetrQ   )r   r   argskwargstuuidmodelrQ   s          r    get_obj_by_idr   *  sd    "cj*++ 5
E""E
-%**EIC3$)%)&)))r"   c                    t          |t                    rt          t                    |         }n|}t          | t          j        j                  r.t          | t          j        j                  st          |           } t          | t                    re|                     |j	         d          r| S |
                    | ddg          }|r|j        S |
                    | ddg          }|r|j        S dS t          | j                  S )u  
    Находим id объекта. Функция для использования в API и bzPython ручек, которые используют клиенты.
    Реализуем максимально универсальную логику, чтобы клиент мог получить объект по:
    - id
    - code
    - name
    - передать сам объект
    - передать field модели со ссылкой наобъект
    Если передается id - функция отрабатывает максимально быстро, т.к. используется в кешах
    Если передается code или name - будут доп.запросы в БД.
    Сначала ищем по code и только если не находим - по name
    В class_name можно передать имя модели или саму модель
    r   z--r   )codefields)namer   N)r   r   r   r   r9   r   CmfType
CmfRelBaser   r   r   r   )objr   r   
loaded_objs       r    get_obj_id_by_anyr   4  s    *c"" VZ( #sz)** :c3:CX3Y3Y #hh#s 
>>U-00011 	JZZS$Z>>
 	!= ZZS$Z>>
 	!= tsv;;r"   c              #      K   ddl m} ddlm} t	          |j                                                  D ];}t          ||          }t          ||          r|j	        r*| r | |          r|V  <dS )u`   Последовательность моделей, с возможно фильтрацией.r   r   )BaseModelMetaN)
cmf.includer   cmf.models.base_modelr   sorted__dict__r   getattrr   abstract)model_filterr   r   
model_namer   s        r    iter_modelsr   Z  s      """"""333333V_113344  

++%// 	5> 	 	||E22 	KKK r"   c                 t    ddl m} ddlm} |                                D ]}|j        | k    r	|j        c S d S )Nr   r   )r   )r   r   r   r   iter_subclassesui_namer   )r   r   r   r   s       r    get_class_name_by_ui_namer   g  sg    """"""//////**,, $ $=G###### $4r"   c                 \   |st          dd           t          |          t          k    rt          |          } |j        |ddd| gi|}|s]| [d| v rW|                     d          d         }|                                r(t          |          d	k    r |j        |ddd
d| gi|}|S )Nu|   TODO: сделать автоматическое обнаружение моделей и объекта как в bzPythonTabortfilterr   =-   LIKEz%-)r   typer   r   rQ   r   isdigitr   )r   r   r   r   r   code_numbers         r    get_obj_by_coder  p  s     _  R  Z^  	_  	_  	_  	_E{{c!%((
%)T
@63"5
@
@
@C Z4#tjjoob)   	ZS%5%5%9%9%)TY66;M;M;M*NYRXYYCJr"   _[/\0]      filenamereplacereplace_patternreplace_spaces	max_charshash_lengthr   c           	      b   ddl }ddlm} ddlm} ddt
          dt          d	t          d
t
          fd}	|j                            |           \  }
}|
}t          j
        d|          s| }
d} |d|
          }
t          j        |||
          }
|
|k    }|rt          j        d||
          }
t          |          }|rd|z   nd}||z
  |z
  } |	|
|          }t          |          t          |
          k     rd}||z
  d|z   z
  } |	|
|          }|}
|r || |          }|
 d| | }n|
 | }|S )u  
    Удаляет недопустимые символы из имени файла,
    сокращает имя до максимальной длины
    и добавляет хеш уникальности при необходимости

    Args:
        filename (str): имя файла.
        replace (str, optional): символ замены небезопасных символов. Defaults to "_".
        replace_pattern (str, optional): шаблон для замены символов. Defaults to "[/ ]".
        replace_spaces (str, optional): замена пробела. Defaults to False.
        max_chars (int, optional): максимальное количество символов в имени файла. Defaults to 127.
        hash_length (int, optional): количество символов хеша. Defaults to 4.

    Returns:
        safe_name (str): безопасное имя файла
    r   N)	normalizer|   )short_str_enc   textr  	max_bytesr   c                    | d|         }t          |                    d                    |k    rVt          |          dk    rC|dd         }t          |                    d                    |k    rt          |          dk    C|S )uh    Обрезает строку до max_chars символов, но не более max_bytes в UTF-8 Nutf-8r   r   )r   encode)r  r  r  	truncateds       r    truncate_to_fitz&safe_filename.<locals>.truncate_to_fit  s    )$	)""7++,,y88S^^a=O=O!#2#I )""7++,,y88S^^a=O=Or"   z\.[a-zA-Z0-9]{1,10}$rL   NFCz\sTr   )r  )rO   unicodedatar  cmf_hashlibr  r   intre   splitextre	fullmatchsubr   )r  r	  r
  r  r  r  rO   r  r  r  r   extoriginal_name
needs_hash	ext_chars
hash_charsavailable_charstruncated_name	name_hash	safe_names                       r    safe_filenamer*  ~  s   0 III%%%%%%****** c c c C       **ID#M </55 9UD!!D6/7D11D &J ,veWd++ CI&07!k//aJ)+j8O %_T?;;N
>SYY&&
#i/1{?C(??D  #!M(K88	..i...		NSNN	r"   r  c           	         t          j        | dd          } d                    fd| D                                                     }d |D             }                    |          }|rt	          |          |k    rmt	          |          dk    rJ                    |d         d                    d	 |dd          D                       g          d |         S |d         d |         S |S )
NruT)language_codereversedrL   c              3   x   K   | ]4}|                                 s|d k    r|                                nV  5dS )r   N)isalnumlower).0cseps     r    	<genexpr>z!translit_strip.<locals>.<genexpr>  sD      QQq!))++BcQWWYYYsQQQQQQr"   c                     g | ]}||S r2   r2   r2  ws     r    
<listcomp>z"translit_strip.<locals>.<listcomp>  s    ###1#Q###r"   r|   r   c                     g | ]
}|d          S r   r2   r7  s     r    r9  z"translit_strip.<locals>.<listcomp>  s    /H/H/H!/H/H/Hr"   )transliteratetranslitjoinr   r   )r  r4  lengthwordsr   s    `   r    translit_striprA    s    !$dTJJJDGGQQQQDQQQRRXXY\]]E#####E
((5//C !#c((6//u::>>88U1Xrww/H/HeABBi/H/H/H'I'IJKKGVGTTQx  Jr"   tags_extendprotocols_extendc                 &   |r.d|v r*|                      dd                               dd          } t          j        }g d|d<   dg|d	<   g d
|d<   g d
|d<   t          j        }|                    d           |                    d           |                    d           |                    d           |                    d           |                    d	           |                    d           |                    d           |                    d           |                    d           |r|                    |           t          j        }|r|                    |           t          j        | t          j        ||d          S )Ndivz<div>z<p>z</div>z</p>)srcwidthheightimgr   r   )controlsrF  r   audiovideopbrinsdelfigure
figcaptionT)r  tags
attributes	protocolsstrip)r	  bleachALLOWED_ATTRIBUTESALLOWED_TAGSappendextendALLOWED_PROTOCOLSclean)r  rB  rC  rT  rS  rU  s         r    
html_cleanr^    s    Fu++||GU++33HfEE *J222Ju$Jv555Jw555JwDKKKKKKKKKKKKKKKKKKKK !K   (I +)***<T(;
^gosttttr"   c                 V    dd}t          |g          }|                    |           S )NFc                 r    |                      d          s| S t          | d                   }d| d<   d| d<   | S )N)Nhref_blank)Ntargetexternal)Nclass)rQ   r   )attrsnewrM  s      r    
set_targetzlinkify.<locals>.set_target  sG    yy(( 	LU>*++"*!+or"   )	callbacksF)r
   linkify)r  rh  linkers      r    rk  rk    s<        zl+++F>>$r"   c                      i  fd}|S )Nc                      t          j        | t          |                                          f          }|vr | i ||<   |         S r   )pickledumpsr   r   )r   r   hashfuncmemorys      r    memozmemoized.<locals>.memo  sT    |T6&,,..#9#9:;;v4000F4Ld|r"   r2   )rr  rt  rs  s   ` @r    memoizedru  	  s.    F     
 Kr"   c                    t           j        j        }d|  }|                    dd          }|                                s#t
          j                            dd           dS |                    |          s8|	                                 t          j        d	           t          | d
          S t          j        |                    |                    }t          j        j        |d         k    r7|	                                 t
          j                            dd           dS t#          j        t&          j                  |d<   |                    |t          j        |                     |	                                 dS )N	obj_lock-obj_lock.lock
   rr   (DEV: FATAL lock(): if not lock.acquire()Tr   FuR   DEV: FATAL Попытка lock_ping() на отсутствующую записьi  	locked_byuJ   DEV: FATAL Попытка lock_ping() на чужую блокировку	ping_time)r   r   r   r   r   r9   r   r   rU   r   r   r   ro  loadsrQ   current_personr   r   r\   r	   r]   setrp  )keyr   redis_db_key_lock	lock_infos         r    	lock_pingr    sI   |!HsDMM*BM77E==?? HPTUUUu??4   "	deeeC!!!X\\$//00Ii444jrvwwwu%\(,77IkLLv|I..///	MMOOO4r"   c                     | st          d          t          j        j        }d|  }|                    |          r+t          j        |                    |                    }|r|S dS )uh   
    Из редиса заберём структуру, где есть данные
    :return:
    uL   Блокировка объектов без key не реализованаrw  N)
ValueErrorr   r   r   rU   ro  r}  rQ   )r  r  r  r  s       r    r  r  ,  su    
  jhiii|!HsDt Ld!3!344	 	4r"   c                 H   	 t           j        j        }d|  }|                    dd          }t          j        j        j        t          j	        t          j                  t          j	        t          j                  |d}|                                s#t          j                            dd           d	S |                    |          rt#          j        |                    |                    }t          j	        t          j                  |d
         z
                                  |k     rt          j        j        |d         k    rc|                                 t,          j                            |d                   }t          j                            d|j                    d	S t          j                            d           |                                 dS |                    |t#          j        |                     |                                 dS )uT   
    Захват объекта на редактирование
    :return:
    rw  rx  ry  rr   )r{  
lock_startr|  lock_timoutrz  Tr   Fr|  r{  )r   u[   Редактирование временно невозможно.
Редактирует u`   DEV: WARNING lock() попытка захватить свою блокировку дважды)r   r   r   r   r   r~  r   r)   r   r\   r	   r]   r   r9   r   r   rU   ro  r}  rQ   ri   r   r   r   r   r  rp  )r  lock_timeoutr  r  r   r  persons          r    r   r   =  s   
|!HsD==)2=66D%(.l8<00\(,//#	 I <<>> HPTUUUut Ld!3!344	L&&;)??NNPPS___"i&<<<)--;1G-HH%%  'S  FL  FQ  'S  'S  T  T  Tu%%  'I  J  J  JtLLv|I..///LLNNN4r"   c                 @   t           j        j        }d|  }|                    dd          }|                                s#t
          j                            dd           dS |                    |          s5t
          j                            d	           |	                                 dS t          j        |                    |                    }t          j        t          j                  |d
         z
                                  |d         k     r\t$          j        j        |d         k    r|	                                 dS |                    |           |	                                 dS |                    |           |	                                 dS )u2   
    Снятие захвата
    :return:
    rw  rx  ry  rr   z*DEV: FATAL unlock(): if not lock.acquire()Tr   Fus   DEV: WARNING unlock() попытка разблокировать несуществующую блокировкуr|  r  r{  )r   r   r   r   r   r9   r   r   rU   r   ro  r}  rQ   r   r\   r	   r]   ri   r   r~  r   delete)r  r   r  r  r   r  s         r    unlockr  d  sl   
 |!HsD==)2=66D<<>> JRVWWWu??4     T  	U  	U  	UtX\\$//00IX\""Y{%;;JJLLyYfOggg)K"888LLNNN5 OOD!!!LLNNN4tr"   c                   (    e Zd ZdZdd	dZd Zd ZdS )
CmfLockuJ   Глобальная блокировка аппа на основе redisrc   Nr   c                 V    ddl m} |j                            |||          | _        d S )Nr   )r   )rs   ru   )r   r   r   r   
redis_lock)r   r  rs   ru   r   s        r    r!   zCmfLock.__init__  s7    ((((((".--c7Ue-ffr"   c                 p    | j                                         st          d| j         j                   d S )NzCannot lock )r  r   CmfGetLockErrorr   r   s    r    r%   zCmfLock.__enter__  sA    &&(( 	I!"G1E"G"GHHH	I 	Ir"   c                     	 | j                                          d S # t          $ r, t                              dd| j         j                    Y d S w xY w)N%szUnlock CmfLock error: key = )r  r   r   loggingwarningr   r'   s       r    r+   zCmfLock.__exit__  sn    	YO##%%%%%  	Y 	Y 	Y OOD"WAU"W"WXXXXXX		Ys    2AA)rc   Nr,   r-   r2   r"   r    r  r    s^        TTg g g g g
I I IY Y Y Y Yr"   r  c                 R   t           j        sdS | s|sdS t          t          dd           }dt          _        dt          _        |r t                                                      nt                      }t          |d<   t          j        j        |d<   ||d<   |rt          nt                      |d<   t          |d<   t           |d<   t"          |d	<   t$          |d
<   t&          |d<   t          j        j        |d<   |r|                    |           	 |rt-          |          }|                    d          r
|dd          }|                    d          r
|dd          }t1          d|z   d          5 }|                                } d d d            n# 1 swxY w Y   t5          | |d          }	t7          |	|            |d         |          }
n,| rt9          j        | d          }d}|j        D ])}t?          |t8          j                   r|j!        dk    rd}*|s|j        "                    t9          j#        t9          j$        ddd          dd                     t9          j         d|j        t9          j%        g t9          j&        ddd          gg d g d g           ddg           }|g|_        t5          |dd          }	t7          |	|            |d         |          }
nt)          dd           n# tN          $ r}|t          _        dt          _        t?          |t          j(        j)                  r|dd l*}|+                                }t          j                            d| d| d | d           Y d }~nd }~ww xY w|t          _        dt          _        |
S )!NTdisable_raise_lazyloadr   cmfutilr   r   r   r   r	   requestsr  r   z/opt/eva-app/   /r|   rb   execrun)modeFr   )r)   lineno
col_offset)r  r  )posonlyargsr   defaultsvararg
kwonlyargskwargkw_defaults)r   bodyr   r  r  decorator_listz<string>uC   Попытка вызова несуществующего bzPythonr   uT   Произошла ошибка при выполнении bzPython объекта z: 
),configBZPYTHON_ENABLEDr   r   r  relaxed_bz_python_modeglobalscopy_build_safe_bzpython_globalsr   r9   r   r  r   _build_safe_datetimer   r   r	   r  r  r   updater   r   rZ   rh   compiler  astrg   r  r   FunctionDefr   rZ  ReturnConstant	argumentsarg	Exception
base_errorCmfAbortError	traceback
format_exc)r   r   code_src_objeval_file_patheval_unsafer   prev_disable_raise_lazyloadlr`   
code_blockresultcode_asthave_fnstfnr   r  traces                     r    exec_bzpythonr    sE    " t  t")!-Et"L"L#A#A'K		-I-K-KAAhK;&AiLAfI +GHH1E1G1GAjMAfIAkNAjMAjMAdG[*AkN 	8
 +	i 00N((99 5!/!4((-- 4!/!3o6<<  vvxx                              ~v>>JQQuXc]]FF  	iyF333HGm # #b#/22 #rw%7G7G"G % $$JS\QST%U%U%U&'A7 7 7  
 _%hm*--B.1gfQST.U.U.U-V13DR.2+' +' +'
 -.!BP P P "$ :v>>JQQuXc]]FF [cghhhh 
 
 
#> #( a566 	G$$&&costx} 	 	
 	
 	
 	
 	
 	
 	
 	

  ;A$AMs?   A"K= 0FK= FK= FE#K= =
NA;NNc                       fd}|S )Nc                  \    t           j                            dj         dd           d S )Nu   Вызов функции "up   " запрещен, требуется разрешить расширенные возможности BzPythonTr   )r9   r   r   r.   )r   r   r`   s     r    wrapperz_restrict_func.<locals>.wrapper  sK     g!*  g  g  g 	 	
 	
 	
 	
 	
r"   r2   )r`   r  s   ` r    _restrict_funcr     s#    
 
 
 
 

 Nr"   c                     t          | t                    st          | g|R i |S |                     d          rd| vrt          | g|R i |S t          j                            dd           d S )Nz/tmpz..u   Неверный путь к файлу или несуществующий файл, требуется разрешить расширенные возможности BzPythonTr   )r   r   rZ   r   r9   r   r   )r`   r   r   s      r    _safe_bzpython_openr  	  s    a (A''''''' 	||F (AA'''''''K 	~      r"   c                      i } t                                           }t          t                    |d<   t          t                    |d<   t
          |d<   dt          fd}||d<   || d<   | S )Nevalr  rZ   r   c                     |                      d          d         }|t          j        vr%t          j                            d| dd           t          | g|R i |S )N.r   u   Пакет "u)   " нельзя импортироватьTr   )r   r  BZPYTHON_ALLOWED_LIBSr9   r   r   
__import__)r   r   r   name_to_checks       r    _bzpython_importz6_build_safe_bzpython_globals.<locals>._bzpython_import  sj    

3* <<<K!!"i"i"i"iqu!vvv$0000000r"   r  __builtins__)r  r  r  r  r  r  r   )bzpython_globalsbuiltinsr  s      r    r  r    s      ""H%d++HV%d++HV*HV1s 1 1 1 1 .H\'/^$r"   c                  L    t           d          G fddt                    } | S )Nr  c                   "     e Zd Z fdZ xZS )*_build_safe_datetime.<locals>.SafeDatetimec                 J    t           d<    t                      j        |i |S )Nr  )r  superr^   )r   r   r   	__class___original_imports      r    r^   z3_build_safe_datetime.<locals>.SafeDatetime.strftime5  s)    )9L&#577#T4V444r"   )r.   r/   r0   r^   __classcell__)r  r  s   @r    SafeDatetimer  4  s>        	5 	5 	5 	5 	5 	5 	5 	5 	5 	5r"   r  )r  r   )r  r  s    @r    r  r  /  sJ    #L15 5 5 5 5 5 5x 5 5 5
 r"   c                 X   t          |           }|j                            d          }|r
|d         dvrd S t          |j                                      ddg          d         }|r|sd S |d         }|sd S d|v r|                    dd	          \  }}n!d
|v r|                    d
d	          \  }}nd S |dv rt          j        }n.|dv rt          j	        }n|dv rt          j
        }nt          j        }i }	|r||	d<   d
|v rt          dd|j         d| i|	S t          dd| i|	S )Nr  r|   )sharedocsrq  rL   r   r   r   )maxsplitr   )docDOCCmfDocument)flFLIN_WORK	CmfFolder)CmfListEPIsharelink_hashr   r   r2   )r   re   r   r   queryrQ   rsplitr   r  r  r  r   r   r  )
url_strcheck_sharelinkurl
path_parts
hash_paramobj_keyobj_typeobj_code	obj_model
get_kwargss
             r    get_url_path_objr  <  s   
7

C $$J A.???#)$$(("66q9J z nG  g~~$]]3];;((	$^^C!^<<(( 000&			9	9	9$			'	'	'N		 &	J 2'1
#$
hSS9#7 D D( D DS
SSS ;;7;
;;;r"   c                      t           j                            d          \  } }}t          j        |          }t          j        |          }t          j        |t
          j        |          S )Nr   )r  EVA_INSTANCE_KEYr   binascii	unhexlifyr   rg  MODE_CBC)r  iv_hexkey_hexr  ivs        r    
get_cipherr  q  sU    066s;;Avw

W
%
%C		F	#	#B73b)))r"   messagec                    t                      }| dt          j        t          |           t          j        z  z
  z  z   }|                    |                                          }t          j        |                              d          S )Nr   r  )	r  r   
block_sizer   encryptr  base64	b64encodedecode)r  cipherpadded_messageencrypted_messages       r    cryptr  x  sl    \\Fscns7||cn7T&TUUN~'<'<'>'>??-..55g>>>r"   c                     t                      }|                    t          j        |                                                                                     S r   )r  decryptr  	b64decoder  rV  )r  r  s     r    r  r    s@    \\F>>&*73344;;==CCEEEr"   c           	         t           j                                        }|j                                        D ]R}|r(t           j                            ||d| |p| d           ,t           j                            |d| |p| d           Sd S )Nu   Ошибкаr|   )r   r  r   msgr  priority)r  r   r  r  r  )r   CmfPersonGroupadmin_group
rg_members
all_nested	CmfNotifyplace_notify)r  r   r  	admin_grpr  s        r    admin_alertr%    s    %1133I&1133   	))#_W *     ))#_W *     r"   c                  6   t          j                    } t          j        ryd }t          j        }d|v r|                    d          \  }}d| d| d| _        |r=|                    d          \  }}t           j                            ||          | _        | S )N@zhttp://)httphttpsr   )r  r   r  EGRESS_PROXYr   proxiesauthHTTPProxyAuth)requests_session
auth_proxyproxy_settingsusernamepasswords        r    r.  r.    s    ')) T
,.  )7)=)=c)B)B&J.n../~//$
 $
   	T!+!1!1#!6!6Hh$,M$?$?($S$S!r"   r[   r)   list|CmfModel|SimpleModelc                     ddl m} t          | |          r| j        } t          | t                    r| D ]}t          ||           dS t          | d|           dS )u   
    Маркируем объект проверенный бизнес логикой политикой по умолчанию.
    Сейчас маркировка проверяется только в api(eva-app)
    r   )r   )policy_acl_policyN)cmf.fields.base_fieldsr   r   r)   r   acl_set_policysetattr)r)   r5  r   r   s       r    r8  r8    s    
 /.....%!! % . 	/ 	/C3v.....	/ 	/ 	}f-----r"   c                     ddl m} t          | dd          }t          | |j        j                  r|                                 n|                                 |j        S )Nr   baseT)no_metano_acl)	cmf.data_providersr<  CmfResultSplitterr   SimpleMapperSimpleModelsplit_simpler   r  )r   r<  splitters      r    
dumps_dictrE    sm    '''''' d4@@@H#t(455 ?r"   c                     ddl m} t          |           }t          | |j        j                  rt          |          S t          j        |          S )Nr   r;  )	r?  r<  rE  r   rA  rB  	cmf_dumpsujsonrp  )r   r<  res_dicts      r    
dumps_jsonrJ    sU    ''''''#H#t(455 %"""{8$$$r"   c                    t          | t          j                  rt          |           S t          | t          j                  rt          |           S t          | t          j        j                  rd | j	        
                                D             }| j	        
                                D ]=\  }}t          |t          j                  r|j        r|                                ||<   >| j        |d<   |S t          | | j                  )Nc                 t    i | ]5\  }}t          |t          j        j                  r|j        d u-||j        6S ).)r   r9   r   r   _value)r2  attrfields      r    
<dictcomp>z%cmf_dumps_default.<locals>.<dictcomp>  sT     R R Re%!344R :?S9P9P %,9P9P9Pr"   r   )r   	ipaddressIPv4Addressr   decimalDecimalr9   r   	BaseModelr   r   fieldsCmfTypevirtualvirtual_getterr   	TypeErrorr  )r   r  rN  rO  s       r    cmf_dumps_defaultrZ    s   #y,-- 3xx	C	)	) 3xx	C-	.	. 
R R"|1133R R R
 <--// 	6 	6KD%%!233 6 6$3355t"~|
C
'
''r"   c                     	 t          j        | t          t           j                  S # t          $ r!}t          j        d| d|             |d }~ww xY w)N)defaultoptionzorjson.dumps error e=z, obj=)orjsonrp  rZ  OPT_NON_STR_KEYSrY  r   r   )r   r   s     r    rG  rG    sg    |C):6CZ[[[[   	66666777s   %( 
AAAc                       e Zd ZddZd Zd ZddZddZdd	Zd
 Z	edde
j        j        fd            Zd Zd Zd Zd Zd Zd Zd Zd ZdS )r@  NFc                     || _         i | _        t                      | _        d | _        d | _        d | _        d| _        t                      | _        d| _	        || _
        i | _        || _        d S Nr   )_objmetar  meta_fields_keepr  startendnumber_of_objectsm2m_id_cachedepthr=  3_CmfResultSplitter__project_perm_add_comments_cacher>  )r   r   r=  r>  s       r    r!   zCmfResultSplitter.__init__  sf    		 #
!"EE
13.r"   c                       fd}|S )Nc                     | xj         dz  c_         | j         dk    rd S  | g|R i |}| xj         dz  c_         | j         dk    sJ |S )Nr|   ry  r   rj  )r   r   r   retr  s       r    wrapz,CmfResultSplitter._check_depth.<locals>.wrap	  sf    JJ!OJJzRt"T+D+++F++CJJ!OJJ:????Jr"   r2   )r  rp  s   ` r    _check_depthzCmfResultSplitter._check_depth  s#    	 	 	 	 	 r"   c                 h    |j         | j        vr#t          |j                  | j        |j         <   d S d S r   )r   rd  r   ui_meta)r   os     r    _add_class_to_metaz$CmfResultSplitter._add_class_to_meta  s7    <ty((&.qy&9&9DIal### )(r"   c                    |                     d          }|                     d          }|                     d          }|                     d          }|                     d          }|                     d          }|                     d          }	t          t          |          }
i }d}d}d}|
j        s!t	          |          D ]
}|d	v r||= d
|d<   |S t          j                            |||d||||	|	  	        pt                      }t          |
t          j        j
                  r|
j        r|r|                    d          d         }t          t          |d          }|j                             |
j                  }|                     d          }|                     d          }|r|j        sLt          j                            ||||
j        |||d|	  	        }t          |          t          |          z  }|dk    rE|                     d          r0t          j                            ||          sd}t                      }|dk    rE|                     d          r0t          j                            ||          sd}t                      }|                     dd          r7t          |          }d|v r|                    d           t'          |          }d|vrd|v rdnd
}t	          |                                          }t*          j                            d          st*          j                            d          r"d|
j        v rd|vr|                    d           |D ]R}|t*          j        v r||= |d	v r|
j                             |          }|rA|j        r>|j        s	||= d
||<   Nt          |t          j        j                  r
t6          ||<   d}t          j                            ||||||||	d|
  
        pt                      }|dk    r|rt                      }|dk    r|rt                      }|dk    r|r|                    d          r|| j        v r6| j        |         s(d|v r$t          |          }|                    d           nt=          |          }t=          |d dgd!          }|j        j         p|j!        j         }|s3d|v r$t          |          }|                    d           d| j        |<   nW|"                    d"|d#          du r3d|v r$t          |          }|                    d           d| j        |<   n
d| j        |<   |d$k    r*|d%k    r$t          |          }|#                    d           d|vrd|v rdnd
}|r|||<   |d
k    r||v r||= T|r||d&<   |r||d<   |S )'u;  
        Чтобы код не дблировать для модели, простой модели и дикта, можно проверять итоговый json
        Правда в таком случае, мы обходим все данные, даже если они не доступны.
        perm_effective_acl_idcmf_owner_idr   	parent_idr   perm_parent_id%perm_security_level_allowed_ids_cacheNr   deny_acl_objF)	initial_acl_keyobject_modelobject_owner_idraise_error	object_idobject_parent_idobject_dictperm_security_level_allowed_idschecked_policyr   r   perm_inherit_acl_idperm_parent_owner_id)	r~  r  r  object_fieldr  r  r  r  r  
CmfCommentprivateTCmfAttachmentcmf_deletedr[   rh   readonlyz.getz.ui_getcomments)
r~  r  r  r  r  r  r  r  r  r  zCmfProject:
project_id)r   include_deletedzPPP-COM-ADD)r   r  r   
CmfProject_acl_fields)$rQ   r   r   	api_allowr   CmfAccessListcheck_accessr  
issubclassr9   r   acl_parent_field	partitionr   r>  r  check_visibilityr  removetupler   r   
api_methodendswithrZ  api_hack_fieldsCmfPassword_PASSWORD_MASKr   rk  r   r  r)   ry  check_project_role_accessadd)r   obj_dict
acl_policyr~  obj_owner_idr   obj_parent_idr   rz  r{  r   
acl_fieldsacl_objcomment_denyattachment_deny
field_nameaccess_levelsparent_class_nameparent_modelparent_fieldr  r  parent_access_levels_tmpobj_keysrO  	acl_fieldfield_access_levelsproject_obj_project_id_s                                  r    _acl_obj_dictzCmfResultSplitter._acl_obj_dict  s   
 #,,'>??||N33d## [11\\,//
!&67708=d0e0e-
++
  	"8nn ) )
!555Z((#)HZ O,99+*Vb- Bg%	 : ' ' 0 +.%%	 	 eSZ122 	Ou7M 	OR` 	O . 8 8 = =a @"6+<dCCL'.2253IJJL"*,,/D"E"E#+<<0F#G#G  O|': O'-';'H'H$7!2DX!&!76\i (eJ	 (I (X (X$
 !$M 2 2S9M5N5N N %%(,,y*A*A%$55flKK &# # ((X\\)-D-D('88NN &"& #<<u-- 	(}%%D$G$$$!$KKM-''$*m$;$;jjG((L!!&)) 	(Q\-B-B9-M-M 	(%,..:X3M3MOOJ'''" J	) J	)JQ...Z(111L$$Z00E 	:<   ,-3Jz*eSZ%;<< :+9HZ(I"("6"C"C /'jR^ h0Uch) #D #+ #+ #4
 /2ee   \))l)&)ee#_,,,&)ee# Z''M'm>V>VWd>e>e' !D$JJJA-P <U\`sUsUs.12E.F.F++227;;;  -];;H({8SeijjjD"&/"7"O4>;OK# W"&999256I2J2J//66w???NS>{KK#==mQUch=iimrrr&*===69:M6N6N 3 3 : :7 C C CRWDB;OORVDB;OV##
l(B(B&)*=&>&>##''///111*04G*G*GJJV	 3)2
:&F""zX'='=Z(  	1&0H]# 	+#*HZ r"   r   c                 f   | xj         dz  c_         | j        s|                     |           d|j        i}|                    d          D ],}|j        s
|                     ||dz             ||j        <   -| j        s1|j        dk    r&| 	                    |t          |dd                     }|S )	Nr|   r   T)
is_definedrn  public_readr6  r  )rh  r=  ru  r   r   r  _process_cmf_typer>  acl_typer  r   )r   rt  rj  r  vs        r    _process_cmf_modelz$CmfResultSplitter._process_cmf_model  s    !#| 	'##A&&&-T** 	N 	NA< #'#9#9!519#9#M#MF1<  { 	\qz]::''71mUY;Z;Z'[[Fr"   c                    | xj         dz  c_         | j        s/t          t          |j                  }|                     |           i }|j                                        D ]E\  }}| j        s!| j        	                    |j        |f           | 
                    |          ||<   F| j        s&|                     |t          |dd                     }|S )Nr|   r6  r  )rh  r=  r   r   r   ru  r   r   re  r  _processr>  r  )r   r   rj  r   r  rN  r)   s          r    _process_simple_modelz'CmfResultSplitter._process_simple_model  s    !#| 	+FCN33E##E***<--// 	0 	0KD%< B%))3>4*@AAA==//F4LL{ 	^''73W[;\;\']]Fr"   c                 (      fd |          S )Nc                 |   t          | t                    rfd| D             S t          | t                    r|                     d          }fd|                                 D             }t          |t
                    rd|v rxj        dz  c_        t          j        j	        
                    |          }j        s;                    |           | D ]#}j                            |j        |f           $|j        |d<   j        s*                    ||                     d                    }|S | S )	Nc                 &    g | ]} |          S r2   r2   )r2  elproccess_jsons     r    r9  zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<listcomp>  s#    888bb))888r"   r   c                 .    i | ]\  }}| |          S r2   r2   )r2  kr  r  s      r    rP  zSCmfResultSplitter._process_json_as_model.<locals>.proccess_json.<locals>.<dictcomp>  s)    DDD1==++DDDr"   r   r|   r   r6  r  )r   r   dictrQ   r   r   rh  r9   r   CmfTUUIDget_cls_by_tuuid_strr=  ru  re  r  r   r>  r  )r   r   datar   r  r  r   s        r    r  z?CmfResultSplitter._process_json_as_model.<locals>.proccess_json  sP   #t$$ 98888C8888#t$$ DDDD		DDDfc** 	[sf}}**a/**J/DDVLLE< V//666*- V VJ 155u7G6TUUUU).)9D&; [#11$377=CYCY1ZZJr"   r2   )r   rt  r  s   ` @r    _process_json_as_modelz(CmfResultSplitter._process_json_as_model  s4    	 	 	 	 	 	$ }Qr"   rt  c                    | xj         dz  c_         | j        s+| j                            |j        j        |j        f           t          |t          j        j	                  r| 
                    |j                  S t          |t          j        j                  r|                     |j                  S t          |t          j        j                  r|                     |j                  S t          |t          j        j                  rt#          |          | j        v rd S | j                            t#          |                     |j        rd S |                     |j        |dz             }| j                            t#          |                     |S t          |t          j        j                  rt#          |          | j        v rg S | j                            t#          |                     g }|j        D ],}|                     |          }|                    |           -| j                            t#          |                     |S |j        }|du r|j        S |j        S )Nr|   rn  .)rh  r=  re  r  instancer   r   r9   r   CmfObjectJsonr  r)   CmfObjectList_process_list	CmfObjectr  CmfRelationBaser   ri  is_nullr  r   rZ  jsonr\  )r   rt  rj  r   r  irM  s          r    r  z#CmfResultSplitter._process_cmf_type  s?   !#| 	M!%%qz'<al&KLLL a122 	8..qw777 a122 	/%%ag... a-.. 	4**17333 a344 		!uu)))t!!"Q%%(((y t))!'q)AAC$$RUU+++J a.// 
	!uu)))	!!"Q%%(((FW ! !++A..a    $$RUU+++M f#::9vr"   c                 D      xj         dz  c_          fd|D             }|S )Nr|   c                 :    g | ]}                     |          S r2   )r  )r2  r   r   s     r    r9  z3CmfResultSplitter._process_list.<locals>.<listcomp>'  s%    ...q$--""...r"   )rh  )r   rt  r  s   `  r    r  zCmfResultSplitter._process_list%  s5    !#....A...r"   c                    | xj         dz  c_         t                      }|                                D ]\  }}|                     |          ||<   | j        s|dk    r|rt          |t                    r~t          t          |	                    d          d         d           }|rM| 
                    |           |                                D ]#}| j                            |j        |f           $|                    d          rF|                    d          r1| j        s*|                     ||                    d                    }|S )Nr|   r   r   r   r   r6  r  )rh  r   r   r  r=  r   r   r   r   r   ru  r   re  r  r   rQ   r>  r  )r   rt  r  r  r  mr  s          r    _process_dictzCmfResultSplitter._process_dict*  sI   !#GGII 	N 	NDAqa((F1I< NAII!I
1c8J8JIFAGGCLLOT:: N++A...&'ffhh N N
-111<2LMMMM::d 	V

< 8 8 	V 	V''6::m;T;T'UUFr"   c                    | xj         dz  c_         t          |t                    r|                     |          S t          |t          j        j                  r|                     |          S t          |t          j        j	                  r| 
                    |          S t          |          r|                     |          S t          |t                    r|                     |          S t          |t          j        t"          j        f          rt'          |          S t          |t(          t*          f          r|                                S |S )Nr|   )rh  r   r   r  r9   r   r   r  r   rU  r  r   r  r  r  rQ  rR  rS  rT  r   r   r   	isoformat)r   r   s     r    r  zCmfResultSplitter._process:  s-   !#c4   	+%%c***c3:-.. 	/))#...c3:/00 	0**3/// 	3--c222c4   	+%%c***cI17?CDD 	s88OcHd+,, 	#==??"
r"   c                     | j                                         D ]1\  }}t          |d                   D ]}||f| j        vr	|d         |= 2d S )Nr   )rd  r   r   re  )r   r   class_valuer  s       r    _process_metazCmfResultSplitter._process_metaM  sn    '+y'8'8 	: 	:#J";x#899 : :

+43HHH#H-j9:	: 	:r"   c                      d fd	  j                     j                                        D ]1\  }}t          |d                   D ]}||f j        vr	|d         |= 2d S )Nr   c                    
xj         dz  c_         t          |           rt          t          | j                  }
                    |           | j                                        D ]5\  }}
j        	                    |j        |f            	||dz              6d S t          | t          j        j                  rt          t          | j                  }
                    |           | j                                        D ]X\  }}t          |t                    r>|j        dur5
j        	                    |j        |f            	|j        |dz              Yd S t          | t                    r| D ]} 	||dz              d S t          | t                     rd }|                     d          }|r[t          |t$                    rFt          t          |                    d          d         d           x}r
                    |           |                                 D ]9\  }}|r!
j        	                    |j        |f            	||dz              8d S d S )Nr|   .r   r   r   )rh  r   r   r   r   ru  r   r   re  r  r   r9   rU  r   rM  r   r  rQ   r   r  )r   rj  r   sub_attr	sub_value	sub_fieldr   r   sub_keyprocess_jsonr   s            r    r  z<CmfResultSplitter._process_simple_meta.<locals>.process_jsonU  s   ""a'""C   577''...+.<+=+=+?+? 5 5'Hi)--u/?.JKKK LE!G44445 5 C!566 577''...+.<+=+=+?+? @ @'Hi!)W55 @):JRU:U:U-1153CX2NOOO$Y%5uQw???@ @ C&& 5 / /C LeAg..../ /C&& 	5 7j55 7 '0@0@0E0Ea0H$ O OOu 7//666*-))++ 5 5&GY O-1153CW2MNNN LE!G4444	5 	55 5r"   r   r;  )rc  rd  r   r   re  )r   r   r  r  r  s   `   @r    _process_simple_metaz&CmfResultSplitter._process_simple_metaT  s    	5 	5 	5 	5 	5 	5 	5< 	TY'+y'8'8 	: 	:#J";x#899 : :

+43HHH#H-j9:	: 	:r"   c                 `    | j         r| j        sd S t          | j        | j         z
  dz            S )Ni  )rf  rg  r  r   s    r    mszCmfResultSplitter.msz  s6    z 	 	4DHtz)T1222r"   c                     t          j                     | _        |                     | j                  | _        | j        s|                                  t          j                     | _        d S r   )r   rf  r  rc  r  rd  r  rg  r   s    r    r   zCmfResultSplitter.split  sQ    Y[[
mmDI..y 	!   9;;r"   c                     t          j                     | _        |                     | j                  | _        | j        s|                                  t          j                     | _        d S r   )r   rf  r  rc  r  r=  r  rg  r   s    r    rC  zCmfResultSplitter.split_simple  sS    Y[[
 mmDI..| 	(%%'''9;;r"   )NFr   r;  )r.   r/   r0   r!   rq  ru  r  r  r  r  r9   r   r   r  r  r  r  r  r  r  r   rC  r2   r"   r    r@  r@    sA          	 	 	: : :i i i iV           * . .3:#5 . . . \.`  
     &: : :$: $: $:L3 3 3  	 	 	 	 	r"   r@  c                     dd l }	 |                    |           }|                                S # |j        $ r Y dS w xY w)Nr   F)psutilProcess
is_runningNoSuchProcess)pidr  processs      r    check_process_runningr    sX    MMM..%%!!###   uus   (/ 
==r  avscanc           
         |sFt          t          j        j                                      d          \  }}}|rt          |          }|rt          |          nd}ddt          |           dt          |          dt          |          d|dg
}|rX|                    d	           |r*|                    d
           |                    |           |	r|                    d           |r*|                    d           |                    |           |r8|                    d           |                    t          |                     n7|                    d           |                    t          |                     t          j        |dddd          }d|j	        v rdS d|p| d| d|d|d|j	         
}t                              d|           |
rt          ||          dS )u{  
    !!! import icapclient - похоже ломает gevent
        Либа читает файл только с диска (


    Используем cli клиент:
    /usr/bin/c-icap-client [-V ] [-VV ]
     [-i icap_servername] [-p port] [-s service] [-tls ] [-tls-method tls_method] [-tls-no-verify ]
     [-f filename] [-o filename] [-method method] [-req url] [-resp url]
     [-d level] [-noreshdr ] [-nopreview ] [-no204 ] [-206 ]
     [-x xheader] [-hx xheader] [-rhx xheader] [-w preview] [-v ]

    -V                      : Print version and exits
    -VV                     : Print version and build informations and exits
    -i icap_servername              : The icap server name
    -p port         : The server port
    -s service              : The service name
    -tls                    : Use TLS
    -tls-method tls_method          : Use TLS method
    -tls-no-verify                  : Disable server certificate verify
    -f filename             : Send this file to the icap server.
    Default is to send an options request
    -o filename             : Save output to this file.
    Default is to send to stdout
    -method method          : Use 'method' as method of the request modification
    -req url                : Send a request modification instead of response modification
    -resp url               : Send a responce modification request with request url the 'url'
    -d level                : debug level info to stdout
    -noreshdr                       : Do not send reshdr headers
    -nopreview                      : Do not send preview data
    -no204                  : Do not allow204 outside preview
    -206                    : Support allow206
    -x xheader              : Include xheader in icap request headers
    -hx xheader             : Include xheader in http request headers
    -rhx xheader            : Include xheader in http response headers
    -w preview              : Sets the maximum preview data size
    -v                      : Print response headers

    Valid:
    root@crm:/opt/eva-app# c-icap-client -f uwsgi.ini -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344

    No modification needed (Allow 204 response)

    ICAP HEADERS:
            ICAP/1.0 204 Unmodified
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA

    REQMOD HEADERS:
            POST / HTTP/1.0
            Last-Modified: Tue Apr  9 10:46:16 2024
            Content-Length: 1426
            Content-Length: 1426
            User-Agent: C-ICAP-Client/x.xx

    Virus:
    root@crm:/opt/eva-app# c-icap-client -f xf-mccs6.exe -req / -i 10.50.17.68 -s avscan -method POST -v >/dev/null
    ICAP server:10.50.17.68, ip:192.168.0.33, port:1344


    ICAP HEADERS:
            ICAP/1.0 200 OK
            Server: C-ICAP/0.5.6
            Connection: keep-alive
            ISTag: CI0001-B5sZ3i1I3+P4H3at/XZ4mQAA
            X-Infection-Found: Type=0; Resolution=2; Threat=Win.Tool.Genkryptik-9939783-0;
            X-Violations-Found: 1
            -
            Win.Tool.Genkryptik-9939783-0
            0
            0
            Encapsulated: res-hdr=0, res-body=108

    RESPMOD HEADERS:
            HTTP/1.0 403 Forbidden
            Server: C-ICAP
            Connection: close
            Content-Type: text/html
            Content-Language: en

    r   i@  z/usr/bin/c-icap-clientz-fz-iz-pz-sz-vz-tlsz-tls-methodz-tls-no-verifyz-methodz-reqz-respT   )capture_outputrs   checkr  zNo modification neededzicap_check(): failed, url=z, file_path=z
, service=z	, method=z
, result:
r  F)r   r   global_settingsicap_serverr  r  rZ  
subprocessr  stderrr  r  CmfIcapCheckError)	file_pathresp_urlreq_urlmethodservicehostporttls
tls_methodtls_no_verifyr  r  r   procr  s                  r    
icap_checkr    s1   r  A-9::DDSIIa 	t99D&3t999$D $Ic$iisSWyyZ^`gimoD
 *F 	$KK&&&KK
### 	*KK())) IF #FCLL!!!!GCMM""">Rt$@ @ @D  4;..t#7+>h # #) # #PW # #\b # #[# #GOOD'""" /...5r"   c               #      K   t          t          dd          } 	 dt          _        d V  | t          _        d S # | t          _        w xY w)Nr  FT)r   r   r  )r  s    r    allow_lazyloadr  7  sR      ")!-Eu"M"M?#' #>   #> >>>>s	   8 Au   Январьu   Февральu   Мартu   Апрельu   Майu   Июньu   Июльu   Августu   Сентябрьu   Октябрьu   Ноябрьu   Декабрь)r|      r   r  rz            	   ry        en_USru_RUc                     | d         t           j        v r,t                              |                                           S t
                              |                                           S rb  )stringascii_lettersdictionary_enr  
capitalizedictionary_ru)words    r    dictionary_checkr!  T  sP    Aw&&&&""4??#4#4555""4??#4#4555r"   u   стi'  u   тоi$  u   ноi#  u   наiH   u   поib  u   енiC  u   ниi  u   коi  u   раi}  u   овi  u   неi+  u   роi  u   прi  u   алis  u   гоiC  u   реi  u   осi  u   лиi  u   каip  u   воi  u   ерi  u   таi  u   отi  u   ваi  u   орi  u   олia  u   етi  u   теi  u   омiy  u   анiC  u   елi  u   одi  u   тьi  u   лаi  u   онi  u   леi  u   лоi  u   есi  u   атi  u   риi[  u   льu   деi?  u   огi  u   веi  u   ныi  u   тиi  u   заi  u   итi:  u   скi  u   даi  u   акiO  u   ойi>  u   инi  u   меi  u   емi  u   илi  u   чеiZ  u   обi  u   асi  u   доi  u   моi  u   киi9  u   трi
  u   сяi
  u   едi
  u   соin
  u   миim
  u   ннiU
  u   сеiJ
  u   амi/
  u   исi$
  u   авi
  u   жеi	  u   азi	  u   маi	  u   имi	  u   твi[	  u   арi?	  u   виi0	  u   иеi  u   руi  u   боiD  u   слi/  u   изi$  u   выi  u   диi  u   быi  u   ияi  u   икi  u   егi  u   пеi  u   ивiM  u   чтi?  u   всi8  u   ейi2  u   сьi  u   окi  u   ьнiu  u   оеiR  u   нуiM  u   сиiC  u   ихi8  u   этi6  u   хоi4  u   адu   чаi   u   ожi  u   аяi  u   спu   ляi  u   евi  u   ичi  u   муi  u   чиi  u   шеi  u   тсi  u   днi  u   куi  u   удi  u   ыхiw  u   саu   екih  u   беif  u   очiY  u   ийiL  u   паi<  u   циi2  u   крi#  u   знi  u   опu   аеi  u   дуi  u   ииi  u   щеi  u   туi  u   ыеi  u   ыйi  u   ирi  u   тыi  u   озi  u   внi  u   ылi  u   рыi  u   ятi  u   утi  u   тнiy  u   жиig  u   нтie  u   усiV  u   ссiP  u   шиiL  u   идiA  u   ымi6  u   няi0  u   гаi.  u   свi  u   езi  u   луi  u   ктi  u   мыi  u   мнi  u   ееi  u   ужi  u   уюi  u   влi  u   улi  u   грi  u   пиi  u   ажi  u   брu   абi  u   учiv  u   дрij  u   цеic  u   аюi^  u   ечi[  u   снiZ  u   ачiU  u   гиiR  u   чнiJ  u   суiH  u   глiF  u   люiC  u   жнi=  u   ахi9  u   ебi%  u   буi!  u   рнi  u   урi  u   ьсi  u   ывi  u   щиi  u   ньi  u   звu   плi  u   апu   жаi  u   гдi  u   ряi  u   нсi  u   ькi  u   угi  u   блi  u   оиi  u   лсi  u   ждi  u   ашi  u   баi  u   биi  u   умi  u   ицu   епi  u   ртi  u   здi  u   ютi  u   зоi  u   ежi  u   врi  u   длi  u   укi  u   упiw  u   клin  u   шаic  u   ешi^  u   ошi]  u   пуiZ  u   смiN  u   агiI  u   двiF  u   вуiE  u   кеi8  u   ткi0  u   ацi)  u   йсi  u   ояi  u   айi  u   зиi  u   иоi  u   дыu   убi  u   нкi
  u   ысi  u   ытi  u   игi  u   ехi  u   ющi  u   ещi  u   хаi  u   ндi  u   дсi  u   рмi  u   ялi  u   геi  u   янi  u   гуi  u   июu   лыi  u   ушi  u   рсi  u   фиi  u   тяi  u   цаi  u   зыi  u   вшi  u   охi  u   ишi  u   змi  u   фоi  u   ьшi  u   иаi  u   нцi}  u   ксix  u   ямis  u   шкiq  u   увip  u   рьio  u   зуu   ргim  u   ибil  u   рвif  u   ядid  u   срic  u   зеi\  u   чуi[  u   шлiX  u   феu   мяiT  u   явiO  u   унiN  u   шьu   лнu   ьюiL  u   ркiD  u   ьеi?  u   чкi>  u   дьi9  u   ущu   щаi8  u   ышi6  u   ооu   еоi3  u   ухi2  u   бяi0  u   вкi.  u   сыi*  u   ясu   втu   йнi'  u   зрi$  u   ецi"  u   юдi   u   язi  u   бнu   лкi  u   бщi  u   узi  u   ржi  u   вяi
  u   мпi  u   кнi  u   ллi  u   дяi  u   уеu   квi  u   сч   u   шнr  u   взu   юб   u   оц   u   иж   u   ип   u   яеu   ьяu   пы   u   ащ   u   дк   u   рд   u   лжu   оф   u   аи   u   хи   u   ящ   u   ях   u   хнu   ощ   u   зл   u   фаu   ырu   эк   u   вд   u   шо   u   бс   u   ын   u   зя   u   шуu   зг   u   тл   u   ьмu   впu   хр   u   мл   u   ьтu   йт   u   жу   u   гн   u   еа   u   пяu   ык   u   рш   u   нгu   бъ   u   еяu   мм   u   ою   u   яю   u   ьзu   ыб   u   цы   u   ъе   u   кц   u   схu   сд   u   ыпu   аф   u   чьu   як   u   ау   u   юч   u   ищ   u   дп   u   рх   u   нч   u   мс   u   уа   u   фр   u   вь   u   цоu   дц   u   ычu   йчu   еф~   u   тд{   u   збz   u   хуy   u   зкv   u   лгu   u   хвs   u   пнu   ифq   u   вмu   нюp   u   джu   нфo   u   оэm   u   йдl   u   яжu   ппu   ыдk   u   еиu   штj   u   жкu   юсi   u   еюg   u   мкf   u   цуe   u   ячu   юрc   u   рбa   u   элu   дм`   u   йкu   сшu   рю_   u   сюu   дт^   u   рп\   u   щу[   u   хлu   тчu   ярZ   u   ъяu   ррY   u   чшu   ьбW   u   ыгV   u   бкU   u   йшu   птu   мьR   u   рчQ   u   тмu   гкu   зьu   пкu   рлN   u   еуu   ьцM   u   нщu   ягJ   u   ьгI   u   кжu   псu   бхu   уйG   u   сбF   u   цкD   u   фуu   мбC   u   ьиu   пьu   лчB   u   яяA   u   сц@   u   оуu   тпu   цвu   яц?   u   ттu   эн>   u   лтu   ыз=   u   щн:   u   хе9   u   тюu   ябu   дд8   u   зжu   сфu   нрu   яй7   u   нвu   дш6   u   ввu   йо3   u   рцu   юнu   флu   аоu   жо2   u   хсu   рфu   дч1   u   ьч0   u   чо/   u   эрu   ффu   вч.   u   юз-   u   лд,   u   сёu   эфu   ьдu   бю+   u   бв*   u   жбu   уяu   тцu   нз(   u   фтu   вгu   хмu   чл'   u   юмu   дхu   йм%   u   дгu   тб$   u   йцu   эмu   эп#   u   щьu   вхu   ётu   юк"   u   япu   жч!   u   оа    u   ыж   u   бмu   рзu   мрu   эсu   юлu   ёнu   йлr  u   ккu   юцu   вц   u   ыяu   съ   u   щёu   чрu   дзu   хтu   кз   u   дъu   швu   иуu   бь   u   ём   u   дбu   юшu   чёu   жьu   мвu   юж   u   мчu   мцu   мг   u   уцu   жсu   лбu   лпu   уиu   юю   u   нжu   гчu   сг   u   ьвu   еёu   зсu   пц   u   лёu   яиu   ёлu   яш   u   уфu   гс   u   аэu   фсu   дюu   лмu   югu   рщu   вщu   ёр   u   эдu   лз   u   гмu   гвu   дёu   мфu   зъu   шпrq   u   мэu   эвu   пчu   кмu   ьф   u   бжu   тхu   ншu   эйu   кпu   уэr  u   гтu   нбu   ьоu   бдu   шмu   кгu   зчu   шёr  u   юхu   сжu   ббu   нёu   кшu   ззu   тщu   фыu   зцu   ггr  u   лхu   йеu   ааu   тёu   ьщu   ыиu   тфu   нхu   тгry  u   рэu   лвu   бшu   рёu   вёu   ьпr  u   лрu   зтu   ххu   йзu   эзu   чвu   шрu   ыщu   оёu   вбr  u   нпu   кдu   сэu   йбu   жлu   тъu   жмu   бзu   уоu   жрu   сзr  u   жгu   тзu   жёu   жжu   фьu   йфu   пшu   зюu   иэu   эхu   тэr  )u   лшu   бэu   йрu   хгu   бтu   хшu   гбu   мтu   йгu   фнu   нэu   тшu   фгu   аёthhei!  iniF  eri  aniL  r  iW  esi  oni  r  i	  nti  eni[  atedi  ndil  toif  oriD  eaiw  tiiR  ari$  tei  ngi  ali  iti  asi  isix  hai  eti
  sei
  ouic
  ofi2
  lei%
  sai
  vei	  roi	  rai	  rii:	  hii.	  nei 	  mei	  dei	  coi  tai  eci  sii  lli:  soi  nai  lii  lai  r  i  maiJ  dii=  ici+  rti*  nsi  rsi  ioi  omi	  chi  oti  cai  cehoi  bei  ttiw  foiQ  tsssnoiO  eei-  emi  aci  ili  dai  nii  uri  wai  shi  eiiZ  amiU  triH  dtiC  usi>  loi5  pei3  uni  nci  wiuti  adi  ewi  owi  gei  epi  ailyi  oli  fti  rO   i  eoefim  prwedoia  moiS  r   iN  iei-  mii  pai  fii  poi  cti  whi  iri  ayi  gai  sci  kei  evi  spi  imopi~  dsi{  ldil  ulif  ooie  suiY  iaiW  ghiL  pliG  ebi@  igi/  vii"  r  i  woi
  yoi	  rdtwi  bai  agi  ryi  abi  lsi  swi  apfei  tui  cii  fai  htfri  avi  eggoboi  bui  tyi  mpi  oci  odi  ehi  ysi  eyrmovit  gtyaik  ckih  gii_  rni\  griU  rciT  bliQ  ltiG  yti>  oayei,  obi  dbffi  sfi  rri  dukiuci  ifafi  drclexi  smi  pii  sbcri  tli  oii  r,  upi  byi  tci  nni  aksli  nfuei  dwaui  ppugi  rlrgi  rN  i  cui  uai  dhrki  yiluumiw  biit  nynwih  quogsnmbi`  vai_  dfiY  ddiV  r  gsawnhpuiJ  hriH  sdr*   iF  ptnmiE  dciC  guiB  tmiA  munummnli<  eui:  wnnbi4  rpdmi/  sri,  udi+  uirfi&  okywi!  tfipi  rwrbohksi  r   fui  yci  tpi  mti  dlnkcci  ubrhnpju   r     dn   ka   ph   hu   jolf   yb   rvoe   ib   ikypgl   lpym   lbhsdg   gnek   nr   ps   tdlcsk   yfyh   voahdylm   synvyd   fssgyr   yl   wsmyoy   knizxp   lwtn   kor   aa   ja   zefc   gwtg   xt   fhlrjeyngg}   gfeqhy|   kthcbsx   hwhncshmt   njhhr   wtgclhejfmdvlvwrgph   fpgbgmhld   lkcyb   mcygxiX   hbfwgyT   hpmwP   pmzaO   lgiwxafbL   svK   gdixajklH   hfhdaesqdjfyazlnaofdkwmfmhsj<   uftvxcyu;   bbwwojaxmrwlxekhoxuozifgih4   tkiiiutjmnwykykfr  uypwdkrjukkrkuwmkmmd)   mlezkbwc&   wdhgbtzokcpfyvpcpywbykcpyjkppbcdjiuwuhwfyywpbcaqcbiqcmmgdqbjrY   kdpdfjcfnzcwfvvyfkozzzijljnquvxopghkkgvshvbmhjcngvcgwugjxhgktqcqrqbhxsuzwkxuuxbdbwwgmvmjpnxmoqbvxwkkbpzurzxfmkzhbnzyhqwjiydzvrzsxycvxbxrujyqvdpkvujrzlszyzlqkjbfnxqaqikvzwwvrz   uuvtvpxdgqxlvcczlzztwzsxzbvlpvfqpjzmvwcjzcbgr   jsxgrxhzxxvmxnqwjpvnzdzrfzxvzpvhvbr  zfgztxvfdxqbbkzgvgjczkznuqjmvvjdmqjhqsjtjbfxpqmzyxr|   qtwqjjjwlxgxjnzvmxjkkqxkjfqmqhjljgvkvjkzqcxjpzqlqojvqfqdbzhxzjpxqpqeqrzqjybqxqcxkxwxqyqvqnvxbx)jzvzqgqqzxxzqkvqqjqxjxjqqzc                     t          j        dd|           | k    rdS fdt          | | dd                    D             }t          |          dk    rdS t	          |          t          |          z  dz   S )N
[\[\];',.]rL   gHz>c                 H    g | ]\  }}                     ||z   d           S r;  rQ   )r2  abstats      r    r9  z$bigram_text_rank.<locals>.<listcomp>b  s-    ===1TXXac!__===r"   r|   r   )r  r   zipr   sum)r  r{  statss    ` r    bigram_text_rankr  _  s|    f\2t$$,,Y====D$qrr((;(;===5	%jjAooiu::U$Y./r"   u   йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮz@qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,.c                 :   t           k    r(| d         t          j        v r|                                 S t          k    r(| d         t          j        vr|                                 S d                    fd| D                       }|                                S )Nr   rL   c              3   D   K   | ]}                     ||          V  d S r   rx  )r2  xdict_s     r    r5  z'ninja_translate_text.<locals>.<genexpr>r  s/      00a%))Aq//000000r"   )rus2engr  	printabler1  eng2rusr>  )r  r  ro  s    ` r    ninja_translate_textr  m  s    DGv'777zz||DG6+;;;zz||
''00004000
0
0C99;;r"   c                     | d         t           j        v rt          | t                    }nt          | t                    }t          j        dd|          |k    r|S | S )Nr   rv  rL   )r  r  r  r  r  r  r   )r   ro  s     r    ninja_reversr  u  sW    Aw&""""411"411	vlB$$++
r"   c                    t          |           dk     r| S t          | t                    }t          | t                    }t	          |t
                    }t	          |t                    }|r)t          |  d| dd||z  z
   d| dd||z  z
   	           t          |          rt          |          s|S t          |          rt          |          s|S d||z  z
  dk    r|S d||z  z
  dk    r|S | S )Nr  z
 rank_ru: r   r|   z rank_eng: g?)	r   r  r  r  r  bigram_stat_rubigram_stat_engr   r!  )r   r   	trans_eng	trans_rusrank_rurank_engs         r    
ninja_oncer    s-   
4yy1}}$T733I$T733Iy88G	?;;H kiiii1Xg-=+=ii(iiUVW^_gWgUgiijjj	"" +;I+F+F 	"" +;I+F+F 	(7
C
GH
c	!	!r"   c                 L    d| v r| S t          | |          }|| k    r|  d| S | S )Nr'  |)r  )r   r   
ninja_words      r    	ninja_addr    sC    
d{{D%((JT%%%%%r"   c                 l    d                     fd|                     d          D                       S )Nr   c                 0    g | ]}t          |          S r2   )r  )r2  r8  r   s     r    r9  zninja.<locals>.<listcomp>  s#    BBBQYq%((BBBr"   )r>  r   )r  r   s    `r    ninjar    s4    88BBBB$**S//BBBCCCr"   subjectcontentbccc                     d }ddl m}  ||           }  ||          } ||          } |t          j        j        | ||||g           dS )u=  Метод для отправки почты из bzpython

    Args:
        to (list|str): Куда
        subject (str): Тема
        content (str): Содержание
        cc (list, optional): Копия. Defaults to None.
        bcc (list, optional): Скрытая копия. Defaults to None.
    c                 b    t          | t                    rd | D             S t          |           S )Nc                 ,    g | ]}t          |          S r2   )r   )r2  r   s     r    r9  z5send_email.<locals>.convert_value.<locals>.<listcomp>  s    ...CHH...r"   )r   r   r   )r)   s    r    convert_valuez!send_email.<locals>.convert_value  s4    eT"" 	/......5zzr"   r   )schedule_deferred_job)r   N)r   r  r   CmfPluginMailBoxsend_email_job)r  r  r  r  r  r  r  s          r    
send_emailr    s      
 211111	r		B	r		B
-

C&1@GU\^`beGfggggggr"   rj  r   )r  r  Fr  r  )r  N)NN)NNF)r[   )r)   r3  )
r  NNr  NNNNNF)|ro  r   urllib.parser   r   r  redis.exceptionsr   r9   rW  r<  r   r   r   r	   r
   flaskr   pathlibr   cmf.cmf_profiler   r   r   r   Crypto.Cipherr   r  r  r   r   randomdataclassesr   rS  rQ  r^  rH  collectionsr   r  r   typingr   
contextlibr   r  enchantr  r  r  r   r4   r@   rF   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   boolr  r*  rA  r^  rk  ru  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r%  r.  r8  rE  rJ  rZ  rG  r@  r  r  r  	RU_MONTHSDictr  r  r!  r  r  r  rus_keyeng_keyr  r|  r  r  r  r  r  r  r  r   r  r2   r"   r    <module>r     s        + + + + + + + + 



 . . . . . . 



      8 8 8 8 8 8 8 8 8 8 8 8                   F F F F F F F F F F                   $ $ $ $ $ $ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( # # # # # #             % % % % % %    				 3 3 3 3 3 3 3 37 7 7 7 7 7 7 7(1 1 1 1 1 1 1 1'U 'U 'U 'U 'U 'U 'U 'U^4 4 46  7* 7* 7* 7*r         $ $ $$ $ $$ $ $
   %* * * * * *# # #L
 
 
 
       # K KKK K 	K
 K K 	K K K K\     u uS utCy u4PS9 u`c u u u uB
 # 
 # 
  
  
  
     2  "$ $ $N     FY Y Y Y Y Y Y Y*a a a aH      0
 
 
3< 3< 3< 3<j* * *?3 ?3 ? ? ? ?FS FS F F F F  S    (  $. . . . .H  % % %( ( (&  X X X X X X X Xv   EMGK| | | |v ? ? ?  	  W%%W%%6 6 6 Mu6%  Mut  MuF4  Mut  MuF4  MuPVW[  Mu\bcg  Muhnos  Mutz{  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  Mu  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C	  D	H	  Mu  I	O	  P	T	  Mu  U	[	  \	`	  Mu  a	g	  h	l	  Mu  m	s	  t	x	  Mu  Mu  Mu  y		  @
D
  Mu  E
K
  L
P
  Mu  Q
W
  X
\
  Mu  ]
c
  d
h
  Mu  i
o
  p
t
  Mu  u
{
  |
@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  Mu  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  Mu  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  Mu  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  Mu  Mu  io  pt  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  Mu  Mu  u{  |@  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \`  Mu  ag  hl  Mu  ms  tx  Mu  y  @D  Mu  EK  LP  Mu  QW  X\  Mu  ]c  dh  Mu  io  pt  Mu  u{  |@  Mu  Mu  Mu  AG  HL  Mu  MS  TX  Mu  Y_  `d  Mu  ek  lp  Mu  qw  x|  Mu  }C  DH  Mu  IO  PT  Mu  U[  \_  Mu  `f  gj  Mu  kq  ru  Mu  v|  }@  Mu  AG  HK  Mu  LR  SV  Mu  W]  ^a  Mu  bh  il  Mu  ms  tw  Mu  x~  B   Mu  Mu  Mu  C I   J M   Mu  N T   U X   Mu  Y _   ` c   Mu  d j   k n   Mu  o u   v y   Mu  z @!  A!D!  Mu  E!K!  L!O!  Mu  P!V!  W!Z!  Mu  [!a!  b!e!  Mu  f!l!  m!p!  Mu  q!w!  x!{!  Mu  |!B"  C"F"  Mu  G"M"  N"Q"  Mu  R"X"  Y"\"  Mu  ]"c"  d"g"  Mu  h"n"  o"r"  Mu  s"y"  z"}"  Mu  Mu  Mu  ~"D#  E#H#  Mu  I#O#  P#S#  Mu  T#Z#  [#^#  Mu  _#e#  f#i#  Mu  j#p#  q#t#  Mu  u#{#  |##  Mu  @$F$  G$J$  Mu  K$Q$  R$U$  Mu  V$\$  ]$`$  Mu  a$g$  h$k$  Mu  l$r$  s$v$  Mu  w$}$  ~$A%  Mu  B%H%  I%L%  Mu  M%S%  T%W%  Mu  X%^%  _%b%  Mu  c%i%  j%m%  Mu  n%t%  u%x%  Mu  Mu  Mu  y%%  @&C&  Mu  D&J&  K&N&  Mu  O&U&  V&Y&  Mu  Z&`&  a&d&  Mu  e&k&  l&o&  Mu  p&v&  w&z&  Mu  {&A'  B'E'  Mu  F'L'  M'P'  Mu  Q'W'  X'['  Mu  \'b'  c'f'  Mu  g'm'  n'q'  Mu  r'x'  y'|'  Mu  }'C(  D(G(  Mu  H(N(  O(R(  Mu  S(Y(  Z(](  Mu  ^(d(  e(h(  Mu  i(o(  p(s(  Mu  Mu  Mu  t(z(  {(~(  Mu  (E)  F)I)  Mu  J)P)  Q)T)  Mu  U)[)  \)_)  Mu  `)f)  g)j)  Mu  k)q)  r)u)  Mu  v)|)  })@*  Mu  A*G*  H*K*  Mu  L*R*  S*V*  Mu  W*]*  ^*a*  Mu  b*h*  i*l*  Mu  m*s*  t*w*  Mu  x*~*  *B+  Mu  C+I+  J+M+  Mu  N+T+  U+X+  Mu  Y+_+  `+c+  Mu  d+j+  k+n+  Mu  Mu  Mu  o+u+  v+y+  Mu  z+@,  A,D,  Mu  E,K,  L,O,  Mu  P,V,  W,Z,  Mu  [,a,  b,e,  Mu  f,l,  m,p,  Mu  q,w,  x,{,  Mu  |,B-  C-F-  Mu  G-M-  N-Q-  Mu  R-X-  Y-\-  Mu  ]-c-  d-g-  Mu  h-n-  o-r-  Mu  s-y-  z-}-  Mu  ~-D.  E.H.  Mu  I.O.  P.S.  Mu  T.Z.  [.^.  Mu  _.e.  f.i.  Mu  Mu  Mu  j.p.  q.t.  Mu  u.{.  |..  Mu  @/F/  G/J/  Mu  K/Q/  R/U/  Mu  V/\/  ]/`/  Mu  a/g/  h/k/  Mu  l/r/  s/v/  Mu  w/}/  ~/A0  Mu  B0H0  I0L0  Mu  M0S0  T0W0  Mu  X0^0  _0b0  Mu  c0i0  j0m0  Mu  n0t0  u0x0  Mu  y00  @1C1  Mu  D1J1  K1N1  Mu  O1U1  V1Y1  Mu  Z1`1  a1d1  Mu  Mu  Mu  e1k1  l1o1  Mu  p1v1  w1z1  Mu  {1A2  B2E2  Mu  F2L2  M2P2  Mu  Q2W2  X2[2  Mu  \2b2  c2f2  Mu  g2m2  n2q2  Mu  r2x2  y2|2  Mu  }2C3  D3G3  Mu  H3N3  O3R3  Mu  S3Y3  Z3]3  Mu  ^3d3  e3h3  Mu  i3o3  p3s3  Mu  t3z3  {3~3  Mu  3E4  F4I4  Mu  J4P4  Q4T4  Mu  U4[4  \4_4  Mu  Mu  Mu  `4f4  g4j4  Mu  k4q4  r4u4  Mu  v4|4  }4@5  Mu  A5G5  H5K5  Mu  L5R5  S5V5  Mu  W5]5  ^5a5  Mu  b5h5  i5l5  Mu  m5s5  t5w5  Mu  x5~5  5B6  Mu  C6I6  J6M6  Mu  N6T6  U6X6  Mu  Y6_6  `6c6  Mu  d6j6  k6n6  Mu  o6u6  v6y6  Mu  z6@7  A7D7  Mu  E7K7  L7O7  Mu  P7V7  W7Z7  Mu  Mu  Mu  [7a7  b7e7  Mu  f7l7  m7p7  Mu  q7w7  x7{7  Mu  |7B8  C8F8  Mu  G8M8  N8Q8  Mu  R8X8  Y8\8  Mu  ]8c8  d8g8  Mu  h8n8  o8r8  Mu  s8y8  z8}8  Mu  ~8D9  E9H9  Mu  I9O9  P9S9  Mu  T9Z9  [9^9  Mu  _9e9  f9i9  Mu  j9p9  q9t9  Mu  u9{9  |99  Mu  @:F:  G:J:  Mu  K:Q:  R:U:  Mu  Mu  Mu  V:\:  ]:`:  Mu  a:g:  h:k:  Mu  l:r:  s:v:  Mu  w:}:  ~:A;  Mu  B;H;  I;L;  Mu  M;S;  T;W;  Mu  X;^;  _;b;  Mu  c;i;  j;m;  Mu  n;t;  u;x;  Mu  y;;  @<C<  Mu  D<J<  K<N<  Mu  O<U<  V<Y<  Mu  Z<`<  a<d<  Mu  e<k<  l<o<  Mu  p<v<  w<z<  Mu  {<A=  B=E=  Mu  F=L=  M=P=  Mu  Mu  Mu  Q=W=  X=[=  Mu  \=b=  c=f=  Mu  g=m=  n=q=  Mu  r=x=  y=|=  Mu  }=C>  D>G>  Mu  H>N>  O>R>  Mu  S>Y>  Z>]>  Mu  ^>d>  e>h>  Mu  i>o>  p>s>  Mu  t>z>  {>~>  Mu  >E?  F?I?  Mu  J?P?  Q?T?  Mu  U?[?  \?_?  Mu  `?f?  g?j?  Mu  k?q?  r?u?  Mu  v?|?  }?@@  Mu  A@G@  H@K@  Mu  Mu  Mu  L@R@  S@V@  Mu  W@]@  ^@a@  Mu  b@h@  i@l@  Mu  m@s@  t@w@  Mu  x@~@  @BA  Mu  CAIA  JAMA  Mu  NATA  UAXA  Mu  YA_A  `AcA  Mu  dAjA  kAnA  Mu  oAuA  vAyA  Mu  zA@B  ABDB  Mu  EBKB  LBOB  Mu  PBVB  WBZB  Mu  [BaB  bBeB  Mu  fBlB  mBpB  Mu  qBwB  xB{B  Mu  |BBC  CCFC  Mu  Mu  Mu  GCMC  NCQC  Mu  RCXC  YC\C  Mu  ]CcC  dCgC  Mu  hCnC  oCrC  Mu  sCyC  zC}C  Mu  ~CDD  EDHD  Mu  IDOD  PDSD  Mu  TDZD  [D^D  Mu  _DeD  fDiD  Mu  jDpD  qDtD  Mu  uD{D  |DD  Mu  @EFE  GEJE  Mu  KEQE  REUE  Mu  VE\E  ]E`E  Mu  aEgE  hEkE  Mu  lErE  sEvE  Mu  wE}E  ~EAF  Mu  Mu  Mu  BFHF  IFLF  Mu  MFSF  TFWF  Mu  XF^F  _FbF  Mu  cFiF  jFmF  Mu  nFtF  uFxF  Mu  yFF  @GCG  Mu  DGJG  KGNG  Mu  OGUG  VGYG  Mu  ZG`G  aGdG  Mu  eGkG  lGoG  Mu  pGvG  wGzG  Mu  {GAH  BHEH  Mu  FHLH  MHPH  Mu  QHWH  XH[H  Mu  \HbH  cHfH  Mu  gHmH  nHqH  Mu  rHxH  yH|H  Mu  Mu  Mu  }HCI  DIGI  Mu  HINI  OIRI  Mu  SIYI  ZI]I  Mu  ^IdI  eIhI  Mu  iIoI  pIsI  Mu  tIzI  {I~I  Mu  IEJ  FJIJ  Mu  JJPJ  QJTJ  Mu  UJ[J  \J_J  Mu  `JfJ  gJjJ  Mu  kJqJ  rJuJ  Mu  vJ|J  }J@K  Mu  AKGK  HKKK  Mu  LKRK  SKVK  Mu  WK]K  ^KaK  Mu  bKhK  iKlK  Mu  mKsK  tKwK  Mu  Mu  Mu  xK~K  KBL  Mu  CLIL  JLLL  Mu  MLSL  TLVL  Mu  WL]L  ^L`L  Mu  aLgL  hLjL  Mu  kLqL  rLtL  Mu  uL{L  |L~L  Mu  LEM  FMHM  Mu  IMOM  PMRM  Mu  SMYM  ZM\M  Mu  ]McM  dMfM  Mu  gMmM  nMpM  Mu  qMwM  xMzM  Mu  {MAN  BNDN  Mu  ENKN  LNNN  Mu  ONUN  VNXN  Mu  YN_N  `NbN  Mu  Mu  Mu  cNiN  jNlN  Mu  mNsN  tNvN  Mu  wN}N  ~N@O  Mu  AOGO  HOJO  Mu  KOQO  ROTO  Mu  UO[O  \O^O  Mu  _OeO  fOhO  Mu  iOoO  pOrO  Mu  sOyO  zO|O  Mu  }OCP  DPFP  Mu  GPMP  NPPP  Mu  QPWP  XPZP  Mu  [PaP  bPdP  Mu  ePkP  lPnP  Mu  oPuP  vPxP  Mu  yPP  @QBQ  Mu  CQIQ  JQLQ  Mu  Mu  Mu  MQSQ  TQVQ  Mu  WQ]Q  ^Q`Q  Mu  aQgQ  hQjQ  Mu  kQqQ  rQtQ  Mu  uQ{Q  |Q~Q  Mu  QER  FRHR  Mu  IROR  PRRR  Mu  SRYR  ZR\R  Mu  ]RcR  dRfR  Mu  gRmR  nRpR  Mu  qRwR  xRzR  Mu  {RAS  BSDS  Mu  ESKS  LSNS  Mu  OSUS  VSXS  Mu  YS_S  `SbS  Mu  cSiS  jSlS  Mu  mSsS  tSvS  Mu  Mu  Mu  wS}S  ~S@T  Mu  ATGT  HTJT  Mu  KTQT  RTTT  Mu  UT[T  \T^T  Mu  _TeT  fThT  Mu  iToT  pTrT  Mu  sTyT  zT|T  Mu  }TCU  DUFU  Mu  GUMU  NUPU  Mu  QUWU  XUZU  Mu  [UaU  bUdU  Mu  eUkU  lUnU  Mu  oUuU  vUxU  Mu  yUU  @VBV  Mu  CVIV  JVLV  Mu  MVSV  TVVV  Mu  WV]V  ^V`V  Mu  Mu  Mu  aVgV  hVjV  Mu  kVqV  rVtV  Mu  uV{V  |V~V  Mu  VEW  FWHW  Mu  IWOW  PWRW  Mu  SWYW  ZW\W  Mu  ]WcW  dWfW  Mu  gWmW  nWpW  Mu  qWwW  xWzW  Mu  {WAX  BXDX  Mu  EXKX  LXNX  Mu  OXUX  VXXX  Mu  YX_X  `XbX  Mu  cXiX  jXlX  Mu  mXsX  tXvX  Mu  wX}X  ~X@Y  Mu  AYGY  HYJY  Mu  Mu  Mu  KYQY  RYTY  Mu  UY[Y  \Y^Y  Mu  _YeY  fYhY  Mu  iYoY  pYrY  Mu  sYyY  zY|Y  Mu  }YCZ  DZFZ  Mu  GZMZ  NZPZ  Mu  QZWZ  XZZZ  Mu  [ZaZ  bZdZ  Mu  eZkZ  lZnZ  Mu  oZuZ  vZxZ  Mu  yZZ  @[B[  Mu  C[I[  J[L[  Mu  M[S[  T[V[  Mu  W[][  ^[`[  Mu  a[g[  h[j[  Mu  k[q[  r[t[  Mu  Mu  Mu  u[{[  |[~[  Mu  [E\  F\H\  Mu  I\O\  P\R\  Mu  S\Y\  Z\\\  Mu  ]\c\  d\f\  Mu  g\m\  n\p\  Mu  q\w\  x\z\  Mu  {\A]  B]D]  Mu  E]K]  L]N]  Mu  O]U]  V]X]  Mu  Y]_]  `]b]  Mu  c]i]  j]l]  Mu  m]s]  t]v]  Mu  w]}]  ~]@^  Mu  A^G^  H^J^  Mu  K^Q^  R^T^  Mu  U^[^  \^^^  Mu  Mu  Mu  _^e^  f^h^  Mu  i^o^  p^r^  Mu  s^y^  z^|^  Mu  }^C_  D_F_  Mu  G_M_  N_P_  Mu  Q_W_  X_Z_  Mu  [_a_  b_d_  Mu  e_k_  l_n_  Mu  o_u_  v_x_  Mu  y__  @`B`  Mu  C`I`  J`L`  Mu  M`S`  T`V`  Mu  W`]`  ^```  Mu  a`g`  h`j`  Mu  k`q`  r`t`  Mu  u`{`  |`~`  Mu  `Ea  FaHa  Mu  Mu  Mu  IaOa  PaRa  Mu  SaYa  Za\a  Mu  ]aca  dafa  Mu  gama  napa  Mu  qawa  xaza  Mu  {aAb  BbDb  Mu  EbKb  LbNb  Mu  ObUb  VbXb  Mu  Yb_b  `bbb  Mu  cbib  jblb  Mu  mbsb  tbvb  Mu  wb}b  ~b@c  Mu  AcGc  HcJc  Mu  KcQc  RcTc  Mu  Uc[c  \c^c  Mu  _cec  fchc  Mu  icoc  pcrc  Mu  Mu  Mu  scyc  zc|c  Mu  }cCd  DdFd  Mu  GdMd  NdPd  Mu  QdWd  XdZd  Mu  [dad  bddd  Mu  edkd  ldnd  Mu  odud  vdxd  Mu  ydd  @eBe  Mu  CeIe  JeLe  Mu  MeSe  TeVe  Mu  We]e  ^e`e  Mu  aege  heje  Mu  keqe  rete  Mu  ue{e  |e~e  Mu  eEf  FfHf  Mu  IfOf  PfRf  Mu  SfYf  Zf\f  Mu  Mu  Mu  ]fcf  dfff  Mu  gfmf  nfpf  Mu  qfwf  xfzf  Mu  {fAg  BgDg  Mu  EgKg  LgNg  Mu  OgUg  VgXg  Mu  Yg_g  `gbg  Mu  cgig  jglg  Mu  mgsg  tgvg  Mu  wg}g  ~g@h  Mu  AhGh  HhJh  Mu  KhQh  RhTh  Mu  Uh[h  \h^h  Mu  _heh  fhhh  Mu  ihoh  phrh  Mu  shyh  zh|h  Mu  }hCi  DiFi  Mu  Mu  Mu  GiMi  NiPi  Mu  QiWi  XiZi  Mu  [iai  bidi  Mu  eiki  lini  Mu  oiui  vixi  Mu  yii  @jBj  Mu  CjIj  JjLj  Mu  MjSj  TjVj  Mu  Wj]j  ^j`j  Mu  ajgj  hjjj  Mu  kjqj  rjtj  Mu  uj{j  |j~j  Mu  jEk  FkHk  Mu  IkOk  PkRk  Mu  SkYk  Zk\k  Mu  ]kck  dkfk  Mu  gkmk  nkpk  Mu  Mu  Mu  qkwk  xkzk  Mu  {kAl  BlDl  Mu  ElKl  LlNl  Mu  OlUl  VlXl  Mu  Yl_l  `lbl  Mu  clil  jlll  Mu  mlsl  tlvl  Mu  wl}l  ~l@m  Mu  AmGm  HmJm  Mu  KmQm  RmTm  Mu  Um[m  \m^m  Mu  _mem  fmhm  Mu  imom  pmrm  Mu  smym  zm|m  Mu  }mCn  DnFn  Mu  GnMn  NnPn  Mu  QnWn  XnZn  Mu  Mu  Mu  [nan  bndn  Mu  enkn  lnmn  Mu  nntn  unvn  Mu  wn}n  ~nn  Mu  @oFo  GoHo  Mu  IoOo  PoQo  Mu  RoXo  YoZo  Mu  [oao  boco  Mu  dojo  kolo  Mu  moso  touo  Mu  vo|o  }o~o  Mu  oEp  FpGp  Mu  HpNp  OpPp  Mu  QpWp  XpYp  Mu  Zp`p  apbp  Mu  cpip  jpkp  Mu  lprp  sptp  Mu  Mu  Mu  up{p  |p}p  Mu  ~pDq  EqFq  Mu  GqMq  NqOq  Mu  PqVq  WqXq  Mu  Yq_q  `qaq  Mu  bqhq  iqjq  Mu  kqqq  rqsq  Mu  tqzq  {q|q  Mu  }qCr  DrEr  Mu  FrLr  MrNr  Mu  OrUr  VrWr  Mu  Xr^r  _r`r  Mu  argr  hrir  Mu  jrpr  qrrr  Mu  sryr  zr{r  Mu  |rBs  CsDs  Mu  EsKs  LsMs  Mu  Mu  UsVs  ^s_s  gshs  psqs  yszs  BtCt  KtLt  TtUt  ]t^t  ftgt  otpt  xtyt  AuBu  JuKu  Mu  Mu  Mu uYD  uYtD  uYd  uY4  uYT$  uYtD  uYQUVZ  uY[_`d  uYeijn  uYostx  uYy}  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  uY  @D  EI  uY  JN  OS  uY  TX  Y]  uY  ^b  cg  uY  hl  mq  uY  rv  w{  uY  |@  AE  uY  FJ  KO  uY  PT  UY  uY  Z^  _c  uY  dh  im  uY  nr  sw  uY  x|  }A  uY  BF  GK  uY  LP  QU  uY  VZ  [_  uY  `d  ei  uY  uY  uY  jn  os  uY  tx  y}  uY  ~B  CG  uY  HL  MQ  uY  RV  W[  uY  \`  ae  uY  fj  ko  uY  pt  uy  uY  z~  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EI  uY  JN  OS  uY  uY  uY  TX  Y]  uY  ^b  cg  uY  hl  mq  uY  rv  w{  uY  |@	  A	E	  uY  F	J	  K	O	  uY  P	T	  U	Y	  uY  Z	^	  _	c	  uY  d	h	  i	m	  uY  n	r	  s	w	  uY  x	|	  }	A
  uY  B
F
  G
K
  uY  L
P
  Q
U
  uY  V
Z
  [
_
  uY  `
d
  e
i
  uY  j
n
  o
s
  uY  t
x
  y
}
  uY  uY  uY  ~
B  CG  uY  HL  MQ  uY  RV  W[  uY  \`  ae  uY  fj  ko  uY  pt  uy  uY  z~  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EI  uY  JN  OS  uY  TX  Y]  uY  ^b  cg  uY  uY  uY  hl  mq  uY  rv  w{  uY  |@  AE  uY  FJ  KO  uY  PT  UY  uY  Z^  _c  uY  dh  im  uY  nr  sw  uY  x|  }A  uY  BF  GK  uY  LP  QU  uY  VZ  [_  uY  `d  ei  uY  jn  os  uY  tx  y}  uY  ~B  CG  uY  HL  MQ  uY  uY  uY  RV  W[  uY  \`  ae  uY  fj  ko  uY  pt  uy  uY  z~  C  uY  DH  IM  uY  NR  SW  uY  X\  ]a  uY  bf  gk  uY  lp  qu  uY  vz  {  uY  @D  EH  uY  IM  NQ  uY  RV  WZ  uY  [_  `c  uY  dh  il  uY  mq  ru  uY  uY  uY  vz  {~  uY  C  DG  uY  HL  MP  uY  QU  VY  uY  Z^  _b  uY  cg  hk  uY  lp  qt  uY  uy  z}  uY  ~B  CF  uY  GK  LO  uY  PT  UX  uY  Y]  ^a  uY  bf  gj  uY  ko  ps  uY  tx  y|  uY  }A  BE  uY  FJ  KN  uY  uY  uY  OS  TW  uY  X\  ]`  uY  ae  fi  uY  jn  or  uY  sw  x{  uY  |@  AD  uY  EI  JM  uY  NR  SV  uY  W[  \_  uY  `d  eh  uY  im  nq  uY  rv  wz  uY  {  @C  uY  DH  IL  uY  MQ  RU  uY  VZ  [^  uY  _c  dg  uY  uY  uY  hl  mp  uY  qu  vy  uY  z~  B  uY  CG  HK  uY  LP  QT  uY  UY  Z]  uY  ^b  cf  uY  gk  lo  uY  pt  ux  uY  y}  ~A  uY  BF  GJ  uY  KO  PS  uY  TX  Y\  uY  ]a  be  uY  fj  kn  uY  os  tw  uY  x|  }@  uY  uY  uY  AE  FI  uY  JN  OR  uY  SW  X[  uY  \`  ad  uY  ei  jm  uY  nr  sv  uY  w{  |  uY  @D  EH  uY  IM  NQ  uY  RV  WZ  uY  [_  `c  uY  dh  il  uY  mq  ru  uY  vz  {~  uY  C  DG  uY  HL  MP  uY  QU  VY  uY  uY  uY  Z^  _b  uY  cg  hk  uY  lp  qt  uY  uy  z}  uY  ~B  CF  uY  GK  LO  uY  PT  UX  uY  Y]  ^a  uY  bf  gj  uY  ko  ps  uY  tx  y|  uY  }A  BE  uY  FJ  KN  uY  OS  TW  uY  X\  ]`  uY  ae  fi  uY  jn  or  uY  uY  uY  sw  x{  uY  |@  AD  uY  EI  JM  uY  NR  SV  uY  W[  \_  uY  `d  eh  uY  im  nq  uY  rv  wz  uY  {  @ C   uY  D H   I L   uY  M Q   R U   uY  V Z   [ ^   uY  _ c   d g   uY  h l   m p   uY  q u   v y   uY  z ~    B!  uY  C!G!  H!K!  uY  uY  uY  L!P!  Q!T!  uY  U!Y!  Z!]!  uY  ^!b!  c!f!  uY  g!k!  l!o!  uY  p!t!  u!x!  uY  y!}!  ~!A"  uY  B"F"  G"J"  uY  K"O"  P"S"  uY  T"X"  Y"\"  uY  ]"a"  b"e"  uY  f"j"  k"n"  uY  o"s"  t"w"  uY  x"|"  }"@#  uY  A#E#  F#I#  uY  J#N#  O#R#  uY  S#W#  X#[#  uY  \#`#  a#d#  uY  uY  uY  e#i#  j#m#  uY  n#r#  s#v#  uY  w#{#  |##  uY  @$D$  E$H$  uY  I$M$  N$Q$  uY  R$V$  W$Z$  uY  [$_$  `$c$  uY  d$h$  i$l$  uY  m$q$  r$u$  uY  v$z$  {$~$  uY  $C%  D%G%  uY  H%L%  M%P%  uY  Q%U%  V%Y%  uY  Z%^%  _%b%  uY  c%g%  h%k%  uY  l%p%  q%t%  uY  u%y%  z%}%  uY  uY  uY  ~%B&  C&F&  uY  G&K&  L&O&  uY  P&T&  U&X&  uY  Y&]&  ^&a&  uY  b&f&  g&j&  uY  k&o&  p&s&  uY  t&x&  y&|&  uY  }&A'  B'E'  uY  F'J'  K'N'  uY  O'S'  T'W'  uY  X'\'  ]'`'  uY  a'e'  f'i'  uY  j'n'  o'r'  uY  s'w'  x'{'  uY  |'@(  A(D(  uY  E(I(  J(M(  uY  N(R(  S(V(  uY  uY  uY  W([(  \(_(  uY  `(d(  e(h(  uY  i(m(  n(q(  uY  r(v(  w(z(  uY  {((  @)C)  uY  D)H)  I)L)  uY  M)Q)  R)U)  uY  V)Z)  [)^)  uY  _)c)  d)g)  uY  h)l)  m)p)  uY  q)u)  v)y)  uY  z)~)  )B*  uY  C*G*  H*K*  uY  L*P*  Q*T*  uY  U*Y*  Z*]*  uY  ^*b*  c*f*  uY  g*k*  l*o*  uY  uY  uY  p*t*  u*x*  uY  y*}*  ~*A+  uY  B+F+  G+J+  uY  K+O+  P+S+  uY  T+X+  Y+\+  uY  ]+a+  b+e+  uY  f+j+  k+n+  uY  o+s+  t+w+  uY  x+|+  }+@,  uY  A,E,  F,I,  uY  J,N,  O,R,  uY  S,W,  X,[,  uY  \,`,  a,d,  uY  e,i,  j,m,  uY  n,r,  s,v,  uY  w,{,  |,,  uY  @-D-  E-H-  uY  uY  uY  I-M-  N-Q-  uY  R-V-  W-Z-  uY  [-_-  `-c-  uY  d-h-  i-l-  uY  m-q-  r-u-  uY  v-z-  {-~-  uY  -C.  D.G.  uY  H.L.  M.P.  uY  Q.U.  V.Y.  uY  Z.^.  _.b.  uY  c.g.  h.k.  uY  l.p.  q.t.  uY  u.y.  z.}.  uY  ~.B/  C/F/  uY  G/K/  L/O/  uY  P/T/  U/X/  uY  Y/]/  ^/a/  uY  uY  uY  b/f/  g/j/  uY  k/o/  p/s/  uY  t/x/  y/|/  uY  }/A0  B0E0  uY  F0J0  K0N0  uY  O0S0  T0W0  uY  X0\0  ]0`0  uY  a0e0  f0i0  uY  j0n0  o0r0  uY  s0w0  x0{0  uY  |0@1  A1D1  uY  E1I1  J1M1  uY  N1R1  S1V1  uY  W1[1  \1_1  uY  `1d1  e1h1  uY  i1m1  n1q1  uY  r1v1  w1z1  uY  uY  uY  {11  @2C2  uY  D2H2  I2L2  uY  M2Q2  R2U2  uY  V2Z2  [2^2  uY  _2c2  d2g2  uY  h2l2  m2p2  uY  q2u2  v2y2  uY  z2~2  2B3  uY  C3G3  H3K3  uY  L3P3  Q3T3  uY  U3Y3  Z3]3  uY  ^3b3  c3f3  uY  g3k3  l3o3  uY  p3t3  u3x3  uY  y3}3  ~3A4  uY  B4F4  G4J4  uY  K4O4  P4S4  uY  uY  uY  T4X4  Y4\4  uY  ]4a4  b4e4  uY  f4j4  k4n4  uY  o4s4  t4w4  uY  x4|4  }44  uY  @5D5  E5G5  uY  H5L5  M5O5  uY  P5T5  U5W5  uY  X5\5  ]5_5  uY  `5d5  e5g5  uY  h5l5  m5o5  uY  p5t5  u5w5  uY  x5|5  }55  uY  @6D6  E6G6  uY  H6L6  M6O6  uY  P6T6  U6W6  uY  X6\6  ]6_6  uY  uY  uY  `6d6  e6g6  uY  h6l6  m6o6  uY  p6t6  u6w6  uY  x6|6  }66  uY  @7D7  E7G7  uY  H7L7  M7O7  uY  P7T7  U7W7  uY  X7\7  ]7_7  uY  `7d7  e7g7  uY  h7l7  m7o7  uY  p7t7  u7w7  uY  x7|7  }77  uY  @8D8  E8G8  uY  H8L8  M8O8  uY  P8T8  U8W8  uY  X8\8  ]8_8  uY  `8d8  e8g8  uY  uY  uY  h8l8  m8o8  uY  p8t8  u8w8  uY  x8|8  }88  uY  @9D9  E9G9  uY  H9L9  M9O9  uY  P9T9  U9W9  uY  X9\9  ]9_9  uY  `9d9  e9g9  uY  h9l9  m9o9  uY  p9t9  u9w9  uY  x9|9  }99  uY  @:D:  E:G:  uY  H:L:  M:O:  uY  P:T:  U:W:  uY  X:\:  ]:_:  uY  `:d:  e:g:  uY  h:l:  m:o:  uY  uY  uY  p:t:  u:w:  uY  x:|:  }::  uY  @;D;  E;G;  uY  H;L;  M;O;  uY  P;T;  U;W;  uY  X;\;  ];_;  uY  `;d;  e;g;  uY  h;l;  m;o;  uY  p;t;  u;w;  uY  x;|;  };;  uY  @<D<  E<G<  uY  H<L<  M<O<  uY  P<T<  U<W<  uY  X<\<  ]<_<  uY  `<d<  e<g<  uY  h<l<  m<o<  uY  p<t<  u<w<  uY  uY  uY  x<|<  }<<  uY  @=D=  E=G=  uY  H=L=  M=O=  uY  P=T=  U=W=  uY  X=\=  ]=_=  uY  `=d=  e=g=  uY  h=l=  m=o=  uY  p=t=  u=w=  uY  x=|=  }==  uY  @>D>  E>G>  uY  H>L>  M>O>  uY  P>T>  U>W>  uY  X>\>  ]>_>  uY  `>d>  e>g>  uY  h>l>  m>o>  uY  p>t>  u>w>  uY  x>|>  }>>  uY  uY  uY  @?D?  E?G?  uY  H?L?  M?O?  uY  P?T?  U?W?  uY  X?\?  ]?_?  uY  `?d?  e?g?  uY  h?l?  m?o?  uY  p?t?  u?w?  uY  x?|?  }??  uY  @@D@  E@G@  uY  H@L@  M@O@  uY  P@T@  U@W@  uY  X@\@  ]@_@  uY  `@d@  e@g@  uY  h@l@  m@o@  uY  p@t@  u@w@  uY  x@|@  }@@  uY  @ADA  EAGA  uY  uY  uY  HALA  MAOA  uY  PATA  UAWA  uY  XA\A  ]A_A  uY  `AdA  eAgA  uY  hAlA  mAoA  uY  pAtA  uAwA  uY  xA|A  }AA  uY  @BDB  EBGB  uY  HBLB  MBOB  uY  PBTB  UBWB  uY  XB\B  ]B_B  uY  `BdB  eBgB  uY  hBlB  mBoB  uY  pBtB  uBwB  uY  xB|B  }BB  uY  @CDC  ECGC  uY  HCLC  MCOC  uY  uY  uY  PCTC  UCWC  uY  XC\C  ]C_C  uY  `CdC  eCgC  uY  hClC  mCoC  uY  pCtC  uCwC  uY  xC|C  }CC  uY  @DDD  EDGD  uY  HDLD  MDOD  uY  PDTD  UDWD  uY  XD\D  ]D_D  uY  `DdD  eDgD  uY  hDlD  mDoD  uY  pDtD  uDwD  uY  xD|D  }DD  uY  @EDE  EEGE  uY  HELE  MEOE  uY  PETE  UEWE  uY  uY  uY  XE\E  ]E_E  uY  `EdE  eEgE  uY  hElE  mEoE  uY  pEtE  uEwE  uY  xE|E  }EE  uY  @FDF  EFGF  uY  HFLF  MFOF  uY  PFTF  UFWF  uY  XF\F  ]F_F  uY  `FdF  eFgF  uY  hFlF  mFoF  uY  pFtF  uFwF  uY  xF|F  }FF  uY  @GDG  EGGG  uY  HGLG  MGOG  uY  PGTG  UGWG  uY  XG\G  ]G_G  uY  uY  uY  `GdG  eGgG  uY  hGlG  mGoG  uY  pGtG  uGwG  uY  xG|G  }GG  uY  @HDH  EHGH  uY  HHLH  MHOH  uY  PHTH  UHWH  uY  XH\H  ]H_H  uY  `HdH  eHgH  uY  hHlH  mHoH  uY  pHtH  uHvH  uY  wH{H  |H}H  uY  ~HBI  CIDI  uY  EIII  JIKI  uY  LIPI  QIRI  uY  SIWI  XIYI  uY  ZI^I  _I`I  uY  uY  uY  aIeI  fIgI  uY  hIlI  mInI  uY  oIsI  tIuI  uY  vIzI  {I|I  uY  }IAJ  BJCJ  uY  DJHJ  IJJJ  uY  KJOJ  PJQJ  uY  RJVJ  WJXJ  uY  YJ]J  ^J_J  uY  `JdJ  eJfJ  uY  gJkJ  lJmJ  uY  nJrJ  sJtJ  uY  uJyJ  zJ{J  uY  |J@K  AKBK  uY  CKGK  HKIK  uY  JKNK  OKPK  uY  QKUK  VKWK  uY  uY  uY  XK\K  ]K^K  uY  _KcK  dKeK  uY  fKjK  kKlK  uY  mKqK  rKsK  uY  tKxK  yKzK  uY  {KK  @LAL  uY  BLFL  GLHL  uY  ILML  NLOL  uY  PLTL  ULVL  uY  WL[L  \L]L  uY  ^LbL  cLdL  uY  eLiL  jLkL  uY  lLpL  qLrL  uY  sLwL  xLyL  uY  zL~L  L@M  uY  AMEM  FMGM  uY  HMLM  MMNM  uY  uY  uY  OMSM  TMUM  uY  VMZM  [M\M  uY  ]MaM  bMcM  uY  dMhM  iMjM  uY  kMoM  pMqM  uY  rMvM  wMxM  uY  yM}M  ~MM  uY  @NDN  ENFN  uY  GNKN  LNMN  uY  NNRN  SNTN  uY  UNYN  ZN[N  uY  \N`N  aNbN  uY  cNgN  hNiN  uY  jNnN  oNpN  uY  qNuN  vNwN  uY  xN|N  }N~N  uY  NCO  DOEO  uY  uY  uY  FOJO  KOLO  uY  MOQO  ROSO  uY  TOXO  YOZO  uY  [O_O  `OaO  uY  bOfO  gOhO  uY  iOmO  nOoO  uY  pOtO  uOvO  uY  wO{O  |O}O  uY  ~OBP  CPDP  uY  EPIP  JPKP  uY  LPPP  QPRP  uY  SPWP  XPYP  uY  ZP^P  _P`P  uY  aPeP  fPgP  uY  hPlP  mPnP  uY  oPsP  tPuP  uY  vPzP  {P|P  uY  uY  uY  }PAQ  BQCQ  uY  DQHQ  IQJQ  uY  KQOQ  PQQQ  uY  RQVQ  WQXQ  uY  YQ]Q  ^Q_Q  uY  `QdQ  eQfQ  uY  gQkQ  lQmQ  uY  nQrQ  sQtQ  uY  uQyQ  zQ{Q  uY  |Q@R  ARBR  uY  CRGR  HRIR  uY  JRNR  ORPR  uY  QRUR  VRWR  uY  XR\R  ]R^R  uY  _RcR  dReR  uY  fRjR  kRlR  uY  mRqR  rRsR  uY  uY  uY  tRxR  yRzR  uY  {RR  @SAS  uY  BSFS  GSHS  uY  ISMS  NSOS  uY  PSTS  USVS  uY  WS[S  \S]S  uY  ^SbS  cSdS  uY  eSiS  jSkS  uY  lSpS  qSrS  uY  sSwS  xSyS  uY  zS~S  S@T  uY  ATET  FTGT  uY  HTLT  MTNT  uY  OTST  TTUT  uY  VTZT  [T\T  uY  ]TaT  bTcT  uY  dThT  iTjT  uY  uY  uY  kToT  pTqT  uY  rTvT  wTxT  uY  yT}T  ~TT  uY  @UDU  EUFU  uY  GUKU  LUMU  uY  NURU  SUTU  uY  UUYU  ZU[U  uY  \U`U  aUbU  uY  cUgU  hUiU  uY  jUnU  oUpU  uY  qUuU  vUwU  uY  xU|U  }U~U  uY  UCV  DVEV  uY  FVJV  KVLV  uY  MVQV  RVSV  uY  TVXV  YVZV  uY  [V_V  `VaV  uY  uY  uY  bVfV  gVhV  uY  iVmV  nVoV  uY  pVtV  uVvV  uY  wV{V  |V}V  uY  ~VBW  CWDW  uY  EWIW  JWKW  uY  LWPW  QWRW  uY  SWWW  XWYW  uY  ZW^W  _W`W  uY  aWeW  fWgW  uY  hWlW  mWnW  uY  oWsW  tWuW  uY  vWzW  {W|W  uY  }WAX  BXCX  uY  DXHX  IXJX  uY  KXOX  PXQX  uY  RXVX  WXXX  uY  uY  ^X_X  eXfX  lXmX  sXtX  zX{X  AYBY  HYIY  OYPY  VYWY  ]Y^Y  dYeY  kYlY  rYsY  uY  uY  uY0 0 0 M
L
$ss7G$$
%
%
$ss7G$$
%
%  	 	 	   *   D D D Dh h3 h h ht h h h h h hr"   