Ë
    œô{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	Z	ddl
m
Z
 ej                  j                  dej                  j                  ej                  j                  e«      «      «       	 ddlmZmZ dZdZdZdZd	Zej2                  j5                  d
d«      Zdad„ Zd„ Zi Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$e%dk(  r e$«        yy# e$ r dZY ŒVw xY w)u²  
crawl_jxxd.py â€” è��ä¹¡å¸‚æ¹˜ä¸œåŒºäººæ°‘æ”¿åºœï¼ˆjxxd.gov.cnï¼‰å…¬å…±ä¼�äº‹ä¸šå�•ä½�ä¿¡æ�¯ çˆ¬è™«
================================================================================
ç«™ç‚¹: ä¸‡ç»´ç½‘(wm) æµ�è§ˆå™¨éš”ç¦»é˜²çˆ¬ç³»ç»Ÿï¼ˆSockJS + DOMå‘½ä»¤æŽ¨é€� + about:blanké“¾æŽ¥ï¼‰
å¿…é¡»ç”¨ Playwright çœŸå®žæµ�è§ˆå™¨æ¸²æŸ“ï¼š
  - åˆ—è¡¨é¡µ: æ¸²æŸ“å�Žè¯»å�– #tableList è¡¨æ ¼ï¼ˆæ ‡é¢˜+æ—¥æœŸï¼‰ï¼ŒçœŸå®žé¼ æ ‡ç‚¹å‡»åˆ†é¡µç¿»é¡µ
  - è¯¦æƒ…é¡µ: çœŸå®žé¼ æ ‡ç‚¹å‡»åˆ—è¡¨é¡¹ â†’ è·³è½¬ content/<id>/content_<id>.html â†’ æ��å�–æ­£æ–‡
  - JS å�ˆæˆ� click() ä¼šè¢« wm è¿‡æ»¤ï¼Œå¿…é¡»ç”¨ Playwright locator.click()ï¼ˆçœŸå®žäº‹ä»¶ï¼‰

æ �ç›®: c100253 å…¬å…±ä¼�äº‹ä¸šå�•ä½�ä¿¡æ�¯ï¼ˆ421æ�¡/29é¡µï¼‰
é    N)Údatetime)Úpush_to_searchdbÚclassify_industryzhttps://www.jxxd.gov.cnz1https://www.jxxd.gov.cn/jxxd/c100253/pc/list.htmlu.   è��ä¹¡å¸‚æ¹˜ä¸œåŒº-å…¬å…±ä¼�äº‹ä¸šå�•ä½�ä¿¡æ�¯u   æ±Ÿè¥¿zcrawl_jxxd.pyÚ	SEARCH_DBz/root/search.dbé   c                  ól  — t        t        j                  «      D ]z  \  } }|j                  d«      rt	        |j                  dd«      d   «      aŒ6|dk(  sŒ<| dz   t        t        j                  «      k  sŒ\t	        t        j                  | dz      «      aŒ| y # t        $ r Y Œ‰w xY w# t        $ r Y Œ˜w xY w)Nz--pages=ú=r   z--pages)	Ú	enumerateÚsysÚargvÚ
startswithÚintÚsplitÚ	MAX_PAGESÚ
ValueErrorÚlen)ÚiÚas     ú/root/gov_crawler/crawl_jxxd.pyÚ
parse_argsr      s�   € äœ#Ÿ(™(Ó#ò $‰ˆˆ1Ø�<‰<˜
Ô#Ü  §¡¨¨a£°Ñ!3Ó4‘à�)‹^  A¡¬¬C¯H©H«Ó 5Ü ¤§¡¨!¨a©%¡Ó1‘ñ$øô Ò#™tÐ#ûô Ò#™tÐ#ús#   ±BÁ6B'Â	B$Â#B$Â'	B3Â2B3c                 ój   — | j                  d«      }|D �cg c]  }|d   sŒ	|d   |d   f‘Œ c}S c c}w )u5   ä»Žæ¸²æŸ“å�Žçš„åˆ—è¡¨é¡µæ��å�– (æ ‡é¢˜, å�‘å¸ƒæ—¥æœŸ)a$  
        () => {
            const rows = document.querySelectorAll('#tableList table tr');
            const out = [];
            for (const tr of rows) {
                const a = tr.querySelector('a[target=_top]');
                const dateTd = tr.querySelector('td.fbrq');
                if (a) {
                    out.push({
                        title: a.innerText.trim(),
                        date: dateTd ? dateTd.innerText.trim() : ''
                    });
                }
            }
            return out;
        }
    ÚtitleÚdate)Úevaluate)ÚpageÚitemsÚits      r   Úextract_list_itemsr   )   s>   € à�M‰Mð ó 	€Eð" 16ÖE¨"¸¸G»ˆR�‰[˜"˜V™*Ò%ÒEÐEùÒEs   –
0¡0c                 óR  — t        d«      D �]M  }	 | j                  d|«      }|st        d|› d�«        y| j                  dt	        j
                  dd«      z   «       | j                  d	t        |«      ¬
