Ë
    )F_j•î ã                   óX  — 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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„ ZdZdZdZdZdZd	Zd
ZdZd„ ZddddœddddœddddœddddœddddœddddœgZeD � ci c]  } | d    | “Œ
 c} Zd!d"g d#¢fd$d%g d&¢fd'd(g d)¢fd*d+g d,¢fd-d.g d/¢fd0d1g d2¢fd3d4g d5¢fd6d7g d8¢fgZeD ���ci c]  \  }}}||||d9œ“Œ c}}}Zd:„ Z d;„ Z!d<d<d=œgZ"d>„ Z#d?Z$d@„ Z%dA„ Z&dB„ Z'dC„ Z(dŠdD„Z)dE„ Z*d‹dG„Z+dH„ Z,d‹dI„Z-dJ„ Z.d‹dK„Z/dL„ Z0dM„ Z1dN„ Z2dŒdO„Z3h dP£Z4dQZ5dR„ Z6 e6«         e!«         G dS„ dTejn                  jp                  «      Z9ddl	Z	ddlZddlZddl:Z:ddlZdUZ;dZ<dVZ=dWZ>d!dXdYdZœd[d\d]dZœd^d_d`dZœdadbdcdZœdddedfdZœdgdhdidZœdjdkdldZœdmdndodZœdpdqdrdZœdsdtdudZœdvdwdxdZœdydzd{dZœgZ?d|„ Z@e?D �cg c]  }|d    ‘Œ	 c}ZAi ZBi ZCd}„ ZDd~„ ZEd„ ZFd€„ ZGd�d�„ZHd‚„ ZIdƒ„ ZJd„„ ZKd…ZLdFZMd†„ ZNd‡„ ZOePdˆk(  r-ejn                  j£                  d‰efe9«      j¥                  «        yyc c} w c c}}}w c c}w )Žuh   

ç»Ÿä¸€æ�œç´¢æœ�åŠ¡ï¼ˆç«¯å�£8000ï¼‰

é›†æˆ�ï¼šgov FTS5æ�œç´¢ + ä¸­é¡¹ç½‘/ä¸­èƒ½è�”å�ˆ/ä¸­ç­–å¤§æ•°æ�®

é    Nc                 ó@   — t        t        j                  d| «      «      S )Nz[\u4e00-\u9fff\u3400-\u4dbf])ÚboolÚreÚsearch)Útexts    ú/root/search_app.pyÚcontains_chineser	      s   € Ü”—	‘	Ð9¸4Ó@ÓAÐAó    z/root/search.dbz/root/ccpc.dbz/home/ccbuild/znlh.dbz/root/ZC.dbz/root/crawler_results.dbz/root/eia.dbz/root/data.csvi@  c                 óæ   — | syt        j                  d| «      }|r|j                  d«      j                  «       S t        j                  d| «      }|r|j                  d«      j                  «       S y)Nú-u_   [æ€»]?æŠ•èµ„[é¢�é‡‘]?[ï¼š:ä¸º]?\s*[çº¦]?\s*[\d,.]+\s*[ä¸‡äº¿å�ƒç™¾å��ä¸‡å�ƒç™¾å…ƒç¾Ž]?[å…ƒç¾Ž]?r   u   æŠ•èµ„.{0,6}?[\d,.]+[ä¸‡äº¿]?)r   r   ÚgroupÚstrip)r   Úms     r   Úextract_investmentr   (   s_   € á˜ä
�	‰	ÐtÐvzÓ{€Aá�—‘˜“×!Ñ!Ó#Ð
#ä
�	‰	Ð2°DÓ9€Aá�—‘˜“×!Ñ!Ó#Ð
#àr
   Úeiau   çŽ¯è¯„é˜¶æ®µuŽ   çŽ¯è¯„ OR çŽ¯å¢ƒå½±å“�è¯„ä»· OR çŽ¯å¢ƒå½±å“�æŠ¥å‘Š OR çŽ¯å¢ƒå½±å“�ç™»è®° OR ç¬¬ä¸€æ¬¡å…¬ç¤º OR ç¬¬äºŒæ¬¡å…¬ç¤º OR å¾�æ±‚æ„�è§� OR å…¬ä¼—å�‚ä¸Ž)ÚidÚlabelÚkeywordsÚapprovalu   å®¡æ‰¹æŠ¥æ‰¹u^   å®¡æ‰¹ OR æŠ¥æ‰¹ OR æ‰¹å¤� OR æ ¸å‡† OR å¤‡æ¡ˆ OR è¡Œæ”¿è®¸å�¯ OR å®¡æŸ¥æ„�è§� OR å�Œæ„�å»ºè®¾Úbiddingu   æ‹›æ ‡é‡‡è´­ux   æ‹›æ ‡ OR ä¸­æ ‡ OR é‡‡è´­ OR æ¯”é€‰ OR é‚€æ ‡ OR ç«žæ ‡ OR ç«žäº‰æ€§è°ˆåˆ¤ OR è¯¢ä»· OR æ‹›æ ‡å…¬å‘Š OR ä¸­æ ‡å€™é€‰äººÚ
acceptanceu   ç«£å·¥éªŒæ”¶uW   éªŒæ”¶ OR ç«£å·¥ OR è¯•è¿�è¡Œ OR æŠ•äº§ OR è°ƒè¯• OR çŽ¯å¢ƒä¿�æŠ¤éªŒæ”¶ OR ç«£å·¥éªŒæ”¶Úplanningu   è§„åˆ’è®¾è®¡ug   è§„åˆ’ OR è®¾è®¡ OR å�¯è¡Œæ€§ç ”ç©¶ OR å�¯ç ” OR é€‰å�€ OR ç”¨åœ°é¢„å®¡ OR æ–¹æ¡ˆè®¾è®¡ OR åˆ�æ­¥è®¾è®¡Úsecurityu   å®‰å…¨è¯„ä»·uo   å®‰å…¨è¯„ä»· OR å®‰å…¨è®¾æ–½ OR å®‰å…¨éªŒæ”¶ OR å®‰å…¨é¢„è¯„ä»· OR å®‰å…¨ä¸“ç¯‡ OR å®‰å…¨ç”Ÿäº§ OR é£Žé™©è¯„ä¼°r   Úpoweru   ç”µåŠ›èƒ½æº�)u   å�‘ç”µu   ç”µç«™u   å…‰ä¼�u   é£Žç”µu   é£ŽåŠ›u   æ ¸ç”µu   å‚¨èƒ½u   å�˜ç”µu   ç”µåŽ‚u   ç�«ç”µu   æ°´ç”µu	   å¤ªé˜³èƒ½u   å…‰çƒ­u	   æ½®æµ�èƒ½u   ç”Ÿç‰©è´¨å�‘ç”µÚoilgasu   æ²¹æ°”ç®¡é�“)u   æ²¹ç”°ÚLNGu	   å¤©ç„¶æ°”u   ç®¡é�“u   è¾“æ²¹u   å‚¨ç½�u	   åŠ æ°”ç«™u	   åŠ æ²¹ç«™u   æ²¹æ°”u   æ¶²åŒ–å¤©ç„¶æ°”u	   ç…¤å±‚æ°”u	   é¡µå²©æ°”Úchemicalu   åŒ–å·¥çŸ³åŒ–)u   åŒ–å·¥u   å†œè�¯u   å†œåŒ–u   åŽŸè�¯u   åˆ¶å‰‚u   åŒ–è‚¥u   çŸ³åŒ–u   ä¹™çƒ¯u   ç”²é†‡u   æ°¯ç¢±u	   å�ˆæˆ�æ°¨u	   è�šä¹™çƒ¯u	   è�šä¸™çƒ¯u   ç²¾ç»†åŒ–å·¥u   å�±åŒ–u   ç¡«é…¸u   ç›�é…¸u   çƒ§ç¢±Ú
metallurgyu   å†¶é‡‘çŸ¿å±±)u   é’¢é“�u   é“�ä¸šu   å†¶ç‚¼u   çŸ¿å±±u   é‡‡çŸ¿u   ç„¦åŒ–u   æœ‰è‰²é‡‘å±žu   é“œå†¶u   é”Œå†¶u   é“…å†¶u   é“�çŸ¿u   ç…¤çŸ¿u   é‡‘çŸ¿u   é€‰çŸ¿Úwateru   æ°´åŠ¡çŽ¯ä¿�)u   æ±¡æ°´u   ä¾›æ°´u   æŽ’æ°´u   æ°´åŽ‚u   åžƒåœ¾u   å›ºåºŸu   è„±ç¡«u   è„±ç¡�u	   æ¸—æ»¤æ¶²u   æ±¡æ³¥u   ä¸­æ°´å›žç”¨u   åºŸæ°´å¤„ç�†u	   æ°´å¤„ç�†u   å‡€æ°´u   ç”Ÿæ´»åžƒåœ¾u   å�±åºŸÚ	transportu   äº¤é€šè¿�è¾“)u   å…¬è·¯u   é“�è·¯u   æ¸¯å�£u   æœºåœºu   è½¨é�“u   é«˜é€Ÿu   æ¡¥æ¢�u   éš§é�“u   ç �å¤´u   èˆªé�“u   åœ°é“�u   åŸŽè½¨u   ç«™åœºÚbuildingu   å»ºæ��å»ºå·¥)	u   æ°´æ³¥u   çŽ»ç’ƒu   é™¶ç“·u   å»ºæ��u   ç –ç“¦u	   æ··å‡�åœŸu   é¢„åˆ¶æž„ä»¶u   çŸ³ç�°u   çŸ³è†�Úestateu   æˆ¿å»ºå¸‚æ”¿)u   ä½�å®…u   å•†ä¸šç»¼å�ˆä½“u   å¸‚æ”¿u   å›­åŒºu   å­¦æ ¡u   åŒ»é™¢u	   åŠžå…¬æ¥¼u	   ä¿�éšœæˆ¿u	   å®‰ç½®æˆ¿u   å•†ä½�u   ç¤¾åŒºu   æ–‡åŒ–ä¸­å¿ƒ)r   r   Úkwc                 óZ   ‡ — ‰ syt         D ]  \  }}}t        ˆ fd„|D «       «      sŒ|c S  y)u3   ä»…ç”¨æ ‡é¢˜å�šä¸€çº§è¡Œä¸šåˆ†ç±»ï¼Œè¿”å›žè¡Œä¸š idÚotherc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0r#   Útitles     €r   ú	<genexpr>z$classify_industry.<locals>.<genexpr>_   s   øè ø€ Ò)˜rˆr�UŒ{Ñ)ùs   ƒ)ÚINDUSTRY_RULESÚany)r*   Úind_idr   Úkwss   `   r   Úclassify_industryr0   [   s6   ø€ á˜Ü,ò Ñˆ��sÜÓ) SÔ)Õ)ØŠMðð r
   c                  ó¼   — 	 t        j                  t        d¬«      } | j                  d«       | j	                  «        | j                  «        y# t        $ r Y yw xY w)u(   å�¯åŠ¨æ—¶ç¡®ä¿� gov_raw æœ‰ industry åˆ—é
   ©Útimeoutz<ALTER TABLE gov_raw ADD COLUMN industry TEXT DEFAULT 'other'N)Úsqlite3ÚconnectÚDB_PATHÚexecuteÚcommitÚcloseÚ	Exception©Úconns    r   Úensure_industry_columnr>   c   sH   € ðÜ�‰œw°Ô3ˆØ�‰ÐSÔTØ�‰ŒØ�
‰
�øÜò Ùðús   ‚AA Á	AÁAõ   èµ„æº�ç½‘ç«™)r   r   c                 óž   — | €yt        | «      j                  dd«      j                  dd«      j                  dd«      j                  dd	«      S )
NÚ ú&z&amp;ú<z&lt;ú>z&gt;ú"ú&quot;)ÚstrÚreplace©Úss    r   ÚescrK   w   sG   € à€y˜äˆq‹6�>‰>˜#˜gÓ&×.Ñ.¨s°6Ó:×BÑBÀ3ÀvÓN×VÑVÐWZÐ[cÓdÐdr
   a1  *{margin:0;padding:0;box-sizing:border-box}

body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif;background:#fff;color:#202124;min-height:100vh}

