Ë
    ä({jÒ3  ã                   ó”  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZ dZdZdZdZdZd	Zd
ZdZdZej*                  j-                  dd«      Zej0                  j3                  ej0                  j5                  ej0                  j7                  e«      «      d«      ZdZdddœZd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%e&dk(  r e%«        yy)u_  
æ˜Œé‚‘å¸‚äººæ°‘æ”¿åºœ - ä¸šåŠ¡ä¿¡æ�¯ (changyi.gov.cn/CYSXXGK/ZTZL/fdzdgkall.html -> ä¸šåŠ¡ä¿¡æ�¯æ �ç›®)
CMS: æ½�å�Šå¸‚æ”¿åºœä¿¡æ�¯å…¬å¼€å¹³å�° (ELS/SYS-service API)
æ �ç›®æ ‘: GET  http://www.changyi.gov.cn/sys-service/webcata/catas/108  (ä¸šåŠ¡ä¿¡æ�¯ cataid=4216, 6221æ�¡)
åˆ—è¡¨:   POST http://www.changyi.gov.cn/els-service/article/{page}/13
        body {"catas":["4216"],"dq":"108"}  â†’ data.contents[]: subject/fwdate/url/dwname
è¯¦æƒ…:   /CYSXXGK/.../t{date}_{xxid}.htm  æ­£æ–‡ div#ivs_content, meta ArticleTitle/PubDate
ç”¨æ³•: python3 crawl_changyi_ywxx.py [--pages=N | N] [--sync] [--sync-only]
é    N)ÚThreadPoolExecutorÚas_completedu"   æ˜Œé‚‘å¸‚äººæ°‘æ”¿åºœ-ä¸šåŠ¡ä¿¡æ�¯zhttp://www.changyi.gov.cnz7http://www.changyi.gov.cn/sys-service/webcata/catas/108z7http://www.changyi.gov.cn/els-service/article/{page}/13Ú4216Ú108zwww.changyi.gov.cnu   å±±ä¸œz
2020-01-01ÚDB_PATHz/root/search.dbzquality_results.dbé   zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36zapplication/json;charset=UTF-8)ú
User-AgentzContent-Typec                 ó°   — t        j                  dd| xs d«      } t        j                  dd| «      } t        j                  dd| «      j                  «       S )Nz$&middot;|&nbsp;|&#160;|\u200b|\ufeffÚ u   ^[â€¢Â·]\s*z\s+ú )ÚreÚsubÚstrip)Úts    ú'/root/gov_crawler/crawl_changyi_ywxx.pyÚclean_titler   '   sG   € Ü
�‰Ð6¸¸AºGÀÓD€AÜ
�‰ˆ~˜r 1Ó%€AÜ�6‰6�&˜#˜qÓ!×'Ñ'Ó)Ð)ó    c           	      óŠ  — 	 t        j                  t        j                  | ¬«      t        t        j                  t        gt        dœ«      d¬«      }|j                  «        |j                  «       }|j                  d«      s$t        d| › d|j                  d«      › �«       g d	fS |j                  d
i «      }t        |j                  d«      xs d	«      }g }|j                  d«      xs g D ]¥  }t        |j                  d«      xs d«      }|j                  d«      xs dj                  «       }|j                  d«      xs dj                  «       dd }	|r|sŒo|j                  |||	|j                  d«      xs dj                  «       dœ«       Œ§ ||fS # t         $ r}
t        d| › d|
› �«       g d	fcY d}
~
S d}
~
ww xY w)u2   POST èŽ·å�–åˆ—è¡¨é¡µï¼Œè¿”å›ž (items, total_pages))Úpage)ÚcatasÚdqé   )ÚheadersÚdataÚtimeoutÚsuccessz
  [list] Pz API fail: Úmessager   r   Ú
totalPagesÚcontentsÚsubjectr   ÚurlÚfwdateNé
   Údwname)Útitler!   Úpub_dater$   ú ERR: )ÚrequestsÚpostÚLIST_APIÚformatÚHEADERSÚjsonÚdumpsÚCATA_IDÚDQÚraise_for_statusÚgetÚprintÚintr   r   ÚappendÚ	Exception)r   ÚrÚjÚdÚtotal_pagesÚitemsÚcr    r!   r"   Úes              r   Ú