«      j                  }|j                  «        t        j                  «       dz   }d}t        j                  «       |k  r[| j                  d«      }|r|t        j                  |dz
  d«      k7  rd}n)| j                  d«       t        j                  «       |k  rŒ[|r| j                  d«        yt        d|› d|dz   › d�«       | j                  d«       �ŒP y# t        $ r?}t        d|› d|dz   › dt        |«      dd › �«       | j                  d«       Y d}~�Œ•d}~ww xY w)u1   ç‚¹å‡»åˆ†é¡µæŒ‰é’®ç¿»åˆ°æŒ‡å®šé¡µï¼ˆé‡�è¯•3æ¬¡ï¼‰é   ao  
                (target) => {
                    const links = [...document.querySelectorAll('a')];
                    const btn = links.find(a => a.innerText.trim() === String(target) && a.getAttribute('href') === 'javascript:;');
                    if (btn) { btn.scrollIntoView(); return true; }
                    return false;
                }
            u     æœªæ‰¾åˆ°ç¬¬u	   é¡µæŒ‰é’®FiÜ  r   iè  za[href='javascript:;'])Úhas_texté   zª() => {
                    const a = document.querySelector('#tableList table a[target=_top]');
                    return a ? a.innerText.trim() : '';
                }r   Ú TiÐ  é   u     ç¿»åˆ°ç¬¬u   é¡µç¬¬u   æ¬¡å¤±è´¥ï¼ˆåˆ—è¡¨æœªæ›´æ–°ï¼‰iˆ  u	     ç¿»é¡µ õ    ç¬¬u   æ¬¡å¼‚å¸¸: NéP   )Úranger   ÚprintÚwait_for_timeoutÚrandomÚrandintÚlocatorÚstrÚfirstÚclickÚtimeÚ_last_first_titleÚgetÚ	Exception)	r   Úpage_numÚattemptÚclickedÚlocÚdeadlineÚokr.   Úes	            r   Ú