a{color:#1a0dab;text-decoration:none}

a:visited{color:#609}

a:hover{text-decoration:underline}

.container{max-width:1000px;margin:0 auto;padding:0 20px}

.home-wrap{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:75vh;text-align:center}

.home-logo{font-size:48px;font-weight:700;color:#1a73e8;letter-spacing:-1px;margin-bottom:4px}

.home-sub{font-size:14px;color:#5f6368;margin-bottom:28px}

.home-search{width:100%;max-width:584px;margin:0 auto 24px}

.home-search .search-box input{border-radius:28px;padding:14px 20px;font-size:16px;box-shadow:0 1px 6px rgba(32,33,36,.08)}

.home-search .search-box input:focus{box-shadow:0 1px 8px rgba(32,33,36,.16)}

.home-btns{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;margin-bottom:20px}

.home-btns a{display:inline-flex;align-items:center;gap:6px;padding:8px 20px;background:#f8f9fa;border:1px solid #dadce0;border-radius:24px;font-size:14px;color:#3c4043;transition:all .15s}

.home-btns a:hover{background:#e8f0fe;border-color:#1a73e8;color:#1a73e8;text-decoration:none}

.home-count{font-size:13px;color:#70757a;margin-top:4px}

.nav{display:flex;align-items:center;gap:16px;padding:12px 0;border-bottom:1px solid #ebebeb;margin-bottom:16px}

.nav-logo{font-size:18px;font-weight:700;color:#1a73e8;white-space:nowrap;flex-shrink:0}

.nav-links{display:flex;gap:4px;flex-wrap:wrap}

.nav-links a{font-size:13px;color:#5f6368;padding:4px 10px;border-radius:16px;transition:background .15s}

.nav-links a:hover{background:#f0f0f0;text-decoration:none;color:#1a73e8}

.nav-links a.act{background:#e8f0fe;color:#1a73e8;font-weight:500}

.nav-right{margin-left:auto;font-size:13px;color:#5f6368;display:flex;align-items:center;gap:8px}

.nav-right a{font-size:12px;color:#d93025;text-decoration:none}

.search-section{margin-bottom:12px}

.search-box{display:flex;gap:0}

.search-box input{flex:1;padding:12px 20px;border:1px solid #dfe1e5;border-radius:24px 0 0 24px;font-size:16px;outline:none;box-shadow:0 1px 6px rgba(32,33,36,.08)}

.search-box input:focus,.search-box input:hover{border-color:#1a73e8;box-shadow:0 1px 8px rgba(32,33,36,.16)}

.search-box button{padding:12px 24px;background:#1a73e8;color:#fff;border:none;border-radius:0 24px 24px 0;font-size:15px;cursor:pointer}

.search-box button:hover{background:#1557b0}

.toolbar{margin-bottom:10px}

.controls{display:flex;justify-content:space-between;align-items:center}

.total-count{font-size:14px;color:#70757a}

.db-tabs{display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap}

.db-tabs a{font-size:13px;color:#5f6368;padding:5px 14px;border:1px solid #dadce0;border-radius:16px;transition:all .15s}

.db-tabs a:hover{background:#e8f0fe;text-decoration:none;border-color:#1a73e8;color:#1a73e8}

.db-tabs a.act{background:#1a73e8;color:#fff;border-color:#1a73e8}

.results{max-width:100%;margin:0 auto}.result-item{display:flex;gap:10px;padding:12px 0;border-bottom:1px solid #f0f0f0;transition:background .1s}

.result-item:hover{background:#f8f9fa;margin:0 -10px;padding:12px 10px;border-radius:4px}

.result-item .num{font-size:13px;color:#70757a;min-width:26px;text-align:right;flex-shrink:0;padding-top:2px}

.result-item h3{font-size:16px;font-weight:400;line-height:1.3;margin-bottom:2px}

.result-item h3 a{color:#1a0dab}

.meta{font-size:12px;color:#70757a;display:flex;gap:8px;flex-wrap:wrap;align-items:center}

.bdg{display:inline-block;padding:1px 6px;border-radius:3px;font-size:11px;font-weight:500}

.bdg-crawler{background:#e8f5e9;color:#2e7d32}

.bdg-zc{background:#fef3e2;color:#e65100}

.bdg-other{background:#f3e8fd;color:#7b1fa2}

.summary{font-size:14px;color:#4d5156;line-height:1.58;margin-top:2px}

.no-results{text-align:center;padding:60px 0;color:#70757a;font-size:14px}

.time-select{padding:5px 12px;font-size:13px;color:#3c4043;border:1px solid #dadce0;border-radius:16px;cursor:pointer;outline:none;background:#fff}

.time-select:hover{border-color:#bdc1c6}

.page-btn{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:36px;padding:0 12px;border-radius:4px;font-size:13px;color:#1a73e8;text-decoration:none}

.page-btn:hover{background:#f0f0f0;text-decoration:none}

.page-btn.act{background:#1a73e8;color:#fff}

.page-elp{color:#70757a;padding:0 4px;font-size:13px}

.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:6px;font-size:13px;color:#5f6368}

.page-jump input{width:48px;padding:6px 8px;border:1px solid #dadce0;border-radius:4px;font-size:13px;text-align:center;outline:none}

.page-jump input:focus{border-color:#1a73e8}

.detail-wrap{max-width:900px;margin:0 auto;padding:20px}

.detail-card{background:#fff;border-radius:12px;padding:24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08)}

.detail-card h2{font-size:20px;margin-bottom:12px;color:#1a1a2e}

.detail-content{font-size:14px;line-height:1.8;color:#444;overflow-wrap:break-word;overflow-x:auto}

.detail-content p{margin:10px 0}

.detail-content table{border-collapse:collapse;width:100%;margin:12px 0;font-size:14px}

.detail-content td,.detail-content th{border:1px solid #ddd;padding:8px 12px}

.detail-content a{color:#1a73e8}

.detail-content img{max-width:100%;height:auto;border-radius:8px}

c                 ó  — | sg g fS t        | «      } | j                  «       j                  «       }g g }}|D ]G  }|j                  d«      r#t	        |«      dkD  r|j                  |dd «       Œ7|j                  |«       ŒI ||fS )ub   è§£æž� Google è¯­æ³•æŸ¥è¯¢ï¼š-keyword æŽ’é™¤ï¼Œå…¶ä½™ä¸ºåŒ…å�«ã€‚æ ‡ç‚¹ç¬¦å�·ç»Ÿä¸€è§†ä¸ºç©ºæ ¼ã€‚r   é   N)Únormalize_queryr   ÚsplitÚ
startswithÚlenÚappend)ÚqÚpartsÚincÚexcÚps        r   Úparse_google_queryrX   	  s€   € áØ�2ˆvˆÜ˜Ó€AØ�G‰G‹I�O‰OÓ€EØ�2ˆ€CØò ˆØ�<‰<˜Ô¤ Q£¨!¢Ø�J‰J�q˜˜�uÕà�J‰J�q�Mð	ð
 �ˆ8€Or
   c                 óæ   ‡— | s| S t        t        j                  j                  dd«      dz   «      Šdj	                  ˆfd„| D «       «      }t        j                  dd|«      j                  «       }|S )z8Replace all punctuation (Chinese + English) with spaces.r   rA   uP   ï¼Œã€‚ã€�ï¼›ï¼šï¼Ÿï¼�â€¦â€”Â·ï½žã€Œã€�ã€Žã€�ã€–ã€—ã€�ã€‘ã€”ã€•ã€ˆã€‰ã€Šã€‹ï¼ˆï¼‰c              3   ó.   •K  — | ]  }|‰v rd n|–— Œ y­w)ú Nr(   )r)   ÚcÚ	punct_sets     €r   r+   z"normalize_query.<locals>.<genexpr>  s   øè ø€ Ò=°a˜A ™N‘S°Ó1Ñ=ùs   ƒú\\s+r[   )ÚsetÚstringÚpunctuationrH   Újoinr   Úsubr   )rS   Úresultr]   s     @r   rN   rN     sk   ø€ áØˆÜ”F×&Ñ&×.Ñ.¨s°BÓ7ð  ;Mñ  Mó  N€IØ�W‰WÓ=¸1Ô=Ó=€FÜ�V‰V�G˜S &Ó)×/Ñ/Ó1€FØ€Mr
   c                 óœ   — | s| S t        | «      } t        j                  dd| «      } t        j                  dd| «      j                  «       } | S )z>Remove FTS5 special chars and replace punctuation with spaces.z[()*^"\\\\[\\\\]./]r[   r^   )rN   r   rc   r   )rS   s    r   Úsanitize_fts_queryrf   $  sG   € áØˆÜ˜Ó€AÜ
�‰Ð% s¨AÓ.€AÜ
�‰ˆw˜˜QÓ×%Ñ%Ó'€AØ€Hr
   c                  óª   — t        j                  t        d¬«      } t         j                  | _        | j                  d«       | j                  d«       | S )Nr2   r3   zPRAGMA busy_timeout=5000úPRAGMA journal_mode=WAL)r5   r6   r7   ÚRowÚrow_factoryr8   r<   s    r   Úget_dbrk   /  s=   € ä�?‰?œ7¨BÔ/€Dä—{‘{€DÔØ‡L�LÐ+Ô,à‡L�LÐ*Ô+à€Kr
   c                 ó<	  — t        j                  t        d¬«      }t         j                  |_        |j                  d«       |j                  «       }	g }
g }d}| rd}|
j                  | «       |r2t        |   d   }|sd}|
j                  |«       n| d|z   dz   z  } | |
d	<   |r"|j                  d
«       |
j                  |«       |r'|dk7  r"|j                  d«       |
j                  |«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |dk(  rdn|dk(  rdnd}|dz   }|dz
  |z  }d	}|�r_|
d	   }t        |«      }||
d	<   t        |«      \  }}t        |«      s|st        |«      dkD  �rÍt        |«      r·|sµt        |«      dk(  r§	 |	j                  dt        |«      f«       |	j                  «       d	   }|	j                  d|› d�t        |«      ||f«       |d	kD  rP|	j!                  «       D �cg c]  }t#        |«      ‘Œ }}t        |«      |kD  }|r|d| }|j%                  «        |||fS g }g }|D ]9  }|j                  d«       |j'                  d|z   dz   d|z   dz   d|z   dz   g«       Œ; |D ]9  }|j                  d«       |j'                  d|z   dz   d|z   dz   d|z   dz   g«       Œ; |sg }d	}d}|j%                  «        |||fS dj)                  |«      }|r|ddj)                  |«      z   z  }|	j                  d |› �|«       |	j                  «       d	   }|	j                  d!|› d"�|||gz   «       n‰	 |	j                  dt        |«      f«       |	j                  «       d	   }|	j                  d|› d�t        |«      ||f«       n6|rd%dj)                  |«      z   nd&}|	j                  d'|› d(|› d�|
||gz   «       |	j!                  «       D �cg c]  }t#        |«      ‘Œ }}t        |«      |kD  }|r|d| }|j%                  «        |||fS # t         j                  $ r d	}Y �ŒQw xY wc c}w # t         j                  $ rH d|z   dz   }|	j                  d#||f«       |	j                  «       d	   }|	j                  d$||||f«       Y ŒËw xY wc c}w ))u   è¿”å›ž (rows, total, has_more)r2   r3   rh   FTr   z AND (ú)r   zr.category = ?Úallzr.industry = ?rM   é   é   ©Ú1dÚ7dÚ30dú.(SUBSTR(r.publish_date,1,10) >= date('now', '-ú days'))Ú	relevanceÚrankÚ	date_desczr.publish_date DESCzr.publish_date ASCz8SELECT COUNT(*) FROM gov_search WHERE gov_search MATCH ?zdSELECT r.*, rank FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ? ORDER BY z LIMIT ? OFFSET ?Nú:(r.title LIKE ? OR r.site_name LIKE ? OR r.content LIKE ?)ú%úH(r.title NOT LIKE ? AND r.site_name NOT LIKE ? AND r.content NOT LIKE ?)ú AND ú%SELECT COUNT(*) FROM gov_raw r WHERE ú,SELECT r.*, "" as rank FROM gov_raw r WHERE z. ORDER BY r.publish_date DESC LIMIT ? OFFSET ?zASELECT COUNT(*) FROM gov_raw WHERE title LIKE ? OR summary LIKE ?zxSELECT r.*, "" as rank FROM gov_raw r WHERE title LIKE ? OR summary LIKE ? ORDER BY r.publish_date DESC LIMIT ? OFFSET ?úWHERE rA   zSELECT r.* FROM gov_raw r z
 ORDER BY )r5   r6   r7   ri   rj   r8   ÚcursorrR   Ú	PHASE_MAPrN   rX   r	   rQ   rf   ÚfetchoneÚOperationalErrorÚfetchallÚdictr:   Úextendrb   )ÚqueryÚpageÚ	page_sizeÚsortÚphaseÚcategoryÚ	daterangeÚindustryr=   r\   ÚparamsÚwhere_partsÚuse_ftsr#   ÚdaysÚ	order_sqlÚ
fetch_sizeÚoffsetÚtotalrS   Ú	inc_termsÚ	exc_termsÚrÚrowsÚhas_moreÚ
like_condsÚlike_paramsÚtÚ
like_whereÚlike_qÚwheres                                  r   r   r   <  s•  € ä�?‰?œ7¨BÔ/€DÜ—{‘{€DÔØ‡L�LÐ*Ô+Ø�‰‹€AØ€F˜r�Ø€GÙØˆØ�‰�eÔÙÜ�uÑ˜jÑ)ˆÙØˆGØ�M‰M˜"Õà�X ‘] SÑ(Ñ(ˆEØˆF�1‰IÙØ×ÑÐ+Ô,¨f¯m©m¸HÔ.EÙ�H Ò%Ø×ÑÐ+Ô,¨f¯m©m¸HÔ.EÙ�Y %Ò'Ø˜A BÑ'¨	Ñ2ˆØ×ÑÐKÈDÈ6ÐQYÐZÔ[Ø +Ò-‘ÈDÐT_ÒL_Ñ3HÐey€IØ˜Q‘€JØ�1‰f�iÑ€FØ€EÚØ�1‰Iˆä˜AÓˆØˆˆq‰	ä1°!Ó4Ñˆ	�9ä˜AÔ¡)¬s°9«~ÀÓ/Aä Ô"©9¼¸Y»È1Ò9LðØ—I‘IÐXÔ[mÐnoÓ[pÐZrÔsØŸJ™J›L¨™O�EØ—I‘Ið  !Eð  FOð  EPð  Pað  bô  ewð  xyó  ezð  |Fð  HNð  dOô  Pð ˜1’9Ø-.¯Z©Z«\Ö:¨œD �GÐ:�DÐ:Ü" 4›y¨9Ñ4�HÙ¨¨Z¨iÐ(8 Ø—J‘J”LØ ¨Ð0Ð0ØˆJØˆKØò R�Ø×!Ñ!Ð"^Ô_Ø×"Ñ" C¨!¡G¨c¡M°3¸±7¸S±=À#ÈÁ'ÈCÁ-Ð#PÕQðRð ò R�Ø×!Ñ!Ð"lÔmØ×"Ñ" C¨!¡G¨c¡M°3¸±7¸S±=À#ÈÁ'ÈCÁ-Ð#PÕQðRñ Ø� 1˜5° hØ—
‘
”Ø˜U HÐ,Ð,Ø Ÿ™ jÓ1ˆJÙØ˜g¨¯©°[Ó(AÑAÑA�
Ø�I‰IÐ=¸j¸\ÐJÈKÔXØ—J‘J“L ‘OˆEØ�I‰IÐDÀZÀLÐP~Ðð  BMð  Q[ð  ]cð  Pdñ  Bdõ  eð|Ø—	‘	ÐTÔWiÐjkÓWlÐVnÔoØŸ
™
› Q™�Ø—	‘	ð  Að  BKð  ALð  L]ð  ^ô  asð  tuó  avð  xBð  DJð  `Kõ  Lñ 9D�˜7Ÿ<™<¨Ó4Ò4ÈˆØ	�	‰	Ð.¨u¨g°ZÀ	¸{ÐJ[Ð\Ð^dÐhrÐtzÐg{Ñ^{Ô|ØŸZ™Z›\Ö*˜ŒD��GÐ*€DÐ*Ü�4‹y˜9Ñ$€HÙØ�J�YÐˆØ‡J�J„LØ�˜Ð Ð øô[ ×/Ñ/ò Ø“Eðüò ;øô8 ×+Ñ+ò |Ø˜q™ 3™�Ø—	‘	Ð]Ð`fÐhnÐ_oÔpØŸ
™
› Q™�Ø—	‘	ð  Uð  X^ð  `fð  hrð  tzð  W{ö  |ð	|üò +s3   ÆAP Ç8P6ÍAP; ÏRÐP3Ð2P3Ð;ARÒRc                 óº   — t        «       }|j                  «       }|j                  d| f«       |j                  «       }|j	                  «        |rt        |«      S d S )Nú SELECT * FROM gov_raw WHERE id=?)rk   r�   r8   rƒ   r:   r†   )Ú	record_idr=   r\   rš   s       r   Ú
get_detailr¦   ˜  sI   € ä‹8€D˜Ÿ™›�Qà‡I�IÐ0°9°,Ô?à	�
‰
‹€Aà‡J�J„LáŒ4�‹7Ð!˜TÐ!r
   é   c                 ó  — t         j                  j                  t        «      sdg fS t	        j
                  t        «      }t        j                  |_        g g }}| rtt        | «      \  }}	|D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |	D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |rx|dk7  rs|t        v rkt        |   d   d d }|rZd	j                  d
gt        |«      z  «      }|j                  d|z   dz   «       |j                  |D �cg c]
  }d|z   dz   ‘Œ c}«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |rddj                  |«      z   nd}|j                  d|z   |«      j                  «       d   }|j                  d|z   dz   |||dz
  |z  gz   «      D �cg c]  }t!        |«      ‘Œ }}|j#                  «        ||fS c c}w c c}w )Nr   úw(project_id LIKE ? OR project_name LIKE ? OR owner_company LIKE ? OR industry LIKE ? OR province LIKE ? OR city LIKE ?)r{   é   ú”(project_id NOT LIKE ? AND project_name NOT LIKE ? AND owner_company NOT LIKE ? AND industry NOT LIKE ? AND province NOT LIKE ? AND city NOT LIKE ?)rn   r#   é   ú OR úindustry LIKE ?ú(rm   rM   ro   rp   rq   ú+SUBSTR(publish_date,1,10) >= date('now', '-ú days')r€   r}   rA   z$SELECT COUNT(*) FROM cceup_projects zSELECT * FROM cceup_projects ú8 ORDER BY publish_date DESC, project_id LIMIT ? OFFSET ?)ÚosÚpathÚexistsÚCONTACT_DB_PATHr5   r6   ri   rj   rX   rR   r‡   ÚINDUSTRY_MAPrb   rQ   r8   rƒ   r†   r:   ©rS   r‰   ÚperrŽ   r�   ÚdbÚcondsr�   rU   rV   rŸ   r/   Ú	sub_condsÚkr“   Úwhr—   rš   r›   s                      r   Úcceup_searchr¿   ¨  sJ  € ä�7‰7�>‰>œ/Ô*°1°b°5¨Lä	�‰œÓ	)€B¼G¿K¹K¨2¬>à˜ˆ6€Eáä% aÓ(‰ˆˆSàò 	)ˆAà�L‰Lð  Sô  Tà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ð ò 	)ˆAà�L‰Lð  pô  qà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ñ �H Ò%¨(´lÑ*Bä˜8Ñ$ TÑ*¨2¨AÐ.ˆáàŸ™Ð%6Ð$7¼#¸c»(Ñ$BÓCˆIà�L‰L˜˜y™¨3Ñ.Ô/à�M‰M¨cÖ2¨˜3˜q™5 ›9Ò2Ô3á�Y %Ò'à˜A BÑ'¨	Ñ2ˆà�‰ÐBÀ4À&ÈÐPÔQá).ˆ�'—,‘,˜uÓ%Ò	%°B€Bà�J‰JÐ=¸bÑ@À&ÓI×RÑRÓTÐUVÑW€EàŸZ™ZÐ(GÈÑ(Jð  LFñ  )Fð  HNð  PSð  UYð  Z[ñ  U[ð  ]`ñ  T`ð  Oañ  Haó  bö  c˜ŒD��Gð  c€Dð  cà‡H�H„Jà�$ˆ;Ðùò! 3ùò có   Ä4G:ÇG?c                 óè   — t         j                  j                  t        «      syt	        j
                  t        «      }|j                  d| f«      j                  «       d   }|j                  «        |S )Nr   z6SELECT COUNT(*) FROM cceup_contacts WHERE project_id=?)	r³   r´   rµ   r¶   r5   r6   r8   rƒ   r:   )Úpidrº   r—   s      r   Úcceup_contacts_countrÃ   Þ  sT   € ä�7‰7�>‰>œ/Ô*°1ä	�‰œÓ	)€Bà�J‰JÐOÐRUÐQWÓX×aÑaÓcÐdeÑf€Eà‡H�H„Jà€Lr
   c                 ó  — t         j                  j                  t        «      sdg fS t	        j
                  t        «      }t        j                  |_        g g }}| rtt        | «      \  }}	|D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |	D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |rx|dk7  rs|t        v rkt        |   d   d d }|rZd	j                  d
gt        |«      z  «      }|j                  d|z   dz   «       |j                  |D �cg c]
  }d|z   dz   ‘Œ c}«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |rddj                  |«      z   nd}|j                  d|z   |«      j                  «       d   }|j                  d|z   dz   |||dz
  |z  gz   «      D �cg c]  }t!        |«      ‘Œ }}|j#                  «        ||fS c c}w c c}w )Nr   r©   r{   rª   r«   rn   r#   r¬   r­   r®   r¯   rm   rM   ro   rp   rq   r°   r±   r€   r}   rA   z#SELECT COUNT(*) FROM znlh_projects zSELECT * FROM znlh_projects r²   )r³   r´   rµ   ÚZNLH_DB_PATHr5   r6   ri   rj   rX   rR   r‡   r·   rb   rQ   r8   rƒ   r†   r:   r¸   s                      r   Úznlh_searchrÆ   î  sJ  € ä�7‰7�>‰>œ,Ô'°°2°¨ä	�‰œÓ	&€B¼¿¹¨¬à˜ˆ6€Eáä% aÓ(‰ˆˆSàò 	)ˆAà�L‰Lð  Sô  Tà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ð ò 	)ˆAà�L‰Lð  pô  qà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ñ �H Ò%¨(´lÑ*Bä˜8Ñ$ TÑ*¨2¨AÐ.ˆáàŸ™Ð%6Ð$7¼#¸c»(Ñ$BÓCˆIà�L‰L˜˜y™¨3Ñ.Ô/à�M‰M¨cÖ2¨˜3˜q™5 ›9Ò2Ô3á�Y %Ò'à˜A BÑ'¨	Ñ2ˆà�‰ÐBÀ4À&ÈÐPÔQá).ˆ�'—,‘,˜uÓ%Ò	%°B€Bà�J‰JÐ<¸RÑ?ÀÓH×QÑQÓSÐTUÑV€EàŸZ™ZÐ(FÀrÑ(Ið  KEñ  )Eð  GMð  ORð  TXð  YZñ  TZð  \_ñ  S_ð  N`ñ  G`ó  aö  b˜ŒD��Gð  b€Dð  bà‡H�H„Jà�$ˆ;Ðùò! 3ùò brÀ   c                 ó¬  — t         j                  j                  t        «      sy t	        j
                  t        «      }t        j                  |_        |j                  d| f«      j                  «       }|s|j                  «        y t        |«      }|j                  d| f«      D �cg c]  }t        |«      ‘Œ c}|d<   |j                  «        |S c c}w )Nz.SELECT * FROM znlh_projects WHERE project_id=?z:SELECT * FROM znlh_contacts WHERE project_id=? ORDER BY idÚcontacts)r³   r´   rµ   rÅ   r5   r6   ri   rj   r8   rƒ   r:   r†   ©rÂ   rº   rš   rW   s       r   Úznlh_detailrÊ   $  s™   € ä�7‰7�>‰>œ,Ô'°ä	�‰œÓ	&€B¼¿¹¨¬à
�
‰
ÐCÀSÀFÓK×TÑTÓV€Aáˆb�h‰hŒj äˆQ‹€Aà&(§j¡jÐ1mÐorÐntÓ&uÖv ”T˜!•WÒv€A€j�Mà‡H�H„J�q�ùò wó   Â'Cc                 ó  — t         j                  j                  t        «      sdg fS t	        j
                  t        «      }t        j                  |_        g g }}| rtt        | «      \  }}	|D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |	D ].  }
|j                  d«       |j                  d|
z   dz   gdz  «       Œ0 |rx|dk7  rs|t        v rkt        |   d   d d }|rZd	j                  d
gt        |«      z  «      }|j                  d|z   dz   «       |j                  |D �cg c]
  }d|z   dz   ‘Œ c}«       |r#|dk7  rddddœ|   }|j                  d|› d�«       |rddj                  |«      z   nd}|j                  d|z   |«      j                  «       d   }|j                  d|z   dz   |||dz
  |z  gz   «      D �cg c]  }t!        |«      ‘Œ }}|j#                  «        ||fS c c}w c c}w )Nr   z_(project_id LIKE ? OR project_name LIKE ? OR industry LIKE ? OR province LIKE ? OR city LIKE ?)r{   é   zw(project_id NOT LIKE ? AND project_name NOT LIKE ? AND industry NOT LIKE ? AND province NOT LIKE ? AND city NOT LIKE ?)rn   r#   r¬   r­   r®   r¯   rm   rM   ro   rp   rq   r°   r±   r€   r}   rA   z!SELECT COUNT(*) FROM zc_projects zSELECT * FROM zc_projects r²   )r³   r´   rµ   Ú
ZC_DB_PATHr5   r6   ri   rj   rX   rR   r‡   r·   rb   rQ   r8   rƒ   r†   r:   r¸   s                      r   Ú	zc_searchrÏ   8  sD  € ä�7‰7�>‰>œ*Ô%¨a°¨e |ä	�‰œÓ	$€B´w·{±{ b¤nà˜ˆ6€Eáä% aÓ(‰ˆˆSàò 	)ˆAà�L‰LÐzÔ{à�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ð ò 	)ˆAà�L‰Lð  Sô  Tà�M‰M˜3˜q™5 ™9˜+ a™-Õ(ð		)ñ �H Ò%¨(´lÑ*Bä˜8Ñ$ TÑ*¨2¨AÐ.ˆáàŸ™Ð%6Ð$7¼#¸c»(Ñ$BÓCˆIà�L‰L˜˜y™¨3Ñ.Ô/à�M‰M¨cÖ2¨˜3˜q™5 ›9Ò2Ô3á�Y %Ò'à˜A BÑ'¨	Ñ2ˆà�‰ÐBÀ4À&ÈÐPÔQá).ˆ�'—,‘,˜uÓ%Ò	%°B€Bà�J‰JÐ:¸2Ñ=¸vÓF×OÑOÓQÐRSÑT€EàŸZ™ZÐ(DÀRÑ(Gð  ICñ  )Cð  EKð  MPð  RVð  WXñ  RXð  Z]ñ  Q]ð  L^ñ  E^ó  _ö  `˜ŒD��Gð  `€Dð  `à‡H�H„Jà�$ˆ;Ðùò! 3ùò `rÀ   c                 ó¬  — t         j                  j                  t        «      sy t	        j
                  t        «      }t        j                  |_        |j                  d| f«      j                  «       }|s|j                  «        y t        |«      }|j                  d| f«      D �cg c]  }t        |«      ‘Œ c}|d<   |j                  «        |S c c}w )Nz,SELECT * FROM zc_projects WHERE project_id=?z8SELECT * FROM zc_contacts WHERE project_id=? ORDER BY idrÈ   )r³   r´   rµ   rÎ   r5   r6   ri   rj   r8   rƒ   r:   r†   rÉ   s       r   Ú	zc_detailrÑ   n  s™   € ä�7‰7�>‰>œ*Ô%¨dä	�‰œÓ	$€B´w·{±{ b¤nà
�
‰
ÐAÀ3À&ÓI×RÑRÓT€Aáˆb�h‰hŒj äˆQ‹€Aà&(§j¡jÐ1kÐmpÐlrÓ&sÖt ”T˜!•WÒt€A€j�Mà‡H�H„J�q�ùò urË   c                 óü  — t         j                  j                  t        «      sy t	        j
                  t        «      }t        j                  |_        	 |j                  d| f«      j                  «       }|s	 |j                  «        y t        |«      }|j                  d«      xs |j                  d«      xs d|d<   |j                  d«      xs d|d<   ||j                  «        S # |j                  «        w xY w)Nr¤   Úpage_urlÚ
source_urlrA   ÚurlÚ	site_nameÚdomain)r³   r´   rµ   r7   r5   r6   ri   rj   r8   rƒ   r:   r†   Úget)rÂ   rº   rš   Úds       r   Úcrawler_detailrÚ   Œ  s¼   € ä�7‰7�>‰>œ'Ô"¨4ä	�‰œÓ	!€B´G·K±K 2¤>ðà�J‰JÐ9¸3¸&ÓA×JÑJÓLˆá˜ð 	�‰�
ô �‹Gˆà—5‘5˜Ó$ÒA¨¯©¨lÓ(;ÒA¸rˆˆ%‰à—e‘e˜KÓ(Ò.¨Bˆˆ(‰àð 	�‰�
øˆ�‰�
ús   Á#C) Â	AC) Ã)C;c                 óö   — |r|sy t        j                  t        «      }	 |j                  d| t	        |«      |f«       |j                  «        |j                  «        y #  Y ŒxY w# |j                  «        w xY w)NzNINSERT INTO project_visits (project_type, project_id, username) VALUES (?,?,?))r5   r6   Ú
SESSION_DBr8   rG   r9   r:   )ÚptyperÂ   Úusernamerº   s       r   Ú_track_project_visitrß   ª  se   € á™3 ä	�‰œÓ	$€Bðà
�
‰
Ðcàœ3˜s›8 XÐ.ô	0ð 	�	‰	Œð 	�‰�
øðáûð 	�‰�
ús    .A ÁA#Á!A& Á&A8c                 ó  — |sdg fS t        j                  t        «      }t         j                  |_        	 |j                  d| t        |«      f«      j                  «       d   }|j                  d| t        |«      |f«      D �cg c]  }t        |«      ‘Œ }}|j                  d| t        |«      f«      j                  «       d   }||f|j                  «        S c c}w #  dg fcY |j                  «        S xY w# |j                  «        w xY w)Nr   úISELECT COUNT(*) FROM project_visits WHERE project_type=? AND project_id=?zSELECT DISTINCT username, visited_at FROM project_visits WHERE project_type=? AND project_id=? ORDER BY visited_at DESC LIMIT ?zYSELECT COUNT(DISTINCT username) FROM project_visits WHERE project_type=? AND project_id=?)
r5   r6   rÜ   ri   rj   r8   rG   rƒ   r†   r:   )rÝ   rÂ   Úlimitrº   r—   rš   ÚrecentÚunique_counts           r   Ú_get_project_visitorsrå   Â  sþ   € á�q˜"�u�ä	�‰œÓ	$€Bä—[‘[€B„Nðà—
‘
Ðfà!¤3 s£8Ð,ó.ç.6©h«j¸ñ<ˆð $&§:¡:ð Nà”C˜“H˜eÐ$ó	$&ö '˜a”$�q•'ð 'ˆð 'ð —z‘zÐ"}à$)¬3¨s«8Ð#4ó6ç6>±h³jÀñDˆð ˜VÐ#ð 	�‰�
ùò%'øðà�"ˆu‰ð 	�‰�
ûˆ�‰�
ús0   ¶AC ÂCÂ3C ÃC ÃC7Ã%C: Ã7C: Ã:D>   ÚadminÚlzhongÚsteveouÚschengboÚ	wjianningz/root/contact.dbc                  óþ   — t        j                  t        «      } | j                  d«       | j                  d«       | j                  d«       | j                  d«       | j	                  «        | j                  «        y )NzãCREATE TABLE IF NOT EXISTS sessions (

        token TEXT PRIMARY KEY, username TEXT NOT NULL,

        created_at TEXT DEFAULT (datetime('now','localtime')),

        last_seen TEXT DEFAULT (datetime('now','localtime'))

    )a  CREATE TABLE IF NOT EXISTS usage_log (

        id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL,

        action TEXT NOT NULL, page TEXT DEFAULT '', query TEXT DEFAULT '',

        ip TEXT DEFAULT '', created_at TEXT DEFAULT (datetime('now','localtime'))

    )a	  CREATE TABLE IF NOT EXISTS project_visits (

        id INTEGER PRIMARY KEY AUTOINCREMENT,

        project_type TEXT NOT NULL,

        project_id TEXT NOT NULL,

        username TEXT NOT NULL,

        visited_at TEXT DEFAULT (datetime('now','localtime'))

    )zoCREATE INDEX IF NOT EXISTS idx_pv_lookup 

        ON project_visits(project_type, project_id, visited_at DESC))r5   r6   rÜ   r8   r9   r:   )rº   s    r   Úinit_session_dbrì   î  so   € ä	�‰œÓ	$€Bà‡J�Jð 	ô 
ð ‡J�Jð 	ô 
ð ‡J�Jð 	ô 
ð ‡J�Jð Hô Ið ‡I�I„K�—‘•r
   c                   óÆ   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd d„Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd!d„Zd!d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z y)"ÚSearchHandlerc           	      ó¢  — t         j                  j                  | j                  «      }t         j                  j	                  |j
                  «      }| j                  «       | _        |j                  j                  d«      r| j                  xs d| _        |j                  dv rg|j                  dk(  rF| j                  d«       | j                  dd«       | j                  dd	«       | j                  «        y | j                  |«       y |j                  j                  d
«      �rdd l}dd l}d|j                  z   }|j                  j                  |«      rœ|j!                  |«      \  }}| j                  d«       | j                  d|xs d«       | j                  dd«       | j                  «        t#        |d«      5 }| j$                  j'                  |j)                  «       «       d d d «       y | j                  d«       | j                  «        | j$                  j'                  d«       y |j                  j                  d«      r| j+                  |«       y |j                  j                  d«      r| j-                  |«       y | j                  s4| j                  d«       | j                  dd	«       | j                  «        y | j/                  |j                  |«       |j                  }	|}
|	j                  d«      r-|	j1                  d«      d   }t3        d|t5        | dd«      «       n7|	dk(  r2d|
v r.|
j7                  ddg«      d   }t3        d |t5        | dd«      «       |j                  d!v r| j9                  d"|«       y |j                  j                  d#«      r| j;                  d"|j                  «       y |j                  d$v r| j9                  d%|«       y |j                  j                  d&«      r| j;                  d%|j                  «       y |j                  d'v r| j9                  d|«       y |j                  j                  d«      r| j;                  d|j                  «       y |j                  d(v r| j9                  d)|«       y |j                  j                  d*«      r| j;                  d)|j                  «       y |j                  dk(  r| j=                  |«       y |j                  dk(  r| j?                  |«       y |j                  d+k(  r| jA                  |«       y |j                  d,k(  r| jC                  |«       y |j                  d-k(  r| jE                  |«       y |j                  d.k(  r| jE                  |«       y |j                  d/v r| jG                  |«       y |j                  d0k(  r| jI                  «        y |j                  j                  d1«      s|j                  j                  d2«      r| jK                  | j                  «       y |j                  d3k(  r| jM                  «        y |j                  d4k(  r| jO                  «        y |j                  d5k(  r| jQ                  |«       y |j                  d6k(  r| jS                  «        y |j                  dk(  r| jU                  dtW        «       «       y |j                  d7k(  r}dd l,}t[        «       }| j                  d«       | j                  dd8«       | j                  «        | j$                  j'                   |j\                  |d9¬:«      j_                  «       «       y |j                  d;k(  r}dd l,}ta        «       }| j                  d«       | j                  dd8«       | j                  «        | j$                  j'                   |j\                  |d9¬:«      j_                  «       «       y |j                  d<k(  r½dd l,}|j7                  d=d>g«      d   }|j7                  d?d>g«      d   }tc        ||«      }| j                  d«       | j                  dd8«       | j                  d@dA«       | j                  «        | j$                  j'                   |j\                  |d9¬:«      j_                  «       «       y |j                  dBk(  r½dd l,}|j7                  d=d>g«      d   }|j7                  dCd>g«      d   }te        ||«      }| j                  d«       | j                  dd8«       | j                  d@dA«       | j                  «        | j$                  j'                   |j\                  |d9¬:«      j_                  «       «       y |j                  dDk(  r½dd l,}dd l}|j7                  dEd>g«      d   }	 t#        tf        dF«      5 }|j'                  |«       d d d «       dG|dHœ}| j                  d«       | j                  dd8«       | j                  «        | j$                  j'                   |j\                  |d9¬:«      j_                  «       «       y |j                  dJk(  r÷dd l,}ddKl6m7} |j7                  dLdMg«      d   }|j7                  dNdOg«      d   }|j7                  dPdQg«      d   }tq        |j7                  dRdSg«      d   «      } |||||«      }| j                  d«       | j                  dd8«       | j                  d@dA«       | j                  «        | j$                  j'                   |j\                  |d9¬:«      j_                  «       «       y | j                  d«       | j                  «        | j$                  j'                  d«       y # 1 sw Y   y xY w# 1 sw Y   �ŒÍxY w# th        $ r}d9tk        |«      dIœ}Y d }~�Œèd }~ww xY w)TNz/crawler/adminræ   )ú/loginú/logoutrñ   é.  ú
Set-Cookiezsession=; Path=/; Max-Age=0ÚLocationrð   z/static/r   ú/root/gov_crawleréÈ   úContent-Typezapplication/octet-streamzCache-Controlzmax-age=86400Úrbé”  ó   404z/originals/detailz
/originalsú/crawler/project/ú/éÿÿÿÿÚcrawlerrÞ   Ú	anonymousz/detailr   Ú0Úgov)z/znlhz/znlh/Úznlhú/znlh/project/)z/zcú/zc/Úzcú/zc/project/)z/crawlerú	/crawler/)z/eiaú/eia/r   z/eia/project/z/cceupú/contactú/ccpcz/cceup/projects)z/crawler/tempz/crawler/temp/z/crawler/temp/syncú/cceup/project/ú/ccpc/project/z
/dashboardz/api/sourcesz
/api/visitz/preview_mdú/crawler/admin/run-dailyúapplication/json; charset=utf-8F©Úensure_asciiú/crawler/admin/run-statusz/crawler/admin/set-industryÚnamerA   r�   zAccess-Control-Allow-OriginÚ*z/crawler/admin/set-urlrÕ   z/crawler/admin/save-excluder#   ÚwT)Úsuccessr   ©r  Úerrorz/crawler/admin/analysis)Úget_analysis_dataÚperiodÚdayÚmodeÚincrementalÚmetricÚbothr“   Ú90)9ÚurllibÚparseÚurlparser´   Úparse_qsrˆ   Ú_get_session_userrÞ   rP   Úsend_responseÚsend_headerÚend_headersÚhandle_login_pager³   Ú	mimetypesÚisfileÚ
guess_typeÚopenÚwfileÚwriteÚreadÚhandle_originals_detailÚhandle_originals_pageÚ
_log_usagerO   rß   ÚgetattrrØ   Úhandle_db_listÚhandle_db_detailÚhandle_search_pageÚhandle_detailÚhandle_cceup_pageÚhandle_contact_pageÚhandle_cceup_projectsÚhandle_temp_dbÚhandle_temp_syncÚhandle_cceup_project_detailÚhandle_dashboardÚhandle_sources_apiÚhandle_visitÚsend_preview_mdÚsend_response_htmlÚrender_admin_pageÚjsonÚrun_daily_crawlÚdumpsÚencodeÚget_daily_run_statusÚset_crawler_industryÚset_crawler_urlÚADMIN_EXCLUDE_PATHr;   rG   Úcrawler_adminr  Úint)ÚselfÚparsedr�   Ú_osr)  Ú
_file_pathÚ_content_typeÚ_Ú_fÚ_parsed_pathÚ_paramsÚ_pidÚ_idrD  rd   ÚnÚindÚur³   r   ÚfÚer  r  r  r  r“   s                              r   Údo_GETzSearchHandler.do_GET'  s 	  € ä—‘×&Ñ& t§y¡yÓ1ˆä—‘×&Ñ& v§|¡|Ó4ˆð ×.Ñ.Ó0ˆŒà�;‰;×!Ñ!Ð"2Ô3à ŸM™MÒ4¨WˆDŒMà�;‰;Ð/Ñ/à�{‰{˜iÒ'à×"Ñ" 3Ô'à× Ñ  Ð/LÔMà× Ñ  ¨XÔ6à× Ñ Ô"àà×"Ñ" 6Ô*àð �;‰;×!Ñ! *Õ-ç'à,¨v¯{©{Ñ:ˆJà�x‰x�‰˜zÔ*à#,×#7Ñ#7¸
Ó#CÑ �˜qà×"Ñ" 3Ô'à× Ñ  °Ò1\ÐB\Ô]à× Ñ  °/ÔBà× Ñ Ô"ä˜* dÓ+ð 0¨rà—J‘J×$Ñ$ R§W¡W£YÔ/÷0ð ð ×"Ñ" 3Ô'¨×)9Ñ)9Ô);¸T¿Z¹Z×=MÑ=MÈfÔ=Uàð �;‰;×!Ñ!Ð"5Ô6Ø×(Ñ(¨Ô0ØØ�;‰;×!Ñ! ,Ô/Ø×&Ñ& vÔ.Øà�}Š}à×Ñ˜sÔ#à×Ñ˜Z¨Ô2à×ÑÔàð 	�‰˜Ÿ™ VÔ,ð —{‘{ˆàˆà×"Ñ"Ð#6Ô7à×%Ñ% cÓ*¨2Ñ.ˆDä  ¨D´'¸$À
ÈKÓ2XÕYà˜YÒ&¨4°7©?à—+‘+˜d S EÓ*¨1Ñ-ˆCä  ¨¬W°T¸:À{Ó-SÔTð �;‰;Ð-Ñ-à×Ñ ¨Õ/à�[‰[×#Ñ#Ð$4Ô5à×!Ñ! &¨&¯+©+Õ6ð �[‰[˜OÑ+à×Ñ  fÕ-à�[‰[×#Ñ# NÔ3à×!Ñ! $¨¯©Õ4ð �[‰[Ð5Ñ5à×Ñ 	¨6Õ2à�[‰[×#Ñ#Ð$7Ô8à×!Ñ! )¨V¯[©[Õ9ð �[‰[Ð-Ñ-à×Ñ  vÕ.à�[‰[×#Ñ# OÔ4à×!Ñ! %¨¯©Õ5ð �[‰[˜CÒà×#Ñ# FÕ+à�[‰[˜IÒ%à×Ñ˜vÕ&à�[‰[˜HÒ$à×"Ñ" 6Õ*à�[‰[˜JÒ&à×$Ñ$ VÕ,à�[‰[˜GÒ#à×&Ñ& vÕ.à�[‰[Ð-Ò-à×&Ñ& vÕ.ð �[‰[Ð?Ñ?Ø×Ñ Õ'Ø�[‰[Ð0Ò0Ø×!Ñ!Õ#à�[‰[×#Ñ#Ð$5Ô6¸&¿+¹+×:PÑ:PÐQaÔ:bà×,Ñ,¨T¯Y©YÕ7à�[‰[˜LÒ(à×!Ñ!Õ#à�[‰[˜NÒ*à×#Ñ#Õ%à�[‰[˜LÒ(à×Ñ˜fÕ%à�[‰[˜MÒ)à× Ñ Õ"à�[‰[Ð,Ò,à×#Ñ# CÔ):Ó)<Õ=ð �[‰[Ð6Ò6ãä$Ó&ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð7Ò7ãä)Ó+ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð9Ò9ãà—
‘
˜6 B 4Ó(¨Ñ+ˆAØ—*‘*˜Z¨"¨Ó.¨qÑ1ˆCÜ)¨!¨SÓ1ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOØ×ÑÐ:¸CÔ@à×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð4Ò4ÛØ—
‘
˜6 B 4Ó(¨Ñ+ˆAØ—
‘
˜5 2 $Ó'¨Ñ*ˆAÜ$ Q¨Ó*ˆFØ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ×ÑÐ:¸CÔ@Ø×ÑÔØ�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð9Ò9ßØ—z‘z $¨¨Ó-¨aÑ0ˆHð=ÜÔ,¨cÓ2ð &°aØ—G‘G˜HÔ%÷&à%)°xÑ@�ð ×Ñ˜sÔ#Ø×Ñ˜^Ð-NÔOØ×ÑÔØ�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMà�[‰[Ð5Ò5ãå7à—Z‘Z ¨5¨'Ó2°1Ñ5ˆFà—:‘:˜f } oÓ6°qÑ9ˆDà—Z‘Z ¨6¨(Ó3°AÑ6ˆFä�v—z‘z &¨4¨&Ó1°!Ñ4Ó5ˆDá& v¨t°V¸TÓBˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÐ:¸CÔ@à×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMð ×Ñ˜sÔ# T×%5Ñ%5Ô%7¸¿¹×9IÑ9IÈ&Õ9Q÷q0ð ú÷V&ñ &ûô ò =Ø%*´S¸³VÑ<–ûð=ús<   Ç*næ2n, çnçn, înîn)î$n, î,	oî5o	ï	oc           	      ó�	  — | j                  |dd«      j                  «       }t        | j                  |dd«      «      }t        | j                  |dd«      «      }|dz
  |z  }d}t        j                  j                  |«      s^| j                  d	«       | j                  d
d«       | j                  «        | j                  j                  dj                  d«      «       y t        j                  |«      }|j                  «       }g }	d}
|�rt        |«      \  }}g }g }|D ].  }|j!                  d«       |j#                  d|z   dz   gdz  «       Œ0 |D ].  }|j!                  d«       |j#                  d|z   dz   gdz  «       Œ0 |rdj%                  |«      nd}|j'                  d|z   |«      j)                  «       d   }
|j'                  d|z   dz   |||gz   «      j+                  «       }|D ]0  }|	j!                  |d   |d   |d   xs d|d   |d   xs ddœ«       Œ2 d}	 |j'                  d«      j)                  «       d   }|j-                  «        | j                  d	«       | j                  d
d«       | j                  «        d}|dz  }|dz  }|dt/        |«      z   d z   z  }|d!z  }|d"t1        j2                  |«      z   d#z   z  }|d$z  }|�r¸|d%t/        |
«      z   d&z   z  }|	�rœ|d'z  }|	D ]®  }|d(   }d)d*d+d,œj5                  ||«      }d-d.d/d,œj5                  |d«      }|d0z  }|d1t/        |d2   «      z   d3z   t1        j2                  |d4   «      z   d5z   z  }|d6z  }|d7|d8   rt1        j2                  |d8   «      nd9z   d:z   z  }|d;|z   d3z   |z   d:z   z  }|d<z  }Œ° |d=z  }t7        d|
|z   dz
  |z  «      }|dkD  rÊ|d>z  }t9        dt;        |dz   d?«      «      D ]b  }||k(  r|d@t/        |«      z   dAz   z  }Œ|dBt<        j>                  jA                  |«      z   dCz   t/        |«      z   d3z   t/        |«      z   dDz   z  }Œd |dEkD  r7|dFt<        j>                  jA                  |«      z   dCz   t/        |«      z   dGz   z  }|d=z  }n|dHz  }|dIz  }|dJz  }| j                  j                  |j                  d«      «       y #  Y �Œ€xY w)KNrS   rA   r‰   Ú1rŠ   Ú20rM   ú/root/originals.dbrö   zContent-typeútext/html; charset=utf-8z9<html><body><h2>Originals DB not found</h2></body></html>úutf-8r   z2(title LIKE ? OR content LIKE ? OR id_code LIKE ?)r{   é   z@(title NOT LIKE ? AND content NOT LIKE ? AND id_code NOT LIKE ?)r}   z1=0z$SELECT COUNT(*) FROM tsk_data WHERE z?SELECT id, title, id_code, source, content FROM tsk_data WHERE z ORDER BY id LIMIT ? OFFSET ?é   r¬   ©r   r*   Úid_codeÚsourceÚcontentzSELECT COUNT(*) FROM tsk_dataz=<html><head><meta charset=utf-8><title>Originals_Data</title>a   <style>body{font-family:sans-serif;margin:20px;background:#f5f5f5;text-align:center}.sb{margin:20px auto;display:flex;gap:0;justify-content:center;max-width:600px}.sb input{flex:1;padding:12px 20px;border:1px solid #dfe1e5;border-radius:24px 0 0 24px;font-size:16px;outline:none;max-width:500px}.sb input:focus{border-color:#1a73e8}.sb button{padding:12px 24px;background:#1a73e8;color:#fff;border:none;border-radius:0 24px 24px 0;font-size:15px;cursor:pointer}.sb button:hover{background:#1557b0}.results{max-width:800px;margin:0 auto;text-align:left}.result-item{padding:12px 0;border-bottom:1px solid #eee}.result-item h3{font-size:16px;font-weight:400;margin:0 0 2px 0}.result-item h3 a{color:#1a0dab;text-decoration:none}.result-item h3 a:hover{text-decoration:underline}.meta{font-size:12px;color:#70757a;display:flex;gap:12px;align-items:center}.id_code{color:#c00;font-weight:bold}.src{display:inline-block;padding:2px 8px;border-radius:3px;font-size:11px}.src-p{background:#e8f5e9;color:#2e7d32}.src-c{background:#e3f2fd;color:#1565c0}.src-l{background:#fff3e0;color:#e65100}.nav{margin:16px 0}.nav a,.nav strong{margin:0 3px;font-size:14px}.nav a{color:#1a73e8;text-decoration:none}.count{font-size:14px;color:#70757a;margin:8px 0;text-align:center}</style></head><body>u5   <h1 style=text-align:center>ðŸ”� åŽŸå§‹æ•°æ�®åº“</h1>z<p style=color:#666>z* records &middot; Pharma / CPI / Plant</p>z-<form class=sb method=get action=/originals/>z<input type=text name=q value="u)   " placeholder="è¾“å…¥å…³é”®è¯�æ�œç´¢...">u*   <button type=submit>æ�œç´¢</button></form>z<p class=count>u    æ�¡ç»“æžœ</p>z<div class=results>ri  úP PharmaúC CPIúL Plant©ÚpharmaÚcpiÚplantúsrc-púsrc-cúsrc-lz<div class=result-item>z"<h3><a href="/originals/detail?id=r   ú">r*   ú	</a></h3>ú<div class=meta>ú<span class=id_code>rh  r   ú</span>ú<span class="src ú</div></div>ú</div>z<div class=nav>é3   z<strong>z
</strong> z<a href="/originals/?q=ú&page=z</a> é2   z... <a href="/originals/?q=z
">Last</a>u   <p>æ— ç»“æžœ</p>uK   <p style=color:#999;margin-top:30px><a href=/>"U+2190" è¿”å›žä¸»é¡µ</a></p>ú</body></html>)!Ú	get_paramr   rM  r³   r´   rµ   r%  r&  r'  r-  r.  rG  r5   r6   r�   rX   rR   r‡   rb   r8   rƒ   r…   r:   rG   ÚhtmlÚescaperØ   ÚmaxÚrangeÚminr   r!  Úquote)rN  r�   rS   r‰   rŠ   r–   ÚORIGINALS_DBr=   r\   Úresultsr—   r˜   r™   r»   rŸ   r¢   r›   rš   Útotal_countÚhÚscÚslÚsc_clsÚtprW   s                            r   r1  z#SearchHandler.handle_originals_pageY  s|  € Ø�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆÜ�4—>‘> &¨&°#Ó6Ó7ˆÜ˜Ÿ™ v¨{¸DÓAÓBˆ	Ø˜‘(˜iÑ'ˆà+ˆÜ�w‰w�~‰~˜lÔ+Ø×Ñ˜sÔ#Ø×Ñ˜^Ð-GÔHØ×ÑÔØ�J‰J×ÑÐY×aÑaÐbiÓjÔkØä�‰˜|Ó,ˆØ�K‰K‹MˆàˆØˆÚÜ#5°aÓ#8Ñ ˆI�yØˆEØˆFØò 3�Ø—‘ÐQÔRØ—‘˜s Q™w¨™}˜o°Ñ1Õ2ð3ð ò 3�Ø—‘Ð_Ô`Ø—‘˜s Q™w¨™}˜o°Ñ1Õ2ð3ñ ,1�G—L‘L Ô'°eˆEà—I‘IÐDÀuÑLÈfÓU×^Ñ^Ó`ÐabÑcˆEØ—9‘9Ð^ÐafÑfð  jIñ  IØ˜) VÐ,Ñ,ó.ß.6©h«jð ð ò z�Ø—‘ a¨¡d°Q°q±TÀaÈÁdÂjÈbÐ\]Ð^_Ñ\`ÐmnÐopÑmqÒmwÐuwÑxÕyðzð ˆð	ØŸ)™)Ð$CÓD×MÑMÓOÐPQÑRˆKð 	�
‰
Œà×Ñ˜3ÔØ×Ñ˜Ð)CÔDØ×ÑÔàKˆØ	ð  Pñ  	PˆØ	ÐDÑDˆØ	Ð#¤c¨+Ó&6Ñ6Ð9eÑeÑeˆØ	Ð<Ñ<ˆØ	Ð.´·±¸Q³Ñ?ÐBmÑmÑmˆØ	Ð9Ñ9ˆâØÐ"¤S¨£ZÑ/Ð2BÑBÑBˆAÚØÐ*Ñ*�Ø ò 	(�AØ˜8™�BØ#-°GÀIÑN×RÑRÐSUÐWYÓZ�BØ'.°WÀWÑM×QÑQÐRTÐVXÓY�FØÐ2Ñ2�AØÐ=ÄÀAÀdÁGÃÑLÈtÑSÔVZ×VaÑVaÐbcÐdkÑblÓVmÑmÐp{Ñ{Ñ{�AØÐ+Ñ+�AØÐ/ÐPQÐR[ÒP\´4·;±;¸qÀ¹|Ô3LÐbeÑfÐirÑrÑr�AØÐ,¨vÑ5¸Ñ<¸rÑAÀIÑMÑM�AØ˜Ñ'‘Að	(ð �X‘�ä˜˜U YÑ.°Ñ2°yÑ@ÓA�Ø˜’6ØÐ*Ñ*�AÜ" 1¤c¨"¨q©&°"£oÓ6ò A˜Ø š9Ø ¬c°!«fÑ!4°|Ñ!CÑC™AàÐ!:¼V¿\¹\×=OÑ=OÐPQÓ=RÑ!RÐU]Ñ!]Ô`cÐdeÓ`fÑ!fÐimÑ!mÔpsÐtuÓpvÑ!vð  zAñ  "Añ  A™Að	Að
 ˜B’wØÐ:¼V¿\¹\×=OÑ=OÐPQÓ=RÑRÐU]Ñ]Ô`cÐdfÓ`gÑgÐjvÑvÑv˜Ø˜‘M‘AàÐ'Ñ'�à	ÐZÑZˆØ	ÐÑˆØ�
‰
×Ñ˜Ÿ™ 'Ó*Õ+øða	Úús   È#"S  Ó Sc                 óà  — t        | j                  |dd«      «      }d}t        j                  j	                  |«      s| j                  dd«       y t        j                  |«      }|j                  d|f«      j                  «       }|j                  «        |s| j                  dd«       y |d   |d   |d	   xs d
|d   |d   xs d
dœ}|d   }ddddœj                  ||«      }ddddœj                  |d«      }	dt        j                  |d   d d «      z   dz   }
|
dz  }
|
dz  }
|
dz  }
|
dt        j                  |d   «      z   dz   z  }
|
d z  }
|
d!|d"   rt        j                  |d"   «      ndz   d#z   z  }
|
d$|	z   d%z   |z   d#z   z  }
|
d&t        |d   «      z   d#z   z  }
|
d'z  }
|
d(t        j                  |d)   «      j                  d*d+«      z   d'z   z  }
|
d,z  }
| j                  d-|
«       y ).Nr   r   rb  rù   ú	Not foundzCSELECT id, title, id_code, source, content FROM tsk_data WHERE id=?r   rM   rf  rA   re  r¬   rg  ri  rk  rl  rm  rn  rr  rs  rt  r   z'<html><head><meta charset=utf-8><title>r*   éP   ú</title>a  <style>body{font-family:sans-serif;margin:20px;background:#f5f5f5}a{color:#1a73e8}.back{font-size:13px;color:#70757a;margin-bottom:12px;display:block}.card{background:#fff;border-radius:8px;padding:24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08);max-width:780px;margin-left:auto;margin-right:auto}.card h1{font-size:22px;margin-bottom:8px}.meta{font-size:13px;color:#70757a;display:flex;gap:12px;margin-bottom:16px}.id_code{color:#c00;font-weight:bold}.src{display:inline-block;padding:2px 8px;border-radius:3px;font-size:11px}.src-p{background:#e8f5e9;color:#2e7d32}.src-c{background:#e3f2fd;color:#1565c0}.src-l{background:#fff3e0;color:#e65100}.content{font-size:14px;line-height:1.8;color:#333;white-space:pre-wrap;word-break:break-word;overflow-x:auto}</style></head><body>u8   <a class=back href="/originals/">&larr; è¿”å›žåˆ—è¡¨</a>z<div class=card>ú<h1>ú</h1>rw  rx  rh  ry  rz  ru  z
<span>ID: r|  z<div class=content>rj  ú
z<br>ú</div></body></html>rö   )rM  r�  r³   r´   rµ   rB  r5   r6   r8   rƒ   r:   rØ   r‚  rƒ  rG   rH   )rN  r�   r¥   rˆ  r=   Úrowrš   rŒ  r�  rŽ  r‹  s              r   r0  z%SearchHandler.handle_originals_detail¶  s+  € Ü˜Ÿ™ v¨t°SÓ9Ó:ˆ	Ø+ˆÜ�w‰w�~‰~˜lÔ+Ø×#Ñ# C¨Ô5ØÜ�‰˜|Ó,ˆØ�l‰lÐ`ÐclÐbnÓo×xÑxÓzˆØ�
‰
ŒÙØ×#Ñ# C¨Ô5ØØ�q‘6 C¨¡F°s¸1±v²|ÀÈsÐSTÉvÐbeÐfgÑbhÒbnÐlnÑoˆØˆx‰[ˆØ!¨¸	ÑB×FÑFÀrÈ2ÓNˆØ"¨¸ÑA×EÑEÀbÈ#ÓNˆà5¼¿¹ÀAÀgÁJÈsÐPRÀOÓ8TÑTÐWaÑaˆØ	ð  gñ  	gˆØ	ÐGÑGˆØ	ÐÑˆØ	ˆV”d—k‘k ! G¡*Ó-Ñ-°Ñ7Ñ7ˆØ	ÐÑˆØ	Ð#ÀAÀiÂL¤t§{¡{°1°Y±<Ô'@ÐVYÑZÐ]fÑfÑfˆØ	Ð  6Ñ)¨DÑ0°2Ñ5¸	ÑAÑAˆØ	ˆ\œC  $¡›LÑ(¨9Ñ4Ñ4ˆØ	ˆX‰ˆØ	Ð"¤T§[¡[°°9±Ó%>×%FÑ%FÀtÈVÓ%TÑTÐW_Ñ_Ñ_ˆØ	Ð#Ñ#ˆØ×Ñ  QÕ'r
   c                 ó‚
  — d}d}t        | j                  |dd«      «      }d}|dz
  |z  }| j                  |dd«      j                  «       }i }t        j                  j                  |«      r*	 t        |«      5 }	t        j                  |	«      }d	d	d	«       g }
d
}d
}|j                  dd
«      }d	}d
}t        j                  j                  |«      �r]t        j                  j                  |«      }	 t        j                  |«      }|j                  d«       |j                  «       }|rmd|z   dz   }|j                  d|||f«      j                  «       d
   }|j                  d||||f«      j                  «       d
   }|j                  d|||||f«       nZ|j                  d«      j                  «       d
   }|j                  d|f«      j                  «       d
   }|j                  d||f«       |j!                  «       D �cg c]  }|d
   |d   |d   |d   dœ‘Œ }
}|j#                  «        d}|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|d z  }|d!z  }|d"z  }|d#z  }|d$z  }|d%z  }|d&z  }|d'z  }|d(z  }|d)z  }|d*z  }|d+z  }|d,z  }|d-z  }|d.z  }|d/z  }|d0z  }|d1z  }|d2z  }|d3z  }|d4z  }|d5z  }|d6z  }|d7z  }|d8z  }|d9z  }|d:z  }|d;z  }|r|d<t'        |«      z   d=z   z  }�nÔ|d>z  }|rd?nd@}|dAt'        |«      z   d=z   |z   d=z   z  }|dBt'        |«      z   dCz   z  }|j                  dD«      xs dE}|dF|z   dGz   z  }|dHt'        |dIz  «      z   dJz   z  }|d=z  }|j)                  dKdL«      }|dMz  }|dN|z   dOz   z  }|dPz  }|dQz  }|dRz  }|sdSndT}|dU|z   dVz   z  }|d=z  }|r|dW|z   dXz   t'        |«      z   dYz   z  }|
rí|dZz  }|
D ]Y  }|d[t'        |d\   «      z   d]z   z  }|d^   xs dd	d_ }|d`   xs dd	da }|db|z   d]z   z  }|dc|z   d]z   z  }|dd|de   xs dz   dfz   z  }Œ[ |dgz  }t+        d||z   dz
  |z  «      }|dkD  rx|dhz  }t-        d|dz   «      D ]N  }dit'        |«      z   }|r|dj|z   z  }||k(  r|dkt'        |«      z   dlz   z  }Œ5|dm|z   dOz   t'        |«      z   dVz   z  }ŒP |d=z  }n|r|dnz  }n|doz  }|dpz  }|dqt'        |«      z   z  }|drz  }|dsz  }| j/                  da|«       y	# 1 sw Y   �ŒxxY w#  Y �Œ€xY wc c}w # t$        $ r}t'        |«      }Y d	}~�Œ	d	}~ww xY w)tz)Show temp_search.db contents with search.z/root/temp_search.dbz/root/.temp_sync_state.jsonr‰   r`  r§   rM   rS   rA   Nr   Úlast_synced_idzPRAGMA busy_timeout=3000r{   zVSELECT COUNT(*) FROM gov_raw WHERE title LIKE ? OR site_name LIKE ? OR page_url LIKE ?zcSELECT COUNT(*) FROM gov_raw WHERE id > ? AND (title LIKE ? OR site_name LIKE ? OR page_url LIKE ?)z’SELECT id, site_name, title, publish_date FROM gov_raw WHERE title LIKE ? OR site_name LIKE ? OR page_url LIKE ? ORDER BY id DESC LIMIT ? OFFSET ?úSELECT COUNT(*) FROM gov_rawz)SELECT COUNT(*) FROM gov_raw WHERE id > ?zXSELECT id, site_name, title, publish_date FROM gov_raw ORDER BY id DESC LIMIT ? OFFSET ?rf  re  )r   Úsiter*   Údatez(<!DOCTYPE html><html lang="zh-CN"><head>zY<meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">u,   <title>Temp DB - ä¸´æ—¶æ•°æ�®</title><style>z+*{margin:0;padding:0;box-sizing:border-box}zZbody{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f0f2f5;color:#333}z7.container{max-width:1000px;margin:0 auto;padding:20px}zY.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}z(.header h1{font-size:20px;color:#1a1a2e}z?.stats{display:flex;gap:12px;margin-bottom:16px;flex-wrap:wrap}zJ.stat{padding:12px 18px;border-radius:10px;font-size:13px;min-width:120px}z,.stat.blue{background:#e3f0ff;color:#1967d2}z-.stat.green{background:#e6f4ea;color:#137333}z..stat.orange{background:#fef7e0;color:#e37400}z*.stat .num{font-size:20px;font-weight:700}z4.search-bar{display:flex;gap:8px;margin-bottom:16px}zo.search-bar input{flex:1;padding:10px 14px;border:1px solid #dadce0;border-radius:8px;font-size:14px;outline:0}z-.search-bar input:focus{border-color:#1967d2}z.search-bar button{padding:10px 20px;background:#1967d2;color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:14px}z]table{width:100%;border-collapse:collapse;background:#fff;border-radius:10px;overflow:hidden}zTth,td{padding:10px 14px;text-align:left;font-size:13px;border-bottom:1px solid #eee}z1th{background:#f8f9fa;font-weight:600;color:#555}ztr:hover{background:#f8f9ff}zPtd.sn{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}zPtd.tl{max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}zS.paging{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin-top:16px}zx.paging a{padding:6px 14px;border:1px solid #dadce0;border-radius:6px;text-decoration:none;color:#1967d2;font-size:13px}z#.paging a:hover{background:#e8f0fe}zv.paging .cur{padding:6px 14px;border:1px solid #1967d2;border-radius:6px;background:#1967d2;color:#fff;font-size:13px}zg.btn{padding:8px 18px;border:none;border-radius:6px;cursor:pointer;font-size:13px;text-decoration:none}z+.btn.primary{background:#1967d2;color:#fff}zA.btn.outline{border:1px solid #dadce0;background:#fff;color:#333}zIcode{background:#f1f3f4;padding:2px 6px;border-radius:4px;font-size:12px}z/.hint{color:#888;font-size:12px;margin-top:4px}ú</style></head><body>z<div class=container>u'   <div class=header><h1>ðŸ§Š Temp DB</h1>u8   <a href=/crawler/ class=btn.outline>â†� ä¸»åº“</a></div>z<div class=stat.red>r|  z<div class=stats>u   ç»“æžœu	   æ€»è¡Œæ•°z$<div class=stat.blue><div class=num>z&<div class=stat.orange><div class=num>u   </div>å¾…å�Œæ­¥</div>Ú	last_syncõ   â€”z%<div class=stat.green><div class=num>u   </div>ä¸Šæ¬¡å�Œæ­¥</div>z<div class=stat><div class=num>i   u   KB</div>æ–‡ä»¶å¤§å°�</div>rE   rF   z8<form class=search-bar method=get action=/crawler/temp/>uI   <input type=text name=q placeholder=æ�œç´¢æ ‡é¢˜/ç«™ç‚¹/é“¾æŽ¥... value="ru  u/   <button type=submit>ðŸ”� æ�œç´¢</button></form>z3<div style=margin-bottom:12px;display:flex;gap:8px>uB   <a href=/crawler/temp/sync class=btn.primary>ðŸ”„ ç«‹å�³å�Œæ­¥</a>u   ðŸ”„ åˆ·æ–°u   âœ– æ¸…é™¤æ�œç´¢z)<a href=/crawler/temp/ class=btn.outline>ú</a>u   <div class=hint>æ�œç´¢ "u   ", å…± u    æ�¡ç»“æžœ</div>u^   <table><thead><tr><th>ID</th><th>ç«™ç‚¹</th><th>æ ‡é¢˜</th><th>æ—¥æœŸ</th></tr></thead><tbody>z<tr><td>r   z</td>rœ  r’  r*   rö   z<td class=sn>z<td class=tl>z<td>r�  z
