rsclaw 2026.5.1

AI Agent Engine Compatible with OpenClaw
Documentation
+
M��i�g���Rt^RIt^RIt^RIt^RItRtRtRRRRRR	/RR
RRRR/RR
R]RR/RRR]RR/RRR]RR/RRR]RR/RRR]RR/RRR]RR/RRR]RR/RRRRRR/RRR]RR/RRR]RR/RRR]RR/.
tRRRR/RRRR /RRRRR!R"R#R$R%R%RR&R'R(//./RR)R*R#RR+/RRRRR!R"R,R$R%R%RR-R'R.//./RR)R*R,RR//RRRR0/RRRRR!R"R1R$R%R%RR&R'R2//./RR)R*R1RR3/RRRR4/RRRR5/RRRRR!R"R6R$R%R%RR-R'R7//./RR)R*R6RR8/RRRRR!R"R9R$R%R%RR&R'R://./RR)R*R9RR;/RRRR</RRRRR!R"R=R$R%R%RR&R'R>//./RR)R*R=RR?/RRRR@/RRRRA/.tR$R%R%RR&RBRCRDR$RERFRGR$RH//RIRG.///R$R%R%RR-RBRJRDR$RERFRKR$RH/RR$RH//RIRKR.///R$R%R%RRLRBRMRDR$RERFRKR$RH//RIRK.///R$R%R%RRNRBRORDR$RERFRPR$RH/RQR$RH//RIRP.///R$R%R%RRRRBRSRDR$RERFRQR$RH//RIRQ.///.t	RTt
RURVltRWRXltRYRZlt
R[tRRRRR!R"R\R$R%R%RR-R'R]//./RR)R*R\RR^/RRRRR!R"R_R$R%R%RR&R'R2//./RR)R*R_RR`/RRRRa/RRRRb/RRRRR!R"RcR$R%R%RR-R'Rd//./RR)R*RcRRe/RRRRf/RRRRg/.
tRhtRiRjltRkRlltRmt]Rn8Xd
]!4R#R#)oab
Test: compaction summary via KV cache reuse.

Simulates appending a summary instruction to an existing conversation
(with tools defined) and verifies each model:
1. Generates a structured summary (not a tool call)
2. Follows the 8-section format
3. Does NOT call any tools despite tools being present

Usage:
    python tests/test_compaction_kvcache.py