fetch_listr>   -   s›  € ðÜ�M‰Mœ(Ÿ/™/¨t˜/Ó4¼gÜ#Ÿz™z´W°IÄRÑ*HÓIÐSUôWˆà	×ÑÔØ�F‰F‹HˆØ�u‰u�YÔÜ�J˜t˜f K°·±°iÓ0@Ð/AÐBÔCØ�q�5ˆLØ�E‰E�&˜"ÓˆÜ˜!Ÿ%™% Ó-Ò2°Ó3ˆØˆØ—‘�zÓ"Ò( bò 	ˆAÜ! !§%¡%¨	Ó"2Ò"8°bÓ9ˆGØ—5‘5˜“<Ò% 2×,Ñ,Ó.ˆCØ—e‘e˜H“oÒ+¨×2Ñ2Ó4°S°bÐ9ˆFÙ¡#ØØ�L‰LØ ØØ"ØŸ5™5 ›?Ò0¨b×7Ñ7Ó9ñ	õ ð	ð �kÐ!Ð!øÜò Ü�
˜4˜&  q cÐ*Ô+Ø�1ˆu�ûðús%   ‚B$F Â'C2F Æ	GÆ#F=Æ7GÆ=Gc           	      ó„
  ‡‡— 	 t        j                  | dt        d   id¬«      }|j                  «        d|_        |j
                  }d}t        j                  d|«      }|rt        |j                  d	«      «      }|s‰t        j                  d