</td></tr>z</tbody></table>z<div class=paging>z/crawler/temp/?page=ú&q=z<span class=cur>ry  ú	<a href="u1   <div class=stat.green>æœªæ‰¾åˆ°åŒ¹é…�ç»“æžœ</div>u(   <div class=stat.green>æš‚æ— æ•°æ�®</div>z5<div style=margin-top:20px;font-size:12px;color:#888>z-<code>temp_search.db</code> | last_synced_id=u    | æ¯�æ—¥8:00è‡ªåŠ¨å�Œæ­¥</div>r—  )rM  r�  r   r³   r´   rµ   r,  rD  ÚloadrØ   Úgetsizer5   r6   r8   r�   rƒ   r…   r:   r;   rG   rH   r„  r…  rB  )rN  r�   ÚTEMP_DBÚTRACKING_FILEr‰   r¹   r–   rS   Ú
sync_stater\  r›   r—   Ú	temp_sizeÚlast_syncedr  Ú	un_syncedrº   r\   Úlikerš   r]  r‹  r   Úlast_svÚqsÚclear_labelrœ  r*   Útotal_pagesrW   Úlinks                                  r   r;  zSearchHandler.handle_temp_dbÕ  s5  € à(ˆØ5ˆä�4—>‘> &¨&°#Ó6Ó7ˆØˆØ˜‘(˜cÑ!ˆØ�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆàˆ
Ü�7‰7�>‰>˜-Ô(ðÜ˜-Ó(ð .¨AÜ!%§¡¨1£�J÷.ð
 ˆØˆØˆ	Ø —n‘nÐ%5°qÓ9ˆØˆØˆ	ä�7‰7�>‰>˜'Õ"ÜŸ™Ÿ™¨Ó0ˆIðÜ—_‘_ WÓ-�Ø—
‘
Ð5Ô6Ø—I‘I“K�áØ ™7 S™=�DØŸI™IØpØ˜t TÐ*ó÷ ‘h“j ñ$�Eð !"§	¡	Ø}Ø$ d¨D°$Ð7ó!÷ ‘h“j ñ!$�Ið —I‘Ið mØ˜t T¨3°Ð7õð
 ŸI™IÐ&DÓE×NÑNÓPÐQRÑS�EØ !§	¡	Ð*UÐXcÐWeÓ f× oÑ oÓ qÐrsÑ t�IØ—I‘IØrØ˜f˜ôð
 Z[×YcÑYcÓYeÖfÐTU˜q ™t¨Q¨q©T¸A¸a¹DÈ!ÈAÉ$ÓOÐf�ÐfØ—‘”
ð
 7ˆØ	ÐhÑhˆØ	Ð;Ñ;ˆØ	Ð:Ñ:ˆØ	ÐkÑkˆØ	ÐFÑFˆØ	ÐhÑhˆØ	Ð7Ñ7ˆØ	ÐNÑNˆØ	ÐYÑYˆØ	Ð;Ñ;ˆØ	Ð<Ñ<ˆØ	Ð=Ñ=ˆØ	Ð9Ñ9ˆØ	ÐCÑCˆØ	Ð~Ñ~ˆØ	Ð<Ñ<ˆØ	ð  Oñ  	OˆØ	ÐlÑlˆØ	ÐcÑcˆØ	Ð@Ñ@ˆØ	Ð+Ñ+ˆØ	Ð_Ñ_ˆØ	Ð_Ñ_ˆØ	ÐbÑbˆØ	ð  Hñ  	HˆØ	Ð2Ñ2ˆØ	ð  Fñ  	FˆØ	ÐvÑvˆØ	Ð:Ñ:ˆØ	ÐPÑPˆØ	ÐXÑXˆØ	Ð>Ñ>ˆØ	Ð$Ñ$ˆØ	Ð$Ñ$ˆØ	Ð6Ñ6ˆØ	ÐGÑGˆáØÐ'¬#¨e«*Ñ4°xÑ?Ñ?ŠAàÐ$Ñ$ˆAÙ !‘H {ˆEØÐ7¼#¸e»*ÑDÀxÑOÐRWÑWÐZbÑbÑbˆAØÐ9¼CÀ	»NÑJÐMdÑdÑdˆAØ —n‘n [Ó1Ò:°UˆGØÐ8¸7ÑBÐE_Ñ_Ñ_ˆAØÐ2´S¸ÀdÑ9JÓ5KÑKÐNjÑjÑjˆAØ�‰MˆAð —‘˜3 Ó)ˆBØÐKÑKˆAØÐ]Ð`bÑbÐejÑjÑjˆAØÐBÑBˆAð ÐFÑFˆAØÐUÑUˆAÙ/0™-Ð6HˆKØÐ<¸{ÑJÈVÑSÑSˆAØ�‰MˆAáØÐ/°!Ñ3°iÑ?Ä#ÀeÃ*ÑLÐOaÑaÑa�áØÐuÑu�Øò C�AØ˜¤c¨!¨D©'£lÑ2°WÑ<Ñ<�AØ˜f™IšO¨¨S¨bÐ1�DØ˜w™ZÒ-¨2¨t°Ð4�EØ˜¨4Ñ/°'Ñ9Ñ9�AØ˜¨5Ñ0°7Ñ:Ñ:�AØ˜ 1 V¡9¢?°Ñ3°lÑBÑB‘AðCð Ð'Ñ'�ä! ! e¨c¡k°A¡o¸#Ñ%=Ó>�Ø ’?ØÐ-Ñ-�AÜ" 1 k°A¡oÓ6ò O˜Ø5¼¸A»Ñ>˜ÙØ  E¨A¡IÑ-˜DØ š9ØÐ!3´c¸!³fÑ!<¸yÑ!HÑH™Aà °Ñ!4°uÑ!<¼sÀ1»vÑ!EÈÑ!NÑN™AðOð ˜‘M‘AáØÐLÑL‘AàÐCÑC�Aà	ÐDÑDˆØ	Ð<¼sÀ;Ó?OÑOÑOˆØ	Ð.Ñ.ˆØ	Ð#Ñ#ˆà×Ñ  QÕ'÷g.ñ .ûðÚüòL gøäò Ü˜A›–ûðúsO   Á.T Á9TÂT Ã3DT ÈTÈT ÔTÔ
T ÔTÔT Ô	T>Ô(T9Ô9T>c                 óÂ  — ddl }	  |j                  ddgddd¬«      }|j                  xs d}|j                  xs d}|r|d	|› �z  }|j                  dk7  r|d
|j                  › �z  }| j                  d«       | j                  dd«       | j                  «        | j                  j                  |j                  «       «       y# t
        $ r}d|› �}Y d}~Œpd}~ww xY w)z)Trigger immediate sync from temp to main.r   NÚpython3z/root/sync_temp_to_main.pyTrp   ©Úcapture_outputr   r4   rA   z	
STDERR: z
Exit code: zError: rö   r÷   ztext/plain; charset=utf-8)Ú
subprocessÚrunÚstdoutÚstderrÚ
returncoder;   r%  r&  r'  r-  r.  rG  )rN  r¶  rš   ÚoutputÚerrr]  s         r   r<  zSearchHandler.handle_temp_syncy  sÚ   € ãð		#Ø�
—‘ 	Ð+GÐHÐY]ÐdhÐrtÔuˆAØ—X‘X’^ ˆFØ—(‘(’.˜bˆCÙØ˜J s eÐ,Ñ,�Ø�|‰|˜qÒ Ø˜M¨!¯,©,¨Ð8Ñ8�ð 	×Ñ˜3ÔØ×Ñ˜Ð)DÔEØ×ÑÔØ�
‰
×Ñ˜Ÿ™›Õ)øô ò 	#Ø˜q˜c�]�Fûð	#ús   †A#C Ã	CÃCÃCc                 ó  — t        | j                  j                  dd«      «      }|r,| j                  j	                  |«      j                  dd¬«      nd}t        j                  j                  |«      }t        j                  j                  | j                  «      j                  }|dk(  �r|j                  d«      xs dgd   j                  «       }|t        v r´t        t        j                  «       «      }t!        j"                  t$        «      }|j'                  d	||f«       |j)                  «        |j+                  «        | j-                  d
«       | j/                  dd|› d�«       | j/                  dd«       | j1                  «        y | j-                  d
«       | j/                  dd«       | j1                  «        y |dk(  r}dd l}t5        «       }	| j-                  d«       | j/                  dd«       | j1                  «        | j6                  j9                   |j:                  |	d¬«      j=                  «       «       y |dk(  r}dd l}t?        «       }	| j-                  d«       | j/                  dd«       | j1                  «        | j6                  j9                   |j:                  |	d¬«      j=                  «       «       y | j-                  d«       | j1                  «        | j6                  j9                  d«       y )NúContent-Lengthr   rd  rH   ©ÚerrorsrA   rð   rÞ   z>INSERT OR REPLACE INTO sessions (token, username) VALUES (?,?)rò   ró   úsession=z; Path=/; Max-Age=2592000rô   rü   z/login?error=1r  rö   r÷   r  Fr  r  rù   rú   ) rM  ÚheadersrØ   Úrfiler/  Údecoder   r!  r#  r"  r´   r   ÚALLOWED_USERSrG   ÚuuidÚuuid4r5   r6   rÜ   r8   r9   r:   r%  r&  r'  rD  rE  r-  r.  rF  rG  rH  )
rN  ÚlengthÚbodyr�   r´   rÞ   Útokenrº   rD  rd   s
             r   Údo_POSTzSearchHandler.do_POSTŒ  sZ  € ä�T—\‘\×%Ñ%Ð&6¸Ó:Ó;ˆáLRˆt�z‰z�‰˜vÓ&×-Ñ-¨g¸iÐ-ÔHÐXZˆä—‘×&Ñ& tÓ,ˆä�|‰|×$Ñ$ T§Y¡YÓ/×4Ñ4ˆà�8ÓàŸ
™
 :Ó.Ò6°2°$¸Ñ:×@Ñ@ÓBˆHàœ=Ñ(äœDŸJ™J›LÓ)�ä—_‘_¤ZÓ0�à—
‘
Ð[Ð^cÐemÐ]nÔoà—	‘	”˜RŸX™XœZà×"Ñ" 3Ô'à× Ñ  °¸%¸Ð@YÐ/ZÔ[à× Ñ  ¨SÔ1à× Ñ Õ"ð ×"Ñ" 3Ô'à× Ñ  Ð-=Ô>à× Ñ Õ"àÐ/Ò/ãä$Ó&ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMàÐ0Ò0ãä)Ó+ˆFà×Ñ˜sÔ#à×Ñ˜^Ð-NÔOà×ÑÔà�J‰J×Ñ˜Z˜TŸZ™Z¨¸UÔC×JÑJÓLÕMð ×Ñ˜sÔ# T×%5Ñ%5Ô%7¸¿¹×9IÑ9IÈ&Õ9Qr
   c                 ó:   — |j                  ||g«      }|r|d   S |S )Nr   ©rØ   )rN  r�   r  ÚdefaultÚvalss        r   r�  zSearchHandler.get_paramÖ  s%   € à�z‰z˜$  	Ó*ˆáˆt�A‰wÐ+ GÐ+r
   c                 óÖ  — | j                   j                  dd«      }|j                  d«      D ]¤  }|j                  «       }|j	                  d«      sŒ%|dd  }t        j                  t        «      }	 |j                  d|f«      j                  «       }|r#|j                  d|f«       |j                  «        |r|d   nd 	 |j                  «        c S  y # |j                  «        w xY w)	NÚCookierA   ú;rÁ  é   z+SELECT username FROM sessions WHERE token=?zGUPDATE sessions SET last_seen=datetime("now","localtime") WHERE token=?r   )rÂ  rØ   rO   r   rP   r5   r6   rÜ   r8   rƒ   r9   r:   )rN  ÚcookieÚpartrÊ  rº   r˜  s         r   r$  zSearchHandler._get_session_userÞ  sÍ   € à—‘×!Ñ! (¨BÓ/ˆà—L‘L Ó%ò 	ˆDà—:‘:“<ˆDà�‰˜zÕ*à˜Q˜R˜�ä—_‘_¤ZÓ0�ðàŸ*™*Ð%RÐUZÐT\Ó]×fÑfÓh�CáàŸ
™
Ð#lÐotÐnvÔwàŸ	™	œá%(˜3˜qš6¨dÐ2ð —H‘H—Jð1	ð4 øð —H‘H•Jús   Á2ACÃC(c           	      óì  — | j                   sy | j                  |dd«      }d}|rd}nF|j                  d«      s3|j                  d«      s"|j                  d«      s|j                  d«      rd	}t        j                  t
        «      }	 |j                  d
| j                   |||d d | j                  d   f«       |j                  «        |j                  «        y #  Y ŒxY w# |j                  «        w xY w)NrS   rA   Úviewr   r  rû   r  r  ÚdetailzLINSERT INTO usage_log (username, action, page, query, ip) VALUES (?,?,?,?,?)rö   r   )
rÞ   r�  rP   r5   r6   rÜ   r8   Úclient_addressr9   r:   )rN  r´   r�   rS   Úactionrº   s         r   r2  zSearchHandler._log_usage   sé   € à�}Š}˜fà�N‰N˜6 3¨Ó+ˆàˆá�x‰fà�_‰_Ð.Ô/°4·?±?ÐCVÔ3WÐ[_×[jÑ[jÐkyÔ[zð  C÷  Nñ  Nð  O_ô  `àˆFä�_‰_œZÓ(ˆð
	à�J‰JÐeàŸ™ v¨t°Q°t¸°W¸d×>QÑ>QÐRSÑ>TÐUôWð �I‰IŒKð —‘•øð 	‘ûà—‘•ús   ÂAC ÃCÃC! Ã!C3c                 ót   — d|v }d}|dz  }|dz  }|r|dz  }|dz  }|dz  }|dz  }| j                  d	|«       y )
Nr  u«   <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ç™»å½• - é¡¹ç›®ä¿¡æ�¯æ£€ç´¢</title>a©  <style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f0f2f5;display:flex;justify-content:center;align-items:center;min-height:100vh}.card{background:#fff;border-radius:16px;padding:40px;width:380px;box-shadow:0 4px 24px rgba(0,0,0,.08);text-align:center}h1{font-size:22px;color:#1a1a2e;margin-bottom:8px}.sub{color:#888;font-size:13px;margin-bottom:28px}.inp{width:100%;padding:12px 16px;border:1px solid #ddd;border-radius:10px;font-size:15px;outline:none;transition:border .2s;box-sizing:border-box}.inp:focus{border-color:#4361ee}.btn{width:100%;padding:12px;background:#4361ee;color:#fff;border:none;border-radius:10px;font-size:15px;cursor:pointer;margin-top:16px}.btn:hover{background:#3651d4}.warn{color:#e53935;font-size:13px;margin-top:16px;padding:10px;background:#fff0f0;border-radius:8px}.tip{color:#999;font-size:12px;margin-top:18px}</style></head><body>u]   <div class="card"><h1>ðŸ”� é¡¹ç›®ä¿¡æ�¯æ£€ç´¢</h1><p class="sub">è¯·è¾“å…¥ç”¨æˆ·å��ç™»å½•</p>u9   <div class="warn">ç”¨æˆ·å��æ— æ•ˆï¼Œè¯·é‡�æ–°è¾“å…¥</div>uo   <form method="post" action="/login"><input class="inp" name="username" placeholder="è¾“å…¥ç”¨æˆ·å��" autofocus>u8   <button class="btn" type="submit">ç™»å½•</button></form>uD   <div class="tip">æ•°æ�®æ— ä»· è¯·å‹¿å¤–ä¼ </div></div></body></html>rö   ©rB  )rN  r�   r  r‹  s       r   r(  zSearchHandler.handle_login_page  sn   € à˜6Ð!ˆð zˆà	ð  yñ  	yˆà	ÐlÑlˆá�!ÐRÑR�!à	Ð~Ñ~ˆà	ÐGÑGˆà	ÐSÑSˆà×Ñ  QÕ'r
   c                 ó  — 	 t        dd«      5 }|j                  «       }d d d «       | j                  d«       | j                  dd«       | j                  dt	        t        «      «      «       | j                  «        | j                  j                  |«       y # 1 sw Y   Œ|xY w# t        $ r]}| j                  d«       | j                  «        | j                  j                  t	        |«      j                  «       «       Y d }~y d }~ww xY w)Nz/root/preview_md.htmlrø   rö   r÷   rc  r¾  éô  )r,  r/  r%  r&  rG   rQ   r'  r-  r.  r;   rG  )rN  r\  Údatar]  s       r   rA  zSearchHandler.send_preview_md4  sÖ   € ð	.äÐ-¨tÓ4ð  ¸à—v‘v“x�÷ ð ×Ñ˜sÔ#à×Ñ˜^Ð,FÔGà×ÑÐ-¬c´#°d³)«nÔ=à×ÑÔà�J‰J×Ñ˜TÕ"÷ ð  ûô ò 	.à×Ñ˜sÔ#à×ÑÔà�J‰J×ÑœS ›VŸ]™]›_×-Ñ-ûð	.ús/   ‚B& ŽBŸA:B& ÂB#ÂB& Â&	DÂ/ADÄDc                 ó
  —  |j                   «       }| j                  |«       | j                  dd«       | j                  dt        t	        |«      «      «       | j                  «        | j                  j                  |«       y )Nr÷   rc  r¾  )rG  r%  r&  rG   rQ   r'  r-  r.  )rN  Úcoder‚  Úbs       r   rB  z SearchHandler.send_response_htmlP  se   € àˆD�K‰K‹Mˆà×Ñ˜4Ô à×Ñ˜Ð(BÔCà×ÑÐ)¬#¬c°!«f«+Ô6à×ÑÔà�
‰
×Ñ˜Õr
   c           	      óŠ  ‡*‡K‡L‡M‡N‡O— t        | j                  |dd«      «      }| j                  |dd«      j                  «       ŠM| j                  |dd«      j                  «       ŠN| j                  |dd«      j                  «       ŠO| j                  |dd«      ŠK| j                  |d	d«      ŠLd
}dddddœ}|j                  ||«      }d}|dk(  �rÃdg }	}t        j
                  j                  t        «      �	r=t        «       }
|
j                  «       }|dz   }|dz
  |z  }g }d}	 t        t        «      5 }|j                  «       j                  «       }d d d «       r®|j                  t        d«      t        d«      «      j                  t        d«      «      D �cg c]1  }|j                  «       sŒ|j                  «       j!                  «       ‘Œ3 }}|r6|}g }|D ]  }|j#                  d|z   dz   «       Œ ddj%                  |«      z   }‰M�rlt'        ‰M«      \  }}g }|D ]  }|j#                  |«       Œ |D ]  }|j#                  d|z   «       Œ dj%                  |«      }g }g }‰Nr*|j#                  d«       |j)                  d‰N› d�gdz  «       ‰Or*|j#                  d«       |j)                  d‰O› d�gdz  «       ‰Kr#‰Kdk7  rdddd œ‰K   }|j#                  d!|› d"�«       |rddj%                  |«      z   nd}t+        ‰M«      �rd}|s|t-        d#„ |D «       «      rjt/        ‰Mj                  «       «      dk\  rN|sL	 t1        ‰M«      |z   } |j3                  d$| f«       |j5                  «       d   }|j3                  d%| ||f«       d&}|�sÌ	 t7        «       }!|D ]Z  }"t/        |"«      dk\  sŒ|j3                  d't1        |"«      |z   f«       t7        d(„ |j9                  «       D «       «      }#|!r|!|#z  }!ŒY|#}!Œ\ |!r-d)j%                  d*„ t;        |!«      d d+ D «       «      }$d,|$z   d-z   }%nd}%g }&g }'|D ]9  }|&j#                  d.«       |'j)                  d|z   dz   d|z   dz   d|z   dz   g«       Œ; |D ]9  }|&j#                  d/«       |'j)                  d|z   dz   d|z   dz   d|z   dz   g«       Œ; dj%                  |&«      }(|r|(ddj%                  |«      z   z  }(|'|z  }'|%r|(|%z  }(|j3                  d0|(› �|'«       |j5                  «       d   }|j3                  d1|(› d2�|'||gz   «       �n6	 t1        |«      |z   } |j3                  d$|› �| g|¢­«       |j5                  «       d   }|j3                  d3|› d2�| g|¢|‘|‘­«       nÜg }+g },‰Nr*|+j#                  d6«       |,j)                  d‰N› d�gd7z  «       ‰Or*|+j#                  d6«       |,j)                  d‰O› d�gd7z  «       ‰Kr#‰Kdk7  rdddd œ‰K   }|+j#                  d8|› d"�«       |+rd9dj%                  |+«      z   nd}-|j3                  d:|-› �|,«       |j5                  «       d   }|j3                  d;|-› d<�|,||gz   «       |j9                  «       D �*cg c]  }*tA        |*«      ‘Œ }	}*|r%|	D �*‡*cg c]  Š*tC        ˆ*fd=„|D «       «      rŒ‰*‘Œ }	}*‰LrÜ|dk(  r×dd l"}.	 |.jG                  t        d>«      «      }/tI        |/t:        «      rd?|/i}/tI        |/t:        «      rd@|/i}/i }0|/j                  d?g «      D ]:  }1|1j                  d	d«      }2|2sŒ|1dA   g|1j                  dBg «      z   D ]  }3|2|0|3<   Œ	 Œ< |	D �*cg c])  }*|0j                  |*j                  dCd«      «      ‰Lk(  sŒ(|*‘Œ+ }	}*t/        |	«      }	 t        t        «      5 }|j                  «       j                  «       }d d d «       r³|j                  t        d«      t        d«      «      j                  t        d«      «      D �cg c]1  }|j                  «       sŒ|j                  «       j!                  «       ‘Œ3 }}|r;t/        |	«      }4|	D �*‡*cg c]  Š*tC        ˆ*fdD„|D «       «      rŒ‰*‘Œ }	}*t/        |	«      }t/        |	«      |kD  }|r|	d | }	|
jM                  «        �n¢|dEk(  �r]dg }	}t        j
                  j                  tN        «      �rtt=        jP                  tN        «      }
t<        jR                  |
_*        |
j                  «       }|dz   }|dz
  |z  }‰Mr€t'        ‰M«      \  }}g }|D ]  }|j#                  |«       Œ |D ]  }|j#                  d|z   «       Œ |r8dj%                  |«      }|dz
  |z  }|j3                  dFt1        |«      ||f«       ng }	n|dz
  |z  }|j3                  dG||f«       |j9                  «       D �*cg c]  }*tA        |*«      ‘Œ }	}*|
jM                  «        t/        |	«      |kD  }|rE|	d | }	n?|dHk(  rtV        ntX        }5‰M}6‰Nr|6|6rdndz   ‰Nz   }6‰Or|6|6rdndz   ‰Oz   }6 |5|6||‰K«      \  }}	d}ˆKˆLˆMˆNˆOfdI„}7tZ        dJz   }8dK|z   dLz   }9|9dM|8z   dNz   z  }9|9dOz  }9|9dPz  }9|9dQz  }9|9dRz  }9dSD ]&  \  }:};}<|:|k(  rdTnd}=|9dU|;z   dz   |=z   dVz   |<z   dWz   z  }9Œ( |9dXz  }9|9dY| j\                  z   dZz   z  }9|9dXz  }9|9d[z  }9d\|z   d\z   }>|9d]|>z   d^z   z  }9|9d_t_        ‰M«      z   d^z   z  }9|9d`z  }9dadbdcdddeœ}?|9dfz  }9|9dg|>z   d^z   z  }9d‰Mfd‰Nfd‰OffD ]"  \  }}@|@sŒ	|9dh|z   diz   t_        @«      z   d^z   z  }9Œ$ ‰Lr|9dj‰Lz   d^z   z  }9|9dkz  }9|?ja                  «       D ]%  \  }A}B‰K|Ak(  rdlnd}C|9dmAz   dz   |Cz   dVz   Bz   dnz   z  }9Œ' |9doz  }9|9dpz  }9|9dg|>z   d^z   z  }9d‰Mfd‰Nfd‰OffD ]"  \  }}@|@sŒ	|9dh|z   diz   t_        @«      z   d^z   z  }9Œ$ ‰Kdk7  r|9dq‰Kz   d^z   z  }9|9drz  }9|9dsz  }9tb        D ]+  }2‰L|2dt   k(  rdlnd}D|9dm|2dt   z   dz   |Dz   dVz   |2du   z   dnz   z  }9Œ- |9dvz  }9|9dw|dkD  rdxte        |«      z   dyz   ndz   dzz   te        |«      z   d{z   z  }9|9d|z  }9tg        |	«      D �]ò  \  }EŠ*te        ‰*j                  dt«      xs( ‰*j                  d}«      xs ‰*j                  d~«      xs d«      }Ft_        ‰*j                  dd«      xs* ‰*j                  d€d«      xs ‰*j                  d�d«      xs d«      }G|9d‚z  }9|9dƒte        Edz   «      z   d„z   z  }9|9d…z  }9|9d†|z   d‡z   Fz   d^z   |Gz   dˆz   z  }9|9d‰z  }9|9dŠt_        ‰*j                  d‹d«      xs dŒ«      z   d„z   z  }9t_        ‰*j                  dCd«      xs d«      }H|Hr|9d�Hz   d„z   z  }9‰*j                  dŽ«      r|9d�t_        ‰*dŽ   «      z   d„z   z  }9‰*j                  d�«      r|9dŠt_        ‰*d�   «      z   d„z   z  }9n(‰*j                  d‘«      r|9dŠt_        ‰*d‘   «      z   d„z   z  }9‰*j                  d’«      r<|9dŠt_        ‰*d’   «      z   ‰*j                  d“«      rd\t_        ‰*d“   «      z   ndz   d„z   z  }9|9dXz  }9|9d”z  }9�Œõ |9dXz  }9||kD  rZti        d||z   dz
  |z  «      }Ii }J‰Mr‰MJd<   ‰Nr‰NJd<   ‰Or‰OJd<   ‰Kdk7  r‰KJd<   ‰Lr‰LJd	<   |9| jk                  |Id\|z   d\z   J«      z  }9|9d•z  }9| jm                  d–|9«       y # 1 sw Y   �ŒtxY wc c}w #  Y �ŒÑxY w#  Y �Œ]xY w#  d}%Y �
ŒÉxY w# t<        j>                  $ r} d‰Mz   dz   })|j3                  d4|)|)||f«       d}|j9                  «       D �*cg c]  }*tA        |*«      ‘Œ nc c}*w }	}*|r+|	D �*‡*cg c]  Š*tC        ˆ*fd5„|D «       «      rŒ‰*‘Œ nc c}*w }	}*Y �	Œ*w xY wc c}*w c c}*w c c}*w # tJ        $ r Y �Œw xY w# 1 sw Y   �ŒõxY wc c}w c c}*w #  Y �ŒRxY wc c}*w )—Nr‰   r`  rS   rA   Úq2Úq3r…  rn   r�   r§   õ   ä¸­èƒ½è�”å�ˆõ   ä¸­ç­–å¤§æ•°æ�®ÚEIAõ   EIAé¡¹ç›®åº“)r  r  rþ   r   r   rþ   FrM   iÿ  é,   zNOT "rE   r[   r   r}   z<(r.title LIKE ? OR r.source_url LIKE ? OR r.page_url LIKE ?)r{   re  ro   rp   rq   ru   rv   c              3   ó8   K  — | ]  }t        |«      d k\  –— Œ y­w)re  N)rQ   ©r)   rŸ   s     r   r+   z/SearchHandler.handle_db_list.<locals>.<genexpr>Æ  s   è ø€ Ò*D¸1¬3¨q«6°Q­;Ñ*Dùs   ‚zYSELECT COUNT(*) FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ?z�SELECT r.* FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ? ORDER BY r.publish_date DESC, r.id DESC LIMIT ? OFFSET ?Tz@SELECT rowid FROM gov_search WHERE gov_search MATCH ? LIMIT 5000c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr(   )r)   rš   s     r   r+   z/SearchHandler.handle_db_list.<locals>.<genexpr>×  s   è ø€ Ò2N¸A°1°Qµ4Ñ2Nùó   ‚ú,c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr'   )rG   )r)   Úis     r   r+   z/SearchHandler.handle_db_list.<locals>.<genexpr>Ý  s   è ø€ Ò7aÀ1¼¸A¿Ñ7aùs   ‚éˆ  z AND r.id IN (rm   rz   r|   r~   r   z9 ORDER BY r.publish_date DESC, r.id DESC LIMIT ? OFFSET ?zTSELECT r.* FROM gov_search s JOIN gov_raw r ON s.rowid=r.id WHERE gov_search MATCH ?z‚SELECT COUNT(*) FROM gov_raw r WHERE (r.title LIKE ? OR r.summary LIKE ?) ORDER BY r.publish_date DESC, r.id DESC LIMIT ? OFFSET ?c              3   óº   •K  — | ]R  }|‰j                  d d«      xs dj                  «       v xs& |‰j                  dd«      xs dj                  «       v –— ŒT y­w)r*   rA   rÖ   N©rØ   Úlower©r)   r#   rš   s     €r   r+   z/SearchHandler.handle_db_list.<locals>.<genexpr>
  s˜   øè ø€ ò  Cvð  _aÀ2È!Ï%É%ÐPWÐXZÓJ[ÒJaÐ_a×IhÑIhÓIjÐCjò  DZÐnpÐuv×uzÑuzð  |Gð  HJó  vKò  vQð  OQ÷  uXñ  uXó  uZð  oZó  DZñ  Cvùs   ƒAAz6(title LIKE ? OR source_url LIKE ? OR page_url LIKE ?)r¬   z,(SUBSTR(publish_date,1,10) >= date('now', '-z WHERE r›  zSELECT * FROM gov_rawz5 ORDER BY publish_date DESC, id DESC LIMIT ? OFFSET ?c              3   ó
  •K  — | ]z  }|‰j                  d d«      xs dj                  «       v xsN |‰j                  dd«      xs dj                  «       v xs& |‰j                  dd«      xs dj                  «       v –— Œ| y­w)r*   rA   rÖ   rÓ   Nrô  rö  s     €r   r+   z/SearchHandler.handle_db_list.<locals>.<genexpr>/  s�   øè ø€ ò 7ð ð ˜qŸu™u W¨RÓ0Ò6°B×=Ñ=Ó?Ð?ò FØ !§%¡%¨°BÓ"7Ò"=¸2×!DÑ!DÓ!FÐFòFà !§%¡%¨
°2Ó"6Ò"<¸"×!CÑ!CÓ!EÐEóFñ7ùs   ƒB Bú)/root/gov_crawler/daily_crawl_config.jsonÚcrawlersz
'crawlers'r  Ú
site_namesrÖ   c              3   óZ  •K  — | ]¢  }|‰j                  d d«      xs dj                  «       v xsv |‰j                  dd«      xs dj                  «       v xsN |‰j                  dd«      xs dj                  «       v xs& |‰j                  dd«      xs dj                  «       v –— Œ¤ y­w)r*   rA   rÖ   rj  rÓ   Nrô  rö  s     €r   r+   z/SearchHandler.handle_db_list.<locals>.<genexpr>R  s¶   øè ø€ ò ?ð
 %'ð	 !# q§u¡u¨W°RÓ'8Ò'>¸B×&EÑ&EÓ&GÐ Gò !NØ#%¨!¯%©%°¸BÓ*?Ò*EÀ2×)LÑ)LÓ)NÐ#Nò!Nà#%¨!¯%©%°	¸"Ó*=Ò*CÀ×)JÑ)JÓ)LÐ#Lò!Nð $&¨!¯%©%°
¸2Ó*>Ò*DÀ"×)KÑ)KÓ)MÐ#Mó!Nñ?ùs   ƒB(B+r   zzSELECT p.* FROM projects p JOIN projects_fts f ON p.id = f.rowid WHERE projects_fts MATCH ? ORDER BY rank LIMIT ? OFFSET ?zGSELECT * FROM projects ORDER BY pub_date DESC, id DESC LIMIT ? OFFSET ?r  c                  óô  •— g } ‰r1| j                  dt        j                  j                  ‰«      z   «       ‰r1| j                  dt        j                  j                  ‰«      z   «       ‰r1| j                  dt        j                  j                  ‰«      z   «       ‰dk7  r| j                  d‰z   «       ‰r1| j                  dt        j                  j                  ‰«      z   «       dj	                  | «      S )Nzq=zq2=zq3=rn   zrange=z	industry=rB   )rR   r   r!  r‡  rb   )rT   rŽ   Úindustry_filterrS   rä  rå  s    €€€€€r   Úqp_extraz.SearchHandler.handle_db_list.<locals>.qp_extra¬  s¶   ø€ àˆEá�%—,‘,˜t¤F§L¡L×$6Ñ$6°qÓ$9Ñ9Ô:á�5—<‘< ¤f§l¡l×&8Ñ&8¸Ó&<Ñ <Ô=á�5—<‘< ¤f§l¡l×&8Ñ&8¸Ó&<Ñ <Ô=à˜EÒ! 5§<¡<°¸Ñ0BÔ#CÙ §¡¨[¼¿¹×9KÑ9KÈOÓ9\Ñ-\Ô ]à—8‘8˜E“?Ð"r
   zA

.result-item .dl{font-size:13px;color:#5f6368;margin-top:2px}

úˆ<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>u    - BJIIRé¡¹ç›®åº“</title>z<style>rž  ú<div class="container">ú<div class="nav">ú&<a href="/" class="nav-logo">BJIIR</a>ú<div class="nav-links">©)rþ   r  u   çŽ¯è¯„å…¬ç¤º©r  r  rç  ©Úcceupr
  õ	   ä¸­é¡¹ç½‘©Úcontactr	  u   è�”ç³»äººDB©Ú	originalsz/originals/u   åŽŸå§‹æ•°æ�®ú class="act"r£  rD   r¡  r|  ú<div class="nav-right">õ#    <a href="/logout">é€€å‡º</a></div>ú<div class="search-section">rü   z.<form class="search-box" method="get" action="ru  uV   <input name="q" placeholder="æ�œç´¢é¡¹ç›®ç¼–å�·ã€�å��ç§°ã€�è¡Œä¸šã€�åœ°åŒºâ€¦" value="õ$   <button>æ�œç´¢</button></form></div>õ   å…¨éƒ¨æ—¶é—´õ   è¿‡åŽ»24å°�æ—¶õ   è¿‡åŽ»ä¸€å‘¨õ   è¿‡åŽ»ä¸€ä¸ªæœˆ©rn   rr   rs   rt   ú0<div class="search-tools"><div class="date-bar">z2<form style="display:inline" method="get" action="ú<input type="hidden" name="ú	" value="z,<input type="hidden" name="industry" value="úG<select class="time-select" name="range" onchange="this.form.submit()">ú	 selectedú<option value="ú	</option>ú</select></form></div></div>uE   <span style="margin-left:8px;font-size:13px;color:#333">è¡Œä¸š</span>z)<input type="hidden" name="range" value="z­<select class="industry-select" name="industry" onchange="this.form.submit()" style="margin-left:4px;padding:4px 8px;border:1px solid #ccc;border-radius:4px;font-size:13px">u#   <option value="">å…¨è¡Œä¸š</option>r   Úcnú</select></form>ú<span class="total-count">õ   å…± õ    æ�¡ç»“æžœ Â· õ   ç¬¬ õ    é¡µ</span>z<div class="results">Ú