Nzhttp://macstudio.localz#https://api.gaterouter.ai/openai/v1�namezdeepseek/deepseek-chat�basezhttps://api.deepseek.com/v1�key_env�DEEPSEEK_API_KEYz!doubao/doubao-seed-2-0-pro-260215z(https://ark.cn-beijing.volces.com/api/v3�ARK_API_KEYzgoogle/gemini-2.5-flash�GATE_ROUTER_KEYzgoogle/gemini-3-flash-previewzminimax/minimax-m2.5zgoogle/gemini-3.1-pro-previewzz-ai/glm-5-turbozmoonshotai/kimi-k2.5zanthropic/claude-sonnet-4.6zllama/llamazhttp://218.22.75.183:8000/v1�LLAMA_REMOTE_KEYzollama/qwen3.5:9bzollama/qwen3.5:27bzollama/gemma4:26b�role�user�contentu?帮我写一个Python爬虫,抓取豆瓣电影Top250的数据�	assistantuZ好的,我来帮你写一个豆瓣电影Top250的爬虫。让我先创建项目结构。�
tool_calls�id�call_1�type�function�execute_command�	argumentsz8{"command":"mkdir -p douban_spider && cd douban_spider"}�tool�tool_call_idu目录已创建�call_2�
write_fileaY{"path":"douban_spider/spider.py","content":"import requests\nfrom bs4 import BeautifulSoup\n\ndef crawl_top250():\n    results = []\n    for page in range(0, 250, 25):\n        url = f'https://movie.douban.com/top250?start={page}'\n        resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})\n        soup = BeautifulSoup(resp.text, 'html.parser')\n        for item in soup.select('.item'):\n            title = item.select_one('.title').text\n            rating = item.select_one('.rating_num').text\n            results.append({'title': title, 'rating': rating})\n    return results\n"}u(文件已写入: douban_spider/spider.pyu9爬虫脚本已创建。现在让我运行测试一下。�call_3z2{"command":"cd douban_spider && python spider.py"}uk抓取完成,共250部电影。前3部:
1. 肖申克的救赎 9.7
2. 霸王别姬 9.6
3. 阿甘正传 9.5u�爬虫运行成功!已抓取250部电影数据。前三名是肖申克的救赎(9.7)、霸王别姬(9.6)、阿甘正传(9.5)。需要我把数据导出为CSV吗?u9好的,导出CSV,然后帮我分析一下评分分布�call_4uA{"path":"douban_spider/export.py","content":"import csv\nfrom spider import crawl_top250\n\ndata = crawl_top250()\nwith open('top250.csv', 'w', newline='') as f:\n    writer = csv.DictWriter(f, fieldnames=['title', 'rating'])\n    writer.writeheader()\n    writer.writerows(data)\nprint(f'导出完成: {len(data)}条')"}u(文件已写入: douban_spider/export.py�call_5z2{"command":"cd douban_spider && python export.py"}u导出完成: 250条u*CSV已导出。让我分析评分分布。�call_6uR{"command":"cd douban_spider && python -c \"import csv; data=[float(r['rating']) for r in csv.DictReader(open('top250.csv'))]; print(f'平均:{sum(data)/len(data):.1f}'); print(f'最高:{max(data)}'); print(f'最低:{min(data)}'); bins={f'{i/10:.0f}分段':sum(1 for d in data if i/10<=d<(i+1)/10) for i in range(80,100)}; print(bins)\""}u@平均:8.9
最高:9.7
最低:8.2
{'8分段': 45, '9分段': 205}u�分析完成!豆瓣Top250评分分布:
- 平均分: 8.9
- 最高: 9.7 (肖申克的救赎)
- 最低: 8.2
- 9分以上: 205部 (82%)
- 8分段: 45部 (18%)

大部分影片都在9分以上,说明Top250的门槛很高。uN不错!再帮我加一个功能:抓取每部电影的导演和年份信息�descriptionzRun a shell command�
parameters�object�
properties�command�string�requiredzWrite content to a file�path�	read_filezRead a file�memoryz Search or store long-term memory�action�query�
web_searchzSearch the webu请将以上对话压缩为结构化摘要。不要调用任何工具,只输出文本摘要。

按以下格式输出:

## Active Task
[当前正在做什么]

## Goal
[最终目标]

## Completed
[已完成的操作和结果]

## In Progress
[正在进行、未完成的]

## Key Data
[必须原样保留的值: 路径/文件名/数字/关键输出]

## Decisions
[已做的技术决策]

## Pending
[等用户确认的、被阻塞的]

## Files
[涉及的文件和修改]

注意: 只输出摘要文本,不要调用任何工具。c�`�V^8�dQhR\R\R\R\R\R\/#)�rr�key�model_id�messages�return��str�list�dict)�formats"�?/Users/oopos/dev/github-rsclaw/tests/test_compaction_kvcache.py�__annotate__r5�s8��+�+�S�+��+�#�+��+�PT�+�Y]�+�c���^RIpRVRVR\RRRRR	^/pR
V9gRV9dRR
/VR&\P!V4P	4pVP
P
VR2VRRV2RR/R7p\P!4p	VP
PV^xR7;_uu_4p
\P!V
P44pRRR4\P!4T	,
pXP!R/.4^,pTP!R/4pR\#TP!R44RTP!R4;'gR R!TP!R!/4R"T/# +'giL�;i TP
PdIpTP4PRR7R,p
\RTPRT
24ThRp?ii;i)#zCall OpenAI-compatible API.N�modelr-�tools�streamF�
max_tokens���temperature�doubao�arkr�disabled�thinkingz/chat/completions�
AuthorizationzBearer �Content-Type�application/json��data�headers��timeout�replace)�errors�Ni�NzHTTP z: �choices�message�
has_tool_callr
r��usage�time)�urllib.request�TOOLS�json�dumps�encode�request�RequestrR�perf_counter�urlopen�loads�read�	HTTPError�decode�RuntimeError�code�get�bool)rrr+r,r-�urllib�payload�body�req�t0�resprF�e�err_body�elapsed�choice�msgs&&&&&            r4�call_openai_compatro�s����	���H����%��d��q�
�G��4��5�D�=�%�z�2��
���:�:�g��%�%�'�D�
�.�.�
 �
 ��&�!�"�
��w�s�e�_��.�
�!��C�
�	�	�	�B�@�
�^�^�
#�
#�C��
#�
5�
5���:�:�d�i�i�k�*�D�6�
���!�B�&�G�
�X�X�i�"��
&�q�
)�F�
�*�*�Y��
#�C���c�g�g�l�3�4��3�7�7�9�%�+�+������'�2�&���	��6�
5���>�>�#�#�@��6�6�8�?�?�)�?�4�T�:���U�1�6�6�(�"�X�J�7�8�a�?��@�s7�%F�3%E3�F�3F	�>F�F�G)�!AG$�$G)c
�T�V^8�dQhR\R\R\R\R\/#)r*rrr,r-r.r/)r3s"r4r5r5�s6��@�@�S�@��@�s�@�d�@�t�@r6c�.�^RIp.p\FpVPRRRVR,/4K!	.pVF�p\V4p	RV	9d�V	R,'d�.p
V	R,F�p\V4p\VP	R/44pVP	RR4p
\V
\4'd\P!V
4VR&W�R&V
PV4K�	W�R&V	P	R4fRV	R&VPV	4K�	\P!R	VR
VRVRR
RR
RR^RR//4P4pVPPVR2VRR/R7p\P!4pVPP!VRR7;_uu_4p\P!VP#44pRRR4\P!4V,
pXP	R/4p	R\%V	P	R44RV	P	R4;'gRRRVP	R^4RVP	R^4/R V/# \Pd
/TR&EL�i;i +'giL�;i)!z4Call Ollama native /api/chat (supports think=false).Nrrr
rz{}rrPr8r-r9r:F�think�optionsr=�num_predictr<z	/api/chatrCrDrEi,rHrNrOrQ�
prompt_tokens�prompt_eval_count�completion_tokens�
eval_countrR)rSrT�appendr2rb�
isinstancer0rUr\�JSONDecodeErrorrVrWrXrYrRrZr[r]rc)rrr,r-rd�ollama_tools�t�ollama_msgs�mrn�	new_calls�tc�func�argsrfrgrhrirFrls&&&&                r4�call_ollama_nativer��s�����L�
������J���*�
�
�	���K�
���1�g���3��3�|�#4�#4��I��,�'�'���"�X���B�F�F�:�r�2�3���x�x��T�2���d�C�(�(�/�,0�J�J�t�,<��[�)�"&�:��� � ��$�(�!*����w�w�y�!�)�!#��I�����3��%�(�:�:����K����%����M�1�m�T�:�
���v�x�	��.�.�
 �
 ��&�	��
��!3�4�!��C�
�	�	�	�B�	���	�	��S�	�	1�	1�T��z�z�$�)�)�+�&��
2����!�B�&�G�
�(�(�9�b�
!�C���c�g�g�l�3�4��3�7�7�9�%�+�+����T�X�X�&9�1�=�����,��!:�
�	�����= �/�/�/�,.��[�)�/��2
2�	1�s�5I#�)%J�#J�J�J	c�0�V^8�dQhR\R\/#)r*�	model_cfgr.)r2)r3s"r4r5r5�s��+�+�$�+�4�+r6c�|�VR,pVR,pVPR4pRV9dVPR^4^,MTp\\4pVP	RRR\
/4V'd\
WWE4pMI\PPVR,;'gR	R	4;'gR	p\WWtV4p^RI
p	V	PR
R	VR,V	PR7P!4p
.pRF9pVP#4V
P#49gK(VP	V4K;	RTRVR,RVR,R\%V
4R\%V4RTRVR,RV
'd
V
R,R
R/	#RR
R/	# \dpRTR
\T4R^/uRp?#Rp?ii;i)z$Call a model and return result dict.rr�ollama/�/r	r
rrrP�errorrRN�E<(?:think|thinking|reasoning)>[\s\S]*?</(?:think|thinking|reasoning)>��flagsrO�content_len�sections�sections_foundrQ�content_previewrL�(empty)�zActive Task�Goal�	CompletedzIn ProgresszKey Data�	Decisions�Pending�Files)�
startswith�splitr1�CONVERSATIONry�SUMMARY_INSTRUCTIONr��os�environrbro�	Exceptionr0�re�sub�
IGNORECASE�strip�lower�len)
r�rr�	is_ollamar,r-�rr+rjr�rr��sections
&            r4�
call_modelr��s����V��D��V��D����	�*�I�(+�t��t�z�z�#�q�!�!�$��H��L�!�H��O�O�V�V�Y�0C�D�E�:��"�4�x�B�A��*�*�.�.��9�!5�!;�!;��R�@�F�F�B�C�"�4�s�h�G�A�
��f�f�P�
�A�i�L��
�
����e�g���N�s���=�=�?�g�m�m�o�-��!�!�'�*�t�
	����&�	���?�+��s�7�|��C��'��.���7���G�7�4�=���
�
�:C���
�
��!�:���g�s�1�v�v�q�9�9��:�s0�/F�(F�-F�<F�F;� F6�0F;�6F;c��\RF4\R4\RF4\R\\4R24\R\\4R24\R4\4.p\EFUpVR,pVR,pV'd:\
PPV4'g\R	VR
VR24KWRV9d*^R
IpVPP\R2^R7\RVR2RRR7\V4pVPV4VR,'d\RVR,R,24K�VR,'dRMRp\VRVR,R
RVR ,R!VR",R#VR$,PR%R&4R'VR$,PR(R&424EKX	\4\RF4\R)4\RF4\RR*R+
RR,R-
RR.R-
RR/R0
RR1R-
2
4\RRGRRHRRHRRIRRH2
4VF|pVR,'d\RVR,R+
RR2R-
24K.VR,'dR3MR4p\RVR,R+
RVR,R5
R6VR-
RVR ,R7
R8VR",R-
2
4K~	\4VF�pVR,'gVPR94'gK+\R:VR,R;24\VR9,4VR",R<8�d\R=VR",R>24\4K�	\RF4\R?4\RF4VFupVR,'dR@pMGVR,'dRApM5VR ,^8�dRBpM$VR ,^8�dRCpMVR",^d8�dRDpMREp\RVR,R+
RV24Kw	R
# \d\R	TR24EK�i;i)J�=�4  Compaction Summary via KV Cache Reuse - Model Test�  Conversation: �	 messages�	  Tools: � defined�?  Test: append summary instruction, expect text (not tool call)rr�  SKIP � (�	 not set)�ollamaN�	/api/tagsrH� (ollama not reachable)�
  Testing �...� T��end�flushr��ERROR: �N�PNrO�
TOOL_CALL!�OK�  rR�.1f�s  sections=r��/8  len=r��	  tokens=rQru�?r�rwz  Results Summary�Model�<40�Time�>6�Tool?�Sect�>5�Len�ERROR�YES!�no�>5.1f�s �>4�/8 r�z--- z ---��z  ... (z
 chars total)z	  VerdictzSKIP (error)z1FAIL - called tools instead of generating summaryzPASS - good structured summaryzPARTIAL - some sections missingz(WEAK - generated text but poor structurez FAIL - empty or useless response�F======================================================================�(----------------------------------------�------�-----)�printr�r�rT�MODELSr�r�rbrSrXr[�
OLLAMA_URLr�r�ry)	�results�cfgrrrdr��statusr��verdicts	         r4�mainr�,s���	�(�O�	�
@�A�	�(�O�	��S��.�/�y�
9�:�	�I�c�%�j�\��
*�+�	�K�M�	�G��G��v���6�{���i�.���2�:�:�>�>�'�2�2��G�D�6��G�9�I�6�7���t��
�%����&�&�*��Y�'?��&�K�
	�
�4�&��$�#�T�:��s�O�����q���W�:�:��G�A�g�J�s�O�,�-�.�%&��%7�%7�\�T�F��V�H�B�q��y��o�\�!�J�-��I��=�)�*�+��g�J�N�N�?�C�@�A��1�W�:�>�>�Re�gj�Ck�Bl�n�
o�/�6
�G�	�(�O�	�
��	�(�O�	�B�w�s�m�1�V�B�K�q����A�f�R�[��%���
L�M�	�B�v�h�a��w�a��w�a��w�a��w�
7�8�
���W�:�:��B�q��y��o�Q�w�r�l�3�4��_�-�-��4�B��B�q��y��o�Q�q��y��&7�r�"�R���!�J�-�PR�AS�SV�WX�Yf�Wg�hj�Vk�l�m��
�G�
���W�:�:�Q�U�U�#4�5�5��
��Q�v�Y�K�t�$�%�
�a�!�"�#��]��c�!��G�A�m�,�-�]�;�<�
���
�(�O�	�+��	�(�O�
���W�:�:�$�G�
��
�
�I�G�
�z�]�a�
�6�G�
�z�]�a�
�7�G�
�}�
��
#�@�G�8�G�
��1�V�9�S�/��7�)�,�-���Y�
����v�%<�=�>��
�s�(O&�&P�P�call_7u6{"path":"douban_spider/spider.py","content":"import requests\nfrom bs4 import BeautifulSoup\n\ndef crawl_top250():\n    results = []\n    for page in range(0, 250, 25):\n        url = f'https://movie.douban.com/top250?start={page}'\n        resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})\n        soup = BeautifulSoup(resp.text, 'html.parser')\n        for item in soup.select('.item'):\n            title = item.select_one('.title').text\n            rating = item.select_one('.rating_num').text\n            info = item.select_one('.bd p').text.strip()\n            director = info.split('\\n')[0].replace('导演:', '').strip()\n            year = info.split('\\n')[1].strip()[:4]\n            results.append({'title': title, 'rating': rating, 'director': director, 'year': year})\n    return results"}u(文件已更新: douban_spider/spider.py�call_8u�抓取完成,共250部电影。前3部:
1. 肖申克的救赎 9.7 导演:弗兰克·德拉邦特 年份:1994
2. 霸王别姬 9.6 导演:陈凯歌 年份:1993
3. 阿甘正传 9.5 导演:罗伯特·泽米吉斯 年份:1994ux导演和年份抓取成功!已更新spider.py。现在每部电影都有标题、评分、导演和年份信息了。uH很好!现在把导出脚本也更新一下,加上导演和年份列�call_9uU{"path":"douban_spider/export.py","content":"import csv\nfrom spider import crawl_top250\n\ndata = crawl_top250()\nwith open('top250.csv', 'w', newline='') as f:\n    writer = csv.DictWriter(f, fieldnames=['title', 'rating', 'director', 'year'])\n    writer.writeheader()\n    writer.writerows(data)\nprint(f'导出完成: {len(data)}条')"}u(文件已更新: douban_spider/export.pyue导出脚本已更新,CSV现在包含title, rating, director, year四列。需要运行测试吗?uC运行一下,然后统计一下导演出现次数最多的前5名u)请更新以下摘要,整合新增的对话内容。不要调用任何工具,只输出文本摘要。

规则:
- 保留旧摘要中仍然有效的信息
- 将已完成的工作从"In Progress"移到"Completed"
- 新增已完成的操作到 Completed 列表(继续编号)
- 更新 Active Task 为最新的未完成请求
- 更新 Key Data 中变化的数据
- 更新 Files 中新增或修改的文件

按以下格式输出:

## Active Task
[当前正在做什么]

## Goal
[最终目标]

## Completed
[已完成的操作和结果]

## In Progress
[正在进行、未完成的]

## Key Data
[必须原样保留的值]

## Decisions
[已做的技术决策]

## Pending
[等用户确认的、被阻塞的]

## Files
[涉及的文件和修改]

注意: 只输出摘要文本,不要调用任何工具。c�<�V^8�dQhR\R\R\/#)r*r��
first_summaryr.)r2r0)r3s"r4r5r5�s&��E�E�D�E��E��Er6c��VR,pVR,pVPR4pRV9dVPR^4^,MTp\R,pRRRR	V2/p.p\F�p	V	P	R
4'd�.p
V	R
,FTpVP	R/4pV
PRVP	RR
4RVP	RR4R,R24KV	VPRRRRP
V
4/4K�V	P	R4R8Xd+VPRRRRV	P	RR42/4K�VPV	4K�	Wg.,V,p
V
PRRR\/4V'd\W#W]4pMI\PP	VR,;'gRR4;'gRp\W#W�V
4p^RIpVPRRVR,VP R7P#4pRV9;'gRV9pRV9;'g!R VP%49;'gR!V9pR"V9;'d R#V9;'gR$V9;'gRV9p.pR/F9pVP%4VP%49gK(VPV4K;	RTRVR,R%VR%,R&\'V4R'\'V4R(TR)TR*TR+VR+,R,V'd
VR-,RR/#R.RR/# \dpRTR\T4R^/uRp?#Rp?ii;i)0z[Test iterative compaction: [head 3] + [first summary] + [new turns] + [update instruction].rrr�r�:Nr*Nr	r
rz![Conversation history compacted]
r
rz[Called r��(rrPr�z)]rr�rz[Tool result] rr�rRNr�r�z8.9�250u导演�directoru年份z	spider.pyu更新u修改rOr�r��has_old_data�has_new_data�has_new_completedrQr�:NiXNr�r�)r�r�r��POST_COMPACT_TURNSrbry�join�ITERATIVE_SUMMARY_INSTRUCTIONr�r�r�ror�r0r�r�r�r�r�r�)r�r�rrr�r,�head�summary_msg�	new_turnsr�descsr��fnr-r�r+rjr�rr�r�r�r�r�s&&                      r4�call_model_iterativer��s?���V��D��V��D����	�*�I�(+�t��t�z�z�#�q�!�!�$��H����D��6�9�0R�S`�Ra�.b�c�K��I�
���5�5�����E���o�o���V�V�J��+�����x����v�c�(:�';�1�R�V�V�K�PR�=S�TW�=X�<Y�Y[�\�]�&�
���f�k�9�c�h�h�u�o�N�O�
�U�U�6�]�f�
$����f�k�9��q�u�u�U^�_a�Ob�Nc�>d�e�f����Q�� ��m�#�i�/�H��O�O�V�V�Y�0M�N�O�:��"�4�x�B�A��*�*�.�.��9�!5�!;�!;��R�@�F�F�B�C�"�4�s�h�G�A���f�f�P�
�A�i�L��
�
����e�g���G�#�7�7�u��'7�L��w�&�^�^�*��
�
��*G�^�^�8�W^�K^�L�#�w�.�v�v�H��4G�4u�4u�8�W^�K^�4u�4u�bj�nu�bu���N�s���=�=�?�g�m�m�o�-��!�!�'�*�t�
	����&�	���?�+��s�7�|��C��'������.���7���G�7�4�=�����:C������'�:���g�s�1�v�v�q�9�9��:�s0�L�(L�L�L�M�&L<�6M�<Mc�$�V^8�dQhR\/#)r*�
first_results)r1)r3s"r4r5r5�s��$e�$e�$�$er6c�Ta�\4\R#4\R4\R#4\R\\4R24\R4\4VEF.pVR,'gVPR4'gK,VR,o\	V3Rl\
4R	4pV'gKYVR,pVR
,R8�d
VR,p\RSR
2RRR7\
W#4pVR,'d\RVR,R,24K�VR,'dRMRpVR,'dRMRpVR,'dRMRp\VRVR,R
RVR,RVR VR!VR
,24EK1	\4\R"4R	#)$z:Run iterative compaction test using first summary results.z5  Iterative Compaction Test (2nd summary updates 1st)z   Head: 3 messages | New turns: r�z1  Test: update existing summary with new progressr�r�rc3�F<"�TFqR,S8XgKVx�K	R#5i)rN�)�.0rrs& �r4�	<genexpr>�!test_iterative.<locals>.<genexpr>
s����;�v�!�6��d�):�A�A�v�s�!�
!Nr�r�r�r�r�Tr�r�r�r��yeszNO!r�rOzTOOL!�okr�rRr�zs  sect=r�z
/8  old_data=z  new_data=z  len=zW  Legend: old_data=preserved stats from 1st summary, new_data=incorporated new featuresr�)r�r�r�rb�nextr�r�)	r�r�r�r��ir�old�newr�rs	&       @r4�test_iterativer�s{���	�G�	�(�O�	�
A�B�	�(�O�	�,�S�1C�-D�,E�Y�
O�P�	�=�?�	�G�
���W�:�:�Q�U�U�#4�5�5����y���;�v�;�T�B�����+�,�
��]��c�!��/�0�M�
�
�4�&��$�#�T�:�
!�#�
5��
�g�;�;��G�B�w�K��,�-�.�/��n�-�-�%�5�C��n�-�-�%�5�C���/�/��T�B��R�D��2�f�:�c�*�(�2�j�>�2B�C�!�U�+�c�U�&��M�9J�8K�M�
N�-�2
�G�	�
c�dr6c�(�\R;4\R4\R;4\R\\4R24\R\\4R24\R4\4.p\EFUpVR,pVR,pV'd:\
PPV4'g\R	VR
VR24KWRV9d*^R
IpVPP\R2^R7\RVR2RRR7\V4pVPV4VR,'d\RVR,R,24K�VR,'dRMRp\VRVR,R
RVR ,R!VR",R#VR$,PR%R&4R'VR$,PR(R&424EKX	\4\R;4\R)4\R;4\RR*R+
RR,R-
RR.R-
RR/R0
RR1R-
2
4\RR<RR=RR=RR>RR=2
4VF|pVR,'d\RVR,R+
RR2R-
24K.VR,'dR3MR4p\RVR,R+
RVR,R5
R6VR-
RVR ,R7
R8VR",R-
2
4K~	\V4\4\R;R9\ P"!R:424R
# \d\R	TR24EK�i;i)?r�r�r�r�r�r�r�rrr�r�r�r�Nr�rHr�r�r�r�Tr�r�r�r�rOr�r�r�rRr�r�r�r�r�r�rQrur�r�rwz  Round 1 Resultsr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�z
Done  z%H:%M:%Sr�r�r�r�)r�r�r�rTr�r�r�rbrSrXr[r�r�r�ryrrR�strftime)r�r�rrrdr�r�r�s        r4r�r�#s���	�(�O�	�
@�A�	�(�O�	��S��.�/�y�
9�:�	�I�c�%�j�\��
*�+�	�K�M�	�G��G��v���6�{���i�.���2�:�:�>�>�'�2�2��G�D�6��G�9�I�6�7���t��
�%����&�&�*��Y�'?��&�K�
	�
�4�&��$�#�T�:��s�O�����q���W�:�:��G�A�g�J�s�O�,�-�.�%&��%7�%7�\�T�F��V�H�B�q��y��o�\�!�J�-��I��=�)�*�+��g�J�N�N�?�C�@�A��1�W�:�>�>�Re�gj�Ck�Bl�n�
o�-�6
�G�	�(�O�	�
��	�(�O�	�B�w�s�m�1�V�B�K�q����A�f�R�[��%���
L�M�	�B�v�h�a��w�a��w�a��w�a��w�
7�8�
���W�:�:��B�q��y��o�Q�w�r�l�3�4��_�-�-��4�B��B�q��y��o�Q�q��y��&7�r�"�R���!�J�-�PR�AS�SV�WX�Yf�Wg�hj�Vk�l�m���7��	�G�	�V�H�H�T�]�]�:�6�7�
8�9��E�
����v�%<�=�>��
�s�(K2�2L�L�__main__)�__doc__rUrRr��sysr��GATE_ROUTER_URLr�r�rTr�ror�r�r�r�r�r�r�__name__r�r6r4�<module>rs������&�
�7���
%�v�/L�i�Yk�l��
0�&�:d�fo�q~���
&����L]�^��
,�f�o�y�Rc�d��
#�V�_�i�IZ�[��
,�f�o�y�Rc�d��
���)�EV�W��
#�V�_�i�IZ�[��
*�F�O�Y�Pa�b��]�F�$B�I�Oa�b��
 �&�*�i��F��
!�6�:�y�$�G��
 �&�*�i��F�#
��,�V�Y� a�b��[�)�&B�C��[�)�T�<�4��6�S]�_i�lr�uF�HS�US�lT�;U�:V�W��V�^�X�y�:K�L��[�)�T�<�4��6�S]�_i�lr�uA�CN�PA�lB�;C�:D�E��V�^�X�y�:d�e��[�)�%`�a��[�)�T�<�4��6�S]�_i�lr�uF�HS�UM�lN�;O�:P�Q��V�^�X�y�;k�l��[�)�&M�N��V�Y� [�\��[�)�T�<�4��6�S]�_i�lr�uA�CN�Pc�ld�;e�:f�g��V�^�X�y�:d�e��[�)�T�<�4��6�S]�_i�lr�uF�HS�UM�lN�;O�:P�Q��V�^�X�y�:P�Q��[�)�%Q�R��[�)�T�<�4��6�S]�_i�lr�uF�HS�Uq�lr�;s�:t�u��V�^�X�y�:�A��[�)�&M�N��V�Y� p�q�)��4	�
���%��0��6�8�\�I��PX�GY�;Z�\f�ir�hs�t�
��	�
���L��4��6�8�\�F�V�X�DV�Xa�dj�lt�cu�;v�yC�FL�NW�EX�Y�
��	�
���K��=��6�8�\�F�V�X�DV�;W�Yc�fl�em�n�
��	�
���H��=��6�8�\�H�v�x�FX�Za�dj�lt�cu�;v�yC�FN�EO�P�
��	�
���L��+��6�8�\�G�f�h�EW�;X�Zd�gn�fo�p�
��C)	��V?��>+�\@�F+�\N.�j�[�)�T�<�4��6�S]�_i�lr�uA�CN�Pd�le�;f�:g�h��V�^�X�y�:d�e��[�)�T�<�4��6�S]�_i�lr�uF�HS�UM�lN�;O�:P�Q��V�^�X�y�;^�_��[�)�&`�a��V�Y� j�k��[�)�T�<�4��6�S]�_i�lr�uA�CN�Pw�lx�;y�:z�{��V�^�X�y�:d�e��[�)�&M�N��V�Y� e�f���$!?��NE�P$e�N6:�r�z���F�r6