click_pager;   @   sœ  € ä˜“8ó $(ˆð#	(à—m‘mð %ð óˆGñ Ü˜ x j°	Ð:Ô;ÙØ×!Ñ! $¬¯©¸¸4Ó)@Ñ"@ÔAØ—,‘,Ð7Ä#ÀhÃ-�,ÓP×VÑVˆCØ�I‰IŒKä—y‘y“{ RÑ'ˆHØˆBÜ—)‘)“+ Ò(ØŸ™ð 'ó �ñ ˜UÔ&7×&;Ñ&;¸HÀq¹LÈ"Ó&MÒMØ�BØØ×%Ñ% dÔ+ô —)‘)“+ Ó(ñ Ø×%Ñ% dÔ+ÙÜ�K ˜z¨°¸±	¨{Ð:XÐYÔZØ×!Ñ! $Ö'ðC$(ðJ øô ò 	(Ü�I˜h˜Z t¨G°A©I¨;°kÄ#ÀaÃ&ÈÈ"À+ÀÐOÔPØ×!Ñ! $×'Ò'ûð	(ús)   ‘#E¶C(EÄEÄ4&EÅ	F&Å'4F!Æ!F&c                 ó8  — d}t        d«      D ]ú  }	 | j                  d«      j                  |«      }|j                  «        | j	                  dt        j                  dd«      z   «       | j                  d¬«      5 }|j                  d	g¬
«       ddd«       j                  }|j                  dd¬«       	 |j                  dd¬«       |j	                  d«       |j                  }|j                  «       }|j                  «         n |sdddg dfS d}d}d}g }	 t'        j(                  dt&        j*                  «      }|rt-        |j/                  d«      «      }t'        j(                  d«      }|r"|j/                  d«      j1                  «       dd }t'        j(                  d|t&        j*                  «      }|r|j/                  d«      }n8t'        j(                  d|t&        j*                  «      }|r|j/                  d«      }t'        j(                  d|t&        j*                  «      }|r·t'        j2                  d|j/                  d«      t&        j4                  «      D ]€  }|j/                  d«      }|j7                  d«      s|j7                  d«      rŒ7|j7                  d«      s	t8        |z   }|j;                  |j/                  d «      j1                  «       |f«       Œ‚ |||||fS # 1 sw Y   �Œ`xY w# t        $ r Y �Œ<w xY w# t        $ ru}	t!        d|› d|dz   › dt#        |	«      dd › �«       |j$                  D ]'  }
|
| k7  sŒ	|
j                  «        Œ# t        $ r Y Œ%w xY w | j	                  d«       Y d}	~	�Œvd}	~	ww xY w# t        $ r Y �Œ:w xY w)!u¹   Ctrl+click åˆ—è¡¨ç¬¬ idx æ�¡åœ¨æ–°tabæ‰“å¼€è¯¦æƒ… â†’ è¿”å›ž (æ ‡é¢˜, æ—¥æœŸ, æ­£æ–‡HTML, é™„ä»¶, è¯¦æƒ…URL)
    åˆ—è¡¨é¡µçŠ¶æ€�ä¿�æŒ�ä¸�åŠ¨ï¼Œè¯¦æƒ… tab æŠ“å®Œå�³å…³ã€‚å¤±è´¥é‡�è¯•3æ¬¡r#   r    ú#tableList table a[target=_top]i   r   iô  i˜:  ©ÚtimeoutÚControl)Ú	modifiersNÚdomcontentloadedé¨a  zh1.article-titlei N  r$   u	     è¯¦æƒ… r%   r   u   æ¬¡å¤±è´¥: éd   z-<h1[^>]*class="article-title"[^>]*>(.*?)</h1>zid="data-pubdate"[^>]*>([^<]+)<é
   zU<div class="article-content" id="zoomcon">(.*?)</div>\s*<div class="article-appendix"z5<div class="article-content" id="zoomcon">(.*?)</div>zJ<div class="article-appendix">(.*?)</div>\s*<div class="com-title square">z+<a[^>]*href="([^"]+)"[^>]*>([^<]{1,80})</a>zabout:blankÚ