project_idÚzidÚproject_nameÚowner_companyr*   ú<div class="result-item">ú<span class="num">ry  ú<div style="flex:1">z<h3><a href="/z	/project/rv  ú<div class="meta">ú<span>Úpublish_dateõ   æ—¥æœŸæœªçŸ¥õ   <span class="source">æ�¥æº�ï¼šrŒ   ú<span class="bdg bdg-crawler">Útotal_investmentÚbudgetÚprovinceÚcityr{  ú</div></div></body></html>rö   )7rM  r�  r   rØ   r³   r´   rµ   r7   rk   r�   r,  rK  r/  rH   ÚchrrO   rõ  rR   rb   rX   r‡   r	   rn   rQ   rf   r8   rƒ   r_   r…   Úlistr5   r„   r†   r-   rD  r¤  Ú
isinstancer;   r:   ÚEIA_DB_PATHr6   ri   rj   rÆ   rÏ   Ú	CSS_STYLErÞ   rK   ÚitemsÚ
INDUSTRIESrG   Ú	enumerater„  ÚpaginaterB  )PrN  Údb_typer�   r‰   r¹   Únamesr*   r—   rœ   r›   rº   r\   r•   r–   Ú_exclude_kw_listÚ_exclude_fts_termsÚ_efÚ_exclude_kwr½   Ú_exclude_listÚ_fts_notÚ_kwrU   rV   Ú	fts_partsrŸ   Úfts_qÚextra_partsÚextra_paramsr“   Ú	extra_sqlÚ_fts_okÚ_fts_qÚ_fts_rowidsÚ_tÚ_idsÚ_id_listÚ_where_extrar�   rž   r    r¡   rš   r‘   Ú
sql_paramsÚ	where_sqlÚ_jÚ_cfgÚ_ind_mapÚ_cÚ_indÚ_snÚ_beforeÚ	search_fnÚ
combined_qrþ  ÚCSSr‹  Únav_idÚ	href_pathÚ	nav_labelÚactÚmain_form_actionÚsel_optsÚvÚdvÚdlÚselÚ_selÚidxrÂ   r  Úsnr°  Ú
pag_paramsrŽ   rý  rS   rä  rå  sP                                             `                                @@@@@r   r4  zSearchHandler.handle_db_listd  sþ  ý€ ä�4—>‘> &¨&°#Ó6Ó7ˆà�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà—N‘N 6¨7°EÓ:ˆ	ØŸ.™.¨°¸RÓ@ˆð ˆà&Ð,=ÈÐTbÑcˆà—	‘	˜' 7Ó+ˆàˆà�iÓà" B�dˆHä�w‰w�~‰~œgÕ&ä“X�à—I‘I“K�à  1™W�
à˜q™& #™�ð $&Ð Ø%'Ð"ðÜÔ0Ó1ð 9°SØ&)§h¡h£j×&6Ñ&6Ó&8˜÷9á"ØDO×DWÑDWÔX[Ð\aÓXbÔdgÐhjÓdkÓDl×DrÑDrÔsvÐwyÓszÓD{ö  )J¸qð  @A÷  @Gñ  @Gõ  @I¨¯©«¯©Õ):ð  )J˜ð  )JÙ(Ø/<Ð,Ø')˜HØ'4ò E Ø (§¡°¸#±ÀÑ0CÕ DðEà14°s·x±xÀÓ7IÑ1IÐ.ò
 ä1°!Ó4‘H�C˜à "�Ià ò ,˜à!×(Ñ(¨Õ+ð,ð !ò 2˜à!×(Ñ(¨¨q©Õ1ð2ð $ŸL™L¨Ó3�Eà"$�Kà#%�Láà#×*Ñ*Ð+iÔjà$×+Ñ+¨q°°°A¨Y¨K¸©MÔ:áà#×*Ñ*Ð+iÔjà$×+Ñ+¨q°°°A¨Y¨K¸©MÔ:á  Y°%Ò%7à%&¨A°BÑ7¸	ÑB˜à#×*Ñ*Ð-[Ð\`Ð[aÐaiÐ+jÔkáGR ¨'¯,©,°{Ó*CÒ CÐXZ�Iô (¨Õ*Ø"'˜Ù"¤sÑ*DÀÔ*DÔ'DÌÈQÏWÉWËYËÐ[\ÒI\Ñepð%Ü);¸AÓ)>ÐASÑ)S Ø !§	¡	ð  +Fð  IOð  HQô  !RØ()¯
©
«°Q© Ø !§	¡	ð  +zð  }Cð  EOð  QWð  |Xô  !YØ*. ò  'ð2Ü.1«e Ø*-ò !? BÜ'*¨2£w°!£|Ø()¯	©	Ð2tô  xJð  KMó  xNð  Qcñ  xcð  weô  )fÜ/2Ñ2NÀÇÁÃÔ2NÓ/N¨Ù+6Ø:EÈÑ:L©Kà:>©Kð!?ñ $/Ø/2¯x©xÑ7aÌÈ[ÓHYÐZ_Ð[_ÐH`Ô7aÓ/a HØ3CÀhÑ3NÐQTÑ3T¡Là35 Lð
 *,˜JØ*,˜KØ%(ò b Ø *× 1Ñ 1Ð2nÔ oØ +× 2Ñ 2°C¸!±G¸c±MÀ3ÈÁ7ÈSÁ=ÐRUÐXYÑRYÐ\_ÑR_Ð3`Õ aðbð &)ò b Ø *× 1Ñ 1Ð2|Ô }Ø +× 2Ñ 2°C¸!±G¸c±MÀ3ÈÁ7ÈSÁ=ÐRUÐXYÑRYÐ\_ÑR_Ð3`Õ aðbð *1¯©°jÓ)A˜JÙ*Ø *¨g¸¿¹À[Ó8QÑ.QÑ Q 
Ø +¨|Ñ ; Ù+Ø *¨lÑ : 
ØŸI™IÐ(MÈjÈ\Ð&ZÐ\gÔhØ$%§J¡J£L°¡O˜EØŸI™IÐ(TÐU_ÐT`ð  aZð  '[ð  ]hð  lvð  x~ð  kñ  ]ö  @ðwä%7¸Ó%>ÐASÑ%S˜FØŸI™Ið  )Bð  CLð  BMð  'Nð  QWð  Pgð  Zfñ  Pgô  hØ$%§J¡J£L°¡O˜EØŸI™IÐ(|ð  ~Gð  }Hð  HAð  'Bð  EKð  Doð  NZð  Doð  \fð  Doð  hnñ  Doõ  pð& #%�Kà!#�Jáà#×*Ñ*Ð+cÔdà"×)Ñ)¨Q¨r¨d°!¨9¨+°a©-Ô8áà#×*Ñ*Ð+cÔdà"×)Ñ)¨Q¨r¨d°!¨9¨+°a©-Ô8á  Y°%Ò%7à%&¨A°BÑ7¸	ÑB˜à#×*Ñ*Ð-YÐZ^ÐY_Ð_gÐ+hÔiáIT 	¨G¯L©L¸Ó,EÒ EÐZ\�Ià—I‘IÐ <¸Y¸KÐHÈ*ÔUØŸJ™J›L¨™O�EØ—I‘IÐ 5°i°[Ð@uÐvð  yCð  GQð  SYð  FZñ  yZô  [à)*¯©«Ö6 Aœ˜Q�Ð6�Ð6á#Ø'+÷  !´3ó 7ð #3ô	7õ 4šAð �Dð ñ # w°)Ò';Û%ðØ!Ÿw™w¤tÐ,WÓ'XÓY˜Ü% d¬DÔ1Ø$.°Ð#5˜DÜ% d¬DÔ1Ø$0°$Ð#7˜DØ#%˜Ø"&§(¡(¨:°rÓ":ò 9˜BØ#%§6¡6¨*°bÓ#9˜DÚ#Ø,.¨v©J¨<¸"¿&¹&ÀÈrÓ:RÑ+Rò !9 CØ48 H¨S¢Mñ!9ð9ð
 ,0Öj a°8·<±<ÀÇÁÀkÐRTÓ@UÓ3VÐZiÓ3i¢Ðj˜ÐjÜ # D£	˜ðÜÔ0Ó1ð 9°SØ&)§h¡h£j×&6Ñ&6Ó&8˜÷9á"ØDO×DWÑDWÔX[Ð\aÓXbÔdgÐhjÓdkÓDl×DrÑDrÔsvÐwyÓszÓD{ö  )J¸qð  @A÷  @Gñ  @Gõ  @I¨¯©«¯©Õ):ð  )J˜ð  )JÙ(Ü&)¨$£i˜GØ/3÷ $¨!¼3ó ?ð
 +8ô?õ <¢Að $˜Dð $ô %(¨£I˜Eô ˜t›9 s™?�áà  ˜:�Dà—‘–
à˜Óà" B�dˆHä�w‰w�~‰~œkÕ*ä—_‘_¤[Ó1�ÄGÇKÁK°2´>à—I‘I“K�à  1™W�
à˜q™& #™�áä1°!Ó4‘H�C˜à "�Ià ò ,˜à!×(Ñ(¨Õ+ð,ð !ò 2˜à!×(Ñ(¨¨q©Õ1ð2ñ !à '§¡¨YÓ 7˜à"& q¡&¨#¡˜àŸ	™	ð  #_ô  btð  uzó  b{ð  }Gð  IOð  aPõ  Qð  "™ð # 1™f c™\�Fà—I‘IÐgÐjtÐv|Ði}Ô~à)*¯©«Ö6 Aœ˜Q�Ð6�Ð6¸¿¹¼
ä˜t›9 s™?�áà  ˜:‘Dð (/°&Ò'8�¼iˆIàˆJá 
±Z©cÀRÑ HÈ2Ñ M�:á 
±Z©cÀRÑ HÈ2Ñ M�:á# J°°c¸9ÓE‰KˆE�4ð ˆH÷	#ð 	#ô" ð ñ ˆð Wð  X]ñ  ]ð  ^yñ  yˆà	ˆY˜‰_Ð6Ñ6Ñ6ˆà	Ð&Ñ&ˆð 	
Ð Ñ ˆà	Ð5Ñ5ˆà	Ð&Ñ&ˆð -jò 	DÑ(ˆF�I˜yà$*¨gÒ$5‘.¸2ˆCà�˜YÑ& sÑ*¨3Ñ.¨sÑ2°9Ñ<¸VÑCÑC‰Að		Dð 	
ˆX‰ˆà	Ð& t§}¡}Ñ4Ð5`Ñ`Ñ`ˆà	ˆX‰ˆð 	
Ð+Ñ+ˆà˜w™; s™?Ðà	Ð=Ð>NÑNÈtÑSÑSˆà	ð  Vô  WZð  [\ó  W]ñ  ]ð  ^bñ  bñ  	bˆà	Ð9Ñ9ˆð 6Ð=YÐa{ð  Eeñ  fˆà	Ð?Ñ?ˆà	ÐAÐBRÑRÐSWÑWÑWˆà˜�G˜T "˜I t¨B iÐ0ò 	O‰CˆAˆaâ�!Ð4°QÑ6°{ÑBÄ3ÀqÃ6ÑIÈ$ÑNÑN‘!ð	Oñ ˜AÐ!OÐP_Ñ!_Ð`dÑ!dÑd˜Aà	ÐVÑVˆà—n‘nÓ&ò 	A‰FˆB�à!*¨b¢‘+°bˆCàÐ" 2Ñ% cÑ)¨#Ñ-¨cÑ1°"Ñ4°[Ñ@Ñ@‰Að		Að 	
Ð+Ñ+ˆà	ÐTÑTˆØ	ÐAÐBRÑRÐSWÑWÑWˆØ˜�G˜T "˜I t¨B iÐ0ò 	O‰CˆAˆaÚ�!Ð4°QÑ6°{ÑBÄ3ÀqÃ6ÑIÈ$ÑNÑN‘!ð	Oà˜Ò˜qÐ$OÐPYÑ$YÐZ^Ñ$^Ñ^˜qØ	ð  }ñ  	}ˆØ	Ð2Ñ2ˆÜò 	RˆDØ"1°T¸$±ZÒ"?‘;ÀRˆDØÐ" 4¨¡:Ñ-¨cÑ1°$Ñ6°sÑ:¸4À¹:ÑEÀkÑQÑQ‰Að	Rð 	
ÐÑˆð 	
Ð)ÐglÐopÒgp¨Y¼¸U»Ñ-CÐFcÒ-cÐvxÑyð  }Fñ  Fô  GJð  KOó  GPñ  Pð  Qañ  añ  	aˆð
 	
Ð$Ñ$ˆä “oó  	 ‰FˆC�ä�a—e‘e˜D“kÒN Q§U¡U¨<Ó%8ÒN¸A¿E¹EÀ%»LÒNÈBÓOˆCä�q—u‘u˜^¨BÓ/Òg°1·5±5¸ÈÓ3LÒgÐPQ×PUÑPUÐV]Ð^`ÓPaÒgÐegÓhˆDàÐ,Ñ,ˆAàÐ%¬¨C°©E«
Ñ2°YÑ>Ñ>ˆAàÐ'Ñ'ˆAàÐ! GÑ+¨kÑ9¸CÑ?À$ÑFÈÑMÐP[Ñ[Ñ[ˆAàÐ%Ñ%ˆAà�œC §¡ n°bÓ 9Ò K¸^ÓLÑLÈyÑXÑXˆAÜ�Q—U‘U˜;¨Ó+Ò1¨rÓ2ˆBÙØÐ5¸Ñ:¸YÑFÑF�à�u‰u�WŒ~˜qÐ$DÄSÈÈ7ÉÃ_Ñ$TÐU^Ñ$^Ñ^˜qà�u‰uÐ'Ô(¨!¨x¼¸AÐ>PÑ<QÓ8RÑ/RÐS\Ñ/\Ñ*\©!à—‘�x” ! x´°A°h±KÓ0@Ñ'@ÀÑ'JÑ"J !à�u‰u�ZÔ  ! x´°A°j±MÓ0BÑ'BÐZ[×Z_ÑZ_Ð`fÔZgÀCÌÈAÈfÉIËÒDVÐmoÑ'pÐqzÑ'zÑ"z !à�‰MˆAð �ÑŠAðA 	 ðH 	
ˆX‰ˆà�3Š;Ü˜a %¨#¡+°¡/°cÑ!9Ó:ˆKØˆJÙ A�*˜S‘/Ù b�:˜dÑ#Ù b�:˜dÑ#Ø˜EÒ!¸ :¨gÑ#6Ù¸ 
¨:Ñ 6Ø�—‘˜t [°#°g±+¸c±/À:ÓNÑNˆAà	Ð)Ñ)ˆà×Ñ  QÕ'÷I9ñ 9üò )JøðÚûðl%Ú $ûð(2Ø/1£ûô8  '×7Ñ7ò wð &)¨1¡W¨s¡]˜FàŸI™Ið  'kð  ntð  v|ð  ~Hð  JPð  mQô  RØ$%˜EØ56·Z±Z³\Ö#B°¤D¨¥GÑ#BùÒ#B˜DÐ#Bá/Ø37÷  (w¨a¼só  Cvð  euô  Cvõ  @vªñ  (wùò  (w ð  (wúðwüòZ 7ùòùò.  køä$ò Úðú÷9ñ 9üò )Jùò$øðÚüòn 7s  Ä#{ Ä2{ÅA{ Æ{Æ/ {Ç:{ Ì:A{ Î	{% Î'A<{% ÔA{/ Ù&~Ú~Ú~Ú-A-~ Ü)~ Ý)~Ý.~Ý2~ Þ ~8 Þ~!Þ.A~8 ß6~.à ~.à,~8 á ~3á~3á~8 æ; û{û{ û{û{"û%{,û/A}?ü4}ý}?ý}4ý/}4ý3}?ý>}?þ~ þ	~þ~þ!~+þ&~8 þ8~=c                 ó~  — |j                  d«      d   }t        ||t        | dd«      «       g }d}|r¤	 t        j                  t
        «      }t        j                  |_        |j                  d|t        |«      f«      }|j                  «       d   }|j                  d|t        |«      f«      }|D �	cg c]  }	t        |	«      ‘Œ }}	|j                  «        |dk(  rt        |«      }
dd	i}n»|d
k(  r˜d }
t        j                  j!                  t"        «      rat        j                  t"        «      }t        j                  |_        |j                  d|f«      }|j                  «       }
|j                  «        d
di}|
r*t        |
«      }
n|dk(  rt$        nt&        }dddœ} ||«      }
|j)                  ||«      }|
s| j+                  dd«       y d|z   dz   }|dz  }|d|z   dz   z  }t-        |
j)                  d|
j)                  d|
j)                  dd«      «      «      «      }|d|z   dz   z  }|dkD  r|dt        |«      z   dz   z  }|d z  }|dk(  r?d!D ]9  \  }}|
j)                  |d«      }|sŒ|d"vsŒ |d#|z   d$z   t-        |«      z   d%z   z  }Œ; n>d&D ]9  \  }}|
j)                  |d«      }|sŒ|d"vsŒ |d#|z   d$z   t-        |«      z   d%z   z  }Œ; |d'z  }|dk(  r€|
j)                  d(«      r|d)t-        |
d(   «      z   d%z   z  }|
j)                  d*«      r|d+t-        |
d*   «      z   d%z   z  }|
j)                  d,«      rt-        |
d,   «      }|d-|z   d.z   |z   d/z   z  }|d'z  }|dk(  rüd0D ]4  \  }}|
j)                  |d«      }|sŒ|d1|z   d2z   t-        |«      z   d'z   z  }Œ6 d3D ]4  \  }}|
j)                  |d«      }|sŒ|d1|z   d2z   t-        |«      z   d'z   z  }Œ6 d4D ]4  \  }}|
j)                  |d«      }|sŒ|d1|z   d2z   t-        |«      z   d'z   z  }Œ6 |
j)                  d5«      r|d6t-        |
d5   «      z   d'z   z  }|
j)                  d7«      r�|d8t-        |
d7   «      z   d'z   z  }nx|
j)                  d9«      r|d:t-        |
d9   «      z   d'z   z  }|
j)                  d;«      r|d<t-        |
d;   «      z   d'z   z  }|
j)                  d=«      r|d>t-        |
d=   «      z   d'z   z  }|dk(  r5|
j)                  d?«      r$|d@t/        j.                  |
d?   dAg¬B«      z   d'z   z  }|d
k(  r¿|
j)                  dC«      r|dDt-        |
dC   «      z   d'z   z  }|
j)                  dE«      r|dFt-        |
dE   «      z   d'z   z  }|
j)                  d,«      r)|dGt-        |
d,   «      z   dHz   t-        |
d,   «      z   dIz   z  }|
j)                  d?«      r$|d@t/        j.                  |
d?   dAg¬B«      z   d'z   z  }|
j)                  dJg «      }|�r3|dKz  }|D �]#  }|dLt-        |j)                  dMd«      «      z   dNz   z  }|j)                  dO«      r|dPt-        |dO   «      z   dQz   z  }|j)                  dR«      r|dSt-        |dR   «      z   dQz   z  }|j)                  dT«      r|dUt-        |dT   «      z   dQz   z  }|j)                  dV«      r|dWt-        |dV   «      z   dQz   z  }|j)                  dX«      r|dYt-        |dX   «      z   dQz   z  }|j)                  dZ«      r|dZ   d[vr|d\t-        |dZ   «      z   dQz   z  }|d'z  }�Œ& |d]z  }|d^z  }| j+                  d_|«       y c c}	w #  Y �ŒexY w)`Nrü   rý   rÞ   rÿ   r   rá   z€SELECT DISTINCT username, visited_at FROM project_visits WHERE project_type=? AND project_id=? ORDER BY visited_at DESC LIMIT 20rþ   rè  r   z!SELECT * FROM projects WHERE id=?ré  r  ræ  rç  )r  r  rù   z&<html><body><h1>404</h1></body></html>zE<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>r“  aÛ  <style>body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f5f5f5;color:#333;padding:20px;max-width:1000px;margin:0 auto}a{color:#4361ee}.bk{display:inline-block;margin-bottom:16px}.dh{background:#fff;border-radius:8px;padding:24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08)}.dh h1{font-size:28px;margin-bottom:12px;color:#1a1a2e}.dg{display:grid;grid-template-columns:1fr 1fr;gap:8px 32px;font-size:14px}.lb{color:#888;min-width:90px;flex-shrink:0}.ds{background:#fff;border-radius:8px;padding:20px 24px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.08)}.ds h3{font-size:16px;margin-bottom:10px;padding-bottom:6px;border-bottom:2px solid #4361ee}.ct{font-size:14px;line-height:1.8;color:#444;max-width:100%;overflow-wrap:break-word;word-break:break-word;overflow-x:auto;white-space:pre-line}.ct table{border-collapse:collapse;width:100%;margin:14px 0;font-size:14px}.ct td,.ct th{border:1px solid #ddd;padding:8px 12px;text-align:left;vertical-align:top}.ct tr:nth-child(even){background:#f9f9f9}.ct p{margin:12px 0;line-height:1.8}.ct a{color:#1a73e8;text-decoration:none}.ct img{max-width:100%;height:auto;display:block;margin:8px 0;border-radius:8px}.ds{overflow:hidden}.cc{border:1px solid #e8e8e8;border-radius:8px;padding:16px;margin-bottom:12px;background:#fafafa}.cc .cm{font-size:15px;font-weight:600;margin-bottom:4px}.cc .fd{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;font-size:14px;margin-top:8px}.cl{color:#888}</style></head><body>z<a class="bk" href="/u=   /" onclick="history.back();return false">â†� è¿”å›žåˆ—è¡¨</a>r(  r*   r)  rA   z<div class="dh"><h1>r•  z4<span style="float:right;font-size:13px;color:#888">u    æ¬¡è®¿é—®</span>z<div class="dg">)©u   é¡¹ç›®ç¼–å�·r&  )u   å½“å‰�é˜¶æ®µrŒ   )u   æŠ•èµ„r4  ©u   è¡Œä¸šr�   )u   åŒºåŸŸÚregion©u   çœ�ä»½r5  ©u   åŸŽå¸‚r6  ©õ   å·¥ç¨‹ç±»åž‹Únature)õ   å� åœ°é�¢ç§¯Úarea)u   é‡‡è´­æƒ…å†µÚpurchase_status)u   ç«£å·¥æ—¥æœŸÚcompletion_date)u   æ�ƒé‡�Úweight)u   ä¸šä¸»ç±»åž‹Ú
owner_type©u   å�‘å¸ƒæ—¥æœŸr/  )õ   èµ„é‡‘æƒ…å†µÚfunding_status©õ   ä¸€ä¸€õ   â€”â€”z<div><span class="lb">u   ï¼š</span><span>ú</span></div>)rq  )u   ç‰ˆæœ¬ç±»åž‹Úversion_type)u   å�‘å¸ƒæ—¶é—´r/  ©u   é¡¹ç›®é˜¶æ®µrŒ   )u   å»ºè®¾å‘¨æœŸÚconstruction_period)u	   æ€»æŠ•èµ„r3  )rw  Úproject_type)u   ç”²æ–¹æ€§è´¨Úowner_naturerr  )u   è§„æ¨¡Úscalert  ru  )u   è¯¦ç»†åœ°å�€Údetail_address©u   å»ºç­‘é�¢ç§¯Úbuilding_area©ry  Ú	land_area)u   è£…ä¿®Ú
decoration)u   ç”µæ¢¯Úelevator)u   ç©ºè°ƒÚair_conditioningr{  r/  u2   <div><span class="lb">å�‘å¸ƒæ—¥æœŸï¼š</span><span>r×   u,   <div><span class="lb">æ�¥æº�ï¼š</span><span>rÕ   u;   <div><span class="lb">åŽŸæ–‡é“¾æŽ¥ï¼š</span><span><a href="z!" target="_blank" rel="noopener">z</a></span></div>))u   ä¼�ä¸šå��ç§°r)  )u   æ³¨å†Œåœ°å�€Úregistered_address)u   æ³¨å†Œèµ„é‡‘Úregistered_capital)u   ä¼�ä¸šè´Ÿè´£äººÚcompany_contact)u   ä¸»è�¥ä¸šåŠ¡Úbusiness_scopez<div class="ds"><h3>z</h3><div class="ct">))u   å»ºè®¾èƒŒæ™¯Ú
background)u   å»ºè®¾å†…å®¹Úconstruction_content)u   å·¥è‰ºè·¯çº¿Úprocess_route)u   å»ºè®¾åœ°ç‚¹Úconstruction_location)u   ç¤¾ä¼šæ•ˆç›ŠÚsocial_benefits))u   å·¥è‰ºè®¾å¤‡Úequipment_list)u   é…�å¥—è®¾æ–½è®¾å¤‡Úsupporting_equipment)u   å®¢æˆ·æ‰€éœ€è®¾å¤‡Úclient_needed_equipmentÚproject_progressu5   <div class="ds"><h3>é¡¹ç›®è¿›å±•</h3><div class="ct">rØ  u5   <div class="ds"><h3>ç‰¹æ®Šè¯´æ˜Ž</h3><div class="ct">r™  u5   <div class="ds"><h3>å»ºè®¾å†…å®¹</h3><div class="ct">r�  u5   <div class="ds"><h3>è®¾å¤‡æ¸…å�•</h3><div class="ct">Úschedule_overviewu5   <div class="ds"><h3>å·¥æœŸæ¦‚è¿°</h3><div class="ct">rj  u5   <div class="ds"><h3>æ­£æ–‡å†…å®¹</h3><div class="ct">Úextra©Ú
extensionsÚpub_dateu5   <div class="ds"><h3>å�‘å¸ƒæ—¥æœŸ</h3><div class="ct">rÖ   u5   <div class="ds"><h3>æ�¥æº�ç«™ç‚¹</h3><div class="ct">u>   <div class="ds"><h3>åŽŸæ–‡é“¾æŽ¥</h3><div class="ct"><a href="z" target="_blank">z</a></div></div>rÈ   u(   <div class="ds"><h3>é¡¹ç›®è�”ç³»äºº</h3>z <div class="cc"><div class="cm">Úcompanyz</div><div class="fd">Úcontact_nameu'   <span class="cl">å§“å��ï¼š</span><span>ry  Ú
departmentu'   <span class="cl">éƒ¨é—¨ï¼š</span><span>Úpositionu'   <span class="cl">è�ŒåŠ¡ï¼š</span><span>Úphoneu'   <span class="cl">æ‰‹æœºï¼š</span><span>Úaddressu'   <span class="cl">åœ°å�€ï¼š</span><span>Úremarks©rƒ  r„  rA   u'   <span class="cl">å¤‡æ³¨ï¼š</span><span>r|  r€  rö   )rO   rß   r3  r5   r6   rÜ   ri   rj   r8   rG   rƒ   r†   r:   rÚ   r³   r´   rµ   r;  rÊ   rÑ   rØ   rB  rK   Úmarkdown)rN  rA  r´   rÂ   Úpv_all_visitorsÚpv_totalÚdbtr\   Úc2rš   rW   rB  rº   Ú	detail_fnr*   r‹  Ú	proj_nameÚlblÚkeyrh  Úurl_escrÈ   s                         r   r5  zSearchHandler.handle_db_detailT  sf	  € à�j‰j˜‹o˜bÑ!ˆä˜W c¬7°4¸À[Ó+QÔRàˆàˆáðä—o‘o¤jÓ1�ä")§+¡+�”à—K‘KÐ kà!(¬#¨c«(Ð 3ó5�ð Ÿ:™:›<¨™?�à—[‘[ð  "dà")¬3¨s«8Ð!4ó6�ð 57Ö"7¨q¤4¨¥7Ð"7�Ð"7à—	‘	”ð �iÒä˜sÓ#ˆAà˜uÐ%‰Eà˜ÒàˆAä�w‰w�~‰~œkÔ*ä—_‘_¤[Ó1�ÄGÇKÁK°2´>à—J‘JÐBÀSÀFÓK�à—J‘J“L�à—‘”
à˜>Ð*ˆEá”d˜1“g‘!ð (/°&Ò'8�¼iˆIà*Ð0AÑBˆEá˜#“ˆAà—	‘	˜' 7Ó+ˆáà×#Ñ# CÐ)QÔRÐTZð TÐTYÑYÐZdÑdˆà	ð  kñ  	kˆà	Ð$ wÑ.Ð1pÑpÑpˆô ˜Ÿ™˜n¨a¯e©e°G¸Q¿U¹UÀ?ÐTVÓ=WÓ.XÓYÓZˆ	à	Ð# iÑ/°'Ñ9Ñ9ˆØ�aŠ<ØÐGÌ#ÈhË-ÑWÐZmÑmÑmˆAØ	ÐÑˆð �fÒð fò C‘��Cà—E‘E˜#˜b“M�â˜Ð"5Ò5°qÐ<TÐUXÑ<XÐYkÑ<kÔloÐpqÓlrÑ<rð  tCñ  =Cñ  8C±qñ	Cð Yò C‘��Cà—E‘E˜#˜b“M�â˜Ð"5Ò5°qÐ<TÐUXÑ<XÐYkÑ<kÔloÐpqÓlrÑ<rð  tCñ  =Cñ  8C±qð	Cð 	
ˆ^Ñˆð �iÒà�u‰u�^Ô$àÐIÌ#ÈaÐP^ÑN_ÓJ`Ñ`ÐapÑpÑp�à�u‰u�XŒàÐCÄCÈÈ(ÉÓDTÑTÐUdÑdÑd�à�u‰u�UŒ|ä˜a ™h›-�àÐRÐSZÑZÐ[~Ñ~ð  @Gñ  Gð  H[ñ  [ñ  [�à	ˆ^Ñˆð �fÒð Rò d‘��Cà—E‘E˜#˜b“M�â�aÐ1°#Ñ5Ð6MÑMÌcÐRSËfÑTÐUcÑcÑc‘að	dð Pò d‘��Cà—E‘E˜#˜b“M�â�aÐ1°#Ñ5Ð6MÑMÌcÐRSËfÑTÐUcÑcÑc‘að	dð ^ò d‘��Cà—E‘E˜#˜b“M�â�aÐ1°#Ñ5Ð6MÑMÌcÐRSËfÑTÐUcÑcÑc‘að	dð �u‰uÐ'Ô(¨!Ð/fÔgjÐklÐmñ  lAó  hBñ  0Bð  CQñ  0Qñ  +Q¨!à�u‰u�XŒ Ð%\Ô]`ÐabÐckÑalÓ]mÑ%mÐn|Ñ%|Ñ |¡ð �u‰uÐ+Ô,¨aÐ3jÔknÐopð  rHñ  pIó  lJñ  4Jð  KYñ  4Yñ  /Y¨aà�u‰uÐ%Ô&¨Ð-dÔehÐijÐk{Ñi|Óe}Ñ-}ð  Mñ  .Mñ  )M¨à�u‰uÐ(Ô)¨1Ð0gÔhkÐlmð  oBñ  mCó  iDñ  1Dð  ESñ  1Sñ  ,S¨1ð �iÒ A§E¡E¨)Ô$4àÐHÌ8×K\ÑK\Ð]^Ð_hÑ]iÐw~Ðvô  LAñ  Að  DRñ  Rñ  RˆAð �eÒà�u‰u�ZÔ àÐLÌsÐSTÐU_ÑS`ÓOaÑaÐdrÑrÑr�à�u‰u�[Ô!àÐLÌsÐSTÐU`ÑSaÓObÑbÐesÑsÑs�à�u‰u�UŒ|àÐUÔX[Ð\]Ð^cÑ\dÓXeÑeÐh|Ñ|ô  @Cð  DEð  FKñ  DLó  @Mñ  Mð  Pbñ  bñ  b�à�u‰u�YÔàÐLÌx×O`ÑO`ÐabÐclÑamð  |Cð  {Dô  PEñ  Eð  HVñ  Vñ  V�ð —5‘5˜ BÓ'ˆâàÐ;Ñ;ˆAàó $�àÐ7¼¸A¿E¹EÀ)ÈBÓ<OÓ8PÑPÐQiÑiÑi�à—5‘5˜Ô(¨!Ð/XÔY\Ð]^Ð_mÑ]nÓYoÑ/oÐpyÑ/yÑ*y¨!à—5‘5˜Ô&¨Ð-VÔWZÐ[\Ð]iÑ[jÓWkÑ-kÐluÑ-uÑ(u¨à—5‘5˜Ô$ aÐ+TÔUXÐYZÐ[eÑYfÓUgÑ+gÐhqÑ+qÑ&q aà—5‘5˜”> 1Ð(QÔRUÐVWÐX_ÑV`ÓRaÑ(aÐbkÑ(kÑ#k 1à—5‘5˜Ô# QÐ*SÔTWÐXYÐZcÑXdÓTeÑ*eÐfoÑ*oÑ%o Qà—5‘5˜Ô#¨¨)©Ð<RÑ(RÐTUð  ZCô  DGð  HIð  JSñ  HTó  DUñ  ZUð  V_ñ  Z_ñ  U_ÐTUà�^Ñ#’ð!$ð$ �‰MˆAð 	
ÐÑˆà×Ñ  QÕ'ùòe #8øðâús   ´A?\7 Â3\2Ã\7 Ü2\7 Ü7\<c           	      ój  ‡‡— |dk  r*ddj                  d„ ‰j                  «       D «       «      z   }yˆˆfd„}d}|dkD  r|d ||dz
  «      › d	�z  }dd
d|h}|dkD  r|j                  |dz
  «       t        |dz
  |d
z   «      D ]"  }d|cxk  r|k  sŒn Œ|j                  |«       Œ$ t	        |«      }	d}
|	D ]/  }||
z
  dkD  r|dz  }||k(  rdnd}|d ||«      › d|› d|› d�z  }|}
Œ1 ||k  r|d ||dz   «      › d�z  } |d«      }|j                  dd«      d   dz   }|d|› d|› d|› d�z  }|dz  }|S )z‘Generate Google-style pagination: first/last pages + ellipsis + jump input.

        params is a dict of query params (without 'page').

        rM   ú/?rB   c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­w©ú=N©r   r!  r‡  rG   ©r)   r½   rh  s      r   r+   z)SearchHandler.paginate.<locals>.<genexpr>V	  s6   è ø€ Ò!fÉ$È!ÈQÒde Q C q¬¯©×);Ñ);¼CÀ»FÓ)CÐ(DÔ"EÑ!fùó   ‚
?�2?z[<div class="pagination"><span class="page-btn active" style="cursor:default">1</span></div>c                 óŠ   •— i ‰¥dt        | «      i¥}dj                  d„ |j                  «       D «       «      }|r‰dz   |z   S ‰S )Nr‰   rB   c              3   ó‚   K  — | ]7  \  }}|sŒ	|› d t         j                  j                  t        |«      «      › �–— Œ9 y­wr»  r½  r¾  s      r   r+   z6SearchHandler.paginate.<locals>.url.<locals>.<genexpr>]	  s6   è ø€ ÒbÁ$À!ÀQÒ`a˜Q˜C˜q¤§¡×!3Ñ!3´C¸³FÓ!;Ð <Ô=Ñbùr¿  ú?)rG   rb   r=  )rW   Ú
all_paramsr®  Úbase_urlr�   s      €€r   rÕ   z#SearchHandler.paginate.<locals>.urlY	  sK   ø€ à3˜FÐ3 F¬C°«FÑ3ˆJà—‘ÑbÈ*×JZÑJZÓJ\ÔbÓbˆBá*,�8˜c‘> BÑ&Ð:°(Ð:r
   z<div class="pagination">r£  u$   " class="page-btn">â€¹ ä¸Šä¸€é¡µ</a>rf  re  r   u&   <span class="page-ellipsis">â€¦</span>z activerA   z" class="page-btnru  r¡  u$   " class="page-btn">ä¸‹ä¸€é¡µ â€º</a>zpage=z:<span class="page-jump"><input type="number" min="1" max="r  z" onchange="location.href='u   '+this.value"> é¡µ</span>r|  )rb   r=  Úaddr…  ÚsortedÚrsplit)rN  r‰   r°  rÄ  r�   rÕ   r‚  Ú	pages_setrñ  Úsorted_pagesÚlastrW   ÚactiveÚjump_urlÚ	jump_bases      ``          r   r@  zSearchHandler.paginateL	  sÁ  ù€ ð ˜!Òà˜Ÿ™Ñ!fÐRX×R^ÑR^ÓR`Ô!fÓfÑfˆCØpõ	;ð *ˆà�!Š8à�i¡ D¨¡F£˜}Ð,PÐQÑQˆDà˜˜1˜kÐ*ˆ	à˜Š?à�M‰M˜+¨™/Ô*ä�t˜A‘v˜t A™vÓ&ò 	!ˆAà�AÔ$˜Ö$à—‘˜aÕ ð		!ô ˜iÓ(ˆàˆàò 
	ˆAà�4‰x˜!Š|àÐ@Ñ@�à"# t¢)‘Y°ˆFà�i¡ A£˜xÐ'8¸¸ÀÀ1À#ÀTÐJÑJˆDà‰Dð
	ð �+Òà�i¡ D¨¡F£˜}Ð,PÐQÑQˆDñ �q“6ˆà—O‘O G¨QÓ/°Ñ2°WÑ<ˆ	àÐLÈ[ÈMÐYbÐcgÐbhð  iEð  FOð  EPð  Pjð  kñ  	kˆà�Ñˆàˆr
   c                 ó†  — | j                  |d«      }| j                  |dd«      j                  «       }| j                  |dd«      j                  «       }| j                  |dd«      }| j                  |dd«      }| j                  |dd«      }| j                  |d	d
«      }| j                  |dd«      }	|	t        vr|	dk7  rd}	t        | j                  |dd«      «      }
t        | j                  |dd«      «      }|dvrd}|dvrd}|}|r||rdndz   |z   }|r||rdndz   |z   }|�rX|dk(  rõt        t
        t        dœ}|r||v r ||   ||
|||	«      \  }}n|g }dt        fdt
        fdt        ffD ]1  \  }} ||dd||	«      \  }}|D ]  }||d<   Œ	 |j                  |«       Œ3 |j                  d„ d¬«       t        |«      }|
dz
  |z  }||||z    }t        d||z   dz
  |z  «      }|
dz
  |z  }| j                  |||d|
|||||||||	«      }| j                  d |«       y |}|s|d
k7  rt        ||
|||d ||	«      \  }}}ng d!d}}}|
dz
  |z  }| j                  |||||
||||||||	«      }| j                  d |«       y g }|s|d
k7  �rt        |dd dd d ||	«      \  }}}|D ]G  }d"|d<   |j                  d«      r|d   d#k(  rt!        |j                  d$d«      «      |d%<   Œ@|d   |d%<   ŒI |j                  |«       t	        |dd ||	«      \  }}|D ]%  }d|d<   t!        |j                  d&d«      «      |d%<   Œ' |j                  |«       t        |dd ||	«      \  }} | D ]%  }d|d<   t!        |j                  d&d«      «      |d%<   Œ' |j                  | «       |	r)|	d
k7  r$|D �cg c]  }|j                  d%«      |	k(  sŒ|‘Œ }}|j                  d'„ d¬«       t        |«      |kD  }|
dz
  |z  }||||z    }|s|d!kD  r	d}