|t        j                  «      }|rbt        t        j                  dd|j                  d	«      j                  «       «      «      }t        j                  dd|«      j                  «       }d}t        j                  d|«      }|r"|j                  d	«      j                  «       d d }|s)t        j                  d|«      }|r|j                  d«      }dŠt        j                  d|t        j                  «      }|r|j                  d	«      Šn8t        j                  d|t        j                  «      }|r|j                  d	«      Š‰s8t        j                  d|t        j                  «      }|r|j                  d	«      Št        j                  dd‰t        j                  t        j                   z  ¬«      Št        j                  dd‰t        j                  t        j                   z  ¬«      Šg }t        j"                  d‰«      D �]
  }|j                  d	«      j                  «       t        |j                  d«      «      }	}t        j                  d|t        j                   «      s%d|j%                  «       v sd|j%                  «       v sŒ‡|j'                  d«      r|n1|j'                  d«      r|nt(        |j'                  d«      r|nd|z   z   Št+        ˆfd„|D «       «      rŒá|j-                  |	xs |j/                  d«      d    ‰d!œ«       �Œ d"„ }
t        j                  d#|
‰«      Št        j                  d$|
‰«      Št        j                  d%d&‰«      Št        j                  d'd‰«      Št        j                  d(d‰t        j                  t        j                   z  ¬«      Št        j                  d)d‰t        j                  t        j                   z  ¬«      Š|rDt+        ˆfd*„|D «       «      }|s.dj1                  d+„ |D «       «      }‰j3                  «       d,z   |z   Št5        t        j                  d-d‰«      j                  «       «      }d.‰v }d/‰v xs d0‰v }|d1k  r|s|s	|s|d|g d2œS |‰||d2œS # t        $ r}t        d| › d|› �«       Y d }~y d }~ww xY w)3Nr	   r   )r   r   zutf-8z  [detail] r'   r   z/<meta\s+name="ArticleTitle"\s+content="([^"]*)"é   z<title>(.*?)</title>z^\S+--u   [-_â€”]\s*.*$z*<meta\s+name="PubDate"\s+content="([^"]*)"r#   z(\d{4})-(\d{2})-(\d{2})r   z8<div[^>]*id="ivs_content"[^>]*>(.*?)</div>\s*(?:</div>)?zD<div[^>]*class="Article_content[^"]*"[^>]*>(.*?)</div>\s*(?:</div>)?z-<div[^>]*id="ContentRegion2"[^>]*>(.*?)</div>z<style[^>]*>.*?</style>)Úflagsz<script[^>]*>.*?</script>z,<a[^>]*href="([^"]+)"[^>]*>([^<]{0,120})</a>é   z0\.(pdf|doc|docx|xls|xlsx|zip|rar|wps|7z|et|dps)$z	/downloadz/attachÚhttpú//ú/c              3   ó.   •K  — | ]  }|d    ‰k(  –— Œ y­w©r!   N© )Ú.0ÚaÚabs_urls     €r   ú	<genexpr>zparse_detail.<locals>.<genexpr>�   s   øè ø€ Ò9¨q�q˜‘x 7Õ*Ñ9ùs   ƒéÿÿÿÿ)Únamer!   c                 óÄ  — | j                  d«      j                  «       }|j                  d«      s"|j                  d«      s|j                  d«      r| j                  d«      S |j                  d«      r$| j                  d«      j                  |d|z   «      S | j                  d«      j                  ||j                  d«      rt        |z   «      S t        dz   |z   «      S )	Nr@   rC   Ú
javascriptú#r   rD   zhttp:rE   )Úgroupr   Ú
startswithÚreplaceÚBASE_URL)ÚmÚhrefs     r   Úabs_linkzparse_detail.<locals>.abs_link…   s³   € Ø�w‰w�q‹z×ÑÓ!ˆØ�?‰?˜6Ô" d§o¡o°lÔ&CÀtÇÁÐWZÔG[Ø—7‘7˜1“:ÐØ�?‰?˜4Ô Ø—7‘7˜1“:×%Ñ% d¨G°d©NÓ;Ð;Ø�w‰w�q‹z×!Ñ! $¸4¿?¹?È3Ô;O¬°4©ÓkÐkÔU]Ð`cÑUcÐfjÑUjÓkÐkr   zhref="([^"]+)"zsrc="([^"]+)"z<p[^>]*>z<p>z
<p>\s*</p>zI<div[^>]*class="[^"]*(share|ewm|qrcode|print|bshare)[^"]*"[^>]*>.*?</div>z;<div[^>]*class="[^"]*(article|content)[^"]*"[^>]*>\s*</div>c              3   ó,   •K  — | ]  }|d    ‰v –— Œ y­wrG   rH   )rI   rJ   Ú	body_htmls     €r   rL   zparse_detail.<locals>.<genexpr>—   s   øè ø€ Ò:°�a˜‘h )Ô+Ñ:ùs   ƒc              3   ó`   K  — | ]&  }d |d   › dt        j                  |d   «      › d�–— Œ( y­w)z<p><a href="r!   z">rN   z</a></p>N)Úhtml_modÚescape)rI   rJ   s     r   rL   zparse_detail.<locals>.<genexpr>™   s3   è ø€ ÒmÐcd ¨a°©h¨Z°r¼(¿/¹/È!ÈFÉ)Ó:TÐ9UÐU]Ô^Ñmùs   ‚,.ú
ú<[^>]+>z<imgz<iframeÚvideoé   ©r%   Úcontentr&   Úattachments)r(   r2   r,   r1   ÚencodingÚtextr6   r3   r   Úsearchr   rR   ÚDOTALLr   r   ÚSÚIÚfinditerÚlowerrS   rU   Úanyr5   ÚsplitÚjoinÚrstripÚlen)r!   r7   Ú	html_textr=   r%   rV   r&   ÚattsrW   rN   rX   Úhas_attÚatt_htmlÚtext_lenÚhas_imgÚ	has_videorK   rZ   s                   @@r   Úparse_detailry   L   sº  ù€ ðÜ�L‰L˜ |´W¸\Ñ5JÐ&KÐUWÔXˆØ	×ÑÔØˆŒ
Ø—F‘Fˆ	ð
 €EÜ
�	‰	ÐDÀiÓP€AÙÜ˜AŸG™G A›JÓ'ˆÙÜ�I‰IÐ-¨y¼"¿)¹)ÓDˆÙÜ¤§¡ y°"°a·g±g¸a³j×6FÑ6FÓ6HÓ IÓJˆEÜ—F‘FÐ+¨R°Ó7×=Ñ=Ó?ˆEà€HÜ
�	‰	Ð?ÀÓK€AÙØ—7‘7˜1“:×#Ñ#Ó% c rÐ*ˆÙÜ�I‰IÐ0°)Ó<ˆÙØ—w‘w˜q“zˆHà€IÜ
�	‰	ÐMÈyÔZ\×ZcÑZcÓd€AÙØ—G‘G˜A“J‰	ä�I‰IÐ]Ð_hÔjl×jsÑjsÓtˆÙØŸ™ ›
ˆIÙä�I‰IÐFÈ	ÔSU×S\ÑS\Ó]ˆÙØŸ™ ›
ˆIô —‘Ð1°2°yÌÏÉÌrÏtÉtÉÔT€IÜ—‘Ð3°R¸Ì"Ï$É$ÔQS×QUÑQUÉ+ÔV€Ið €DÜ�[‰[ÐHÈ)ÓTó SˆØ—W‘W˜Q“Z×%Ñ%Ó'¬°Q·W±W¸Q³ZÓ)@ˆdˆÜ�9‰9ÐHÈ$ÔPR×PTÑPTÔUÐYdÐhl×hrÑhrÓhtÑYtð  yBð  FJ÷  FPñ  FPó  FRò  yRØ"Ÿo™o¨fÔ5‘dÀDÇOÁOÐTXÔDY¹DÔ_gÐsw÷  tCñ  tCð  DGô  tHÑkoð  NQð  TXñ  NXñ  `YˆGÜÓ9°DÔ9Õ9Ø—‘ TÒ%@¨T¯Z©Z¸«_¸RÑ-@ÈÑQÖRðSòlô —‘Ð(¨(°IÓ>€IÜ—‘Ð'¨°9Ó=€IÜ—‘�{ E¨9Ó5€IÜ—‘�} b¨)Ó4€Iô —‘ÐcÐegÐirÔz|×z~Ñz~ô  BD÷  BFñ  BFñ  {Fô  G€IÜ—‘ÐUÐWYÐ[dÔln×lpÑlpÔsu×swÑswÑlwÔx€IáÜÓ:°TÔ:Ó:ˆÙØ—w‘wÑmÐhlÔmÓmˆHØ!×(Ñ(Ó*¨TÑ1°HÑ<ˆIä”2—6‘6˜* b¨)Ó4×:Ñ:Ó<Ó=€HØ˜	Ð!€GØ˜YÐ&Ò>¨'°YÐ*>€IØ�!‚|™G©I¹dØ¨2¸8ÐTVÑWÐWØ y¸hÐW[Ñ\Ð\øô_ ò Ü�˜C˜5  q cÐ*Ô+Üûðús   „AT Ô	T?Ô$T:Ô:T?c                 ó0  — t        j                  t        «      }|j                  d«       |j	                  «       }|j                  d«       d}| D ]Î  }	 |j                  d|j                  dd«      |j                  dd«      |j                  dd«      |j                  d	d«      |j                  d
d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      f
«       ||j                  z  }ŒÐ |j                  «        |j                  «        t        d|› dt        | «      |z
  › �«       |S # t        $ r,}t        d|j                  dd«      › d|› �«       Y d }~�Œ@d }~ww xY w)NúPRAGMA busy_timeout=300000aî  CREATE TABLE IF NOT EXISTS crawl_results (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        site_id INTEGER DEFAULT 0,
        title TEXT, url TEXT, content TEXT,
        publish_date TEXT, summary TEXT,
        domain TEXT, category TEXT DEFAULT '',
        content_hash TEXT, crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        industry TEXT DEFAULT '', group_name TEXT DEFAULT '',
        script_name TEXT DEFAULT '', attachments TEXT DEFAULT '[]',
        UNIQUE(domain, url)
    )r   z¥INSERT OR IGNORE INTO crawl_results (domain, title, url, content, publish_date, summary, industry, group_name, script_name, attachments) VALUES (?,?,?,?,?,?,?,?,?,?)Údomainr   r%   r!   rc   r&   ÚsummaryÚindustryÚ