javascriptÚhttpé   )r'   r,   ÚnthÚscroll_into_view_if_neededr)   r*   r+   Úexpect_popupr/   ÚvalueÚwait_for_load_stateÚwait_for_selectorr3   ÚurlÚcontentÚcloser(   r-   ÚpagesÚreÚsearchÚSÚclean_titleÚgroupÚstripÚfinditerÚIr   ÚBASE_URLÚappend)r   ÚctxÚidxÚ
detail_urlr5   r7   Ú
popup_infoÚpopÚ	html_textr:   Úpgr   r   Úcontent_htmlÚattachmentsÚmÚappendixÚm3Úhrefs                      r   Úfetch_detailrj   i   sO  € ð €JÜ˜“8ò ˆð	Ø—,‘,Ð@ÓA×EÑEÀcÓJˆCØ×*Ñ*Ô,Ø×!Ñ! #¬¯©°q¸#Ó(>Ñ">Ô?Ø×"Ñ"¨5Ð"Ó1ð 1°ZØ—	‘	 Y K�	Ô0÷1à×"Ñ"ˆCØ×#Ñ#Ð$6ÀÐ#ÔFðØ×%Ñ%Ð&8À%Ð%ÔHð × Ñ  Ô&ØŸ™ˆJØŸ™›ˆIØ�I‰IŒKÙð%ñ8 Ø�2�r˜2˜rÐ!Ð!à€EØ€DØ€LØ€KðÜ�I‰IÐFÈ	ÔSU×SWÑSWÓXˆÙÜ §¡¨£
Ó+ˆEô 	�	‰	Ð4°iÓ@€AÙØ�w‰w�q‹z×ÑÓ! # 2Ð&ˆÜ
�	‰	ÐjÐluÔwy×w{Ñw{Ó|€AÙØ—w‘w˜q“z‰ä�I‰IÐNÐPYÔ[]×[_Ñ[_Ó`ˆÙØŸ7™7 1›:ˆLä�y‰yÐfÐhqÔsu×swÑswÓx€HÙÜ—+‘+ÐLÈhÏnÉnÐ]^ÓN_Ôac×aeÑaeÓfò 	<ˆBØ—8‘8˜A“;ˆDØ�‰˜}Ô-°·±ÀÔ1NØØ—?‘? 6Ô*Ü $‘�Ø×Ñ §¡¨£× 1Ñ 1Ó 3°TÐ:Õ;ð	<ð �$˜ k°:Ð=Ð=÷q1ñ 1ûô ò Úðûô ò 	Ü�I˜c˜U $ w¨q¡y k°¼SÀ»VÀDÀS¸\¸NÐKÔLà—i‘iò +�Ø˜“:ØŸ™�øÜ$Ò*¡dÐ*úð+ð ×!Ñ! $Ô'Ýûð	ûô( ò Úðús‹   ’A*LÁ<K.Â'LÂ8K;Ã=LÄAN Ë.K8	Ë3LË;	LÌLÌLÌLÌ	N	Ì7NÍMÍNÍ	M)	Í&NÍ(M)	Í)NÎN	Î	NÎNc                 ó¨   — t        j                  | «      } t        j                  dd| «      } t        j                  dd| «      } | j	                  «       S )Nú<[^>]+>r#   ú\s+ú )Úhtml_libÚunescaperS   ÚsubrX   )Úts    r   rV   rV   ¬   sB   € Ü×Ñ˜!Ó€AÜ
�‰ˆz˜2˜qÓ!€AÜ
�‰ˆv�s˜AÓ€AØ�7‰7‹9Ðó    c                 óª  — |r|sy| j                  d|t        f«      }|j                  «       ry	 d}	 ddlm}	  |	|«      }| j                  d|||||t        t        t        ||f
«      }|j                  dkD  ryt        j                  dd|«      }
t        j                  |
«      }
t        j                  d	d
|
«      j                  «       d d }
| j                  d|j                  |t        |
f«       yy# t
        $ r Y Œ¼w xY w# t        j                   $ r>}dt#        |«      v r+t%        j&                  d«       t)        | ||||||«      cY d }~S ‚ d }~ww xY w)NFz7SELECT id FROM gov_raw WHERE page_url=? AND site_name=?Úotherr   )r   z¨INSERT OR IGNORE INTO gov_raw (page_url, source_url, title, content, publish_date, site_name, group_name, script_name, has_table, industry) VALUES (?,?,?,?,?,?,?,?,?,?)rl   r#   rm   rn   éÈ   zTINSERT OR IGNORE INTO gov_search (rowid, title, site_name, summary) VALUES (?,?,?,?)TÚlockedr    )ÚexecuteÚ	SITE_NAMEÚfetchoneÚcrawler_libr   r3   Ú
GROUP_NAMEÚSCRIPT_NAMEÚrowcountrS   rq   ro   rp   rX   Ú	lastrowidÚsqlite3ÚOperationalErrorr-   r0   ÚsleepÚstore_record)ÚconnrO   r   rP   r   Ú	has_tablere   ÚcurÚindustryr   Úsummaryr:   s               r   rƒ   rƒ   ²   sP  € Ù‘eØØ
�,‰,ÐPÐSVÔXaÐRbÓ
c€CØ
‡|�|„~ØðØˆð	Ý5Ù(¨Ó/ˆHð �l‰lð+ð �#�u˜g t¬Y¼
ÄKÐQZÐ\dÐeó	
ˆð �<‰<˜!ÒÜ—f‘f˜Z¨¨WÓ5ˆGÜ×'Ñ'¨Ó0ˆGÜ—f‘f˜V S¨'Ó2×8Ñ8Ó:¸4¸CÐ@ˆGØ�L‰LØfØ—‘ ¤y°'Ð:ôð Øøô# ò 	Ùð	ûô$ ×#Ñ#ò Ø”s˜1“vÑÜ�J‰J�qŒMÜ  c¨5°'¸4ÀÈKÓXÕXØûð	úsG   °D ³C2 ÁB/D Ã2	C>Ã;D Ã=C>Ã>D ÄEÄ2EÅEÅEÅEc                  ó¤  — t        «        ddlm}  t        j                  t
        d¬«      }d}d}d} | «       5 }|j                  j                  dddg¬«      }|j                  d	d
ddœdd¬«      }|j                  «       }|j                  d«       |j                  t        dd¬«       	 |j                  dd¬«       |j                  d«       t!        dt"        dz   «      D �]r  }	|	dkD  r/t%        ||	«      st'        d|	› d�«        �nO|j                  d«       t)        |«      }
|
r|
d   d   ndt*        |	<   t'        d|	› dt-        |
«      › d�«       t/        |
«      D �]ó  \  }\  }}	 |j1                  dt2        ||f«      j5                  «       }|r|dz  }Œ:	 t7        |||«      \  }}}}}|s,|dz  }t'        d|d d  › �«       t9        j:                  d!«       Œ||s|}|s|}d"|xs dv rdnd}|xs d}t=        j>                  d#d|t<        j@                  ¬$«      }t=        j>                  d%d|t<        j@                  ¬$«      }t=        j>                  d&d'„ |«      }t=        j>                  d(d)„ |«      }|jC                  «       }|r`g }|D ]B  \  }}t=        j>                  d*d|«      jC                  «       }|jE                  d+|› d,|› d-�«       ŒD |d.d.jG                  |«      z   z  }tI        ||||d d/ |||«      r|dz  }t'        d0|d d  › d1|› d2�«       n|dz  }|jK                  «        t9        j:                  dtM        jL                  «       z   «       �Œö �Œu |jO                  «        d d d «       |jK                  «        |jO                  «        t'        d3|› d4|› d5|› d�«       y # t        $ r Y �Œôw xY w# t        $ r Y �Œ)w xY w# 1 sw Y   Œ_xY w)6Nr   )Úsync_playwrightéx   r>   Tz--no-sandboxz---disable-blink-features=AutomationControlled)ÚheadlessÚargszoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36iV  i   )ÚwidthÚheightzzh-CNzAsia/Shanghai)Ú
user_agentÚviewportÚlocaleÚtimezone_idzEObject.defineProperty(navigator, 'webdriver', {get: () => undefined})i`ê  rB   )r?   Ú
wait_untilr=   rC   i¸  r   u	   ç¿»åˆ°ç¬¬u   é¡µå¤±è´¥ï¼Œå�œæ­¢r#   u   ç¬¬u   é¡µ: u    æ�¡zFSELECT 1 FROM gov_raw WHERE site_name=? AND title=? AND publish_date=?u     âš ï¸� è¯¦æƒ…å¤±è´¥è·³è¿‡: é2   rH   z<tablez<script.*?</script>)Úflagsz<style.*?</style>z(<img[^>]*src=")([^"]+)(")c                 óÜ   — | j                  d«      | j                  d«      j                  d«      r| j                  d«      nt        | j                  d«      z   z   | j                  d«      z   S ©Nr   rH   rG   r    ©rW   r   r[   ©rf   s    r   ú<lambda>zmain.<locals>.<lambda>  sž   € ÀqÇwÁwÈqÃzÐcd×cjÑcjÐklÓcm×cxÑcxÐyô  dAÐUV×U\ÑU\Ð]^ÔU_ô  GOð  RS÷  RYñ  RYð  Z[ó  R\ñ  G\ñ  H]ð  `a÷  `gñ  `gð  hió  `jñ  Hj€ rs   z(<a[^>]*href=")([^"]+)(")c                 óÜ   — | j                  d«      | j                  d«      j                  d«      r| j                  d«      nt        | j                  d«      z   z   | j                  d«      z   S r˜   r™   rš   s    r   r›   zmain.<locals>.<lambda>  sš   € ÀaÇgÁgÈaÃjÐbc×biÑbiÐjkÓbl×bwÑbwÐx~ÔbÐTU×T[ÑT[Ð\]ÔT^ô  FNð  QR÷  QXñ  QXð  YZó  Q[ñ  F[ñ  G\ð  _`÷  _fñ  _fð  ghó  _iñ  Gi€ rs   rl   z<p><a href="z">z</a></p>ú
i ¡ u     âœ… z (ú)u   
å®Œæˆ�! æ–°å¢ž: u    æ�¡, è·³è¿‡: u    æ�¡, ç‚¹å‡»å¤±è´¥: )(r   Úplaywright.sync_apirŠ   r€   ÚconnectÚDB_PATHÚchromiumÚlaunchÚnew_contextÚnew_pageÚadd_init_scriptÚgotoÚLIST_URLrN   r3   r)   r'   r   r;   r(   r   r1   r   r
   rx   ry   rz   rj   r0   r‚   rS   rq   rU   rX   r\   Újoinrƒ   Úcommitr*   rQ   )rŠ   r„   Ú	new_countÚ
