inspect-ai 0.3.59__py3-none-any.whl → 0.3.60__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- inspect_ai/_cli/eval.py +0 -7
- inspect_ai/_display/textual/widgets/samples.py +1 -1
- inspect_ai/_eval/eval.py +10 -1
- inspect_ai/_eval/loader.py +79 -19
- inspect_ai/_eval/registry.py +6 -0
- inspect_ai/_eval/score.py +2 -1
- inspect_ai/_eval/task/results.py +6 -5
- inspect_ai/_eval/task/run.py +11 -11
- inspect_ai/_view/www/dist/assets/index.js +262 -303
- inspect_ai/_view/www/src/App.mjs +6 -6
- inspect_ai/_view/www/src/Types.mjs +1 -1
- inspect_ai/_view/www/src/api/Types.ts +133 -0
- inspect_ai/_view/www/src/api/{api-browser.mjs → api-browser.ts} +25 -13
- inspect_ai/_view/www/src/api/api-http.ts +219 -0
- inspect_ai/_view/www/src/api/api-shared.ts +47 -0
- inspect_ai/_view/www/src/api/{api-vscode.mjs → api-vscode.ts} +22 -19
- inspect_ai/_view/www/src/api/{client-api.mjs → client-api.ts} +93 -53
- inspect_ai/_view/www/src/api/index.ts +51 -0
- inspect_ai/_view/www/src/api/jsonrpc.ts +225 -0
- inspect_ai/_view/www/src/components/DownloadButton.mjs +1 -1
- inspect_ai/_view/www/src/index.js +2 -2
- inspect_ai/_view/www/src/log/{remoteLogFile.mjs → remoteLogFile.ts} +62 -46
- inspect_ai/_view/www/src/navbar/Navbar.mjs +1 -1
- inspect_ai/_view/www/src/navbar/SecondaryBar.mjs +1 -1
- inspect_ai/_view/www/src/samples/SampleList.mjs +1 -1
- inspect_ai/_view/www/src/samples/SampleScores.mjs +1 -1
- inspect_ai/_view/www/src/samples/SamplesDescriptor.mjs +14 -14
- inspect_ai/_view/www/src/samples/SamplesTab.mjs +10 -10
- inspect_ai/_view/www/src/samples/tools/SortFilter.mjs +2 -2
- inspect_ai/_view/www/src/utils/{Json.mjs → json-worker.ts} +1 -3
- inspect_ai/_view/www/src/utils/vscode.ts +36 -0
- inspect_ai/_view/www/src/workspace/WorkSpace.mjs +1 -1
- inspect_ai/approval/_human/manager.py +1 -1
- inspect_ai/model/_call_tools.py +55 -0
- inspect_ai/model/_conversation.py +1 -4
- inspect_ai/model/_generate_config.py +2 -8
- inspect_ai/model/_model_output.py +15 -0
- inspect_ai/model/_openai.py +383 -0
- inspect_ai/model/_providers/anthropic.py +52 -11
- inspect_ai/model/_providers/azureai.py +1 -1
- inspect_ai/model/_providers/goodfire.py +248 -0
- inspect_ai/model/_providers/groq.py +7 -3
- inspect_ai/model/_providers/hf.py +6 -0
- inspect_ai/model/_providers/mistral.py +2 -1
- inspect_ai/model/_providers/openai.py +36 -202
- inspect_ai/model/_providers/openai_o1.py +2 -4
- inspect_ai/model/_providers/providers.py +22 -0
- inspect_ai/model/_providers/together.py +4 -4
- inspect_ai/model/_providers/util/__init__.py +2 -3
- inspect_ai/model/_providers/util/hf_handler.py +1 -1
- inspect_ai/model/_providers/util/llama31.py +1 -1
- inspect_ai/model/_providers/util/util.py +0 -76
- inspect_ai/scorer/_metric.py +3 -0
- inspect_ai/scorer/_scorer.py +2 -1
- inspect_ai/solver/__init__.py +2 -0
- inspect_ai/solver/_basic_agent.py +1 -1
- inspect_ai/solver/_bridge/__init__.py +3 -0
- inspect_ai/solver/_bridge/bridge.py +100 -0
- inspect_ai/solver/_bridge/patch.py +170 -0
- inspect_ai/solver/_solver.py +6 -0
- inspect_ai/util/_display.py +5 -0
- inspect_ai/util/_sandbox/docker/prereqs.py +1 -1
- {inspect_ai-0.3.59.dist-info → inspect_ai-0.3.60.dist-info}/METADATA +3 -2
- {inspect_ai-0.3.59.dist-info → inspect_ai-0.3.60.dist-info}/RECORD +68 -63
- inspect_ai/_view/www/src/api/Types.mjs +0 -117
- inspect_ai/_view/www/src/api/api-http.mjs +0 -300
- inspect_ai/_view/www/src/api/api-shared.mjs +0 -10
- inspect_ai/_view/www/src/api/index.mjs +0 -49
- inspect_ai/_view/www/src/api/jsonrpc.mjs +0 -208
- inspect_ai/_view/www/src/utils/vscode.mjs +0 -16
- {inspect_ai-0.3.59.dist-info → inspect_ai-0.3.60.dist-info}/LICENSE +0 -0
- {inspect_ai-0.3.59.dist-info → inspect_ai-0.3.60.dist-info}/WHEEL +0 -0
- {inspect_ai-0.3.59.dist-info → inspect_ai-0.3.60.dist-info}/entry_points.txt +0 -0
- {inspect_ai-0.3.59.dist-info → inspect_ai-0.3.60.dist-info}/top_level.txt +0 -0
@@ -27109,7 +27109,9 @@ ${events}
|
|
27109
27109
|
const asyncJsonParse = async (text2) => {
|
27110
27110
|
const encoder = new TextEncoder();
|
27111
27111
|
const encodedText = encoder.encode(text2);
|
27112
|
-
const blob = new Blob([kWorkerCode], {
|
27112
|
+
const blob = new Blob([kWorkerCode], {
|
27113
|
+
type: "application/javascript"
|
27114
|
+
});
|
27113
27115
|
const blobURL = URL.createObjectURL(blob);
|
27114
27116
|
const worker = new Worker(blobURL);
|
27115
27117
|
try {
|
@@ -27125,9 +27127,10 @@ ${events}
|
|
27125
27127
|
reject(new Error(error2.message));
|
27126
27128
|
};
|
27127
27129
|
});
|
27128
|
-
worker.postMessage({
|
27129
|
-
|
27130
|
-
|
27130
|
+
worker.postMessage({
|
27131
|
+
scriptContent: kJson5ScriptBase64,
|
27132
|
+
encodedText
|
27133
|
+
}, [encodedText.buffer]);
|
27131
27134
|
return await result;
|
27132
27135
|
} finally {
|
27133
27136
|
worker.terminate();
|
@@ -27149,7 +27152,9 @@ self.onmessage = function (e) {
|
|
27149
27152
|
};`;
|
27150
27153
|
const kJson5ScriptBase64 = `IWZ1bmN0aW9uKHUsRCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1EKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoRCk6dS5KU09ONT1EKCl9KHRoaXMsZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdSh1LEQpe3JldHVybiB1KEQ9e2V4cG9ydHM6e319LEQuZXhwb3J0cyksRC5leHBvcnRzfXZhciBEPXUoZnVuY3Rpb24odSl7dmFyIEQ9dS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPUQpfSksZT11KGZ1bmN0aW9uKHUpe3ZhciBEPXUuZXhwb3J0cz17dmVyc2lvbjoiMi42LjUifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT1EKX0pLHI9KGUudmVyc2lvbixmdW5jdGlvbih1KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHU/bnVsbCE9PXU6ImZ1bmN0aW9uIj09dHlwZW9mIHV9KSx0PWZ1bmN0aW9uKHUpe2lmKCFyKHUpKXRocm93IFR5cGVFcnJvcih1KyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gdX0sbj1mdW5jdGlvbih1KXt0cnl7cmV0dXJuISF1KCl9Y2F0Y2godSl7cmV0dXJuITB9fSxGPSFuKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KSxDPUQuZG9jdW1lbnQsQT1yKEMpJiZyKEMuY3JlYXRlRWxlbWVudCksaT0hRiYmIW4oZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KCh1PSJkaXYiLEE/Qy5jcmVhdGVFbGVtZW50KHUpOnt9KSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmE7dmFyIHV9KSxFPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxvPXtmOkY/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKHUsRCxlKXtpZih0KHUpLEQ9ZnVuY3Rpb24odSxEKXtpZighcih1KSlyZXR1cm4gdTt2YXIgZSx0O2lmKEQmJiJmdW5jdGlvbiI9PXR5cGVvZihlPXUudG9TdHJpbmcpJiYhcih0PWUuY2FsbCh1KSkpcmV0dXJuIHQ7aWYoImZ1bmN0aW9uIj09dHlwZW9mKGU9dS52YWx1ZU9mKSYmIXIodD1lLmNhbGwodSkpKXJldHVybiB0O2lmKCFEJiYiZnVuY3Rpb24iPT10eXBlb2YoZT11LnRvU3RyaW5nKSYmIXIodD1lLmNhbGwodSkpKXJldHVybiB0O3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9KEQsITApLHQoZSksaSl0cnl7cmV0dXJuIEUodSxELGUpfWNhdGNoKHUpe31pZigiZ2V0ImluIGV8fCJzZXQiaW4gZSl0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBlJiYodVtEXT1lLnZhbHVlKSx1fX0sYT1GP2Z1bmN0aW9uKHUsRCxlKXtyZXR1cm4gby5mKHUsRCxmdW5jdGlvbih1LEQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ1KSxjb25maWd1cmFibGU6ISgyJnUpLHdyaXRhYmxlOiEoNCZ1KSx2YWx1ZTpEfX0oMSxlKSl9OmZ1bmN0aW9uKHUsRCxlKXtyZXR1cm4gdVtEXT1lLHV9LGM9e30uaGFzT3duUHJvcGVydHksQj1mdW5jdGlvbih1LEQpe3JldHVybiBjLmNhbGwodSxEKX0scz0wLGY9TWF0aC5yYW5kb20oKSxsPXUoZnVuY3Rpb24odSl7dmFyIHI9RFsiX19jb3JlLWpzX3NoYXJlZF9fIl18fChEWyJfX2NvcmUtanNfc2hhcmVkX18iXT17fSk7KHUuZXhwb3J0cz1mdW5jdGlvbih1LEQpe3JldHVybiByW3VdfHwoclt1XT12b2lkIDAhPT1EP0Q6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjplLnZlcnNpb24sbW9kZToiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9KSgibmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZyIsRnVuY3Rpb24udG9TdHJpbmcpLGQ9dShmdW5jdGlvbih1KXt2YXIgcix0PSJTeW1ib2woIi5jb25jYXQodm9pZCAwPT09KHI9InNyYyIpPyIiOnIsIilfIiwoKytzK2YpLnRvU3RyaW5nKDM2KSksbj0oIiIrbCkuc3BsaXQoInRvU3RyaW5nIik7ZS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHUpe3JldHVybiBsLmNhbGwodSl9LCh1LmV4cG9ydHM9ZnVuY3Rpb24odSxlLHIsRil7dmFyIEM9ImZ1bmN0aW9uIj09dHlwZW9mIHI7QyYmKEIociwibmFtZSIpfHxhKHIsIm5hbWUiLGUpKSx1W2VdIT09ciYmKEMmJihCKHIsdCl8fGEocix0LHVbZV0/IiIrdVtlXTpuLmpvaW4oU3RyaW5nKGUpKSkpLHU9PT1EP3VbZV09cjpGP3VbZV0/dVtlXT1yOmEodSxlLHIpOihkZWxldGUgdVtlXSxhKHUsZSxyKSkpfSkoRnVuY3Rpb24ucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcyYmdGhpc1t0XXx8bC5jYWxsKHRoaXMpfSl9KSx2PWZ1bmN0aW9uKHUsRCxlKXtpZihmdW5jdGlvbih1KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdSl0aHJvdyBUeXBlRXJyb3IodSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpfSh1KSx2b2lkIDA9PT1EKXJldHVybiB1O3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB1LmNhbGwoRCxlKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB1LmNhbGwoRCxlLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGUscix0KXtyZXR1cm4gdS5jYWxsKEQsZSxyLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdS5hcHBseShELGFyZ3VtZW50cyl9fSxwPWZ1bmN0aW9uKHUscix0KXt2YXIgbixGLEMsQSxpPXUmcC5GLEU9dSZwLkcsbz11JnAuUyxjPXUmcC5QLEI9dSZwLkIscz1FP0Q6bz9EW3JdfHwoRFtyXT17fSk6KERbcl18fHt9KS5wcm90b3R5cGUsZj1FP2U6ZVtyXXx8KGVbcl09e30pLGw9Zi5wcm90b3R5cGV8fChmLnByb3RvdHlwZT17fSk7Zm9yKG4gaW4gRSYmKHQ9ciksdClDPSgoRj0haSYmcyYmdm9pZCAwIT09c1tuXSk/czp0KVtuXSxBPUImJkY/dihDLEQpOmMmJiJmdW5jdGlvbiI9PXR5cGVvZiBDP3YoRnVuY3Rpb24uY2FsbCxDKTpDLHMmJmQocyxuLEMsdSZwLlUpLGZbbl0hPUMmJmEoZixuLEEpLGMmJmxbbl0hPUMmJihsW25dPUMpfTtELmNvcmU9ZSxwLkY9MSxwLkc9MixwLlM9NCxwLlA9OCxwLkI9MTYscC5XPTMyLHAuVT02NCxwLlI9MTI4O3ZhciBoLG09cCxnPU1hdGguY2VpbCx5PU1hdGguZmxvb3Isdz1mdW5jdGlvbih1KXtyZXR1cm4gaXNOYU4odT0rdSk/MDoodT4wP3k6ZykodSl9LGI9KGg9ITEsZnVuY3Rpb24odSxEKXt2YXIgZSxyLHQ9U3RyaW5nKGZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIit1KTtyZXR1cm4gdX0odSkpLG49dyhEKSxGPXQubGVuZ3RoO3JldHVybiBuPDB8fG4+PUY/aD8iIjp2b2lkIDA6KGU9dC5jaGFyQ29kZUF0KG4pKTw1NTI5Nnx8ZT41NjMxOXx8bisxPT09Rnx8KHI9dC5jaGFyQ29kZUF0KG4rMSkpPDU2MzIwfHxyPjU3MzQzP2g/dC5jaGFyQXQobik6ZTpoP3Quc2xpY2UobixuKzIpOnItNTYzMjArKGUtNTUyOTY8PDEwKSs2NTUzNn0pO20obS5QLCJTdHJpbmciLHtjb2RlUG9pbnRBdDpmdW5jdGlvbih1KXtyZXR1cm4gYih0aGlzLHUpfX0pO2UuU3RyaW5nLmNvZGVQb2ludEF0O3ZhciBTPU1hdGgubWF4LHg9TWF0aC5taW4sTj1TdHJpbmcuZnJvbUNoYXJDb2RlLFA9U3RyaW5nLmZyb21Db2RlUG9pbnQ7bShtLlMrbS5GKighIVAmJjEhPVAubGVuZ3RoKSwiU3RyaW5nIix7ZnJvbUNvZGVQb2ludDpmdW5jdGlvbih1KXtmb3IodmFyIEQsZSxyLHQ9YXJndW1lbnRzLG49W10sRj1hcmd1bWVudHMubGVuZ3RoLEM9MDtGPkM7KXtpZihEPSt0W0MrK10scj0xMTE0MTExLCgoZT13KGU9RCkpPDA/UyhlK3IsMCk6eChlLHIpKSE9PUQpdGhyb3cgUmFuZ2VFcnJvcihEKyIgaXMgbm90IGEgdmFsaWQgY29kZSBwb2ludCIpO24ucHVzaChEPDY1NTM2P04oRCk6Tig1NTI5NisoKEQtPTY1NTM2KT4+MTApLEQlMTAyNCs1NjMyMCkpfXJldHVybiBuLmpvaW4oIiIpfX0pO2UuU3RyaW5nLmZyb21Db2RlUG9pbnQ7dmFyIF8sTyxqLEksVixKLE0sayxMLFQseixILCQsUixHPXtTcGFjZV9TZXBhcmF0b3I6L1tcdTE2ODBcdTIwMDAtXHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXS8sSURfU3RhcnQ6L1tceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDg2MC1cdTA4NkFcdTA4QTAtXHUwOEI0XHUwOEI2LVx1MDhCRFx1MDkwNC1cdTA5MzlcdTA5M0RcdTA5NTBcdTA5NTgtXHUwOTYxXHUwOTcxLVx1MDk4MFx1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkRcdTA5Q0VcdTA5RENcdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwXHUwOUYxXHUwOUZDXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFEMFx1MEFFMFx1MEFFMVx1MEFGOVx1MEIwNS1cdTBCMENcdTBCMEZcdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMlx1MEIzM1x1MEIzNS1cdTBCMzlcdTBCM0RcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYxXHUwQjcxXHUwQjgzXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5XHUwQjlBXHUwQjlDXHUwQjlFXHUwQjlGXHUwQkEzXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjlcdTBCRDBcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNEXHUwQzU4LVx1MEM1QVx1MEM2MFx1MEM2MVx1MEM4MFx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JEXHUwQ0RFXHUwQ0UwXHUwQ0UxXHUwQ0YxXHUwQ0YyXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNEXHUwRDRFXHUwRDU0LVx1MEQ1Nlx1MEQ1Ri1cdTBENjFcdTBEN0EtXHUwRDdGXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MEUwMS1cdTBFMzBcdTBFMzJcdTBFMzNcdTBFNDAtXHUwRTQ2XHUwRTgxXHUwRTgyXHUwRTg0XHUwRTg3XHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBXHUwRUFCXHUwRUFELVx1MEVCMFx1MEVCMlx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFREMtXHUwRURGXHUwRjAwXHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGODgtXHUwRjhDXHUxMDAwLVx1MTAyQVx1MTAzRlx1MTA1MC1cdTEwNTVcdTEwNUEtXHUxMDVEXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZFLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOEVcdTEwQTAtXHUxMEM1XHUxMEM3XHUxMENEXHUxMEQwLVx1MTBGQVx1MTBGQy1cdTEyNDhcdTEyNEEtXHUxMjREXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1QS1cdTEyNURcdTEyNjAtXHUxMjg4XHUxMjhBLVx1MTI4RFx1MTI5MC1cdTEyQjBcdTEyQjItXHUxMkI1XHUxMkI4LVx1MTJCRVx1MTJDMFx1MTJDMi1cdTEyQzVcdTEyQzgtXHUxMkQ2XHUxMkQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVBXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZFRS1cdTE2RjhcdTE3MDAtXHUxNzBDXHUxNzBFLVx1MTcxMVx1MTcyMC1cdTE3MzFcdTE3NDAtXHUxNzUxXHUxNzYwLVx1MTc2Q1x1MTc2RS1cdTE3NzBcdTE3ODAtXHUxN0IzXHUxN0Q3XHUxN0RDXHUxODIwLVx1MTg3N1x1MTg4MC1cdTE4ODRcdTE4ODctXHUxOEE4XHUxOEFBXHUxOEIwLVx1MThGNVx1MTkwMC1cdTE5MUVcdTE5NTAtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxQTAwLVx1MUExNlx1MUEyMC1cdTFBNTRcdTFBQTdcdTFCMDUtXHUxQjMzXHUxQjQ1LVx1MUI0Qlx1MUI4My1cdTFCQTBcdTFCQUVcdTFCQUZcdTFCQkEtXHUxQkU1XHUxQzAwLVx1MUMyM1x1MUM0RC1cdTFDNEZcdTFDNUEtXHUxQzdEXHUxQzgwLVx1MUM4OFx1MUNFOS1cdTFDRUNcdTFDRUUtXHUxQ0YxXHUxQ0Y1XHUxQ0Y2XHUxRDAwLVx1MURCRlx1MUUwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIxMDJcdTIxMDdcdTIxMEEtXHUyMTEzXHUyMTE1XHUyMTE5LVx1MjExRFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyQS1cdTIxMkRcdTIxMkYtXHUyMTM5XHUyMTNDLVx1MjEzRlx1MjE0NS1cdTIxNDlcdTIxNEVcdTIxNjAtXHUyMTg4XHUyQzAwLVx1MkMyRVx1MkMzMC1cdTJDNUVcdTJDNjAtXHUyQ0U0XHUyQ0VCLVx1MkNFRVx1MkNGMlx1MkNGM1x1MkQwMC1cdTJEMjVcdTJEMjdcdTJEMkRcdTJEMzAtXHUyRDY3XHUyRDZGXHUyRDgwLVx1MkQ5Nlx1MkRBMC1cdTJEQTZcdTJEQTgtXHUyREFFXHUyREIwLVx1MkRCNlx1MkRCOC1cdTJEQkVcdTJEQzAtXHUyREM2XHUyREM4LVx1MkRDRVx1MkREMC1cdTJERDZcdTJERDgtXHUyRERFXHUyRTJGXHUzMDA1LVx1MzAwN1x1MzAyMS1cdTMwMjlcdTMwMzEtXHUzMDM1XHUzMDM4LVx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJFXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkFcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCNVx1NEUwMC1cdTlGRUFcdUEwMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjFGXHVBNjJBXHVBNjJCXHVBNjQwLVx1QTY2RVx1QTY3Ri1cdUE2OURcdUE2QTAtXHVBNkVGXHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0FFXHVBN0IwLVx1QTdCN1x1QTdGNy1cdUE4MDFcdUE4MDMtXHVBODA1XHVBODA3LVx1QTgwQVx1QTgwQy1cdUE4MjJcdUE4NDAtXHVBODczXHVBODgyLVx1QThCM1x1QThGMi1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MEEtXHVBOTI1XHVBOTMwLVx1QTk0Nlx1QTk2MC1cdUE5N0NcdUE5ODQtXHVBOUIyXHVBOUNGXHVBOUUwLVx1QTlFNFx1QTlFNi1cdUE5RUZcdUE5RkEtXHVBOUZFXHVBQTAwLVx1QUEyOFx1QUE0MC1cdUFBNDJcdUFBNDQtXHVBQTRCXHVBQTYwLVx1QUE3Nlx1QUE3QVx1QUE3RS1cdUFBQUZcdUFBQjFcdUFBQjVcdUFBQjZcdUFBQjktXHVBQUJEXHVBQUMwXHVBQUMyXHVBQURCLVx1QUFERFx1QUFFMC1cdUFBRUFcdUFBRjItXHVBQUY0XHVBQjAxLVx1QUIwNlx1QUIwOS1cdUFCMEVcdUFCMTEtXHVBQjE2XHVBQjIwLVx1QUIyNlx1QUIyOC1cdUFCMkVcdUFCMzAtXHVBQjVBXHVBQjVDLVx1QUI2NVx1QUI3MC1cdUFCRTJcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFEXHVGQjFGLVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYyMS1cdUZGM0FcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0QVx1REY1MC1cdURGNzVcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERjAwLVx1REYxOV18XHVEODA2W1x1RENBMC1cdURDREZcdURDRkZcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4M1x1REU4Ni1cdURFODlcdURFQzAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzAwLVx1REM2RVx1REM4MC1cdURENDNdfFtcdUQ4MENcdUQ4MUMtXHVEODIwXHVEODQwLVx1RDg2OFx1RDg2QS1cdUQ4NkNcdUQ4NkYtXHVEODcyXHVEODc0LVx1RDg3OV1bXHVEQzAwLVx1REZGRl18XHVEODBEW1x1REMwMC1cdURDMkVdfFx1RDgxMVtcdURDMDAtXHVERTQ2XXxcdUQ4MUFbXHVEQzAwLVx1REUzOFx1REU0MC1cdURFNUVcdURFRDAtXHVERUVEXHVERjAwLVx1REYyRlx1REY0MC1cdURGNDNcdURGNjMtXHVERjc3XHVERjdELVx1REY4Rl18XHVEODFCW1x1REYwMC1cdURGNDRcdURGNTBcdURGOTMtXHVERjlGXHVERkUwXHVERkUxXXxcdUQ4MjFbXHVEQzAwLVx1REZFQ118XHVEODIyW1x1REMwMC1cdURFRjJdfFx1RDgyQ1tcdURDMDAtXHVERDFFXHVERDcwLVx1REVGQl18XHVEODJGW1x1REMwMC1cdURDNkFcdURDNzAtXHVEQzdDXHVEQzgwLVx1REM4OFx1REM5MC1cdURDOTldfFx1RDgzNVtcdURDMDAtXHVEQzU0XHVEQzU2LVx1REM5Q1x1REM5RVx1REM5Rlx1RENBMlx1RENBNVx1RENBNlx1RENBOS1cdURDQUNcdURDQUUtXHVEQ0I5XHVEQ0JCXHVEQ0JELVx1RENDM1x1RENDNS1cdUREMDVcdUREMDctXHVERDBBXHVERDBELVx1REQxNFx1REQxNi1cdUREMUNcdUREMUUtXHVERDM5XHVERDNCLVx1REQzRVx1REQ0MC1cdURENDRcdURENDZcdURENEEtXHVERDUwXHVERDUyLVx1REVBNVx1REVBOC1cdURFQzBcdURFQzItXHVERURBXHVERURDLVx1REVGQVx1REVGQy1cdURGMTRcdURGMTYtXHVERjM0XHVERjM2LVx1REY0RVx1REY1MC1cdURGNkVcdURGNzAtXHVERjg4XHVERjhBLVx1REZBOFx1REZBQS1cdURGQzJcdURGQzQtXHVERkNCXXxcdUQ4M0FbXHVEQzAwLVx1RENDNFx1REQwMC1cdURENDNdfFx1RDgzQltcdURFMDAtXHVERTAzXHVERTA1LVx1REUxRlx1REUyMVx1REUyMlx1REUyNFx1REUyN1x1REUyOS1cdURFMzJcdURFMzQtXHVERTM3XHVERTM5XHVERTNCXHVERTQyXHVERTQ3XHVERTQ5XHVERTRCXHVERTRELVx1REU0Rlx1REU1MVx1REU1Mlx1REU1NFx1REU1N1x1REU1OVx1REU1Qlx1REU1RFx1REU1Rlx1REU2MVx1REU2Mlx1REU2NFx1REU2Ny1cdURFNkFcdURFNkMtXHVERTcyXHVERTc0LVx1REU3N1x1REU3OS1cdURFN0NcdURFN0VcdURFODAtXHVERTg5XHVERThCLVx1REU5Qlx1REVBMS1cdURFQTNcdURFQTUtXHVERUE5XHVERUFCLVx1REVCQl18XHVEODY5W1x1REMwMC1cdURFRDZcdURGMDAtXHVERkZGXXxcdUQ4NkRbXHVEQzAwLVx1REYzNFx1REY0MC1cdURGRkZdfFx1RDg2RVtcdURDMDAtXHVEQzFEXHVEQzIwLVx1REZGRl18XHVEODczW1x1REMwMC1cdURFQTFcdURFQjAtXHVERkZGXXxcdUQ4N0FbXHVEQzAwLVx1REZFMF18XHVEODdFW1x1REMwMC1cdURFMURdLyxJRF9Db250aW51ZTovW1x4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzMDAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0ODMtXHUwNDg3XHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNTkxLVx1MDVCRFx1MDVCRlx1MDVDMVx1MDVDMlx1MDVDNFx1MDVDNVx1MDVDN1x1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjEwLVx1MDYxQVx1MDYyMC1cdTA2NjlcdTA2NkUtXHUwNkQzXHUwNkQ1LVx1MDZEQ1x1MDZERi1cdTA2RThcdTA2RUEtXHUwNkZDXHUwNkZGXHUwNzEwLVx1MDc0QVx1MDc0RC1cdTA3QjFcdTA3QzAtXHUwN0Y1XHUwN0ZBXHUwODAwLVx1MDgyRFx1MDg0MC1cdTA4NUJcdTA4NjAtXHUwODZBXHUwOEEwLVx1MDhCNFx1MDhCNi1cdTA4QkRcdTA4RDQtXHUwOEUxXHUwOEUzLVx1MDk2M1x1MDk2Ni1cdTA5NkZcdTA5NzEtXHUwOTgzXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCQy1cdTA5QzRcdTA5QzdcdTA5QzhcdTA5Q0ItXHUwOUNFXHUwOUQ3XHUwOURDXHUwOUREXHUwOURGLVx1MDlFM1x1MDlFNi1cdTA5RjFcdTA5RkNcdTBBMDEtXHUwQTAzXHUwQTA1LVx1MEEwQVx1MEEwRlx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyXHUwQTMzXHUwQTM1XHUwQTM2XHUwQTM4XHUwQTM5XHUwQTNDXHUwQTNFLVx1MEE0Mlx1MEE0N1x1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNTFcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTY2LVx1MEE3NVx1MEE4MS1cdTBBODNcdTBBODUtXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCQy1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEFEMFx1MEFFMC1cdTBBRTNcdTBBRTYtXHUwQUVGXHUwQUY5LVx1MEFGRlx1MEIwMS1cdTBCMDNcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNDLVx1MEI0NFx1MEI0N1x1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTZcdTBCNTdcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYzXHUwQjY2LVx1MEI2Rlx1MEI3MVx1MEI4Mlx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQwXHUwQkQ3XHUwQkU2LVx1MEJFRlx1MEMwMC1cdTBDMDNcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNELVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1XHUwQzU2XHUwQzU4LVx1MEM1QVx1MEM2MC1cdTBDNjNcdTBDNjYtXHUwQzZGXHUwQzgwLVx1MEM4M1x1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JDLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1XHUwQ0Q2XHUwQ0RFXHUwQ0UwLVx1MENFM1x1MENFNi1cdTBDRUZcdTBDRjFcdTBDRjJcdTBEMDAtXHUwRDAzXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDQ0XHUwRDQ2LVx1MEQ0OFx1MEQ0QS1cdTBENEVcdTBENTQtXHUwRDU3XHUwRDVGLVx1MEQ2M1x1MEQ2Ni1cdTBENkZcdTBEN0EtXHUwRDdGXHUwRDgyXHUwRDgzXHUwRDg1LVx1MEQ5Nlx1MEQ5QS1cdTBEQjFcdTBEQjMtXHUwREJCXHUwREJEXHUwREMwLVx1MERDNlx1MERDQVx1MERDRi1cdTBERDRcdTBERDZcdTBERDgtXHUwRERGXHUwREU2LVx1MERFRlx1MERGMlx1MERGM1x1MEUwMS1cdTBFM0FcdTBFNDAtXHUwRTRFXHUwRTUwLVx1MEU1OVx1MEU4MVx1MEU4Mlx1MEU4NFx1MEU4N1x1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQVx1MEVBQlx1MEVBRC1cdTBFQjlcdTBFQkItXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVDOC1cdTBFQ0RcdTBFRDAtXHUwRUQ5XHUwRURDLVx1MEVERlx1MEYwMFx1MEYxOFx1MEYxOVx1MEYyMC1cdTBGMjlcdTBGMzVcdTBGMzdcdTBGMzlcdTBGM0UtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY3MS1cdTBGODRcdTBGODYtXHUwRjk3XHUwRjk5LVx1MEZCQ1x1MEZDNlx1MTAwMC1cdTEwNDlcdTEwNTAtXHUxMDlEXHUxMEEwLVx1MTBDNVx1MTBDN1x1MTBDRFx1MTBEMC1cdTEwRkFcdTEwRkMtXHUxMjQ4XHUxMjRBLVx1MTI0RFx1MTI1MC1cdTEyNTZcdTEyNThcdTEyNUEtXHUxMjVEXHUxMjYwLVx1MTI4OFx1MTI4QS1cdTEyOERcdTEyOTAtXHUxMkIwXHUxMkIyLVx1MTJCNVx1MTJCOC1cdTEyQkVcdTEyQzBcdTEyQzItXHUxMkM1XHUxMkM4LVx1MTJENlx1MTJEOC1cdTEzMTBcdTEzMTItXHUxMzE1XHUxMzE4LVx1MTM1QVx1MTM1RC1cdTEzNUZcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkVFLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzE0XHUxNzIwLVx1MTczNFx1MTc0MC1cdTE3NTNcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc3Mlx1MTc3M1x1MTc4MC1cdTE3RDNcdTE3RDdcdTE3RENcdTE3RERcdTE3RTAtXHUxN0U5XHUxODBCLVx1MTgwRFx1MTgxMC1cdTE4MTlcdTE4MjAtXHUxODc3XHUxODgwLVx1MThBQVx1MThCMC1cdTE4RjVcdTE5MDAtXHUxOTFFXHUxOTIwLVx1MTkyQlx1MTkzMC1cdTE5M0JcdTE5NDYtXHUxOTZEXHUxOTcwLVx1MTk3NFx1MTk4MC1cdTE5QUJcdTE5QjAtXHUxOUM5XHUxOUQwLVx1MTlEOVx1MUEwMC1cdTFBMUJcdTFBMjAtXHUxQTVFXHUxQTYwLVx1MUE3Q1x1MUE3Ri1cdTFBODlcdTFBOTAtXHUxQTk5XHUxQUE3XHUxQUIwLVx1MUFCRFx1MUIwMC1cdTFCNEJcdTFCNTAtXHUxQjU5XHUxQjZCLVx1MUI3M1x1MUI4MC1cdTFCRjNcdTFDMDAtXHUxQzM3XHUxQzQwLVx1MUM0OVx1MUM0RC1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0QwLVx1MUNEMlx1MUNENC1cdTFDRjlcdTFEMDAtXHUxREY5XHUxREZCLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDNGXHUyMDQwXHUyMDU0XHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjBEMC1cdTIwRENcdTIwRTFcdTIwRTUtXHUyMEYwXHUyMTAyXHUyMTA3XHUyMTBBLVx1MjExM1x1MjExNVx1MjExOS1cdTIxMURcdTIxMjRcdTIxMjZcdTIxMjhcdTIxMkEtXHUyMTJEXHUyMTJGLVx1MjEzOVx1MjEzQy1cdTIxM0ZcdTIxNDUtXHUyMTQ5XHUyMTRFXHUyMTYwLVx1MjE4OFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ3Ri1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkRFMC1cdTJERkZcdTJFMkZcdTMwMDUtXHUzMDA3XHUzMDIxLVx1MzAyRlx1MzAzMS1cdTMwMzVcdTMwMzgtXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5OVx1MzA5QVx1MzA5RC1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkVcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCQVx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REI1XHU0RTAwLVx1OUZFQVx1QTAwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MkJcdUE2NDAtXHVBNjZGXHVBNjc0LVx1QTY3RFx1QTY3Ri1cdUE2RjFcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3QUVcdUE3QjAtXHVBN0I3XHVBN0Y3LVx1QTgyN1x1QTg0MC1cdUE4NzNcdUE4ODAtXHVBOEM1XHVBOEQwLVx1QThEOVx1QThFMC1cdUE4RjdcdUE4RkJcdUE4RkRcdUE5MDAtXHVBOTJEXHVBOTMwLVx1QTk1M1x1QTk2MC1cdUE5N0NcdUE5ODAtXHVBOUMwXHVBOUNGLVx1QTlEOVx1QTlFMC1cdUE5RkVcdUFBMDAtXHVBQTM2XHVBQTQwLVx1QUE0RFx1QUE1MC1cdUFBNTlcdUFBNjAtXHVBQTc2XHVBQTdBLVx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVGXHVBQUYyLVx1QUFGNlx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkVBXHVBQkVDXHVBQkVEXHVBQkYwLVx1QUJGOVx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMUQtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkUwMC1cdUZFMEZcdUZFMjAtXHVGRTJGXHVGRTMzXHVGRTM0XHVGRTRELVx1RkU0Rlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjEwLVx1RkYxOVx1RkYyMS1cdUZGM0FcdUZGM0ZcdUZGNDEtXHVGRjVBXHVGRjY2LVx1RkZCRVx1RkZDMi1cdUZGQzdcdUZGQ0EtXHVGRkNGXHVGRkQyLVx1RkZEN1x1RkZEQS1cdUZGRENdfFx1RDgwMFtcdURDMDAtXHVEQzBCXHVEQzBELVx1REMyNlx1REMyOC1cdURDM0FcdURDM0NcdURDM0RcdURDM0YtXHVEQzREXHVEQzUwLVx1REM1RFx1REM4MC1cdURDRkFcdURENDAtXHVERDc0XHVEREZEXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURFRTBcdURGMDAtXHVERjFGXHVERjJELVx1REY0QVx1REY1MC1cdURGN0FcdURGODAtXHVERjlEXHVERkEwLVx1REZDM1x1REZDOC1cdURGQ0ZcdURGRDEtXHVERkQ1XXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENBMC1cdURDQTlcdURDQjAtXHVEQ0QzXHVEQ0Q4LVx1RENGQlx1REQwMC1cdUREMjdcdUREMzAtXHVERDYzXHVERTAwLVx1REYzNlx1REY0MC1cdURGNTVcdURGNjAtXHVERjY3XXxcdUQ4MDJbXHVEQzAwLVx1REMwNVx1REMwOFx1REMwQS1cdURDMzVcdURDMzdcdURDMzhcdURDM0NcdURDM0YtXHVEQzU1XHVEQzYwLVx1REM3Nlx1REM4MC1cdURDOUVcdURDRTAtXHVEQ0YyXHVEQ0Y0XHVEQ0Y1XHVERDAwLVx1REQxNVx1REQyMC1cdUREMzlcdUREODAtXHVEREI3XHVEREJFXHVEREJGXHVERTAwLVx1REUwM1x1REUwNVx1REUwNlx1REUwQy1cdURFMTNcdURFMTUtXHVERTE3XHVERTE5LVx1REUzM1x1REUzOC1cdURFM0FcdURFM0ZcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU2XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMC1cdURDNDZcdURDNjYtXHVEQzZGXHVEQzdGLVx1RENCQVx1RENEMC1cdURDRThcdURDRjAtXHVEQ0Y5XHVERDAwLVx1REQzNFx1REQzNi1cdUREM0ZcdURENTAtXHVERDczXHVERDc2XHVERDgwLVx1RERDNFx1RERDQS1cdUREQ0NcdURERDAtXHVERERBXHVERERDXHVERTAwLVx1REUxMVx1REUxMy1cdURFMzdcdURFM0VcdURFODAtXHVERTg2XHVERTg4XHVERThBLVx1REU4RFx1REU4Ri1cdURFOURcdURFOUYtXHVERUE4XHVERUIwLVx1REVFQVx1REVGMC1cdURFRjlcdURGMDAtXHVERjAzXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzQy1cdURGNDRcdURGNDdcdURGNDhcdURGNEItXHVERjREXHVERjUwXHVERjU3XHVERjVELVx1REY2M1x1REY2Ni1cdURGNkNcdURGNzAtXHVERjc0XXxcdUQ4MDVbXHVEQzAwLVx1REM0QVx1REM1MC1cdURDNTlcdURDODAtXHVEQ0M1XHVEQ0M3XHVEQ0QwLVx1RENEOVx1REQ4MC1cdUREQjVcdUREQjgtXHVEREMwXHVEREQ4LVx1RERERFx1REUwMC1cdURFNDBcdURFNDRcdURFNTAtXHVERTU5XHVERTgwLVx1REVCN1x1REVDMC1cdURFQzlcdURGMDAtXHVERjE5XHVERjFELVx1REYyQlx1REYzMC1cdURGMzldfFx1RDgwNltcdURDQTAtXHVEQ0U5XHVEQ0ZGXHVERTAwLVx1REUzRVx1REU0N1x1REU1MC1cdURFODNcdURFODYtXHVERTk5XHVERUMwLVx1REVGOF18XHVEODA3W1x1REMwMC1cdURDMDhcdURDMEEtXHVEQzM2XHVEQzM4LVx1REM0MFx1REM1MC1cdURDNTlcdURDNzItXHVEQzhGXHVEQzkyLVx1RENBN1x1RENBOS1cdURDQjZcdUREMDAtXHVERDA2XHVERDA4XHVERDA5XHVERDBCLVx1REQzNlx1REQzQVx1REQzQ1x1REQzRFx1REQzRi1cdURENDdcdURENTAtXHVERDU5XXxcdUQ4MDhbXHVEQzAwLVx1REY5OV18XHVEODA5W1x1REMwMC1cdURDNkVcdURDODAtXHVERDQzXXxbXHVEODBDXHVEODFDLVx1RDgyMFx1RDg0MC1cdUQ4NjhcdUQ4NkEtXHVEODZDXHVEODZGLVx1RDg3Mlx1RDg3NC1cdUQ4NzldW1x1REMwMC1cdURGRkZdfFx1RDgwRFtcdURDMDAtXHVEQzJFXXxcdUQ4MTFbXHVEQzAwLVx1REU0Nl18XHVEODFBW1x1REMwMC1cdURFMzhcdURFNDAtXHVERTVFXHVERTYwLVx1REU2OVx1REVEMC1cdURFRURcdURFRjAtXHVERUY0XHVERjAwLVx1REYzNlx1REY0MC1cdURGNDNcdURGNTAtXHVERjU5XHVERjYzLVx1REY3N1x1REY3RC1cdURGOEZdfFx1RDgxQltcdURGMDAtXHVERjQ0XHVERjUwLVx1REY3RVx1REY4Ri1cdURGOUZcdURGRTBcdURGRTFdfFx1RDgyMVtcdURDMDAtXHVERkVDXXxcdUQ4MjJbXHVEQzAwLVx1REVGMl18XHVEODJDW1x1REMwMC1cdUREMUVcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OVx1REM5RFx1REM5RV18XHVEODM0W1x1REQ2NS1cdURENjlcdURENkQtXHVERDcyXHVERDdCLVx1REQ4Mlx1REQ4NS1cdUREOEJcdUREQUEtXHVEREFEXHVERTQyLVx1REU0NF18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JcdURGQ0UtXHVERkZGXXxcdUQ4MzZbXHVERTAwLVx1REUzNlx1REUzQi1cdURFNkNcdURFNzVcdURFODRcdURFOUItXHVERTlGXHVERUExLVx1REVBRl18XHVEODM4W1x1REMwMC1cdURDMDZcdURDMDgtXHVEQzE4XHVEQzFCLVx1REMyMVx1REMyM1x1REMyNFx1REMyNi1cdURDMkFdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVEQ0QwLVx1RENENlx1REQwMC1cdURENEFcdURENTAtXHVERDU5XXxcdUQ4M0JbXHVERTAwLVx1REUwM1x1REUwNS1cdURFMUZcdURFMjFcdURFMjJcdURFMjRcdURFMjdcdURFMjktXHVERTMyXHVERTM0LVx1REUzN1x1REUzOVx1REUzQlx1REU0Mlx1REU0N1x1REU0OVx1REU0Qlx1REU0RC1cdURFNEZcdURFNTFcdURFNTJcdURFNTRcdURFNTdcdURFNTlcdURFNUJcdURFNURcdURFNUZcdURFNjFcdURFNjJcdURFNjRcdURFNjctXHVERTZBXHVERTZDLVx1REU3Mlx1REU3NC1cdURFNzdcdURFNzktXHVERTdDXHVERTdFXHVERTgwLVx1REU4OVx1REU4Qi1cdURFOUJcdURFQTEtXHVERUEzXHVERUE1LVx1REVBOVx1REVBQi1cdURFQkJdfFx1RDg2OVtcdURDMDAtXHVERUQ2XHVERjAwLVx1REZGRl18XHVEODZEW1x1REMwMC1cdURGMzRcdURGNDAtXHVERkZGXXxcdUQ4NkVbXHVEQzAwLVx1REMxRFx1REMyMC1cdURGRkZdfFx1RDg3M1tcdURDMDAtXHVERUExXHVERUIwLVx1REZGRl18XHVEODdBW1x1REMwMC1cdURGRTBdfFx1RDg3RVtcdURDMDAtXHVERTFEXXxcdURCNDBbXHVERDAwLVx1RERFRl0vfSxVPXtpc1NwYWNlU2VwYXJhdG9yOmZ1bmN0aW9uKHUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdSYmRy5TcGFjZV9TZXBhcmF0b3IudGVzdCh1KX0saXNJZFN0YXJ0Q2hhcjpmdW5jdGlvbih1KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHUmJih1Pj0iYSImJnU8PSJ6Inx8dT49IkEiJiZ1PD0iWiJ8fCIkIj09PXV8fCJfIj09PXV8fEcuSURfU3RhcnQudGVzdCh1KSl9LGlzSWRDb250aW51ZUNoYXI6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYodT49ImEiJiZ1PD0ieiJ8fHU+PSJBIiYmdTw9IloifHx1Pj0iMCImJnU8PSI5Inx8IiQiPT09dXx8Il8iPT09dXx8IuKAjCI9PT11fHwi4oCNIj09PXV8fEcuSURfQ29udGludWUudGVzdCh1KSl9LGlzRGlnaXQ6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYvWzAtOV0vLnRlc3QodSl9LGlzSGV4RGlnaXQ6ZnVuY3Rpb24odSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB1JiYvWzAtOUEtRmEtZl0vLnRlc3QodSl9fTtmdW5jdGlvbiBaKCl7Zm9yKFQ9ImRlZmF1bHQiLHo9IiIsSD0hMSwkPTE7Oyl7Uj1xKCk7dmFyIHU9WFtUXSgpO2lmKHUpcmV0dXJuIHV9fWZ1bmN0aW9uIHEoKXtpZihfW0ldKXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChfLmNvZGVQb2ludEF0KEkpKX1mdW5jdGlvbiBXKCl7dmFyIHU9cSgpO3JldHVybiJcbiI9PT11PyhWKyssSj0wKTp1P0orPXUubGVuZ3RoOkorKyx1JiYoSSs9dS5sZW5ndGgpLHV9dmFyIFg9e2RlZmF1bHQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJcdCI6Y2FzZSJcdiI6Y2FzZSJcZiI6Y2FzZSIgIjpjYXNlIiAiOmNhc2UiXHVmZWZmIjpjYXNlIlxuIjpjYXNlIlxyIjpjYXNlIlx1MjAyOCI6Y2FzZSJcdTIwMjkiOnJldHVybiB2b2lkIFcoKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJjb21tZW50Iik7Y2FzZSB2b2lkIDA6cmV0dXJuIFcoKSxLKCJlb2YiKX1pZighVS5pc1NwYWNlU2VwYXJhdG9yKFIpKXJldHVybiBYW09dKCk7VygpfSxjb21tZW50OmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiKiI6cmV0dXJuIFcoKSx2b2lkKFQ9Im11bHRpTGluZUNvbW1lbnQiKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJzaW5nbGVMaW5lQ29tbWVudCIpfXRocm93IHJ1KFcoKSl9LG11bHRpTGluZUNvbW1lbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIqIjpyZXR1cm4gVygpLHZvaWQoVD0ibXVsdGlMaW5lQ29tbWVudEFzdGVyaXNrIik7Y2FzZSB2b2lkIDA6dGhyb3cgcnUoVygpKX1XKCl9LG11bHRpTGluZUNvbW1lbnRBc3RlcmlzazpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIioiOnJldHVybiB2b2lkIFcoKTtjYXNlIi8iOnJldHVybiBXKCksdm9pZChUPSJkZWZhdWx0Iik7Y2FzZSB2b2lkIDA6dGhyb3cgcnUoVygpKX1XKCksVD0ibXVsdGlMaW5lQ29tbWVudCJ9LHNpbmdsZUxpbmVDb21tZW50OmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiXG4iOmNhc2UiXHIiOmNhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6cmV0dXJuIFcoKSx2b2lkKFQ9ImRlZmF1bHQiKTtjYXNlIHZvaWQgMDpyZXR1cm4gVygpLEsoImVvZiIpfVcoKX0sdmFsdWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJ7IjpjYXNlIlsiOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO2Nhc2UibiI6cmV0dXJuIFcoKSxRKCJ1bGwiKSxLKCJudWxsIixudWxsKTtjYXNlInQiOnJldHVybiBXKCksUSgicnVlIiksSygiYm9vbGVhbiIsITApO2Nhc2UiZiI6cmV0dXJuIFcoKSxRKCJhbHNlIiksSygiYm9vbGVhbiIsITEpO2Nhc2UiLSI6Y2FzZSIrIjpyZXR1cm4iLSI9PT1XKCkmJigkPS0xKSx2b2lkKFQ9InNpZ24iKTtjYXNlIi4iOnJldHVybiB6PVcoKSx2b2lkKFQ9ImRlY2ltYWxQb2ludExlYWRpbmciKTtjYXNlIjAiOnJldHVybiB6PVcoKSx2b2lkKFQ9Inplcm8iKTtjYXNlIjEiOmNhc2UiMiI6Y2FzZSIzIjpjYXNlIjQiOmNhc2UiNSI6Y2FzZSI2IjpjYXNlIjciOmNhc2UiOCI6Y2FzZSI5IjpyZXR1cm4gej1XKCksdm9pZChUPSJkZWNpbWFsSW50ZWdlciIpO2Nhc2UiSSI6cmV0dXJuIFcoKSxRKCJuZmluaXR5IiksSygibnVtZXJpYyIsMS8wKTtjYXNlIk4iOnJldHVybiBXKCksUSgiYU4iKSxLKCJudW1lcmljIixOYU4pO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gSD0nIic9PT1XKCksej0iIix2b2lkKFQ9InN0cmluZyIpfXRocm93IHJ1KFcoKSl9LGlkZW50aWZpZXJOYW1lU3RhcnRFc2NhcGU6ZnVuY3Rpb24oKXtpZigidSIhPT1SKXRocm93IHJ1KFcoKSk7VygpO3ZhciB1PVkoKTtzd2l0Y2godSl7Y2FzZSIkIjpjYXNlIl8iOmJyZWFrO2RlZmF1bHQ6aWYoIVUuaXNJZFN0YXJ0Q2hhcih1KSl0aHJvdyBudSgpfXorPXUsVD0iaWRlbnRpZmllck5hbWUifSxpZGVudGlmaWVyTmFtZTpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIiQiOmNhc2UiXyI6Y2FzZSLigIwiOmNhc2Ui4oCNIjpyZXR1cm4gdm9pZCh6Kz1XKCkpO2Nhc2UiXFwiOnJldHVybiBXKCksdm9pZChUPSJpZGVudGlmaWVyTmFtZUVzY2FwZSIpfWlmKCFVLmlzSWRDb250aW51ZUNoYXIoUikpcmV0dXJuIEsoImlkZW50aWZpZXIiLHopO3orPVcoKX0saWRlbnRpZmllck5hbWVFc2NhcGU6ZnVuY3Rpb24oKXtpZigidSIhPT1SKXRocm93IHJ1KFcoKSk7VygpO3ZhciB1PVkoKTtzd2l0Y2godSl7Y2FzZSIkIjpjYXNlIl8iOmNhc2Ui4oCMIjpjYXNlIuKAjSI6YnJlYWs7ZGVmYXVsdDppZighVS5pc0lkQ29udGludWVDaGFyKHUpKXRocm93IG51KCl9eis9dSxUPSJpZGVudGlmaWVyTmFtZSJ9LHNpZ246ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIuIjpyZXR1cm4gej1XKCksdm9pZChUPSJkZWNpbWFsUG9pbnRMZWFkaW5nIik7Y2FzZSIwIjpyZXR1cm4gej1XKCksdm9pZChUPSJ6ZXJvIik7Y2FzZSIxIjpjYXNlIjIiOmNhc2UiMyI6Y2FzZSI0IjpjYXNlIjUiOmNhc2UiNiI6Y2FzZSI3IjpjYXNlIjgiOmNhc2UiOSI6cmV0dXJuIHo9VygpLHZvaWQoVD0iZGVjaW1hbEludGVnZXIiKTtjYXNlIkkiOnJldHVybiBXKCksUSgibmZpbml0eSIpLEsoIm51bWVyaWMiLCQqKDEvMCkpO2Nhc2UiTiI6cmV0dXJuIFcoKSxRKCJhTiIpLEsoIm51bWVyaWMiLE5hTil9dGhyb3cgcnUoVygpKX0semVybzpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIi4iOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsUG9pbnQiKTtjYXNlImUiOmNhc2UiRSI6cmV0dXJuIHorPVcoKSx2b2lkKFQ9ImRlY2ltYWxFeHBvbmVudCIpO2Nhc2UieCI6Y2FzZSJYIjpyZXR1cm4geis9VygpLHZvaWQoVD0iaGV4YWRlY2ltYWwiKX1yZXR1cm4gSygibnVtZXJpYyIsMCokKX0sZGVjaW1hbEludGVnZXI6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIuIjpyZXR1cm4geis9VygpLHZvaWQoVD0iZGVjaW1hbFBvaW50Iik7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1pZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxkZWNpbWFsUG9pbnRMZWFkaW5nOmZ1bmN0aW9uKCl7aWYoVS5pc0RpZ2l0KFIpKXJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRnJhY3Rpb24iKTt0aHJvdyBydShXKCkpfSxkZWNpbWFsUG9pbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1yZXR1cm4gVS5pc0RpZ2l0KFIpPyh6Kz1XKCksdm9pZChUPSJkZWNpbWFsRnJhY3Rpb24iKSk6SygibnVtZXJpYyIsJCpOdW1iZXIoeikpfSxkZWNpbWFsRnJhY3Rpb246ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSJlIjpjYXNlIkUiOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnQiKX1pZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxkZWNpbWFsRXhwb25lbnQ6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIrIjpjYXNlIi0iOnJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnRTaWduIil9aWYoVS5pc0RpZ2l0KFIpKXJldHVybiB6Kz1XKCksdm9pZChUPSJkZWNpbWFsRXhwb25lbnRJbnRlZ2VyIik7dGhyb3cgcnUoVygpKX0sZGVjaW1hbEV4cG9uZW50U2lnbjpmdW5jdGlvbigpe2lmKFUuaXNEaWdpdChSKSlyZXR1cm4geis9VygpLHZvaWQoVD0iZGVjaW1hbEV4cG9uZW50SW50ZWdlciIpO3Rocm93IHJ1KFcoKSl9LGRlY2ltYWxFeHBvbmVudEludGVnZXI6ZnVuY3Rpb24oKXtpZighVS5pc0RpZ2l0KFIpKXJldHVybiBLKCJudW1lcmljIiwkKk51bWJlcih6KSk7eis9VygpfSxoZXhhZGVjaW1hbDpmdW5jdGlvbigpe2lmKFUuaXNIZXhEaWdpdChSKSlyZXR1cm4geis9VygpLHZvaWQoVD0iaGV4YWRlY2ltYWxJbnRlZ2VyIik7dGhyb3cgcnUoVygpKX0saGV4YWRlY2ltYWxJbnRlZ2VyOmZ1bmN0aW9uKCl7aWYoIVUuaXNIZXhEaWdpdChSKSlyZXR1cm4gSygibnVtZXJpYyIsJCpOdW1iZXIoeikpO3orPVcoKX0sc3RyaW5nOmZ1bmN0aW9uKCl7c3dpdGNoKFIpe2Nhc2UiXFwiOnJldHVybiBXKCksdm9pZCh6Kz1mdW5jdGlvbigpe3N3aXRjaChxKCkpe2Nhc2UiYiI6cmV0dXJuIFcoKSwiXGIiO2Nhc2UiZiI6cmV0dXJuIFcoKSwiXGYiO2Nhc2UibiI6cmV0dXJuIFcoKSwiXG4iO2Nhc2UiciI6cmV0dXJuIFcoKSwiXHIiO2Nhc2UidCI6cmV0dXJuIFcoKSwiXHQiO2Nhc2UidiI6cmV0dXJuIFcoKSwiXHYiO2Nhc2UiMCI6aWYoVygpLFUuaXNEaWdpdChxKCkpKXRocm93IHJ1KFcoKSk7cmV0dXJuIlwwIjtjYXNlIngiOnJldHVybiBXKCksZnVuY3Rpb24oKXt2YXIgdT0iIixEPXEoKTtpZighVS5pc0hleERpZ2l0KEQpKXRocm93IHJ1KFcoKSk7aWYodSs9VygpLEQ9cSgpLCFVLmlzSGV4RGlnaXQoRCkpdGhyb3cgcnUoVygpKTtyZXR1cm4gdSs9VygpLFN0cmluZy5mcm9tQ29kZVBvaW50KHBhcnNlSW50KHUsMTYpKX0oKTtjYXNlInUiOnJldHVybiBXKCksWSgpO2Nhc2UiXG4iOmNhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6cmV0dXJuIFcoKSwiIjtjYXNlIlxyIjpyZXR1cm4gVygpLCJcbiI9PT1xKCkmJlcoKSwiIjtjYXNlIjEiOmNhc2UiMiI6Y2FzZSIzIjpjYXNlIjQiOmNhc2UiNSI6Y2FzZSI2IjpjYXNlIjciOmNhc2UiOCI6Y2FzZSI5IjpjYXNlIHZvaWQgMDp0aHJvdyBydShXKCkpfXJldHVybiBXKCl9KCkpO2Nhc2UnIic6cmV0dXJuIEg/KFcoKSxLKCJzdHJpbmciLHopKTp2b2lkKHorPVcoKSk7Y2FzZSInIjpyZXR1cm4gSD92b2lkKHorPVcoKSk6KFcoKSxLKCJzdHJpbmciLHopKTtjYXNlIlxuIjpjYXNlIlxyIjp0aHJvdyBydShXKCkpO2Nhc2UiXHUyMDI4IjpjYXNlIlx1MjAyOSI6IWZ1bmN0aW9uKHUpe2NvbnNvbGUud2FybigiSlNPTjU6ICciK0Z1KHUpKyInIGluIHN0cmluZ3MgaXMgbm90IHZhbGlkIEVDTUFTY3JpcHQ7IGNvbnNpZGVyIGVzY2FwaW5nIil9KFIpO2JyZWFrO2Nhc2Ugdm9pZCAwOnRocm93IHJ1KFcoKSl9eis9VygpfSxzdGFydDpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlInsiOmNhc2UiWyI6cmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSl9VD0idmFsdWUifSxiZWZvcmVQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIkIjpjYXNlIl8iOnJldHVybiB6PVcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lIik7Y2FzZSJcXCI6cmV0dXJuIFcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lU3RhcnRFc2NhcGUiKTtjYXNlIn0iOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gSD0nIic9PT1XKCksdm9pZChUPSJzdHJpbmciKX1pZihVLmlzSWRTdGFydENoYXIoUikpcmV0dXJuIHorPVcoKSx2b2lkKFQ9ImlkZW50aWZpZXJOYW1lIik7dGhyb3cgcnUoVygpKX0sYWZ0ZXJQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtpZigiOiI9PT1SKXJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpO3Rocm93IHJ1KFcoKSl9LGJlZm9yZVByb3BlcnR5VmFsdWU6ZnVuY3Rpb24oKXtUPSJ2YWx1ZSJ9LGFmdGVyUHJvcGVydHlWYWx1ZTpmdW5jdGlvbigpe3N3aXRjaChSKXtjYXNlIiwiOmNhc2UifSI6cmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSl9dGhyb3cgcnUoVygpKX0sYmVmb3JlQXJyYXlWYWx1ZTpmdW5jdGlvbigpe2lmKCJdIj09PVIpcmV0dXJuIEsoInB1bmN0dWF0b3IiLFcoKSk7VD0idmFsdWUifSxhZnRlckFycmF5VmFsdWU6ZnVuY3Rpb24oKXtzd2l0Y2goUil7Y2FzZSIsIjpjYXNlIl0iOnJldHVybiBLKCJwdW5jdHVhdG9yIixXKCkpfXRocm93IHJ1KFcoKSl9LGVuZDpmdW5jdGlvbigpe3Rocm93IHJ1KFcoKSl9fTtmdW5jdGlvbiBLKHUsRCl7cmV0dXJue3R5cGU6dSx2YWx1ZTpELGxpbmU6Vixjb2x1bW46Sn19ZnVuY3Rpb24gUSh1KXtmb3IodmFyIEQ9MCxlPXU7RDxlLmxlbmd0aDtEKz0xKXt2YXIgcj1lW0RdO2lmKHEoKSE9PXIpdGhyb3cgcnUoVygpKTtXKCl9fWZ1bmN0aW9uIFkoKXtmb3IodmFyIHU9IiIsRD00O0QtLSA+MDspe3ZhciBlPXEoKTtpZighVS5pc0hleERpZ2l0KGUpKXRocm93IHJ1KFcoKSk7dSs9VygpfXJldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChwYXJzZUludCh1LDE2KSl9dmFyIHV1PXtzdGFydDpmdW5jdGlvbigpe2lmKCJlb2YiPT09TS50eXBlKXRocm93IHR1KCk7RHUoKX0sYmVmb3JlUHJvcGVydHlOYW1lOmZ1bmN0aW9uKCl7c3dpdGNoKE0udHlwZSl7Y2FzZSJpZGVudGlmaWVyIjpjYXNlInN0cmluZyI6cmV0dXJuIGs9TS52YWx1ZSx2b2lkKE89ImFmdGVyUHJvcGVydHlOYW1lIik7Y2FzZSJwdW5jdHVhdG9yIjpyZXR1cm4gdm9pZCBldSgpO2Nhc2UiZW9mIjp0aHJvdyB0dSgpfX0sYWZ0ZXJQcm9wZXJ0eU5hbWU6ZnVuY3Rpb24oKXtpZigiZW9mIj09PU0udHlwZSl0aHJvdyB0dSgpO089ImJlZm9yZVByb3BlcnR5VmFsdWUifSxiZWZvcmVQcm9wZXJ0eVZhbHVlOmZ1bmN0aW9uKCl7aWYoImVvZiI9PT1NLnR5cGUpdGhyb3cgdHUoKTtEdSgpfSxiZWZvcmVBcnJheVZhbHVlOmZ1bmN0aW9uKCl7aWYoImVvZiI9PT1NLnR5cGUpdGhyb3cgdHUoKTsicHVuY3R1YXRvciIhPT1NLnR5cGV8fCJdIiE9PU0udmFsdWU/RHUoKTpldSgpfSxhZnRlclByb3BlcnR5VmFsdWU6ZnVuY3Rpb24oKXtpZigiZW9mIj09PU0udHlwZSl0aHJvdyB0dSgpO3N3aXRjaChNLnZhbHVlKXtjYXNlIiwiOnJldHVybiB2b2lkKE89ImJlZm9yZVByb3BlcnR5TmFtZSIpO2Nhc2UifSI6ZXUoKX19LGFmdGVyQXJyYXlWYWx1ZTpmdW5jdGlvbigpe2lmKCJlb2YiPT09TS50eXBlKXRocm93IHR1KCk7c3dpdGNoKE0udmFsdWUpe2Nhc2UiLCI6cmV0dXJuIHZvaWQoTz0iYmVmb3JlQXJyYXlWYWx1ZSIpO2Nhc2UiXSI6ZXUoKX19LGVuZDpmdW5jdGlvbigpe319O2Z1bmN0aW9uIER1KCl7dmFyIHU7c3dpdGNoKE0udHlwZSl7Y2FzZSJwdW5jdHVhdG9yIjpzd2l0Y2goTS52YWx1ZSl7Y2FzZSJ7Ijp1PXt9O2JyZWFrO2Nhc2UiWyI6dT1bXX1icmVhaztjYXNlIm51bGwiOmNhc2UiYm9vbGVhbiI6Y2FzZSJudW1lcmljIjpjYXNlInN0cmluZyI6dT1NLnZhbHVlfWlmKHZvaWQgMD09PUwpTD11O2Vsc2V7dmFyIEQ9altqLmxlbmd0aC0xXTtBcnJheS5pc0FycmF5KEQpP0QucHVzaCh1KTpPYmplY3QuZGVmaW5lUHJvcGVydHkoRCxrLHt2YWx1ZTp1LHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9aWYobnVsbCE9PXUmJiJvYmplY3QiPT10eXBlb2YgdSlqLnB1c2godSksTz1BcnJheS5pc0FycmF5KHUpPyJiZWZvcmVBcnJheVZhbHVlIjoiYmVmb3JlUHJvcGVydHlOYW1lIjtlbHNle3ZhciBlPWpbai5sZW5ndGgtMV07Tz1udWxsPT1lPyJlbmQiOkFycmF5LmlzQXJyYXkoZSk/ImFmdGVyQXJyYXlWYWx1ZSI6ImFmdGVyUHJvcGVydHlWYWx1ZSJ9fWZ1bmN0aW9uIGV1KCl7ai5wb3AoKTt2YXIgdT1qW2oubGVuZ3RoLTFdO089bnVsbD09dT8iZW5kIjpBcnJheS5pc0FycmF5KHUpPyJhZnRlckFycmF5VmFsdWUiOiJhZnRlclByb3BlcnR5VmFsdWUifWZ1bmN0aW9uIHJ1KHUpe3JldHVybiBDdSh2b2lkIDA9PT11PyJKU09ONTogaW52YWxpZCBlbmQgb2YgaW5wdXQgYXQgIitWKyI6IitKOiJKU09ONTogaW52YWxpZCBjaGFyYWN0ZXIgJyIrRnUodSkrIicgYXQgIitWKyI6IitKKX1mdW5jdGlvbiB0dSgpe3JldHVybiBDdSgiSlNPTjU6IGludmFsaWQgZW5kIG9mIGlucHV0IGF0ICIrVisiOiIrSil9ZnVuY3Rpb24gbnUoKXtyZXR1cm4gQ3UoIkpTT041OiBpbnZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVyIGF0ICIrVisiOiIrKEotPTUpKX1mdW5jdGlvbiBGdSh1KXt2YXIgRD17IiciOiJcXCciLCciJzonXFwiJywiXFwiOiJcXFxcIiwiXGIiOiJcXGIiLCJcZiI6IlxcZiIsIlxuIjoiXFxuIiwiXHIiOiJcXHIiLCJcdCI6IlxcdCIsIlx2IjoiXFx2IiwiXDAiOiJcXDAiLCJcdTIwMjgiOiJcXHUyMDI4IiwiXHUyMDI5IjoiXFx1MjAyOSJ9O2lmKERbdV0pcmV0dXJuIERbdV07aWYodTwiICIpe3ZhciBlPXUuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7cmV0dXJuIlxceCIrKCIwMCIrZSkuc3Vic3RyaW5nKGUubGVuZ3RoKX1yZXR1cm4gdX1mdW5jdGlvbiBDdSh1KXt2YXIgRD1uZXcgU3ludGF4RXJyb3IodSk7cmV0dXJuIEQubGluZU51bWJlcj1WLEQuY29sdW1uTnVtYmVyPUosRH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24odSxEKXtfPVN0cmluZyh1KSxPPSJzdGFydCIsaj1bXSxJPTAsVj0xLEo9MCxNPXZvaWQgMCxrPXZvaWQgMCxMPXZvaWQgMDtkb3tNPVooKSx1dVtPXSgpfXdoaWxlKCJlb2YiIT09TS50eXBlKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgRD9mdW5jdGlvbiB1KEQsZSxyKXt2YXIgdD1EW2VdO2lmKG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdClpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgRj1TdHJpbmcobiksQz11KHQsRixyKTt2b2lkIDA9PT1DP2RlbGV0ZSB0W0ZdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LEYse3ZhbHVlOkMsd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1lbHNlIGZvcih2YXIgQSBpbiB0KXt2YXIgaT11KHQsQSxyKTt2b2lkIDA9PT1pP2RlbGV0ZSB0W0FdOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LEEse3ZhbHVlOmksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1yZXR1cm4gci5jYWxsKEQsZSx0KX0oeyIiOkx9LCIiLEQpOkx9LHN0cmluZ2lmeTpmdW5jdGlvbih1LEQsZSl7dmFyIHIsdCxuLEY9W10sQz0iIixBPSIiO2lmKG51bGw9PUR8fCJvYmplY3QiIT10eXBlb2YgRHx8QXJyYXkuaXNBcnJheShEKXx8KGU9RC5zcGFjZSxuPUQucXVvdGUsRD1ELnJlcGxhY2VyKSwiZnVuY3Rpb24iPT10eXBlb2YgRCl0PUQ7ZWxzZSBpZihBcnJheS5pc0FycmF5KEQpKXtyPVtdO2Zvcih2YXIgaT0wLEU9RDtpPEUubGVuZ3RoO2krPTEpe3ZhciBvPUVbaV0sYT12b2lkIDA7InN0cmluZyI9PXR5cGVvZiBvP2E9bzooIm51bWJlciI9PXR5cGVvZiBvfHxvIGluc3RhbmNlb2YgU3RyaW5nfHxvIGluc3RhbmNlb2YgTnVtYmVyKSYmKGE9U3RyaW5nKG8pKSx2b2lkIDAhPT1hJiZyLmluZGV4T2YoYSk8MCYmci5wdXNoKGEpfX1yZXR1cm4gZSBpbnN0YW5jZW9mIE51bWJlcj9lPU51bWJlcihlKTplIGluc3RhbmNlb2YgU3RyaW5nJiYoZT1TdHJpbmcoZSkpLCJudW1iZXIiPT10eXBlb2YgZT9lPjAmJihlPU1hdGgubWluKDEwLE1hdGguZmxvb3IoZSkpLEE9IiAgICAgICAgICAiLnN1YnN0cigwLGUpKToic3RyaW5nIj09dHlwZW9mIGUmJihBPWUuc3Vic3RyKDAsMTApKSxjKCIiLHsiIjp1fSk7ZnVuY3Rpb24gYyh1LEQpe3ZhciBlPURbdV07c3dpdGNoKG51bGwhPWUmJigiZnVuY3Rpb24iPT10eXBlb2YgZS50b0pTT041P2U9ZS50b0pTT041KHUpOiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvSlNPTiYmKGU9ZS50b0pTT04odSkpKSx0JiYoZT10LmNhbGwoRCx1LGUpKSxlIGluc3RhbmNlb2YgTnVtYmVyP2U9TnVtYmVyKGUpOmUgaW5zdGFuY2VvZiBTdHJpbmc/ZT1TdHJpbmcoZSk6ZSBpbnN0YW5jZW9mIEJvb2xlYW4mJihlPWUudmFsdWVPZigpKSxlKXtjYXNlIG51bGw6cmV0dXJuIm51bGwiO2Nhc2UhMDpyZXR1cm4idHJ1ZSI7Y2FzZSExOnJldHVybiJmYWxzZSJ9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP0IoZSk6Im51bWJlciI9PXR5cGVvZiBlP1N0cmluZyhlKToib2JqZWN0Ij09dHlwZW9mIGU/QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbih1KXtpZihGLmluZGV4T2YodSk+PTApdGhyb3cgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09ONSIpO0YucHVzaCh1KTt2YXIgRD1DO0MrPUE7Zm9yKHZhciBlLHI9W10sdD0wO3Q8dS5sZW5ndGg7dCsrKXt2YXIgbj1jKFN0cmluZyh0KSx1KTtyLnB1c2godm9pZCAwIT09bj9uOiJudWxsIil9aWYoMD09PXIubGVuZ3RoKWU9IltdIjtlbHNlIGlmKCIiPT09QSl7dmFyIGk9ci5qb2luKCIsIik7ZT0iWyIraSsiXSJ9ZWxzZXt2YXIgRT0iLFxuIitDLG89ci5qb2luKEUpO2U9IltcbiIrQytvKyIsXG4iK0QrIl0ifXJldHVybiBGLnBvcCgpLEM9RCxlfShlKTpmdW5jdGlvbih1KXtpZihGLmluZGV4T2YodSk+PTApdGhyb3cgVHlwZUVycm9yKCJDb252ZXJ0aW5nIGNpcmN1bGFyIHN0cnVjdHVyZSB0byBKU09ONSIpO0YucHVzaCh1KTt2YXIgRD1DO0MrPUE7Zm9yKHZhciBlLHQsbj1yfHxPYmplY3Qua2V5cyh1KSxpPVtdLEU9MCxvPW47RTxvLmxlbmd0aDtFKz0xKXt2YXIgYT1vW0VdLEI9YyhhLHUpO2lmKHZvaWQgMCE9PUIpe3ZhciBmPXMoYSkrIjoiOyIiIT09QSYmKGYrPSIgIiksZis9QixpLnB1c2goZil9fWlmKDA9PT1pLmxlbmd0aCllPSJ7fSI7ZWxzZSBpZigiIj09PUEpdD1pLmpvaW4oIiwiKSxlPSJ7Iit0KyJ9IjtlbHNle3ZhciBsPSIsXG4iK0M7dD1pLmpvaW4obCksZT0ie1xuIitDK3QrIixcbiIrRCsifSJ9cmV0dXJuIEYucG9wKCksQz1ELGV9KGUpOnZvaWQgMH1mdW5jdGlvbiBCKHUpe2Zvcih2YXIgRD17IiciOi4xLCciJzouMn0sZT17IiciOiJcXCciLCciJzonXFwiJywiXFwiOiJcXFxcIiwiXGIiOiJcXGIiLCJcZiI6IlxcZiIsIlxuIjoiXFxuIiwiXHIiOiJcXHIiLCJcdCI6IlxcdCIsIlx2IjoiXFx2IiwiXDAiOiJcXDAiLCJcdTIwMjgiOiJcXHUyMDI4IiwiXHUyMDI5IjoiXFx1MjAyOSJ9LHI9IiIsdD0wO3Q8dS5sZW5ndGg7dCsrKXt2YXIgRj11W3RdO3N3aXRjaChGKXtjYXNlIiciOmNhc2UnIic6RFtGXSsrLHIrPUY7Y29udGludWU7Y2FzZSJcMCI6aWYoVS5pc0RpZ2l0KHVbdCsxXSkpe3IrPSJcXHgwMCI7Y29udGludWV9fWlmKGVbRl0pcis9ZVtGXTtlbHNlIGlmKEY8IiAiKXt2YXIgQz1GLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO3IrPSJcXHgiKygiMDAiK0MpLnN1YnN0cmluZyhDLmxlbmd0aCl9ZWxzZSByKz1GfXZhciBBPW58fE9iamVjdC5rZXlzKEQpLnJlZHVjZShmdW5jdGlvbih1LGUpe3JldHVybiBEW3VdPERbZV0/dTplfSk7cmV0dXJuIEErKHI9ci5yZXBsYWNlKG5ldyBSZWdFeHAoQSwiZyIpLGVbQV0pKStBfWZ1bmN0aW9uIHModSl7aWYoMD09PXUubGVuZ3RoKXJldHVybiBCKHUpO3ZhciBEPVN0cmluZy5mcm9tQ29kZVBvaW50KHUuY29kZVBvaW50QXQoMCkpO2lmKCFVLmlzSWRTdGFydENoYXIoRCkpcmV0dXJuIEIodSk7Zm9yKHZhciBlPUQubGVuZ3RoO2U8dS5sZW5ndGg7ZSsrKWlmKCFVLmlzSWRDb250aW51ZUNoYXIoU3RyaW5nLmZyb21Db2RlUG9pbnQodS5jb2RlUG9pbnRBdChlKSkpKXJldHVybiBCKHUpO3JldHVybiB1fX19fSk7`;
|
27151
27154
|
async function download_file$1(filename2, filecontents) {
|
27152
|
-
const blob = new Blob([filecontents], {
|
27155
|
+
const blob = new Blob([filecontents], {
|
27156
|
+
type: "text/plain"
|
27157
|
+
});
|
27153
27158
|
const link2 = document.createElement("a");
|
27154
27159
|
link2.href = URL.createObjectURL(blob);
|
27155
27160
|
link2.download = filename2;
|
@@ -27157,49 +27162,57 @@ self.onmessage = function (e) {
|
|
27157
27162
|
link2.click();
|
27158
27163
|
document.body.removeChild(link2);
|
27159
27164
|
}
|
27165
|
+
function encodePathParts(url) {
|
27166
|
+
if (!url) return url;
|
27167
|
+
try {
|
27168
|
+
const fullUrl = new URL(url);
|
27169
|
+
fullUrl.pathname = fullUrl.pathname.split("/").map((segment) => segment ? encodeURIComponent(decodeURIComponent(segment)) : "").join("/");
|
27170
|
+
return fullUrl.toString();
|
27171
|
+
} catch {
|
27172
|
+
return url.split("/").map((segment) => segment ? encodeURIComponent(decodeURIComponent(segment)) : "").join("/");
|
27173
|
+
}
|
27174
|
+
}
|
27160
27175
|
const loaded_time = Date.now();
|
27161
27176
|
let last_eval_time = 0;
|
27162
27177
|
async function client_events$1() {
|
27163
27178
|
const params = new URLSearchParams();
|
27164
27179
|
params.append("loaded_time", String(loaded_time.valueOf()));
|
27165
27180
|
params.append("last_eval_time", String(last_eval_time.valueOf()));
|
27166
|
-
return (await api$
|
27181
|
+
return (await api$2("GET", `/api/events?${params.toString()}`)).parsed;
|
27167
27182
|
}
|
27168
27183
|
async function eval_logs$1() {
|
27169
|
-
const logs = await api$
|
27184
|
+
const logs = await api$2("GET", `/api/logs`);
|
27170
27185
|
last_eval_time = Date.now();
|
27171
27186
|
return logs.parsed;
|
27172
27187
|
}
|
27173
|
-
async function eval_log$1(file, headerOnly) {
|
27174
|
-
return await api$
|
27175
|
-
"GET",
|
27176
|
-
`/api/logs/${encodeURIComponent(file)}?header-only=${headerOnly}`
|
27177
|
-
);
|
27188
|
+
async function eval_log$1(file, headerOnly, _capabilities) {
|
27189
|
+
return await api$2("GET", `/api/logs/${encodeURIComponent(file)}?header-only=${headerOnly}`);
|
27178
27190
|
}
|
27179
27191
|
async function eval_log_size$1(file) {
|
27180
|
-
return (await api$
|
27192
|
+
return (await api$2("GET", `/api/log-size/${encodeURIComponent(file)}`)).parsed;
|
27181
27193
|
}
|
27182
27194
|
async function eval_log_bytes$1(file, start2, end2) {
|
27183
|
-
return await api_bytes(
|
27184
|
-
"GET",
|
27185
|
-
`/api/log-bytes/${encodeURIComponent(file)}?start=${start2}&end=${end2}`
|
27186
|
-
);
|
27195
|
+
return await api_bytes("GET", `/api/log-bytes/${encodeURIComponent(file)}?start=${start2}&end=${end2}`);
|
27187
27196
|
}
|
27188
27197
|
async function eval_log_headers$1(files) {
|
27189
27198
|
const params = new URLSearchParams();
|
27190
27199
|
for (const file of files) {
|
27191
27200
|
params.append("file", file);
|
27192
27201
|
}
|
27193
|
-
return (await api$
|
27202
|
+
return (await api$2("GET", `/api/log-headers?${params.toString()}`)).parsed;
|
27194
27203
|
}
|
27195
|
-
async function api$
|
27204
|
+
async function api$2(method, path, body) {
|
27196
27205
|
const headers = {
|
27197
27206
|
Accept: "application/json",
|
27198
27207
|
Pragma: "no-cache",
|
27199
27208
|
Expires: "0",
|
27200
27209
|
["Cache-Control"]: "no-cache"
|
27201
27210
|
};
|
27202
|
-
const response = await fetch(`${path}`, {
|
27211
|
+
const response = await fetch(`${path}`, {
|
27212
|
+
method,
|
27213
|
+
headers,
|
27214
|
+
body
|
27215
|
+
});
|
27203
27216
|
if (response.ok) {
|
27204
27217
|
const text2 = await response.text();
|
27205
27218
|
return {
|
@@ -27221,7 +27234,10 @@ self.onmessage = function (e) {
|
|
27221
27234
|
Expires: "0",
|
27222
27235
|
["Cache-Control"]: "no-cache"
|
27223
27236
|
};
|
27224
|
-
const response = await fetch(`${path}`, {
|
27237
|
+
const response = await fetch(`${path}`, {
|
27238
|
+
method,
|
27239
|
+
headers
|
27240
|
+
});
|
27225
27241
|
if (response.ok) {
|
27226
27242
|
const buffer2 = await response.arrayBuffer();
|
27227
27243
|
return new Uint8Array(buffer2);
|
@@ -28327,37 +28343,37 @@ self.onmessage = function (e) {
|
|
28327
28343
|
stringify
|
28328
28344
|
};
|
28329
28345
|
var lib = JSON5;
|
28330
|
-
|
28331
|
-
|
28332
|
-
|
28333
|
-
|
28334
|
-
|
28346
|
+
const kMethodEvalLogs = "eval_logs";
|
28347
|
+
const kMethodEvalLog = "eval_log";
|
28348
|
+
const kMethodEvalLogSize = "eval_log_size";
|
28349
|
+
const kMethodEvalLogBytes = "eval_log_bytes";
|
28350
|
+
const kMethodEvalLogHeaders = "eval_log_headers";
|
28351
|
+
const kJsonRpcVersion = "2.0";
|
28335
28352
|
function webViewJsonRpcClient(vscode2) {
|
28336
|
-
|
28337
|
-
postMessage:
|
28353
|
+
const target = {
|
28354
|
+
postMessage: (data) => {
|
28338
28355
|
vscode2.postMessage(data);
|
28339
28356
|
},
|
28340
|
-
onMessage:
|
28341
|
-
|
28357
|
+
onMessage: (handler) => {
|
28358
|
+
const onMessage = (ev) => {
|
28342
28359
|
handler(ev.data);
|
28343
28360
|
};
|
28344
28361
|
window.addEventListener("message", onMessage);
|
28345
|
-
return
|
28362
|
+
return () => {
|
28346
28363
|
window.removeEventListener("message", onMessage);
|
28347
28364
|
};
|
28348
28365
|
}
|
28349
28366
|
};
|
28350
|
-
|
28351
|
-
return request;
|
28367
|
+
return jsonRpcPostMessageRequestTransport(target).request;
|
28352
28368
|
}
|
28353
28369
|
function jsonRpcPostMessageRequestTransport(target) {
|
28354
|
-
|
28355
|
-
|
28356
|
-
|
28370
|
+
const requests = /* @__PURE__ */ new Map();
|
28371
|
+
const disconnect = target.onMessage((ev) => {
|
28372
|
+
const response = asJsonRpcResponse(ev);
|
28357
28373
|
if (response) {
|
28358
|
-
|
28374
|
+
const request = requests.get(response.id);
|
28359
28375
|
if (request) {
|
28360
|
-
requests
|
28376
|
+
requests.delete(response.id);
|
28361
28377
|
if (response.error) {
|
28362
28378
|
request.reject(response.error);
|
28363
28379
|
} else {
|
@@ -28367,14 +28383,14 @@ self.onmessage = function (e) {
|
|
28367
28383
|
}
|
28368
28384
|
});
|
28369
28385
|
return {
|
28370
|
-
request:
|
28371
|
-
return new Promise(
|
28372
|
-
|
28386
|
+
request: (method, params) => {
|
28387
|
+
return new Promise((resolve, reject) => {
|
28388
|
+
const requestId = Math.floor(Math.random() * 1e6);
|
28373
28389
|
requests.set(requestId, {
|
28374
28390
|
resolve,
|
28375
28391
|
reject
|
28376
28392
|
});
|
28377
|
-
|
28393
|
+
const request = {
|
28378
28394
|
jsonrpc: kJsonRpcVersion,
|
28379
28395
|
id: requestId,
|
28380
28396
|
method,
|
@@ -28386,33 +28402,29 @@ self.onmessage = function (e) {
|
|
28386
28402
|
disconnect
|
28387
28403
|
};
|
28388
28404
|
}
|
28389
|
-
var kJsonRpcVersion = "2.0";
|
28390
28405
|
function isJsonRpcMessage(message) {
|
28391
|
-
|
28392
|
-
return jsMessage.jsonrpc !== void 0 && jsMessage.id !== void 0;
|
28406
|
+
return message.jsonrpc !== void 0 && message.id !== void 0;
|
28393
28407
|
}
|
28394
28408
|
function asJsonRpcMessage(data) {
|
28395
28409
|
if (isJsonRpcMessage(data) && data.jsonrpc === kJsonRpcVersion) {
|
28396
28410
|
return data;
|
28397
|
-
} else {
|
28398
|
-
return null;
|
28399
28411
|
}
|
28412
|
+
return null;
|
28400
28413
|
}
|
28401
28414
|
function asJsonRpcResponse(data) {
|
28402
|
-
|
28415
|
+
const message = asJsonRpcMessage(data);
|
28403
28416
|
if (message) {
|
28404
28417
|
return message;
|
28405
|
-
} else {
|
28406
|
-
return null;
|
28407
28418
|
}
|
28419
|
+
return null;
|
28408
28420
|
}
|
28409
|
-
let
|
28421
|
+
let vscodeApi;
|
28410
28422
|
const getVscodeApi = () => {
|
28411
28423
|
if (window.acquireVsCodeApi) {
|
28412
|
-
if (
|
28413
|
-
|
28424
|
+
if (vscodeApi === void 0) {
|
28425
|
+
vscodeApi = window.acquireVsCodeApi();
|
28414
28426
|
}
|
28415
|
-
return
|
28427
|
+
return vscodeApi;
|
28416
28428
|
} else {
|
28417
28429
|
return void 0;
|
28418
28430
|
}
|
@@ -28437,8 +28449,8 @@ self.onmessage = function (e) {
|
|
28437
28449
|
return void 0;
|
28438
28450
|
}
|
28439
28451
|
}
|
28440
|
-
async function eval_log(
|
28441
|
-
const response = await vscodeClient(kMethodEvalLog, [
|
28452
|
+
async function eval_log(log_file, headerOnly, capabilities) {
|
28453
|
+
const response = await vscodeClient(kMethodEvalLog, [log_file, headerOnly]);
|
28442
28454
|
if (response) {
|
28443
28455
|
let json;
|
28444
28456
|
if (capabilities == null ? void 0 : capabilities.webWorkers) {
|
@@ -28451,14 +28463,14 @@ self.onmessage = function (e) {
|
|
28451
28463
|
raw: response
|
28452
28464
|
};
|
28453
28465
|
} else {
|
28454
|
-
|
28466
|
+
throw new Error(`Unable to load eval log ${log_file}.`);
|
28455
28467
|
}
|
28456
28468
|
}
|
28457
|
-
async function eval_log_size(
|
28458
|
-
return await vscodeClient(kMethodEvalLogSize, [
|
28469
|
+
async function eval_log_size(log_file) {
|
28470
|
+
return await vscodeClient(kMethodEvalLogSize, [log_file]);
|
28459
28471
|
}
|
28460
|
-
async function eval_log_bytes(
|
28461
|
-
return await vscodeClient(kMethodEvalLogBytes, [
|
28472
|
+
async function eval_log_bytes(log_file, start2, end2) {
|
28473
|
+
return await vscodeClient(kMethodEvalLogBytes, [log_file, start2, end2]);
|
28462
28474
|
}
|
28463
28475
|
async function eval_log_headers(files) {
|
28464
28476
|
const response = await vscodeClient(kMethodEvalLogHeaders, [files]);
|
@@ -28471,15 +28483,16 @@ self.onmessage = function (e) {
|
|
28471
28483
|
async function download_file() {
|
28472
28484
|
throw Error("Downloading files is not supported in VS Code");
|
28473
28485
|
}
|
28474
|
-
async function open_log_file(
|
28486
|
+
async function open_log_file(log_file, log_dir) {
|
28487
|
+
var _a2;
|
28475
28488
|
const msg = {
|
28476
28489
|
type: "displayLogFile",
|
28477
|
-
url,
|
28490
|
+
url: log_file,
|
28478
28491
|
log_dir
|
28479
28492
|
};
|
28480
|
-
getVscodeApi().postMessage(msg);
|
28493
|
+
(_a2 = getVscodeApi()) == null ? void 0 : _a2.postMessage(msg);
|
28481
28494
|
}
|
28482
|
-
const
|
28495
|
+
const api$1 = {
|
28483
28496
|
client_events,
|
28484
28497
|
eval_logs,
|
28485
28498
|
eval_log,
|
@@ -29174,7 +29187,7 @@ self.onmessage = function (e) {
|
|
29174
29187
|
return entries;
|
29175
29188
|
};
|
29176
29189
|
function simpleHttpApi(log_dir, log_file) {
|
29177
|
-
const resolved_log_dir = log_dir.replace(" ", "+");
|
29190
|
+
const resolved_log_dir = log_dir == null ? void 0 : log_dir.replace(" ", "+");
|
29178
29191
|
const resolved_log_path = log_file ? log_file.replace(" ", "+") : void 0;
|
29179
29192
|
return simpleHttpAPI({
|
29180
29193
|
log_file: resolved_log_path,
|
@@ -29182,9 +29195,7 @@ self.onmessage = function (e) {
|
|
29182
29195
|
});
|
29183
29196
|
}
|
29184
29197
|
function simpleHttpAPI(logInfo) {
|
29185
|
-
const log_file = logInfo.log_file;
|
29186
29198
|
const log_dir = logInfo.log_dir;
|
29187
|
-
const cache = log_file_cache(log_file);
|
29188
29199
|
async function open_log_file2() {
|
29189
29200
|
}
|
29190
29201
|
return {
|
@@ -29192,46 +29203,32 @@ self.onmessage = function (e) {
|
|
29192
29203
|
return Promise.resolve([]);
|
29193
29204
|
},
|
29194
29205
|
eval_logs: async () => {
|
29195
|
-
|
29196
|
-
|
29197
|
-
|
29198
|
-
|
29199
|
-
|
29200
|
-
|
29201
|
-
|
29202
|
-
|
29203
|
-
|
29204
|
-
|
29205
|
-
|
29206
|
-
|
29207
|
-
|
29208
|
-
|
29209
|
-
|
29210
|
-
|
29211
|
-
if (!evalLog) {
|
29212
|
-
const response = await fetchLogFile(log_file);
|
29213
|
-
cache.set(response.parsed);
|
29214
|
-
evalLog = response.parsed;
|
29215
|
-
}
|
29216
|
-
const result = {
|
29217
|
-
name: log_file,
|
29218
|
-
task: evalLog.eval.task,
|
29219
|
-
task_id: evalLog.eval.task_id
|
29220
|
-
};
|
29221
|
-
return {
|
29222
|
-
files: [result],
|
29223
|
-
log_dir
|
29224
|
-
};
|
29225
|
-
} else {
|
29226
|
-
throw new Error(
|
29227
|
-
`Failed to load a manifest files using the directory: ${log_dir}. Please be sure you have deployed a manifest file (logs.json).`
|
29228
|
-
);
|
29206
|
+
if (log_dir) {
|
29207
|
+
const headers = await fetchLogHeaders(log_dir);
|
29208
|
+
if (headers) {
|
29209
|
+
const logRecord = headers.parsed;
|
29210
|
+
const logs = Object.keys(logRecord).map((key2) => {
|
29211
|
+
return {
|
29212
|
+
name: joinURI(log_dir, key2),
|
29213
|
+
task: logRecord[key2].eval.task,
|
29214
|
+
task_id: logRecord[key2].eval.task_id
|
29215
|
+
};
|
29216
|
+
});
|
29217
|
+
return Promise.resolve({
|
29218
|
+
files: logs,
|
29219
|
+
log_dir
|
29220
|
+
});
|
29221
|
+
}
|
29229
29222
|
}
|
29223
|
+
return void 0;
|
29230
29224
|
},
|
29231
|
-
eval_log: async (
|
29232
|
-
const response = await fetchLogFile(
|
29233
|
-
|
29234
|
-
|
29225
|
+
eval_log: async (log_file2, _headerOnly, _capabilities) => {
|
29226
|
+
const response = await fetchLogFile(log_file2);
|
29227
|
+
if (response) {
|
29228
|
+
return response;
|
29229
|
+
} else {
|
29230
|
+
throw new Error(`"Unable to load eval log ${log_file2}`);
|
29231
|
+
}
|
29235
29232
|
},
|
29236
29233
|
eval_log_size: async (log_file2) => {
|
29237
29234
|
return await fetchSize(log_file2);
|
@@ -29240,32 +29237,26 @@ self.onmessage = function (e) {
|
|
29240
29237
|
return await fetchRange(log_file2, start2, end2);
|
29241
29238
|
},
|
29242
29239
|
eval_log_headers: async (files) => {
|
29243
|
-
|
29244
|
-
|
29245
|
-
|
29246
|
-
|
29247
|
-
|
29248
|
-
|
29249
|
-
|
29240
|
+
if (files.length === 0) {
|
29241
|
+
return [];
|
29242
|
+
}
|
29243
|
+
if (log_dir) {
|
29244
|
+
const headers = await fetchLogHeaders(log_dir);
|
29245
|
+
if (headers) {
|
29246
|
+
const keys = Object.keys(headers.parsed);
|
29247
|
+
const result = [];
|
29248
|
+
files.forEach((file) => {
|
29249
|
+
const fileKey = keys.find((key2) => {
|
29250
|
+
return file.endsWith(key2);
|
29251
|
+
});
|
29252
|
+
if (fileKey) {
|
29253
|
+
result.push(headers.parsed[fileKey]);
|
29254
|
+
}
|
29250
29255
|
});
|
29251
|
-
|
29252
|
-
|
29253
|
-
}
|
29254
|
-
});
|
29255
|
-
return result;
|
29256
|
-
} else if (log_file) {
|
29257
|
-
let evalLog = cache.get();
|
29258
|
-
if (!evalLog) {
|
29259
|
-
const response = await fetchLogFile(log_file);
|
29260
|
-
cache.set(response.parsed);
|
29261
|
-
evalLog = response.parsed;
|
29262
|
-
}
|
29263
|
-
return [evalLog];
|
29264
|
-
} else {
|
29265
|
-
throw new Error(
|
29266
|
-
`Failed to load a manifest files using the directory: ${log_dir}. Please be sure you have deployed a manifest file (logs.json).`
|
29267
|
-
);
|
29256
|
+
return result;
|
29257
|
+
}
|
29268
29258
|
}
|
29259
|
+
throw new Error(`Failed to load a manifest files using the directory: ${log_dir}. Please be sure you have deployed a manifest file (logs.json).`);
|
29269
29260
|
},
|
29270
29261
|
download_file: download_file$1,
|
29271
29262
|
open_log_file: open_log_file2
|
@@ -29273,13 +29264,12 @@ self.onmessage = function (e) {
|
|
29273
29264
|
}
|
29274
29265
|
async function fetchFile(url, parse2, handleError2) {
|
29275
29266
|
const safe_url = encodePathParts(url);
|
29276
|
-
const response = await fetch(`${safe_url}`, {
|
29267
|
+
const response = await fetch(`${safe_url}`, {
|
29268
|
+
method: "GET"
|
29269
|
+
});
|
29277
29270
|
if (response.ok) {
|
29278
29271
|
const text2 = await response.text();
|
29279
|
-
return
|
29280
|
-
parsed: await parse2(text2),
|
29281
|
-
raw: text2
|
29282
|
-
};
|
29272
|
+
return await parse2(text2);
|
29283
29273
|
} else if (response.status !== 200) {
|
29284
29274
|
if (handleError2 && handleError2(response)) {
|
29285
29275
|
return void 0;
|
@@ -29293,76 +29283,52 @@ self.onmessage = function (e) {
|
|
29293
29283
|
}
|
29294
29284
|
const fetchLogFile = async (file) => {
|
29295
29285
|
return fetchFile(file, async (text2) => {
|
29286
|
+
var _a2;
|
29296
29287
|
const log = await asyncJsonParse(text2);
|
29297
29288
|
if (log.version === 1) {
|
29298
29289
|
if (log.results) {
|
29290
|
+
const untypedLog = log;
|
29299
29291
|
log.results.scores = [];
|
29300
|
-
|
29301
|
-
log.results.scores.push(
|
29302
|
-
delete
|
29303
|
-
log.results.scores[0].metrics =
|
29304
|
-
delete
|
29292
|
+
untypedLog.results.scorer.scorer = untypedLog.results.scorer.name;
|
29293
|
+
log.results.scores.push(untypedLog.results.scorer);
|
29294
|
+
delete untypedLog.results.scorer;
|
29295
|
+
log.results.scores[0].metrics = untypedLog.results.metrics;
|
29296
|
+
delete untypedLog.results.metrics;
|
29305
29297
|
const scorerName = log.results.scores[0].name;
|
29306
|
-
log.samples.forEach((sample) => {
|
29307
|
-
|
29308
|
-
|
29298
|
+
(_a2 = log.samples) == null ? void 0 : _a2.forEach((sample) => {
|
29299
|
+
const untypedSample = sample;
|
29300
|
+
sample.scores = {
|
29301
|
+
[scorerName]: untypedSample.score
|
29302
|
+
};
|
29303
|
+
delete untypedSample.score;
|
29309
29304
|
});
|
29310
29305
|
}
|
29311
29306
|
}
|
29312
|
-
return
|
29307
|
+
return {
|
29308
|
+
raw: text2,
|
29309
|
+
parsed: log
|
29310
|
+
};
|
29313
29311
|
});
|
29314
29312
|
};
|
29315
29313
|
const fetchLogHeaders = async (log_dir) => {
|
29316
|
-
const logs = await fetchFile(
|
29317
|
-
|
29318
|
-
|
29319
|
-
|
29320
|
-
|
29321
|
-
|
29322
|
-
|
29323
|
-
|
29324
|
-
|
29314
|
+
const logs = await fetchFile(log_dir + "/logs.json", async (text2) => {
|
29315
|
+
const parsed = await asyncJsonParse(text2);
|
29316
|
+
return {
|
29317
|
+
raw: text2,
|
29318
|
+
parsed
|
29319
|
+
};
|
29320
|
+
}, (response) => {
|
29321
|
+
if (response.status === 404) {
|
29322
|
+
return true;
|
29323
|
+
} else {
|
29324
|
+
return false;
|
29325
29325
|
}
|
29326
|
-
);
|
29326
|
+
});
|
29327
29327
|
return logs;
|
29328
29328
|
};
|
29329
29329
|
function joinURI(...segments) {
|
29330
29330
|
return segments.map((segment) => segment.replace(/(^\/+|\/+$)/g, "")).join("/");
|
29331
29331
|
}
|
29332
|
-
const log_file_cache = (log_file) => {
|
29333
|
-
if (!log_file) {
|
29334
|
-
return {
|
29335
|
-
set: () => {
|
29336
|
-
},
|
29337
|
-
get: () => {
|
29338
|
-
return void 0;
|
29339
|
-
}
|
29340
|
-
};
|
29341
|
-
}
|
29342
|
-
let cache_file;
|
29343
|
-
return {
|
29344
|
-
set: (log_file2) => {
|
29345
|
-
cache_file = log_file2;
|
29346
|
-
},
|
29347
|
-
get: () => {
|
29348
|
-
return cache_file;
|
29349
|
-
}
|
29350
|
-
};
|
29351
|
-
};
|
29352
|
-
function encodePathParts(url) {
|
29353
|
-
if (!url) return url;
|
29354
|
-
try {
|
29355
|
-
const fullUrl = new URL(url);
|
29356
|
-
fullUrl.pathname = fullUrl.pathname.split("/").map(
|
29357
|
-
(segment) => segment ? encodeURIComponent(decodeURIComponent(segment)) : ""
|
29358
|
-
).join("/");
|
29359
|
-
return fullUrl.toString();
|
29360
|
-
} catch {
|
29361
|
-
return url.split("/").map(
|
29362
|
-
(segment) => segment ? encodeURIComponent(decodeURIComponent(segment)) : ""
|
29363
|
-
).join("/");
|
29364
|
-
}
|
29365
|
-
}
|
29366
29332
|
class AsyncQueue {
|
29367
29333
|
/**
|
29368
29334
|
* Creates an instance of AsyncQueue.
|
@@ -29413,11 +29379,7 @@ self.onmessage = function (e) {
|
|
29413
29379
|
const MAX_BYTES = 50 * 1024 * 1024;
|
29414
29380
|
const openRemoteLogFile = async (api2, url, concurrency) => {
|
29415
29381
|
const queue = new AsyncQueue(concurrency);
|
29416
|
-
const remoteZipFile = await openRemoteZipFile(
|
29417
|
-
`${encodeURIComponent(url)}`,
|
29418
|
-
api2.eval_log_size,
|
29419
|
-
api2.eval_log_bytes
|
29420
|
-
);
|
29382
|
+
const remoteZipFile = await openRemoteZipFile(url, api2.eval_log_size, api2.eval_log_bytes);
|
29421
29383
|
const readJSONFile = async (file, maxBytes) => {
|
29422
29384
|
try {
|
29423
29385
|
const data = await remoteZipFile.readFile(file, maxBytes);
|
@@ -29427,17 +29389,15 @@ self.onmessage = function (e) {
|
|
29427
29389
|
} catch (error2) {
|
29428
29390
|
if (error2 instanceof FileSizeLimitError) {
|
29429
29391
|
throw error2;
|
29392
|
+
} else if (error2 instanceof Error) {
|
29393
|
+
throw new Error(`Failed to read or parse file ${file}: ${error2.message}`);
|
29430
29394
|
} else {
|
29431
|
-
throw new Error(
|
29432
|
-
`Failed to read or parse file ${file}: ${error2.message}`
|
29433
|
-
);
|
29395
|
+
throw new Error(`Failed to read or parse file ${file} - an unknown error occurred`);
|
29434
29396
|
}
|
29435
29397
|
}
|
29436
29398
|
};
|
29437
29399
|
const listSamples = async () => {
|
29438
|
-
return Array.from(remoteZipFile.centralDirectory.keys()).filter(
|
29439
|
-
(filename2) => filename2.startsWith("samples/") && filename2.endsWith(".json")
|
29440
|
-
).map((filename2) => {
|
29400
|
+
return Array.from(remoteZipFile.centralDirectory.keys()).filter((filename2) => filename2.startsWith("samples/") && filename2.endsWith(".json")).map((filename2) => {
|
29441
29401
|
const [sampleId, epochStr] = filename2.split("/")[1].split("_epoch_");
|
29442
29402
|
return {
|
29443
29403
|
sampleId,
|
@@ -29448,17 +29408,17 @@ self.onmessage = function (e) {
|
|
29448
29408
|
const readSample = async (sampleId, epoch) => {
|
29449
29409
|
const sampleFile = `samples/${sampleId}_epoch_${epoch}.json`;
|
29450
29410
|
if (remoteZipFile.centralDirectory.has(sampleFile)) {
|
29451
|
-
return readJSONFile(sampleFile, MAX_BYTES);
|
29411
|
+
return await readJSONFile(sampleFile, MAX_BYTES);
|
29452
29412
|
} else {
|
29453
|
-
console.log({
|
29454
|
-
|
29455
|
-
|
29456
|
-
);
|
29413
|
+
console.log({
|
29414
|
+
dir: remoteZipFile.centralDirectory
|
29415
|
+
});
|
29416
|
+
throw new Error(`Unable to read sample file ${sampleFile} - it is not present in the manifest.`);
|
29457
29417
|
}
|
29458
29418
|
};
|
29459
29419
|
const readHeader = async () => {
|
29460
29420
|
if (remoteZipFile.centralDirectory.has("header.json")) {
|
29461
|
-
return readJSONFile("header.json");
|
29421
|
+
return await readJSONFile("header.json");
|
29462
29422
|
} else {
|
29463
29423
|
const evalSpec = await readJSONFile("_journal/start.json");
|
29464
29424
|
return {
|
@@ -29469,30 +29429,19 @@ self.onmessage = function (e) {
|
|
29469
29429
|
}
|
29470
29430
|
};
|
29471
29431
|
const readFallbackSummaries = async () => {
|
29472
|
-
const summaryFiles = Array.from(
|
29473
|
-
remoteZipFile.centralDirectory.keys()
|
29474
|
-
).filter(
|
29475
|
-
(filename2) => filename2.startsWith("_journal/summaries/") && filename2.endsWith(".json")
|
29476
|
-
);
|
29432
|
+
const summaryFiles = Array.from(remoteZipFile.centralDirectory.keys()).filter((filename2) => filename2.startsWith("_journal/summaries/") && filename2.endsWith(".json"));
|
29477
29433
|
const summaries = [];
|
29478
29434
|
const errors2 = [];
|
29479
|
-
await Promise.all(
|
29480
|
-
|
29481
|
-
|
29482
|
-
|
29483
|
-
|
29484
|
-
|
29485
|
-
|
29486
|
-
|
29487
|
-
}
|
29488
|
-
})
|
29489
|
-
)
|
29490
|
-
);
|
29435
|
+
await Promise.all(summaryFiles.map((filename2) => queue.enqueue(async () => {
|
29436
|
+
try {
|
29437
|
+
const partialSummary = await readJSONFile(filename2);
|
29438
|
+
summaries.push(...partialSummary);
|
29439
|
+
} catch (error2) {
|
29440
|
+
errors2.push(error2);
|
29441
|
+
}
|
29442
|
+
})));
|
29491
29443
|
if (errors2.length > 0) {
|
29492
|
-
console.error(
|
29493
|
-
`Encountered ${errors2.length} errors while reading summary files:`,
|
29494
|
-
errors2
|
29495
|
-
);
|
29444
|
+
console.error(`Encountered ${errors2.length} errors while reading summary files:`, errors2);
|
29496
29445
|
}
|
29497
29446
|
return summaries;
|
29498
29447
|
};
|
@@ -29506,10 +29455,7 @@ self.onmessage = function (e) {
|
|
29506
29455
|
return {
|
29507
29456
|
readHeader,
|
29508
29457
|
readLogSummary: async () => {
|
29509
|
-
const [header, sampleSummaries] = await Promise.all([
|
29510
|
-
readHeader(),
|
29511
|
-
readSampleSummaries()
|
29512
|
-
]);
|
29458
|
+
const [header, sampleSummaries] = await Promise.all([readHeader(), readSampleSummaries()]);
|
29513
29459
|
const result = {
|
29514
29460
|
status: header.status,
|
29515
29461
|
eval: header.eval,
|
@@ -29524,17 +29470,12 @@ self.onmessage = function (e) {
|
|
29524
29470
|
readSample,
|
29525
29471
|
/**
|
29526
29472
|
* Reads the complete log file.
|
29527
|
-
* @returns {Promise<import("../types/log").EvalLog>} The complete log data.
|
29528
29473
|
*/
|
29529
29474
|
readCompleteLog: async () => {
|
29530
|
-
const [evalLog, samples] = await Promise.all([
|
29531
|
-
|
29532
|
-
|
29533
|
-
|
29534
|
-
sampleIds.map(({ sampleId, epoch }) => readSample(sampleId, epoch))
|
29535
|
-
)
|
29536
|
-
)
|
29537
|
-
]);
|
29475
|
+
const [evalLog, samples] = await Promise.all([readHeader(), listSamples().then((sampleIds) => Promise.all(sampleIds.map(({
|
29476
|
+
sampleId,
|
29477
|
+
epoch
|
29478
|
+
}) => readSample(sampleId, epoch).then((sample) => sample))))]);
|
29538
29479
|
return {
|
29539
29480
|
status: evalLog.status,
|
29540
29481
|
eval: evalLog.eval,
|
@@ -29551,46 +29492,38 @@ self.onmessage = function (e) {
|
|
29551
29492
|
return file.endsWith(".eval");
|
29552
29493
|
};
|
29553
29494
|
class SampleSizeLimitedExceededError extends Error {
|
29554
|
-
/**
|
29555
|
-
* Creates a new SizeLimitedExceededError.
|
29556
|
-
*
|
29557
|
-
* @param {string | number} id - The name of the file that caused the error.
|
29558
|
-
* @param {number} epoch - The name of the file that caused the error.
|
29559
|
-
* @param {number} maxBytes - The maximum allowed size for the file, in bytes.
|
29560
|
-
*/
|
29561
29495
|
constructor(id, epoch, maxBytes) {
|
29562
|
-
super(
|
29563
|
-
`Sample ${id} in epoch ${epoch} exceeds the maximum supported size (${maxBytes / 1024 / 1024}MB) and cannot be loaded.`
|
29564
|
-
);
|
29496
|
+
super(`Sample ${id} in epoch ${epoch} exceeds the maximum supported size (${maxBytes / 1024 / 1024}MB) and cannot be loaded.`);
|
29565
29497
|
this.name = "SampleSizeLimitedExceededError";
|
29566
29498
|
this.id = id;
|
29567
29499
|
this.epoch = epoch;
|
29568
29500
|
this.maxBytes = maxBytes;
|
29569
29501
|
this.displayStack = false;
|
29502
|
+
Object.setPrototypeOf(this, SampleSizeLimitedExceededError.prototype);
|
29570
29503
|
}
|
29571
29504
|
}
|
29572
|
-
const clientApi = (api2) => {
|
29505
|
+
const clientApi = (api2, log_file) => {
|
29573
29506
|
let current_log = void 0;
|
29574
29507
|
let current_path = void 0;
|
29575
29508
|
const loadedEvalFile = {
|
29576
29509
|
file: void 0,
|
29577
29510
|
remoteLog: void 0
|
29578
29511
|
};
|
29579
|
-
const remoteEvalFile = async (
|
29580
|
-
if (!cached || loadedEvalFile.file !==
|
29581
|
-
loadedEvalFile.file =
|
29582
|
-
loadedEvalFile.remoteLog = await openRemoteLogFile(api2,
|
29512
|
+
const remoteEvalFile = async (log_file2, cached = false) => {
|
29513
|
+
if (!cached || loadedEvalFile.file !== log_file2) {
|
29514
|
+
loadedEvalFile.file = log_file2;
|
29515
|
+
loadedEvalFile.remoteLog = await openRemoteLogFile(api2, encodePathParts(log_file2), 5);
|
29583
29516
|
}
|
29584
29517
|
return loadedEvalFile.remoteLog;
|
29585
29518
|
};
|
29586
|
-
const get_log = async (
|
29587
|
-
if (!cached ||
|
29519
|
+
const get_log = async (log_file2, cached = false) => {
|
29520
|
+
if (!cached || log_file2 !== current_path || !current_log) {
|
29588
29521
|
if (pending_log_promise) {
|
29589
29522
|
return pending_log_promise;
|
29590
29523
|
}
|
29591
|
-
pending_log_promise = api2.eval_log(
|
29524
|
+
pending_log_promise = api2.eval_log(log_file2, 100).then((log) => {
|
29592
29525
|
current_log = log;
|
29593
|
-
current_path =
|
29526
|
+
current_path = log_file2;
|
29594
29527
|
pending_log_promise = null;
|
29595
29528
|
return log;
|
29596
29529
|
}).catch((err2) => {
|
@@ -29602,13 +29535,17 @@ self.onmessage = function (e) {
|
|
29602
29535
|
return current_log;
|
29603
29536
|
};
|
29604
29537
|
let pending_log_promise = null;
|
29605
|
-
const get_log_summary = async (
|
29538
|
+
const get_log_summary = async (log_file2) => {
|
29606
29539
|
var _a2;
|
29607
|
-
if (isEvalFile(
|
29608
|
-
const remoteLogFile = await remoteEvalFile(
|
29609
|
-
|
29540
|
+
if (isEvalFile(log_file2)) {
|
29541
|
+
const remoteLogFile = await remoteEvalFile(log_file2);
|
29542
|
+
if (remoteLogFile) {
|
29543
|
+
return await remoteLogFile.readLogSummary();
|
29544
|
+
} else {
|
29545
|
+
throw new Error("Unable to read remote eval file");
|
29546
|
+
}
|
29610
29547
|
} else {
|
29611
|
-
const logContents = await get_log(
|
29548
|
+
const logContents = await get_log(log_file2);
|
29612
29549
|
const sampleSummaries = logContents.parsed.samples ? (_a2 = logContents.parsed.samples) == null ? void 0 : _a2.map((sample) => {
|
29613
29550
|
var _a3;
|
29614
29551
|
return {
|
@@ -29634,12 +29571,16 @@ self.onmessage = function (e) {
|
|
29634
29571
|
};
|
29635
29572
|
}
|
29636
29573
|
};
|
29637
|
-
const get_log_sample = async (
|
29638
|
-
if (isEvalFile(
|
29639
|
-
const remoteLogFile = await remoteEvalFile(
|
29574
|
+
const get_log_sample = async (log_file2, id, epoch) => {
|
29575
|
+
if (isEvalFile(log_file2)) {
|
29576
|
+
const remoteLogFile = await remoteEvalFile(log_file2, true);
|
29640
29577
|
try {
|
29641
|
-
|
29642
|
-
|
29578
|
+
if (remoteLogFile) {
|
29579
|
+
const sample = await remoteLogFile.readSample(String(id), epoch);
|
29580
|
+
return sample;
|
29581
|
+
} else {
|
29582
|
+
throw new Error(`Unable to read remove eval file ${log_file2}`);
|
29583
|
+
}
|
29643
29584
|
} catch (error2) {
|
29644
29585
|
if (error2 instanceof FileSizeLimitError) {
|
29645
29586
|
throw new SampleSizeLimitedExceededError(id, epoch, error2.maxBytes);
|
@@ -29648,7 +29589,7 @@ self.onmessage = function (e) {
|
|
29648
29589
|
}
|
29649
29590
|
}
|
29650
29591
|
} else {
|
29651
|
-
const logContents = await get_log(
|
29592
|
+
const logContents = await get_log(log_file2, true);
|
29652
29593
|
if (logContents.parsed.samples && logContents.parsed.samples.length > 0) {
|
29653
29594
|
return logContents.parsed.samples.find((sample) => {
|
29654
29595
|
return sample.id === id && sample.epoch === epoch;
|
@@ -29657,8 +29598,8 @@ self.onmessage = function (e) {
|
|
29657
29598
|
}
|
29658
29599
|
return void 0;
|
29659
29600
|
};
|
29660
|
-
const get_eval_log_header = async (
|
29661
|
-
const remoteLogFile = await openRemoteLogFile(api2,
|
29601
|
+
const get_eval_log_header = async (log_file2) => {
|
29602
|
+
const remoteLogFile = await openRemoteLogFile(api2, encodePathParts(log_file2), 5);
|
29662
29603
|
return remoteLogFile.readHeader();
|
29663
29604
|
};
|
29664
29605
|
const get_log_headers = async (log_files) => {
|
@@ -29673,41 +29614,54 @@ self.onmessage = function (e) {
|
|
29673
29614
|
}
|
29674
29615
|
index++;
|
29675
29616
|
}
|
29676
|
-
const evalLogHeadersPromises = Object.keys(eval_files).map(
|
29677
|
-
|
29678
|
-
|
29679
|
-
|
29680
|
-
|
29681
|
-
|
29682
|
-
|
29683
|
-
|
29684
|
-
|
29685
|
-
|
29686
|
-
|
29687
|
-
header
|
29688
|
-
}))
|
29689
|
-
);
|
29690
|
-
const headers = await Promise.all([
|
29691
|
-
...evalLogHeadersPromises,
|
29692
|
-
jsonLogHeadersPromise
|
29693
|
-
]);
|
29617
|
+
const evalLogHeadersPromises = Object.keys(eval_files).map((file) => get_eval_log_header(file).then((header) => ({
|
29618
|
+
index: eval_files[file],
|
29619
|
+
// Store original index
|
29620
|
+
header
|
29621
|
+
})));
|
29622
|
+
const jsonLogHeadersPromise = api2.eval_log_headers(Object.keys(json_files)).then((headers2) => headers2.map((header, i2) => ({
|
29623
|
+
index: json_files[Object.keys(json_files)[i2]],
|
29624
|
+
// Store original index
|
29625
|
+
header
|
29626
|
+
})));
|
29627
|
+
const headers = await Promise.all([...evalLogHeadersPromises, jsonLogHeadersPromise]);
|
29694
29628
|
const orderedHeaders = headers.flat().sort((a2, b) => a2.index - b.index);
|
29695
|
-
return orderedHeaders.map(({
|
29629
|
+
return orderedHeaders.map(({
|
29630
|
+
header
|
29631
|
+
}) => header);
|
29632
|
+
};
|
29633
|
+
const get_log_paths = async () => {
|
29634
|
+
const logFiles = await api2.eval_logs();
|
29635
|
+
if (logFiles) {
|
29636
|
+
return logFiles;
|
29637
|
+
} else if (log_file) {
|
29638
|
+
const summary = await get_log_summary(log_file);
|
29639
|
+
if (summary) {
|
29640
|
+
return {
|
29641
|
+
files: [{
|
29642
|
+
name: log_file,
|
29643
|
+
task: summary.eval.task,
|
29644
|
+
task_id: summary.eval.task_id
|
29645
|
+
}]
|
29646
|
+
};
|
29647
|
+
}
|
29648
|
+
}
|
29649
|
+
throw new Error("Unable to determine log paths.");
|
29696
29650
|
};
|
29697
29651
|
return {
|
29698
29652
|
client_events: () => {
|
29699
29653
|
return api2.client_events();
|
29700
29654
|
},
|
29701
29655
|
get_log_paths: () => {
|
29702
|
-
return
|
29656
|
+
return get_log_paths();
|
29703
29657
|
},
|
29704
29658
|
get_log_headers: (log_files) => {
|
29705
29659
|
return get_log_headers(log_files);
|
29706
29660
|
},
|
29707
29661
|
get_log_summary,
|
29708
29662
|
get_log_sample,
|
29709
|
-
open_log_file: (
|
29710
|
-
return api2.open_log_file(
|
29663
|
+
open_log_file: (log_file2, log_dir) => {
|
29664
|
+
return api2.open_log_file(log_file2, log_dir);
|
29711
29665
|
},
|
29712
29666
|
download_file: (download_file2, file_contents) => {
|
29713
29667
|
return api2.download_file(download_file2, file_contents);
|
@@ -29716,23 +29670,28 @@ self.onmessage = function (e) {
|
|
29716
29670
|
};
|
29717
29671
|
const resolveApi = () => {
|
29718
29672
|
if (getVscodeApi()) {
|
29719
|
-
return clientApi(
|
29673
|
+
return clientApi(api$1);
|
29720
29674
|
} else {
|
29721
29675
|
const scriptEl = document.getElementById("log_dir_context");
|
29722
29676
|
if (scriptEl) {
|
29723
|
-
const
|
29724
|
-
if (
|
29725
|
-
const
|
29726
|
-
|
29727
|
-
|
29677
|
+
const context = scriptEl.textContent;
|
29678
|
+
if (context !== null) {
|
29679
|
+
const data = JSON.parse(context);
|
29680
|
+
if (data.log_dir || data.log_file) {
|
29681
|
+
const log_dir2 = data.log_dir || dirname(data.log_file);
|
29682
|
+
const api2 = simpleHttpApi(log_dir2, data.log_file);
|
29683
|
+
return clientApi(api2, data.log_file);
|
29684
|
+
}
|
29728
29685
|
}
|
29729
29686
|
}
|
29730
29687
|
const urlParams = new URLSearchParams(window.location.search);
|
29731
29688
|
const log_file = urlParams.get("log_file");
|
29732
29689
|
const log_dir = urlParams.get("log_dir");
|
29733
|
-
if (log_file || log_dir) {
|
29734
|
-
const
|
29735
|
-
|
29690
|
+
if (log_file !== null || log_dir !== null) {
|
29691
|
+
const resolved_log_dir = log_dir === null ? void 0 : log_dir;
|
29692
|
+
const resolved_log_file = log_file === null ? void 0 : log_file;
|
29693
|
+
const api2 = simpleHttpApi(resolved_log_dir, resolved_log_file);
|
29694
|
+
return clientApi(api2, resolved_log_file);
|
29736
29695
|
}
|
29737
29696
|
return clientApi(browserApi);
|
29738
29697
|
}
|
@@ -54991,7 +54950,7 @@ Supported expressions:
|
|
54991
54950
|
}, [logs, setStatus, setLogHeaders, setHeadersLoading]);
|
54992
54951
|
const resetWorkspace = q$1(
|
54993
54952
|
/**
|
54994
|
-
* @param {import("./api/Types.
|
54953
|
+
* @param {import("./api/Types.ts").EvalSummary} log
|
54995
54954
|
*/
|
54996
54955
|
(log) => {
|
54997
54956
|
const hasSamples = !!log.sampleSummaries && log.sampleSummaries.length > 0;
|