d!}|d | }| j                  ||t        |«      ||
||dd|||||	«      }| j                  d |«       y c c}w )(NrS   rä  rA   rå  r‹   ry   Útagrc   r…  rn   r�   r‰   r`  rŠ   ra  )r2   r§   r  éd   r§   )rw   ry   Údate_ascr[   r?   )r  ræ  rç  r  ræ  rç  rM   i'  Ú_sourcec                 ó.   — | j                  dd«      xs dS ©Nr/  rA   rÍ  ©Úxs    r   ú<lambda>z2SearchHandler.handle_search_page.<locals>.<lambda>×	  s   € °·±°nÀRÓ0HÒ0NÈB€ r
   T)r¶  ÚreverseFrö   r   rè  r%   r*   Ú	_industryr(  c                 ó.   — | j                  dd«      xs dS rÔ  rÍ  rÕ  s    r   r×  z2SearchHandler.handle_search_page.<locals>.<lambda>1
  s   €  A§E¡E¨.¸Ó$<Ò$BÀ€ r
   )r�  r   r·   rM  r¿   rÆ   rÏ   r‡   r‹   rQ   r„  Úrender_main_pagerB  r   Úrender_gov_pagerØ   r0   )!rN  r�   rS   rä  rå  r‹   rÏ  rc   rŽ   r�   r‰   rŠ   r`  Úsub_sourcesr—   r›   Úall_rowsÚsrc_namer_  rŸ   rš   Úrrr–   r°  Ú	html_pagerŒ   r‰  rœ   Úgov_resultsÚ	gov_totalrS  Ú
cceup_rowsÚzc_rowss!                                    r   r6  z SearchHandler.handle_search_page—	  sr  € à�N‰N˜6 3Ó'ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�~‰~˜f f¨kÓ:ˆà�n‰n˜V U¨BÓ/ˆà�n‰n˜V U¨BÓ/ˆà—N‘N 6¨7°EÓ:ˆ	à—>‘> &¨*°bÓ9ˆàœ<Ñ'¨H¸ªNÀr¸Hä�4—>‘> &¨&°#Ó6Ó7ˆä˜Ÿ™ v¨{¸DÓAÓBˆ	àÐ-Ñ-¸2¨yàÐ=Ñ=Àk¸tð ˆ
á˜J±©#ÀÑDÀrÑIˆzá˜J±©#ÀÑDÀrÑIˆzò à�nÒ$ä,8Ì+ÔjsÑt�á˜3 +Ñ-à"2 +¨cÑ"2°:¸tÀYÐPYÐ[cÓ"d‘K�E™4ð  "�Hà1<¼lÐ0KÈnÔ^iÐMjÐm~ô  AJð  mKð  0Lò +Ñ+˜ )á(¨°Q¸¸yÈ(ÓS™˜˜1à"#ò 5˜Bà,4˜B˜yšMð5ð !Ÿ™¨Õ*ð+ð —M‘MÑ&NÐX\�MÔ]ä ›M�Eà" Q™h¨)Ñ3�Fà# F¨6°)Ñ+;Ð<�Dä! ! e¨iÑ&7¸!Ñ&;À	Ñ%IÓJ�à ™( iÑ/�à ×1Ñ1°!°T¸5À%ÈÈyÐZ^Ð`cÐehÐjpÐr{Ð}ð  BDð  FNó  O�	à×'Ñ'¨¨YÔ7àð ˆEá˜Y¨%Ò/ä+1°*¸dÀIÈtÐUZÐ\`ÐbkÐmuÓ+vÑ(�˜¡ð ,.¨q°% ˜�à˜Q‘h )Ñ+ˆFà×,Ñ,¨Q°¸ÀÈ$ÐPYÐ[_ÐadÐflÐnwÐy{Ð}ð  BJó  KˆIà×#Ñ# C¨Ô3àð ˆá˜ eÓ+ô )/¨z¸1¸cÀ;ÐPTÐVZÐ\eÐgoÓ(pÑ%ˆK˜ Aà!ò 5�à %��9‘ð —v‘v˜jÔ)¨R°
©^¸wÒ-FÜ&7¸¿¹¸wÀrÓ8JÓ&K�B�{’Oà&(¨¡n�B�{’Oð5ð �O‰O˜KÔ(ô )¨°Q¸¸YÈÓQ‰MˆAˆzà ò O�à +��9‘ä"3°B·F±F¸>È"Ó4MÓ"N��;’ð	Oð �O‰O˜JÔ'ô # :¨q°#°yÀ(ÓK‰JˆAˆwàò O�à 1��9‘ä"3°B·F±F¸>È"Ó4MÓ"N��;’ð	Oð �O‰O˜GÔ$ñ ˜ EÒ)Ø#+ÖN˜a¨q¯u©u°[Ó/AÀXÓ/MšÐNˆHÐNà�‰ÑBÈDˆÔQä�x“= 9Ñ,ˆà˜‘(˜iÑ'ˆà˜˜v iÑ/Ð0ˆá˜ š
ð ˆDàˆFà˜J˜YÐ'ˆDà×)Ñ)¨!¨T´3°x³=À(ÈDÐR[Ð]aÐceÐgiÐkqÐs|ð  Að  CEð  GOó  Pˆ	à×Ñ  YÕ/ùò- Os   Î"P>Î<P>c                 óz  ‡‡‡‡‡‡
‡‡‡‡(— ˆ
ˆˆˆˆˆˆˆˆf	d„}d}t        |«      D �]‡  \  }}|j                  d«      rdt        |j                  dd«      «      › d�nd}t        |j                  dd«      xs |j                  dd«      xs d«      }|j                  d«      r+d	j                  d
„ |j                  d«      xs g D «       «      nd}|dz  }|d|	|z   dz   › d�z  }|d|j                  dd«      › dt        |j                  dd«      «      › d�z  }|d|z   z  }|r	|d|› d�z  }|dt        |j                  dd«      xs d«      › d�z  }t        |j                  dd«      xs d«      }|r|d|z   dz   z  }|dt	        |j                  dd«      «      › d�z  }|d|› d�z  }|dz  }�ŒŠ |s‰rd }n|s‰sd!}‰
d"k(  rd#nd}‰
d$k(  rd#nd}‰
d%k(  rd#nd}‰
d&k(  rd#nd}d'd(d)d*d+œ}d,}|j                  «       D ]%  \  }}‰
|k(  rd#nd}|d-|z   d.z   |z   d/z   |z   d0z   z  }Œ' |d1z  }‰‰‰xs d‰
‰‰d2œŠ(‰r‰‰(d3<   |dkD  rt        d|‰z   dz
  ‰z  «      nd}| j                  ‰|d4‰(«      } ˆ(fd5„}!d6}"|"d |!d«      › d7‰sd8nd› d9�z  }"t        D ]$  \  }#}$}%‰|#k(  }&|"d |!|#«      › d7|&rd8nd› d|$› d:�z  }"Œ& |"d |!d;«      › d7‰d;k(  rd8nd› d<�z  }"|"dz  }"t        d=z   }'d>‰rt        ‰«      nd?z   d@z   |'z   dAz   | j                  z   dBz   t        ‰«      z   dCz   |z   dDz   t        |«      z   dEz   |"z   dFz   |z   dGz   | z   dHz   S )INc           
      ó*  •	— ‰
‰‰	‰‰xs d‰t        ‰«      t        ‰«      dœ}‰r‰|d<   |j                  | j                  «       D ��ci c]  \  }}|sŒ	|t        |«      “Œ c}}«       dj                  d„ |j                  «       D «       «      S c c}}w )NrA   )rS   rä  rå  r‹   rÏ  r…  r‰   rŠ   r�   rB   c              3   óp   K  — | ].  \  }}|sŒ	|› d t         j                  j                  |«      › �–— Œ0 y­wr»  ©r   r!  r‡  r¾  s      r   r+   zESearchHandler.render_gov_page.<locals>.link_params.<locals>.<genexpr>Q
  ó2   è ø€ ÒV¹t¸qÀ!ÒTU˜q˜c ¤6§<¡<×#5Ñ#5°aÓ#8Ð"9Ô:ÑVùó   ‚
6�)6©rG   Úupdater=  rb   )Ú	overridesrW   r½   rh  rŽ   r�   r‰   rŠ   rä  rå  rˆ   r‹   rÏ  s       €€€€€€€€€r   Úlink_paramsz2SearchHandler.render_gov_page.<locals>.link_paramsI
  s“   ø€ à 2¨R¸ÀcÂiÈRÐZcÔmpÐquÓmvô  FIð  JSó  FTñ  UˆAá¨˜˜:™à�H‰H¨I¯O©OÓ,=×C¡D A qÂ�aœ˜Q›‘iÓCÔDà—8‘8ÑVÀqÇwÁwÃyÔVÓVÐVùó Ds   Á
B
ÁB
rA   r�   ú<span class="cat-badge">ry  rÓ   rÔ   Útagsu    Â· c              3   óh   K  — | ]*  }t         j                  |i «      j                  d |«      –— Œ, y­w)r   N)r‚   rØ   rì  s     r   r+   z0SearchHandler.render_gov_page.<locals>.<genexpr>]
  s(   è ø€ Ò#fÈ1¤I§M¡M°!°BÓ$7×$;Ñ$;¸GÀA×$FÑ#fùs   ‚02r*  z<span class="result-num">rM   z<h3><a href="/detail?id=r   r   ru  r*   rv  r-  z<span class="tags">z<span class="date">r/  r0  rÖ   r1  u   <span class="invest">ðŸ’° Úsummaryr£  u5   " class="source-link" target="_blank">ðŸ”— åŽŸæ–‡</a>r|  u;   <div class="no-results">ðŸ˜• æ²¡æœ‰æ‰¾åˆ°ç›¸å…³ç»“æžœ</div>u9   <div class="no-results">è¾“å…¥å…³é”®è¯�å¼€å§‹æ�œç´¢</div>rn   r  rr   rs   rt   r  r  r  r  r  ú‹<form style="display:inline" id="tf" action="/"><select class="time-select" name="range" onchange="document.getElementById('tf').submit()">r  rE   rD   r  r   ©rS   r‹   rÏ  r…  rä  rå  r�   rü   c           	      óÜ   •— t        ‰«      }| r| |d<   nd|v r|d= d|d<   dt        j                  j                  |j	                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}«      z   S c c}}w ©Nr�   r`  r‰   r¹  ©r†   r   r!  Ú	urlencoder=  ©r.   rW   r½   rh  Úparams_dicts       €r   Úind_chip_urlz3SearchHandler.render_gov_page.<locals>.ind_chip_urlž
  óg   ø€ Ü�[Ó!ˆAÙ v�q˜’}Ø˜q‘ a¨
 mØˆAˆf‰IØœ&Ÿ,™,×0Ñ0À1Ç7Á7Ã9×1R¹4¸1¸aÒPQ°!°Q±$Ó1RÓSÑSÐSùÓ1Ró   Á
A(ÁA(ú/<div class="db-tabs" style="margin-bottom:8px">ú	" class="re  õ   ">å…¨éƒ¨è¡Œä¸š</a>r¡  r%   õ   ">å…¶ä»–</a>aÀ  

.pagination{text-align:center;margin:20px 0;display:flex;justify-content:center;gap:4px;flex-wrap:wrap}.page-btn{display:inline-block;padding:8px 14px;background:#fff;border:1px solid #dadce0;border-radius:6px;font-size:14px;color:#1a73e8;text-decoration:none;transition:all .15s}.page-btn:hover{background:#e8f0fe;border-color:#1a73e8}.page-btn.active{background:#1a73e8;color:#fff;border-color:#1a73e8}.page-ellipsis{padding:8px 4px;color:#999}.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:8px}.page-jump input{width:50px;padding:4px 6px;border:1px solid #dadce0;border-radius:4px;text-align:center;font-size:13px}
.meta .source{color:#0d652d;font-size:12px;margin-left:8px}

zœ<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>u   é¡¹ç›®ä¿¡æ�¯æ£€ç´¢z</title>
    <style>u9  </style>
</head>
<body>
    <div class="container">
        <div class="nav">

            <a href="/" class="nav-logo">BJIIR</a>

            <div class="nav-links">

                <a href="/crawler/" class="act">çŽ¯è¯„å…¬ç¤º</a>

                <a href="/zc/">ä¸­ç­–å¤§æ•°æ�®</a>

                <a href="/ccpc">ä¸­é¡¹ç½‘</a>

                <a href="/contact">è�”ç³»äººDB</a>
                <a href="/originals/">åŽŸå§‹æ•°æ�®</a>

                <a href="/originals/">åŽŸå§‹æ•°æ�®</a>

            </div>

            <div class="nav-right">

                u   

                <a href="/logout">é€€å‡º</a>

            </div>

        </div>

        <div class="search-section">
            <form action="/" method="get" class="search-box">
                <input type="text" name="q" placeholder="æ�œç´¢é¡¹ç›®å…³é”®è¯�ã€�æ ‡é¢˜ã€�URL..." value="u«   " autofocus>
                <button type="submit">æ�œç´¢</button>
            </form>
        </div>
        <div class="search-tools">
            <div class="date-bar">uŠ   </div>
        </div>
        
        <div class="toolbar"><div class="controls">
            
            <span class="total-count">å…± u0    æ�¡ç»“æžœ</span>
        </div></div>

        ú

        <div class="results">z</div>
        z
    </div>
</body>
</html>)r?  rØ   rK   rb   r   r=  r„  r@  r,   r<  rÞ   rG   ))rN  rˆ   r‰  r—   rœ   r‰   rŠ   r‹   rÏ  r–   rŽ   rä  rå  r�   rï  Úresult_rowsrm  rš   Ú	cat_badgeÚsrc_urlÚ	tags_htmlrÖ   Úsel_allÚsel_1dÚsel_7dÚsel_30drg  Údate_barri  rj  rk  r°  Ú
paginationrü  Úrefine_htmlr.   r   r/   Úis_actra  rû  s)    `   ```` ````                          @r   rÜ  zSearchHandler.render_gov_pageG
  s  ÿù€ ÷	Wô 	Wð ˆä Ó(ó 	$‰FˆC�àYZ×Y^ÑY^Ð_iÔYjÐ2´3°q·u±u¸ZÈÓ7KÓ3LÐ2MÈWÑUÐprˆIä˜!Ÿ%™% 
¨2Ó.ÒN°!·%±%¸ÀRÓ2HÒNÈBÓOˆGàjk×joÑjoÐpvÔjw˜Ÿ™Ñ#fÐQR×QVÑQVÐW]ÓQ^ÒQdÐbdÔ#fÔfÐ}ˆIàÐ6Ñ6ˆKàÐ6°vÀ±|ÀaÑ7GÐ6HÈÐPÑPˆKàÐ5°a·e±e¸DÀ³m°_ÀBÄsÈ1Ï5É5ÐQXÐY[ÓK\ÓG]ÐF^Ð^gÐhÑhˆKàÐ/°)Ñ;Ñ;ˆKñ ˜+Ð+>¸y¸kÈÐ)QÑQ˜+àÐ0´°Q·U±U¸>È"Ó5MÒ5_ÐQ_Ó1`Ð0aÐahÐiÑiˆKÜ˜AŸE™E +¨bÓ1Ò7°RÓ8ˆIÙØÐ!?À9ÑLÈyÑXÑX�àÐ=Ô>PÐQR×QVÑQVÐW`ÐacÓQdÓ>eÐ=fÐfmÐnÑnˆKà˜Y w iÐ/pÐqÑqˆKà˜8Ñ#ŠKð9	$ñ> ™5ð  1L¡+á¡ð  7M¨ð "+¨eÒ!3‘+¸ˆà )¨TÒ 1‘°rˆà )¨TÒ 1‘°rˆà!*¨eÒ!3‘+¸ˆà)Ð1AÈÐ`qÑrˆð cˆà—n‘nÓ&ò 	H‰FˆB�à!*¨b¢‘+°bˆCàÐ)¨"Ñ,¨SÑ0°Ñ4°SÑ8¸Ñ;¸KÑGÑG‰Hð		Hð 	Ð&Ñ&ˆð "¨4¸º	¸rÈIÐ]_ÐgiÑjˆá¨x�[ Ñ,ð GLÈaÂi”c˜!˜e iÑ/°!Ñ3¸	ÑAÔBÐUVˆØ—]‘] 4¨°c¸;ÓGˆ
ô
	Tð HˆØ˜¡<°Ó#3Ð"4°IÉ8¹eÐY[Ð=\Ð\nÐoÑoˆÜ"0ò 	mÑˆF�E˜3Ø Ñ'ˆFØ˜Y¡|°FÓ';Ð&<¸IÉvÁeÐ[]ÐE^Ð^`ÐafÐ`gÐgkÐlÑl‰Kð	mð 	˜¡<°Ó#8Ð"9¸ÈHÐX_ÒL_Á5ÐegÐBhÐhtÐuÑuˆØ�xÑˆô ð ñ ˆð wñ  INô  {~ð  Dô  {Eð  Tzñ  {ð  ~Yñ  Yð  \_ñ  _ð bñ ð* —m‘mñ+$ð*'sñ+sô: vyð  zó  v@ñ;@ð: Cñ;ð: BJñ;Jð: Mb	ñ;b	ô: e	h	ð  i	n	ó  e	o	ñ;o	ð:r	ñ;ð> ñ?ð>!ñ?!!ðB $/ñC!/ðB 2HñC!HðB KUñC!UðBX ñC" ð "	 r
   c                 ó   ‡‡‡‡‡‡	‡‡‡‡‡&— ˆˆˆˆˆˆˆˆˆ	ˆf
d„}d}t        |«      D �]’  \  }}|j                  dd«      }|j                  d«      xs( |j                  d«      xs |j                  d«      xs d}t        |j                  dd«      xs* |j                  dd«      xs |j                  d	d«      xs d«      }|d
z  }|d|
|z   dz   › d�z  }|dk(  rd|› �}n|dk(  rd|› �}nd|› �}|d|› d|› d�z  }|dz  }|r|dt        |«      › d�z  }|j                  d«      r|dt        t        |d   «      «      › d�z  }|j                  d«      r9|dt        |d   «      › |j                  d«      rdt        |d   «      z   nd› d�z  }|dt        |j                  dd«      xs d «      › d�z  }|d!z  }�Œ• |sd"}d#d$d%d&d'œ}d(}|j	                  «       D ]  \  }}‰|k(  rd)nd}|d*|› d+|› d,|› d-�z  }Œ |d.z  }‰‰‰xs d‰‰‰d/œŠ&‰r‰‰&d0<   |d1kD  rt        d|‰z   dz
  ‰z  «      nd}| j                  ‰|d‰&«      }ˆ&fd2„}d3}|d4 |d«      › d5‰sd6nd› d7�z  }t        D ]$  \  } }!}"‰| k(  }#|d4 || «      › d5|#rd6nd› d|!› d8�z  }Œ& |d4 |d9«      › d5‰d9k(  rd6nd› d:�z  }|d;z  }t        d<z   }$‰ xr ‰ xr ‰ }%|%rd=|$› d>| j                  › d?�S d@t        ‰«      › dA|$› dB| j                  › dCt        ‰«      › dD|› dE|› dF|› dG|› dH|› dI�S )JNc                 ó4  •
— ‰
‰‰	‰‰xs d‰xs d‰t        ‰«      t        ‰«      dœ	}‰r‰|d<   |j                  | j                  «       D ��ci c]  \  }}|sŒ	|t        |«      “Œ c}}«       dj                  d„ |j                  «       D «       «      S c c}}w )NrA   )	rS   rä  rå  r‹   rÏ  rc   r…  r‰   rŠ   r�   rB   c              3   óp   K  — | ].  \  }}|sŒ	|› d t         j                  j                  |«      › �–— Œ0 y­wr»  ré  r¾  s      r   r+   zFSearchHandler.render_main_page.<locals>.link_params.<locals>.<genexpr>ä
  rê  rë  rì  )rî  rW   r½   rh  rŽ   r�   r‰   rŠ   rä  rå  rˆ   r‹   rc   rÏ  s       €€€€€€€€€€r   rï  z3SearchHandler.render_main_page.<locals>.link_paramsÜ
  s¨   ø€ à 2¨R¸ÀcÂiÈRÐX[ÒXaÐ_aÐluô  @Cð  DHó  @Iô  X[ð  \eó  Xfñ  gˆAá¨˜˜:™à�H‰H¨I¯O©OÓ,=×C¡D A qÂ�aœ˜Q›‘iÓCÔDà—8‘8ÑVÀqÇwÁwÃyÔVÓVÐVùó Ds   Á
B
ÁB
rA   rÒ  r   r&  r'  r(  r)  r*   r*  r+  rM   ry  rè  rû   rç  r  r  z<h3><a href="ru  rv  r-  r2  r4  z<span>&#x1f4b0; r5  z<span>&#x1f4cd; r6  rü   z<span>&#x1f4c5; r/  r0  r{  u@   <div class="no-results">&#x1f615; æ²¡æœ‰æ‰¾åˆ°ç›¸å…³ç»“æžœ</div>r  r  r  r  r  rô  r  r  rE   rD   r  r   rõ  r�   r   c           	      óÜ   •— t        ‰«      }| r| |d<   nd|v r|d= d|d<   dt        j                  j                  |j	                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}«      z   S c c}}w r÷  rø  rú  s       €r   rü  z4SearchHandler.render_main_page.<locals>.ind_chip_url-  rý  rþ  rÿ  r£  r   re  r  r¡  r%   r  r|  a„  

.pagination{text-align:center;margin:20px 0;display:flex;justify-content:center;gap:4px;flex-wrap:wrap}.page-btn{display:inline-block;padding:8px 14px;background:#fff;border:1px solid #dadce0;border-radius:6px;font-size:14px;color:#1a73e8;text-decoration:none;transition:all .15s}.page-btn:hover{background:#e8f0fe;border-color:#1a73e8}.page-btn.active{background:#1a73e8;color:#fff;border-color:#1a73e8}.page-ellipsis{padding:8px 4px;color:#999}.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:8px}.page-jump input{width:50px;padding:4px 6px;border:1px solid #dadce0;border-radius:4px;text-align:center;font-size:13px}

uÄ   <!DOCTYPE html>

<html lang="zh-CN">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>BJIIRé¡¹ç›®åº“</title>

    <style>uÂ  </style>

</head>

<body>

    <div class="container">

        <div class="home-wrap">

            <div class="home-logo">BJIIRé¡¹ç›®åº“</div>

            <div class="home-sub">çŽ¯ä¿�é¡¹ç›®ä¿¡æ�¯ç»¼å�ˆæ�œç´¢</div>

            <div class="home-search">

                <form action="/" method="get" class="search-box">

                    <input type="text" name="q" placeholder="æ�œç´¢é¡¹ç›®å…³é”®è¯�ã€�æ ‡é¢˜..." value="" autofocus>

                    <button type="submit">æ�œç´¢</button>

                </form>

            </div>

            <div class="home-btns">

                <a href="/crawler/">&#x1f50d; çŽ¯è¯„å…¬ç¤º</a>

                <a href="/zc/">&#x1f4ca; ä¸­ç­–å¤§æ•°æ�®</a>

                <a href="/ccpc">&#x1f4c4; ä¸­é¡¹ç½‘</a>

                <a href="/contact">&#x1f464; è�”ç³»äººDB</a>
                <a href="/originals/">&#x1f4cb; åŽŸå§‹æ•°æ�®</a>

            </div>

            <div class="home-count">ç™»å½•ç”¨æˆ·: z4</div>

        </div>

    </div>

</body>

</html>z¡<!DOCTYPE html>

<html lang="zh-CN">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>u&    - BJIIRé¡¹ç›®åº“</title>

    <style>uÂ  </style>

</head>

<body>

    <div class="container">

        <div class="nav">

            <a href="/" class="nav-logo">BJIIR</a>

            <div class="nav-links">

                <a href="/crawler/">çŽ¯è¯„å…¬ç¤º</a>

                <a href="/zc/">ä¸­ç­–å¤§æ•°æ�®</a>

                <a href="/ccpc">ä¸­é¡¹ç½‘</a>

                <a href="/contact">è�”ç³»äººDB</a>

            </div>

            <div class="nav-right">

                u  

                <a href="/logout">é€€å‡º</a>

            </div>

        </div>

        <div class="search-section">

            <form action="/" method="get" class="search-box">

                <input type="text" name="q" placeholder="æ�œç´¢é¡¹ç›®å…³é”®è¯�ã€�æ ‡é¢˜..." value="uÉ   " autofocus>

                <button type="submit">æ�œç´¢</button>

            </form>

        </div>

        <div class="toolbar"><div class="controls">

            <span class="total-count">å…± u5    æ�¡ç»“æžœ</span>

            <div class="date-bar">z&</div>

        </div></div>

        r  z</div>

        z

    </div>

</body>

</html>)
r?  rØ   rK   rG   r=  r„  r@  r,   r<  rÞ   )'rN  rˆ   r›   r—   rœ   r‰   rŠ   r‹   rÏ  rc   r–   rŽ   rä  rå  r�   rï  r  rm  rš   ÚsrcrÂ   r  Údetail_linkrg  r  ri  rj  rk  r°  r  rü  Úindustry_chipsr.   r   r/   r  ra  Úis_homerû  s'    `   ````` ````                       @r   rÛ  zSearchHandler.render_main_pageÚ
  sŽ  ÿú€ ÷	Wõ 	Wð ˆä “oó $	*‰FˆC�à—%‘%˜	 2Ó&ˆCà—%‘%˜“+ÒJ §¡ |Ó!4ÒJ¸¿¹¸e»ÒJÈˆCä�q—u‘u˜^¨BÓ/Òg°1·5±5¸ÈÓ3LÒgÐPQ×PUÑPUÐV]Ð^`ÓPaÒgÐegÓhˆDàÐ6Ñ6ˆKàÐ/°¸±¸qÑ0@Ð/AÀÐIÑIˆKà�eŠ|à 1°#°Ð7‘àÐ)Ò)à ,¨S¨EÐ2‘ð !/¨s¨eÐ4�à˜]¨;¨-°r¸$¸¸yÐIÑIˆKàÐ/Ñ/ˆKá�KÐ%CÄCÈÃHÀ:ÈWÐ#UÑU�Kà�u‰u�XŒ Ð1AÄ#ÄcÈ!ÈHÉ+ÓFVÓBWÐAXÐX_Ð/`Ñ ` à�u‰u�ZÔ  +Ð3CÄCÈÈ*ÉÓDVÐCWÐno×nsÑnsÐtzÔn{ÐX[Ô\_Ð`aÐbhÑ`iÓ\jÒXjð  BDð  XEð  ELð  2Mñ  #M +àÐ-¬c°!·%±%¸ÀrÓ2JÒ2\ÈnÓ.]Ð-^Ð^eÐfÑfˆKà˜>Ñ)ŠKðI$	*ñL à\ˆKð *Ð1AÈÐ`qÑrˆð cˆà—n‘nÓ&ò 	C‰FˆB�à!*¨b¢‘+°bˆCà˜/¨"¨¨Q¨s¨e°1°R°D¸	ÐBÑB‰Hð		Cð 	Ð&Ñ&ˆð "¨4¸º	¸rÈIÐ]_ÐgiÑjˆá¨x�[ Ñ,ð GLÈaÂi”c˜!˜e iÑ/°!Ñ3¸	ÑAÔBÐUVˆØ—]‘] 4¨°c¸;ÓGˆ
ô	Tð KˆØ˜I¡l°2Ó&6Ð%7°yÉhÁÐ\^Ð@_Ð_qÐrÑrˆÜ"0ò 	pÑˆF�E˜3Ø Ñ'ˆFØ 	©,°vÓ*>Ð)?¸yÑRXÉÐ^`ÐHaÐacÐdiÐcjÐjnÐoÑo‰Nð	pð 	˜I¡l°7Ó&;Ð%<¸IÈxÐ[bÒObÁeÐhjÐEkÐkwÐxÑxˆØ˜(Ñ"ˆäð ñ ˆð �)Ò1 B Ò1¨r¨6ˆáðð ˆ5ð '3ðN 48·=±=°/ð Bðg;ð ;ð~
ô �‹Jˆ<ð àˆ5ð ð4 —‘�ð  dô ehÐhmÓdnÐcoð 
p+ð ,1¨'ð 2#à#+ *ð -	ð 
Ðð à)˜]ð +	à	ˆð ðMLð Lr
   c	                 óx  — t        d||z   dz
  |z  «      }	|r"dt        j                  j                  |«      z   nd}
d|z   dz   }|dz  }|dz  }dD ]  \  }}}|d	|z   d
z   |z   dz   z  }Œ |d| j                  z   dz   z  }|d| j                  z   dz   z  }|d|z   dz   z  }|dt        |«      z   dz   z  }|dt        |«      z   dz   z  }|D �]A  }t        |j                  d«      xs( |j                  d«      xs |j                  d«      xs d«      }t        |j                  dd«      xs* |j                  dd«      xs |j                  dd«      xs d«      }|d|z   dz   |z   dz   z  }|j                  d«      r|d t        |d   «      z   dz   z  }|j                  d!«      r<|d t        |d!   «      z   |j                  d"«      rd#t        |d"   «      z   ndz   dz   z  }|j                  d$«      r|d t        |d$   «      z   dz   z  }|d%z  }�ŒD |	dkD  r"d&d'i}|r||d(<   || j                  ||	d#|«      z  }|d)z  }|S )*NrM   r¢  rA   rÿ  r“  a  <style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f5f5f5;color:#333}.w{max-width:1000px;margin:0 auto;padding:20px}.nav{display:flex;gap:3px;margin-bottom:20px;white-space:nowrap;flex-wrap:nowrap;align-items:center}.nav a{flex:1;text-align:center;padding:6px 10px;background:#fff;border:1px solid #ddd;border-radius:6px;text-decoration:none;color:#555;font-size:13px;flex-shrink:0;min-width:0;font-weight:500}.nav a.act{background:#4361ee;color:#fff;border-color:#4361ee}h1{font-size:22px;margin-bottom:10px}.sb{display:flex;gap:10px;margin-bottom:20px}.sb input{flex:1;padding:10px 15px;border:1px solid #ddd;border-radius:6px;font-size:15px}.sb button{padding:10px 24px;background:#4361ee;color:#fff;border:none;border-radius:6px;cursor:pointer}.st{color:#666;font-size:14px;margin-bottom:15px}.cd{background:#fff;border-radius:8px;padding:16px 20px;margin-bottom:10px;box-shadow:0 1px 3px rgba(0,0,0,.08);cursor:pointer}.cd:hover{box-shadow:0 2px 8px rgba(0,0,0,.12)}.tt{font-size:16px;font-weight:600;color:#1a1a2e;margin-bottom:6px}.mt{font-size:13px;color:#666;display:flex;gap:16px;flex-wrap:wrap}.mt>*{margin-right:12px}.page-btn{display:inline-block;padding:6px 14px;background:#fff;border:1px solid #ddd;border-radius:6px;text-decoration:none;color:#333;font-size:14px;margin:0 2px}.page-btn.active{background:#4361ee;color:#fff;border-color:#4361ee}.page-ellipsis{display:inline-block;padding:6px 4px;color:#999;font-size:14px}.page-jump{display:inline-flex;align-items:center;gap:4px;margin-left:8px;font-size:13px;color:#666}.page-jump input{width:50px;padding:6px 8px;border:1px solid #ddd;border-radius:6px;font-size:13px;text-align:center;outline:none}.page-jump input:focus{border-color:#2563eb}</style></head><body><div class="w">r  )r  r  r	  r  )r   r  ré  )rþ   r  rè  z<a class="nav" href="ru  r¡  zW<span style="flex:1"></span><span style="font-size:12px;color:#888;white-space:nowrap">ry  ud   <span style="flex:1"></span><span style="font-size:13px;color:#555;white-space:nowrap">ç™»å½•ç”¨æˆ· uy   </span><a href="/logout" style="font-size:13px;color:#e53935;text-decoration:none;margin-left:8px">é€€å‡º</a></div></div>r”  r•  u�   <form class="sb" method="get" action="/"><input type="hidden" name="category" value="ä¸­é¡¹ç½‘"><input name="q" placeholder="æ�œç´¢â€¦" value="u    "><button>æ�œç´¢</button></form>u   <div class="st">å…± u    ä¸ªé¡¹ç›®</div>r   r&  r'  r(  r)  r*   z6<div class="cd" onclick="location.href='/ccpc/project/z'"><div class="tt">z</div><div class="mt">r4  r.  r5  r6  rü   r/  r{  r�   r  rS   r7  )	r„  r   r!  r‡  rÞ   rK   rG   rØ   r@  )rN  r*   r�   rS   r›   r—   r‰   rŠ   r–   r�  Úqpr‹  rb  rc  rd  rš   rÂ   r  ro  s                      r   Úrender_cceup_pagezSearchHandler.render_cceup_pageÕ  s  € ä��U˜9‘_ QÑ&¨Ñ2Ó3ˆá,-ˆU”6—<‘<×%Ñ% aÓ(Ò(°2ˆð Wð  X]ñ  ]ð  ^hñ  hˆà	ð  lñ  	lˆà	Ð"Ñ"ˆð -Jò 	IÑ(ˆF�I˜yàÐ(¨Ñ2°4Ñ7¸	ÑAÀ&ÑHÑH‰Að	Ið 	
ÐfÐgk×gtÑgtÑtÐu~Ñ~Ñ~ˆà	ÐsÐtx÷  uBñ  uBñ  Bð  C~ñ  ~ñ  	~ˆà	ˆV�E‰\˜'Ñ!Ñ!ˆà	ð  _ô  `cð  deó  `fñ  fð  gIñ  Iñ  	Iˆà	Ð#¤C¨£JÑ.Ð/AÑAÑAˆàó 	 ˆAä�a—e‘e˜D“kÒN Q§U¡U¨<Ó%8ÒN¸A¿E¹EÀ%»LÒNÈBÓOˆCä�q—u‘u˜^¨BÓ/Òg°1·5±5¸ÈÓ3LÒgÐPQ×PUÑPUÐV]Ð^`ÓPaÒgÐegÓhˆDàÐJÈ3ÑNÐOeÑeÐfjÑjð  lDñ  Dñ  DˆAð �u‰u�XŒ  X¬c°!°H±+Ó.>Ñ%>¸yÑ%HÑ H à�u‰u�ZÔ  ! x´°A°j±MÓ0BÑ'BÐZ[×Z_ÑZ_Ð`fÔZgÀCÌÈAÈfÉIËÒDVÐmoÑ'pÐqzÑ'zÑ"z !à�u‰u�^Ô$ a¨8´C¸¸.Ñ8IÓ4JÑ+JÈ9Ñ+TÑ&T aà�ÑŠAð!	 ð$ �Š6à$ kÐ2ˆJá A�*˜S‘/à�—‘˜t R¨¨jÓ9Ñ9ˆAà	Ð)Ñ)ˆàˆr
   c                 óD  — t        | j                  |dd«      «      }d}| j                  |dd«      j                  «       }t        j                  t
        «      }t        j                  |_        |j                  «       }|rj|j                  dd|› d�d|› d�d|› d�d|› d�f«       |j                  «       d   }|d	z
  |z  }|j                  d
d|› d�d|› d�d|› d�d|› d�||f«       n@|j                  d«       |j                  «       d   }|d	z
  |z  }|j                  d||f«       |j                  «       D �	cg c]  }	t        |	«      ‘Œ }
}	|j                  «        t        d	||z   d	z
  |z  «      }| j                  d| j!                  ||
|||||«      «       y c c}	w ©Nr‰   r`  r  rS   rA   zoSELECT COUNT(*) FROM cceup_contacts WHERE company LIKE ? OR contact_name LIKE ? OR phone LIKE ? OR email LIKE ?r{   r   rM   zŠSELECT * FROM cceup_contacts WHERE company LIKE ? OR contact_name LIKE ? OR phone LIKE ? OR email LIKE ? ORDER BY id DESC LIMIT ? OFFSET ?z#SELECT COUNT(*) FROM cceup_contactsz>SELECT * FROM cceup_contacts ORDER BY id DESC LIMIT ? OFFSET ?rö   ©rM  r�  r   r5   r6   r¶   ri   rj   r�   r8   rƒ   r…   r†   r:   r„  rB  Úrender_contact_list©rN  r�   r‰   rŠ   rS   r=   r\   r—   r–   rš   r›   r°  s               r   r8  zSearchHandler.handle_cceup_page  óŠ  € ä�4—>‘> &¨&°#Ó6Ó7ˆàˆ	à�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆä�‰œÓ/ˆä"Ÿ;™;ˆÔà�K‰K‹Mˆáà�I‰Ið  Hð  MNð  OPð  NQð  QRð  KSð  WXð  YZð  X[ð  [\ð  U]ð  abð  cdð  beð  efð  _gð  klð  mnð  loð  opð  iqð  Jrô  sà—J‘J“L ‘OˆEà˜Q‘h )Ñ+ˆFà�I‰Ið  cð  hið  jkð  ilð  lmð  fnð  rsð  tuð  svð  vwð  pxð  |}ð  ~ð  }@ð  @Að  zBð  FGð  HIð  GJð  JKð  DLð  NWð  Y_ð  e`õ  að �I‰IÐ;Ô<à—J‘J“L ‘OˆEà˜Q‘h )Ñ+ˆFà�I‰IÐVÐYbÐdjÐXkÔlà!"§¡£Ö.˜A”�Q•Ð.ˆÐ.à�
‰
Œä˜!˜e iÑ/°!Ñ3¸	ÑAÓBˆà×Ñ  T×%=Ñ%=¸aÀÀuÈdÐT]Ð_jÐlrÓ%sÕtùò /ó   Ä<Fc                 óD  — t        | j                  |dd«      «      }d}| j                  |dd«      j                  «       }t        j                  t
        «      }t        j                  |_        |j                  «       }|rj|j                  dd|› d�d|› d�d|› d�d|› d�f«       |j                  «       d   }|d	z
  |z  }|j                  d
d|› d�d|› d�d|› d�d|› d�||f«       n@|j                  d«       |j                  «       d   }|d	z
  |z  }|j                  d||f«       |j                  «       D �	cg c]  }	t        |	«      ‘Œ }
}	|j                  «        t        d	||z   d	z
  |z  «      }| j                  d| j!                  ||
|||||«      «       y c c}	w r  r  r  s               r   r9  z!SearchHandler.handle_contact_page?  r   r!  c           	      óö  — t         dz   }d|z   dz   }	|	dz  }	|	dz  }	|	dz  }	|	dz  }	dD ]&  \  }
}}|
d	k(  rd
nd}|	d|z   dz   |z   dz   |z   dz   z  }	Œ( |	dz  }	|	d| j                  z   dz   z  }	|	dz  }	|	dz  }	|	dz  }	|	dt        |«      z   dz   z  }	|	dz  }	|	dz  }	|	dt        |«      z   dz   z  }	|	dz  }	t	        |«      D �]  \  }}|	dz  }	|	dz  }	|	dt        |j                  dd«      xs d«      z   dz   z  }	|	d z  }	|	d!t        |j                  d"d«      xs d«      z   d#z   z  }	|	d$t        |j                  d%d«      xs d«      z   d#z   z  }	|j                  d&«      r|	d't        |d&   «      z   d#z   z  }	|j                  d(«      r|	d)t        |d(   «      z   d#z   z  }	|	dz  }	|j                  d%d«      }|r|	d*t        |«      z   d+z   z  }	|	dz  }	�Œ |d,kD  r i }|r||d-<   |	| j                  ||d.|«      z  }	|	d/z  }	|	S )0Na  