skip_countÚ
fail_countÚpÚbrowserr]   r   rc   r   r^   r   r   ÚdupÚd_titleÚd_daterd   re   Úd_urlr…   ÚbodyÚ	att_partsÚnamerO   s                            r   Úmainr·   Õ   s  € Ü„LÝ3Ü�?‰?œ7¨CÔ0€DØ€IØ€JØ€JÙ	Ó	ð G˜aØ—*‘*×#Ñ#¨TØÐKð9MÐ#ó Nˆà×!Ñ!ð IØ#¨sÑ3Ø¨ð "ó 9ˆð �|‰|‹~ˆØ×ÑÐdÔeØ�	‰	”( EÐ6Hˆ	ÔIð	Ø×"Ñ"Ð#DÈeÐ"ÔTð 	×Ñ˜dÔ#ä˜œ9 q™=Ó)ó 5	0ˆBØ�AŠvÜ! $¨Ô+Ü˜I b TÐ);Ð<Ô=ÚØ×%Ñ% dÔ+Ü& tÓ,ˆEÙ38 E¨!¡H¨Q¢K¸bÔ˜bÑ!Ü�C˜�t˜5¤ U£ ¨DÐ1Ô2Ü&/°Ó&6ó ,0Ñ"�‘]�e˜Tð	ØŸ,™,Ø`Ü" E¨4Ð0ó÷ ‘h“jð ñ Ø" a™˜
Ø ð ô
 EQÐQUÐWZÐ\_ÓD`ÑA�˜ ¨{¸EÙØ !‘O�JÜÐ9¸%ÀÀ¸*¸ÐFÔGÜ—J‘J˜q”MØÙØ#�GÙØ!�FØ!)¨lÒ.@¸bÑ!A™AÀq�	à#Ò) r�Ü—v‘vÐ4°b¸$ÄbÇdÁdÔK�Ü—v‘vÐ2°B¸ÄBÇDÁDÔI�ä—v‘vÐ;ñ  >jð  lpó  q�Ü—v‘vÐ:ñ  =ið  koó  p�Ø—z‘z“|�áØ "�IØ%0ò O™	˜˜cÜ!Ÿv™v j°"°dÓ;×AÑAÓC˜Ø!×(Ñ(¨<¸°u¸B¸t¸fÀHÐ)MÕNðOð ˜D 4§9¡9¨YÓ#7Ñ7Ñ7�DÜ  e¨W°d¸7¸F°mÀVÈYÐXcÔdØ ‘N�IÜ˜F 7¨3¨B < .°°6°(¸!Ð<Õ=à !‘O�JØ—‘”Ü—
‘
˜1œvŸ}™}›Ñ.Ö/òY,0ð5	0ðl 	�‰Œ÷OGðP 	‡K�K„MØ‡J�J„LÜ	Ð˜y˜k¨¸
°|ÐCWÐXbÐWcÐcgÐ
hÕiøô{ ò 	Úð	ûô. !ò Úðú÷IGð GúsV   ¹A1OÂ+N&Â>B*OÅ).N6ÆGOÎ&	N3Î/OÎ2N3Î3OÎ6	O	Î?OÏO	ÏOÏOÚ__main__)&Ú__doc__r   ÚosrS   r0   Újsonr€   Úhtmlro   r*   r   ÚpathÚinsertÚdirnameÚabspathÚ__file__r{   r   r   r3   r[   r¨   ry   r|   r}   Úenvironr2   r¡   r   r   r   r1   r;   rj   rV   rƒ   r·   Ú__name__© rs   r   ú<module>rÅ      sä   ðñ
÷ B× A× A× AÝ à ‡�‡���2—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=Ô >ðß?ð %€Ø>€Ø<€	Ø€
Ø€Ø
�*‰*�.‰.˜Ð&7Ó
8€à€	ò$òFð* Ð ò'òRA>òFò!òFQjðf ˆzÒÙ…Fð øðk ò ØÒðús   Á8C ÃCÃC