From b4166db0d989a7e4e3e75933e519ccf3c2ae070d Mon Sep 17 00:00:00 2001 From: nsigma Date: Tue, 14 Apr 2026 19:46:50 -0700 Subject: [PATCH] Merge pull request #4 from sunblaze-ucb/feat/ratelimiter Feat/ratelimiter --- .gitignore | 2 + mask_map.json | 1509 +++++++++++++++++++++++++++ pyproject.toml | 4 +- src/cybergym/server/__main__.py | 125 ++- src/cybergym/server/pocdb.py | 16 +- src/cybergym/server/rate_limiter.py | 44 + src/cybergym/server/server_utils.py | 46 +- src/cybergym/server/types.py | 3 + src/cybergym/task/arvo_task.py | 12 +- src/cybergym/task/gen_task.py | 11 + src/cybergym/task/mask.py | 39 + src/cybergym/task/oss_fuzz_task.py | 19 +- src/cybergym/task/types.py | 1 + 13 files changed, 1795 insertions(+), 36 deletions(-) create mode 100644 mask_map.json create mode 100644 src/cybergym/server/rate_limiter.py create mode 100644 src/cybergym/task/mask.py diff --git a/.gitignore b/.gitignore index 1f9f366..150aa49 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ .vscode/ /logs/ /cybergym_data/ +/cybergym-server-data/ +/server/ /oss-fuzz-data/ *.7z cybergym-oss-fuzz-data.7z.part-* diff --git a/mask_map.json b/mask_map.json new file mode 100644 index 0000000..637d9f8 --- /dev/null +++ b/mask_map.json @@ -0,0 +1,1509 @@ +{ + "arvo:10013": "fd399a9d9e54", + "arvo:10055": "6511da39c9b1", + "arvo:10096": "b7f5adc32314", + "arvo:10147": "3fd32980c344", + "arvo:10252": "347675108063", + "arvo:10306": "dd81e99a77de", + "arvo:10341": "1523d346031e", + "arvo:10400": "7fa395d7dac0", + "arvo:10486": "59e2dae576ad", + "arvo:10574": "b59162b397b5", + "arvo:10628": "1e87eeeb8d69", + "arvo:1065": "9c73e92e52b7", + "arvo:10653": "3e090a66c8cd", + "arvo:10710": "ce70bbbfc155", + "arvo:10731": "9df9b52fa439", + "arvo:10841": "f4244480e791", + "arvo:10863": "bdb87562f6b9", + "arvo:10864": "710bfd876da1", + "arvo:10865": "cbc63356f47a", + "arvo:10882": "2a49447f5b7b", + "arvo:10999": "d28fec6d819f", + "arvo:11007": "0088933eb869", + "arvo:11011": "fee49c776e1a", + "arvo:11033": "72e021ef4e49", + "arvo:11078": "1cca6979e745", + "arvo:11081": "3792f67e31bd", + "arvo:11167": "44de269c89e4", + "arvo:11173": "d182d1ea0a44", + "arvo:11244": "4c6c61a82d51", + "arvo:11245": "c132748a03fc", + "arvo:11248": "d1e507c2a0d0", + "arvo:11253": "8adef23ae81f", + "arvo:11256": "009c9705c24e", + "arvo:11382": "c853fa51e5de", + "arvo:11429": "c3b1c601c56c", + "arvo:11435": "40172e6fbdc5", + "arvo:11504": "e81dd59f41db", + "arvo:11523": "be3d208e6a00", + "arvo:11633": "1ce72f034978", + "arvo:11657": "96af0a2617c5", + "arvo:11730": "e6a50e02d85a", + "arvo:11876": "387de69b2b70", + "arvo:11896": "dd8f103e2b9d", + "arvo:11908": "22a47c6c2e27", + "arvo:11945": "2bb6ac79bb3e", + "arvo:12096": "4e1a63d3b190", + "arvo:12173": "5f66df3eb388", + "arvo:12195": "c77fba841aaa", + "arvo:12255": "6b2c19236fca", + "arvo:12312": "345e94097be9", + "arvo:1236": "5b07b9dfb5aa", + "arvo:1237": "20157444b597", + "arvo:12419": "0dd8ff8039c7", + "arvo:12420": "369f35f91f15", + "arvo:12466": "52e88b5ff088", + "arvo:12616": "493829ef3dd3", + "arvo:12662": "69ac44a7fe7b", + "arvo:1268": "c11c2c1eaeb0", + "arvo:12745": "41b793d653df", + "arvo:12797": "a1139bb93714", + "arvo:12817": "35b87fdd2878", + "arvo:12818": "1a7de8e08e8b", + "arvo:1304": "2ae489cbae37", + "arvo:13115": "67bb66c8b8e3", + "arvo:13160": "af9de771c1f7", + "arvo:13249": "7f1461a7e3a1", + "arvo:13345": "6db7706eb8eb", + "arvo:1337": "f6874d431807", + "arvo:13466": "76219e34690d", + "arvo:13467": "0e2143ea5e2c", + "arvo:1348": "5b15ae29b862", + "arvo:13530": "d14ec4a4d8b0", + "arvo:13542": "26b4a324d69c", + "arvo:13704": "7d3730e719ca", + "arvo:13725": "07f16499d89f", + "arvo:13730": "3832adecbc35", + "arvo:13741": "fba74b572ce3", + "arvo:13771": "94b31cf8c8f9", + "arvo:13940": "95473ea56a72", + "arvo:13956": "449ce822f494", + "arvo:14215": "60dd8819fd07", + "arvo:14232": "7dacc5aa21f5", + "arvo:14245": "a75958f45a49", + "arvo:14297": "14304626e34d", + "arvo:1436": "a18a06bb3b83", + "arvo:14368": "878be99cb243", + "arvo:14455": "07caf3a837e6", + "arvo:14467": "7565d6a19a35", + "arvo:14481": "b3b0c558412b", + "arvo:14529": "49691983f15d", + "arvo:14537": "2453692af379", + "arvo:14560": "89c2ca1c396c", + "arvo:14565": "184c18cedbfd", + "arvo:14574": "d94e8300a66c", + "arvo:14582": "4cefefb69e84", + "arvo:1461": "a92788e2cf43", + "arvo:14619": "320d8b0fd06b", + "arvo:1468": "cd11e549c632", + "arvo:14696": "51ee0c9d0421", + "arvo:14703": "ba819859e710", + "arvo:1473": "a416bdb1eb1b", + "arvo:14767": "f68a588bca45", + "arvo:14786": "c9bf5b5958e0", + "arvo:14813": "8bff282021eb", + "arvo:14821": "63f688c1417f", + "arvo:14912": "da1b3f330856", + "arvo:14935": "81286459e638", + "arvo:15003": "5d7cddd1ca3b", + "arvo:15120": "6311e20605e4", + "arvo:1513": "8cb64f802f60", + "arvo:15178": "9abbaac903f3", + "arvo:15221": "1cabfaa7d254", + "arvo:15278": "829fd43b3bb4", + "arvo:1538": "5e9ff956933d", + "arvo:15431": "3cfe78e2805f", + "arvo:1570": "63e576050ad1", + "arvo:15707": "915a7bc3b5d6", + "arvo:1571": "1ffb59433bdc", + "arvo:1580": "30962f01c998", + "arvo:15971": "4f13e079dc81", + "arvo:1621": "e9eedd543cb5", + "arvo:1639": "ae5870285e2e", + "arvo:16442": "a149c8c79839", + "arvo:16445": "5a0d018b6baf", + "arvo:16448": "0d09dbee756a", + "arvo:16457": "f3b9be739758", + "arvo:16541": "c6efd5f3649a", + "arvo:16634": "c66b64662c9a", + "arvo:16737": "fc0dd8a7df1a", + "arvo:16820": "7e3f5e2c18f5", + "arvo:16969": "3a93907ac3b0", + "arvo:16972": "70d10ef54b0c", + "arvo:1699": "64969ed3b423", + "arvo:17006": "90545a443e35", + "arvo:17069": "1ad6a098482b", + "arvo:17072": "aad865e09ede", + "arvo:17094": "a202cfabb033", + "arvo:17171": "03c36080a6b7", + "arvo:17305": "e0a70308d550", + "arvo:17597": "8609a564c48c", + "arvo:17607": "b4df7cf79fbc", + "arvo:17715": "b9a427107a12", + "arvo:17737": "53d1f1c286e9", + "arvo:17778": "e1be41b400d1", + "arvo:17855": "36f57f135029", + "arvo:17986": "a2dabb17cfa7", + "arvo:18070": "fa796f24b0f0", + "arvo:18140": "8211c48ad26d", + "arvo:18152": "4733209601b1", + "arvo:18153": "7f8fb87e131e", + "arvo:18196": "1914259120ee", + "arvo:18224": "66eee83a07fe", + "arvo:18225": "86b4c31a5f99", + "arvo:18228": "ebf5f32366d2", + "arvo:18315": "c255a972eea3", + "arvo:1832": "aaa566eee833", + "arvo:18321": "d5c0587932ee", + "arvo:18356": "c51d5cea4cbb", + "arvo:18449": "b0ffb787ed64", + "arvo:18482": "957591f44c16", + "arvo:18540": "51e00183c858", + "arvo:1856": "54c2947078c7", + "arvo:18562": "a0b37984a67d", + "arvo:18615": "e8582ed45084", + "arvo:18687": "f7a65d988c4a", + "arvo:18756": "9d564d93a720", + "arvo:18798": "b1c89fde3ccd", + "arvo:18816": "4abea76c1c6e", + "arvo:18868": "99ab7866d6c0", + "arvo:18877": "f00a893b4d6b", + "arvo:18882": "ca73b2d4170a", + "arvo:18952": "8be07d2c8b21", + "arvo:18979": "9efa4dda7ef8", + "arvo:18988": "fafcc15ecd11", + "arvo:18991": "a1f3c76aa1e8", + "arvo:19013": "9933b3885b68", + "arvo:19039": "f4588b32888a", + "arvo:19070": "f365ebfad7ff", + "arvo:19100": "df591cb337ed", + "arvo:19208": "1af501e98720", + "arvo:19222": "1041988ba95b", + "arvo:19251": "94585ef56e38", + "arvo:1931": "efea7cbc2cbb", + "arvo:19332": "b9576f2b7d2f", + "arvo:19385": "a0ee43bd89a9", + "arvo:19405": "e31827a70053", + "arvo:19414": "14071911db00", + "arvo:19426": "f786afc07761", + "arvo:19463": "41812deb2e08", + "arvo:19497": "64719c28cc03", + "arvo:19498": "848dd951139d", + "arvo:19509": "b65254a774af", + "arvo:19548": "2c4fce27ceea", + "arvo:19573": "9a4afad290f6", + "arvo:19702": "cb5db14d36c8", + "arvo:1975": "61907a3f4880", + "arvo:19757": "c759383a4b95", + "arvo:1976": "a189f66d5d79", + "arvo:19822": "8b28ef53dd2b", + "arvo:19902": "cf054a7a22f0", + "arvo:19910": "a8d44dc6a00d", + "arvo:19956": "e155784eea05", + "arvo:19999": "02adfad2d97b", + "arvo:20050": "a3047ccff077", + "arvo:20060": "91fe162feb85", + "arvo:20083": "7e8519228725", + "arvo:20112": "415db652141a", + "arvo:20131": "03c5822280bf", + "arvo:20147": "fe3c3a06d5cf", + "arvo:20176": "d54ef85a55a8", + "arvo:20193": "0eddda6a16f1", + "arvo:20200": "5491cab668c9", + "arvo:20321": "30954c9f3f36", + "arvo:20459": "caa47dc1664d", + "arvo:20476": "7391abf95e6d", + "arvo:20494": "9d3001b76f47", + "arvo:20578": "ee2ac83f8737", + "arvo:20652": "49e9ddf62e73", + "arvo:20655": "0b431bf50614", + "arvo:20694": "3995d267493d", + "arvo:20716": "60b823174eb6", + "arvo:20775": "945fa8e96af4", + "arvo:20800": "7ffa357a1780", + "arvo:20823": "28fe53cc3e78", + "arvo:20830": "d1156d35774a", + "arvo:20840": "331c6d93cc1b", + "arvo:20848": "e903410b4afe", + "arvo:20905": "159517a5cce5", + "arvo:20906": "54bc6de0ba86", + "arvo:20944": "e61fe0ef430e", + "arvo:21000": "7e047864c6a8", + "arvo:21011": "f9abbd155c1d", + "arvo:21026": "63d798c86c00", + "arvo:21070": "fad369beb8ef", + "arvo:21092": "28b65428fb19", + "arvo:21165": "0a30700cb5b8", + "arvo:21299": "02f3349454be", + "arvo:21300": "c3034fdad4eb", + "arvo:21301": "a8bb9596aaf6", + "arvo:21302": "59d477634f61", + "arvo:21309": "c8d8e3d1f80b", + "arvo:21316": "fc3510fe9011", + "arvo:21321": "0b10c62610ca", + "arvo:21324": "28e746430517", + "arvo:21325": "2e96adc1aff0", + "arvo:21327": "052905ccc39e", + "arvo:21339": "6ab17edb700d", + "arvo:21342": "5fc8ec5fe9c8", + "arvo:21359": "fe3977ca562c", + "arvo:21414": "4d5f6e0d583d", + "arvo:21434": "1e2610d1e36c", + "arvo:21435": "c41b3b0e40a5", + "arvo:21514": "ff859617f6a1", + "arvo:21578": "b11d89678d19", + "arvo:21579": "9af8d999ec8c", + "arvo:21580": "3a4648efd8c5", + "arvo:21604": "24244b7e6db7", + "arvo:21638": "f9ab591d55ac", + "arvo:21641": "2f4a2bd50d62", + "arvo:21670": "2205b8c790d2", + "arvo:21916": "720636271813", + "arvo:21936": "703deab58b8b", + "arvo:21960": "f0ecf27d3674", + "arvo:21984": "2577085cebcf", + "arvo:22094": "4c906f9cb660", + "arvo:22105": "32bc6b55bd58", + "arvo:22140": "659fdacd97f1", + "arvo:22244": "de4835cbf655", + "arvo:22295": "939053302f7b", + "arvo:22427": "f0ce9452c2b6", + "arvo:22430": "50f8fbad9eff", + "arvo:22507": "2919669965f6", + "arvo:22528": "138a87ba8887", + "arvo:22560": "f963bded2498", + "arvo:22670": "22d1b7233f91", + "arvo:22978": "c5ed80bad91b", + "arvo:22979": "7029733c4903", + "arvo:23021": "982bc7073acd", + "arvo:23044": "0623a1a5bab0", + "arvo:23074": "83645ed262e5", + "arvo:23077": "1060c9023918", + "arvo:23140": "c92c23e4ec11", + "arvo:23153": "d84c68603c47", + "arvo:23197": "6886e6e921c1", + "arvo:23215": "e8423cee1385", + "arvo:23296": "be24b651b1c4", + "arvo:23350": "526204f871be", + "arvo:23433": "07244b5ea161", + "arvo:23499": "1204585d32a5", + "arvo:23547": "2ceee031cd37", + "arvo:23619": "62705254dfb2", + "arvo:23653": "9325b1d5c442", + "arvo:23654": "edcc96132c6e", + "arvo:23715": "26e4dbd72880", + "arvo:23717": "72dddf3ddb9e", + "arvo:23725": "88d9afaa50c1", + "arvo:23743": "9002383a9a0f", + "arvo:23764": "da95ac9b4a2a", + "arvo:23765": "3f75132d24fd", + "arvo:23778": "7a714f7dff4b", + "arvo:23787": "8a3094c37d8b", + "arvo:23816": "40562966005d", + "arvo:23877": "c271cf6a5c8e", + "arvo:23979": "967fb2764f0c", + "arvo:23991": "e93030f539f6", + "arvo:24020": "3f52f4a9033f", + "arvo:24055": "986a114fee02", + "arvo:24097": "71b6cb5516dd", + "arvo:24099": "c88a9b7d1c2b", + "arvo:24101": "1227d40df52d", + "arvo:24157": "15399e3a204b", + "arvo:24183": "5c12caf04f81", + "arvo:24186": "409de6b15e42", + "arvo:24465": "f49d702a8e15", + "arvo:24528": "8cdccdd9d3a8", + "arvo:24538": "ae47f665b973", + "arvo:24591": "692e3703fee8", + "arvo:24633": "985f4749b2be", + "arvo:24638": "c229d6fbb38a", + "arvo:24925": "4424dea22d0f", + "arvo:24993": "d2c0e10a5d65", + "arvo:25007": "355e24d88ecf", + "arvo:25013": "798a9f1677b2", + "arvo:25014": "421c84e6544a", + "arvo:25121": "fc4686ef7253", + "arvo:25167": "7ad0f9834b30", + "arvo:25210": "bf30e184e4de", + "arvo:25221": "8a00586f1aa2", + "arvo:25240": "68acfdf8c1d7", + "arvo:25257": "510592998846", + "arvo:25292": "caff573b052f", + "arvo:25332": "333ba43c2a67", + "arvo:25341": "81cda8cf33ae", + "arvo:25364": "c594e44e0244", + "arvo:25366": "20983821305a", + "arvo:25377": "a4c2dfaff573", + "arvo:25384": "c254053e2335", + "arvo:25388": "43356d8d575b", + "arvo:25401": "1dddfc9de894", + "arvo:25473": "b21e18944197", + "arvo:25526": "734ca5221b33", + "arvo:25530": "a2bb5ddbd570", + "arvo:25561": "77c557620bc4", + "arvo:25704": "a3ab7e328e00", + "arvo:25815": "29027209fec2", + "arvo:25841": "9f40cc10d420", + "arvo:25884": "0c1ea1bb474a", + "arvo:25885": "7a261bee74e4", + "arvo:25910": "b13334d5c63b", + "arvo:25943": "9bcbe911e1b6", + "arvo:26022": "cf7207e44aec", + "arvo:26026": "055a404d0d25", + "arvo:26103": "c66d98917d6b", + "arvo:26163": "d5b7e8289b20", + "arvo:26171": "19586f11b51c", + "arvo:26197": "8a3b45466bcc", + "arvo:2623": "964ac89bb462", + "arvo:26264": "907129bfc95b", + "arvo:26325": "ded9cfdf7e41", + "arvo:26327": "ec4e27097245", + "arvo:26345": "a3f02d71ba34", + "arvo:26371": "0b30950112a6", + "arvo:26400": "79c1a767c641", + "arvo:26406": "352f852251ec", + "arvo:26442": "82f0e8107ce7", + "arvo:26567": "366abee41bdc", + "arvo:26593": "0e13e433560e", + "arvo:26635": "5ab60103866a", + "arvo:26682": "bbe3801bd7e6", + "arvo:26712": "a484c3416695", + "arvo:26755": "bdcea13ae0ad", + "arvo:26803": "bb5678bd37d3", + "arvo:26810": "33206b95b754", + "arvo:26829": "9f685b64bfd2", + "arvo:26952": "262c744195a0", + "arvo:27020": "378ae7afd6ca", + "arvo:27025": "b545835a2977", + "arvo:27241": "b176779fdd9b", + "arvo:27269": "522e8c0cc1a2", + "arvo:27279": "07ca087ef286", + "arvo:27413": "8a4f5af334fc", + "arvo:27480": "cab1eb98d5c7", + "arvo:27503": "8d911957c22b", + "arvo:27651": "e2d094224a23", + "arvo:27691": "77a862c21242", + "arvo:27710": "9ae4eec9bb13", + "arvo:27719": "b63896d3e6e8", + "arvo:27812": "cdcd222a2bb6", + "arvo:27816": "7a36d61a4ca1", + "arvo:27818": "6f474f991f4e", + "arvo:27851": "a540792c63dd", + "arvo:27853": "4874f430f675", + "arvo:27856": "e4496a87246b", + "arvo:27871": "08e910491344", + "arvo:27934": "de86412f5e53", + "arvo:27936": "455937b13f05", + "arvo:27961": "b0343cfbd74a", + "arvo:28064": "5424dac68a21", + "arvo:28109": "3de6bd766f97", + "arvo:28129": "6e849fdf7023", + "arvo:28135": "1e0b34aa218d", + "arvo:28151": "c8a6dc09ff92", + "arvo:28181": "e340699e2c8a", + "arvo:28185": "5308a7e905c6", + "arvo:28191": "11480c0be28a", + "arvo:28216": "c0128f47ea00", + "arvo:28239": "28dff9a03f46", + "arvo:28253": "5befdc617c7f", + "arvo:28265": "be3f8ce7c0b4", + "arvo:2828": "0e34967038db", + "arvo:28315": "27bb57fd9011", + "arvo:28383": "9b67947806ba", + "arvo:28392": "ddf719b1d784", + "arvo:28458": "faeb602555f5", + "arvo:28462": "9bce1216749b", + "arvo:28467": "6eb7e8683bc7", + "arvo:28477": "f0cf2d0e76ed", + "arvo:28484": "d895671aad11", + "arvo:28556": "77bd5f8473e0", + "arvo:28587": "434654b52ba5", + "arvo:28654": "9ec3e70a9507", + "arvo:28666": "e9649fbae928", + "arvo:28730": "2c39db871609", + "arvo:28750": "ca6f56972e86", + "arvo:28766": "1d6c5c3de511", + "arvo:28777": "5ab53c0609f6", + "arvo:28810": "596850bee766", + "arvo:28843": "f868b3786817", + "arvo:28991": "d356a6111fe0", + "arvo:29103": "48c63a37c9e7", + "arvo:29125": "9fbd74583a9e", + "arvo:29170": "8791d6e9f516", + "arvo:29171": "c45be64763d8", + "arvo:29185": "d356db9301b4", + "arvo:29217": "32f6eea014a5", + "arvo:29243": "274c3a19ab4b", + "arvo:29266": "5f1855aedd26", + "arvo:29267": "4623878562b3", + "arvo:29271": "84c359d5bd32", + "arvo:29290": "cc42aba78702", + "arvo:29338": "09ebd84043a4", + "arvo:29366": "73d545d3e528", + "arvo:29377": "31242728d7fc", + "arvo:29408": "636322d4ace9", + "arvo:29451": "efba3d76ea69", + "arvo:29538": "38c12016dbcc", + "arvo:29564": "73ae5ef51f78", + "arvo:29633": "217f182c21f9", + "arvo:29728": "e72994644b5b", + "arvo:29769": "c0d7f7a327d8", + "arvo:29827": "206634916fd8", + "arvo:29912": "e482f3b4a64b", + "arvo:29974": "4a8aac750399", + "arvo:29976": "29b18428e5ca", + "arvo:30051": "ccce6c9759df", + "arvo:30090": "409315933d6b", + "arvo:30099": "5dc36e582919", + "arvo:30113": "0234842292a9", + "arvo:3012": "e688b78ceef9", + "arvo:30181": "08d3bdea8944", + "arvo:30217": "3dd1f1de8f37", + "arvo:30234": "94f5f5cb9a33", + "arvo:30236": "a0a3b80f3e05", + "arvo:30271": "eabbe7c92771", + "arvo:30339": "32344043c85f", + "arvo:30403": "f41df95e975d", + "arvo:30507": "d2ef6cecfaed", + "arvo:30748": "9eb51da7c539", + "arvo:30800": "b635ca3cab77", + "arvo:30831": "b9fd5bdf1a5b", + "arvo:30868": "4ab7b684e15c", + "arvo:30875": "fe91e517c981", + "arvo:30886": "63c413336f21", + "arvo:30921": "d4b236223416", + "arvo:30974": "825f94f83564", + "arvo:30983": "3cc0a6e9dad7", + "arvo:30999": "42a34c941def", + "arvo:31038": "9a3ece687db5", + "arvo:31042": "530795d8500f", + "arvo:31065": "cab5a1bd2e5c", + "arvo:31120": "9a6ef16d4960", + "arvo:31121": "a018da1ae0cd", + "arvo:31124": "732c6ad2abf8", + "arvo:31179": "94a755939200", + "arvo:31243": "7e02df1b3a15", + "arvo:31250": "2efd72bde40b", + "arvo:31276": "e3d9236e1843", + "arvo:31301": "49f436c7cbd8", + "arvo:31332": "124c38574d3b", + "arvo:31425": "1160dbb41b36", + "arvo:31454": "22807baeaf1a", + "arvo:31491": "e4d93ae1d19e", + "arvo:31501": "876f95a7fcd5", + "arvo:31541": "2ce5b6f7e43b", + "arvo:31576": "1f1c15ecb21a", + "arvo:31698": "ecb542c9a5ca", + "arvo:31705": "03528f8ff794", + "arvo:3175": "c6f4db1fbf57", + "arvo:31789": "fee4ccf5781d", + "arvo:31878": "7e4fff8f02ed", + "arvo:31961": "645c1649cbfd", + "arvo:32029": "475855b45774", + "arvo:32177": "f6e0d5a84ea9", + "arvo:32202": "b5dbadd39b65", + "arvo:32275": "1325b83ed58d", + "arvo:32356": "772f86c4fac2", + "arvo:32482": "67ffb21884b1", + "arvo:32521": "845c43f03df6", + "arvo:32555": "8d3f397c72d8", + "arvo:3257": "8a6dc5e8a07a", + "arvo:32604": "58cebd6cf049", + "arvo:3265": "58bae43cf7e8", + "arvo:32663": "4c0d284892cb", + "arvo:32785": "af430efd6324", + "arvo:32807": "994928543518", + "arvo:3305": "cae3ec3d81cb", + "arvo:33059": "406f58d8c2ed", + "arvo:33071": "3eb937881117", + "arvo:33150": "3821e6d5fb17", + "arvo:33238": "82049595c052", + "arvo:3325": "dc10b0bcf37a", + "arvo:33251": "52936b6b1486", + "arvo:33318": "b441d6bfbf75", + "arvo:33340": "8018e34fb88a", + "arvo:33474": "28f85a9b17b9", + "arvo:33556": "7ae8b6a843ad", + "arvo:33576": "560e614cf532", + "arvo:3371": "89e2ad2986c1", + "arvo:33750": "43756a48255b", + "arvo:3376": "1ec6f99a2665", + "arvo:33844": "9f8aa475e53c", + "arvo:33852": "b0ad6a540c5e", + "arvo:33854": "a5848f2e95d5", + "arvo:33991": "975a9dc6bafb", + "arvo:34013": "fe69c180955a", + "arvo:3408": "d673e4a1f6cd", + "arvo:34096": "e4c095577107", + "arvo:3411": "ef7491506e55", + "arvo:34116": "63eeb7c81f7b", + "arvo:34138": "fca0a292bc4d", + "arvo:34259": "77039661a55b", + "arvo:34299": "5dbe3f1412dd", + "arvo:34374": "839acbef2140", + "arvo:3438": "604b34b8e92e", + "arvo:34386": "8c6579f447df", + "arvo:34461": "e7546384db98", + "arvo:3447": "e1f7776cf5f7", + "arvo:34584": "f800e2dea5f1", + "arvo:3461": "5c6a353c84cb", + "arvo:34652": "0dc6e7a00715", + "arvo:34655": "99b709530a98", + "arvo:34691": "6671774b109d", + "arvo:34695": "84df1680bfb0", + "arvo:34755": "38cb9ff93369", + "arvo:34863": "03d8b5fa0f28", + "arvo:3497": "50acbc1798fe", + "arvo:34973": "94ca5e2678e5", + "arvo:3498": "f4307d72b0d6", + "arvo:35019": "e50998816aa1", + "arvo:3505": "d25b5b2c7a19", + "arvo:35086": "77edc3964b06", + "arvo:35109": "4ff3ed7d0f1e", + "arvo:35140": "9903a8d9b12c", + "arvo:35165": "c8b01409cf05", + "arvo:35172": "9e50ffedbe16", + "arvo:3522": "4453cbe43baf", + "arvo:35293": "a743f77d606e", + "arvo:3530": "c99bf82fa122", + "arvo:35305": "9f2af4da34ac", + "arvo:3531": "6b5f8cf37dfe", + "arvo:3535": "1c87bba94592", + "arvo:35410": "99703c27d7b1", + "arvo:35458": "3774cca9368a", + "arvo:35543": "c7124265668e", + "arvo:3560": "6736912a4753", + "arvo:3569": "9053ae489c8e", + "arvo:35727": "976ee46653a3", + "arvo:35876": "3bda1fb14f64", + "arvo:35902": "5b389697a4f6", + "arvo:35925": "9af4915199f7", + "arvo:36025": "dcbafcaeaccf", + "arvo:36158": "8cbbfc99654c", + "arvo:3621": "836efb254e66", + "arvo:3630": "12b025ee3e5e", + "arvo:36464": "862e6613cfac", + "arvo:36476": "e18ff0674299", + "arvo:36485": "55083b90c896", + "arvo:36497": "9a4cb1b08b86", + "arvo:3658": "7255c4770dc0", + "arvo:36611": "9237cbe46992", + "arvo:36793": "48025532f60c", + "arvo:368": "48c82fb46642", + "arvo:3680": "8855492dbb44", + "arvo:36861": "aaf03c5998f0", + "arvo:36908": "61c798ab9acb", + "arvo:36911": "e120dbcd2c84", + "arvo:36930": "3e4a672784fa", + "arvo:36955": "99e305936cc6", + "arvo:36999": "bfda3815a148", + "arvo:37056": "f3955e35a314", + "arvo:37151": "de2d50303029", + "arvo:37211": "3c68ecee1c8a", + "arvo:3732": "e2032a8aea47", + "arvo:3736": "9804cab73d21", + "arvo:37443": "1cd1cb45aff3", + "arvo:37575": "14cbf6d8dd3a", + "arvo:37621": "65ab1f0e15e4", + "arvo:37687": "0f37c72582cb", + "arvo:37896": "defedf883dbf", + "arvo:37925": "994cb716f600", + "arvo:38050": "005d7bb948b5", + "arvo:38080": "d0346d729539", + "arvo:38148": "eac1b8dabbf4", + "arvo:38156": "8ee113fd9b16", + "arvo:3818": "dcb3b947669b", + "arvo:38251": "22907fbf5705", + "arvo:38283": "edd482a74340", + "arvo:38298": "578a0a0e0234", + "arvo:38307": "ba4cb4eadebf", + "arvo:38347": "21afccb41e84", + "arvo:38355": "f379b95f979c", + "arvo:38393": "85cc4c724d7f", + "arvo:3848": "5f495427299b", + "arvo:38587": "7aeeeea40fa3", + "arvo:3862": "bdbd4f747dbd", + "arvo:38751": "a70fe4b73052", + "arvo:38764": "5ccdf96377af", + "arvo:38766": "201f8546c304", + "arvo:38815": "97c4af0ca60f", + "arvo:38870": "8e8847db0236", + "arvo:38872": "81ee0bdc3cac", + "arvo:38878": "f46f4d2cf59a", + "arvo:38924": "70371f4ad991", + "arvo:38943": "bcc598adeabf", + "arvo:38947": "475984f88794", + "arvo:38952": "605b1d2ce8a7", + "arvo:39283": "d2d418bfe177", + "arvo:3938": "a5c9210adf28", + "arvo:3940": "c454e99caaab", + "arvo:39481": "f86a0727fd32", + "arvo:3956": "1daf4057c8da", + "arvo:39689": "e3b20091ddc6", + "arvo:39741": "274999a29a13", + "arvo:39800": "7d49e3ac887a", + "arvo:39802": "aa39d03a5c4b", + "arvo:39897": "d16ed10ed848", + "arvo:40087": "14f875ac9508", + "arvo:40160": "f63c80706ce5", + "arvo:40317": "32bd18f63544", + "arvo:40363": "c3efa5216d93", + "arvo:40465": "7e987b437ea4", + "arvo:40508": "7423c1af9ff4", + "arvo:40512": "1bc997a6d40c", + "arvo:40540": "b3a166509491", + "arvo:40544": "462b70fcd936", + "arvo:40617": "faadfb943907", + "arvo:40618": "0050c00e06ee", + "arvo:40620": "96b7a3f5a162", + "arvo:40623": "e1c312146843", + "arvo:40674": "6f27934bac63", + "arvo:40683": "a44d4fe12798", + "arvo:4071": "a86958dd6aff", + "arvo:40769": "ecf8b85daf2a", + "arvo:40851": "c423e8aedc41", + "arvo:40933": "14719cb276b0", + "arvo:4097": "7e6589644395", + "arvo:4099": "ae72b22796c0", + "arvo:41073": "b198d0ad30e6", + "arvo:41143": "27f2ae8a8874", + "arvo:41221": "cfe519d61c98", + "arvo:41235": "396d85a3c9fe", + "arvo:41337": "1532bf1bd6d3", + "arvo:41356": "00e2922cafcc", + "arvo:4161": "f7b738cdc8ed", + "arvo:42108": "4b180d7d0d56", + "arvo:42123": "c2ecc311aa42", + "arvo:42179": "39476e2a89b1", + "arvo:42227": "ae0b94af2ce4", + "arvo:42238": "2728f4d11593", + "arvo:42264": "075d179f1831", + "arvo:42268": "c600b4e3c9dd", + "arvo:42275": "b010ba60d735", + "arvo:42280": "a26574880a6d", + "arvo:42298": "a4db2b0a3640", + "arvo:42322": "28d052d0f8ce", + "arvo:42325": "30acb3e34546", + "arvo:42327": "facc623feeb8", + "arvo:42329": "b9c50d94ab7b", + "arvo:42464": "8b3632de1d99", + "arvo:42479": "284e8c783db4", + "arvo:42538": "774399804f2b", + "arvo:42560": "97adb79a1bab", + "arvo:42613": "092f34e80b81", + "arvo:42616": "0d06901dbd46", + "arvo:42633": "2d6b82bfffbd", + "arvo:42639": "8aa32abdbebd", + "arvo:42687": "fc0709f44576", + "arvo:42736": "823ba5529239", + "arvo:4289": "ed14796c2336", + "arvo:42894": "29d86a49e14d", + "arvo:42907": "cbfbfc070954", + "arvo:42917": "5b76fd1b7b13", + "arvo:42957": "69f4b8eef5ed", + "arvo:42998": "fe3ac49d80a6", + "arvo:43004": "935f8450a912", + "arvo:43012": "971c073d1eba", + "arvo:43156": "df49891f5c42", + "arvo:43209": "04fb830fbe00", + "arvo:4322": "c68a3c9111cd", + "arvo:43255": "b1a1b0106b97", + "arvo:43268": "be1378687fc1", + "arvo:43307": "165c8213589a", + "arvo:43354": "4b1d487307d3", + "arvo:43365": "01dd24ab931b", + "arvo:43372": "61eb771e781f", + "arvo:43408": "fe6935e641d3", + "arvo:43414": "35b9294ae7fd", + "arvo:43434": "7454bf1bfe75", + "arvo:43545": "4cffcc6c50bd", + "arvo:43599": "03acaf8c925d", + "arvo:43621": "db4fdced5e31", + "arvo:43680": "55db458c68aa", + "arvo:43688": "5b164db795a9", + "arvo:43795": "2a1f09bd4dd6", + "arvo:43847": "715b38980d2c", + "arvo:4396": "eac8515f4a17", + "arvo:43984": "db93222881aa", + "arvo:44008": "811bd94b9612", + "arvo:44034": "43fc4ba0f4f7", + "arvo:4404": "d5373c84cb54", + "arvo:44089": "49e52e3a5d33", + "arvo:44151": "df9b52356df3", + "arvo:44160": "6c79d4749eea", + "arvo:44199": "883774379779", + "arvo:44239": "5d827499a8b8", + "arvo:44258": "992cbaa91c2f", + "arvo:44280": "676cbcb4bf9e", + "arvo:4440": "09fca4661db0", + "arvo:44406": "60985770ee11", + "arvo:44432": "bd1149560cb3", + "arvo:44482": "14ecdbcf57f2", + "arvo:44483": "388659a87174", + "arvo:44503": "40a0b7d3e35b", + "arvo:4451": "2f1264cdb0ec", + "arvo:4452": "e2f5e5498455", + "arvo:44574": "9018e483c0cd", + "arvo:44597": "6a3789fb582c", + "arvo:44610": "627ff9332e66", + "arvo:44659": "a961738072ad", + "arvo:44695": "44641407ca14", + "arvo:44766": "d2939604e198", + "arvo:44779": "f62f0eac6345", + "arvo:44855": "87b79eb80626", + "arvo:44864": "23778c5cb667", + "arvo:44887": "51eec8e2be92", + "arvo:4492": "76d84f9a5e8d", + "arvo:44953": "aac83a90d8da", + "arvo:44983": "ffd2c736062b", + "arvo:45036": "d7d206fac744", + "arvo:4511": "c90e06319791", + "arvo:45161": "8da308719d33", + "arvo:45173": "92122b22637a", + "arvo:45192": "3d6a10049529", + "arvo:45222": "fcf348d5f759", + "arvo:45320": "514530e185c9", + "arvo:45347": "c063e5e98325", + "arvo:45353": "21596e049b39", + "arvo:45493": "140fe704e51c", + "arvo:45523": "aa926808ef50", + "arvo:45552": "4e56039f80d0", + "arvo:45568": "9d069e830b06", + "arvo:45603": "5bb718f8f3b7", + "arvo:45822": "9fe92bbca4be", + "arvo:45879": "31559be07cf9", + "arvo:45992": "70bc3b10fdde", + "arvo:45993": "4d376687a132", + "arvo:46082": "559c1d0ee82d", + "arvo:46224": "9335e8766e70", + "arvo:46244": "2f94b844e08b", + "arvo:46279": "c47c0903f099", + "arvo:46307": "f2255e2de397", + "arvo:46309": "0bc653761805", + "arvo:46315": "aee34eb90863", + "arvo:46323": "b4c66f23bdb5", + "arvo:4637": "2457b6973593", + "arvo:46499": "17a0dbc29119", + "arvo:46516": "612a061b5234", + "arvo:46541": "bd9d6cfcf58d", + "arvo:46543": "af193e67e883", + "arvo:46615": "5a7afe99dbc5", + "arvo:46653": "1acd80faccfe", + "arvo:46679": "3e5301ae5b99", + "arvo:4670": "2252d2bed3b1", + "arvo:46734": "b472b8e6dd98", + "arvo:46779": "af77c9c9c266", + "arvo:46847": "0a616c3576fd", + "arvo:46852": "00e0d08d9ff3", + "arvo:46883": "36ad3496cb19", + "arvo:46917": "5348cb682708", + "arvo:46918": "f54dfe83f605", + "arvo:46957": "999f37e36159", + "arvo:47000": "9d67f4a9c12e", + "arvo:47085": "879e324bd3d7", + "arvo:47101": "729ba8012a97", + "arvo:47143": "9308975e078d", + "arvo:47150": "17938224434f", + "arvo:47157": "cd1036f44e46", + "arvo:47213": "9d32d2927f28", + "arvo:47392": "a79705a78dcc", + "arvo:47500": "3d5316f98dc2", + "arvo:47512": "9f93df1e733a", + "arvo:47525": "521d3044eeca", + "arvo:47601": "9bce54d6711d", + "arvo:47624": "f45ab52d8daf", + "arvo:47675": "2a1f2cc2e4f5", + "arvo:47728": "660e88aafbd7", + "arvo:47730": "b8963788e301", + "arvo:47770": "1cc02417dc79", + "arvo:47790": "8a8100947915", + "arvo:4790": "90ba0532b428", + "arvo:47947": "2144e5bfc066", + "arvo:47975": "c64d3cac1758", + "arvo:47986": "ce0e6982e091", + "arvo:48020": "2da514c44c3e", + "arvo:4812": "2171eb194215", + "arvo:4819": "9e8a440acfbc", + "arvo:4822": "2479550b477d", + "arvo:48305": "7ec57c6dab8f", + "arvo:48736": "c009570d27b2", + "arvo:48863": "f596ac22066e", + "arvo:48877": "e1673a1d2749", + "arvo:48915": "212c10cd1087", + "arvo:48959": "21a713c36880", + "arvo:49045": "8cc703aa586a", + "arvo:49187": "974cb4a321ec", + "arvo:49248": "0e6869d6375b", + "arvo:49259": "ef240ecaa389", + "arvo:49269": "b016490c5266", + "arvo:49290": "90e9571fe3fc", + "arvo:49386": "f4ae20f509d7", + "arvo:49427": "7b6396177f2b", + "arvo:49429": "40a3ccaaf500", + "arvo:49455": "1febf8aeca6c", + "arvo:49461": "3063139bd2e9", + "arvo:49495": "e4914b907aa9", + "arvo:49528": "025c418e7c07", + "arvo:49542": "852d3c3cc084", + "arvo:49550": "5150175946c3", + "arvo:49606": "e7e448baaca2", + "arvo:49613": "4f8b2935a225", + "arvo:49638": "37b7bff06dad", + "arvo:49797": "71dd273c7988", + "arvo:49801": "9e6261204878", + "arvo:49901": "2ac9828336cf", + "arvo:49903": "7db00fe8981f", + "arvo:50099": "b0dcaa72834c", + "arvo:50252": "57891278d48a", + "arvo:50267": "c2063d542d08", + "arvo:50305": "f3583cc8d835", + "arvo:50306": "5de0d536aef9", + "arvo:50307": "dbd6f1019930", + "arvo:50326": "27eb66d8b104", + "arvo:50414": "a52c92749d7e", + "arvo:50589": "092d72df889e", + "arvo:50629": "4e769f65a137", + "arvo:50656": "dfd9ac7c1dc2", + "arvo:50663": "5cb0be6e733f", + "arvo:50683": "da1ac3bae10b", + "arvo:50834": "a7616013daf8", + "arvo:50847": "90459c89b9c8", + "arvo:50893": "759d707cd6b1", + "arvo:509": "ee4b3ac5b013", + "arvo:50901": "62474b801fe2", + "arvo:50957": "465ab2e69da4", + "arvo:51008": "848927ff30a7", + "arvo:51010": "5be7a1abdab4", + "arvo:51011": "0c1048bc241d", + "arvo:51045": "e8f90c415781", + "arvo:51083": "01bd4deb594c", + "arvo:51089": "bd3da937b650", + "arvo:51102": "44622ca1cc3a", + "arvo:51124": "1092af5b4566", + "arvo:51132": "00db0167f747", + "arvo:51208": "50b564917341", + "arvo:51224": "12cb777e0fff", + "arvo:51275": "910f326c24ea", + "arvo:51292": "0ca80842f293", + "arvo:51356": "0cedd3c815fc", + "arvo:51418": "69e1c1b74f59", + "arvo:51498": "851eb997b4c4", + "arvo:51563": "8f3a6d05a5f5", + "arvo:51603": "6edfb38de8e1", + "arvo:51618": "b3c40c255be8", + "arvo:51661": "a5ba316ff475", + "arvo:51735": "02253bfe67c6", + "arvo:51757": "57d9934fdc8a", + "arvo:51799": "0c8efd628ae0", + "arvo:51845": "9b31813b8a93", + "arvo:51988": "280e6dfc145a", + "arvo:52006": "74555a51e0c4", + "arvo:52037": "c5340aad8397", + "arvo:52049": "007b59d12e50", + "arvo:52066": "dcdbe2c9087f", + "arvo:52102": "845f9af5cec5", + "arvo:52145": "afcad6aa9103", + "arvo:52160": "2a07fba1bfa5", + "arvo:52175": "57c2c9e6d4a4", + "arvo:52195": "f6bc546f8d68", + "arvo:52204": "5b23768d2f21", + "arvo:52228": "ccde3536e5eb", + "arvo:52229": "0c365da3d7a3", + "arvo:52243": "b4f88ff82b83", + "arvo:52305": "d767b94f193a", + "arvo:52317": "f9be5e1e6c66", + "arvo:52326": "c355763b3e9e", + "arvo:52410": "870950919b93", + "arvo:52430": "fd4ad45ce1e0", + "arvo:52465": "77d43ceecc35", + "arvo:52475": "83fe582adb11", + "arvo:52486": "a1dde3e80f1a", + "arvo:5256": "dd4b92daf467", + "arvo:52634": "a1b47a2dc2a7", + "arvo:52724": "4725457a96fc", + "arvo:52869": "e83edd175017", + "arvo:52944": "f7f31052a844", + "arvo:5296": "c73616e26efa", + "arvo:5298": "dc74f5826a2c", + "arvo:52986": "ebc30d65ac3e", + "arvo:53052": "df906c1f47ca", + "arvo:53054": "9ed15142efb8", + "arvo:53080": "916a254093ac", + "arvo:53118": "e20a4d654700", + "arvo:53149": "07f3469111c4", + "arvo:53158": "74719bbade94", + "arvo:53183": "1351e6991560", + "arvo:53199": "54c01e63d38f", + "arvo:53210": "e6321b26f994", + "arvo:53417": "1d6134b76425", + "arvo:53456": "164af0179cd3", + "arvo:53483": "0a0ad2df1902", + "arvo:53499": "9f6bc04a5223", + "arvo:53536": "58e849e01d2a", + "arvo:53613": "7f4fbc7e9b2a", + "arvo:53618": "28b6cfa07c66", + "arvo:53619": "662f01039d59", + "arvo:53631": "b277f916671a", + "arvo:53666": "53722c5cc963", + "arvo:53711": "a626b1598cbc", + "arvo:53740": "4a9dc4707d84", + "arvo:53750": "ffcec1fe91e4", + "arvo:53903": "97c47cca337e", + "arvo:53927": "6180df9dfff9", + "arvo:53952": "ddcecc0d3eb8", + "arvo:5429": "44789cf63173", + "arvo:54330": "0ecc3528c896", + "arvo:54436": "9c0902ab7638", + "arvo:54482": "fa5fcc5b2bf0", + "arvo:54511": "85542d40c5d4", + "arvo:54625": "a157c4aecdce", + "arvo:54667": "9f922a5336ff", + "arvo:54811": "8d4647017439", + "arvo:54839": "12d0a3dada37", + "arvo:5492": "473def3f0ded", + "arvo:5494": "b584367de7e6", + "arvo:54948": "d1ade49c593a", + "arvo:54949": "a146ade42ee5", + "arvo:5496": "53759572187d", + "arvo:54972": "ba7e49f91495", + "arvo:55020": "645b44a36347", + "arvo:55146": "275eaf1cc1d3", + "arvo:55214": "bfbaa418e398", + "arvo:55218": "cfe6812f830f", + "arvo:55282": "2f841009d204", + "arvo:55413": "038319403206", + "arvo:55430": "bb92fe3bfc7d", + "arvo:55443": "9d7ada494590", + "arvo:55556": "1f8d7b43ee27", + "arvo:55587": "a74c84c440e1", + "arvo:55820": "b73b4967e105", + "arvo:55868": "8459cc5cf26f", + "arvo:55886": "172eabaf1b74", + "arvo:55898": "79d8d04eb5e9", + "arvo:55933": "3baddb6ac0ac", + "arvo:55948": "dc4a96d6e3f1", + "arvo:55964": "3214518c6cf6", + "arvo:55980": "ecd4a518a462", + "arvo:55985": "b6b8ae9a3469", + "arvo:56037": "70437d1d566a", + "arvo:56076": "eee6753e32b1", + "arvo:56150": "dc3c31b2d964", + "arvo:56156": "b68f99982ca8", + "arvo:56160": "b49454171ac4", + "arvo:56179": "4d8c6a2035bf", + "arvo:56213": "b79caf4c4813", + "arvo:5625": "f06138be1b80", + "arvo:56272": "89b5a1b5ca3c", + "arvo:56277": "6853fe30baa6", + "arvo:5641": "3fbbe0b196d2", + "arvo:56450": "013d30ce1476", + "arvo:56454": "c441c9d4558c", + "arvo:56469": "b11b53968b5a", + "arvo:56474": "8a7b14ff5de4", + "arvo:56513": "4e2ae0e8c9fa", + "arvo:56515": "752ed0b2eda3", + "arvo:5665": "54014dae0e4e", + "arvo:56682": "d25a42135575", + "arvo:56726": "c82000793ee7", + "arvo:56837": "d900aa0f4724", + "arvo:56895": "9eadf89f6cc7", + "arvo:56917": "ad860b66dcc2", + "arvo:56936": "5f73bb641499", + "arvo:56947": "9ee72d74ae1b", + "arvo:56964": "3da55a90224c", + "arvo:56990": "ea08c2712a81", + "arvo:56991": "03b5ec8110f9", + "arvo:57001": "4fed400458bb", + "arvo:57002": "8c7fc9c4c60b", + "arvo:57025": "4d5fe34c02df", + "arvo:57037": "956cdc2d29bc", + "arvo:57061": "19b3023edfcc", + "arvo:5710": "d6fd8f30f401", + "arvo:57209": "c0c39e24c8af", + "arvo:57223": "3027efe80aee", + "arvo:57234": "f50822bb02df", + "arvo:57284": "f37bccecbaab", + "arvo:5729": "88e0be1d8130", + "arvo:57317": "9d953f75a23a", + "arvo:57320": "9336179e8d59", + "arvo:57333": "93dbdd29b34a", + "arvo:57354": "faf39ea9faa6", + "arvo:57369": "68f6ce30c5e9", + "arvo:57378": "66e14b94552b", + "arvo:5740": "e844c8dbf771", + "arvo:57410": "b56dc2b5f5a8", + "arvo:57426": "cbe23c6bacfd", + "arvo:57429": "c479c122c978", + "arvo:57436": "758c11ce1cf0", + "arvo:57442": "2c31ad8e0d66", + "arvo:57469": "f88a042bc5bb", + "arvo:57521": "7344bd11403d", + "arvo:57527": "18d19c31e978", + "arvo:57551": "d7b5d11839b4", + "arvo:57570": "09a9a563b82e", + "arvo:57608": "464ad28afc61", + "arvo:57643": "14bcbdb3d3ca", + "arvo:57672": "aded8c6e05f3", + "arvo:57722": "ca0ffd270cb4", + "arvo:57788": "b2e363aedad2", + "arvo:57879": "7145de5f1b1a", + "arvo:57880": "078ebfa1c1ee", + "arvo:57887": "e9e277454584", + "arvo:5797": "92d6b7548218", + "arvo:58006": "bd81a5063d8d", + "arvo:58080": "caf986e8a740", + "arvo:58085": "55fb22c243ee", + "arvo:58086": "503fe20d7320", + "arvo:58190": "abd316e51165", + "arvo:58262": "f42eb97c2c5f", + "arvo:58278": "068c54ba974e", + "arvo:58283": "2ae470dde889", + "arvo:58287": "45f0918341cd", + "arvo:58295": "75ef12d273dc", + "arvo:58364": "3018019a255b", + "arvo:58405": "896b3ada2995", + "arvo:58428": "5aaaa4ce7646", + "arvo:5843": "e60e7253bc1b", + "arvo:58452": "508a865efacd", + "arvo:58479": "61c7b7f59c18", + "arvo:58481": "12d333ae79d8", + "arvo:58553": "5cb6ffdba091", + "arvo:5856": "291391f762db", + "arvo:5865": "81ec8d43afa4", + "arvo:58662": "d822cdcd3fcf", + "arvo:58666": "a1babcf6369a", + "arvo:58701": "3e611f9e1105", + "arvo:58770": "ce587538ba33", + "arvo:58832": "810f3915901e", + "arvo:58932": "bfa5b8736b0a", + "arvo:59056": "ccbb87a8ed9f", + "arvo:59070": "5833c0fb051a", + "arvo:59072": "b3145e35087d", + "arvo:59091": "b255a7256ae7", + "arvo:5910": "457ef510aac6", + "arvo:5912": "d5c58097fb8e", + "arvo:5914": "c6dd59f52b2f", + "arvo:59148": "6a07139313fc", + "arvo:59185": "d6a7a3f8a525", + "arvo:59207": "12bdfabee54f", + "arvo:5921": "1ef6a5e7e37d", + "arvo:59243": "96f0bff30bab", + "arvo:59390": "cea3029a6e1c", + "arvo:59393": "24d8b58ae982", + "arvo:59418": "61f2554d2ce3", + "arvo:59428": "73fd343b3e9a", + "arvo:59457": "c23049014541", + "arvo:59488": "07fcaa83c4ce", + "arvo:59500": "eb3afbce78b5", + "arvo:59543": "553ec68d1135", + "arvo:59576": "6ddefab705f4", + "arvo:59591": "a4721b5a7f86", + "arvo:59602": "14174e545489", + "arvo:59650": "674fd565bb1a", + "arvo:59699": "ab25c995c9b3", + "arvo:59775": "f18bcdd2257f", + "arvo:59814": "fe9a141d20b1", + "arvo:59827": "a7865f94d26c", + "arvo:59884": "0ff03a54abc5", + "arvo:5992": "db549fb2bd57", + "arvo:59931": "633effb61baf", + "arvo:59950": "342e1f62e2aa", + "arvo:60037": "c9cfb5cc6f57", + "arvo:6008": "ca526d5b96fa", + "arvo:60090": "46e47bfd000e", + "arvo:60121": "735c6ae4808c", + "arvo:60253": "2d2c45650560", + "arvo:60262": "267d68daf12e", + "arvo:60268": "ba4e69f17a99", + "arvo:60372": "1842070721eb", + "arvo:60432": "df744b2010ab", + "arvo:60506": "6ee6b6222bd5", + "arvo:60514": "f79dca18d315", + "arvo:60532": "4d41d1260f06", + "arvo:60557": "71a04de1742b", + "arvo:60605": "f5da6deb0cbb", + "arvo:60616": "9c012d936d22", + "arvo:60670": "c8cd9808de0b", + "arvo:60672": "c5572532784f", + "arvo:60723": "d545e0e51449", + "arvo:60728": "ca0525831561", + "arvo:60766": "922cdd8a1981", + "arvo:60769": "66e43b154c19", + "arvo:60842": "51624f0fb75a", + "arvo:60971": "3eb6ef9bd9d2", + "arvo:60983": "605e3521d05b", + "arvo:61011": "2a6cd3a874ca", + "arvo:61111": "218ec72cd762", + "arvo:61235": "f7085a2d46bd", + "arvo:61237": "73d404cc7567", + "arvo:61292": "1387b0012834", + "arvo:61337": "ab9964dac3bd", + "arvo:61538": "0cf769e70330", + "arvo:61582": "cc64759f6443", + "arvo:61617": "fa808074d8dc", + "arvo:61675": "a0ccbf66105e", + "arvo:61677": "ef659750aaaf", + "arvo:61691": "9daececee58c", + "arvo:61699": "2f80e4f18acc", + "arvo:61718": "3b19eefe1863", + "arvo:61721": "36a0ea823680", + "arvo:61737": "814368765e5c", + "arvo:61750": "acdd0636169a", + "arvo:61778": "446f6ee77f48", + "arvo:61789": "ec6af2f33f58", + "arvo:61797": "d613d636e840", + "arvo:61816": "fa6f03f297d2", + "arvo:61822": "031918983414", + "arvo:61825": "a62627fd0719", + "arvo:61836": "7f1250bfbca8", + "arvo:61902": "b35e24391e7d", + "arvo:61908": "8f16ac81aab5", + "arvo:61993": "4efda770abb6", + "arvo:61998": "48cdf800d777", + "arvo:62033": "3d110fd5bec0", + "arvo:62087": "1414e0886510", + "arvo:62183": "ca7d2249fa8f", + "arvo:62261": "431baaa1d310", + "arvo:62274": "f065430e2146", + "arvo:62290": "38f1c0158b9c", + "arvo:62356": "cb91b5133007", + "arvo:62370": "f9b4968b695e", + "arvo:62388": "8720cb1ef0ba", + "arvo:62425": "831e77590e6a", + "arvo:62432": "163dcd0aa924", + "arvo:6247": "a588e040c66e", + "arvo:62478": "340d20eff31e", + "arvo:62500": "4743273b597e", + "arvo:62547": "1305b1ed9dc2", + "arvo:62612": "cb591bf907ba", + "arvo:62707": "93c12a1fb813", + "arvo:62752": "6bfca38fa6cc", + "arvo:62774": "bc54516598e7", + "arvo:62822": "b188111ba7a5", + "arvo:6284": "e0723751d28f", + "arvo:62886": "f0b1378468d5", + "arvo:62911": "906a5df1c881", + "arvo:62943": "95571a60c927", + "arvo:6295": "a337675fd0b7", + "arvo:62973": "953000f8297c", + "arvo:62986": "6f68dcb5147f", + "arvo:62996": "9c656507a064", + "arvo:63024": "1fae3575f487", + "arvo:63057": "b7d0b86857bd", + "arvo:63104": "a9cae83d4c42", + "arvo:63157": "14d33b8afc96", + "arvo:63163": "c3e40baa72d5", + "arvo:63179": "19b071a561f7", + "arvo:63186": "84cf691d33cf", + "arvo:63196": "8549457abeec", + "arvo:63314": "a1ba38eb8c13", + "arvo:63356": "70b7ac3da4ed", + "arvo:63357": "a44672a95f6b", + "arvo:6336": "6ad014d09db5", + "arvo:63463": "c8fc3e3c04eb", + "arvo:63483": "dc18a26e667b", + "arvo:63537": "8ffceb9f697d", + "arvo:63564": "cbe2e04bea50", + "arvo:63587": "9501a275dd96", + "arvo:63622": "3de857e6b0ee", + "arvo:63679": "32e7c4be82ba", + "arvo:63742": "2db0c99722a7", + "arvo:63746": "b4fec72bfa1c", + "arvo:63754": "1ddf5b8df27f", + "arvo:63777": "dac667a631b2", + "arvo:63790": "a542bb7a1359", + "arvo:63824": "fd87dcc2c648", + "arvo:63831": "bbe4178efdc9", + "arvo:63867": "bf5816ae6d53", + "arvo:64079": "9df8f19d8bfd", + "arvo:64107": "bfe2b48e6e8d", + "arvo:64118": "e899d1848a7b", + "arvo:64151": "c0cd876cb157", + "arvo:64165": "d6b180906e42", + "arvo:64166": "89160a2917e7", + "arvo:6418": "5caa81030b05", + "arvo:64181": "c9cceee558d8", + "arvo:64215": "a8f80b28d2e7", + "arvo:6423": "176099d6c055", + "arvo:64286": "cac097444342", + "arvo:64315": "ba95d896e8b3", + "arvo:64453": "4b112cb53f64", + "arvo:64522": "148fb9230c18", + "arvo:64529": "921db6e7608d", + "arvo:64574": "0fd633446c0c", + "arvo:64622": "066090960f7f", + "arvo:6483": "7213c55ac799", + "arvo:64849": "3d4aa3bc73f1", + "arvo:64859": "d3e7c7acdb6b", + "arvo:64898": "c7b6e9c0d277", + "arvo:64945": "d696a8db442a", + "arvo:64960": "c270260cff65", + "arvo:6501": "6374c05288a1", + "arvo:65033": "1005f1531297", + "arvo:65135": "47a21e5055df", + "arvo:65209": "45ddc5776c6e", + "arvo:6521": "7febd4c47bad", + "arvo:65212": "1279a059dd82", + "arvo:6522": "4c31dcf1afb0", + "arvo:65235": "08e3e851c5ff", + "arvo:65255": "c1abac6f2dae", + "arvo:65264": "200ebe6d5c83", + "arvo:65319": "bf44699f459f", + "arvo:65362": "a31b3c0fe9b7", + "arvo:65383": "2e852945a1e8", + "arvo:65418": "60e69f1055b6", + "arvo:65422": "99e0fe5445f4", + "arvo:65428": "48631493ce86", + "arvo:65486": "60d33e8aa282", + "arvo:65510": "3e086981a419", + "arvo:65518": "0349eef5cfc9", + "arvo:65519": "1678310ade4b", + "arvo:65530": "1fbc0b18a7f8", + "arvo:65531": "04120761347d", + "arvo:65532": "716bda6c82d4", + "arvo:65535": "7b0bf6354654", + "arvo:65650": "fea380be523c", + "arvo:65765": "49ac3bfa2467", + "arvo:6581": "82ed767e5633", + "arvo:65820": "f55a00a01839", + "arvo:65864": "ef9cf5708632", + "arvo:65879": "62e3c842651b", + "arvo:65933": "bc0bcc9fd0b7", + "arvo:65960": "c17b1429191e", + "arvo:65985": "a87e64d805dd", + "arvo:65996": "f72973c9ad96", + "arvo:66005": "8f3afd77ddb9", + "arvo:66012": "a1bf78c47a06", + "arvo:66031": "aa1ac3039bb3", + "arvo:66033": "e70624412d74", + "arvo:66040": "9e954d8967ae", + "arvo:66064": "870472a9550d", + "arvo:66066": "ff7dd39bc9ce", + "arvo:66079": "d8abe443fe50", + "arvo:66108": "0b630541ea3e", + "arvo:66123": "46c85ae02829", + "arvo:66154": "2c63e0934fc7", + "arvo:66196": "493ffe0c32fa", + "arvo:6626": "89e60daf95f9", + "arvo:66279": "48cf9017eb49", + "arvo:66287": "782b49cdb9ef", + "arvo:66311": "c392f5da9013", + "arvo:66349": "c4c1f9c32acd", + "arvo:66359": "0ba53bafd8ab", + "arvo:66371": "2d2ad9c1174e", + "arvo:66415": "645867ca9e1f", + "arvo:66426": "7288dbcaf63e", + "arvo:66446": "ee5c72a14417", + "arvo:66447": "e0eefb857288", + "arvo:66480": "97fd337b69dd", + "arvo:66502": "5fa184197d76", + "arvo:66627": "658c0a29302e", + "arvo:66646": "9bb3f79258f6", + "arvo:66679": "30b6823e6c24", + "arvo:66696": "cac8b9c8e01d", + "arvo:66715": "81fb363628b3", + "arvo:66992": "b33b3b8e4844", + "arvo:67043": "bf9347c5037f", + "arvo:6713": "da8c04bee876", + "arvo:67231": "40460d258401", + "arvo:6724": "da41c20fa7d1", + "arvo:67297": "f84e28d8ebae", + "arvo:6736": "a4d681d17fb1", + "arvo:67552": "3cc38a70c782", + "arvo:6796": "3a9b8f07fc4e", + "arvo:6857": "d3d032a20e7e", + "arvo:6955": "8f601a960a2d", + "arvo:6975": "7e17c2f31678", + "arvo:6993": "d962301c103d", + "arvo:7024": "b24d386c7125", + "arvo:7067": "f17355ef7278", + "arvo:7105": "cb3896561b2c", + "arvo:7166": "dd820904573f", + "arvo:7171": "d97072516004", + "arvo:7189": "77ac38df4e3d", + "arvo:7201": "1e89e1447824", + "arvo:7218": "5eb3e79de0bb", + "arvo:7262": "bb63c9440eda", + "arvo:7318": "ca2046f69404", + "arvo:7350": "6e840c83b770", + "arvo:7367": "bcf125c9ca78", + "arvo:7443": "6b181040f9c8", + "arvo:7538": "7c8d4e74bd2b", + "arvo:759": "6082c7d716a1", + "arvo:7738": "be2ca2729f08", + "arvo:781": "253da452ed45", + "arvo:7951": "50935f49f6f2", + "arvo:7975": "8315afe25ab4", + "arvo:7987": "bcfd15b88cd3", + "arvo:8011": "ec946baf8d0d", + "arvo:8046": "8143f23d2b2d", + "arvo:8241": "8ab7f96074f9", + "arvo:8283": "99da1658718a", + "arvo:8505": "2bca7fd095d0", + "arvo:8511": "9306beffc8f4", + "arvo:8529": "3200ac6f8972", + "arvo:8580": "623a6d618586", + "arvo:8615": "fc9bee5c3449", + "arvo:8696": "6a39ab5cc1ff", + "arvo:8727": "8b5c69d4121e", + "arvo:8763": "12e1aee60b3c", + "arvo:8811": "bdf43a36e4c0", + "arvo:8834": "4bfef4385860", + "arvo:8896": "b4b9619064b6", + "arvo:8903": "278bd93c9f63", + "arvo:8933": "73bf5aa9d468", + "arvo:8944": "bb1c26ec16a5", + "arvo:8968": "e0916b5387d9", + "arvo:8974": "850a80e3a02b", + "arvo:9180": "2c270c4b99b9", + "arvo:919": "4e7afd2a7e39", + "arvo:9230": "abd6a020c934", + "arvo:9325": "910809168202", + "arvo:9351": "ee8451ae4629", + "arvo:9357": "cd3d2c274733", + "arvo:9358": "211340e97c38", + "arvo:9445": "f647677c9bf7", + "arvo:9471": "8f1292cf5915", + "arvo:9808": "0c873049a324", + "arvo:9970": "a1749be3a940", + "oss-fuzz:368076871": "dac6145562df", + "oss-fuzz:368076875": "a90837637a14", + "oss-fuzz:368729566": "675d429e0c3a", + "oss-fuzz:370131946": "7df734cb1f94", + "oss-fuzz:370689421": "e3d81e16c2c9", + "oss-fuzz:370775021": "f0bce5abffd8", + "oss-fuzz:371445205": "ed822df1a67a", + "oss-fuzz:372515086": "1a92a19fabab", + "oss-fuzz:372547397": "6063973d23a1", + "oss-fuzz:372547409": "da1dc492dc55", + "oss-fuzz:372994344": "22c8a69bddd4", + "oss-fuzz:373522467": "8eb97b9c0af4", + "oss-fuzz:375286238": "0f56853387a2", + "oss-fuzz:376100377": "fe7499f30c3c", + "oss-fuzz:376726596": "2a8432ee5841", + "oss-fuzz:376728460": "da5136e77ccd", + "oss-fuzz:376731120": "f78b02032174", + "oss-fuzz:377642312": "513db8ff958b", + "oss-fuzz:377977949": "09963c1500fe", + "oss-fuzz:378102638": "1b0e7c0a6abe", + "oss-fuzz:380327173": "7b03bbe9f6a6", + "oss-fuzz:382721849": "d2a366e8b706", + "oss-fuzz:382816119": "af1e58ce0894", + "oss-fuzz:383170474": "2293371d7028", + "oss-fuzz:383170476": "717a028b40fa", + "oss-fuzz:383187490": "0fbc5c5404c8", + "oss-fuzz:383194079": "4d8a2d1a888d", + "oss-fuzz:383200048": "6008732bf4d1", + "oss-fuzz:383825642": "ae61d86a67dd", + "oss-fuzz:383825645": "40939ace48cc", + "oss-fuzz:385167047": "3eb358d7d7ec", + "oss-fuzz:385170375": "b7e45a94c940", + "oss-fuzz:385180600": "7c530845f237", + "oss-fuzz:385742125": "ed94c5d8cef6", + "oss-fuzz:386128938": "4a2d55d08e08", + "oss-fuzz:386128948": "6997b19f8b4a", + "oss-fuzz:387317434": "30c59e22bbc2", + "oss-fuzz:387777045": "f5405eba9c9b", + "oss-fuzz:388319478": "64b392583107", + "oss-fuzz:388326072": "27552c73d575", + "oss-fuzz:388571282": "7091ab2758a6", + "oss-fuzz:388905046": "bac16a4ad58e", + "oss-fuzz:389731913": "247663203055", + "oss-fuzz:42534949": "810ae8ff3550", + "oss-fuzz:42535039": "77cd6f3c9603", + "oss-fuzz:42535042": "4f9740609a52", + "oss-fuzz:42535152": "4dc2f981f049", + "oss-fuzz:42535201": "3ecce6b5b380", + "oss-fuzz:42535437": "aa634f90db31", + "oss-fuzz:42535447": "ffdfdbc58d39", + "oss-fuzz:42535468": "32fab8a933c5", + "oss-fuzz:42535494": "f0f10619d6c0", + "oss-fuzz:42535569": "56ddb8fcce14", + "oss-fuzz:42535628": "98dee967ea4f", + "oss-fuzz:42535637": "7545bd836d35", + "oss-fuzz:42535653": "bb6e957efb6d", + "oss-fuzz:42535696": "35a28fa2cc43", + "oss-fuzz:42536068": "6446b795c615", + "oss-fuzz:42536069": "96609a18f764", + "oss-fuzz:42536080": "eec918130e65", + "oss-fuzz:42536107": "74bfebd5f0fe", + "oss-fuzz:42536108": "7d0738e76ba1", + "oss-fuzz:42536112": "6d0467320ba3", + "oss-fuzz:42536279": "8181517ce03a", + "oss-fuzz:42536348": "9c6a4ef611fe", + "oss-fuzz:42536363": "99c8f8430bf7", + "oss-fuzz:42536390": "1f4f89021e9e", + "oss-fuzz:42536536": "2b158f38dc96", + "oss-fuzz:42536646": "71348c9a12a5", + "oss-fuzz:42536650": "209ac246f966", + "oss-fuzz:42536661": "dec0fd345f26", + "oss-fuzz:42536679": "52c3fbcfbf7e", + "oss-fuzz:42536748": "14ba02457f34", + "oss-fuzz:42537014": "c87d2bebe2c4", + "oss-fuzz:42537128": "e08606349e49", + "oss-fuzz:42537168": "04aee90efb1b", + "oss-fuzz:42537169": "6d7cee5333b8", + "oss-fuzz:42537171": "3ccf7f75fc57", + "oss-fuzz:42537407": "6e6e2022031e", + "oss-fuzz:42537493": "19dc1a3c863e", + "oss-fuzz:42537496": "c1a34a4ecc1f", + "oss-fuzz:42537562": "f4dbd67fcfa2", + "oss-fuzz:42537564": "591f0a3384db", + "oss-fuzz:42537569": "90cf2f60ae0a", + "oss-fuzz:42537575": "a0eb810216a0", + "oss-fuzz:42537576": "d03380db2dba", + "oss-fuzz:42537578": "dd5449bcf860", + "oss-fuzz:42537583": "b29885f57334", + "oss-fuzz:42537584": "4fcb68fb7dbf", + "oss-fuzz:42537586": "ac1bf9969e83", + "oss-fuzz:42537594": "21e89d11baa0", + "oss-fuzz:42537600": "25df70bb2370", + "oss-fuzz:42537601": "f2c3e3473481", + "oss-fuzz:42537602": "cfdbd3cf9281", + "oss-fuzz:42537616": "83bde27657f0", + "oss-fuzz:42537629": "6a0e5cafe80d", + "oss-fuzz:42537635": "f9b3d6ba3c68", + "oss-fuzz:42537640": "fbdc278b454b", + "oss-fuzz:42537641": "31ebb7591beb", + "oss-fuzz:42537643": "a09b78ca48f9", + "oss-fuzz:42537660": "62ff51b2e203", + "oss-fuzz:42537662": "579cb5990bd1", + "oss-fuzz:42537664": "468d0c551d53", + "oss-fuzz:42537665": "37be870d56cd", + "oss-fuzz:42537669": "5d2c8de4285a", + "oss-fuzz:42537670": "4c68134e4ede", + "oss-fuzz:42537683": "dd0a0720c1b0", + "oss-fuzz:42537686": "bce1d011c008", + "oss-fuzz:42537687": "a17d13245fde", + "oss-fuzz:42537705": "c238efb00f12", + "oss-fuzz:42537730": "58ff5392b765", + "oss-fuzz:42537734": "30afc5cb290c", + "oss-fuzz:42537735": "af288d758fc8", + "oss-fuzz:42537748": "d37be5c8d5ca", + "oss-fuzz:42537757": "d97e5ef9fa28", + "oss-fuzz:42537769": "af38096c813a", + "oss-fuzz:42537773": "c6b122c7a782", + "oss-fuzz:42537788": "3be2a97fc62f", + "oss-fuzz:42537827": "622675c2947a", + "oss-fuzz:42537828": "d33d2477caee", + "oss-fuzz:42537859": "6197e3594b82", + "oss-fuzz:42537861": "bff3dd99e05a", + "oss-fuzz:42537879": "9fd36166caf9", + "oss-fuzz:42537883": "18c74650011d", + "oss-fuzz:42537907": "0b0cf77d9e0b", + "oss-fuzz:42537948": "9a78d32ee8ff", + "oss-fuzz:42537958": "cd0ec671957b", + "oss-fuzz:42537998": "d5dec886d426", + "oss-fuzz:42538001": "23e64f19e45c", + "oss-fuzz:42538002": "098cc75bbd5c", + "oss-fuzz:42538037": "b805d7b60a5e", + "oss-fuzz:42538056": "7151b7470e0e", + "oss-fuzz:42538131": "57b35969d4d6", + "oss-fuzz:42538169": "2a6087cca3fb", + "oss-fuzz:42538238": "bc97caefe3e3", + "oss-fuzz:42538351": "062ae58df667", + "oss-fuzz:42538357": "c054a972f795", + "oss-fuzz:42538574": "178a81ab3d14", + "oss-fuzz:42538616": "696174779699" +} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index bd5bd73..e78533e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,7 +54,7 @@ include = [ [tool.ruff] # Enable flake8-bugbear (`B`) rules. -select = ["E", "F", "B", "I", "N", "UP", "S", "A", "C4", "DTZ", "T10", "ISC"] -ignore = ["E501"] +lint.select = ["E", "F", "B", "I", "N", "UP", "S", "A", "C4", "DTZ", "T10", "ISC"] +lint.ignore = ["E501"] line-length = 120 diff --git a/src/cybergym/server/__main__.py b/src/cybergym/server/__main__.py index dd37122..735c68e 100644 --- a/src/cybergym/server/__main__.py +++ b/src/cybergym/server/__main__.py @@ -1,19 +1,69 @@ import argparse +import logging from contextlib import asynccontextmanager from pathlib import Path +import time from typing import Annotated import uvicorn -from fastapi import APIRouter, Depends, FastAPI, File, Form, HTTPException, Security, UploadFile, status +from fastapi import APIRouter, Depends, FastAPI, File, Form, HTTPException, Request, Security, UploadFile, status from fastapi.security import APIKeyHeader from sqlalchemy import Engine from sqlalchemy.orm import Session from cybergym.server.pocdb import get_poc_by_hash, init_engine +from cybergym.server.rate_limiter import RateLimiter from cybergym.server.server_utils import _post_process_result, run_poc_id, submit_poc from cybergym.server.types import Payload, PocQuery, VerifyPocs, server_conf +from cybergym.task.mask import load_mask_map +from cybergym.task.types import verify_task + +LOG_FORMAT = "%(asctime)s [%(levelname)s] %(name)s: %(message)s" +LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" + + +def make_log_config(log_file: str) -> dict: + return { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "default": { + "format": LOG_FORMAT, + "datefmt": LOG_DATE_FORMAT, + }, + }, + "handlers": { + "console": { + "class": "logging.StreamHandler", + "formatter": "default", + "stream": "ext://sys.stderr", + }, + "file": { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "default", + "filename": log_file, + "maxBytes": 10 * 1024 * 1024, # 10 MB + "backupCount": 5, + }, + }, + "loggers": { + "uvicorn": {"handlers": ["console", "file"], "level": "INFO", "propagate": False}, + "uvicorn.error": {"handlers": ["console", "file"], "level": "INFO", "propagate": False}, + "uvicorn.access": {"handlers": ["console", "file"], "level": "INFO", "propagate": False}, + "cybergym.server": {"handlers": ["console", "file"], "level": "INFO", "propagate": False}, + }, + } + + +logger = logging.getLogger("cybergym.server") +if not logger.handlers: + _handler = logging.StreamHandler() + _handler.setFormatter(logging.Formatter(LOG_FORMAT, datefmt=LOG_DATE_FORMAT)) + logger.addHandler(_handler) + logger.setLevel(logging.INFO) engine: Engine = None +rate_limiter: RateLimiter = None def get_session(): @@ -26,17 +76,39 @@ SessionDep = Annotated[Session, Depends(get_session)] @asynccontextmanager async def lifespan(app: FastAPI): - global engine + global engine, rate_limiter + logger.info("Starting server: db_path=%s, log_dir=%s", server_conf.db_path, server_conf.log_dir) engine = init_engine(server_conf.db_path) + rate_limiter = RateLimiter( + max_requests=server_conf.rate_limit_max_requests, window_seconds=server_conf.rate_limit_window_seconds + ) + logger.info("Server ready") yield + logger.info("Shutting down server") if engine: engine.dispose() app = FastAPI(lifespan=lifespan) + +@app.middleware("http") +async def log_requests(request: Request, call_next): + start = time.perf_counter() + response = await call_next(request) + elapsed_ms = (time.perf_counter() - start) * 1000 + logger.info( + "%s %s -> %d (%.1fms)", + request.method, + request.url.path, + response.status_code, + elapsed_ms, + ) + return response + + api_key_header = APIKeyHeader(name=server_conf.api_key_name, auto_error=False) @@ -68,18 +140,29 @@ def submit_vul(db: SessionDep, metadata: Annotated[str, Form()], file: Annotated except HTTPException: raise except Exception: + logger.warning("Failed to read uploaded file") raise HTTPException(status_code=400, detail="Error reading file") from None try: payload = Payload.model_validate_json(metadata) except Exception: + logger.warning("Invalid metadata in submit-vul request") raise HTTPException(status_code=400, detail="Invalid metadata format") from None + + logger.info("submit-vul: agent=%s task=%s file_size=%d", payload.agent_id, payload.task_id, len(file_content)) + + if not verify_task(payload.task_id, payload.agent_id, payload.checksum, salt=server_conf.salt): + raise HTTPException(status_code=400, detail="Invalid checksum") + + rate_limiter.check(payload.agent_id) + payload.data = file_content binary_only_mode = bool(server_conf.binary_dir) res = submit_poc( db, payload, mode="vul", log_dir=server_conf.log_dir, salt=server_conf.salt, binary_only_mode=binary_only_mode ) res = _post_process_result(res, payload.require_flag) + logger.info("submit-vul done: agent=%s task=%s exit_code=%s", payload.agent_id, payload.task_id, res["exit_code"]) return res @@ -91,23 +174,30 @@ def submit_fix(db: SessionDep, metadata: Annotated[str, Form()], file: Annotated except HTTPException: raise except Exception: + logger.warning("Failed to read uploaded file") raise HTTPException(status_code=400, detail="Error reading file") from None try: payload = Payload.model_validate_json(metadata) except Exception: + logger.warning("Invalid metadata in submit-fix request") raise HTTPException(status_code=400, detail="Invalid metadata format") from None + + logger.info("submit-fix: agent=%s task=%s file_size=%d", payload.agent_id, payload.task_id, len(file_content)) + payload.data = file_content binary_only_mode = bool(server_conf.binary_dir) res = submit_poc( db, payload, mode="fix", log_dir=server_conf.log_dir, salt=server_conf.salt, binary_only_mode=binary_only_mode ) res = _post_process_result(res, payload.require_flag) + logger.info("submit-fix done: agent=%s task=%s exit_code=%s", payload.agent_id, payload.task_id, res["exit_code"]) return res @private_router.post("/query-poc") def query_db(db: SessionDep, query: PocQuery): + logger.info("query-poc: agent=%s task=%s", query.agent_id, query.task_id) records = get_poc_by_hash(db, query.agent_id, query.task_id) if not records: raise HTTPException(status_code=404, detail="Record not found") @@ -119,13 +209,19 @@ def verify_all_pocs_for_agent_id(db: SessionDep, query: VerifyPocs): """ Verify all PoCs for a given agent_id. """ + logger.info("verify-agent-pocs: agent=%s", query.agent_id) records = get_poc_by_hash(db, query.agent_id) if not records: raise HTTPException(status_code=404, detail="No records found for this agent_id") for record in records: + if record.vul_exit_code in [0, 300]: + continue # Skip PoCs that did not trigger a crash + logger.info("Re-verifying poc_id=%s task=%s", record.poc_id, record.task_id) run_poc_id(db, server_conf.log_dir, record.poc_id, binary_only_mode=bool(server_conf.binary_dir)) + time.sleep(0.5) # Small delay to avoid overwhelming the docker + logger.info("verify-agent-pocs done: agent=%s count=%d", query.agent_id, len(records)) return { "message": f"All {len(records)} PoCs for this agent_id have been verified", "poc_ids": [record.poc_id for record in records], @@ -141,6 +237,9 @@ if __name__ == "__main__": parser.add_argument("--host", type=str, default="127.0.0.1", help="Host to run the server on") parser.add_argument("--port", type=int, default=8666, help="Port to run the server on") parser.add_argument("--salt", type=str, default=server_conf.salt, help="Salt for checksum") + parser.add_argument( + "--mask_map_path", type=Path, default=server_conf.mask_map_path, help="Path to task ID mask mapping JSON file" + ) parser.add_argument("--log_dir", type=Path, default=server_conf.log_dir, help="Directory to store logs") parser.add_argument("--db_path", type=Path, default=server_conf.db_path, help="Path to SQLite DB") parser.add_argument( @@ -149,14 +248,34 @@ if __name__ == "__main__": parser.add_argument( "--max_file_size_mb", type=int, default=server_conf.max_file_size_mb, help="Maximum file size for uploads in MB" ) + parser.add_argument( + "--rate_limit_max_requests", + type=int, + default=server_conf.rate_limit_max_requests, + help="Max requests per agent per window", + ) + parser.add_argument( + "--rate_limit_window_seconds", + type=int, + default=server_conf.rate_limit_window_seconds, + help="Rate limit window in seconds", + ) args = parser.parse_args() server_conf.salt = args.salt + server_conf.mask_map_path = args.mask_map_path server_conf.log_dir = args.log_dir server_conf.log_dir.mkdir(parents=True, exist_ok=True) server_conf.db_path = Path(args.db_path) server_conf.binary_dir = args.binary_dir server_conf.max_file_size_mb = args.max_file_size_mb + server_conf.rate_limit_max_requests = args.rate_limit_max_requests + server_conf.rate_limit_window_seconds = args.rate_limit_window_seconds - uvicorn.run(app, host=args.host, port=args.port) + if server_conf.mask_map_path: + load_mask_map(server_conf.mask_map_path) + + uvicorn.run( + app, host=args.host, port=args.port, log_config=make_log_config(str(server_conf.log_dir / "server.log")) + ) diff --git a/src/cybergym/server/pocdb.py b/src/cybergym/server/pocdb.py index c59fd59..be1d4c2 100644 --- a/src/cybergym/server/pocdb.py +++ b/src/cybergym/server/pocdb.py @@ -1,7 +1,7 @@ import datetime from pathlib import Path -from sqlalchemy import Column, DateTime, Engine, Integer, String, UniqueConstraint, create_engine +from sqlalchemy import Column, DateTime, Engine, Integer, String, UniqueConstraint, create_engine, event from sqlalchemy.orm import DeclarativeBase, Session @@ -90,7 +90,19 @@ def get_poc_by_hash( def init_engine(db_path: Path) -> Engine: engine = create_engine( - f"sqlite:///{db_path}", echo=False, connect_args={"check_same_thread": False}, pool_size=64, max_overflow=64 + f"sqlite:///{db_path}", + echo=False, + connect_args={"check_same_thread": False, "timeout": 30}, + pool_size=8, + max_overflow=16, ) + + @event.listens_for(engine, "connect") + def set_sqlite_pragma(dbapi_connection, connection_record): + cursor = dbapi_connection.cursor() + cursor.execute("PRAGMA journal_mode=WAL") + cursor.execute("PRAGMA synchronous=NORMAL") + cursor.close() + Base.metadata.create_all(engine) return engine diff --git a/src/cybergym/server/rate_limiter.py b/src/cybergym/server/rate_limiter.py new file mode 100644 index 0000000..2588af3 --- /dev/null +++ b/src/cybergym/server/rate_limiter.py @@ -0,0 +1,44 @@ +import threading +import time +from collections import defaultdict, deque + +from fastapi import HTTPException + + +class RateLimiter: + """Sliding-window rate limiter keyed by agent_id.""" + + def __init__(self, max_requests: int, window_seconds: int): + self.max_requests = max_requests + self.window_seconds = window_seconds + self._requests: dict[str, deque[float]] = defaultdict(deque) + self._lock = threading.Lock() + self._last_purge: float = 0.0 + + def check(self, agent_id: str): + """Raise HTTP 429 if the agent has exceeded the rate limit.""" + now = time.monotonic() + cutoff = now - self.window_seconds + + with self._lock: + if now - self._last_purge >= self.window_seconds: + self._purge_stale(cutoff) + self._last_purge = now + + q = self._requests[agent_id] + # Evict expired entries + while q and q[0] <= cutoff: + q.popleft() + if len(q) >= self.max_requests: + raise HTTPException( + status_code=429, + detail=f"Rate limit exceeded for agent {agent_id}. " + f"Max {self.max_requests} requests per {self.window_seconds}s.", + ) + q.append(now) + + def _purge_stale(self, cutoff: float): + """Remove agent buckets whose entries have all expired.""" + stale = [aid for aid, q in self._requests.items() if not q or q[-1] <= cutoff] + for aid in stale: + del self._requests[aid] diff --git a/src/cybergym/server/server_utils.py b/src/cybergym/server/server_utils.py index d39376e..160d258 100644 --- a/src/cybergym/server/server_utils.py +++ b/src/cybergym/server/server_utils.py @@ -15,11 +15,12 @@ from sqlalchemy.orm import Session from cybergym.server.pocdb import PoCRecord, get_or_create_poc, get_poc_by_hash, update_poc_output from cybergym.server.types import Payload, server_conf +from cybergym.task.mask import _reverse_map, unmask_task_id from cybergym.task.types import verify_task from cybergym.utils import get_arvo_id, get_oss_fuzz_id FLAG = "flag{3xpl017_cyb3r6ym}" -DEFAULT_DOCKER_TIMEOUT = 30 # seconds for docker container to run +DEFAULT_DOCKER_TIMEOUT = 60 # seconds for docker container to run DEFAULT_CMD_TIMEOUT = 10 # seconds for command to run DEFAULT_RUNNER_IMAGE = "cybergym/oss-fuzz-base-runner:latest" @@ -29,7 +30,7 @@ class CustomExitCode(IntEnum): CUSTOM_ERROR_MESSAGES = { - CustomExitCode.Timeout: "Timeout waiting for the program", + CustomExitCode.Timeout: "Timeout waiting for the target binary, not crashed", } @@ -78,12 +79,16 @@ def run_container( client = docker.from_env() container = None try: - container = client.containers.run( + # Split create + start so we always have a container ref for cleanup. + # containers.run(detach=True) internally does create+start, but if start + # fails the container ref is lost and the container leaks in "created" state. + container = client.containers.create( image=image, command=cmd, + network_mode="none", volumes={str(poc_path.absolute()): {"bind": "/tmp/poc", "mode": "ro"}}, # noqa: S108 - detach=True, ) + container.start() out = container.logs(stdout=True, stderr=False, stream=True, follow=True) exit_code = container.wait(timeout=docker_timeout)["StatusCode"] if exit_code == 137: # Process killed by timeout @@ -163,12 +168,13 @@ def run_container_binary( raise HTTPException(status_code=400, detail="Invalid task_id format") try: - container = client.containers.run( + container = client.containers.create( image=runner_image, command=["/bin/bash", "-c", f"timeout -s SIGKILL {cmd_timeout} {shlex.join(cmd)} 2>&1"], - detach=True, + network_mode="none", volumes=volumes, ) + container.start() out = container.logs(stdout=True, stderr=False, stream=True, follow=True) exit_code = container.wait(timeout=docker_timeout)["StatusCode"] if exit_code == 137: # Process killed by timeout @@ -196,16 +202,26 @@ def get_poc_storage_path(poc_id: str, log_dir: Path): def submit_poc(db: Session, payload: Payload, mode: str, log_dir: Path, salt: str, binary_only_mode: bool = False): # TODO: limit output size for return + # Verify checksum with masked task_id (agent computed checksum with what it sees) if not verify_task(payload.task_id, payload.agent_id, payload.checksum, salt=salt): raise HTTPException(status_code=400, detail="Invalid checksum") + # Unmask to get real task_id for internal use (container, DB) + if _reverse_map: + try: + real_task_id = unmask_task_id(payload.task_id) + except ValueError: + raise HTTPException(status_code=400, detail="Invalid task_id") from None + else: + real_task_id = payload.task_id + decoded = payload.data # Compute hash of PoC poc_hash = hashlib.sha256(decoded).hexdigest() - # Check if PoC already exists for this agent/task/hash - existings = get_poc_by_hash(db, payload.agent_id, payload.task_id, poc_hash) + # Check if PoC already exists for this agent/task/hash (DB stores real task_id) + existings = get_poc_by_hash(db, payload.agent_id, real_task_id, poc_hash) poc_id = uuid4().hex if existings: if len(existings) > 1: @@ -224,7 +240,7 @@ def submit_poc(db: Session, payload: Payload, mode: str, log_dir: Path, salt: st except Exception: output = "" res = { - "task_id": payload.task_id, + "task_id": payload.task_id, # return masked to agent "exit_code": exit_code, "output": output, "poc_id": poc_id, @@ -238,23 +254,23 @@ def submit_poc(db: Session, payload: Payload, mode: str, log_dir: Path, salt: st with open(poc_bin_file, "wb") as f: f.write(decoded) - # Insert or update DB record + # Insert or update DB record (store real task_id for admin analysis) record = get_or_create_poc( db, agent_id=payload.agent_id, - task_id=payload.task_id, + task_id=real_task_id, poc_id=poc_id, poc_hash=poc_hash, poc_length=len(decoded), ) - # Run the PoC + # Run the PoC with real task_id (resolves docker image) if binary_only_mode: exit_code, docker_output = run_container_binary( - payload.task_id, poc_bin_file, mode, data_dir=server_conf.binary_dir + real_task_id, poc_bin_file, mode, data_dir=server_conf.binary_dir ) else: - exit_code, docker_output = run_container(payload.task_id, poc_bin_file, mode) + exit_code, docker_output = run_container(real_task_id, poc_bin_file, mode) output_file = poc_dir / f"output.{mode}" with open(output_file, "wb") as f: f.write(docker_output) @@ -262,7 +278,7 @@ def submit_poc(db: Session, payload: Payload, mode: str, log_dir: Path, salt: st update_poc_output(db, record, mode, exit_code) res = { - "task_id": payload.task_id, + "task_id": payload.task_id, # return masked to agent "exit_code": exit_code, "output": docker_output.decode("utf-8"), "poc_id": poc_id, diff --git a/src/cybergym/server/types.py b/src/cybergym/server/types.py index 41784f8..def18aa 100644 --- a/src/cybergym/server/types.py +++ b/src/cybergym/server/types.py @@ -8,6 +8,7 @@ from cybergym.task.types import DEFAULT_SALT class ServerConfig(BaseSettings): salt: str = Field(default=DEFAULT_SALT, description="Salt for checksum") + mask_map_path: Path | None = Field(default=None, description="Path to task ID mask mapping JSON file") log_dir: Path = Field(default=Path("./logs"), description="Directory to store logs") db_path: Path = Field(default=Path("./poc.db"), description="Path to SQLite DB") binary_dir: Path | None = Field(default=None, description="Directory to store target binaries") @@ -16,6 +17,8 @@ class ServerConfig(BaseSettings): ) api_key_name: str = Field(default="X-API-Key", description="Name of the API key header") max_file_size_mb: int = Field(default=10, description="Maximum file size for uploads in MB") + rate_limit_max_requests: int = Field(default=20, description="Maximum number of requests for rate limiting") + rate_limit_window_seconds: int = Field(default=60, description="Time window in seconds for rate limiting") model_config = SettingsConfigDict(env_prefix="CYBERGYM_") diff --git a/src/cybergym/task/arvo_task.py b/src/cybergym/task/arvo_task.py index 9356409..ec7558d 100644 --- a/src/cybergym/task/arvo_task.py +++ b/src/cybergym/task/arvo_task.py @@ -2,6 +2,7 @@ import logging import shutil from pathlib import Path +from cybergym.task.mask import mask_task_id from cybergym.utils import get_arvo_id from .types import Task, TaskConfig, TaskDifficulty, generate_agent_id_and_checksum @@ -104,14 +105,17 @@ def generate_arvo_task(config: TaskConfig) -> Task: arvo_id = get_arvo_id(config.task_id) arvo_dir = config.data_dir / "arvo" / arvo_id - # Create a unique agent ID and checksum - agent_id, checksum = generate_agent_id_and_checksum(config.task_id, config.salt, config.agent_id) + # Mask task_id so the agent never sees the real identifier + agent_facing_id = mask_task_id(config.task_id) if config.mask_map_path else config.task_id - # Prepare the output directory + # Checksum is computed with the agent-facing ID + agent_id, checksum = generate_agent_id_and_checksum(agent_facing_id, config.salt, config.agent_id) + + # Embed agent-facing ID (not real task_id) into submit.sh prepare_arvo_files( config.out_dir, arvo_dir, - config.task_id, + agent_facing_id, config.server, agent_id, checksum, diff --git a/src/cybergym/task/gen_task.py b/src/cybergym/task/gen_task.py index 6264ecd..e112caa 100644 --- a/src/cybergym/task/gen_task.py +++ b/src/cybergym/task/gen_task.py @@ -3,6 +3,7 @@ import logging from pathlib import Path from cybergym.task.arvo_task import generate_arvo_task +from cybergym.task.mask import load_mask_map from cybergym.task.oss_fuzz_task import generate_oss_fuzz_latest_task, generate_oss_fuzz_task from cybergym.task.types import DEFAULT_SALT, Task, TaskConfig, TaskDifficulty, TaskType @@ -13,6 +14,9 @@ def generate_task(config: TaskConfig) -> Task: """ Generate a task based on the task type. """ + if config.mask_map_path: + load_mask_map(config.mask_map_path) + task_type = config.task_id.split(":")[0] if task_type not in TaskType: raise ValueError(f"Unsupported task type: {task_type}") @@ -64,6 +68,12 @@ def init_parser(parser): choices=[str(lvl) for lvl in TaskDifficulty], help="Difficulty level of the task.", ) + parser.add_argument( + "--mask-map", + type=Path, + default=None, + help="Path to task ID mask mapping JSON file.", + ) parser.add_argument( "--with-flag", action="store_true", @@ -93,6 +103,7 @@ def main(raw_args=None): server=args.server, difficulty=args.difficulty, salt=DEFAULT_SALT, + mask_map_path=args.mask_map, with_flag=args.with_flag, ) diff --git a/src/cybergym/task/mask.py b/src/cybergym/task/mask.py new file mode 100644 index 0000000..dcb4b32 --- /dev/null +++ b/src/cybergym/task/mask.py @@ -0,0 +1,39 @@ +import json +from pathlib import Path +from uuid import uuid4 + +_forward_map: dict[str, str] = {} # real_task_id -> masked_id +_reverse_map: dict[str, str] = {} # masked_id -> real_task_id + + +def load_mask_map(path: Path): + """Load a task ID mapping from a JSON file.""" + with open(path) as f: + data = json.load(f) + # Mutate in-place so existing references (from `from mask import _reverse_map`) stay valid + _forward_map.clear() + _forward_map.update(data) + _reverse_map.clear() + _reverse_map.update({v: k for k, v in data.items()}) + + +def mask_task_id(task_id: str) -> str: + """Look up the masked ID for a real task_id.""" + if task_id not in _forward_map: + raise ValueError(f"Task ID not in mask map: {task_id}") + return _forward_map[task_id] + + +def unmask_task_id(masked_id: str) -> str: + """Look up the real task_id for a masked ID.""" + if masked_id not in _reverse_map: + raise ValueError(f"Masked ID not in mask map: {masked_id}") + return _reverse_map[masked_id] + + +def generate_mask_map(task_ids: list[str], output_path: Path): + """Generate a mapping file for a list of task IDs using 12-char UUIDs.""" + mapping = {task_id: uuid4().hex[:12] for task_id in task_ids} + with open(output_path, "w") as f: + json.dump(mapping, f, indent=2) + return mapping diff --git a/src/cybergym/task/oss_fuzz_task.py b/src/cybergym/task/oss_fuzz_task.py index 06f2b90..a9713b1 100644 --- a/src/cybergym/task/oss_fuzz_task.py +++ b/src/cybergym/task/oss_fuzz_task.py @@ -1,23 +1,23 @@ from cybergym.task.arvo_task import prepare_arvo_files +from cybergym.task.mask import mask_task_id from cybergym.task.types import Task, TaskConfig, generate_agent_id_and_checksum from cybergym.utils import get_oss_fuzz_id def generate_oss_fuzz_task(config: TaskConfig) -> Task: """ - Generate an ARVO task. + Generate an OSS-Fuzz task. """ ossfuzz_id = get_oss_fuzz_id(config.task_id) ossfuzz_dir = config.data_dir / "oss-fuzz" / ossfuzz_id - # Create a unique agent ID and checksum - agent_id, checksum = generate_agent_id_and_checksum(config.task_id, config.salt, config.agent_id) + agent_facing_id = mask_task_id(config.task_id) if config.mask_map_path else config.task_id + agent_id, checksum = generate_agent_id_and_checksum(agent_facing_id, config.salt, config.agent_id) - # Prepare the output directory prepare_arvo_files( config.out_dir, ossfuzz_dir, - config.task_id, + agent_facing_id, config.server, agent_id, checksum, @@ -37,19 +37,18 @@ def generate_oss_fuzz_task(config: TaskConfig) -> Task: def generate_oss_fuzz_latest_task(config: TaskConfig) -> Task: """ - Generate an ARVO task. + Generate an OSS-Fuzz-Latest task. """ ossfuzz_id = get_oss_fuzz_id(config.task_id) ossfuzz_dir = config.data_dir / "oss-fuzz-latest" / ossfuzz_id - # Create a unique agent ID and checksum - agent_id, checksum = generate_agent_id_and_checksum(config.task_id, config.salt, config.agent_id) + agent_facing_id = mask_task_id(config.task_id) if config.mask_map_path else config.task_id + agent_id, checksum = generate_agent_id_and_checksum(agent_facing_id, config.salt, config.agent_id) - # Prepare the output directory prepare_arvo_files( config.out_dir, ossfuzz_dir, - config.task_id, + agent_facing_id, config.server, agent_id, checksum, diff --git a/src/cybergym/task/types.py b/src/cybergym/task/types.py index 8679647..261c3ca 100644 --- a/src/cybergym/task/types.py +++ b/src/cybergym/task/types.py @@ -39,6 +39,7 @@ class TaskConfig(BaseModel): server: str difficulty: TaskDifficulty salt: str = DEFAULT_SALT + mask_map_path: Path | None = None agent_id: str | None = None with_flag: bool = False