.contact-card{border:1px solid #e8e8e8;border-radius:8px;padding:16px;margin-bottom:12px;background:#fafafa;display:flex;align-items:flex-start;gap:16px}

.contact-body{flex:1;min-width:0}

.contact-dial{flex-shrink:0;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px}

.contact-dial a{display:flex;align-items:center;justify-content:center;width:48px;height:48px;border-radius:50%;background:#1a73e8;color:#fff;text-decoration:none;font-size:22px}

.contact-dial a:hover{background:#1557b0}

u³   <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>è�”ç³»äººDB - BJIIRé¡¹ç›®åº“</title><style>rž  r   r  r  r  r  r
  r  rA   r£  rE   rD   r¡  r|  r  r  r  z8<form class="search-box" method="get" action="/contact">uP   <input name="q" placeholder="æ�œç´¢å…¬å�¸å��ã€�è�”ç³»äººã€�æ‰‹æœºå�·â€¦" value="ru  r  ú+<div class="toolbar"><div class="controls">u   <span class="total-count">å…± u    æ�¡è�”ç³»äºº</span>r{  z<div class="contact-card">z<div class="contact-body">zL<div style="font-size:16px;font-weight:600;color:#1a1a2e;margin-bottom:6px">r¦  z`<div style="font-size:13px;color:#666;display:flex;flex-wrap:wrap;gap:4px 16px;line-height:1.6">uC   <span><span style="color:#888;margin-right:2px">è�”ç³»äººï¼š</span>r§  ry  u@   <span><span style="color:#888;margin-right:2px">æ‰‹æœºï¼š</span>rª  Úemailu@   <span><span style="color:#888;margin-right:2px">é‚®ç®±ï¼š</span>r«  u@   <span><span style="color:#888;margin-right:2px">åœ°å�€ï¼š</span>z'<div class="contact-dial"><a href="tel:u   ">â˜Ž</a></div>rM   rS   r	  r7  )r<  rÞ   rK   rG   r?  rØ   r@  )rN  rS   r›   r—   r‰   rŠ   r°  r–   ra  r‹  rb  rc  rd  re  rm  rš   rª  ro  s                     r   r  z!SearchHandler.render_contact_listk  sj  € äð ñ ˆð Bð  CFñ  Fð  G^ñ  ^ˆà	Ð&Ñ&ˆð 	
Ð Ñ ˆà	Ð5Ñ5ˆà	Ð&Ñ&ˆð -jò 	DÑ(ˆF�I˜yà$*¨iÒ$7‘.¸RˆCà�˜YÑ& sÑ*¨3Ñ.¨sÑ2°9Ñ<¸VÑCÑC‰Að		Dð 	
ˆX‰ˆà	Ð& t§}¡}Ñ4Ð5`Ñ`Ñ`ˆà	ˆX‰ˆð 	
Ð+Ñ+ˆà	ÐGÑGˆà	ð  Jô  KNð  OPó  KQñ  Qð  RVñ  Vñ  	Vˆà	Ð9Ñ9ˆð 	
Ð:Ñ:ˆà	Ð0´°U³Ñ;Ð<^Ñ^Ñ^ˆà	ˆ^Ñˆô   “oó 	‰FˆC�àÐ-Ñ-ˆAàÐ-Ñ-ˆAàÐ_Ô`cÐde×diÑdiÐjsÐtvÓdwÒd}Ð{}Ó`~Ñ~ð  @Hñ  Hñ  HˆAàÐsÑsˆAàÐbÔcfÐgh×glÑglÐm{Ð|~Ógò  hFð  DFó  dGñ  Gð  HQñ  Qñ  QˆAàÐ\Ô]`Ðab×afÑafÐgnÐoqÓarÒaxÐvxÓ]yÑyð  {Dñ  Dñ  DˆAà�u‰u�WŒ~˜qÐ$oÔpsÐtuÐv}Ñt~ÓpÑ$ð  AJñ  %Jñ   J˜qà�u‰u�YÔ Ð&qÔruÐvwð  yBñ  wCó  sDñ  'Dð  ENñ  'Nñ  "N à�ÑˆAà—E‘E˜' 2Ó&ˆEáàÐ>¼sÀ5»zÑIÐJ^Ñ^Ñ^�à�‰MŠAð5	ð< ˜Š?àˆJá A�*˜S‘/à�—‘˜t [°*¸jÓIÑIˆAà	Ð)Ñ)ˆàˆr
   c                 óÒ  — ddl m} t        | j                  |dd«      «      }| j                  |dd«      j	                  «       }| j                  |dd«      j	                  «       }| j                  |dd«      j	                  «       }| j                  |d	d
«      }d}|}	|r|	|	rdndz   |z   }	|r|	|	rdndz   |z   }	t        |	|||«      \  }
}t        d|
|z   dz
  |z  «      }t        dz   }d|z   dz   }|dz  }|dz  }|dz  }|dz  }dD ]&  \  }}}|dk(  rdnd}|d|z   dz   |z   dz   |z   dz   z  }Œ( |dz  }|d| j                  z   dz   z  }|dz  }|dz  }|d z  }|d! ||«      z   d"z   z  }|d#z  }d$d%d&d'd(œ}|d)z  }|d*z  }d|fd|fd|ffD ]  \  }}|sŒ	|d+|z   d,z    ||«      z   d"z   z  }Œ! |d-z  }|j                  «       D ]%  \  }}||k(  rd.nd}|d/|z   dz   |z   dz   |z   d0z   z  }Œ' |d1z  }|d2z  }|d3|
dkD  rd4t        |
«      z   d5z   ndz   d6z   t        |«      z   d7z   z  }|d8z  }t        |«      D �]X  \  }}t        |j                  d9«      xs( |j                  d:«      xs |j                  d;«      xs d«      } ||j                  d<d«      xs d«      }|d=z  }|d>t        |dz   «      z   d?z   z  }|d@z  }|dA|z   d"z   |z   dBz   z  }|dCz  }|j                  dD«      r|dE ||dD   «      z   d?z   z  }|j                  dF«      r|dG ||dF   «      z   d?z   z  }|j                  dH«      r6|dG ||dH   «      z   |j                  dI«      rdJ ||dI   «      z   ndz   d?z   z  }|j                  dK«      r|dG ||dK   «      z   d?z   z  }|dLz  }�Œ[ |dz  }|dkD  r8i }|r||d<   |r||d<   |r||d<   |d
k7  r||d	<   || j                  ||dM|«      z  }|dNz  }| j                  dO|«       y )PNr   ©rƒ  r‰   r`  rS   rA   rä  rå  r…  rn   r  r[   rM   z

u±   <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ä¸­é¡¹ç½‘ - BJIIRé¡¹ç›®åº“</title><style>rž  r   r  r  r  r  r  r  r£  rE   rD   r¡  r|  r  r  r  z5<form class="search-box" method="get" action="/ccpc">u>   <input name="q" placeholder="æ�œç´¢ä¸­é¡¹ç½‘é¡¹ç›®â€¦" value="ru  r  r  r  r  r  r  r  z9<form style="display:inline" method="get" action="/ccpc">r  r  r  r  r  r  r  r$  r!  r"  r#  r$  r%  r{  r   r&  r'  r(  r*  r+  ry  r,  z<h3><a href="/ccpc/project/rv  r-  rŒ   r2  r4  r.  r5  r6  rü   r/  z</div></div></div>r
  r7  rö   )r‚  rƒ  rM  r�  r   r¿   r„  r<  rÞ   r=  rG   r?  rØ   r@  rB  )rN  r�   rƒ  r‰   rS   rä  rå  rŽ   rŠ   r`  r—   r›   r°  ra  r‹  rb  rc  rd  re  rg  r½   rh  ri  rj  rk  rm  rš   rÂ   r  ro  s                                 r   r:  z#SearchHandler.handle_cceup_projects×  sƒ  € åä�4—>‘> &¨&°#Ó6Ó7ˆà�N‰N˜6 3¨Ó+×1Ñ1Ó3ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà�^‰^˜F D¨"Ó-×3Ñ3Ó5ˆà—N‘N 6¨7°EÓ:ˆ	àˆ	àˆ
á˜J±©#ÀÑDÀrÑIˆzá˜J±©#ÀÑDÀrÑIˆzä" :¨t°YÀ	ÓJ‰ˆˆtä˜!˜e iÑ/°!Ñ3¸	ÑAÓBˆäð ñ ˆð @ð  ADñ  Dð  E\ñ  \ˆà	Ð&Ñ&ˆð 	
Ð Ñ ˆà	Ð5Ñ5ˆà	Ð&Ñ&ˆð -jò 	DÑ(ˆF�I˜yà$*¨gÒ$5‘.¸2ˆCà�˜YÑ& sÑ*¨3Ñ.¨sÑ2°9Ñ<¸VÑCÑC‰Að		Dð 	
ˆX‰ˆà	Ð& t§}¡}Ñ4Ð5`Ñ`Ñ`ˆà	ˆX‰ˆð 	
Ð+Ñ+ˆà	ÐDÑDˆà	ÐeÑflÐmnÓfoÑoÐptÑtÑtˆà	Ð9Ñ9ˆð 6Ð=YÐa{ð  Eeñ  fˆà	Ð?Ñ?ˆà	ÐHÑHˆà˜�G˜T "˜I t¨B iÐ0ò 	R‰CˆAˆaâ�!Ð4°QÑ6°{ÑBÁ6È!Ã9ÑLÈTÑQÑQ‘!ð	Rð 	
ÐVÑVˆà—n‘nÓ&ò 	A‰FˆB�à!*¨b¢‘+°bˆCàÐ" 2Ñ% cÑ)¨#Ñ-¨cÑ1°"Ñ4°[Ñ@Ñ@‰Að		Að 	
Ð+Ñ+ˆð 	
Ð:Ñ:ˆà	Ð)ÐglÐopÒgp¨Y¼¸U»Ñ-CÐFcÒ-cÐvxÑyð  }Fñ  Fô  GJð  KOó  GPñ  Pð  Qañ  añ  	aˆà	ˆ^Ñˆô   “oó 	&‰FˆC�ä�a—e‘e˜D“kÒN Q§U¡U¨<Ó%8ÒN¸A¿E¹EÀ%»LÒNÈBÓOˆCá˜!Ÿ%™% ¨rÓ2Ò8°bÓ9ˆDàÐ,Ñ,ˆAàÐ%¬¨C°©E«
Ñ2°YÑ>Ñ>ˆAàÐ'Ñ'ˆAàÐ.¨sÑ2°4Ñ7¸Ñ<¸[ÑHÑHˆAàÐ%Ñ%ˆAà�u‰u�WŒ~˜qÐ$DÁVÈAÈgÉJÓEWÑ$WÐXaÑ$aÑa˜qà�u‰u�XŒ  X©f°Q°x±[Ó.AÑ%AÀ)Ñ%KÑ K à�u‰u�ZÔ  ! x±°q¸±}Ó0EÑ'EÐ`a×`eÑ`eÐflÔ`mÀsÉ6ÐRSÐTZÑR[ÓK\ÒG\ÐsuÑ'vð  xAñ  (Añ  #A !à�u‰u�^Ô$ a¨8±F¸1¸^Ñ;LÓ4MÑ+MÈiÑ+WÑ&W aàÐ%Ñ%ŠAð1	&ð2 	
ˆX‰ˆà˜Š?àˆJá A�*˜S‘/á b�:˜dÑ#á b�:˜dÑ#à˜EÒ!¸ :¨gÑ#6à�—‘˜t [°'¸:ÓFÑFˆAà	Ð)Ñ)ˆà×Ñ  QÕ'r
   c                 ó˜  — ddl m} |j                  d«      d   }t        j                  t
        «      }t        j                  |_        |j                  dt        |«      f«      j                  «       }|s| j                  dd«       y t        |«      }|j                  dt        |«      f«      D �cg c]  }t        |«      ‘Œ }}|j                  «        t        }d	|z   d
z   }	|	dz  }	|	d ||j                  dd«      xs d«      z   dz   z  }	|	dz  }	g d¢}
|
D ]?  \  }}|j                  |d«      }|sŒ|dvsŒ |	d|z   dz    |t!        |«      «      z   dz   z  }	ŒA |	dz  }	|	dz  }	dD ]?  \  }}|j                  |d«      }|sŒ|dvsŒ |	d|z   dz    |t!        |«      «      z   dz   z  }	ŒA |	dz  }	dD ]G  \  }}|j                  |d«      }|sŒ|j#                  «       sŒ,|dvsŒ1|	d|z   dz    ||«      z   dz   z  }	ŒI |j                  d«      r|	d ||d   «      z   dz   z  }	|�r|	dz  }	|D ]ÿ  }|j                  d d«      xs d} ||j                  d!d«      xs d«      } ||j                  d"d«      xs d«      } ||j                  d#d«      xs d«      } ||j                  d$d«      xs d«      } ||j                  dd«      xs d«      }|	d%z  }	|r|	d&|z   dz   z  }	|	d'z  }	|r|	d(|z   d)z   z  }	|r|	d*|z   d)z   z  }	|r|	d+|z   d)z   z  }	|	dz  }	|r|	d,|z   dz   z  }	|	dz  }	|	dz  }	�Œ |	dz  }	|	d-z  }	| j                  d.|	«       y c c}w )/Nr   r'  rü   rý   z'SELECT * FROM cceup_projects WHERE id=?rù   r‘  z/SELECT * FROM cceup_contacts WHERE project_id=?u    <!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>ä¸­é¡¹ç½‘</title><style>av
  

        .detail-wrap { max-width: 900px; margin: 0 auto; padding: 20px; }

        .detail-back { display: inline-block; margin-bottom: 16px; color: #2563eb; text-decoration: none; font-size: 14px; }

        .detail-back:hover { text-decoration: underline; }

        .detail-title { font-size: 22px; font-weight: 600; color: #1a1a2e; margin-bottom: 16px; }

        .detail-card { background: #fff; border-radius: 8px; padding: 24px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }

        .detail-card h3 { font-size: 16px; margin-bottom: 12px; padding-bottom: 6px; border-bottom: 2px solid #2563eb; color: #333; }

        .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 32px; font-size: 14px; line-height: 1.8; }

        .detail-grid .label { color: #888; min-width: 80px; }

        .detail-grid .value { color: #333; }

        .detail-text { font-size: 14px; line-height: 1.7; color: #444; white-space: pre-wrap; }

        .contact-card { border: 1px solid #e8e8e8; border-radius: 8px; padding: 16px; margin-bottom: 12px; background: #fafafa; }

        .contact-card .company { font-size: 15px; font-weight: 600; color: #1a1a2e; margin-bottom: 8px; }

        .contact-card { border: 1px solid #e8e8e8; border-radius: 8px; padding: 16px; margin-bottom: 12px; background: #fafafa; display: flex; align-items: flex-start; gap: 16px; }

        .contact-body { flex: 1; min-width: 0; }

        .contact-dial { flex-shrink: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 8px; }

        .contact-dial a { display: flex; align-items: center; justify-content: center; width: 48px; height: 48px; border-radius: 50%; background: #2563eb; color: #fff; text-decoration: none; font-size: 22px; transition: background 0.2s; }

        .contact-dial a:hover { background: #1d4ed8; }

        .contact-info { display: flex; flex-wrap: wrap; gap: 4px 24px; font-size: 14px; line-height: 1.8; }

        .address-row { display: flex; align-items: center; gap: 8px; font-size: 14px; line-height: 1.8; margin-top: 4px; }

        .address-row .cl { color: #888; flex-shrink: 0; }

        .address-row .addr-value { flex: 1; min-width: 0; color: #333; word-break: break-all; }

        .tianyan-btn { flex-shrink: 0; display: inline-flex; align-items: center; gap: 4px; padding: 4px 12px; font-size: 13px; background: #fff; color: #ff6b35; border: 1px solid #ff6b35; border-radius: 4px; text-decoration: none; cursor: pointer; transition: all 0.2s; white-space: nowrap; }

        .tianyan-btn:hover { background: #ff6b35; color: #fff; }

        </style></head><body><div class="detail-wrap">uƒ   <a class="detail-back" href="/?tag=%E8%B5%84%E6%BA%90%E7%BD%91%E7%AB%99" onclick="history.back();return false">â†� è¿”å›žåˆ—è¡¨</a>z<div class="detail-title">r(  rA   r|  uG   <div class="detail-card"><h3>åŸºæœ¬ä¿¡æ�¯</h3><div class="detail-grid">)rq  )u   é¡¹ç›®ç±»åž‹r‰  r‡  )u   æŠ•èµ„é‡‘é¢�r4  rr  )u   ç»†åˆ†è¡Œä¸šÚ
field_typerv  )u   æŠ•èµ„æ€§è´¨Úinvest_nature)r€  Úfunding)u   é¡¹ç›®ç­‰çº§Úgradert  ru  )u   åœ°å�€Úproject_addressr  )u   ç‰ˆæœ¬Úversionr­  z<div><span class="label">u   ï¼š</span><span class="value">r…  r{  uJ   <div class="detail-card"><h3>å·¥æœŸä¸Žè§„æ¨¡</h3><div class="detail-grid">))u   å¼€å·¥æ—¶é—´Ú
start_time)u   å·¥æœŸÚend_timer�  r�  )u	   é’¢ç»“æž„Ústeel_structure)u   è®¾å¤‡æ�¥æº�Úequipment_source))u   é¡¹ç›®æ¦‚å†µÚoverview)u   é¡¹ç›®è¿›å±•Úprogress)u   é¡¹ç›®è¯¦æƒ…rØ  )u   è®¾å¤‡æ¸…å�•r�  )u   å•†æœºÚopportunity)u   é‡�ç‚¹å·¥ä½œÚ	key_worksr‚  z<div class="detail-card"><h3>z</h3><div class="detail-text">r)  uA   <div class="detail-card"><h3>ä¸šä¸»</h3><div class="detail-text">u+   <div class="detail-card"><h3>è�”ç³»äºº</h3>rª  r¦  r§  r%  r«  z4<div class="contact-card"><div class="contact-body">z<div class="company">z<div class="contact-info">u(   <span><span class="cl">å§“å��ï¼š</span> ry  u(   <span><span class="cl">ç”µè¯�ï¼š</span> u(   <span><span class="cl">é‚®ç®±ï¼š</span> uS   <div class="address-row"><span class="cl">åœ°å�€ï¼š</span><span class="addr-value">r7  rö   )r‚  rƒ  rO   r5   r6   r¶   ri   rj   r8   rM  rƒ   rB  r†   r:   r<  rØ   rG   r   )rN  r´   rƒ  rÂ   r=   rš   rW   rÈ   ra  r‹  Úfieldsrµ  r¶  rh  r\   rª  r¦  r§  r%  Úaddress_valÚ	owner_escs                        r   r=  z)SearchHandler.handle_cceup_project_detaill  s[  € åà�j‰j˜‹o˜bÑ!ˆä�‰œÓ/ˆä"Ÿ;™;ˆÔà�L‰LÐBÄSÈÃXÀKÓP×YÑYÓ[ˆá�$×)Ñ)¨#¨{Ô;¸Vä�‹Gˆà%)§\¡\Ð2cÔfiÐjmÓfnÐepÓ%qÖr ”D˜•GÐrˆÐrà�
‰
Œô ˆð @ð  CFñ  Fð 0I:ñ 0:ˆðd 	
ð  bñ  	bˆà	Ð+©f°Q·U±U¸>È"Ó5MÒ5SÐQSÓ.TÑTÐW_Ñ_Ñ_ˆð 	
ÐfÑfˆò 
ˆðD ò 	D‰HˆC�à—‘�c˜"“ˆAâ�QÐ@Ò@àÐ2°SÑ8Ð;`Ñ`ÑciÔjmÐnoÓjpÓcqÑqð  uDñ  Dñ  D‘ð	Dð 	
ˆ^Ñˆð 	
ÐlÑlˆð Oò 	D‰HˆC�à—‘�c˜"“ˆAâ�QÐ@Ò@àÐ2°SÑ8Ð;`Ñ`ÑciÔjmÐnoÓjpÓcqÑqð  uDñ  Dñ  D‘ð	Dð 	
ˆ^Ñˆð Fò 	‰HˆC�à—‘�c˜"“ˆAâ�Q—W‘W•Y 1Ð,KÒ#KàÐ6¸Ñ<Ð?aÑaÑdjÐklÓdmÑmÐp~Ñ~Ñ~‘ð	ð �5‰5�Ô!àÐXÑ[aÐbcÐdsÑbtÓ[uÑuð  yGñ  Gñ  GˆAò àÐ@Ñ@ˆAàò *�àŸ™˜g rÓ*Ò0¨b�á  §¡ y°Ó!4Ò!:¸Ó;�á% a§e¡e¨N¸2Ó&>Ò&DÀ"ÓE�á˜qŸu™u W¨RÓ0Ò6°BÓ7�á$ Q§U¡U¨9°RÓ%8Ò%>¸BÓ?�á" 1§5¡5¨¸Ó#<Ò#BÀÓC�	àÐOÑO�áàÐ2°WÑ<¸xÑGÑG�AàÐ3Ñ3�áàÐEÈÑTÐW`Ñ`Ñ`�AáàÐEÈÑMÐPYÑYÑY�AáàÐEÈÑMÐPYÑYÑY�Aà�X‘�áàÐtð  xCñ  Cð  FUñ  Uñ  U�Aà�X‘�à�X‘’ðU*ðX �‰MˆAð 	
Ð)Ñ)ˆà×Ñ  QÕ'ùò] ss   Â1Mc                 ó|  — t        | j                  |dd«      «      }t        |«      }|s| j                  dd«       y ddlm}  ||j                  dd«      «      } ||j                  d	«      xs d
«      }|j                  d«      xs d
}|j                  d«      xs d
}|j                  dd«      }	|j                  dd
«      }
|j                  d«      xs d
}|j                  d«      xs d
}|j                  d«      xs d
}t        |t        «      r=|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|rd ||«      › d�nd
}d|› d|› d�}|
rt        j                  |
dg¬«      nd
}|j                  dd
«      }|rt        |«      dkD  rd|v sd|v r|}n>|r't        |«      dkD  rt        j                  |dg¬«      }n|
rt        |
«      dkD  r|}nd}|rd |› d!�nd
}| j                  |d"d
«      }| j                  |d#d$«      }| j                  |d%d
«      }| j                  |dd
«      }| j                  |d&d'«      }| j                  |d(d)«      }d*}d
j                  g d+‘|› ‘d,‘|› ‘d-‘t        j                  j!                  |«      › ‘d.‘|› ‘d/‘|› ‘d0‘|› ‘d1‘|› ‘d2‘|› ‘d3‘|› ‘d4‘|› ‘d5‘|› ‘d6‘|xs d7› ‘d8‘|	xs d› ‘d9‘|j                  d:d«      xs d› ‘d;‘|› ‘d<‘|xs |› ‘d=‘|xs |› ‘d>‘|› ‘d?‘|› ‘d@‘|› ‘dA‘«      }| j                  dB|«       y c c}w )CNr   r   rù   r‘  r   r'  r*   ÚUnknownrœ  rA   r�   r/  Ústatusu	   å·²é‡‡é›†ró  rÓ   rÔ   rñ  rï  rð  ry  z<a href="/detail?id=z">#r¡  r¢  r£  rj  r  z<p>z<tableue   <p class="no-summary">æ­£æ–‡å†…å®¹æœªé‡‡é›†å®Œæ•´ï¼Œè¯·ç‚¹å‡»ä¸‹æ–¹åŽŸæ–‡é“¾æŽ¥æŸ¥çœ‹å®Œæ•´ä¿¡æ�¯</p>uW   <p class="detail-source-item"><span class="detail-label">ðŸ“¡ æ�¥æº�ç½‘ç«™</span><span>z</span></p>rS   r‹   ry   rŒ   r‰   r`  rŠ   ra  a^  body{font-family:-apple-system,"Microsoft YaHei",sans-serif;background:#f5f5f5;margin:0;padding:0;color:#333}

        .container{max-width:800px;margin:0 auto;padding:20px}

        .nav-bar{margin-bottom:12px}.nav-bar a{color:#4361ee;text-decoration:none;font-size:14px}

        .detail-card{background:#fff;border-radius:12px;box-shadow:0 1px 4px rgba(0,0,0,.08);padding:24px}

        .detail-title{font-size:24px;margin-bottom:16px;color:#1a1a2e}

        .detail-meta{display:flex;flex-wrap:wrap;gap:12px;margin-bottom:20px;font-size:13px;color:#666;align-items:center}

        .detail-meta span{background:#f0f0f0;padding:4px 10px;border-radius:4px}

        .detail-status{color:#2e7d32;background:#e8f5e9!important}

        .detail-visits{color:#e65100}

        .detail-body{line-height:1.8;font-size:15px;color:#333}

        .detail-body p{margin:12px 0}.detail-body table{border-collapse:collapse;width:100%;margin:14px 0;font-size:14px}.detail-body td,.detail-body th{border:1px solid #ddd;padding:8px 12px;text-align:left;vertical-align:top}.detail-body tr:nth-child(even){background:#f9f9f9}

        .detail-source{border-top:1px solid #e5e7eb;padding-top:16px;margin-top:20px;font-size:14px}

        .detail-source-item{margin:8px 0}

        .detail-label{color:#888;margin-right:8px}

        .detail-original-link{color:#4361ee;word-break:break-all}rÿ  z</title><style>zX</style></head><body><div class="container">

        <div class="nav-bar"><a href="/?q=z&sort=z&phase=z
&category=r~  z&page_size=uw   " if search_q else '/'">&larr; è¿”å›žæ�œç´¢ç»“æžœ</a></div>

        <div class="detail-card"><h1 class="detail-title">z(</h1>

        <div class="detail-meta">r.  u   </span><span>ðŸ“… r0  z#</span><span class="detail-status">u(   </span><span class="detail-visits">ðŸ‘� Úvisitsu:    æ¬¡è®¿é—®</span></div>

        <div class="detail-body">u…   </div>

        <div class="detail-source"><p class="detail-source-item"><span class="detail-label">ðŸ”— åŽŸæ–‡é“¾æŽ¥</span><a href="z>" target="_blank" rel="noopener" class="detail-original-link">z</a></p>uH   <p class="detail-source-item"><span class="detail-label">æ•°æ�®ID</span>z7</p></div></div>

        <script>fetch('/api/visit?id=z');</script></body></html>rö   )rM  r�  r¦   rB  r‚  rƒ  rØ   r:  rG   rO   r   r®  rQ   rb   r   r!  r‡  )rN  r�   r¥   Úrecordrƒ  r*   rœ  Úcatr�  r<  ró  rÓ   rÔ   rñ  rŸ   Úcat_htmlÚrecord_id_strÚsummary_htmlÚcontent_rawÚ	body_htmlÚshow_sourceÚsearch_qÚsearch_sortÚsearch_phaseÚsearch_categoryÚsearch_pageÚsearch_psizera  r‹  s                                r   r7  zSearchHandler.handle_detailN  sJ  € ä˜Ÿ™ v¨t°SÓ9Ó:ˆ	ä˜IÓ&ˆá�t×.Ñ.¨s°KÔ@À&åá�v—z‘z '¨9Ó5Ó6ˆá�f—j‘j Ó(Ò.¨BÓ/ˆà�j‰j˜Ó$Ò*¨ˆà�z‰z˜.Ó)Ò/¨Rˆà—‘˜H kÓ2ˆà—*‘*˜Y¨Ó+ˆà—:‘:˜jÓ)Ò/¨Rˆà—Z‘Z Ó-Ò3°ˆ
à�z‰z˜&Ó!Ò' Rˆä�dœCÔ ¸T¿Z¹ZÈ»_Ö)Z¸ÐPQ×PWÑPWÕPY¨!¯'©'­)Ð)Z $Ð)ZáFIÐ-©f°S«k¨]¸'ÑBÈrˆà.¨y¨k¸¸Y¸KÀtÐLˆáKR”x×(Ñ(¨¸g¸YÕGÐXZˆØ—j‘j ¨BÓ/ˆáœ3˜{Ó+¨bÒ0°e¸{Ñ6JÈhÐZeÑNeØ#‰IÙœS Ó-°Ò2ä ×)Ñ)¨+À7À)ÔL‰IÙœ˜W›¨Ò*Ø$‰IàˆIñ FJÐoÐptÐouð  vAñ  Bð  PRˆà—>‘> &¨#¨rÓ2ˆà—n‘n V¨V°[ÓAˆà—~‘~ f¨g°rÓ:ˆàŸ.™.¨°¸RÓ@ˆà—n‘n V¨V°SÓ9ˆà—~‘~ f¨k¸4Ó@ˆðEˆ÷<Nó Nð  Yð Nð  Z_ð  Y`ð Nð  `oð Nð  psð  otð Nð t+ð Nä+1¯<©<×+=Ñ+=¸hÓ+GÐ*HðNàHNðNàOZÈmðNà[bðNàcoÐbpðNàpzðNð |Kð  {LðNð LRðNð S^ð  R_ðNð _jðNð kwð  jxðNðx;ðNð <A¸'ð	NðB"ð	Nð #+ ðNð ,2ðNð 37°ðNð 8JðNð KOÒJ`ÐR`ÐIaðNð bEðNð FLò  F[ð  P[ð  E\ðNð \DðNð EK÷  EOñ  EOð  PXð  YZó  E[ò  E`ð  _`ð  DaðNða"ðNð #, ðNð-~ðNð Gò  Uð  KUð  ~VðNð VTðNð U]ò  Ukð  akð  TlðNð ltðNð u@ð  tAðNð AIðNð JWð  IXðNðX&ðNð '0 [ðNð 1KôNˆð 	×Ñ  QÕ'ùò_ *[s   Ä&L9Ä<L9c                 óÞ   — t        | j                  |dd«      «      }|r=t        «       }|j                  d|f«       |j	                  «        |j                  «        | j                  dd«       y )Nr   r   z1UPDATE gov_raw SET visits = visits + 1 WHERE id=?rö   Úok)rM  r�  rk   r8   r9   r:   rB  )rN  r�   r¥   r=   s       r   r@  zSearchHandler.handle_visit½  sU   € ä˜Ÿ™ v¨t°SÓ9Ó:ˆ	áä“8ˆDà�L‰LÐLÈyÈlÔ[à�K‰KŒM˜4Ÿ:™:œ<à×Ñ  TÕ*r
   c                 ó(   — | j                  dd«       y )Nrö   z><html><body><h1>Dashboard</h1><p>Coming soon</p></body></html>rÜ  ©rN  s    r   r>  zSearchHandler.handle_dashboardÍ  s   € à×Ñ Ð%eÕfr
   c                 ó*   — | j                  dg i«       y )NÚsources)Ú	send_jsonrO  s    r   r?  z SearchHandler.handle_sources_apiÓ  s   € à�‰˜	 2�Õ'r
   c                 ó2  — t        j                  |d¬«      j                  «       }| j                  d«       | j	                  dd«       | j	                  dt        t        |«      «      «       | j                  «        | j                  j                  |«       y )NFr  rö   r÷   r  r¾  )
rD  rF  rG  r%  r&  rG   rQ   r'  r-  r.  )rN  rß  râ  s      r   rR  zSearchHandler.send_jsonÙ  sq   € ä�J‰J�t¨%Ô0×7Ñ7Ó9ˆà×Ñ˜3Ôà×Ñ˜Ð)JÔKà×ÑÐ)¬3¬s°1«v«;Ô7à×ÑÔà�
‰
×Ñ˜Õr
   c                  ó   — y r'   r(   )rN  ÚformatÚargss      r   Úlog_messagezSearchHandler.log_messageé  s   � r
   N)rA   )rA   rA   rA   )!Ú__name__Ú
__module__Ú__qualname__r^  r1  r0  r;  r<  rË  r�  r$  r2  r(  rA  rB  r4  r5  r@  r6  rÜ  rÛ  r  r8  r9  r  r:  r=  r7  r@  r>  r?  rR  rW  r(   r
   r   rî   rî   %  s½   „ ònRòd	Z,òz(ò>`(òH*ò&FRóT,òòDò<(ò,.ò8ò(l(ò`n(òpEòVn0ó`Q ófwòv6ò|(uòX(uòXhòXQ(òj^(òDk(ò^+ò gò(òó  /r
   rî   rø  rõ   z,/root/gov_crawler/admin_exclude_keywords.txtu   ç”µåŠ›ÚPower)r   r  ÚenÚ	terminalsu   ç»ˆç«¯/æŽ¥æ”¶ç«™Ú	TerminalsÚtransmissionu   ç®¡é�“è¾“é€�ÚTransmissionÚ
productionu   ç”Ÿäº§/å¼€é‡‡Ú
ProductionÚaltfuelu   æ›¿ä»£ç‡ƒæ–™zAlternative FuelÚhpiu   çŸ³æ²¹ç‚¼åˆ¶z%HPI (Hydrocarbon Processing Industry)rp  u   åŒ–å·¥åŠ å·¥z"CPI (Chemical Processing Industry)Úmetalsu   é‡‘å±žä¸ŽçŸ¿ç‰©zMetals & MineralsÚpulpu   åˆ¶æµ†/é€ çº¸/æœ¨æ��zPulp, Paper & WoodÚfoodu   é£Ÿå“�ä¸Žé¥®æ–™zFood & BeverageÚmanufacturingu   å·¥ä¸šåˆ¶é€ zIndustrial Manufacturingro  u   åˆ¶è�¯ä¸Žç”Ÿç‰©æŠ€æœ¯zPharmaceutical & Biotechc                  ó8   — dd l } | j                  t        d¬«      S )Nr   Fr  )rD  rF  r>  )rX  s    r   Úget_industries_jsonrj    s   € ÛØ�8‰8”J¨Uˆ8Ó3Ð3r
   c                 óÞ  — | sydD ]#  }| j                  |«      sŒ| t        |«      d }  n | t        v rt        j                  | d«      S t        j
                  j                  t        | «      }t        j
                  j                  |«      s
dt        | <   y	 t        |dd¬«      5 }|j                  d«      }ddd«       t        j                  dt        j                  «      }|s%t        j                  d	|t        j                  «      }|s%t        j                  d
|t        j                  «      }|r|j                  d«      nd}|t        | <   |S # 1 sw Y   ŒœxY w#  dt        | <   Y yxY w)z9Extract SITE_NAME constant from script source to match DBrA   ©znode zbash zpython3 Nrš   rH   r¿  rò  z$^SITE_NAME\s*=\s*[\"']([^\"']+)[\"']z^NAME\s*=\s*[\"']([^\"']+)[\"']z^SITE\s*=\s*[\"']([^\"']+)[\"']rM   )rP   rQ   Ú_SCRIPT_SITE_CACHErØ   r³   r´   rb   ÚGOV_CRAWLER_DIRr*  r,  r/  r   r   Ú	MULTILINEr   )Úscript_nameÚprefixÚscript_pathr\  Úheadr   rn  s          r   Úextract_script_sitenamert    s?  € áØØ0ò ˆØ×!Ñ! &Õ)Ø%¤c¨&£k lÐ3ˆKÙðð Ô(Ñ(Ü!×%Ñ% k°2Ó6Ð6Ü—'‘'—,‘,œ°Ó<€KÜ�7‰7�>‰>˜+Ô&Ø*,Ô˜;Ñ'ØðÜ�+˜s¨9Ô5ð 	 ¸Ø—6‘6˜$“<ˆD÷	 ô
 	�	‰	Ð>ÀÄbÇlÁlÓS€AÙÜ�I‰IÐ=¸tÄRÇ\Á\ÓRˆÙÜ�I‰IÐ=¸tÄRÇ\Á\ÓRˆÙˆ�‰�Œ˜b€BØ&(Ô�{Ñ#Ø€I÷	 ð 	 ûðØ*,Ô˜;Ñ'Ùús$   ÂE Â&EÂ8E ÅEÅE ÅE,c                 ó  — | sydD ]#  }| j                  |«      sŒ| t        |«      d  }  n | t        v rt        j                  | d«      S t        j
                  j                  t        | «      }t        j
                  j                  |«      s
dt        | <   y	 t        |dd¬«      5 }|j                  d«      }d d d «       t        j                  d«      }|st        j                  d|«      }|st        j                  d	|«      }|st        j                  d
|«      }|st        j                  d|«      }|r |j                  d«      j                  d«      nd}|t        | <   |S # 1 sw Y   Œ®xY w#  dt        | <   Y yxY w)NrA   rl  rš   rH   r¿  rò  zB(?m)^(?:LIST_URL|list_url|listUrl)\s*=\s*["'](https?://[^"']+)["']z?(?m)^(?:API_URL|api_url|apiUrl)\s*=\s*["'](https?://[^"']+)["']zP(?m)^(?:PAGE_URL|SEARCH_URL|search_url|BASE_URL)\s*=\s*["'](https?://[^"']+)["']zY(?m)^(?:BASE|base_url|DOMAIN)\s*=\s*["'](https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}[^"']*)["']z'(https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})rM   rü   )rP   rQ   Ú_SCRIPT_URL_CACHErØ   r³   r´   rb   rn  r*  r,  r/  r   r   r   Úrstrip)rp  rq  rr  r\  rs  r   rÕ   s          r   Úextract_script_urlrx  -  sk  € ÙØØ0ò ˆØ×!Ñ! &Õ)Ø%¤c¨&£k lÐ3ˆKÙðð Ô'Ñ'Ü ×$Ñ$ [°"Ó5Ð5Ü—'‘'—,‘,œ°Ó<€KÜ�7‰7�>‰>˜+Ô&Ø)+Ô˜+Ñ&ØðÜ�+˜s¨9Ô5ð 	 ¸Ø—6‘6˜$“<ˆD÷	 ô 	�	‰	Ð^Ð`dÓe€AáÜ�I‰IÐ_ÐaeÓfˆáÜ�I‰IÐpÐrvÓwˆáÜ�I‰IÐzð  }Aó  BˆáÜ�I‰IÐ@À$ÓGˆÙ$%ˆ!�'‰'�!‹*×
Ñ
˜CÔ
 ¨2€CØ%(Ô�kÑ"Ø€J÷+	 ð 	 ûðØ)+Ô˜+Ñ&Ùús$   ÂE1 Â&E%Â8E1 Å%E.Å*E1 Å1E>c                 ób  — t        j                  t        t        «      «      }t	        |t
        «      rd|i}|r|t        vrdd|› �dœS |d   D ]W  }|d   | k(  sŒ|r||d<   n|j                  dd«       t        j                  |t        t        d«      dd	¬
«       d| |xs ddœc S  dd| › d�dœS )z$Set industry for a crawler in configrù  FzUnknown industry: r  r  r�   Nr  rf  ©r  ÚindentTrA   )r  r  r�   ú	Crawler "ú" not found)	rD  r¤  r,  ÚCONFIG_PATHr:  r9  ÚINDUSTRY_IDSÚpopÚdump)r  Úindustry_idÚcfgr\   s       r   rI  rI  R  sÂ   € ä
�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆÙ�{¬,Ñ6Ø Ð-?À¸}Ð+MÑNÐNØ�‰_ò RˆØˆV‰9˜ÓÙØ +��*’à—‘�j $Ô'Ü�I‰I�cœ4¤¨SÓ1ÀÈaÕPØ#¨T¸{Ò?PÈbÑQÒQðRð ¨°D°6¸Ð'FÑGÐGr
   c                  óÒ  ‡1‡2— t        j                  t        t        «      «      } t	        | t
        «      rd| i} | d   }t        j                  t        «      }t        j                  |_
        |j                  d«      j                  «       }|D �ci c]  }|d   t        |«      “Œ }}d„ }|j                  «       D ��ci c]  \  }} ||«      |“Œ }	}}|j                  «        g }
|D �]Í  }|j!                  d|j!                  d|j!                  dd«      «      «      }|j!                  d|j!                  dd«      «      }|}d	D ]#  }|j#                  |«      sŒ|t%        |«      d
 } n |r$t&        j(                  j+                  t,        |«      nd}|rt&        j(                  j/                  |«      nd}|j!                  |i «      }|s¡d|v r�t	        |d   t
        «      rŠ|d   }|j                  «       D ��cg c]  \  }}||v sŒ|‘Œ }}}|r\t1        d„ |D «       «      t3        d„ |D «       d¬«      t5        d„ |D «       d¬«      t1        d„ |D «       «      t1        d„ |D «       «      dœ}|�sG|	j!                   ||«      i «      }|s( ||«      }|	j                  «       D ]  \  Š2}‰2|v sŒ|} n |s |	j                  «       D ]  \  Š2}‰2v sŒ|} n |si|	j                  «       D ]V  \  Š2}t5        t%        «      t%        ‰2«      «      }|dk\  sŒ*d}t7        |«      D ]  }||   ‰2|   k(  r|dz  }Œ n |dk\  sŒT|} n |sjj9                  d«      d   j9                  d«      d   j9                  d«      d   }t%        |«      dk\  r$|	j                  «       D ]  \  Š2}|‰2v s‰2|v sŒ|} n |sbg d¢}}|D ]$  }|j;                  |«      sŒ|d