group_nameÚscript_namerd   ú[]z  [push] ERR ú: z[push_local] new=z skip=)Úsqlite3ÚconnectÚ
QUALITY_DBÚexecuteÚcursorr2   Úrowcountr6   r3   ÚcommitÚcloserq   )Úrecordsr€   ÚconnÚcurÚn_newr7   r=   s          r   Ú
push_localr�   ¤   sp  € Ü�?‰?œ:Ó&€DØ‡L�LÐ-Ô.Ø
�+‰+‹-€CØ‡K�Kð 
	ô 

ð €EØò :ˆð
	:Ø�K‰Kð xØ—‘�x Ó$ a§e¡e¨G°RÓ&8¸!¿%¹%ÀÀrÓ:JØ—‘�y "Ó% q§u¡u¨Z¸Ó'<¸a¿e¹eÀIÈrÓ>RØ—‘�z 2Ó&¨¯©¨l¸BÓ(?Ø—‘�} bÓ)¨1¯5©5°ÀÓ+EðGôð �S—\‘\Ñ!‰Eð:ð 	‡K�K„MØ‡J�J„LÜ	Ð˜e˜W F¬3¨w«<¸Ñ+=Ð*>Ð
?Ô@Ø€Løô ò 	:Ü�M !§%¡%¨¨b£/Ð!2°"°Q°CÐ8×9Ò9ûð	:ús   ÁCE Å 	FÅ)!FÆFc                  ó¼  — 	 t        j                  t        «      } | j                  d«       | j                  dt        f«      j                  «       }| j                  «        |st        d«       y t        j                  t        d¬«      }|j                  d«       |j                  d«       dx}}	 |D ]Â  }|\	  }}}	}
}}}}}|j                  d	|f«      }|j                  «       }	 |rF|j                  d
||	xs dd d |
xs d|xs dd d |xs d|xs d|xs d|xs d|d   f	«       |dz  }nH|j                  d|||	xs dd d |
xs d|xs dd d |xs d|xs d|xs d|xs dt        |f«       |dz  }ŒÄ |j                  «        |j                  dt        f«       |j                  «        |j                  dt        f«      j                  «       d   }|j                  «        t        d|› d|› d|› d�«       y # t        $ r}t        d|› �«       Y d }~y d }~ww xY w# t        $ r}t        d|› d|› �«       Y d }~�ŒŽd }~ww xY w# |j                  «        w xY w)Nr{   z�SELECT title, url, content, publish_date, summary, industry, group_name, script_name, attachments FROM crawl_results WHERE domain=? ORDER BY idz[sync] local read ERR: u   [sync] æœ¬åœ°æ²¡æœ‰æ•°æ�®i,  )r   zPRAGMA journal_mode=WALr   z'SELECT id FROM gov_raw WHERE page_url=?zƒUPDATE gov_raw SET title=?, content=?, publish_date=?, summary=?, industry=?, group_name=?, script_name=?, attachments=? WHERE id=?r   i ¡ r�   r@   z«INSERT INTO gov_raw (title, page_url, content, publish_date, summary, industry, group_name, script_name, attachments, site_name, source_url) VALUES (?,?,?,?,?,?,?,?,?,?,?)z  [sync] ERR r‚   z±INSERT INTO gov_search(rowid,title,site_name,summary) SELECT r.id,r.title,r.site_name,r.summary FROM gov_raw r WHERE r.id NOT IN (SELECT rowid FROM gov_search) AND r.site_name=?z.SELECT COUNT(*) FROM gov_raw WHERE site_name=?z[sync] OK updated=z
 inserted=u    DBå…±u   æ�¡)rƒ   r„   r…   r†   ÚDOMAINÚfetchallrŠ   r6   r3   r   ÚfetchoneÚ	SITE_NAMEr‰   )rŒ   Úrowsr=   ÚdstÚupdÚinsr7   r%   r!   rc   r&   r}   ÚindÚgrpÚsnÚattr�   ÚrowÚtotals                      r   Úsync_to_serverrŸ   Æ   s‘  € ð