t%        |«        } n t%        |«      dk\  r%||k7  r |	j                  «       D ]  \  Š2}|‰2v sŒ|} n |st=        |«      }|r	||v r||   }|sŽ|rŒt&        j(                  j?                  |«      jA                  dd«      }|j#                  d«      rL|dd
 Š1|j                  «       D ]4  \  Š2}‰1sŒ	‰1‰2v s%t%        ‰1«      dk\  sŒtC        ˆ1ˆ2fd„d D «       «      sŒ2|} n |j!                  d!d«      }|j!                  d"d«      }|j!                  d#d«      } |j!                  d$d«      }!|j!                  d%d«      }"dx}#x}$x}%}&|rh|dk7  rc	 dd&l"m"}'m#}(  |'jH                  |d
d' d(«      }) |'jJ                  «       |)z
  }*|* |(d¬)«      k  }#|* |(d*¬)«      k  }$|* |(d+¬)«      k  }%|* |(d,¬)«      k  }&d-}+d},	 t        d.«      5 }-tM        d/«      j                  |-«      }.d
d
d
«       .j!                  |«      }/|/s|.j!                  |«      }/|/r(|/j!                  d0d«      },|/j!                  d1d«      }0|0r|0}+|
jO                  i d|“d|“d2|j!                  d2d3«      “d4|j!                  d4d5«      “d6|j!                  d6d«      “d!|“d7|“d8| “d$|!“d%|"“d9|&“d:|#“d;|$“d<|%“d=|&“d>|“d?|j!                  d?d«      “|j!                  d@d«      |j!                  dg «      tQ        |«      |+|,dAœ¥«       �ŒÐ |
| fS c c}w c c}}w c c}}w #  Y �ŒSxY w# 1 sw Y   �Œ-xY w#  Y ŒæxY w)Bu!   èŽ·å�–æ‰€æœ‰çˆ¬è™«çš„çŠ¶æ€�æ•°æ�®rù  aÍ  
        SELECT site_name,
               COUNT(*) as total,
               MAX(SUBSTR(publish_date,1,10)) as latest_date,
               MIN(SUBSTR(publish_date,1,10)) as oldest_date,
               SUM(CASE WHEN SUBSTR(publish_date,1,10) >= date('now', '-7 days') THEN 1 ELSE 0 END) as week_new,
               SUM(CASE WHEN SUBSTR(publish_date,1,10) >= date('now', '-1 days') THEN 1 ELSE 0 END) as day_new
        FROM gov_raw
        GROUP BY site_name
    rÖ   c                 óæ   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      j                  dd	«      j                  d
d«      j                  dd«      S ©Nr[   rA   r   r   u   â€“u   ï¼ˆr¯   u   ï¼‰rm   u   ã€€õ   Â ©rH   rI   s    r   Ú	normalizez$get_crawler_stats.<locals>.normalizew  s„   € Ø�y‰y˜˜bÓ!×)Ñ)¨%°Ó5×=Ñ=¸eÀSÓI×QÑQÐRWÐY\Ó]×eÑeÐfkÐmpÓq×yÑyÐzð  BDó  E÷  Mñ  Mð  NRð  TVó  Wð  	Wr
   r  ÚscriptrA   Úcommandrl  NFrú  c              3   ó@   K  — | ]  }|j                  d d«      –— Œ y­w)r—   r   NrÍ  ©r)   r   s     r   r+   z$get_crawler_stats.<locals>.<genexpr>Ž  s   è ø€ Ò D°q §¡ w°×!2Ñ Dùó   ‚c              3   óv   K  — | ]1  }|j                  d «      sŒ|d    dk7  sŒ|j                  d d«      –— Œ3 y­w)Úlatest_dater   NrÍ  r�  s     r   r+   z$get_crawler_stats.<locals>.<genexpr>�  óG   è ø€ ò  (HÀaÐVW×V[ÑV[Ð\iÕVjÐopÐq~Ñoð  DGó  pG¨¯©¨m¸S×(Añ  (Hùó   ‚9™9¢9r   )rÎ  c              3   óv   K  — | ]1  }|j                  d «      sŒ|d    dk7  sŒ|j                  d d«      –— Œ3 y­w)Úoldest_dater   NrÍ  r�  s     r   r+   z$get_crawler_stats.<locals>.<genexpr>�  r‘  r’  c              3   ó@   K  — | ]  }|j                  d d«      –— Œ y­w)Úweek_newr   NrÍ  r�  s     r   r+   z$get_crawler_stats.<locals>.<genexpr>‘  s   è ø€ Ò#J¸Q A§E¡E¨*°a×$8Ñ#JùrŽ  c              3   ó@   K  — | ]  }|j                  d d«      –— Œ y­w)Úday_newr   NrÍ  r�  s     r   r+   z$get_crawler_stats.<locals>.<genexpr>’  s   è ø€ Ò"H¸1 1§5¡5¨°A×#6Ñ"HùrŽ  )r—   r�  r”  r–  r˜  rª   r   rM   re  r   õ   Â·rf  )õ   é€šçŸ¥å…¬å‘Šõ   å…¬ç¤ºå…¬å‘Šõ   çŽ¯å¢ƒä¿�æŠ¤õ   çŽ¯è¯„ä¿¡æ�¯õ   çŽ¯è¯„å…¬å‘Šõ   çŽ¯å¢ƒä¿¡æ�¯õ   æ”¿ç­–æ–‡ä»¶u   æ–°é—»ä¸“åŒºõ   çŽ¯è¯„å®¡æ‰¹õ   çŽ¯å¢ƒå½±å“�è¯„ä»·u   é«˜æ–°åŒºåŠ¨æ€�õ   å…¬å‘Šå…¬ç¤ºu   ç”Ÿæ€�çŽ¯å¢ƒä¿�æŠ¤z.pyÚcrawl_c              3   ó,   •K  — | ]  }‰d | ‰v –— Œ y ­wr'   r(   )r)   rñ  Úslugrn  s     €€r   r+   z$get_crawler_stats.<locals>.<genexpr>Õ  s   øè ø€ ÒNoÐbcÈtÐTVÐUVÈxÐ[]Ì~ÑNoùs   ƒ)r¬   rª   rÓ  r—   r�  r”  r–  r˜  )ÚdatetimeÚ	timedeltar2   ú%Y-%m-%d©r“   ro   rp   é´   u	   å¾…è¿�è¡Œú!/root/gov_crawler/run_status.jsonrD  Útsr<  r   u	   æœªåˆ†ç»„ÚenabledTÚnoteÚlatestÚoldestrË  Ú	active_3dÚ	active_7dÚ
active_30dÚactive_180dÚscript_existsr�   rÕ   )rÕ   rú  rÔ   Úlast_run_statusÚlast_run_ts))rD  r¤  r,  r~  r:  r9  r5   r6   Ú	SEARCH_DBri   rj   r8   r…   r†   r=  r:   rØ   rP   rQ   r³   r´   rb   rn  r*  Úsumr„  r†  r…  rO   Úendswithrt  ÚbasenamerH   r-   r§  r¨  ÚstrptimeÚnowÚ
__import__rR   rx  )3rƒ  rù  rº   r›   rš   Údb_statsr‰  r½   rh  Údb_stats_normrd   r\   r  rŠ  Úscript_filerq  rr  r¶  ÚstatsÚsite_names_listÚmatchedÚ	name_normÚmin_lenÚcommonrñ  ÚbaseÚcommon_suffixesÚsfxÚsite_name_from_scriptÚscript_baser—   r°  r±  r–  r˜  r²  r³  r´  rµ  r§  r¨  ÚldÚdeltar·  r¸  rT  Ú_status_mapÚstatus_entryÚ
status_strr¦  rn  s3                                                    @@r   Úget_crawler_statsrÓ  c  sÃ  ù€ ä
�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆØ�:‰€HÜ	�‰œÓ	#€BÜ—[‘[€B„NØ�:‰:ð 	ó 		÷ 
‰‹ð 	ð 26Ö6¨A��+‘¤ Q£Ñ'Ð6€HÐ6òWà19·±Ó1A×B©¨¨A‘Y˜q“\ 1‘_ÐB€MÑBØ‡H�H„JØ€FØó KˆØ�u‰u�V˜QŸU™U ;°·±°hÀÓ0CÓDÓEˆØ—‘�x §¡ y°"Ó!5Ó6ˆàˆØ4ò 	ˆFØ× Ñ  Õ(Ø$¤S¨£[ \Ð2�Ùð	ñ EP”b—g‘g—l‘l¤?°KÔ@ÐUWˆÙ7BœŸ™Ÿ™ {Ô3ÈˆØ—‘˜T 2Ó&ˆá˜¨Ñ*¬z¸!¸L¹/Ì4Ô/PØ ™oˆOØ%-§^¡^Ó%5×N™T˜Q ¸¸oÒ9M’qÐNˆGÑNÙä Ñ D¸GÔ DÓDÜ#&ñ  (HÈ7ô  (Hð  RUô  $VÜ#&ñ  (HÈ7ô  (Hð  RUô  $VÜ #Ñ#JÀ'Ô#JÓ JÜ"Ñ"HÀÔ"HÓHñ�ò à!×%Ñ%¡i°£o°rÓ:ˆEÙá% d›O�	Ø*×0Ñ0Ó2ò ‘E�B˜Ø˜Y’Ø !˜Ùðñ à*×0Ñ0Ó2ò ‘E�B˜Ø  B’Ø !˜Ùðñ à*×0Ñ0Ó2ò "‘E�B˜Ü!¤# i£.´#°b³'Ó:�GØ !“|Ø!"˜Ü!& w£ò &˜AØ(¨™|¨r°!©uÒ4Ø &¨!¡¡á %ð	&ð
 " Q›;Ø$%˜EÙ!ð"ñ à —‘ sÓ+¨AÑ.×4Ñ4°UÓ;¸AÑ>×DÑDÀXÓNÈqÑQ�Ü�t“9 ’>Ø!.×!4Ñ!4Ó!6ò "™˜˜AØ 2™:¨¨tªØ$%˜EÙ!ð"ñ ò#\�ð !�Ø*ò �CØ—}‘} SÕ)Ø# J¤c¨#£h YÐ/˜Ùðô �t“9 ’> d¨iÒ&7Ø!.×!4Ñ!4Ó!6ò "™˜˜AØ 2š:Ø$%˜EÙ!ð"ñ ä(?ÀÓ(GÐ%Ù(Ð-BÀhÑ-NØ$Ð%:Ñ;�EÙáÜ"$§'¡'×"2Ñ"2°6Ó":×"BÑ"BÀ5È"Ó"M�KØ"×-Ñ-¨hÔ7Ø*¨1¨2˜˜Ø%-§^¡^Ó%5ò &™E˜B Ú#¨°©¼¸D»	ÀQ»Ì3ÔNoÐgnÔNoÕKoØ() Ù %ð&ð —	‘	˜' 1Ó%ˆØ—‘˜=¨#Ó.ˆØ—‘˜=¨#Ó.ˆØ—9‘9˜Z¨Ó+ˆØ—)‘)˜I qÓ)ˆØ;@Ð@ˆ	Ð@�IÐ@ 
¨[Ù�f ’mð	ß8Ø&�X×&Ñ& v¨c¨r {°JÓ?�Ø$˜Ÿ™›¨Ñ+�Ø!¡Y°AÔ%6Ñ6�	Ø!¡Y°AÔ%6Ñ6�	Ø"¡i°RÔ&8Ñ8�
Ø#¡y°cÔ':Ñ:�ð &ˆØˆð	ÜÐ9Ó:ð :¸bÜ(¨Ó0×5Ñ5°bÓ9�÷:à&Ÿ?™?¨6Ó2ˆLÙØ*Ÿ™¨tÓ4�ÙØ*×.Ñ.¨t°QÓ7�Ø)×-Ñ-¨h¸Ó;�
ÙØ&0�Oð 	�‰ð 
Ø�Dð
Ø" Fð
Ø,3°Q·U±U¸7ÀKÓ5Pð
à�q—u‘u˜Y¨Ó-ð
à/5°q·u±u¸VÀRÓ7Hð
ð �Uð
ð % fð
ð /7¸ð
ð ˜ð	
ð #,¨Wð	
ð
 �kð
ð
 $/°	ð
ð
 <GÈ	ð
ð ˜*ð
ð '4°[ð
ð ˜]ð
ð ˜Ÿ™˜j¨"Ó-ð
ð —5‘5˜ Ó#ØŸ%™% ¨bÓ1Ü,¨VÓ4Ø.Ø&ò
ö 	ð{KðX �3ˆ;Ðùòg 7ùó Cùó$ OøðxÚú÷
:ñ :ûð	ÙúsJ   ÂZ<Â=[Ç7[È[ÔA"[Ö["Ö[Ö*A["Û[Û[	Û["Û"[&c                 óf  — ddl }ddl}ddl}ddlm} t        j                  t        «      }t
        j                  |_	        g }	g }
g }d}i }|j                  d«      j                  «       }|D ]  }|d   sŒ	|d   sŒ|d   ||d   <   Œ i }|j                  j                  |«      �r	 |j                  t        |«      «      }t!        |t"        «      rd|i}|j%                  dg «      }d	„ }|D �ci c]  } ||«      |“Œ }}|D �]½  }|j%                  d
d«      }|j%                  dd«      }|r|sŒ-d} ||«      }d|v r1t!        |d   t"        «      r|d   D ]  }||v sŒ||   }|�||k  sŒ|}Œ |€	||v r||   }|€||v r|||      }|€9ddl}|j)                  dd|«      j+                  «       } ||«      }||v r|||      }|€,|j-                  «       D ]  \  } }|| v sŒ||   }|�||k  sŒ|}Œ |€,|j-                  «       D ]  \  } }| |v sŒ||   }|�||k  sŒ|}Œ |€u|j-                  «       D ]b  \  } }t/        t1        |«      t1        | «      «      }!|!dk\  sŒ*d}"t3        |!«      D ]  }#||#   | |#   k(  r|"dz  }"Œ n |"dk\  sŒT||   }|�||k  sŒa|}Œd |€`|j5                  d«      d   j5                  d«      d   }$t1        |$«      dk\  r,|j-                  «       D ]  \  } }|$| v sŒ||   }|�||k  sŒ|}Œ |€rg d¢}%|}$|%D ]$  }&|$j7                  |&«      sŒ|$dt1        |&«        }$ n t1        |$«      dk\  r5|$|k7  r0|j-                  «       D ]  \  } }|$| v s| |$v sŒ||   }|�||k  sŒ|}Œ |||<   |��Œr	 |j                  j9                  d|z   «      }'|j                  j;                  |'«      j=                  d«      ||<   �ŒÀ 	 d})|dkD  r	|)d|› d�z  })| dk(  rd}*d}+n| dk(  rd}*d }+nd!}*d"}+d#|*› d$|+› d%|)› d&�},|j                  |,«      j                  «       }-|-D �cg c]  }|d'   ‘Œ	 }.}|-D �cg c]  }|d(   ‘Œ	 }/}i }0|j-                  «       D �]#  \  }1}|€I	 |j                  j9                  d|1› �«      }'|j                  j;                  |'«      j=                  d«      }|dkD  rB|j                  jC                  «       |jE                  |¬)«      z
  j=                  d«      }2||2k  rŒ™| dk(  r|}3n|| dk(  r_|j                  jG                  |d«      jI                  «       }4|4|jE                  |4jK                  «       ¬)«      z
  }5|5j=                  d*«      }3n|dd+ jM                  dd,«      d-z   }3||3f|0|1<   �Œ&  |tN        «      }6tQ        |0j-                  «       d.„ ¬/«      D ]  \  }1\  }}3|6|3xx   dz  cc<   Œ tQ        |6jS                  «       «      }7|7D �8cg c]  }8|6|8   ‘Œ	 }9}8tQ        tU        |.|7z   «      «      }:tW        tY        |.|/«      «      };tW        tY        |7|9«      «      }<|d0k(  rA|:}|:D �8cg c]  }8|;j%                  |8d«      ‘Œ }	}8|:D �8cg c]  }8|<j%                  |8d«      ‘Œ }
}8nZ|:}d1\  }=}>|:D ]N  }8|=|;j%                  |8d«      z  }=|>|<j%                  |8d«      z  }>|	j[                  |=«       |
j[                  |>«       ŒP |j]                  «        ||	|
r|
nd| |||d2œ}?|?S c c}w #  Y �ŒèxY w# t>        $ r}(tA        d|(› �«       Y d}(~(�ŒFd}(~(ww xY wc c}w c c}w #  Y �ŒÔxY wc c}8w c c}8w c c}8w )3uO  
    èŽ·å�–åˆ†æž�æ•°æ�®
    period: day/week/month
    mode: incremental / cumulative
    metric: records (æ•°æ�®é‡�) / è„šæœ¬æ•° (è„šæœ¬æ•°) / both (å�ŒæŒ‡æ ‡)
    days: å›žæº¯å¤©æ•° (0=å…¨éƒ¨)

    è„šæœ¬æ•°æŒ‰å”¯ä¸€è„šæœ¬æ–‡ä»¶(.py)ç»Ÿè®¡ï¼Œè„šæœ¬çš„æ–°å¢žæ—¥æœŸå�–è¯¥è„šæœ¬æ•°æ�®
    åœ¨ search.db ä¸­æœ€æ—©çš„ publish_dateã€‚
    r   N)Údefaultdictrø  a  
        SELECT site_name, MIN(date(publish_date)) as d
        FROM gov_raw WHERE publish_date IS NOT NULL AND SUBSTR(publish_date,1,10) != ''
          AND date(publish_date) IS NOT NULL AND date(publish_date) != '1970-01-01'
        GROUP BY site_name
    rÖ   rÙ   rù  c                 óæ   — | j                  dd«      j                  dd«      j                  dd«      j                  dd«      j                  dd	«      j                  d