Ü�‰œzÓ*ˆØ�‰Ð1Ô2Ø�|‰|ð ^ÜˆIó
÷ ‰(‹*ð 	ð 	�
‰
Œñ ÜÐ)Ô*ØÜ
�/‰/œ'¨3Ô
/€CØ‡K�KÐ)Ô*Ø‡K�KÐ,Ô-Ø€M€Cˆ#ðØò 	2ˆAØHIÑEˆE�3˜ ¨7°C¸¸bÀ#Ø—+‘+ÐGÈ#ÈÓPˆCØ—,‘,“.ˆCð2ÙØ—K‘Kð ^Ø ¢¨B°°Ð 8¸(º.ÀbÈ7Ê=ÐVXÐZ^Ð[^ÐJ_Øš  C¢I¨2¨rªx°R¸ºÀÀcÈ!ÁfðNôOð ˜1‘H‘Cà—K‘Kð FØ  g¢m°°W°fÐ%=¸xº~È2ÐPWÒP]Ð[]Ð_cÐ`cÐOdØš  C¢I¨2¨rªx°R¸ºÀÄiÐQTðVôWð ˜1‘H�Cøð!	2ð& 	�
‰
ŒØ�‰ðQô ˆLô		ð
 	�
‰
ŒØ—‘ÐLÌyÈlÓ[×dÑdÓfÐghÑiˆà�	‰	ŒÜ	Ð˜s˜e :¨c¨U°&¸¸¸sÐ
CÕDøôQ ò ÜÐ'¨ sÐ+Ô,Üûðûô8 ò 2Ü˜ c U¨"¨Q¨CÐ0×1Ò1ûð2ûð 	�	‰	�úsP   ‚AG= Â14I	 Ã&BH!Å6A!I	 Ç=	HÈHÈHÈ!	IÈ*IÈ;I	 ÉIÉI	 É	Ic                  óˆ  — dt         j                  v } d }dt         j                  v }t         j                  dd  D ]O  }|j                  d«      r 	 t        |j	                  dd«      d   «      }Œ4|j                  «       sŒEt        |«      }ŒQ t        d|› d| › �«       | rt        «        y g }d}t        dd	«      D ]W  }|r||kD  r nNt        |«      \  }}|r|}t        d
|› dt        |«      › d|› d�«       |s n|j                  |«       ||k\  sŒW n t        dt        |«      › d|› d�«       g }	t        t        ¬«      5 }
|D �ci c]  }|
j                  t         |d   «      |“Œ }}d}t#        |«      D �]>  }||   }|j%                  «       }|dz  }|dz  dk(  rt        d|› dt        |«      › d�d¬«       |€!t        d|d   d d › �«       |d   d|d   g dœ}|d   r'|d   t&        k  rt        d|d   › d|d   d d › �«       Œ’t(        t*        |d   xs |d   |d   |d    |d   xs |d   t-        j.                  d!d|d    «      d d" dt0        t2        j4                  j7                  t         j                  d   «      |d#   rt9        j:                  |d#   d$¬%«      nd&d'œ}|	j=                  |«       �ŒA 	 d d d «       t        d(t        |	«      › �«       |	rHt?        |	t2        j4                  j7                  t         j                  d   «      «       |rt        «        y y y # t
        $ r Y �Œõw xY wc c}w # 1 sw Y   Œ€xY w))Nz--sync-onlyz--syncr@   z--pages=ú=z[ChangyiYW] max_pages=z sync_only=r   i'  z[list] Pz: items=z (totalPages=ú)u   [total] åˆ—è¡¨å…± u    æ�¡ (totalPages=)Úmax_workersr!   é2   u	     è¯¦æƒ… rE   z...T)Úflushz	  [fail] r%   é(   r   r&   rb   z  [cutoff] r   rc   r_   éÈ   rd   F)Úensure_asciir�   )r|   Ú	site_namer%   r!   rc   r&   r}   r~   r   r€   rd   z[total] valid=) ÚsysÚargvrS   r4   rn   Ú
ValueErrorÚisdigitr3   rŸ   Úranger>   rq   Úextendr   ÚMAX_WORKERSÚsubmitry   r   ÚresultÚCUTOFFr‘   r”   r   r   ÚGROUPÚosÚpathÚbasenamer-   r.   r5   r�   )Ú	sync_onlyÚ	max_pagesÚdo_syncrJ   Ú	all_itemsr:   Úpgr;   ÚtpagesÚvalidÚexecutorÚitÚfut_mapÚdoneÚfutÚdetÚrecs                    r   ÚmainrÆ   ú   sa  € Ø¤§¡Ð)€IØ€IØœ#Ÿ(™(Ð"€GÜ�X‰X�a�bˆ\ò ˆØ�<‰<˜
Ô#ðÜ §¡¨¨Q£°Ñ 2Ó3‘	ð �Y‰Y�[Ü˜A›‰Iðô 
Ð" 9 +¨[¸¸Ð
DÔEÙÜÔØà€IØ€KÜ�A�u‹oò ˆÙ˜˜išÙÜ" 2›‰ˆˆvÙØ ˆKÜ�˜˜˜H¤S¨£Z L°¸f¸XÀQÐGÔHÙÙØ×Ñ˜ÔØ�‹<Ùðô 
Ðœs 9›~Ð.Ð.?À¸}ÈAÐ
NÔOà€EÜ	¬Ô	4ð ¸ØJSÖTÀB�8—?‘?¤<°°E±Ó;¸RÑ?ÐTˆÐTØˆÜ Ó(ó 	ˆCØ˜‘ˆBØ—*‘*“,ˆCØ�A‰IˆDØ�b‰y˜AŠ~Ü˜	 $  q¬¨Y«Ð(8¸Ð<ÀDÕIØˆ{Ü˜	 " W¡+¨c¨rÐ"2Ð!3Ð4Ô5Ø " 7¡¸ÈÈ:ÉÐgiÑj�Ø�:Š 3 z¡?´VÒ#;Ü˜ C¨
¡OÐ#4°A°c¸'±lÀ3ÀBÐ6GÐ5HÐIÔJØä Ü&Ø˜W™Ò4¨¨G©Ø˜%‘yØ˜y™>Ø 
™OÒ=¨r°*©~ÜŸ6™6 *¨b°#°i±.ÓAÀ$À3ÐGØÜ#Ü!Ÿw™w×/Ñ/´·±¸±Ó<ØUXÐYfÒUgœtŸz™z¨#¨mÑ*<È5ÕQÐmqñˆCð �L‰L˜Öñ3	÷ô: 
ˆNœ3˜u›:˜,Ð
'Ô(ÙÜ�5œ"Ÿ'™'×*Ñ*¬3¯8©8°A©;Ó7Ô8ÙÜÕð ð øôq ò Úðüò6 U÷ð ús1   ÁL#ÅL8Å!L3Å'EL8Ì#	L0Ì/L0Ì3L8Ì8MÚ__main__)'Ú__doc__r   rª   rµ   r-   Úhtmlr\   r(   rƒ   Úconcurrent.futuresr   r   r”   rU   Ú	CATAS_APIr*   r/   r0   r‘   r´   r³   Úenvironr2   r   r¶   ro   ÚdirnameÚabspathÚ__file__r…   r°   r,   r   r>   ry   r�   rŸ   rÆ   Ú__name__rH   r   r   ú<module>rÑ      sä   ðñó 
Û 
Û 	Û Û Û Û ß ?à0€	Ø&€ØE€	ØD€Ø
€Ø
€Ø	€Ø€Ø	€Ø
�*‰*�.‰.˜Ð$5Ó
6€Ø�W‰W�\‰\˜"Ÿ'™'Ÿ/™/¨"¯'©'¯/©/¸(Ó*CÓDÐFZÓ[€
Ø€ð DØ4ñ€ò*òò>U]òpòD1EòhCðL ˆzÒÙ…Fð r   