d«      j                  dd«      S r†  rˆ  rI   s    r   r‰  z$get_analysis_data.<locals>.normalize8  sa   € Ø—y‘y  bÓ)×1Ñ1°%¸Ó=×EÑEÀeÈSÓQß‘W˜U CÓ(¯©°¸Ó)<¿W¹WÀUÈBÓ=O×PWÑPWÐX^Ð`bÓPcðdr
   rŠ  rA   r  rú  z\(#\d+\)rª   rM   re  r   r   rf  )rš  r›  rœ  r�  rž  rŸ  r   r¡  r¢  r£  u   è¡Œæ”¿è®¸å�¯å…¬ç¤ºz/root/gov_crawler/r©  z get_analysis_data config error: zeWHERE publish_date IS NOT NULL AND SUBSTR(publish_date,1,10) != '' AND date(publish_date) IS NOT NULLz) AND date(publish_date) >= date('now', '-r±   r  zdate(publish_date)Úweekz*date(publish_date, 'weekday 1', '-7 days')u%   strftime('%Y-ç¬¬%Wå‘¨', publish_date)z"strftime('%Y-%m-01', publish_date)u$   strftime('%Yå¹´%mæœˆ', publish_date)z
        SELECT z  as period_date,
               zN as period_label,
               COUNT(*) as cnt
        FROM gov_raw
        zC
        GROUP BY period_date
        ORDER BY period_date ASC
    Úperiod_labelÚcntrª  u   %Y-ç¬¬%Wå‘¨ro   u   å¹´u   æœˆc                 ó   — | d   d   S )NrM   r   r(   rÕ  s    r   r×  z#get_analysis_data.<locals>.<lambda>Ý  s   € ÈÈ1ÉÈaÉ€ r
   ©r¶  r  )r   r   )ÚlabelsÚrecord_countsÚspider_countsr  r  r  r“   )/rD  r³   r§  ÚcollectionsrÕ  r5   r6   r¹  ri   rj   r8   r…   r´   rµ   r¤  r,  r:  r9  rØ   r   rc   r   r=  r†  rQ   r…  rO   r»  ÚgetmtimeÚfromtimestampÚstrftimer;   Úprintr¾  r¨  r½  r�  ÚweekdayrH   rM  rÆ  Úkeysr_   r†   ÚziprR   r:   )@r  r  r  r“   Ú_jsonrP  Ú_dtÚ_ddrº   Úrecords_dataÚspiders_datarÜ  Úcfg_pathÚdb_site_datesr›   rš   Úscripts_maprƒ  rù  r‰  r½   Údb_normr\   rŠ  r  ÚearliestrÆ  rn  rÙ   Ú_reÚcleanÚ
clean_normÚsn_normrÇ  rÈ  rñ  rÉ  rÊ  rË  Úmtimer]  Ú	rec_whereÚrec_date_exprÚrec_label_exprÚq_recÚrec_rowsÚ
rec_labelsÚrec_incÚfiltered_scriptsrJ   ÚcutoffÚplabelÚddÚmondayÚspi_period_cntÚ
spi_labelsÚlÚspi_incÚ
all_labelsÚrec_inc_dictÚspi_inc_dictÚr_carryÚs_carryrd   s@                                                                   r   r  r    so  € ó ÛÛÝ.ä	�‰œÓ	#€BÜ—[‘[€B„NØ€LØ€LØ€FØ:€Hð €MØ�:‰:ð ó 	÷
 
‰‹ð 	ð ò 3ˆØˆ[‹>˜a ›fØ,-¨c©FˆM˜!˜K™.Ò)ð3ð
 €KØ
‡x�x‡��xÕ ðr	:Ø—*‘*œT (›^Ó,ˆCÜ˜#œtÔ$Ø! 3Ð'�Ø—w‘w˜z¨2Ó.ˆHòdð
 1>Ö>¨1‘y “| Q‘Ð>ˆGÐ>àó c�ØŸ™˜x¨Ó,�Ø—u‘u˜V RÓ(�Ù¡TØà�Ù% d›O�	ð   1Ñ$¬°A°l±OÄTÔ)JØ ™oò -˜Ø Ò.Ø -¨bÑ 1˜AØ'Ð/°1°x³<Ø+,¡ð	-ð Ð#¨°Ñ(=Ø,¨TÑ2�Hð Ð#¨	°WÑ(<Ø,¨W°YÑ-?Ñ@�Hð Ð#Û$ØŸG™G K°°TÓ:×@Ñ@ÓB�EÙ!*¨5Ó!1�JØ! WÑ,Ø#0°¸Ñ1DÑ#E˜ð Ð#Ø'.§}¡}£ò -™˜ Ø$¨Ò/Ø -¨bÑ 1˜AØ'Ð/°1°x³<Ø+,¡ð	-ð Ð#Ø'.§}¡}£ò -™˜ Ø" iÒ/Ø -¨bÑ 1˜AØ'Ð/°1°x³<Ø+,¡ð	-ð Ð#Ø'.§}¡}£ò 1™˜ Ü"%¤c¨)£n´c¸'³lÓ"C˜Ø" a›<Ø%&˜FÜ%*¨7£^ò * Ø#,¨Q¡<°7¸1±:Ò#=Ø$*¨a¡K¡Fá$)ð	*ð
  &¨›{Ø$1°"Ñ$5 Ø#+Ð#3°q¸8³|Ø/0¡Hð1ð Ð#Ø$Ÿ?™?¨3Ó/°Ñ2×8Ñ8¸Ó?ÀÑB�DÜ˜4“y A’~Ø+2¯=©=«?ò 1™K˜G RØ# wšØ$1°"Ñ$5 Ø#+Ð#3°q¸8³|Ø/0¡Hð	1ð Ð#ò'S�Oà$�DØ.ò "˜ØŸ=™=¨Õ-Ø#'¨
¬#¨c«(¨Ð#3˜DÙ!ð"ô ˜4“y A’~¨$°)Ò*;Ø+2¯=©=«?ò 1™K˜G RØ# w™°'¸T²/Ø$1°"Ñ$5 Ø#+Ð#3°q¸8³|Ø/0¡Hð	1ð '/�˜FÑ#àÒ#ðØ #§¡× 1Ñ 1Ð2FÈÑ2OÓ P˜Ø.1¯l©l×.HÑ.HÈÓ.O×.XÑ.XÐYcÓ.d˜ FÓ+ñCcðN x€IØˆa‚xØÐ@ÀÀÀgÐNÑNˆ	à�‚Ø,ˆØ-‰Ø	�6Ò	ØDˆØ@‰à<ˆØ?ˆðØˆð ØÐð  	ð 
ˆð ð€Eð �z‰z˜%Ó ×)Ñ)Ó+€HØ-5Ö6¨�!�NÓ#Ð6€JÐ6Ø!)Ö*˜Aˆq�‹xÐ*€GÐ*ð ÐØ×!Ñ!Ó#ó *‰ˆˆ1Øˆ9ðØŸ™×)Ñ)Ð,>¸q¸cÐ*BÓC�Ø—L‘L×.Ñ.¨uÓ5×>Ñ>¸zÓJ�ð �!Š8Ø—l‘l×&Ñ&Ó(¨3¯=©=¸d¨=Ó+CÑC×MÑMÈjÓYˆFØ�6ŠzØà�UŠ?Ø‰FØ�vÒØ—‘×&Ñ& q¨*Ó5×:Ñ:Ó<ˆBØ˜#Ÿ-™-¨R¯Z©Z«\˜-Ó:Ñ:ˆFØ—_‘_ ]Ó3‰Fà�r˜�U—]‘] 3¨Ó.°Ñ6ˆFØ  &˜kÐ˜Óð+*ñ0 œ“X€NÜ Ð!1×!7Ñ!7Ó!9Ñ?PÔQò $‰ˆ‰;ˆAˆvØ�vÓ !Ñ#Ôð$ä˜×+Ñ+Ó-Ó.€JØ*4Ö5 Qˆ~˜aÓ Ð5€GÐ5ô œ˜J¨Ñ3Ó4Ó5€JÜœ˜J¨Ó0Ó1€LÜœ˜J¨Ó0Ó1€Làˆ}ÒØˆØ8BÖC°1˜×(Ñ(¨¨AÕ.ÐCˆÐCØ8BÖC°1˜×(Ñ(¨¨AÕ.ÐCˆÑCàˆØÑˆ�Øò 	)ˆAØ�|×'Ñ'¨¨1Ó-Ñ-ˆGØ�|×'Ñ'¨¨1Ó-Ñ-ˆGØ×Ñ Ô(Ø×Ñ Õ(ð		)ð ‡H�H„Jð Ø%Ù)5™¸4ØØØØñ€Fð €MùòE ?øðHÚûÜò 	:ÜÐ4°Q°CÐ8×9Ò9ûð	:üò6 7ùÚ*øðÚüò* 6ùò DùÚCsÇ   Â'A[- Ã.[ Ã>A[- Å[- Å*A4[- Ç[- Ç, [- È[- È?[- É)[- Ê[- ÊA[- Ë&[- Ë3"[- ÌA[- Í[- Í'[- Í5A[%Ï [- Ð\Ð-\ÑA\×\$Ø+\)Ù
\.Û [- Û%[*Û'[- Û-	\Û6\
Ü
\Ü\!c            
      ó:	  — t        «       \  } }t        | «      }ddl} |j                  t        «      j                  d«      j                  «       d   } |j                  t        «      j                  «        t        d„ | D «       «      }t        d„ | D «       «      }t        d„ | D «       «      }t        d„ | D «       «      }i }	| D ]M  }
|
d   }||	vr	dddd	œ|	|<   |	|   d
xx   dz  cc<   |	|   dxx   |
d
   z  cc<   |
d   sŒ>|	|   dxx   dz  cc<   ŒO ddl	m	}  |j                  «       j                  d«      }t        d„ | D «       «      }t        d„ | D «       «      }g }d}	 t        t        «      5 }|j                  «       j                  «       }ddd«       |j!                  dj#                  g d‘t%        j&                  |«      › ‘d‘|› ‘d‘|› ‘d‘|r||z  dz  ndd›‘d‘|› ‘d‘|r||z  dz  ndd›‘d‘|› ‘d‘|r||z  dz  ndd›‘d‘|› ‘d‘|r||z  dz  ndd›‘d‘|› ‘d ‘|› ‘d!‘|› ‘d"‘|› ‘d#‘|› ‘d$‘«      «       t)        |	j+                  «       «      D ]#  \  }}|j!                  d%|› d&|› d'|d
   › d$�«       Œ% |j!                  d(«       t)        | d)„ ¬*«      D �]À  }
|
d   rd+n|
d,   dkD  rd-nd.}|
d/   }|
d0   s
d1|
d/   › d2�}n|
j-                  d3d4«      s	d5|
d/   › d2�}|
j-                  d6d«      xs |
j-                  d7d«      }|rd8|›d9|›d:|dd; ›d<�}nd=}|
d>   }d?|v rd@ndA|v rdBndC|v rdDndE|v sdF|v rdGndH}|
dI   dJz   |
d/   z   dJz   |xs dz   j/                  «       j1                  dKd«      }|
j-                  d3d4«      sdL}n"d?|v rdM}ndA|v rdN}ndC|v rdO}ndE|v sdF|v rdP}ndQ}|
j-                  d3d4«      sdRnd}|j!                  dj#                  g dS‘|› ‘dT‘|› ‘dK‘|› ‘dU‘|› ‘dV‘|
dI   › ‘dW‘|
dI   › ‘dX‘|
d
   › ‘dY‘|
dZ   xs dd[k7  r|
dZ   xs ddd\ nd[› ‘dX‘|
d,   › ‘d]‘|
d   rd?ndE› ‘d^‘|
d   › ‘d_‘|› ‘d`‘|› ‘da‘|› ‘db‘|› ‘dc‘«      «       �ŒÃ |j!                  dd«       dj#                  |«      S # 1 sw Y   �ŒúxY w#  Y �ŒxY w)eu   æ¸²æŸ“çˆ¬è™«ç®¡ç�†HTMLé¡µé�¢r   Nr›  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)r²  rM   Nr(   ©r)   r\   s     r   r+   z$render_admin_page.<locals>.<genexpr>  ó   è ø€ Ò:˜!¨1¨[«>”AÑ:ùó   ‚
�c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)r³  rM   Nr(   r  s     r   r+   z$render_admin_page.<locals>.<genexpr>  r  r  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)r´  rM   Nr(   r  s     r   r+   z$render_admin_page.<locals>.<genexpr>  s   è ø€ Ò<˜1¨A¨l«O”QÑ<ùr  c              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rµ  rM   Nr(   r  s     r   r+   z$render_admin_page.<locals>.<genexpr>  s   è ø€ Ò>˜A¨Q¨}Ó-=”aÑ>ùr  r   )r—   ÚrecordsrË  r—   rM   r  rË  )r§  z%Y-%m-%d %H:%Mc              3   ó&   K  — | ]	  }|d    –— Œ y­w)r–  Nr(   r  s     r   r+   z$render_admin_page.<locals>.<genexpr>  s   è ø€ Ò5 q�Q�z•]Ñ5ùrî  c              3   ó&   K  — | ]	  }|d    –— Œ y­w)r˜  Nr(   r  s     r   r+   z$render_admin_page.<locals>.<genexpr>  s   è ø€ Ò3 Q�A�i•LÑ3ùrî  rA   u  <!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>çˆ¬è™«ç®¡ç�†é�¢æ�¿</title>
<script src="/static/chart.umd.min.js"></script>
    <script>var savedExcludeKeywords = u%  ;</script>
<style>
* { margin:0; padding:0; box-sizing:border-box; }
body { font-family: -apple-system, sans-serif; background:#f5f6fa; color:#333; padding:20px; }
h1 { font-size:22px; margin-bottom:20px; }
.tabs { display:flex; gap:0; margin-bottom:20px; }
.tab-btn { padding:8px 24px; border:1px solid #ccc; background:#fff; cursor:pointer; font-size:14px; font-weight:500; }
.tab-btn:first-child { border-radius:6px 0 0 6px; }
.tab-btn:last-child { border-radius:0 6px 6px 0; }
.tab-btn.active { background:#3498db; color:#fff; border-color:#3498db; }
.tab-btn:hover:not(.active) { background:#eef; }
.tab-content { display:none; }
.tab-content.active { display:block; }
.stats-row { display:flex; gap:12px; flex-wrap:wrap; margin-bottom:20px; }
.stat-card { background:#fff; border-radius:8px; padding:14px 18px; flex:1; min-width:120px; box-shadow:0 1px 3px rgba(0,0,0,0.08); }
.stat-card .num { font-size:28px; font-weight:700; }
.stat-card .label { font-size:13px; color:#888; margin-top:4px; }
.stat-card.green .num { color:#27ae60; }
.stat-card.blue .num { color:#2980b9; }
.stat-card.red .num { color:#e74c3c; }
.active-card { flex:2; min-width:220px; }
.active-rows { display:flex; flex-direction:column; gap:6px; }
.active-row { display:flex; align-items:center; gap:8px; font-size:13px; }
.active-row .period { width:48px; color:#666; text-align:right; flex-shrink:0; }
.active-row .bar { flex:1; height:6px; background:#eee; border-radius:3px; overflow:hidden; }
.active-row .bar .fill { height:100%; border-radius:3px; transition:width 0.5s; }
.active-row .count { width:32px; font-weight:700; text-align:right; flex-shrink:0; }
.active-row:nth-child(1) .bar .fill { background:#e74c3c; }
.active-row:nth-child(2) .bar .fill { background:#e67e22; }
.active-row:nth-child(3) .bar .fill { background:#2980b9; }
.active-row:nth-child(4) .bar .fill { background:#27ae60; }
.filters { margin-bottom:15px; display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
.filters input { padding:5px 10px; border:1px solid #ccc; border-radius:15px; font-size:13px; outline:none; width:200px; }
.filters input:focus { border-color:#3498db; }
.filters button { padding:5px 14px; border:1px solid #ccc; border-radius:15px; background:#fff; cursor:pointer; font-size:13px; }
.filters button.active { background:#3498db; color:#fff; border-color:#3498db; }
.filters button:hover { background:#eef; }
table { width:100%; border-collapse:collapse; font-size:13px; background:#fff; border-radius:6px; overflow:hidden; box-shadow:0 1px 3px rgba(0,0,0,0.08); }
th { background:#2c3e50; color:#fff; padding:8px 10px; text-align:left; font-weight:500; white-space:nowrap; }
td { padding:7px 10px; border-bottom:1px solid #eee; }
tr:hover { background:#f0f7ff; }
.badge { display:inline-block; padding:1px 8px; border-radius:10px; font-size:11px; font-weight:500; }
.badge-green { background:#d4edda; color:#155724; }
.badge-red { background:#f8d7da; color:#721c24; }
.badge-gray { background:#e2e3e5; color:#383d41; }
.missing-script { color:#e74c3c; font-weight:bold; }
.nowrap { white-space:nowrap; }
.analysis-controls { display:flex; gap:12px; flex-wrap:wrap; margin-bottom:16px; align-items:center; }
.control-group { display:flex; gap:4px; align-items:center; }
.control-group label { font-size:13px; color:#666; margin-right:4px; }
.control-group select, .control-group button {
  padding:5px 12px; border:1px solid #ccc; border-radius:4px; background:#fff; font-size:13px; cursor:pointer;
}
.control-group button.active-ctrl {
  background:#3498db; color:#fff; border-color:#3498db;
}
.chart-container { background:#fff; border-radius:8px; padding:20px; box-shadow:0 1px 3px rgba(0,0,0,0.08); margin-bottom:20px; min-height:350px; }
.chart-summary { display:flex; gap:16px; flex-wrap:wrap; margin-top:12px; }
.chart-stat { font-size:14px; }
.chart-stat span { font-weight:700; color:#2980b9; }
th { cursor:pointer; user-select:none; }
th.sort-asc::after { content:" â–²"; font-size:11px; }
th.sort-desc::after { content:" â–¼"; font-size:11px; }
@media(max-width:700px) { table { font-size:12px; } th,td { padding:5px 6px; } }
</style>
</head>
<body>
<h1>ðŸ”� çˆ¬è™«ç®¡ç�†é�¢æ�¿</h1>
<div class="tabs">
  <button class="tab-btn active" onclick="switchTab(event,'tab-manage')">ðŸ“‹ ç®¡ç�†è§†å›¾</button>
  <button class="tab-btn" onclick="switchTab(event,'tab-analysis')">ðŸ“Š åˆ†æž�è§†å›¾</button>
  <button class="tab-btn" onclick="window.location.href='/'">ðŸ”™ è¿”å›žæ�œç´¢</button>
</div>

<!-- TAB 1: ç®¡ç�†è§†å›¾ -->
<div id="tab-manage" class="tab-content active">
<div class="stats-row">
  <div class="stat-card green"><div class="num">ud   </div><div class="label">æ€»æ•°æ�®æ�¡æ•°</div></div>
  <div class="stat-card blue"><div class="num">u  </div><div class="label">çˆ¬è™«æ•°</div></div>
  <div class="stat-card active-card">
    <div class="label">æ´»è·ƒç«™ç‚¹ï¼ˆå�¯ç”¨æ•°ï¼‰</div>
    <div class="active-rows">
      <div class="active-row"><span class="period">è¿‘3æ—¥</span><div class="bar"><div class="fill" style="width:rÐ  z.0fz9%"></div></div><span class="count" style="color:#e74c3c">u   </span></div>
      <div class="active-row"><span class="period">è¿‘7æ—¥</span><div class="bar"><div class="fill" style="width:z9%"></div></div><span class="count" style="color:#e67e22">u   </span></div>
      <div class="active-row"><span class="period">è¿‘1æœˆ</span><div class="bar"><div class="fill" style="width:z9%"></div></div><span class="count" style="color:#2980b9">u�   </span></div>
      <div class="active-row"><span class="period">è¿‘å�Šå¹´</span><div class="bar"><div class="fill" style="width:z9%"></div></div><span class="count" style="color:#27ae60">zS</span></div>
    </div>
  </div>
  <div class="stat-card green"><div class="num">+ub   </div><div class="label">ä»Šæ—¥æ–°å¢ž</div></div>
  <div class="stat-card blue"><div class="num">+uŒ  </div><div class="label">è¿‘7æ—¥æ–°å¢ž</div></div>
  <div class="stat-card" id="daily-run-card" style="cursor:pointer; background:#f0fdf4; border:2px dashed #27ae60;" onclick="runDaily()">
    <div class="num" style="font-size:22px;" id="daily-run-icon">â–¶ï¸�</div>
    <div class="label" id="daily-run-label">æ‰‹åŠ¨æ—¥è·‘</div>
  </div>
</div>
<div id="daily-run-log" style="display:none; background:#1e1e1e; color:#0f0; padding:12px; border-radius:6px; margin-top:10px; max-height:300px; overflow-y:auto; font-family:monospace; font-size:11px; white-space:pre-wrap;"></div>
<div style="font-size:12px; color:#999; margin-bottom:15px;">æ›´æ–°æ—¶é—´: uÂ  </div>
<div class="exclude-row" style="margin-bottom:10px;display:flex;gap:6px;align-items:center;flex-wrap:wrap;">
  <span style="font-size:12px;color:#666;">æŽ’é™¤å…³é”®è¯�ï¼ˆé€—å�·åˆ†éš”ï¼‰ï¼š</span>
  <input type="text" id="exclude-keywords" placeholder="æŽ’é™¤å…³é”®è¯�ï¼ˆé€—å�·åˆ†éš”ï¼‰" style="width:220px" oninput="applyExclude()">
  <button onclick="saveExclude()" style="padding:5px 14px;border:1px solid #e67e22;border-radius:15px;background:#fff;color:#e67e22;cursor:pointer;font-size:13px;">ðŸ’¾ ä¿�å­˜æŽ’é™¤</button>
  <span id="exclude-status" style="font-size:12px;color:#999;display:none;"></span>
</div>
<div class="filters">
  <button class="active" onclick="filterGroup('all')">å…¨éƒ¨ (z)</button>
z   <button onclick="filterGroup('z')">z (u(	  </div>
<div class="status-filters" style="margin:10px 0;display:flex;gap:6px;flex-wrap:wrap;align-items:center;">
  <span style="font-size:12px;color:#888;margin-right:4px;">çŠ¶æ€�ç­›é€‰:</span>
  <button class="active" onclick="filterStatus('all')" id="sf-all" style="padding:4px 12px;border:1px solid #ccc;border-radius:12px;background:#fff;cursor:pointer;font-size:12px;">å…¨éƒ¨</button>
  <button onclick="filterStatus('success')" id="sf-success" style="padding:4px 12px;border:1px solid #27ae60;border-radius:12px;background:#fff;cursor:pointer;font-size:12px;color:#27ae60;">âœ… æˆ�åŠŸ</button>
  <button onclick="filterStatus('timeout')" id="sf-timeout" style="padding:4px 12px;border:1px solid #e67e22;border-radius:12px;background:#fff;cursor:pointer;font-size:12px;color:#e67e22;">â�° è¶…æ—¶</button>
  <button onclick="filterStatus('fail')" id="sf-fail" style="padding:4px 12px;border:1px solid #e74c3c;border-radius:12px;background:#fff;cursor:pointer;font-size:12px;color:#e74c3c;">â�Œ å¤±è´¥</button>
  <button onclick="filterStatus('unreachable')" id="sf-unreachable" style="padding:4px 12px;border:1px solid #8e44ad;border-radius:12px;background:#fff;cursor:pointer;font-size:12px;color:#8e44ad;">ðŸš« ä¸�å�¯è¾¾</button>
  <button onclick="filterStatus('pending')" id="sf-pending" style="padding:4px 12px;border:1px solid #999;border-radius:12px;background:#fff;cursor:pointer;font-size:12px;color:#999;">â�³ å¾…è¿�è¡Œ</button>
  <button onclick="filterStatus('disabled')" id="sf-disabled" style="padding:4px 12px;border:1px solid #bbb;border-radius:12px;background:#f5f5f5;cursor:pointer;font-size:12px;color:#999;">â�¹ï¸� ç¦�ç”¨</button>
</div>
<table id="crawler-table">
<thead><tr>
  <th onclick="sortTable(0)" style="cursor:pointer">çŠ¶æ€�</th><th onclick="sortTable(1)" style="cursor:pointer">å��ç§°</th><th onclick="sortTable(2)" style="width:60px;cursor:pointer">æ�¡æ•°</th><th onclick="sortTable(3)" style="width:90px;cursor:pointer">æœ€æ–°</th>
  <th onclick="sortTable(4)" style="width:70px;cursor:pointer">7æ—¥æ–°å¢ž</th><th onclick="sortTable(5)" style="width:60px;cursor:pointer">æ´»è·ƒ</th><th onclick="sortTable(6)" style="cursor:pointer">åˆ†ç»„</th><th onclick="sortTable(7)" style="cursor:pointer">è„šæœ¬</th><th style="width:200px">æ�¥æº�URL</th><th style="width:80px">æ—¥è·‘çŠ¶æ€�</th>
</tr></thead>
<tbody>
c                 ó^   — | j                  d«      xs dd d d…   | j                  dd«       fS )Nr°  rA   rý   r—   r   rÍ  rÕ  s    r   r×  z#render_admin_page.<locals>.<lambda>¨  s1   € ¨a¯e©e°H«oÒ.CÀÁTÀrÀTÑ-JÈQÏUÉUÐSZÐ[\ÓM]ÐL]Ð,^€ r
   rÛ  u   ðŸŸ¢r–  u   ðŸŸ¡u   âšªrŠ  r¶  u!   <span class="missing-script">âš  ry  r®  Tu    <span style="color:#999">â�¹ï¸� rÕ   rÔ   r£  z" target="_blank" title="z=" style="color:#2980b9;font-size:11px;text-decoration:none;">é7   r¡  z2<span style="color:#ccc; font-size:11px;">-</span>r·  õ   âœ…z#27ae60u   â�°z#e67e22u   ðŸš«z#8e44adõ   â�Œu   ðŸ�›z#e74c3cz#999r  r[   rE   Údisabledr  r4   ÚunreachableÚfailÚpendingz style="opacity:0.5"z<tr data-search="z" data-status="z>
  <td>zi</td>
  <td style="max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" title="ru  z%</td>
  <td style="text-align:right">z</td>
  <td class="nowrap">r°  r   r2   z9</td>
  <td class="active-col" style="text-align:center">z</td>
  <td>zr</td>
  <td style="font-size:11px; max-width:120px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">zr</td>
  <td style="font-size:11px; max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">z<</td>
  <td style="font-size:12px; text-align:center; color:z;">z</td>
</tr>
u÷3  </tbody></table>
<div id="tab-analysis" class="tab-content">
  <div class="analysis-controls">
    <div class="control-group">
      <label>æ—¶é—´è½´</label>
      <select id="period-select" onchange="loadChart()">
        <option value="day">æŒ‰æ—¥</option>
        <option value="week">æŒ‰å‘¨</option>
        <option value="month">æŒ‰æœˆ</option>
      </select>
    </div>
    <div class="control-group">
      <label>çºµè½´</label>
      <button id="mode-inc" class="active-ctrl" onclick="setMode('incremental')">å�•æ—¥å¢žé‡�</button>
      <button id="mode-cum" onclick="setMode('cumulative')">ç´¯è®¡æ€»é‡�</button>
    </div>
    <div class="control-group">
      <label>æŒ‡æ ‡</label>
      <button id="metric-both" class="active-ctrl" onclick="setMetric('both')">å�ŒæŒ‡æ ‡</button>
      <button id="metric-records" onclick="setMetric('records')">æ•°æ�®é‡�</button>
      <button id="metric-spiders" onclick="setMetric('spiders')">è„šæœ¬æ•°</button>
    </div>
    <div class="control-group">
      <label>æ—¶é—´èŒƒå›´</label>
      <select id="range-select" onchange="loadChart()">
        <option value="30">è¿‘30å¤©</option>
        <option value="90" selected>è¿‘90å¤©</option>
        <option value="180">è¿‘å�Šå¹´</option>
        <option value="365">è¿‘ä¸€å¹´</option>
        <option value="0">å…¨éƒ¨</option>
      </select>
    </div>
  </div>
  <div style="font-size:12px; color:#888; margin-bottom:8px;">
    <span style="display:inline-block; width:12px; height:3px; background:#3498db; margin-right:4px; vertical-align:middle;"></span> æ•°æ�®é‡�
    <span style="display:inline-block; width:12px; height:3px; background:#27ae60; margin-left:12px; margin-right:4px; vertical-align:middle;"></span> è„šæœ¬æ•°
  </div>
  <div class="chart-container">
    <canvas id="analysis-chart" height="80"></canvas>
  </div>
  <div id="chart-summary" class="chart-summary"></div>
</div>  <!-- end tab-analysis -->

<script>
var currentMode = 'incremental';
var currentMetric = 'both';
var chartInstance = null;

function switchTab(event, tabId) {
  document.querySelectorAll('.tab-content').forEach(t => t.classList.remove('active'));
  document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
  document.getElementById(tabId).classList.add('active');
  event.target.classList.add('active');
  if (tabId === 'tab-analysis') loadChart();
}

function setMode(mode) {
  currentMode = mode;
  document.getElementById('mode-inc').classList.toggle('active-ctrl', mode === 'incremental');
  document.getElementById('mode-cum').classList.toggle('active-ctrl', mode === 'cumulative');
  loadChart();
}

function setMetric(metric) {
  currentMetric = metric;
  document.getElementById('metric-both').classList.toggle('active-ctrl', metric === 'both');
  document.getElementById('metric-records').classList.toggle('active-ctrl', metric === 'records');
  document.getElementById('metric-spiders').classList.toggle('active-ctrl', metric === 'spiders');
  loadChart();
}

function filterGroup(group) {
  const rows = document.querySelectorAll('#crawler-table tbody tr');
  const btns = document.querySelectorAll('.filters button');
  btns.forEach(b => b.classList.remove('active'));
  event.target.classList.add('active');
  rows.forEach(r => {
    const groupCell = r.querySelector('td:nth-child(7)').textContent;
    r.style.display = (group === 'all' || groupCell === group) ? '' : 'none';
  });
}

function saveExclude() {
  const kw = document.getElementById('exclude-keywords').value.trim();
  const status = document.getElementById('exclude-status');
  status.style.display = 'inline';
  status.textContent = 'â�³ ä¿�å­˜ä¸­...';
  fetch('/crawler/admin/save-exclude?kw=' + encodeURIComponent(kw))
    .then(r => r.json())
    .then(data => {
      status.textContent = data.success ? 'âœ… å·²ä¿�å­˜' : 'â�Œ å¤±è´¥: ' + (data.error || '');
      setTimeout(() => { status.style.display = 'none'; }, 2000);
    })
    .catch(e => {
      status.textContent = 'â�Œ è¯·æ±‚å¤±è´¥';
      setTimeout(() => { status.style.display = 'none'; }, 2000);
    });
}

function applyExclude() {
  // ä»…ç”¨äºŽä¿�å­˜æŽ’é™¤å…³é”®è¯�ï¼Œå®žé™…æŽ’é™¤åœ¨ /crawler/ æ�œç´¢é¡µç”Ÿæ•ˆï¼ˆhandle_db_list æœ�åŠ¡ç«¯è¿‡æ»¤ï¼‰
}

// é¡µé�¢åŠ è½½æ—¶å¡«å……å·²ä¿�å­˜çš„æŽ’é™¤å…³é”®è¯�
document.addEventListener('DOMContentLoaded', function() {
  var input = document.getElementById('exclude-keywords');
  if (input && typeof savedExcludeKeywords !== 'undefined') {
    input.value = savedExcludeKeywords;
  }
});

function loadChart() {
  var period = document.getElementById('period-select').value;
  var days = document.getElementById('range-select').value;
  var mode = currentMode;
  var metric = currentMetric;
  var summaryDiv = document.getElementById('chart-summary');
  summaryDiv.innerHTML = '<div class="chart-stat">â�³ åŠ è½½ä¸­...</div>';
  fetch('/crawler/admin/analysis?period=' + period + '&mode=' + mode + '&metric=' + metric + '&days=' + days)
    .then(r => r.json())
    .then(data => {
      if (!data.labels || data.labels.length === 0) {
        summaryDiv.innerHTML = '<div class="chart-stat">æš‚æ— æ•°æ�®</div>';
        return;
      }
      renderChart(data);
      var unit = period === 'month' ? 'æœˆ' : (period === 'week' ? 'å‘¨' : 'æ—¥');
      var rc = data.record_counts || [];
      var sc = data.spider_counts || [];
      // Records stats
      var r_total = rc.length > 0 ? rc[rc.length - 1] : 0;
      var r_sum = rc.reduce(function(a,b){return a+b}, 0);
      var r_avg = rc.length > 0 ? (r_sum / rc.length).toFixed(1) : '0';
      var r_max = rc.length > 0 ? Math.max.apply(null, rc) : 0;
      // Spider stats
      var s_total = sc.length > 0 ? sc[sc.length - 1] : 0;
      var s_sum = sc.reduce(function(a,b){return a+b}, 0);
      var s_avg = sc.length > 0 ? (s_sum / sc.length).toFixed(1) : '0';
      var s_max = sc.length > 0 ? Math.max.apply(null, sc) : 0;
      summaryDiv.innerHTML =
        '<div class="chart-stat" style="border-right:1px solid #ddd; padding-right:16px;">' +
          '<b style="color:#3498db">ðŸ“Š æ•°æ�®é‡�</b> æ€»è®¡: <span>' + r_total + '</span> | ' +
          'å�‡å€¼: <span>' + r_avg + '</span>/' + unit + ' | å³°å€¼: <span>' + r_max + '</span>/' + unit +
        '</div>' +
        '<div class="chart-stat">' +
          '<b style="color:#27ae60">ðŸ“œ è„šæœ¬æ•°</b> æ€»è®¡: <span>' + s_total + '</span> | ' +
          'å�‡å€¼: <span>' + s_avg + '</span>/' + unit + ' | å³°å€¼: <span>' + s_max + '</span>/' + unit +
        '</div>' +
        '<div class="chart-stat" style="color:#888; border-left:1px solid #ddd; padding-left:16px;">ðŸ—“ <span>' + data.labels.length + '</span> ä¸ªæ—¶é—´åŒºé—´</div>';
    })
    .catch(function(err) {
      summaryDiv.innerHTML = '<div class="chart-stat" style="color:red">åŠ è½½å¤±è´¥: ' + err.message + '</div>';
    });
}

function renderChart(data) {
  var ctx = document.getElementById('analysis-chart').getContext('2d');
  if (chartInstance) chartInstance.destroy();

  var isCum = currentMode === 'cumulative';
  var labelSuffix = isCum ? 'ç´¯è®¡' : 'å¢žé‡�';

  var labels = data.labels;
  var rc = data.record_counts || [];
  var sc = data.spider_counts || [];

  if (labels.length > 120) {
    var step = Math.ceil(labels.length / 120);
    var nl = [], nrc = [], nsc = [];
    for (var i = 0; i < labels.length; i += step) {
      nl.push(labels[i]);
      nrc.push(rc[i] || 0);
      nsc.push(sc[i] || 0);
    }
    if (nl[nl.length-1] !== labels[labels.length-1]) {
      nl.push(labels[labels.length-1]);
      nrc.push(rc[rc.length-1] || 0);
      nsc.push(sc[sc.length-1] || 0);
    }
    labels = nl; rc = nrc; sc = nsc;
  }

  var datasets = [];
  var activeMetric = currentMetric;

  if (activeMetric === 'records' || activeMetric === 'both') {
    datasets.push({
      label: 'æ•°æ�®é‡� (' + labelSuffix + ')', data: rc, fill: true,
      backgroundColor: 'rgba(52,152,219,0.15)',
      borderColor: 'rgba(52,152,219,0.85)',
      pointBackgroundColor: 'rgba(52,152,219,1)',
      pointRadius: 2, pointHoverRadius: 5,
      borderWidth: 2, tension: 0.35,
    });
  }

  if (activeMetric === 'spiders' || activeMetric === 'both') {
    datasets.push({
      label: 'è„šæœ¬æ•° (' + labelSuffix + ')', data: sc, fill: true,
      backgroundColor: 'rgba(39,174,96,0.12)',
      borderColor: 'rgba(39,174,96,0.85)',
      pointBackgroundColor: 'rgba(39,174,96,1)',
      pointRadius: 2, pointHoverRadius: 5,
      borderWidth: 2, tension: 0.35,
      yAxisID: 'y',
    });
  }

  chartInstance = new Chart(ctx, {
    type: 'line',
    data: { labels: labels, datasets: datasets },
    options: {
      responsive: true, maintainAspectRatio: false,
      interaction: { mode: 'index', intersect: false },
      plugins: {
        legend: { display: datasets.length > 1, position: 'top' },
        tooltip: { callbacks: { label: function(ctx) { return ctx.dataset.label + ': ' + ctx.parsed.y; } } }
      },
      scales: {
        x: { grid: { display: false }, ticks: { font: { size: 11 }, maxRotation: 45 } },
        y: { beginAtZero: true, grid: { color: 'rgba(0,0,0,0.06)' }, ticks: { font: { size: 11 } } }
      }
    }
  });
}

// Daily run
var dailyCheckTimer = null;
function runDaily() {
  var card = document.getElementById('daily-run-card');
  var icon = document.getElementById('daily-run-icon');
  var label = document.getElementById('daily-run-label');
  var logDiv = document.getElementById('daily-run-log');
  icon.textContent = 'â�³'; label.textContent = 'å�¯åŠ¨ä¸­...';
  card.style.cursor = 'default'; card.onclick = null;
  fetch('/crawler/admin/run-daily').then(function(r){return r.json()}).then(function(data){
    if (data.running) {
      icon.textContent = 'ðŸ”„'; label.textContent = 'è¿�è¡Œä¸­...';
      logDiv.style.display = 'block';
      logDiv.textContent = data.message + '\n\næ—¥å¿—å�³å°†åˆ·æ–°...';
      dailyCheckTimer = setInterval(checkStatus, 5000);
      checkStatus();
    } else {
      icon.textContent = 'â�Œ'; label.textContent = data.message;
      setTimeout(resetButton, 3000);
    }
  }).catch(function(e){ icon.textContent = 'â�Œ'; label.textContent = 'ç½‘ç»œé”™è¯¯'; setTimeout(resetButton, 3000); });
}
function checkStatus() {
  fetch('/crawler/admin/run-status').then(function(r){return r.json()}).then(function(data){
    var icon = document.getElementById('daily-run-icon');
    var label = document.getElementById('daily-run-label');
    var logDiv = document.getElementById('daily-run-log');
    if (data.running && data.log_tail) logDiv.textContent = data.log_tail;
    if (!data.running) {
      icon.textContent = 'âœ…'; label.textContent = 'æ—¥è·‘å®Œæˆ�';
      if (dailyCheckTimer) { clearInterval(dailyCheckTimer); dailyCheckTimer = null; }
      setTimeout(function(){ location.reload(); }, 3000);
    }
  });
}
function editUrl(el, name) {
  var currentUrl = el.textContent === '+æ·»åŠ URL' ? '' : el.textContent;
  var newUrl = prompt('è¯·è¾“å…¥ ' + name + ' çš„æ�¥æº�URL:', currentUrl);
  if (newUrl === null) return;
  if (newUrl === currentUrl) return;
  fetch('/crawler/admin/set-url?name=' + encodeURIComponent(name) + '&url=' + encodeURIComponent(newUrl))
    .then(function(r){return r.json()})
    .then(function(data){
      if (data.success) location.reload();
      else alert('è®¾ç½®å¤±è´¥: ' + (data.error || 'æœªçŸ¥é”™è¯¯'));
    })
    .catch(function(e){ alert('ç½‘ç»œé”™è¯¯: ' + e.message); });
}
function resetButton() {
  var card = document.getElementById('daily-run-card');
  var icon = document.getElementById('daily-run-icon');
  var label = document.getElementById('daily-run-label');
  icon.textContent = 'â–¶ï¸�'; label.textContent = 'æ‰‹åŠ¨æ—¥è·‘';
  card.style.cursor = 'pointer'; card.onclick = runDaily;
}

// â”€â”€ åˆ—æŽ’åº� â”€â”€
var sortColumn = null;
var sortAsc = true;
function sortTable(colIdx) {
  var table = document.getElementById('crawler-table');
  var tbody = table.querySelector('tbody');
  var rows = Array.from(tbody.querySelectorAll('tr'));
  var headers = table.querySelectorAll('th');
  headers.forEach(function(h, i){ h.classList.remove('sort-asc', 'sort-desc'); });
  if (sortColumn === colIdx) { sortAsc = !sortAsc; } else { sortColumn = colIdx; sortAsc = true; }
  headers[colIdx].classList.add(sortAsc ? 'sort-asc' : 'sort-desc');
  rows.sort(function(a, b) {
    var va = a.cells[colIdx] ? a.cells[colIdx].textContent.trim() : '';
    var vb = b.cells[colIdx] ? b.cells[colIdx].textContent.trim() : '';
    var na = parseFloat(va), nb = parseFloat(vb);
    if (!isNaN(na) && !isNaN(nb)) { return sortAsc ? na - nb : nb - na; }
    return sortAsc ? va.localeCompare(vb) : vb.localeCompare(va);
  });
  rows.forEach(function(r){ tbody.appendChild(r); });
}
</script>

function filterStatus(status) {
  // Update button active state
  document.querySelectorAll('.status-filters button').forEach(function(b) { b.classList.remove('active'); });
  var btn = document.getElementById('sf-' + status);
  if (btn) btn.classList.add('active');

  var rows = document.querySelectorAll('#crawler-table tbody tr');
  rows.forEach(function(row) {
    if (status === 'all') {
      row.style.display = '';
    } else {
      var rowStatus = row.getAttribute('data-status');
      row.style.display = (rowStatus === status) ? '' : 'none';
    }
  });
}
</body></html>)rÓ  rQ   r5   r6   r¹  r8   rƒ   r:   rº  r§  r¾  râ  r,  rK  r/  r   rR   rb   rD  rF  rÆ  r=  rØ   rõ  rH   )rù  rƒ  r—   r5   Útotal_recordsr²  r³  r´  rµ  Úgroupsr\   Úgr§  Únow_strÚ
week_totalÚ	day_totalrT   Úsaved_excluder\  ÚgnameÚgdataÚactive_markerÚscript_displayÚ_display_urlÚurl_cellÚ
run_statusÚ	run_colorÚsearch_textÚ_row_statusÚ	_tr_extras                                 r   rC  rC     s³  € ä%Ó'�M€HˆcÜ�‹M€EÛ O G§O¡O´IÓ$>×$FÑ$FÐGeÓ$f×$oÑ$oÓ$qÐrsÑ$t�Mð  wFÐv}÷  wFñ  wFô  GPó  wQ÷  wWñ  wWô  wYÜÑ:˜xÔ:Ó:€IÜÑ:˜xÔ:Ó:€IÜÑ< Ô<Ó<€JÜÑ> Ô>Ó>€Kà€FØò %ˆØˆg‰JˆØ�F‰?Ø"#°¸QÑ?ˆF�1‰IØˆq‰	�'Ó˜aÑÓØˆq‰	�)Ó  '¡
Ñ*ÓØˆX‹;Ø�1‰I�hÓ 1Ñ$Ôð%õ "Øˆh�l‰l‹n×%Ñ%Ð&6Ó7€GÜÑ5¨HÔ5Ó5€JÜÑ3¨(Ô3Ó3€Ià€Eð €MðÜÔ$Ó%ð 	-¨ØŸF™F›HŸN™NÓ,ˆM÷	-ð
 
‡L�L÷ pó pð (ð pô )-¯
©
°=Ó(AÐ'BðpðMC1ðpðh 2?°ðipðh@0ðipðj 16¨wðkpðj7rðkpñr JOÐr{ð  }Bñ  sBð  CFò  sFð  UVð  WZð  r[ðspðr [Tðspðr U^ð  T_ðspðr_rðspñt JOÐr{ð  }Bñ  sBð  CFò  sFð  UVð  WZð  r[ðupðt [Tðupðt U^ð  T_ðupðt_rðupñv KPÐr|ð  ~Cñ  sCð  DGò  sGð  VWð  X[ð  r\ðwpðv \Uðwpðv V`ð  Uaðwpðvatðwpñx NSÐtð  AFñ  uFð  GJò  uJð  YZð  [^ð  t_ðypðx _Xðypðx Ydð  Xeðypðxe2ðypð~ 3<°ðpð~=1ðpð@ 2<°ðApð@=LðApðN MTÈ9ðOpðNU?ðOpð^ @E¸gð_pð^Fô_pô pôb ˜vŸ|™|›~Ó.ò l‰ˆˆuØ�‰Ð8¸¸¸uÀUÀGÈ2ÈeÐT[ÉnÐM]Ð]iÐjÕkðlà	‡L�Lð ô ô$ �HÑ"^Ô_ó +ˆØ"# H¢+™¸aÀ
¹mÈaÒ>O±FÐUZˆØ˜8™ˆØ�Ò!Ø@ÀÀ8ÁÀÈWÐU‰NØ—‘�y $Ô'Ø?ÀÀ(Á¸}ÈGÐTˆNà—u‘u˜U BÓ'ÒB¨1¯5©5°¸rÓ+BˆÚò GSò  Uað  coð  psð  qsò  ctð  u‰HàKˆHàÐ(Ñ)ˆ
Ø!&¨*Ñ!4‘IÈÐQ[ÑH[¹9Ðouð  zDñ  pDÑbkð  X]ð  akñ  Xkð  ouð  yCñ  oCñ  KTð  IOˆ	Ø˜‘y 3‘¨¨8©Ñ4°sÑ:¸lÒ>PÈbÑQ×XÑXÓZ×bÑbÐcfÐhjÓkˆà�u‰u�Y Ô%Ø$‰KØ�jÑ Ø#‰KØ�jÑ Ø#‰KØ�zÑ!Ø'‰KØ�jÑ  F¨jÑ$8Ø ‰Kà#ˆKØ23·%±%¸	À4Ô2HÑ*Èbˆ	Ø�‰÷ ó Ð+ð ¨K¨=ð Ð8Ið È+Èð ÐVXð ÐYbÐXcð ð dð Ø€oððdðàdeÐflÑdmÐcnðànpðàqrÐsyÑqzÐp{ðð| ðð !" '¡
˜|ðð,ðð 45°X±;Ò3DÀ"ÈÒ2L�q˜‘{Ò( b¨#¨2Ñ.ÐRUÐVð	ðW ð	ð
 !" *¡˜ðð
/4ðð >?¸xº[±EÈeÐ3TððUðð 	ˆ�z€lððmðð n|Ðl|ðð}mðð nvÐlvððw7ðð 8A°kðð BEðð FPÀLððQôö 	ð?+ðX 
‡L�Lð @ô @ðB
 �7‰7�5‹>Ð÷o	-ñ 	-ûðÚús$   Å"R Å1RÆR ÒRÒR ÒRc                 ót  — t        j                  t        t        «      «      }t	        |t
        «      rd|i}|d   D ]r  }|j                  d|j                  dd«      «      }|| k(  sŒ+|r||d<   n|j                  dd«       t        j                  |t        t        d«      dd	¬
«       d| |dœc S  dd| › d�dœS )u   è®¾ç½®çˆ¬è™«çš„æ�¥æº�URLrù  r  rÖ   rA   rÕ   Nr  Frf  rz  T)r  r  rÕ   r|  r}  r  )	rD  r¤  r,  r~  r:  r9  rØ   r€  r�  )r  rÕ   rƒ  r\   Úcnames        r   rJ  rJ    s´   € ä
�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆØ�‰_ò ?ˆØ—‘�f˜aŸe™e K°Ó4Ó5ˆØ�D‹=ÙØ��%’à—‘�e˜TÔ"Ü�I‰I�cœ4¤¨SÓ1ÀÈaÕPØ#¨T¸#Ñ>Ò>ð?ð ¨°4°&¸Ð'DÑEÐEr
   c           	      óP  — ddl }ddl}ddl}ddl} |j                  t        t        «      «      }t        |t        «      rd|i}d}|d   D ]K  }|j                  d|j                  dd«      «      | k(  sŒ)|j                  d|j                  dd«      «      } n |sd	d
| z  dœS |j                  d«      r#d|j                  j                  t        |«      g}nì|j                  d«      r#d|j                  j                  t        |«      g}n¸d|j                  j                  t        |«      g}|d   D ]Ž  }|j                  dd«      | k(  sŒ|j                  dd«      }	|	rat        |	t        «      r)|j                  |	D �
cg c]  }
t        |
«      ‘Œ c}
«       n(|j                  t        |	«      j!                  «       «        n 	  |j"                  |ddd¬«      }|j$                  }|j&                  dd |j(                  dd z   }t+        |j                  «       «      }||||dk7  d	d| dœ}d}	  |j                  t        |«      «      }|j-                  |«       t/        |«      dkD  r|dd } |j0                  |t        |d«      «       d}|dk(  rdnd}	  |j                  t        |«      «      }d}|j!                  d«      D ]?  }d|v sd|v sŒddl} |j4                  d |«      }|sŒ&t+        |j7                  d!«      «      }ŒA |dk(  rd"|z  nd#|z  |d$œ|| <    |j0                  |t        |d«      d	¬%«       |dk(  | |||dd& |dk(  rd'd)œS d(|z  d)œS c c}
w #  g }Y �ŒxY w#  i }Y Œ¹xY w# |j8                  $ r	 d	d*| d+œcY S t:        $ r}d	t        |«      | d+œcY d}~S d}~ww xY w),u   è¿�è¡Œå�•ä¸ªçˆ¬è™«è„šæœ¬r   Nrù  rA   r  rÖ   rŠ  r‹  FzCrawler "%s" not foundr  z.shÚbashz.jsÚnoder³  rV  Ti,  r´  iþÿÿ)rŠ  r­  ÚrcÚ	has_errorr4   Ú	new_countr  z/tmp/crawl_results.jsonrÞ  r  r¬  r  r  r–  u   æ–°å¢žÚnewz(\d+)rM   u
   âœ… +%dæ�¡u	   â�Œ rc=%d)r<  r­  r  rö   u   å·²å®Œæˆ� (exit 0)zrc=%d)r  r  rŠ  r5  r»  Úmessageu   æ‰§è¡Œè¶…æ—¶(300s))r  r  r  )r¶  rD  r³   Útimer¤  r,  r~  r:  r9  rØ   r»  r´   rb   rn  r‡   rG   rO   r·  rº  r¸  r¹  rM  rR   rQ   r�  r   r   r   ÚTimeoutExpiredr;   )r  r¶  rD  r³   r:  rƒ  rŠ  r\   ÚcmdrV  Úard   r5  r»  Únow_tsÚ
run_recordÚstatus_fileÚexistingÚrun_status_fileÚ	run_emojiÚrsr7  Úliner   r   r]  s                             r   Úrun_single_scriptrF  (  s¨  € ç%×%Ø
ˆ$�)‰)”DœÓ%Ó
&€CÜ�#”tÔØ˜3ÐˆØ€FØ�‰_ò ˆØ�5‰5�˜Ÿ™˜{¨BÓ/Ó0°DÓ8Ø—U‘U˜8 Q§U¡U¨9°bÓ%9Ó:ˆFÙðñ Ø Ð+CÀdÑ+JÑKÐKà‡��uÔØ�r—w‘w—|‘|¤O°VÓ<Ð=‰Ø	�‰˜Ô	Ø�r—w‘w—|‘|¤O°VÓ<Ð=‰à˜"Ÿ'™'Ÿ,™,¤¸Ó?Ð@ˆà�Z‘ò 	ˆAØ�u‰u�V˜RÓ  DÓ(Ø—u‘u˜V RÓ(�ÙÜ! $¬Ô-ØŸ
™
°DÖ#9¨q¤C¨¥FÒ#9Õ:àŸ
™
¤3 t£9§?¡?Ó#4Ô5Ùð	ð4AØ�—‘ °D¸tÈSÔQˆØ×ÑˆØ—‘˜t˜uÐ%¨¯©°d°eÐ(<Ñ<ˆä�T—Y‘Y“[Ó!ˆàØØØ˜q™ØØØñ
ˆ
ð 0ˆð	Ø �t—y‘y¤ kÓ!2Ó3ˆHð 	�‰˜
Ô#Üˆx‹=˜3ÒØ  �ˆHØˆ�	‰	�(œD ¨cÓ2Ô3à=ˆØ 1šW‘E¨%ˆ	ð	Ø�—‘œ4 Ó0Ó1ˆBð ˆ	Ø—L‘L Ó&ò 	0ˆDØ˜4Ñ 5¨D¢=ÛØ�B—I‘I˜h¨Ó-�ÚÜ # A§G¡G¨A£J£‘Ið	0ð ;=Àº'˜l¨YÒ6À{ÐUWÑGWÐ_eÑfˆˆ4‰Øˆ�	‰	�"”d˜?¨CÓ0¸uÕEà˜Q‘wØØØØ˜T˜c�lØ/1°QªwÐ+ñ
ð 	
ð =DÀb¹Lñ
ð 	
ùò[ $:øð,	Ø‹Hûð	ØŠBûð& ×$Ñ$ò OØ Ð+?ÈÑNÒNÜò AØ ¬3¨q«6¸4Ñ@Õ@ûðAúso   Å>M
ÇA)M- È.M É	AM- ÊM$ Ê1M- ËM- Ë*A#M- ÍM- ÍM!ÍM- Í$M*Í(M- Í-N%ÎN%ÎN ÎN%Î N%z/tmp/daily_crawl_run.pidc                  ó$  — dd l } dd l}t        «       }|j                  d«      rddddœS 	  | j                  «       }|dk(  re | j
                  «         |j                  ddg|j                  |j                  ¬	«        | j                  t        «        | j                  d«       y t        t        d
«      5 }|j                  t        |«      «       d d d «       ddd|dœS #  Y ŒQxY w# 1 sw Y   ŒxY w# t        $ r}dd|› �ddœcY d }~S d }~ww xY w)Nr   ÚrunningFu   æ—¥è·‘å·²åœ¨è¿�è¡Œä¸­T)r  r9  rH  r3  z/root/daily_incremental.sh)r¸  r¹  r  u   æ—¥è·‘å·²å�¯åŠ¨)r  r9  rH  rÂ   u   å�¯åŠ¨å¤±è´¥: )r³   r¶  rH  rØ   ÚforkÚsetsidr·  ÚDEVNULLÚremoveÚRUN_PID_FILEÚ_exitr,  r.  rG   r;   )r³   r¶  r<  rÂ   r\  r]  s         r   rE  rE  ‚  sú   € ßÜ!Ó#€FØ‡z�z�)ÔØ Ð-DÐQUÑVÐVðUØˆb�g‰g‹iˆØ�!Š8ØˆB�I‰IŒKØˆJ�N‰N˜FÐ$@ÐAØ *× 2Ñ 2¸:×;MÑ;MõOà�—‘œ<Ô(àˆB�H‰H�Q�Kä”l CÓ(Ð@¨A¨q¯w©w´s¸3³xÔ/@×@Ø#Ð0AÈdÐ[^Ñ_Ð_øð	 ‘Dú÷ AÐ@ûäò UØ ¨~¸a¸SÐ-AÈeÑTÕTûðUúsT   «AC3 Á=C  ÂC3 Â&C3 Â6C'ÃC3 Ã C$Ã"C3 Ã'C0Ã,C3 Ã3	DÃ<D
ÄDÄ
Dc                  ó  — dd l } dd l}| j                  j                  t        «      r–	 t        t        «      5 }t        |j                  «       j                  «       «      }d d d «        | j                  d«       d}	  |j                  ddt        › �dgd|j                  ¬«      j                  dd	¬
«      }d||dœS ddiS # 1 sw Y   ŒcxY w#  Y ŒxY w# t        t        f$ r$  | j                   t        «       n#  Y nxY wY ddiS w xY w)Nr   rA   Útailr   z/var/log/crawler_daily.logre  )r4   r¹  rd  rH   r¿  T)rH  rÂ   Úlog_tailrH  F)r³   r¶  r´   rµ   rM  r,  rM  r/  r   ÚkillÚcheck_outputÚRUN_LOG_TAILrK  rÄ  ÚOSErrorÚ
ValueErrorrL  )r³   r¶  r\  rÂ   rQ  s        r   rH  rH  –  sû   € ßØ	‡w�w‡~�~”lÔ#ð	Ü”lÓ#ÐE q´°A·F±F³H·N±NÓ4DÓ0E¨#×EØˆB�G‰G�C˜ŒOØˆHðØ2˜:×2Ñ2Ø˜q¤ Ð/Ð1MÐNØ j×&8Ñ&8ô:ç:@¹&ÀÐQZ¸&Ó:[ð ð  $¨C¸XÑFÐFð �uÐÐ÷ FÐEûð ‘DûäœÐ$ò 	Ø�—‘œ<Õ(øØ‘DûØ�uÐÐð	úsX   ©C ¸(CÁ C Á>:C Â8C ÃCÃC ÃCÃC ÃDÃ$C;Ã:DÃ;C?Ã=DÄDÚ__main__z0.0.0.0)rM   r2   rw   NNrn   N)rM   r§   rn   N)re  )r  r  r  éZ   )SÚ__doc__Úhttp.serverÚhttpr5   Úurllib.parser   r   r³   r‚  rD  r§  ÚioÚcsvÚsignalÚsysr®  rÆ  r`   r	   r7   r¶   rÅ   rÎ   ÚCRAWLER_DB_PATHr;  ÚCSV_PATHÚPORTr   ÚPHASESr‚   r,   r·   r0   r>   Ú
CATEGORIESrK   r<  rX   rN   rf   rk   r   r¦   r¿   rÃ   rÆ   rÊ   rÏ   rÑ   rÚ   rß   rå   rÅ  rÜ   rì   ÚserverÚBaseHTTPRequestHandlerrî   r¶  r~  r¹  rn  rK  r>  rj  r  rv  rm  rt  rx  rI  rÓ  r  rC  rJ  rF  rM  rT  rE  rH  rX  ÚThreadingHTTPServerÚserve_forever)rW   r.   r   r/   rZ  s   00000r   ú<module>rj     s¶  ðñ÷ v× u× u× u× u× u× uÓ uò
Bð €à!€à&€à€
à,€à€à€à€òð$ ˜ð  3Cñ  Dà
˜^ð  8Xñ  Yà
˜Nð  7qñ  rà
˜~ð  :Sñ  Tà
˜^ð  8añ  bà
˜^ð  8iñ  jð
€ð  "(Ö(˜AˆQˆt‰W�a‰ZÒ(€	ð �>ò  ${ð  |Ø�>ò  $fð  gØ�>ò  $Vð  WØ�>ò  $ið  jØ�>ò  $Mð  NØ�>ò  $Zð  [Ø�>Ò#~ÐØ�>ò  $ið  jð	€ð ]k×kÐkÑFXÀfÈeÐUX�˜v°¸SÑAÑAÔk€òòð  NÑ3ð€
òeðF€	òTò"òò	óZ!òx
"ó 2òl
ó 2òló(2òlò<ò<ó0 òL H€à€
ò*ñ\ Ô Ù Ô ôD//�D—K‘K×6Ñ6ô D//÷T^ )× (Ó (à9€Ø€	Ø%€ØCÐ ð ˜(¨'Ñ2ØÐ0¸ÑDØ °~ÑFØ˜°lÑCØ˜NÐ2DÑEØ˜Ð.UÑVØ˜Ð.RÑSØÐ,Ð4GÑHØÐ/Ð7KÑLØÐ*Ð2CÑDØ .Ð8RÑSØÐ2Ð:TÑUð€
ò4ð &0Ö0˜c��D“	Ò0€ð Ð ØÐ òò:#òJHò"eóPtòjUòpFò RAðn *€Ø€òUò(ð& ˆzÒà‡K�K×#Ñ# Y°Ð$5°}ÓE×SÑSÕUð ùòC[ )ùô" lùò`u 1s   Á9HÃH Æ2H'