diff --git a/.logs/start/api-server.log b/.logs/start/api-server.log new file mode 100644 index 0000000..3bb0ba0 --- /dev/null +++ b/.logs/start/api-server.log @@ -0,0 +1,35 @@ +INFO: Started server process [69167] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:4242 (Press CTRL+C to quit) +================================================================================ +EHTOOL ROUTER MODULE LOADED - VERSION: DEBUG v2 +================================================================================ +INFO: 127.0.0.1:60334 - "GET /health HTTP/1.1" 200 OK +INFO: 127.0.0.1:60379 - "GET /files?parent=root HTTP/1.1" 200 OK +INFO: 127.0.0.1:60383 - "GET /chat/conversations HTTP/1.1" 200 OK +INFO: 127.0.0.1:60383 - "GET /chat/conversations HTTP/1.1" 200 OK +INFO: 127.0.0.1:60383 - "OPTIONS /chat/conversations/1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:60383 - "DELETE /chat/conversations/1 HTTP/1.1" 200 OK +INFO: 127.0.0.1:60389 - "OPTIONS /chat/query HTTP/1.1" 200 OK +[SEARCH] Loaded 7 docs for keyword search: ['MaskProofreading.md', 'FileManager.md', 'ModelInference.md', 'GettingStarted.md', 'ModelTraining.md', 'Visualization.md', 'Monitoring.md'] +[TOOL] search_documentation(query='upload training data server PyTC Client upload training data to server') [call 1] +[TOOL] RAG → 2 chunks: ['GettingStarted.md', 'ModelTraining.md'] +[TOOL] search_documentation(query='File Manager upload training data PyTC Client') [call 2] +[TOOL] RAG → 2 chunks: ['FileManager.md', 'ModelTraining.md'] +INFO: 127.0.0.1:60389 - "POST /chat/query HTTP/1.1" 200 OK +INFO: 127.0.0.1:60389 - "GET /chat/conversations HTTP/1.1" 200 OK +[TOOL] search_documentation(query='training workflow what do I need to provide PyTC Client training new model') [call 1] +[TOOL] RAG → 2 chunks: ['GettingStarted.md', 'ModelInference.md'] +[TOOL] search_documentation(query='Model Training page what inputs are required PyTC Client') [call 2] +[TOOL] RAG → 2 chunks: ['GettingStarted.md', 'ModelTraining.md'] +INFO: 127.0.0.1:60389 - "POST /chat/query HTTP/1.1" 200 OK +INFO: 127.0.0.1:60389 - "GET /chat/conversations HTTP/1.1" 200 OK +[TOOL] search_documentation(query='monitor training progress real-time PyTC Client UI') [call 1] +[TOOL] RAG → 2 chunks: ['ModelTraining.md', 'GettingStarted.md'] +INFO: 127.0.0.1:60502 - "POST /chat/query HTTP/1.1" 200 OK +INFO: 127.0.0.1:60502 - "GET /chat/conversations HTTP/1.1" 200 OK +INFO: Shutting down +INFO: Waiting for application shutdown. +INFO: Application shutdown complete. +INFO: Finished server process [69167] diff --git a/.logs/start/data-server.log b/.logs/start/data-server.log new file mode 100644 index 0000000..00fbc1c --- /dev/null +++ b/.logs/start/data-server.log @@ -0,0 +1 @@ +127.0.0.1 - - [03/Apr/2026 15:13:18] "GET / HTTP/1.1" 200 - diff --git a/.logs/start/pytc-server.log b/.logs/start/pytc-server.log new file mode 100644 index 0000000..2236bdc --- /dev/null +++ b/.logs/start/pytc-server.log @@ -0,0 +1,21 @@ +INFO: Started server process [69189] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:4243 (Press CTRL+C to quit) + +================================================================================ +SERVER_PYTC STARTING UP +Python executable: /Users/tizhang/Desktop/pytc-client/.venv/bin/python3 +Working directory: /Users/tizhang/Desktop/pytc-client +================================================================================ + + +================================================================================ +SERVER_PYTC: Starting Uvicorn server on port 4243... +================================================================================ + +INFO: 127.0.0.1:60339 - "GET /hello HTTP/1.1" 200 OK +INFO: Shutting down +INFO: Waiting for application shutdown. +INFO: Application shutdown complete. +INFO: Finished server process [69189] diff --git a/.logs/start/react-build.log b/.logs/start/react-build.log new file mode 100644 index 0000000..9b97bda --- /dev/null +++ b/.logs/start/react-build.log @@ -0,0 +1,67 @@ +npm warn Unknown user config "always-auth". This will stop working in the next major version of npm. +npm warn Unknown user config "always-auth" (//firelayers.jfrog.io/artifactory/api/npm/itc-npm-virtual/:always-auth). This will stop working in the next major version of npm. + +> PyTC Client@0.1.0 build +> cross-env CI=false react-scripts build + +[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +Creating an optimized production build... +[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +Compiled with warnings. + +[eslint] +src/components/FilePickerModal.js + Line 102:35: Function declared in a loop contains unsafe references to variable(s) 'curr' no-loop-func + Line 124:35: Function declared in a loop contains unsafe references to variable(s) 'currParentId' no-loop-func + Line 243:15: The href attribute is required for an anchor to be keyboard accessible. Provide a valid, navigable address as the href value. If you cannot provide an href, but still need the element to resemble a link, use a button and change it with appropriate styles. Learn more: https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/HEAD/docs/rules/anchor-is-valid.md jsx-a11y/anchor-is-valid + +src/components/YamlFileUploader.js + Line 347:6: React Hook useEffect has missing dependencies: 'getCurrentConfig' and 'syncYamlContext'. Either include them or remove the dependency array react-hooks/exhaustive-deps + Line 361:6: React Hook useEffect has missing dependencies: 'getCurrentConfig', 'setCurrentConfig', and 'updateInputSelectorInformation'. Either include them or remove the dependency array react-hooks/exhaustive-deps + Line 374:6: React Hook useMemo has a missing dependency: 'getCurrentConfig'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +src/views/EHTool.js + Line 25:6: React Hook useEffect has a missing dependency: 'sessionId'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +src/views/FilesManager.js + Line 81:31: Function declared in a loop contains unsafe references to variable(s) 'current' no-loop-func + Line 424:27: Function declared in a loop contains unsafe references to variable(s) 'curr' no-loop-func + Line 776:32: Function declared in a loop contains unsafe references to variable(s) 'descendantSizeKb', 'descendantSizeKb', 'descendantSizeKb', 'descendantSizeKb' no-loop-func + Line 1073:6: React Hook useEffect has missing dependencies: 'finishCreateFolder', 'finishRename', 'handleCopy', 'handleCut', 'handleDelete', and 'handlePaste'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +src/views/ehtool/DetectionWorkflow.js + Line 225:6: React Hook useEffect has a missing dependency: 'loadInstances'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 274:20: The ref value 'schedulerRef.current' will likely have changed by the time this effect cleanup function runs. If this ref points to a node rendered by React, copy 'schedulerRef.current' to a variable inside the effect, and use that variable in the cleanup function react-hooks/exhaustive-deps + Line 314:6: React Hook useEffect has a missing dependency: 'loadInstanceView'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 355:6: React Hook useEffect has a missing dependency: 'loadInstanceView'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 416:6: React Hook useEffect has missing dependencies: 'goToNextInstance', 'goToPreviousInstance', 'handleAxisChange', and 'handleInstanceClassify'. Either include them or remove the dependency array react-hooks/exhaustive-deps + Line 524:6: React Hook useEffect has a missing dependency: 'clearFrameCaches'. Either include it or remove the dependency array react-hooks/exhaustive-deps + +src/views/ehtool/ProofreadingEditor.js + Line 140:8: React Hook useEffect has a missing dependency: 'loadImages'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 148:8: React Hook useEffect has missing dependencies: 'drawCanvas' and 'drawMinimap'. Either include them or remove the dependency array react-hooks/exhaustive-deps + Line 163:8: React Hook useEffect has missing dependencies: 'drawCanvas' and 'drawMinimap'. Either include them or remove the dependency array react-hooks/exhaustive-deps + Line 403:8: React Hook useEffect has a missing dependency: 'loadOverlayImage'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 407:8: React Hook useEffect has a missing dependency: 'loadOverlayImage'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 653:7: React Hook useMemo has a missing dependency: 'glasbeyColor'. Either include it or remove the dependency array react-hooks/exhaustive-deps + Line 662:8: React Hook useEffect has missing dependencies: 'drawCanvas' and 'drawMinimap'. Either include them or remove the dependency array react-hooks/exhaustive-deps + Line 899:9: Expected a default case default-case + Line 940:8: React Hook useEffect has missing dependencies: 'handleRedo', 'handleSave', and 'handleUndo'. Either include them or remove the dependency array react-hooks/exhaustive-deps + +Search for the keywords to learn more about each warning. +To ignore, add // eslint-disable-next-line to the line before. + +File sizes after gzip: + + 481.63 kB build/static/js/main.ea9ff1f9.js + 465 B build/static/css/main.40821645.css + +The project was built assuming it is hosted at ./. +You can control this with the homepage field in your package.json. + +The build folder is ready to be deployed. + +Find out more about deployment here: + + https://cra.link/deployment + diff --git a/.logs/start/react-dev.log b/.logs/start/react-dev.log new file mode 100644 index 0000000..402780a --- /dev/null +++ b/.logs/start/react-dev.log @@ -0,0 +1,23 @@ +npm warn Unknown user config "always-auth". This will stop working in the next major version of npm. +npm warn Unknown user config "always-auth" (//firelayers.jfrog.io/artifactory/api/npm/itc-npm-virtual/:always-auth). This will stop working in the next major version of npm. + +> PyTC Client@0.1.0 start +> react-scripts start + +[baseline-browser-mapping] The data in this module is over two months old. To ensure accurate Baseline data, please update: `npm i baseline-browser-mapping@latest -D` +(node:69273) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option. +(Use `node --trace-deprecation ...` to show where the warning was created) +(node:69273) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option. +Starting the development server... + +Compiled successfully! + +You can now view PyTC Client in the browser. + + Local: http://localhost:3000 + On Your Network: http://192.168.99.154:3000 + +Note that the development build is not optimized. +To create a production build, use npm run build. + +webpack compiled successfully diff --git a/client/preload.js b/client/preload.js index 9c18439..4198638 100644 --- a/client/preload.js +++ b/client/preload.js @@ -2,7 +2,8 @@ const { contextBridge, ipcRenderer } = require("electron"); contextBridge.exposeInMainWorld("electronAPI", { isElectron: true, - openLocalFile: (options = {}) => ipcRenderer.invoke("open-local-file", options), + openLocalFile: (options = {}) => + ipcRenderer.invoke("open-local-file", options), revealInFinder: (targetPath) => ipcRenderer.invoke("reveal-in-finder", targetPath), }); diff --git a/client/src/components/RuntimeLogPanel.js b/client/src/components/RuntimeLogPanel.js index 9a938a7..1ce7745 100644 --- a/client/src/components/RuntimeLogPanel.js +++ b/client/src/components/RuntimeLogPanel.js @@ -117,7 +117,7 @@ function RuntimeLogPanel({ title, runtime, onRefresh }) { background: "#fff", border: "1px solid #f0f0f0", fontFamily: - 'ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace', + "ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace", fontSize: 12, color: "#262626", wordBreak: "break-word", @@ -142,7 +142,7 @@ function RuntimeLogPanel({ title, runtime, onRefresh }) { whiteSpace: "pre-wrap", wordBreak: "break-word", fontFamily: - 'ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace', + "ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace", }} > {text || "No runtime logs captured yet."} diff --git a/client/src/components/YamlFileUploader.js b/client/src/components/YamlFileUploader.js index e7a33c5..8fec2db 100644 --- a/client/src/components/YamlFileUploader.js +++ b/client/src/components/YamlFileUploader.js @@ -490,7 +490,11 @@ const YamlFileUploader = (props) => { {yamlContent ? ( {sliderData.map((param, index) => { - const sliderValue = getSliderValue(currentYamlData, type, param.key); + const sliderValue = getSliderValue( + currentYamlData, + type, + param.key, + ); const sliderSupported = isSliderSupported( currentYamlData, type, @@ -507,7 +511,11 @@ const YamlFileUploader = (props) => { min={param.min} max={param.max} marks={param.marks} - value={typeof sliderValue === "number" ? sliderValue : param.value} + value={ + typeof sliderValue === "number" + ? sliderValue + : param.value + } disabled={!sliderSupported} onChange={(newValue) => handleSliderChange(param.key, newValue) diff --git a/client/src/configSchema.js b/client/src/configSchema.js index 23e6ca8..f1473e0 100644 --- a/client/src/configSchema.js +++ b/client/src/configSchema.js @@ -135,14 +135,26 @@ export function setTrainingOutputPath(configObj, outputPath) { } const checkpointsPath = joinPath(outputPath, "checkpoints"); if (hasPath(configObj, ["train", "monitor", "checkpoint", "dirpath"])) { - setPathValue(configObj, ["train", "monitor", "checkpoint", "dirpath"], checkpointsPath); + setPathValue( + configObj, + ["train", "monitor", "checkpoint", "dirpath"], + checkpointsPath, + ); return; } if (hasPath(configObj, ["monitor", "checkpoint", "dirpath"])) { - setPathValue(configObj, ["monitor", "checkpoint", "dirpath"], checkpointsPath); + setPathValue( + configObj, + ["monitor", "checkpoint", "dirpath"], + checkpointsPath, + ); return; } - setPathValue(configObj, ["monitor", "checkpoint", "dirpath"], checkpointsPath); + setPathValue( + configObj, + ["monitor", "checkpoint", "dirpath"], + checkpointsPath, + ); } export function setInferenceOutputPath(configObj, outputPath) { @@ -152,7 +164,11 @@ export function setInferenceOutputPath(configObj, outputPath) { setPathValue(configObj, ["INFERENCE", "OUTPUT_PATH"], outputPath); return; } - setPathValue(configObj, ["inference", "save_prediction", "output_path"], outputPath); + setPathValue( + configObj, + ["inference", "save_prediction", "output_path"], + outputPath, + ); } export function setInferenceExecutionDefaults(configObj) { @@ -212,16 +228,14 @@ export function applyInputPaths( } if (mode === "training") { - const imagePath = - pickFirstExistingPath(configObj, [ - ["train", "data", "train", "image"], - ["data", "train", "image"], - ]) || ["train", "data", "train", "image"]; - const labelPath = - pickFirstExistingPath(configObj, [ - ["train", "data", "train", "label"], - ["data", "train", "label"], - ]) || ["train", "data", "train", "label"]; + const imagePath = pickFirstExistingPath(configObj, [ + ["train", "data", "train", "image"], + ["data", "train", "image"], + ]) || ["train", "data", "train", "image"]; + const labelPath = pickFirstExistingPath(configObj, [ + ["train", "data", "train", "label"], + ["data", "train", "label"], + ]) || ["train", "data", "train", "label"]; setPathValue(configObj, imagePath, inputImagePath); setPathValue(configObj, labelPath, inputLabelPath); if (outputPath) { @@ -230,16 +244,14 @@ export function applyInputPaths( return; } - const imagePath = - pickFirstExistingPath(configObj, [ - ["test", "data", "test", "image"], - ["data", "test", "image"], - ]) || ["test", "data", "test", "image"]; - const labelPath = - pickFirstExistingPath(configObj, [ - ["test", "data", "test", "label"], - ["data", "test", "label"], - ]) || ["test", "data", "test", "label"]; + const imagePath = pickFirstExistingPath(configObj, [ + ["test", "data", "test", "image"], + ["data", "test", "image"], + ]) || ["test", "data", "test", "image"]; + const labelPath = pickFirstExistingPath(configObj, [ + ["test", "data", "test", "label"], + ["data", "test", "label"], + ]) || ["test", "data", "test", "label"]; setPathValue(configObj, imagePath, inputImagePath); if (hasLabelPath) { setPathValue(configObj, labelPath, inputLabelPath); diff --git a/client/src/configSchema.test.js b/client/src/configSchema.test.js index 6c30639..8ce2e88 100644 --- a/client/src/configSchema.test.js +++ b/client/src/configSchema.test.js @@ -1,7 +1,4 @@ -import { - applyInputPaths, - setInferenceExecutionDefaults, -} from "./configSchema"; +import { applyInputPaths, setInferenceExecutionDefaults } from "./configSchema"; describe("setInferenceExecutionDefaults", () => { it("preserves existing legacy GPU values", () => { diff --git a/client/src/contexts/GlobalContext.js b/client/src/contexts/GlobalContext.js index 9eb4eca..107bc71 100644 --- a/client/src/contexts/GlobalContext.js +++ b/client/src/contexts/GlobalContext.js @@ -130,25 +130,13 @@ export const ContextWrapper = (props) => { const [inferenceConfigOriginPath, setInferenceConfigOriginPath] = usePersistedState("inferenceConfigOriginPath", ""); const [trainingUploadedYamlFile, setTrainingUploadedYamlFile] = - usePersistedState( - "trainingUploadedYamlFile", - "", - ); + usePersistedState("trainingUploadedYamlFile", ""); const [inferenceUploadedYamlFile, setInferenceUploadedYamlFile] = - usePersistedState( - "inferenceUploadedYamlFile", - "", - ); + usePersistedState("inferenceUploadedYamlFile", ""); const [trainingSelectedYamlPreset, setTrainingSelectedYamlPreset] = - usePersistedState( - "trainingSelectedYamlPreset", - "", - ); + usePersistedState("trainingSelectedYamlPreset", ""); const [inferenceSelectedYamlPreset, setInferenceSelectedYamlPreset] = - usePersistedState( - "inferenceSelectedYamlPreset", - "", - ); + usePersistedState("inferenceSelectedYamlPreset", ""); const [imageFileList, setImageFileList] = usePersistedState( "imageFileList", [], @@ -170,10 +158,7 @@ export const ContextWrapper = (props) => { null, ); const [inferenceCheckpointPath, setInferenceCheckpointPath] = - usePersistedState( - "inferenceCheckpointPath", - null, - ); + usePersistedState("inferenceCheckpointPath", null); const [currentImage, setCurrentImage] = usePersistedState( "currentImage", null, diff --git a/client/src/views/FilesManager.js b/client/src/views/FilesManager.js index 278f0e3..18e3c8a 100644 --- a/client/src/views/FilesManager.js +++ b/client/src/views/FilesManager.js @@ -240,11 +240,14 @@ function FilesManager() { const normalizedParent = String(parentKey || "root"); const previousFolders = foldersRef.current; const previousFiles = filesRef.current; - const { folders: nextFolders, files: nextFiles } = transformFiles(fileList); + const { folders: nextFolders, files: nextFiles } = + transformFiles(fileList); const existingDirectChildIds = previousFolders .filter((folder) => folder.parent === normalizedParent) .map((folder) => folder.key); - const nextDirectChildIds = new Set(nextFolders.map((folder) => folder.key)); + const nextDirectChildIds = new Set( + nextFolders.map((folder) => folder.key), + ); const removedFolderIds = collectDescendantFolderIds( previousFolders, existingDirectChildIds.filter((id) => !nextDirectChildIds.has(id)), @@ -253,14 +256,19 @@ function FilesManager() { const mergedFolders = [ ...previousFolders.filter( (folder) => - folder.parent !== normalizedParent && !removedFolderIds.has(folder.key), + folder.parent !== normalizedParent && + !removedFolderIds.has(folder.key), ), ...nextFolders, ].sort((left, right) => { if (left.parent === right.parent) { - return String(left.title || "").localeCompare(String(right.title || "")); + return String(left.title || "").localeCompare( + String(right.title || ""), + ); } - return String(left.parent || "").localeCompare(String(right.parent || "")); + return String(left.parent || "").localeCompare( + String(right.parent || ""), + ); }); const mergedFiles = { ...previousFiles }; @@ -362,11 +370,7 @@ function FilesManager() { setParentLoadingState(normalizedParent, false); } }, - [ - hasShownServerWarning, - replaceFolderChildren, - setParentLoadingState, - ], + [hasShownServerWarning, replaceFolderChildren, setParentLoadingState], ); // Load initial data with proper cleanup and 401 handling @@ -1817,12 +1821,12 @@ function FilesManager() { currentFolders.length === 0 && currentFiles.length === 0 && !newItemType && ( -
- -
- )} +
+ +
+ )} {currentFolders.map((f) => renderItem(f, "folder"))} {renderNewFolderPlaceholder()} {currentFiles.map((f) => renderItem(f, "file"))} diff --git a/client/src/views/FilesManager.test.js b/client/src/views/FilesManager.test.js index d52f54e..0257ad7 100644 --- a/client/src/views/FilesManager.test.js +++ b/client/src/views/FilesManager.test.js @@ -43,9 +43,13 @@ jest.mock("@ant-design/icons", () => { jest.mock("antd", () => { const React = require("react"); - const Button = ({ children, ...props }) => ; + const Button = ({ children, ...props }) => ( + + ); const Dropdown = ({ children }) =>
{children}
; - const Input = React.forwardRef((props, ref) => ); + const Input = React.forwardRef((props, ref) => ( + + )); const Menu = ({ items = [], onClick }) => (
{items.map((item) => diff --git a/client/src/views/ModelInference.js b/client/src/views/ModelInference.js index 8ea3bf4..87860a5 100644 --- a/client/src/views/ModelInference.js +++ b/client/src/views/ModelInference.js @@ -60,7 +60,10 @@ function ModelInference({ isInferring, setIsInferring }) { }); return yaml.dump(yamlData, { indent: 2 }).replace(/^\s*\n/gm, ""); } catch (error) { - console.warn("Failed to prepare inference config from current inputs:", error); + console.warn( + "Failed to prepare inference config from current inputs:", + error, + ); return inferenceConfig; } }; @@ -83,7 +86,10 @@ function ModelInference({ isInferring, setIsInferring }) { setIsInferring(false); if (status.exitCode === 0) { setInferenceStatus("Inference completed successfully! ✓"); - } else if (status.exitCode !== null && status.exitCode !== undefined) { + } else if ( + status.exitCode !== null && + status.exitCode !== undefined + ) { setInferenceStatus( `Inference finished with exit code: ${status.exitCode}`, ); @@ -130,7 +136,8 @@ function ModelInference({ isInferring, setIsInferring }) { setIsInferring(true); setInferenceStatus("Starting inference..."); - const preparedInferenceConfig = getPreparedInferenceConfig(inferenceConfig); + const preparedInferenceConfig = + getPreparedInferenceConfig(inferenceConfig); const res = await startModelInference( preparedInferenceConfig, diff --git a/client/src/views/ModelTraining.js b/client/src/views/ModelTraining.js index 312724d..63fe098 100644 --- a/client/src/views/ModelTraining.js +++ b/client/src/views/ModelTraining.js @@ -61,7 +61,9 @@ function ModelTraining() { if (status.exitCode === 0) { setTrainingStatus("Training completed successfully! ✓"); } else if (status.exitCode !== null) { - setTrainingStatus(`Training finished with exit code: ${status.exitCode}`); + setTrainingStatus( + `Training finished with exit code: ${status.exitCode}`, + ); } else if (status.phase === "failed" && status.lastError) { setTrainingStatus(`Training failed: ${status.lastError}`); } else { @@ -91,7 +93,10 @@ function ModelTraining() { }); return yaml.dump(yamlData, { indent: 2 }).replace(/^\s*\n/gm, ""); } catch (error) { - console.warn("Failed to prepare training config from current inputs:", error); + console.warn( + "Failed to prepare training config from current inputs:", + error, + ); return trainingConfig; } }; diff --git a/client/src/views/Views.test.js b/client/src/views/Views.test.js index 1f08242..957580c 100644 --- a/client/src/views/Views.test.js +++ b/client/src/views/Views.test.js @@ -49,7 +49,9 @@ jest.mock("./Visualization", () => () =>
Visualization Content
); jest.mock("./ModelTraining", () => () =>
Training Content
); jest.mock("./ModelInference", () => () =>
Inference Content
); jest.mock("./Monitoring", () => () =>
Monitoring Content
); -jest.mock("./MaskProofreading", () => () =>
Mask Proofreading Content
); +jest.mock("./MaskProofreading", () => () => ( +
Mask Proofreading Content
+)); jest.mock("../components/Chatbot", () => () =>
Chatbot
); describe("Views", () => { diff --git a/pytorch_connectomics b/pytorch_connectomics index 0a0dceb..20ccfde 160000 --- a/pytorch_connectomics +++ b/pytorch_connectomics @@ -1 +1 @@ -Subproject commit 0a0dceb8bc03e0afbb843aef17181c9f854209da +Subproject commit 20ccfde6f85868351b00d7b795d4cf89a251d6be diff --git a/scripts/dev.sh b/scripts/dev.sh index 1f6332b..455ed86 100755 --- a/scripts/dev.sh +++ b/scripts/dev.sh @@ -4,7 +4,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" CLIENT_DIR="${ROOT_DIR}/client" -DEFAULT_OLLAMA_BASE_URL="http://localhost:11434" +DEFAULT_OLLAMA_BASE_URL="http://cscigpu08.bc.edu:4443" DEFAULT_OLLAMA_MODEL="llama3.1:8b" if ! command -v uv >/dev/null 2>&1; then diff --git a/scripts/start.sh b/scripts/start.sh index c420e4b..2311eae 100755 --- a/scripts/start.sh +++ b/scripts/start.sh @@ -4,7 +4,7 @@ set -euo pipefail # Prefer Homebrew's Node over nvm to avoid version conflicts export PATH="/opt/homebrew/bin:$PATH" -export OLLAMA_BASE_URL="http://cscigpu08.bc.edu:11434" +export OLLAMA_BASE_URL="http://cscigpu08.bc.edu:4443" export OLLAMA_MODEL="gpt-oss:20b" export OLLAMA_EMBED_MODEL="qwen3-embedding:8b" diff --git a/server_api/auth/router.py b/server_api/auth/router.py index f50f7c7..0b3db5a 100644 --- a/server_api/auth/router.py +++ b/server_api/auth/router.py @@ -195,7 +195,9 @@ def get_files( return [ file - for file in query.order_by(models.File.is_folder.desc(), models.File.name.asc()).all() + for file in query.order_by( + models.File.is_folder.desc(), models.File.name.asc() + ).all() if not _is_ignored_system_file(file.name) ] @@ -287,9 +289,7 @@ def upload_file( db: Session = Depends(database.get_db), ): if _is_ignored_system_file(file.filename): - raise HTTPException( - status_code=400, detail="System metadata files are ignored" - ) + raise HTTPException(status_code=400, detail="System metadata files are ignored") # Create uploads directory if not exists upload_dir = f"uploads/{current_user.id}" diff --git a/server_api/chatbot/chatbot.py b/server_api/chatbot/chatbot.py index e5b332d..d1e4db3 100644 --- a/server_api/chatbot/chatbot.py +++ b/server_api/chatbot/chatbot.py @@ -92,18 +92,19 @@ You help end users navigate and use the PyTC Client application. ROUTING — decide which tool to use BEFORE calling anything: -- **UI, navigation, features, shortcuts, workflows** → search_documentation -- **Training config, hyperparameters, training commands** → delegate_to_training_agent -- **Inference, checkpoints, evaluation commands** → delegate_to_inference_agent +- **UI, navigation, features, shortcuts, workflows, "how do I..." questions** → search_documentation +- **Generate a specific training/inference command** → delegate_to_training_agent or delegate_to_inference_agent - **General/greeting/off-topic** → answer directly, no tool needed CRITICAL RULES: -1. **For application questions, ground answers in retrieved documentation.** Call search_documentation and base your answer on the returned text. Do NOT invent features, shortcuts, buttons, or workflows. -2. **Do not fabricate specifics.** Never make up keyboard shortcuts, button labels, or step-by-step instructions unless they come from retrieved docs or a sub-agent response. -3. **Answer every part of the user's question.** If they ask about two things, address both. -4. **Use retrieved content even if wording differs.** If the documentation describes relevant features or workflows, use that information to answer the question. Don't claim something isn't documented just because it uses different terminology than the user's question. -5. **HARD LIMIT: You may call search_documentation EXACTLY 2 times per user question.** After the second call, you MUST answer with the information already retrieved. Do NOT attempt a third search. If the tool returns "Search limit reached", immediately stop and answer based on what you already have. -6. **Delegate, don't search, for training/inference tasks.** If the user asks for a training command or inference command, use the appropriate sub-agent directly. +1. **ALWAYS search documentation first for UI questions.** If the user asks "how do I train", "what do I need to provide", "how do I start", "where do I configure", etc., use search_documentation to find the UI workflow in the docs. Do NOT delegate to sub-agents for these questions. +2. **Only delegate to sub-agents when the user explicitly asks you to generate a command.** Examples: "give me the training command for...", "write the inference command for...", "what's the CLI command to...". If they're asking HOW to use the UI, search the docs instead. +3. **For application questions, ground answers in retrieved documentation.** Call search_documentation and base your answer on the returned text. Do NOT invent features, shortcuts, buttons, or workflows. +4. **Do not fabricate specifics.** Never make up keyboard shortcuts, button labels, or step-by-step instructions unless they come from retrieved docs or a sub-agent response. +4a. **NEVER use command-line instructions for UI questions.** The PyTC Client is a desktop GUI application. If the user asks how to do something, explain the UI workflow (buttons, tabs, forms) from the documentation. Do NOT provide Python scripts, bash commands, or CLI examples unless the sub-agent explicitly generates them. +5. **Answer every part of the user's question.** If they ask about two things, address both. +6. **Use retrieved content even if wording differs.** If the documentation describes relevant features or workflows, use that information to answer the question. Don't claim something isn't documented just because it uses different terminology than the user's question. +7. **HARD LIMIT: You may call search_documentation EXACTLY 2 times per user question.** After the second call, you MUST answer with the information already retrieved. Do NOT attempt a third search. If the tool returns "Search limit reached", immediately stop and answer based on what you already have. Sub-agents: - **Training Agent**: Config selection, training job setup, hyperparameter overrides @@ -117,7 +118,7 @@ def build_chain(): """Build the multi-agent system with supervisor, training, and inference agents.""" - ollama_base_url = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") + ollama_base_url = os.getenv("OLLAMA_BASE_URL", "http://cscigpu08.bc.edu:4443") ollama_model = os.getenv("OLLAMA_MODEL", "gpt-oss:20b") ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL", "qwen3-embedding:8b") llm = ChatOllama(model=ollama_model, base_url=ollama_base_url, temperature=0) @@ -288,13 +289,13 @@ def delegate_to_inference_agent(task: str) -> str: def build_helper_chain(): - """Build a lightweight RAG-only agent for inline field help. - - Shares the same FAISS vectorstore and keyword-fallback docs as the main + """ + Build a lightweight helper agent for inline field-level help. + This agent has access to the same search_documentation tool as the main chatbot but has NO access to training/inference sub-agents. Returns ``(agent, reset_search_counter)`` — same interface as ``build_chain``. """ - ollama_base_url = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") + ollama_base_url = os.getenv("OLLAMA_BASE_URL", "http://cscigpu08.bc.edu:4443") ollama_model = os.getenv("OLLAMA_MODEL", "gpt-oss:20b") ollama_embed_model = os.getenv("OLLAMA_EMBED_MODEL", "qwen3-embedding:8b") llm = ChatOllama(model=ollama_model, base_url=ollama_base_url, temperature=0) diff --git a/server_api/chatbot/faiss_index/index.faiss b/server_api/chatbot/faiss_index/index.faiss index ff53351..f769973 100644 Binary files a/server_api/chatbot/faiss_index/index.faiss and b/server_api/chatbot/faiss_index/index.faiss differ diff --git a/server_api/chatbot/faiss_index/index.pkl b/server_api/chatbot/faiss_index/index.pkl index 318d8b4..46a7cb2 100644 Binary files a/server_api/chatbot/faiss_index/index.pkl and b/server_api/chatbot/faiss_index/index.pkl differ diff --git a/server_api/chatbot/file_summaries/ErrorHandlingTool.md b/server_api/chatbot/file_summaries/ErrorHandlingTool.md deleted file mode 100644 index 46d3323..0000000 --- a/server_api/chatbot/file_summaries/ErrorHandlingTool.md +++ /dev/null @@ -1,132 +0,0 @@ -# Error Handling Tool (EHT) - -The Error Handling Tool lets you detect and classify errors in image stacks. It is used for quality control of segmentation results — you load a dataset of image layers, review them visually, classify each layer as correct, incorrect, or unsure, and optionally edit masks to fix errors. - -## Getting Started: Loading a Dataset - -When you first open the Error Handling Tool tab, you see the **Load Dataset** form: - -1. **Project Name** — Enter a name for your project (defaults to "My Project"). -2. **Dataset Path** — Path to your image data on the server. Supports: - - Single TIFF file (2D or 3D stack) - - Directory of images (PNG, JPG, TIFF) - - Glob pattern (e.g., `/path/to/images/*.tif`) -3. **Mask Path (Optional)** — Path to a corresponding mask file or directory, if available. -4. Click **Load Dataset** to begin. - -After loading, the main detection interface appears. - -## Main Detection Interface Layout - -The interface has three panels: - -### Left Panel: Progress Tracker - -- **Project Info** — Shows the project name and total number of layers. -- **Progress** — A progress bar showing how many layers have been reviewed out of the total, with a percentage. -- **Classification Summary** — Four counters showing how many layers are classified as: - - Correct (green checkmark) - - Incorrect (red X) - - Unsure (yellow question mark) - - Unreviewed (gray exclamation mark) -- **Proofread Incorrect Layers** button — Appears when there are layers marked as "incorrect." Clicking it opens the first incorrect layer in the image editor for detailed inspection and mask editing. -- **Load New Dataset** button — Starts a new session by returning to the dataset loader form. - -### Center Panel: Layer Grid - -Layers are displayed as a paginated grid of thumbnail cards (12 per page, in a 3×4 layout). Each card shows: - -- A **thumbnail image** of the layer, with the mask overlaid semi-transparently if a mask exists. -- A **classification ribbon** in the top-right corner showing the current status (Correct, Incorrect, Unsure, or Unreviewed) with a color-coded badge. -- A **checkbox** in the top-left corner for selecting the layer (click the checkbox without opening the editor). -- The **layer name** and **layer number** at the bottom of the card. - -**Interactions:** - -- **Click a card** to open the Image Inspection modal for detailed viewing and mask editing. -- **Click the checkbox** to select/deselect a layer for bulk classification. -- **Use the pagination controls** at the bottom to navigate between pages. - -### Right Panel: Classification Panel - -- **Selected count** — A tag showing how many layers are currently selected (e.g., "3 layers selected"). -- **Classification buttons:** - - **Correct (C)** — Green button. Classify selected layers as correct. - - **Incorrect (X)** — Red button. Classify selected layers as incorrect. - - **Unsure (U)** — Yellow button. Classify selected layers as unsure. -- **Selection buttons:** - - **Select All (Ctrl+A)** — Select all layers on the current page. - - **Clear Selection** — Deselect all layers. -- **Keyboard Shortcuts** reference card at the bottom. - -## Keyboard Shortcuts (Main Grid) - -These shortcuts work when the main grid is visible (not when the image editor modal is open) and you are not typing in an input field: - -| Shortcut | Action | -| -------- | ------------------------------------- | -| C | Classify selected layers as Correct | -| X | Classify selected layers as Incorrect | -| U | Classify selected layers as Unsure | -| Ctrl+A | Select all layers on the current page | - -## Image Inspection Modal - -Click on any layer card to open a full-screen modal for detailed inspection. The modal title shows the layer name and number (e.g., "Image Inspection: layer_042.tif (Layer 43)"). - -### Modal Header Controls - -- **Classification radio buttons** — Toggle between Correct (C), Incorrect (X), and Unsure (U) to set the classification for this individual layer. -- **Save (S)** button — Saves the current mask edits and classification, then closes the modal. - -### Modal Layout - -The modal contains two areas: - -**Left Panel: Tools** - -- **Minimap** — A small overview of the full image. Click anywhere on the minimap to jump the main canvas to that location. A red rectangle shows the current viewport. -- **Mode** — Three tool buttons: - - **Paint (P)** — Draw on the mask to add regions. - - **Erase (E)** — Remove regions from the mask. - - **Hand (H)** — Pan the canvas without drawing. -- **Paint/Erase Size** — A slider (1–64) and number input to adjust the brush size. Shown only when Paint or Erase mode is active. -- **History:** - - **Undo (Ctrl+Z)** — Undo the last brush stroke. - - **Redo (Ctrl+Shift+Z or Ctrl+Y)** — Redo an undone stroke. -- **Hide/Show Mask** — Toggle the mask overlay visibility. -- **Zoom** — Shows the current zoom percentage. Buttons to zoom in, zoom out, or reset to 100%. - -**Center: Canvas** - -The main editing area displays the image with the mask overlay. Interactions: - -- **Scroll wheel** — Zoom in/out (zooms toward the cursor position). -- **Click and drag** with Paint or Erase tool to draw or erase mask regions. A circular cursor preview follows the mouse showing the brush size. -- **Ctrl+click and drag** or use the **Hand tool** to pan the canvas. - -### Image Editor Keyboard Shortcuts - -| Shortcut | Action | -| -------------------------- | ------------------------------- | -| P | Switch to Paint mode | -| E | Switch to Erase mode | -| H | Switch to Hand (pan) mode | -| C | Set classification to Correct | -| X | Set classification to Incorrect | -| U | Set classification to Unsure | -| Ctrl+Z / Cmd+Z | Undo | -| Ctrl+Shift+Z / Cmd+Shift+Z | Redo | -| Ctrl+Y / Cmd+Y | Redo (alternative) | -| Ctrl+S / Cmd+S | Save mask and classification | -| Escape | Close the modal | - -## Typical Workflow - -1. Load a dataset using the **Load Dataset** form. -2. Review layers in the grid. Use the checkboxes to select batches of obviously correct or incorrect layers. -3. Press **C**, **X**, or **U** to classify selected layers in bulk. -4. Click on questionable layers to open the Image Inspection modal for closer examination. -5. In the modal, use the Paint/Erase tools to correct the mask if needed, set the classification, and press **Save**. -6. Use the **Proofread Incorrect Layers** button to revisit layers you marked as incorrect. -7. Monitor your progress in the Progress Tracker on the left. diff --git a/server_api/chatbot/file_summaries/GettingStarted.md b/server_api/chatbot/file_summaries/GettingStarted.md index 56276e1..0d82fb8 100644 --- a/server_api/chatbot/file_summaries/GettingStarted.md +++ b/server_api/chatbot/file_summaries/GettingStarted.md @@ -27,13 +27,33 @@ The application has three main areas: The chat panel appears as a sliding drawer on the right. To use it: -1. Click the **AI Chat** button in the top navigation bar to open the drawer. +1. Click the **AI Chat** button (message icon) in the top navigation bar to open the drawer. 2. Type your question in the text input at the bottom and press **Enter** or click **Send**. 3. The assistant will respond with guidance based on the application's documentation. -4. Click **Clear Chat** to start a new conversation. The chat supports markdown formatting, including tables, code blocks, and lists. +### Conversation History + +The chat drawer includes a **sidebar** on the left that lists your saved conversations: + +- **New chat (+)** — Click the **+** button at the top to start a fresh conversation. +- **Switch conversations** — Click any conversation in the sidebar to load it. +- **Delete a conversation** — Click the trash icon next to a conversation and confirm. +- **Collapse/expand sidebar** — Use the fold/unfold button to hide or show the conversation list. + +Conversations are saved automatically as you chat. When you reopen the drawer, your past chats are still available. + +### Inline Help ("?" Buttons) + +Throughout the training and inference configuration forms, you will see small **?** buttons next to input fields. Clicking a **?** button opens a floating chat panel that: + +1. Automatically asks the AI to explain that specific setting and recommend a value. +2. Lets you ask follow-up questions about the setting. +3. Can be dragged around the screen and resized. + +This provides context-aware help without leaving the configuration page. + ## Keyboard Shortcuts (Global) These standard editing shortcuts work throughout the application: diff --git a/server_api/chatbot/file_summaries/MaskProofreading.md b/server_api/chatbot/file_summaries/MaskProofreading.md new file mode 100644 index 0000000..ac0e026 --- /dev/null +++ b/server_api/chatbot/file_summaries/MaskProofreading.md @@ -0,0 +1,142 @@ +# Mask Proofreading Page + +The Mask Proofreading page lets you review and correct segmentation masks on a per-instance basis. You load a volume (image stack) along with its mask, and the tool automatically detects individual instances (connected components). You can then step through each instance, view it from multiple axes, classify it, and paint or erase mask regions directly on the canvas. + +## Getting Started: Loading a Dataset + +When you first open the Mask Proofreading tab, you see the **Start a Mask Proofreading Session** form: + +1. **Project Name** — Enter a name for your proofreading session (defaults to "My Project"). +2. **Dataset Path** — Path to your image volume on the server. Supports a single TIFF file, a directory of images, or a glob pattern (e.g., `/path/to/images/*.tif`). +3. **Mask Path (Optional)** — Path to a corresponding mask file or directory. Providing a mask enables instance proofreading. +4. Click **Load Dataset** to begin. + +After loading, the tool builds an instance list from the mask and displays the main proofreading interface. + +## Main Interface Layout + +The interface has two main areas: + +### Center: Canvas and Slice Slider + +The canvas displays the current slice of the volume with mask overlays. Below the canvas is a **slice slider** that lets you scrub through slices along the active axis. + +- The current axis and slice number are shown in the inspector sidebar header (e.g., "XY Slice 42"). +- Drag the slider to scrub through slices quickly. The tool prefetches nearby slices for smooth scrubbing. +- The canvas supports the same **Paint**, **Erase**, and **Hand** tools as the old image editor (see Editing Tools below). + +Above the canvas are two buttons: + +- **Focus canvas** — Hides the inspector sidebar to give the canvas more room. +- **Show sidebar** — Brings the sidebar back. + +### Right Sidebar: Inspector + +The inspector sidebar is organized into collapsible sections: + +**Review** — Classification controls for the selected instance: + +- **Looks good** (green) — Mark the instance as correctly segmented. +- **Needs fix** (red) — Mark the instance as needing correction. +- **Unsure** (yellow) — Mark the instance as uncertain. + +**Instances** — Controls for navigating instances: + +- **Browse...** — Opens a drawer with the full instance list (see Instance Navigator below). +- **Next unreviewed** — Jumps to the next instance that has not been classified yet. +- **More menu (⋯)** — Contains **Export edited masks** and **Overwrite source masks** options. + +**Overlay** — Opacity sliders for mask overlays: + +- **Other instances** — Controls how visible non-selected instances are (default 8%). +- **Selected instance** — Controls how visible the active instance is (default 80%). + +**Progress** — Shows review progress: + +- A progress bar showing how many instances have been reviewed out of the total. +- Counters for correct, incorrect, unsure, and unreviewed instances. +- **Load dataset** button to start a new session. + +## Instance Navigator + +Click **Browse...** in the Instances section (or the Instance Navigator drawer) to see all detected instances. Each entry shows: + +- **Instance ID** (e.g., "#42") +- **Center of mass** coordinates (z, y, x) +- **Voxel count** — the size of the instance +- **Classification status** — color-coded tag: "reviewed" (green), "needs fix" (red), "unsure" (gold), or "unreviewed" (gray) + +You can: + +- **Filter** instances by ID using the search box at the top. +- **Navigate** with the left/right arrow buttons to move between instances. +- **Click** any instance to select it. The canvas jumps to that instance's center-of-mass slice. + +## Multi-Axis Viewing + +You can view the volume from three axes: + +- **XY** — The default top-down view +- **ZX** — A side view +- **ZY** — Another side view + +Switch axes using the axis selector in the canvas toolbar. The slice slider updates to reflect the depth along the chosen axis. When you select a new instance, the slice automatically jumps to the instance's center of mass along the current axis. + +## Editing Tools (Canvas) + +The canvas includes a collapsible tool panel for mask editing: + +- **Paint (P)** — Draw on the mask to add regions. Adjust brush size with a slider (1–64). +- **Erase (E)** — Remove regions from the mask. Adjust brush size with a slider (1–64). +- **Hand (H)** — Pan the canvas without drawing. +- **Undo (Ctrl+Z / Cmd+Z)** — Undo the last brush stroke. +- **Redo (Ctrl+Shift+Z / Cmd+Shift+Z)** — Redo an undone stroke. +- **Hide/Show Mask** — Toggle mask overlay visibility. +- **Zoom** — Scroll wheel to zoom in/out. Zoom percentage is displayed. +- **Save (Ctrl+S / Cmd+S)** — Save mask edits for the current instance and slice. + +## Exporting Edited Masks + +After editing masks, you can save your work: + +- **Export edited masks** — Opens a dialog where you enter an output path. The tool writes a TIFF file containing all your edits. +- **Overwrite source masks** — Writes edits back to the original mask file. A timestamped backup is always created first. + +## Keyboard Shortcuts + +**Instance navigation and classification** (active when an instance is selected): + +| Shortcut | Action | +| ----------- | ------------------------------ | +| C | Classify instance as correct | +| X | Classify instance as needs fix | +| U | Classify instance as unsure | +| Arrow Right | Go to next instance | +| Arrow Left | Go to previous instance | +| 1 | Switch to XY axis | +| 2 | Switch to ZX axis | +| 3 | Switch to ZY axis | + +**Canvas editing tools** (active when the editor canvas is focused): + +| Shortcut | Action | +| -------------------------- | ------------------------- | +| P | Switch to Paint mode | +| E | Switch to Erase mode | +| H | Switch to Hand (pan) mode | +| A / Arrow Left | Previous slice | +| D / Arrow Right | Next slice | +| Ctrl+Z / Cmd+Z | Undo | +| Ctrl+Shift+Z / Cmd+Shift+Z | Redo | +| Ctrl+Y / Cmd+Y | Redo (alternative) | +| Ctrl+S / Cmd+S | Save mask edits | + +## Typical Workflow + +1. Open the **Mask Proofreading** tab and load a dataset with a mask. +2. The tool detects instances and displays the first one. +3. Use the **Instance Navigator** (Browse...) to see all instances, or click **Next unreviewed** to step through them. +4. For each instance, examine it from different axes if needed, then classify it as **Looks good**, **Needs fix**, or **Unsure**. +5. If the mask needs correction, use the **Paint** and **Erase** tools on the canvas, then click **Save**. +6. Track your progress in the **Progress** section of the inspector sidebar. +7. When finished, use **Export edited masks** or **Overwrite source masks** to save all changes. diff --git a/server_api/chatbot/file_summaries/ModelInference.md b/server_api/chatbot/file_summaries/ModelInference.md index e6a4fe6..e5a7a6c 100644 --- a/server_api/chatbot/file_summaries/ModelInference.md +++ b/server_api/chatbot/file_summaries/ModelInference.md @@ -8,12 +8,11 @@ The Model Inference page lets you run inference (prediction) using a trained seg Specify the file paths for your inference data: -- **Input Image** — Path to the image data you want to run inference on (file or directory on the server). Click the folder icon to browse, type a path, or drag and drop. -- **Input Label** — Path to ground-truth labels (optional, used if you want to evaluate accuracy). +- **Input Image** — Path to the image data you want to run inference on (file or directory on the server). Click the folder icon to browse, type a path, or drag and drop. You can also click the **?** button next to the field for AI-powered help. - **Output Path** — Directory where inference results will be saved. - **Checkpoint Path** — Path to the trained model checkpoint file (e.g., `/path/to/checkpoint_100000.pth.tar`). This is the model that will be used for prediction. -All fields except Input Label are required before you can proceed. +All three fields are required before you can proceed. ### Step 2: Base Configuration diff --git a/server_api/chatbot/file_summaries/ModelTraining.md b/server_api/chatbot/file_summaries/ModelTraining.md index b872af1..e0a5ccb 100644 --- a/server_api/chatbot/file_summaries/ModelTraining.md +++ b/server_api/chatbot/file_summaries/ModelTraining.md @@ -10,13 +10,15 @@ The configuration wizard (stepper) walks you through three steps. You must compl Specify the file paths for your training data: -- **Input Image** — Path to your training image data (file or directory on the server). Click the folder icon to browse, type a path, or drag and drop. +- **Input Image** — Path to your training image data (file or directory on the server). Click the folder icon to browse, type a path, or drag and drop. Each field also has a **?** button that opens an AI-powered help panel with explanations and recommended values. - **Input Label** — Path to the corresponding ground-truth labels. - **Output Path** — Directory where training outputs (checkpoints, logs) will be saved. - **Log Path** — Directory for training logs (used by TensorBoard for monitoring). All four fields are required before you can proceed. The application will show a warning listing any missing fields if you try to advance without filling them in. +**Inline AI help:** Every input field on the training configuration page has a small **?** button. Clicking it opens a floating chat panel that explains the setting, suggests a recommended value, and accepts follow-up questions. + ### Step 2: Base Configuration Choose a starting YAML configuration file for your training job: diff --git a/server_api/chatbot/file_summaries/WormErrorHandling.md b/server_api/chatbot/file_summaries/WormErrorHandling.md deleted file mode 100644 index c0788bf..0000000 --- a/server_api/chatbot/file_summaries/WormErrorHandling.md +++ /dev/null @@ -1,41 +0,0 @@ -# Worm Error Handling Page - -The Worm Error Handling page provides the same Error Handling Tool interface for detecting and classifying errors, specifically tailored for worm segmentation image stacks. - -## How It Works - -The Worm Error Handling tab uses the same full Error Handling Tool workflow described in the Error Handling Tool documentation. This includes: - -- **Loading a dataset** — Enter a project name, dataset path, and optional mask path, then click **Load Dataset**. -- **Layer grid** — Browse paginated layer thumbnails, select layers with checkboxes, and classify them in bulk. -- **Classification** — Use the **Correct (C)**, **Incorrect (X)**, and **Unsure (U)** buttons or keyboard shortcuts to classify layers. -- **Image Inspection modal** — Click any layer to open a full-screen editor with Paint, Erase, and Hand tools for mask correction, plus undo/redo, zoom, and a minimap. -- **Progress tracking** — Monitor how many layers have been reviewed with the Progress Tracker panel. - -## Keyboard Shortcuts - -All keyboard shortcuts are identical to the Error Handling Tool: - -**Main Grid:** -| Shortcut | Action | -|----------|--------| -| C | Classify selected layers as Correct | -| X | Classify selected layers as Incorrect | -| U | Classify selected layers as Unsure | -| Ctrl+A | Select all layers on the current page | - -**Image Editor Modal:** -| Shortcut | Action | -|----------|--------| -| P | Paint mode | -| E | Erase mode | -| H | Hand (pan) mode | -| C | Set classification to Correct | -| X | Set classification to Incorrect | -| U | Set classification to Unsure | -| Ctrl+Z / Cmd+Z | Undo | -| Ctrl+Shift+Z / Cmd+Shift+Z | Redo | -| Ctrl+S / Cmd+S | Save | -| Escape | Close modal | - -For the complete workflow guide, see the **Error Handling Tool** documentation. diff --git a/server_api/chatbot/test_rag_eval.py b/server_api/chatbot/test_rag_eval.py new file mode 100644 index 0000000..fbde347 --- /dev/null +++ b/server_api/chatbot/test_rag_eval.py @@ -0,0 +1,320 @@ +""" +RAG Retrieval Evaluation Script +Tests whether FAISS retrieval returns the correct source document for each question. +Updated for the current 7-doc set (MaskProofreading replaces ErrorHandlingTool + WormErrorHandling). +""" + +import os +from pathlib import Path +from langchain_community.vectorstores import FAISS +from langchain_ollama import OllamaEmbeddings + +FAISS_DIR = Path(__file__).parent / "faiss_index" + +QUESTIONS = [ + # ── GettingStarted.md ─────────────────────────────────────────────── + ("What is PyTC Client?", "GettingStarted.md", "easy"), + ("How do I launch the application?", "GettingStarted.md", "easy"), + ("What tabs are in the top navigation bar?", "GettingStarted.md", "easy"), + ("How do I open the AI chat?", "GettingStarted.md", "easy"), + ("What workflows are available in PyTC Client?", "GettingStarted.md", "easy"), + ("How do I start a new chat conversation?", "GettingStarted.md", "medium"), + ("Can I save my chat history?", "GettingStarted.md", "medium"), + ("How do I delete a past conversation?", "GettingStarted.md", "medium"), + ("What does the + button in the chat do?", "GettingStarted.md", "medium"), + ("How do I collapse the chat sidebar?", "GettingStarted.md", "medium"), + ("What are the ? buttons next to config fields?", "GettingStarted.md", "medium"), + ("How does inline help work?", "GettingStarted.md", "medium"), + ("Can I resize the chat drawer?", "GettingStarted.md", "hard"), + ( + "Where can I find my previous conversations with the assistant?", + "GettingStarted.md", + "hard", + ), + ( + "If I want context-specific guidance on a parameter, what UI element should I click?", + "GettingStarted.md", + "hard", + ), + ( + "Is there a way to get AI recommendations for individual settings without opening the main chat?", + "GettingStarted.md", + "hard", + ), + # ── FileManager.md ────────────────────────────────────────────────── + ("How do I upload files to the server?", "FileManager.md", "easy"), + ("How do I create a new folder in the file manager?", "FileManager.md", "easy"), + ("What is the context menu in the file manager?", "FileManager.md", "medium"), + ("Can I drag and drop files?", "FileManager.md", "easy"), + ("How do I preview a file?", "FileManager.md", "medium"), + ("What keyboard shortcuts work in the file manager?", "FileManager.md", "medium"), + ("How do I mount a project directory?", "FileManager.md", "hard"), + ( + "I need to organize my data on the remote server - which page should I use?", + "FileManager.md", + "hard", + ), + ( + "Can I see a quick preview of images without downloading them?", + "FileManager.md", + "hard", + ), + ( + "What's the fastest way to select multiple files at once?", + "FileManager.md", + "hard", + ), + # ── ModelTraining.md ──────────────────────────────────────────────── + ("How do I start a training job?", "ModelTraining.md", "easy"), + ("What are the three steps to configure training?", "ModelTraining.md", "easy"), + ("What inputs are required for model training?", "ModelTraining.md", "easy"), + ("How do I upload a YAML config for training?", "ModelTraining.md", "medium"), + ( + "What is the advanced configuration step for training?", + "ModelTraining.md", + "medium", + ), + ("How do I stop a running training job?", "ModelTraining.md", "easy"), + ("Can I edit the raw YAML for training?", "ModelTraining.md", "medium"), + ( + "What model architectures are available for training?", + "ModelTraining.md", + "hard", + ), + ("Do training config fields have AI help buttons?", "ModelTraining.md", "medium"), + ( + "I want to train a segmentation model - where do I configure that?", + "ModelTraining.md", + "hard", + ), + ( + "If I need to tweak hyperparameters, which configuration step handles that?", + "ModelTraining.md", + "hard", + ), + ( + "Can I get AI assistance explaining what each training parameter does?", + "ModelTraining.md", + "hard", + ), + # ── ModelInference.md ─────────────────────────────────────────────── + ("How do I run inference?", "ModelInference.md", "easy"), + ("What inputs do I need for inference?", "ModelInference.md", "easy"), + ("What is the checkpoint path for inference?", "ModelInference.md", "medium"), + ("How do I stop an inference job?", "ModelInference.md", "easy"), + ("What is the augmentations setting in inference?", "ModelInference.md", "medium"), + ("Is there an Input Label field for inference?", "ModelInference.md", "hard"), + ( + "I have a trained model and want to run predictions on new data - which page?", + "ModelInference.md", + "hard", + ), + ("Do I need ground truth labels to run inference?", "ModelInference.md", "hard"), + ( + "Where do I specify which trained weights to use for prediction?", + "ModelInference.md", + "hard", + ), + # ── Visualization.md ──────────────────────────────────────────────── + ("How do I visualize my data?", "Visualization.md", "easy"), + ("What is Neuroglancer?", "Visualization.md", "easy"), + ("How do I manage viewer tabs?", "Visualization.md", "medium"), + ("Can I view label data alongside images?", "Visualization.md", "medium"), + ( + "I want to inspect my 3D volumes interactively - which tool does that?", + "Visualization.md", + "hard", + ), + ( + "Is there a way to view segmentation masks overlaid on raw images?", + "Visualization.md", + "hard", + ), + # ── Monitoring.md ─────────────────────────────────────────────────── + ("How do I monitor training progress?", "Monitoring.md", "easy"), + ("What is TensorBoard used for?", "Monitoring.md", "easy"), + ("How does the monitoring page work?", "Monitoring.md", "easy"), + ( + "Where can I see training loss curves and metrics in real-time?", + "Monitoring.md", + "hard", + ), + ( + "I want to track how my model is learning - which page shows that?", + "Monitoring.md", + "hard", + ), + # ── MaskProofreading.md ───────────────────────────────────────────── + ("How do I start a mask proofreading session?", "MaskProofreading.md", "easy"), + ("What is instance proofreading?", "MaskProofreading.md", "easy"), + ("How do I load a dataset for proofreading?", "MaskProofreading.md", "easy"), + ( + "What are the classification options for instances?", + "MaskProofreading.md", + "medium", + ), + ("How do I navigate between instances?", "MaskProofreading.md", "medium"), + ("What does the Instance Navigator show?", "MaskProofreading.md", "medium"), + ("How do I switch viewing axes in proofreading?", "MaskProofreading.md", "medium"), + ( + "What editing tools are available on the canvas?", + "MaskProofreading.md", + "medium", + ), + ("How do I paint or erase mask regions?", "MaskProofreading.md", "medium"), + ("How do I undo a brush stroke?", "MaskProofreading.md", "medium"), + ( + "What keyboard shortcut classifies an instance as correct?", + "MaskProofreading.md", + "hard", + ), + ("How do I export edited masks?", "MaskProofreading.md", "medium"), + ("Can I overwrite the original mask file?", "MaskProofreading.md", "medium"), + ("What do the overlay opacity sliders control?", "MaskProofreading.md", "hard"), + ("How do I jump to the next unreviewed instance?", "MaskProofreading.md", "medium"), + ( + "What is the progress tracker in mask proofreading?", + "MaskProofreading.md", + "medium", + ), + ( + "How do I focus the canvas and hide the sidebar?", + "MaskProofreading.md", + "medium", + ), + ( + "What is the keyboard shortcut to switch to the ZX axis?", + "MaskProofreading.md", + "hard", + ), + ("How do I save mask edits?", "MaskProofreading.md", "medium"), + ("What happens when I click Needs fix?", "MaskProofreading.md", "medium"), + ( + "I need to manually correct segmentation errors in my masks - which workflow?", + "MaskProofreading.md", + "hard", + ), + ( + "Can I review individual connected components separately?", + "MaskProofreading.md", + "hard", + ), + ( + "Is there a way to see my volume from different orthogonal planes?", + "MaskProofreading.md", + "hard", + ), + ( + "How do I mark a segmented object as incorrectly segmented?", + "MaskProofreading.md", + "hard", + ), + ( + "Can I adjust how transparent other instances appear while editing one?", + "MaskProofreading.md", + "hard", + ), + ( + "I want to write my corrections back to the original file safely - how?", + "MaskProofreading.md", + "hard", + ), + ( + "What's the quickest way to find instances that haven't been reviewed yet?", + "MaskProofreading.md", + "hard", + ), + ( + "If I make a mistake while painting, how do I reverse it?", + "MaskProofreading.md", + "hard", + ), + ( + "Can I see how many instances I've classified so far?", + "MaskProofreading.md", + "hard", + ), + ( + "Is there a keyboard shortcut to move between detected objects?", + "MaskProofreading.md", + "hard", + ), +] + + +def main(): + embed_model = os.getenv("OLLAMA_EMBED_MODEL", "qwen3-embedding:8b") + base_url = os.getenv("OLLAMA_BASE_URL", "http://cscigpu08.bc.edu:4443") + + print(f"Embeddings: {embed_model} | Ollama: {base_url}") + print(f"FAISS dir: {FAISS_DIR}") + print(f"Questions: {len(QUESTIONS)}\n") + + embeddings = OllamaEmbeddings(model=embed_model, base_url=base_url) + vectorstore = FAISS.load_local( + str(FAISS_DIR), embeddings, allow_dangerous_deserialization=True + ) + retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) + + results_by_doc = {} + results_by_difficulty = {} + top1_hits = 0 + top3_hits = 0 + + for question, expected_doc, difficulty in QUESTIONS: + docs = retriever.invoke(question) + sources = [d.metadata.get("source", "") for d in docs] + + hit_top1 = expected_doc in sources[:1] + hit_top3 = expected_doc in sources[:3] + + if hit_top1: + top1_hits += 1 + if hit_top3: + top3_hits += 1 + + # Per-doc stats + results_by_doc.setdefault(expected_doc, {"top1": 0, "top3": 0, "total": 0}) + results_by_doc[expected_doc]["total"] += 1 + if hit_top1: + results_by_doc[expected_doc]["top1"] += 1 + if hit_top3: + results_by_doc[expected_doc]["top3"] += 1 + + # Per-difficulty stats + results_by_difficulty.setdefault(difficulty, {"top1": 0, "top3": 0, "total": 0}) + results_by_difficulty[difficulty]["total"] += 1 + if hit_top1: + results_by_difficulty[difficulty]["top1"] += 1 + if hit_top3: + results_by_difficulty[difficulty]["top3"] += 1 + + status = "✓" if hit_top1 else ("~" if hit_top3 else "✗") + if not hit_top3: + print(f" {status} Q: {question}") + print(f" Expected: {expected_doc}") + print(f" Got: {', '.join(sources)}") + + total = len(QUESTIONS) + print(f"\n{'='*60}") + print( + f"OVERALL: Top-1 {top1_hits}/{total} ({100*top1_hits/total:.1f}%) | Top-3 {top3_hits}/{total} ({100*top3_hits/total:.1f}%)" + ) + + print(f"\nBY DOCUMENT:") + for doc, stats in sorted(results_by_doc.items()): + t = stats["total"] + print(f" {doc:30s} top1={stats['top1']}/{t} top3={stats['top3']}/{t}") + + print(f"\nBY DIFFICULTY:") + for diff in ["easy", "medium", "hard"]: + if diff in results_by_difficulty: + stats = results_by_difficulty[diff] + t = stats["total"] + print( + f" {diff:10s} top1={stats['top1']}/{t} ({100*stats['top1']/t:.0f}%) top3={stats['top3']}/{t} ({100*stats['top3']/t:.0f}%)" + ) + + +if __name__ == "__main__": + main() diff --git a/server_api/chatbot/update_faiss.py b/server_api/chatbot/update_faiss.py index 15b9cab..71bcf9a 100644 --- a/server_api/chatbot/update_faiss.py +++ b/server_api/chatbot/update_faiss.py @@ -31,13 +31,15 @@ def main(): parser.add_argument( "--base-url", default=None, - help="Ollama base URL (default: from OLLAMA_BASE_URL env or 'http://localhost:11434')", + help="Ollama base URL (default: from OLLAMA_BASE_URL env or 'http://cscigpu08.bc.edu:4443')", ) args = parser.parse_args() # Use same defaults as build_chain() in chatbot.py embed_model = args.model or os.getenv("OLLAMA_EMBED_MODEL", "qwen3-embedding:8b") - base_url = args.base_url or os.getenv("OLLAMA_BASE_URL", "http://localhost:11434") + base_url = args.base_url or os.getenv( + "OLLAMA_BASE_URL", "http://cscigpu08.bc.edu:4443" + ) print(f"Using embeddings model: {embed_model}") print(f"Using Ollama base URL: {base_url}") diff --git a/server_pytc/services/model.py b/server_pytc/services/model.py index 5730396..4ab82c9 100644 --- a/server_pytc/services/model.py +++ b/server_pytc/services/model.py @@ -73,7 +73,9 @@ def _clear_runtime_process(kind: str, process=None): _inference_process = None -def _reset_runtime_state(kind: str, *, phase: str = "idle", metadata: dict | None = None): +def _reset_runtime_state( + kind: str, *, phase: str = "idle", metadata: dict | None = None +): state = _new_runtime_state() timestamp = _utc_now() state["phase"] = phase @@ -361,7 +363,9 @@ def start_training(payload: dict): configPath=temp_filepath, configOriginPath=config_origin_path, ) - _append_runtime_event("training", f"Config origin: {config_origin_path or 'none'}") + _append_runtime_event( + "training", f"Config origin: {config_origin_path or 'none'}" + ) _append_runtime_event("training", f"Staged config path: {temp_filepath}") command = [ @@ -380,7 +384,9 @@ def start_training(payload: dict): ) print(f"[MODEL.PY] Final training command: {' '.join(command)}") - _append_runtime_event("training", f"Final training command: {' '.join(command)}") + _append_runtime_event( + "training", f"Final training command: {' '.join(command)}" + ) _training_process = _start_logged_process( command, current_dir, @@ -413,9 +419,7 @@ def _stop_processes(matcher, description: str): cmdline = proc.info["cmdline"] or [] if not matcher(cmdline): continue - print( - f"Terminating process {proc.info['pid']}: {' '.join(cmdline)}" - ) + print(f"Terminating process {proc.info['pid']}: {' '.join(cmdline)}") proc.terminate() proc.wait(timeout=10) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.TimeoutExpired): @@ -586,7 +590,9 @@ def start_inference(payload: dict): ) print(f"[MODEL.PY] Final inference command: {' '.join(command)}") - _append_runtime_event("inference", f"Final inference command: {' '.join(command)}") + _append_runtime_event( + "inference", f"Final inference command: {' '.join(command)}" + ) _inference_process = _start_logged_process( command, current_dir, @@ -642,7 +648,8 @@ def stop_inference(): if _inference_process and _inference_process.poll() is None: try: _append_runtime_event( - "inference", f"Terminating inference process PID: {_inference_process.pid}" + "inference", + f"Terminating inference process PID: {_inference_process.pid}", ) print(f"Terminating inference process PID: {_inference_process.pid}") _inference_process.terminate() diff --git a/tests/test_check_files_route.py b/tests/test_check_files_route.py index 2cb134d..f1397a5 100644 --- a/tests/test_check_files_route.py +++ b/tests/test_check_files_route.py @@ -6,7 +6,6 @@ from server_api.main import app as server_api_app - REPO_ROOT = pathlib.Path(__file__).resolve().parents[1] SNEMI_ROOT = pathlib.Path( os.getenv( diff --git a/tests/test_pytc_runtime_routes.py b/tests/test_pytc_runtime_routes.py index 63e6ddf..c4219de 100644 --- a/tests/test_pytc_runtime_routes.py +++ b/tests/test_pytc_runtime_routes.py @@ -45,9 +45,7 @@ def test_start_tensorboard_without_log_path_returns_400(self): def test_training_logs_route_returns_worker_payload(self): payload = {"phase": "running", "text": "hello", "lines": ["hello"]} - with patch( - "server_pytc.main.get_training_process_logs", return_value=payload - ): + with patch("server_pytc.main.get_training_process_logs", return_value=payload): response = self.client.get("/training_logs") self.assertEqual(response.status_code, 200) diff --git a/uv.lock b/uv.lock index 5a255c3..1a23b53 100644 --- a/uv.lock +++ b/uv.lock @@ -102,12 +102,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] -[[package]] -name = "antlr4-python3-runtime" -version = "4.9.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034, upload-time = "2021-11-06T17:52:23.524Z" } - [[package]] name = "anyio" version = "4.12.1" @@ -122,6 +116,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + [[package]] name = "argon2-cffi" version = "25.1.0" @@ -160,12 +163,46 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ee/82/82745642d3c46e7cea25e1885b014b033f4693346ce46b7f47483cf5d448/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520", size = 29187, upload-time = "2025-07-30T10:02:03.674Z" }, ] +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + [[package]] name = "asciitree" version = "0.3.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/6a/885bc91484e1aa8f618f6f0228d76d0e67000b0fdd6090673b777e311913/asciitree-0.3.3.tar.gz", hash = "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e", size = 3951, upload-time = "2016-09-05T19:10:42.681Z" } +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, +] + [[package]] name = "async-timeout" version = "4.0.3" @@ -190,6 +227,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + [[package]] name = "bcrypt" version = "5.0.0" @@ -232,6 +278,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" }, ] +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737, upload-time = "2025-11-30T15:08:26.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, +] + [[package]] name = "black" version = "26.1.0" @@ -261,6 +320,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e4/3d/51bdb3ecbfadfaf825ec0c75e1de6077422b4afa2091c6c9ba34fbfc0c2d/black-26.1.0-py3-none-any.whl", hash = "sha256:1054e8e47ebd686e078c0bb0eaf31e6ce69c966058d122f2c0c950311f9f3ede", size = 204010, upload-time = "2026-01-18T04:50:09.978Z" }, ] +[[package]] +name = "bleach" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22", size = 203533, upload-time = "2025-10-27T17:57:39.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6", size = 164437, upload-time = "2025-10-27T17:57:37.538Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + [[package]] name = "certifi" version = "2026.1.4" @@ -369,26 +445,12 @@ wheels = [ ] [[package]] -name = "connected-components-3d" -version = "3.26.1" +name = "comm" +version = "0.2.3" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/db/f5/7d2f66ef47b8496460e0738fdb349c7daa88ea6d39047a840a57364f8bb3/connected_components_3d-3.26.1.tar.gz", hash = "sha256:2f558954c3f732d404fc9b380a36a934ba9216c54e387e3d32439fd35ed48bbb", size = 78353, upload-time = "2025-11-03T17:20:37.337Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/ec/ad230171e96793b4a70696eef2c5d347029d3532cb443702fa087078b0cb/connected_components_3d-3.26.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:291a060c484c0b8b72a17ac1c17fe87e4cf8ace09b72f92e78ad1f3b4485b1b0", size = 791755, upload-time = "2025-11-03T17:19:32.106Z" }, - { url = "https://files.pythonhosted.org/packages/05/e8/a0fb6d241ef3cc6b51596af6052550f2704ee0ec7740615f55ab49f2379d/connected_components_3d-3.26.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f64e931a8e523814fd14609a4778ccbe027f39267852f76fc1419c2af655ac05", size = 688042, upload-time = "2025-11-03T17:19:34.325Z" }, - { url = "https://files.pythonhosted.org/packages/64/2f/99ec0706d73f34d7d645de0539e6089081d36102d88cea4c0daf62c0e172/connected_components_3d-3.26.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50859da852a8539993aa72fa01876b49e19585e7a1855ac8561919f261c97be6", size = 4257671, upload-time = "2025-11-03T17:19:35.927Z" }, - { url = "https://files.pythonhosted.org/packages/2e/66/a7898038932d26bb117205fef090ad2c4d7eb9347bd6099df65e0e34941e/connected_components_3d-3.26.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e889d1786b1ff6957f5f49db8619ab8069f62aa3224aa64439fcb62d8d7f299", size = 4588657, upload-time = "2025-11-03T17:19:38.27Z" }, - { url = "https://files.pythonhosted.org/packages/83/7c/04a41ee31d277383a254d86dcc07e243197163ac17a391e5da6b0809a87c/connected_components_3d-3.26.1-cp310-cp310-win32.whl", hash = "sha256:c385d6695f9995b4d126fd6c6e45eb30459630cdfe74e78f52fb44dbdb826df0", size = 569496, upload-time = "2025-11-03T17:19:41.693Z" }, - { url = "https://files.pythonhosted.org/packages/a8/c5/07ccaf426210cbd4e9954b77ec827ee2472f858a18880f3d450592350bd6/connected_components_3d-3.26.1-cp310-cp310-win_amd64.whl", hash = "sha256:f5ce2319b3d51eac11a6f430729935e01120dd281d0ef30269788d933fe1a0c4", size = 521247, upload-time = "2025-11-03T17:19:40.266Z" }, - { url = "https://files.pythonhosted.org/packages/d4/7f/d832e2f0cfe8476cfadb3f9d0e2e152c35d21f7dd6e30a96d865ddfbc189/connected_components_3d-3.26.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1819fbcd034f96a995066d5020a5a29b99fb5f3d9b373e3e4e52f9abb0e4808", size = 789472, upload-time = "2025-11-03T17:19:43.165Z" }, - { url = "https://files.pythonhosted.org/packages/de/68/e8bd3a5434a6f2cec234446693e3f491c1cc6f704b2e76505c62f9a0fcd0/connected_components_3d-3.26.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9127d142dd8d161612fb0ca899cfc19d83fb14c67596446428932f4dce178094", size = 690644, upload-time = "2025-11-03T17:19:44.143Z" }, - { url = "https://files.pythonhosted.org/packages/2e/77/1f9528dc38cedcb1cd0036c8c2fc9ba951d8009c09fd0aa0738b3faa8075/connected_components_3d-3.26.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08c281f9eae37221ba8eeab4feb80aad8acd478461d104c7e052b21def7e4816", size = 4363718, upload-time = "2025-11-03T17:19:45.942Z" }, - { url = "https://files.pythonhosted.org/packages/d0/bd/6266ce161a2030c0173cfa0da4d3efe7cd599cc70e3758167cb3b7947180/connected_components_3d-3.26.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd0ffb1e5dd5f3a86f72241db45b670b3bbc7b06d1f1b3950e135091766d68be", size = 4685381, upload-time = "2025-11-03T17:19:47.974Z" }, - { url = "https://files.pythonhosted.org/packages/1f/38/6042c6d8c0118c6a53c83434fc6804a2d2bcb18485854368bb971ee2b584/connected_components_3d-3.26.1-cp311-cp311-win32.whl", hash = "sha256:497de338400befa1a60e4a27cca7cc1393a52140a4790aba248b5b21fbb1428d", size = 568133, upload-time = "2025-11-03T17:19:51.891Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d7/0335fc9e969091e8c3e38bad059b622b0009c779aca44faa29095b78bc0d/connected_components_3d-3.26.1-cp311-cp311-win_amd64.whl", hash = "sha256:ae86c2e195836750facbbbe88414370e711cf17e68ae110f66b7bd98ea90611f", size = 518515, upload-time = "2025-11-03T17:19:50.181Z" }, + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, ] [[package]] @@ -465,30 +527,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, ] -[[package]] -name = "crackle-codec" -version = "0.36.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastremap" }, - { name = "google-crc32c" }, - { name = "numpy" }, - { name = "pybind11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a0/a5/3eb3f748f2a9e80911511af967b8e69721288b56096af50982eea5e5476d/crackle_codec-0.36.0.tar.gz", hash = "sha256:d6e619853dd6debceecbbd252515da00fddb08c588fa64abacbf5950d34785d2", size = 145350, upload-time = "2025-10-31T22:46:37.182Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/90/d92b3d4bdc7c231991cd1534092447781e42b6ada71ede9e3a7d7d31af2d/crackle_codec-0.36.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b536a8ccf8830c05ca740888e30cd5f8d88724ec0f911b6df05dabc53fe6b779", size = 490611, upload-time = "2025-10-31T22:46:07.14Z" }, - { url = "https://files.pythonhosted.org/packages/98/fa/cfaa5e54d78022c787cdb4b143ddd8354dabf871301c5d3335767cf03e42/crackle_codec-0.36.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c480056d10249137b737541f889637b8017d06449d35721a74324774188bd4e8", size = 430113, upload-time = "2025-10-31T22:46:08.896Z" }, - { url = "https://files.pythonhosted.org/packages/43/82/6025c118d700be2c6e5bec4ec7444c10fd54dd36a06d3b7a0805eacc8d3b/crackle_codec-0.36.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:592f68b4bb4001c13a75e4f7ed6c073b78be2175c29665a82344d490dd130ad5", size = 457761, upload-time = "2025-10-31T22:46:10.247Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a5/976085448663d057f59f4baa0afd06ab1348b3193eabfde093d8a603eb29/crackle_codec-0.36.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df2097131f9fe143574b79c21982325f48459cac0ef2d2a015c0eb52e1db906", size = 473427, upload-time = "2025-10-31T22:46:11.533Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9c/3c4d243147ffaeff3cac1e4e3bf05b3446c2bff96aa1155a88ffcdb07b88/crackle_codec-0.36.0-cp310-cp310-win_amd64.whl", hash = "sha256:57db09c1536df847788c1d8048f8979301d88194d8a3017e5a82f2b575b3e7e0", size = 310982, upload-time = "2025-10-31T22:46:12.781Z" }, - { url = "https://files.pythonhosted.org/packages/14/ac/f75225bb5be2828e9246686d71aaea3200345a47b6b644db2642f033c280/crackle_codec-0.36.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b40719622e37501eb1c2c496a3d134a5f00fe663029cad42eb6a826ec2dfe30", size = 492609, upload-time = "2025-10-31T22:46:13.833Z" }, - { url = "https://files.pythonhosted.org/packages/70/db/f979460d39527f598d463267281eded150631f62365f3cc946b860cd27cc/crackle_codec-0.36.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8c5423887f92613d18a103560d1ef883c2a2db6ef9d5c3c95e979b12bd70bb82", size = 431340, upload-time = "2025-10-31T22:46:14.799Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ff/0381a71f5c00fda001bab35bc6b48e91c86a389545cbeb5cf3fc38b0a8f4/crackle_codec-0.36.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b34e6fed19085f421dacd3533083e35965622dfa166b8a96ba4a82a2a67fd264", size = 458087, upload-time = "2025-10-31T22:46:16.26Z" }, - { url = "https://files.pythonhosted.org/packages/b3/70/92a9ce9a17536a411b3397e881ce90a3efff918515fcc47db6eb6709dbe9/crackle_codec-0.36.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8594a9b111eb2f2ab0fb99b657af2ce8d753b85844f085785e7a28aa23e8a2f0", size = 474205, upload-time = "2025-10-31T22:46:17.652Z" }, - { url = "https://files.pythonhosted.org/packages/ad/96/c24bc14609103b1bc22ca1031e5ba8edfbeb8e1b8464fe113332c124863f/crackle_codec-0.36.0-cp311-cp311-win_amd64.whl", hash = "sha256:aa99fbce3754dad6c081b8f522baf527bbc4811f437da4f0d2aa2f50a7d02b85", size = 312132, upload-time = "2025-10-31T22:46:19.042Z" }, -] - [[package]] name = "cryptography" version = "46.0.4" @@ -604,36 +642,38 @@ wheels = [ ] [[package]] -name = "dijkstra3d" -version = "1.15.2" +name = "debugpy" +version = "1.8.20" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/c5/f03b5c00d4fee861bc30b3bb7a412f601fb29784954f36ca0bc595696274/dijkstra3d-1.15.2.tar.gz", hash = "sha256:f5db0e21bca8a1d7bcedc103d55757b0c030d76d2d62228b6536550952c1e5db", size = 65198, upload-time = "2025-11-06T04:42:31.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/94/7fb0fc4b46f8741b8cef1f10c84ec2e4f8aaa2c01d07e67f1891eb6afd17/dijkstra3d-1.15.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f636f62d0b01884b1189f61d2ecabb47f87190dc9e532dadbc6c7e8d9887101d", size = 340172, upload-time = "2025-11-06T04:41:06.222Z" }, - { url = "https://files.pythonhosted.org/packages/74/00/6048321db5fb4840e39821f5811d8ff9e94d30cdc98dc919c65d54eb8f49/dijkstra3d-1.15.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f44f630f9a87855dbfeefeb5ecc8ccce667528f067bb9e088e248aaf8a5dcf73", size = 297743, upload-time = "2025-11-06T04:41:08.431Z" }, - { url = "https://files.pythonhosted.org/packages/a7/28/d690de28c29f525c9d53798a7a5e36bcc39fac74f75fd49c30066952a41b/dijkstra3d-1.15.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c373dcbafe10ba5f9da1461bf6ae25c689bdcee3a4a2d9ef8a02037da6a67fa", size = 3486512, upload-time = "2025-11-06T04:41:09.828Z" }, - { url = "https://files.pythonhosted.org/packages/45/41/4c46ede55b320a7183bc45ffc0af98d1556fa1c6e2b5ae191415add5d137/dijkstra3d-1.15.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d432652d84f26609b2b1d36c226c25dc4a7d7562f39007c952b305969134cb2", size = 3398209, upload-time = "2025-11-06T04:41:11.644Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1b/c269fb9398b0b5a2e7a1aea29a2909f3abdea7010990747b36133bdda927/dijkstra3d-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81de5a8e222d68002315e11c04f837533488c9c0e975c6ff1595f50a01140cba", size = 4309238, upload-time = "2025-11-06T04:41:13.301Z" }, - { url = "https://files.pythonhosted.org/packages/69/a4/2fc577f7c8a541be773e4d75279fcbcd1b4a56a4c7445280924bf5781be2/dijkstra3d-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:52321114974afd9f8340fc65f2ed234001c2a859c440397d35253184d98c7256", size = 4373361, upload-time = "2025-11-06T04:41:14.908Z" }, - { url = "https://files.pythonhosted.org/packages/87/ce/e24a0eba72affbec9d62783fe390bf09e1514f21917b0a2d19e3722fafe5/dijkstra3d-1.15.2-cp310-cp310-win32.whl", hash = "sha256:378a57e5ad57e603cd087ad4b1423dc45c48507e40ff9f5fdab4b11d32e48bbe", size = 262266, upload-time = "2025-11-06T04:41:18.153Z" }, - { url = "https://files.pythonhosted.org/packages/d4/95/0034db41d13ea655298baa815382e55f44da22bb09c8cafc3d28ca7ad67a/dijkstra3d-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:9c17277a8ae863b4edccb9df49f7f29d182c452fb9afcdc33e70b18092bb8157", size = 266392, upload-time = "2025-11-06T04:41:17.037Z" }, - { url = "https://files.pythonhosted.org/packages/51/38/e30f2d8b359128e9fbadfed51e0aa5ca18890dd0bbbc5f9d69ab6ed6a13e/dijkstra3d-1.15.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3878120086015c4c903a60774b629f63ae48e935ae2c601bf60d16a9dae2071a", size = 338429, upload-time = "2025-11-06T04:41:19.578Z" }, - { url = "https://files.pythonhosted.org/packages/e0/29/6ded8e5dd045e27dbebb93f79a195af56969f371f83b7f3da35e2e23c4d6/dijkstra3d-1.15.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a2ae3da42c5eb60c343b239973a35b98ea5e5d08c04c70856c502f4eb78b64f", size = 295535, upload-time = "2025-11-06T04:41:21.114Z" }, - { url = "https://files.pythonhosted.org/packages/de/92/b47cf53d485d70b4ce01364417a2614f9641d8f399cac4dd1dc7f8486987/dijkstra3d-1.15.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74a971ec3287b1fc5bb87dd4ca5ae06aade505af3637219ae2e9059076faf084", size = 3539360, upload-time = "2025-11-06T04:41:22.74Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d1/349115c68d5ba611417e70a25d472d0d9e5d8757e658e22fc780666eb289/dijkstra3d-1.15.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474f8f5d50c5c035f6fdcb3b08f59ffef63c21c6b35262e2b8057deecdf2b1f8", size = 3445457, upload-time = "2025-11-06T04:41:24.01Z" }, - { url = "https://files.pythonhosted.org/packages/4a/95/c6b375acdfc035b21bcf3ca3db7359a83d440fcc47557b00ebd6a8b71099/dijkstra3d-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bed27483b0a7fbde41864aa65127a8296f671143a7500648bcb2aaacebfa6aa5", size = 4367522, upload-time = "2025-11-06T04:41:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/46/cd/df68f73b583040776f7554f2fa40bcefd9238ad6254c4a3ed0f7507f35a0/dijkstra3d-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:573d3d9edc9ff7b9432ab0c62a67ee75b8e523664d20a45b261c545ed9183682", size = 4421327, upload-time = "2025-11-06T04:41:26.99Z" }, - { url = "https://files.pythonhosted.org/packages/d3/cd/d4cb0ab04ffc03e1b05a9f0b78f56f139eaf3e49ce7e01159048fa420c39/dijkstra3d-1.15.2-cp311-cp311-win32.whl", hash = "sha256:91a7b05fba8da6f7515c4bdbd3cab53f12ad0801af023ac0fbf0cafa60e84505", size = 261372, upload-time = "2025-11-06T04:41:28.979Z" }, - { url = "https://files.pythonhosted.org/packages/d3/d8/97e2d20583f11180b4df853b094702ead55d4a7772de9e1d980674bf4be5/dijkstra3d-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:8c1755f37dfed167b9ee7c7ac3ceb05d5ef045a89e10db550168e83a661c634a", size = 266096, upload-time = "2025-11-06T04:41:28.073Z" }, + { url = "https://files.pythonhosted.org/packages/71/be/8bd693a0b9d53d48c8978fa5d889e06f3b5b03e45fd1ea1e78267b4887cb/debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64", size = 2099192, upload-time = "2026-01-29T23:03:29.707Z" }, + { url = "https://files.pythonhosted.org/packages/77/1b/85326d07432086a06361d493d2743edd0c4fc2ef62162be7f8618441ac37/debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642", size = 3088568, upload-time = "2026-01-29T23:03:31.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/60/3e08462ee3eccd10998853eb35947c416e446bfe2bc37dbb886b9044586c/debugpy-1.8.20-cp310-cp310-win32.whl", hash = "sha256:c29dd9d656c0fbd77906a6e6a82ae4881514aa3294b94c903ff99303e789b4a2", size = 5284399, upload-time = "2026-01-29T23:03:33.678Z" }, + { url = "https://files.pythonhosted.org/packages/72/43/09d49106e770fe558ced5e80df2e3c2ebee10e576eda155dcc5670473663/debugpy-1.8.20-cp310-cp310-win_amd64.whl", hash = "sha256:3ca85463f63b5dd0aa7aaa933d97cbc47c174896dcae8431695872969f981893", size = 5316388, upload-time = "2026-01-29T23:03:35.095Z" }, + { url = "https://files.pythonhosted.org/packages/51/56/c3baf5cbe4dd77427fd9aef99fcdade259ad128feeb8a786c246adb838e5/debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b", size = 2208318, upload-time = "2026-01-29T23:03:36.481Z" }, + { url = "https://files.pythonhosted.org/packages/9a/7d/4fa79a57a8e69fe0d9763e98d1110320f9ecd7f1f362572e3aafd7417c9d/debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344", size = 3171493, upload-time = "2026-01-29T23:03:37.775Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f2/1e8f8affe51e12a26f3a8a8a4277d6e60aa89d0a66512f63b1e799d424a4/debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec", size = 5209240, upload-time = "2026-01-29T23:03:39.109Z" }, + { url = "https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb", size = 5233481, upload-time = "2026-01-29T23:03:40.659Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, ] [[package]] -name = "dill" -version = "0.4.1" +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] [[package]] @@ -660,29 +700,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/a3/460c57f094a4a165c84a1341c373b0a4f5ec6ac244b998d5021aade89b77/ecdsa-0.19.1-py2.py3-none-any.whl", hash = "sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3", size = 150607, upload-time = "2025-03-13T11:52:41.757Z" }, ] -[[package]] -name = "edt" -version = "3.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a5/ca/432c11df2a261fcae71dea11eeabfc5affd8ada22aaafa378212c1e9c9e2/edt-3.1.1.tar.gz", hash = "sha256:4b0ab5d898077eda76d1ebdec6e3a4085fd33d4c85195d71abf464ff225915c5", size = 3234159, upload-time = "2026-03-01T05:20:30.695Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/c6/94335dd01d33fff33b02bc7c79c4b2ec4664ccbbe9b55ccb73868555d6c0/edt-3.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e249ab445adc21ec9c458a3a0215e9bcf3e487154947a4b9172c5506bf2ed39e", size = 274429, upload-time = "2026-03-01T05:19:18.225Z" }, - { url = "https://files.pythonhosted.org/packages/e0/3a/e99a0b59cf953a2c2b3e5e9451389e4b8f40579614229aef44f13f2f8b6a/edt-3.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:11ee8df9bab9e1649190d2a286a9b35a2dea90bf6f60fb9a299c8a8371e258c7", size = 254093, upload-time = "2026-03-01T05:19:19.869Z" }, - { url = "https://files.pythonhosted.org/packages/39/89/358cf81ac3c94cf2c8e243788e6282cb1ec7980c64d12859cbdc016865d8/edt-3.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09b6fd94a7146305a9c7d964551d6148249c8692e08d6065a56aa79ccd625585", size = 2836166, upload-time = "2026-03-01T05:19:21.408Z" }, - { url = "https://files.pythonhosted.org/packages/2e/d6/48f59656a8cf4d9672700d42585d83a9dc065f34dd1786ac07f320cc8da0/edt-3.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c8108ce1e4ee328c5bf32948d8da22e78df955147dc3eac4c80ba3de9512f449", size = 2902642, upload-time = "2026-03-01T05:19:23.195Z" }, - { url = "https://files.pythonhosted.org/packages/ad/be/81c0cad69f306fe1ef34a1b86e066e13021c0e813e858eada4fa2810deaa/edt-3.1.1-cp310-cp310-win32.whl", hash = "sha256:15dee70100c553ddf71979c5d7c297a0386a02970b3b18d8ee5a5b778bd51996", size = 175131, upload-time = "2026-03-01T05:19:28.133Z" }, - { url = "https://files.pythonhosted.org/packages/fe/4d/999a42a45a75cbd63811aca365b538c1ed72456d1243fc00edaa2e2e6e11/edt-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d6692f010a3ab6fc2b802f22173d8d6ed5e4154cf524a9821f273870f6af45b", size = 210140, upload-time = "2026-03-01T05:19:26.709Z" }, - { url = "https://files.pythonhosted.org/packages/83/50/fa05c178abd6fcfe4369c7b651650fe3395558320766d0334f2606642de9/edt-3.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ce45f983747ba5a096e35dbfc13beafcbe2c6d2746d87c06915ddeac16af7e6", size = 273024, upload-time = "2026-03-01T05:19:29.312Z" }, - { url = "https://files.pythonhosted.org/packages/80/0b/53ba9d3727b1b87a77449e36415a20885718e21886bdff528c1e2a5beb27/edt-3.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fe86dafa1e4703c670ab5e36cd9334b9a15eb0c97ff42700a544f438bafbfc8", size = 253067, upload-time = "2026-03-01T05:19:30.804Z" }, - { url = "https://files.pythonhosted.org/packages/c6/98/c56d761056c6712edd57f384486508431889f66da850fb32e17f78fee1df/edt-3.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9f238097b3f6a93bdbf1860d0efa42bc88a868e5416ff0a18316e001c9c355a", size = 2886678, upload-time = "2026-03-01T05:19:32.081Z" }, - { url = "https://files.pythonhosted.org/packages/55/9d/4e857ba351d6d8cffb7a375b0e557c0feb8a2af8da9cfe331b54fa98c7e4/edt-3.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3630630459b8ad32b12bb9840f204cf405b2c64fa827140e55762528364d7a28", size = 2947202, upload-time = "2026-03-01T05:19:34.019Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c6/44fa2239478d01c4d02b29dcd36a220f2415dcad8bb609776658e580add5/edt-3.1.1-cp311-cp311-win32.whl", hash = "sha256:25134ae70b393682110f081ecfdc773fbd3661b551b6225db96950a69bbedb35", size = 174525, upload-time = "2026-03-01T05:19:36.539Z" }, - { url = "https://files.pythonhosted.org/packages/3e/44/2664e9419358cced35395446c2cddfba9a5b0d538543d779b72a53b40b71/edt-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:9c2694cdc1651def1cd78331f90bf45efaa4cbd4d9e753acc60a3033b422c529", size = 210170, upload-time = "2026-03-01T05:19:35.515Z" }, -] - [[package]] name = "einops" version = "0.8.2" @@ -704,6 +721,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + [[package]] name = "faiss-cpu" version = "1.12.0" @@ -755,26 +781,12 @@ wheels = [ ] [[package]] -name = "fastremap" -version = "1.17.7" +name = "fastjsonschema" +version = "2.21.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/c8/d581816df8ee7ab70cd2dd8ee4e60169ceab8062224cc090863e6715f33d/fastremap-1.17.7.tar.gz", hash = "sha256:42776172867d8f2b3348754cf29405ba878af4b06917f12a969514d3097910dc", size = 50034, upload-time = "2025-09-29T23:28:13.031Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/fe/774b263411d4ccc1f46789f36a24e85706f55e0b53f67cf909b702271b2c/fastremap-1.17.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9a759677a897df0eb7ad1b466de18d00cfbdafb0ec4851b433b7891eea7cd8e0", size = 811269, upload-time = "2025-09-29T23:27:15.632Z" }, - { url = "https://files.pythonhosted.org/packages/eb/fa/b600288be8990be1e4c668def2f5575a2f57c1c3554d377b8ef157b5d762/fastremap-1.17.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a82b3b67967047c31d9bab8452b3a3fc4e17b143eb9fd98b9cb9e0bfe990840d", size = 652567, upload-time = "2025-09-29T23:27:17.63Z" }, - { url = "https://files.pythonhosted.org/packages/a5/45/8509e51619a3d140051217ee30ce5bcb25d7ba8a2ebd07325b00034a5089/fastremap-1.17.7-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7455ce285a8e431e41138f7b5c6b7c9cd817f419bc4245f1de1d095f0e91feb", size = 7067506, upload-time = "2025-09-29T23:27:18.933Z" }, - { url = "https://files.pythonhosted.org/packages/78/15/6890a8c4c1c90f7a0c0811207ece87082f9fa994ca6ca002e92f65a2c877/fastremap-1.17.7-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b05fb72432faefeebbcb9e0f49a175730f0cb95fd350b584855df263f33c8edc", size = 7223455, upload-time = "2025-09-29T23:27:21.146Z" }, - { url = "https://files.pythonhosted.org/packages/9a/89/bdbb39df082e467338d139c47bb8c8dbe5d8347837afd81ea4b0028a4e2f/fastremap-1.17.7-cp310-cp310-win32.whl", hash = "sha256:f49f79c28d84632de4eb254b7342ae37fa9fa6e79ecd4cc569a15014ee99eb4a", size = 498013, upload-time = "2025-09-29T23:27:23.549Z" }, - { url = "https://files.pythonhosted.org/packages/9e/aa/8f88be7fd7521a79d522fcd13783dd702795c37d977713305895191c5ee9/fastremap-1.17.7-cp310-cp310-win_amd64.whl", hash = "sha256:aabb9ec3d93b75f8f97651cf3067c7415286461296dea5e7e9c0c6ddc9d9858b", size = 684136, upload-time = "2025-09-29T23:27:22.571Z" }, - { url = "https://files.pythonhosted.org/packages/be/7f/98bc1ab6ab9b389a72ed1a97dc34eb57a8e6beb473117c8942481f74e6ca/fastremap-1.17.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4610492ea19f1cc916a05e9195b67de11dc98a18e905de1abf821b2ca2ca1fac", size = 811862, upload-time = "2025-09-29T23:27:24.546Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b6/b88d2a30f50708249bb0414f0581d0f7ccb3785b1a3ca6588565920988f2/fastremap-1.17.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6130394fc92777d08ca992e70ff6307fe1ef928d2831140ff63ab27f36b6600", size = 655315, upload-time = "2025-09-29T23:27:26.006Z" }, - { url = "https://files.pythonhosted.org/packages/f9/fd/70d7e5ee9b77c3ddbe6d9c479202cf04a0f178c399d94af5993520dab51a/fastremap-1.17.7-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f77a4e48fc9614027d318d23399d91a89b62c56d97880055c538fd42c43fd6", size = 7496837, upload-time = "2025-09-29T23:27:27.344Z" }, - { url = "https://files.pythonhosted.org/packages/ff/5a/3ae0f6425c816ac74e130244c152cc5b7d7c13d5c5ff299af074f0456208/fastremap-1.17.7-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74635d268aa40ef7063319c997c1cbb70d52deeb08a3a61146a6151306c394ea", size = 7621372, upload-time = "2025-09-29T23:27:29.088Z" }, - { url = "https://files.pythonhosted.org/packages/65/9a/193ca90273394cc93d98c9b7a587d134655910e14e12d7813d97d48ed13d/fastremap-1.17.7-cp311-cp311-win32.whl", hash = "sha256:f72d6db9550d9f1308cf78e71ca1bbbedea66048439b0fe688addaedf05c37ff", size = 490649, upload-time = "2025-09-29T23:27:31.719Z" }, - { url = "https://files.pythonhosted.org/packages/71/4b/7a03f72620945f08b40285ff3640e2b0a86f80218c519c8e4c4a557ca645/fastremap-1.17.7-cp311-cp311-win_amd64.whl", hash = "sha256:67cf58fada99981ec1a5b4f3368e1b4c1c4d0f22efaa036748f97475c37ce1f3", size = 685345, upload-time = "2025-09-29T23:27:30.662Z" }, + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, ] [[package]] @@ -786,32 +798,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, ] -[[package]] -name = "fill-voids" -version = "2.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastremap" }, - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f0/11/6dff4280502b81e92a69442d6d82a343610192ccbc2638ab921ffc273505/fill_voids-2.1.1.tar.gz", hash = "sha256:469f543e4ab236cf11aacef106af8e73c730f2a90f1bfae760dc8de29d4d6634", size = 3229026, upload-time = "2025-09-03T05:28:32.579Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/db/e89af150e5e599a7a85c23e4ba54c305cc287aaff16104af59c002267541/fill_voids-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82c05c8a86bbd1e6e2047358ce6ad6722c2fb42a10fa0288749a939104ede712", size = 227581, upload-time = "2025-09-03T05:27:55.2Z" }, - { url = "https://files.pythonhosted.org/packages/50/e9/c9a60269b58527845672cf97d668d441ba8250020d047ab60c3989101313/fill_voids-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:98c70d3c372e7d54a3ce462d8828c42d00232e88f01b5c62ce78551dba99436f", size = 207316, upload-time = "2025-09-03T05:27:56.826Z" }, - { url = "https://files.pythonhosted.org/packages/ab/eb/c325d980f98643f500f872b9fcd35e428384757fd9f46cb19b3fac30cce5/fill_voids-2.1.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5209dc9112d144763b0054460570f3f1dd2d19ed485401def8cbd0d7dc25fbf8", size = 1527166, upload-time = "2025-09-03T12:19:19.287Z" }, - { url = "https://files.pythonhosted.org/packages/20/62/139f190b61784ebdf1d7b9f8084603d164fa0a7fc5eb85ea5ddd04398c9c/fill_voids-2.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f40c9f7dad4eff48d915f9e0e1d56828a99d981f02a44dba0723b054f7a70d2", size = 1538708, upload-time = "2025-09-03T05:27:58.01Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ff/773b31f59d83bc91be9ee846d8901013523ec822c4caf76b144254172dd0/fill_voids-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e9d4e76c565458568242ca97d0719199bb61781152b5fec8eed033c89bed1bc5", size = 2354805, upload-time = "2025-09-03T12:19:21.118Z" }, - { url = "https://files.pythonhosted.org/packages/87/e3/08abadba96c7b2a7e679d04852f049e4e0db459eb41d6bc8c7af9e280a45/fill_voids-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eb3a7d9c25c790ae17f3a4b7853d060c79bf73428ce44deecc1cc4e66ce81fab", size = 2405792, upload-time = "2025-09-03T05:27:59.99Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5c/6cc051d4c7a4cb3ead14fcb95da599cf19b300434d82445e7bd72b535862/fill_voids-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3dc17ccef0f7fdfee457cb0b33b16e70eedc80f0fa2a29c447991bdb64e2ae87", size = 197497, upload-time = "2025-09-03T05:28:01.427Z" }, - { url = "https://files.pythonhosted.org/packages/03/8b/70d8d8c54b42657ddc01c81fda9c326600e606161c89599809e453827861/fill_voids-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d866876f0d692b6b6d0fa5a6d42cfb62696b048286a28866d2e0fe728fb83070", size = 232090, upload-time = "2025-09-03T05:28:02.634Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1e/0e23cbcf1ad4980a8a9834037c268fb95ac63db0d4f7fa9f4472e4dd8d82/fill_voids-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec9ab0e107d9e876a580f9b954b1029fc20322158c80b2f5d925ee67236e88c9", size = 206937, upload-time = "2025-09-03T05:28:03.556Z" }, - { url = "https://files.pythonhosted.org/packages/2f/b1/8e6457707b2a7806d5c50be08950fcfb54d1e929effdbc8c5b7563015359/fill_voids-2.1.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4dc3e9cb3acceb6834b2149b8ae2e8d76cca3cf7cfcc255200881fbbef54177a", size = 1595690, upload-time = "2025-09-03T12:19:22.61Z" }, - { url = "https://files.pythonhosted.org/packages/6e/38/1c53fe0bf6a667511c93d2e634f7a5ebf8144e3d274fbcca921bd8c0e216/fill_voids-2.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac94f1a70886edbde7ea1d44b60d36d7a86bb149072c069c3e53b43f3d89d5", size = 1602603, upload-time = "2025-09-03T05:28:04.55Z" }, - { url = "https://files.pythonhosted.org/packages/f9/cc/98110bf6f916e3c82e8923b8cb9e55272ede6b2028c01117b4c2a2ddeb33/fill_voids-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:128d29c0e49bceffb748b3b35f174377b4b05da4be65e6ccfe436047924ee858", size = 2421284, upload-time = "2025-09-03T12:19:24.279Z" }, - { url = "https://files.pythonhosted.org/packages/33/c1/8cfe49f4d97e5f870a5605f84c93449a6ff8b71f9fee022badf6f28d3c27/fill_voids-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c31d529bc46d0b17328044b51a98d9773c2453c0f7daac37743ada70944269b2", size = 2462171, upload-time = "2025-09-03T05:28:06.23Z" }, - { url = "https://files.pythonhosted.org/packages/a6/b8/d33df66e9c0e637439421d7c2331f913b3374803971df5b0af067d5a6bed/fill_voids-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:cd3e21ce337bd2eabb08ea423da5ebd215abba1f7e0174f41fbc4f4b82feec85", size = 197397, upload-time = "2025-09-03T05:28:07.646Z" }, -] - [[package]] name = "fonttools" version = "4.61.1" @@ -837,6 +823,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, ] +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + [[package]] name = "frozenlist" version = "1.8.0" @@ -887,11 +882,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, ] -[package.optional-dependencies] -http = [ - { name = "aiohttp" }, -] - [[package]] name = "google-apitools" version = "0.5.35" @@ -941,6 +931,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/97/7d75fe37a7a6ed171a2cf17117177e7aab7e6e0d115858741b41e9dd4254/google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c", size = 28800, upload-time = "2025-12-16T00:40:30.322Z" }, ] +[[package]] +name = "gputil" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/0e/5c61eedde9f6c87713e89d794f01e378cfd9565847d4576fa627d758c554/GPUtil-1.4.0.tar.gz", hash = "sha256:099e52c65e512cdfa8c8763fca67f5a5c2afb63469602d5dcb4d296b3661efb9", size = 5545, upload-time = "2018-12-18T09:12:13.63Z" } + [[package]] name = "greenlet" version = "3.3.1" @@ -950,7 +946,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fe/65/5b235b40581ad75ab97dcd8b4218022ae8e3ab77c13c919f1a1dfe9171fd/greenlet-3.3.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:04bee4775f40ecefcdaa9d115ab44736cd4b9c5fba733575bfe9379419582e13", size = 273723, upload-time = "2026-01-23T15:30:37.521Z" }, { url = "https://files.pythonhosted.org/packages/ce/ad/eb4729b85cba2d29499e0a04ca6fbdd8f540afd7be142fd571eea43d712f/greenlet-3.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e1457f4fed12a50e427988a07f0f9df53cf0ee8da23fab16e6732c2ec909d4", size = 574874, upload-time = "2026-01-23T16:00:54.551Z" }, { url = "https://files.pythonhosted.org/packages/87/32/57cad7fe4c8b82fdaa098c89498ef85ad92dfbb09d5eb713adedfc2ae1f5/greenlet-3.3.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:070472cd156f0656f86f92e954591644e158fd65aa415ffbe2d44ca77656a8f5", size = 586309, upload-time = "2026-01-23T16:05:25.18Z" }, - { url = "https://files.pythonhosted.org/packages/66/66/f041005cb87055e62b0d68680e88ec1a57f4688523d5e2fb305841bc8307/greenlet-3.3.1-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1108b61b06b5224656121c3c8ee8876161c491cbe74e5c519e0634c837cf93d5", size = 597461, upload-time = "2026-01-23T16:15:51.943Z" }, { url = "https://files.pythonhosted.org/packages/87/eb/8a1ec2da4d55824f160594a75a9d8354a5fe0a300fb1c48e7944265217e1/greenlet-3.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a300354f27dd86bae5fbf7002e6dd2b3255cd372e9242c933faf5e859b703fe", size = 586985, upload-time = "2026-01-23T15:32:47.968Z" }, { url = "https://files.pythonhosted.org/packages/15/1c/0621dd4321dd8c351372ee8f9308136acb628600658a49be1b7504208738/greenlet-3.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e84b51cbebf9ae573b5fbd15df88887815e3253fc000a7d0ff95170e8f7e9729", size = 1547271, upload-time = "2026-01-23T16:04:18.977Z" }, { url = "https://files.pythonhosted.org/packages/9d/53/24047f8924c83bea7a59c8678d9571209c6bfe5f4c17c94a78c06024e9f2/greenlet-3.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0093bd1a06d899892427217f0ff2a3c8f306182b8c754336d32e2d587c131b4", size = 1613427, upload-time = "2026-01-23T15:33:44.428Z" }, @@ -958,7 +953,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/e8/2e1462c8fdbe0f210feb5ac7ad2d9029af8be3bf45bd9fa39765f821642f/greenlet-3.3.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c", size = 274974, upload-time = "2026-01-23T15:31:02.891Z" }, { url = "https://files.pythonhosted.org/packages/7e/a8/530a401419a6b302af59f67aaf0b9ba1015855ea7e56c036b5928793c5bd/greenlet-3.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd", size = 577175, upload-time = "2026-01-23T16:00:56.213Z" }, { url = "https://files.pythonhosted.org/packages/8e/89/7e812bb9c05e1aaef9b597ac1d0962b9021d2c6269354966451e885c4e6b/greenlet-3.3.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5", size = 590401, upload-time = "2026-01-23T16:05:26.365Z" }, - { url = "https://files.pythonhosted.org/packages/70/ae/e2d5f0e59b94a2269b68a629173263fa40b63da32f5c231307c349315871/greenlet-3.3.1-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:67ea3fc73c8cd92f42467a72b75e8f05ed51a0e9b1d15398c913416f2dafd49f", size = 601161, upload-time = "2026-01-23T16:15:53.456Z" }, { url = "https://files.pythonhosted.org/packages/5c/ae/8d472e1f5ac5efe55c563f3eabb38c98a44b832602e12910750a7c025802/greenlet-3.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2", size = 590272, upload-time = "2026-01-23T15:32:49.411Z" }, { url = "https://files.pythonhosted.org/packages/a8/51/0fde34bebfcadc833550717eade64e35ec8738e6b097d5d248274a01258b/greenlet-3.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9", size = 1550729, upload-time = "2026-01-23T16:04:20.867Z" }, { url = "https://files.pythonhosted.org/packages/16/c9/2fb47bee83b25b119d5a35d580807bb8b92480a54b68fef009a02945629f/greenlet-3.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f", size = 1615552, upload-time = "2026-01-23T15:33:45.743Z" }, @@ -1104,21 +1098,135 @@ wheels = [ ] [[package]] -name = "importlib-resources" -version = "6.5.2" +name = "ipykernel" +version = "7.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/8c/f834fbf984f691b4f7ff60f50b514cc3de5cc08abfc3295564dd89c5e2e7/importlib_resources-6.5.2.tar.gz", hash = "sha256:185f87adef5bcc288449d98fb4fba07cea78bc036455dd44c5fc4a2fe78fed2c", size = 44693, upload-time = "2025-01-03T18:51:56.698Z" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/ed/1f1afb2e9e7f38a545d628f864d562a5ae64fe6f7a10e28ffb9b185b4e89/importlib_resources-6.5.2-py3-none-any.whl", hash = "sha256:789cfdc3ed28c78b67a06acb8126751ced69a3d5f79c095a98298cd8a760ccec", size = 37461, upload-time = "2025-01-03T18:51:54.306Z" }, + { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" }, ] [[package]] -name = "iniconfig" -version = "2.3.0" +name = "ipython" +version = "8.39.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'darwin'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform != 'darwin' and sys_platform != 'linux')", +] +dependencies = [ + { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version < '3.11'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi", marker = "python_full_version < '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, + { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, + { name = "pygments", marker = "python_full_version < '3.11'" }, + { name = "stack-data", marker = "python_full_version < '3.11'" }, + { name = "traitlets", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/18/f8598d287006885e7136451fdea0755af4ebcbfe342836f24deefaed1164/ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624", size = 5513971, upload-time = "2026-03-27T10:02:13.94Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/56/4cc7fc9e9e3f38fd324f24f8afe0ad8bb5fa41283f37f1aaf9de0612c968/ipython-8.39.0-py3-none-any.whl", hash = "sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f", size = 831849, upload-time = "2026-03-27T10:02:07.846Z" }, +] + +[[package]] +name = "ipython" +version = "9.10.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.11' and sys_platform == 'darwin'", + "python_full_version >= '3.11' and platform_machine == 'aarch64' and sys_platform == 'linux'", + "(python_full_version >= '3.11' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform != 'darwin' and sys_platform != 'linux')", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "python_full_version >= '3.11'" }, + { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, + { name = "jedi", marker = "python_full_version >= '3.11'" }, + { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, + { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, + { name = "pygments", marker = "python_full_version >= '3.11'" }, + { name = "stack-data", marker = "python_full_version >= '3.11'" }, + { name = "traitlets", marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/25/daae0e764047b0a2480c7bbb25d48f4f509b5818636562eeac145d06dfee/ipython-9.10.1.tar.gz", hash = "sha256:e170e9b2a44312484415bdb750492699bf329233b03f2557a9692cce6466ada4", size = 4426663, upload-time = "2026-03-27T09:53:26.244Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/09/ba70f8d662d5671687da55ad2cc0064cf795b15e1eea70907532202e7c97/ipython-9.10.1-py3-none-any.whl", hash = "sha256:82d18ae9fb9164ded080c71ef92a182ee35ee7db2395f67616034bebb020a232", size = 622827, upload-time = "2026-03-27T09:53:24.566Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] [[package]] @@ -1142,6 +1250,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, ] +[[package]] +name = "json5" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/4b/6f8906aaf67d501e259b0adab4d312945bb7211e8b8d4dcc77c92320edaa/json5-0.14.0.tar.gz", hash = "sha256:b3f492fad9f6cdbced8b7d40b28b9b1c9701c5f561bef0d33b81c2ff433fefcb", size = 52656, upload-time = "2026-03-27T22:50:48.108Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/42/cf027b4ac873b076189d935b135397675dac80cb29acb13e1ab86ad6c631/json5-0.14.0-py3-none-any.whl", hash = "sha256:56cf861bab076b1178eb8c92e1311d273a9b9acea2ccc82c276abf839ebaef3a", size = 36271, upload-time = "2026-03-27T22:50:47.073Z" }, +] + [[package]] name = "jsonpatch" version = "1.33" @@ -1164,41 +1281,244 @@ wheels = [ ] [[package]] -name = "kimimaro" -version = "5.8.1" +name = "jsonschema" +version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "click" }, - { name = "connected-components-3d" }, - { name = "dijkstra3d" }, - { name = "edt" }, - { name = "fastremap" }, - { name = "fill-voids" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy" }, - { name = "osteoid" }, - { name = "pathos" }, - { name = "pytest" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "tqdm" }, - { name = "xs3d" }, + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "rfc3987-syntax" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython", version = "8.39.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "ipython", version = "9.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "packaging" }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b", size = 62196, upload-time = "2025-02-03T17:23:41.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb", size = 19430, upload-time = "2025-02-03T17:23:38.643Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "overrides" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "(os_name == 'nt' and platform_machine != 'aarch64' and sys_platform == 'linux') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5", size = 731949, upload-time = "2025-08-21T14:42:54.042Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f", size = 388221, upload-time = "2025-08-21T14:42:52.034Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "(os_name == 'nt' and platform_machine != 'aarch64' and sys_platform == 'linux') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.5.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/d5/730628e03fff2e8a8e8ccdaedde1489ab1309f9a4fa2536248884e30b7c7/jupyterlab-4.5.6.tar.gz", hash = "sha256:642fe2cfe7f0f5922a8a558ba7a0d246c7bc133b708dfe43f7b3a826d163cf42", size = 23970670, upload-time = "2026-03-11T14:17:04.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/1b/dad6fdcc658ed7af26fdf3841e7394072c9549a8b896c381ab49dd11e2d9/jupyterlab-4.5.6-py3-none-any.whl", hash = "sha256:d6b3dac883aa4d9993348e0f8e95b24624f75099aed64eab6a4351a9cdd1e580", size = 12447124, upload-time = "2026-03-11T14:17:00.229Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/20/26134b124b3f06d899ebef7ae3859e8a0a2f002f5366371d93213ed06614/kimimaro-5.8.1.tar.gz", hash = "sha256:d8bb3e7c5eaa2ba4ded5362cea864cd7f1c3411d6eaf745bd89872f6faf2a581", size = 524327, upload-time = "2026-01-16T17:10:51.064Z" } + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/1f/de526141168cf8a1e787c70d53eb72822c5f93f673c5228ec8c22dfa0c9e/kimimaro-5.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e91957f959f2e64290ce73e7ad082ebcfd5cbd4b22c3c4312309c33aec38f073", size = 346394, upload-time = "2026-01-16T17:09:51.393Z" }, - { url = "https://files.pythonhosted.org/packages/82/47/ae6d489f455173b65263e8e3f8472790426de0d917cf0b0210396be706b9/kimimaro-5.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:91f5f35aa362edfafb4025c0eab521c4df2cc635a5a31fd1819f4e78b1426173", size = 313140, upload-time = "2026-01-16T17:09:52.9Z" }, - { url = "https://files.pythonhosted.org/packages/4c/64/f661318954ba5fa21d89029ce5809e8282dbb70afbe1a10b9f53d4fe3e0a/kimimaro-5.8.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ceb28c72bffeeb2ec6de6665e86dc46c303547bbab1427bd811b0fd53acada38", size = 2620655, upload-time = "2026-01-16T17:09:54.566Z" }, - { url = "https://files.pythonhosted.org/packages/0d/3d/5583e41b8c8c060f57d0114d8e5e9263ed4100a259e299a9f9e5e0efb270/kimimaro-5.8.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f864ef8e8b7436f9d06496cf9498b06b106b620b0a0d4956efed39c62958600f", size = 2692015, upload-time = "2026-01-16T17:09:56.253Z" }, - { url = "https://files.pythonhosted.org/packages/7f/d2/140d26044241585cddf9ea6293aad34c6a55843c7ed935c64041161b1c11/kimimaro-5.8.1-cp310-cp310-win32.whl", hash = "sha256:a9df22efc1ea0f32a5db8af8dc0f67e5e83cd1ff2b79c8bc5cacefd166ca8b15", size = 269770, upload-time = "2026-01-16T17:09:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/96/b7/121136f33875858a205cf81a572de382f89b73a21dc3d5a416ff6676b10a/kimimaro-5.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:ff9d4ca1150fa15fabbb7c4783e6983bc336bd398e2b9e189791accff5c62fd9", size = 318581, upload-time = "2026-01-16T17:09:57.61Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d5/d0cfc3fe47fe04cd0dba8aea35a06a9528524b8411a665d11c09a5b16fce/kimimaro-5.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c9614d2451b4ea411f9878f1542b506a54f4acbb2fe4fbe9038ce2e1fad6d91a", size = 347976, upload-time = "2026-01-16T17:10:00.261Z" }, - { url = "https://files.pythonhosted.org/packages/b2/92/cec2e2ec2c1b9f94d275e61a0c56af04192ad17bed79daf9eab7fcc68fa6/kimimaro-5.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20958c1d7f6ac9d0d3aadbaff8042c90b59948c87da77f4f8da82a0ec1ed904c", size = 312108, upload-time = "2026-01-16T17:10:01.323Z" }, - { url = "https://files.pythonhosted.org/packages/76/85/2fc1b41b90facd150e07e161963d210e9a1fd687cc4ad01765322a14536a/kimimaro-5.8.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22ee509971a8d01261270c08a4de922fef5e33b9af7c99ad92b0010236fab87f", size = 2749730, upload-time = "2026-01-16T17:10:02.622Z" }, - { url = "https://files.pythonhosted.org/packages/7c/75/39620a67bc49b8e9686ecc65b9d68a9c4ccd3de52d5a55db403840a1876c/kimimaro-5.8.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c1e82b38dbe9c52e44c8f9bbbe0685add4f8b1b683767461fe062bf855fccc8", size = 2818393, upload-time = "2026-01-16T17:10:04.593Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/6855fae5a2197aa4c107b83df24dffbf84b4fcee8c3245466ad0a24fef07/kimimaro-5.8.1-cp311-cp311-win32.whl", hash = "sha256:bc155d673d365f68157b9e247680effb1c334b04fbf000ff55944ff350667a0d", size = 270402, upload-time = "2026-01-16T17:10:07.63Z" }, - { url = "https://files.pythonhosted.org/packages/94/52/7329a3444cab562d3b2cd5f91df15f58bdc056b8cf941b8f8f58e6190bd8/kimimaro-5.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:09864ce03edef7ef124eb3846011c1c6abe90929578933d97628ef24289a1d72", size = 319922, upload-time = "2026-01-16T17:10:06.24Z" }, + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, ] [[package]] @@ -1422,49 +1742,24 @@ wheels = [ ] [[package]] -name = "lazy-loader" -version = "0.4" +name = "lark" +version = "1.3.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6f/6b/c875b30a1ba490860c93da4cabf479e03f584eba06fe5963f6f6644653d8/lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1", size = 15431, upload-time = "2024-04-05T13:03:12.261Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc", size = 12097, upload-time = "2024-04-05T13:03:10.514Z" }, + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, ] [[package]] -name = "lightning-utilities" -version = "0.15.3" +name = "lazy-loader" +version = "0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f1/45/7fa8f56b17dc0f0a41ec70dd307ecd6787254483549843bef4c30ab5adce/lightning_utilities-0.15.3.tar.gz", hash = "sha256:792ae0204c79f6859721ac7f386c237a33b0ed06ba775009cb894e010a842033", size = 33553, upload-time = "2026-02-22T14:48:53.348Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/f4/ead6e0e37209b07c9baa3e984ccdb0348ca370b77cea3aaea8ddbb097e00/lightning_utilities-0.15.3-py3-none-any.whl", hash = "sha256:6c55f1bee70084a1cbeaa41ada96e4b3a0fea5909e844dd335bd80f5a73c5f91", size = 31906, upload-time = "2026-02-22T14:48:52.488Z" }, -] - -[[package]] -name = "mahotas" -version = "1.4.18" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/71/bf99df8458c0ca05cb9a16f400e66c09b37b15ea124aaa3becb577555cc5/mahotas-1.4.18.tar.gz", hash = "sha256:e6bd2eea4143a24f381b30c64078503cd8ffa20ca493e39ffa29f9d024d9cf8b", size = 1533222, upload-time = "2024-07-17T21:11:56.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6b/c875b30a1ba490860c93da4cabf479e03f584eba06fe5963f6f6644653d8/lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1", size = 15431, upload-time = "2024-04-05T13:03:12.261Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/83/f291cb8d7897509e967a9bb0313b585e4ab81a45d0e4cab5e31cc599f6e3/mahotas-1.4.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0238a4665d55f936c6dfb26293e7348482cf9c71bd1caec3a896bfb988b6623b", size = 1877317, upload-time = "2024-07-17T21:10:14.071Z" }, - { url = "https://files.pythonhosted.org/packages/b9/7b/3c09b1bb0c0c045a33cef7763d094a7857c7475564e223391845f176cdb2/mahotas-1.4.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a33ef7e8bd0ff08990d08274a7d7aaaf1143540983de3e036295d6668ce12cb6", size = 1798019, upload-time = "2024-07-17T21:10:17.99Z" }, - { url = "https://files.pythonhosted.org/packages/54/1a/2f6dbb52599c9da9aac6da0f60950f6b7eed54a3d38779bf0f80d41b3eb9/mahotas-1.4.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f890b79891184a4a6dcc274da847fbf54fe4b8fa8839705af677cdb63536f22", size = 5788791, upload-time = "2024-07-17T21:10:23.018Z" }, - { url = "https://files.pythonhosted.org/packages/ed/88/075d55003e28ff9964cd72b5d3c48f37b4320ab2d209010970005aac63a0/mahotas-1.4.18-cp310-cp310-win32.whl", hash = "sha256:e1804359325ebd5a08998c7d3837ea10883a66678007662e4c849013f7d084ea", size = 1712133, upload-time = "2024-07-17T21:10:25.79Z" }, - { url = "https://files.pythonhosted.org/packages/2b/3c/2ca2b24f311586f341ba254670cc320944e7d3cf1cc741ce5a622611c668/mahotas-1.4.18-cp310-cp310-win_amd64.whl", hash = "sha256:43a605408b2e9fd77f4adb0ff301bc5c096979cab06da32788fc18c3b06378db", size = 1731332, upload-time = "2024-07-17T21:10:28.215Z" }, - { url = "https://files.pythonhosted.org/packages/6c/15/fab81001a735766f8bbe7080e714b9582817bd479b915977e748199f00d9/mahotas-1.4.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:974050ee67913ac2396b4889247577f7202038dc328b50a07f83887c56ca9774", size = 1877309, upload-time = "2024-07-17T21:10:30.758Z" }, - { url = "https://files.pythonhosted.org/packages/4f/f2/3125072f76b7809bd66748b2f6872dbeb0e72f43fdd94e73a9d3df95aa4c/mahotas-1.4.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28c93bdfefd4cf271bf2b30b69c130ab3cac5d840dcd3b5ae6e7f6d3648533aa", size = 1798029, upload-time = "2024-07-17T21:10:33.063Z" }, - { url = "https://files.pythonhosted.org/packages/81/fc/691ed6d7aedaf8caa30786e88462edd84e78d2b50d320a07937e2ce41fb1/mahotas-1.4.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f4a41dd3b49bc2e5240b265b9ab35a6793c20ddcb3b392f3ba27a0940086de6", size = 5804451, upload-time = "2024-07-17T21:10:36.365Z" }, - { url = "https://files.pythonhosted.org/packages/85/45/eded44b0d6d1e4642c87eb79b6f568b8a2cbe7183dbb6aec185ea6a54786/mahotas-1.4.18-cp311-cp311-win32.whl", hash = "sha256:a4e70ead2a2bf6e8ad9a70f9c33fe0e752edeeea1fc5e8e934efcf29d90d69f2", size = 1712194, upload-time = "2024-07-17T21:10:39.565Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0c/3710525e4d3a2cb28852cb77878d8268e3e56c52cdb4018972685a11e6cd/mahotas-1.4.18-cp311-cp311-win_amd64.whl", hash = "sha256:7a9a7b2a9e3e9d9818a901232fc68a2f7bef31483150ac39acb7d56f86e0754c", size = 1731319, upload-time = "2024-07-17T21:10:41.922Z" }, + { url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc", size = 12097, upload-time = "2024-04-05T13:03:10.514Z" }, ] [[package]] @@ -1557,6 +1852,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, ] +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mistune" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, +] + [[package]] name = "monai" version = "1.5.2" @@ -1628,32 +1947,76 @@ wheels = [ ] [[package]] -name = "multiprocess" -version = "0.70.19" +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "nbclient" +version = "0.10.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "dill" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/f2/e783ac7f2aeeed14e9e12801f22529cc7e6b7ab80928d6dcce4e9f00922d/multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897", size = 2079989, upload-time = "2026-01-19T06:47:39.744Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/b6/10832f96b499690854e574360be342a282f5f7dba58eff791299ff6c0637/multiprocess-0.70.19-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:02e5c35d7d6cd2bdc89c1858867f7bde4012837411023a4696c148c1bdd7c80e", size = 135131, upload-time = "2026-01-19T06:47:20.479Z" }, - { url = "https://files.pythonhosted.org/packages/99/50/faef2d8106534b0dc4a0b772668a1a99682696ebf17d3c0f13f2ed6a656a/multiprocess-0.70.19-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:79576c02d1207ec405b00cabf2c643c36070800cca433860e14539df7818b2aa", size = 135131, upload-time = "2026-01-19T06:47:21.879Z" }, - { url = "https://files.pythonhosted.org/packages/94/b1/0b71d18b76bf423c2e8ee00b31db37d17297ab3b4db44e188692afdca628/multiprocess-0.70.19-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6b6d78d43a03b68014ca1f0b7937d965393a670c5de7c29026beb2258f2f896", size = 135134, upload-time = "2026-01-19T06:47:23.262Z" }, - { url = "https://files.pythonhosted.org/packages/7e/aa/714635c727dbfc251139226fa4eaf1b07f00dc12d9cd2eb25f931adaf873/multiprocess-0.70.19-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1bbf1b69af1cf64cd05f65337d9215b88079ec819cd0ea7bac4dab84e162efe7", size = 144743, upload-time = "2026-01-19T06:47:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/0f/e1/155f6abf5e6b5d9cef29b6d0167c180846157a4aca9b9bee1a217f67c959/multiprocess-0.70.19-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:5be9ec7f0c1c49a4f4a6fd20d5dda4aeabc2d39a50f4ad53720f1cd02b3a7c2e", size = 144738, upload-time = "2026-01-19T06:47:26.636Z" }, - { url = "https://files.pythonhosted.org/packages/af/cb/f421c2869d75750a4f32301cc20c4b63fab6376e9a75c8e5e655bdeb3d9b/multiprocess-0.70.19-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1c3dce098845a0db43b32a0b76a228ca059a668071cfeaa0f40c36c0b1585d45", size = 144741, upload-time = "2026-01-19T06:47:27.985Z" }, - { url = "https://files.pythonhosted.org/packages/e3/45/8004d1e6b9185c1a444d6b55ac5682acf9d98035e54386d967366035a03a/multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87", size = 134948, upload-time = "2026-01-19T06:47:32.325Z" }, - { url = "https://files.pythonhosted.org/packages/86/c2/dec9722dc3474c164a0b6bcd9a7ed7da542c98af8cabce05374abab35edd/multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c", size = 144457, upload-time = "2026-01-19T06:47:33.711Z" }, - { url = "https://files.pythonhosted.org/packages/7e/82/69e539c4c2027f1e1697e09aaa2449243085a0edf81ae2c6341e84d769b6/multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5", size = 133477, upload-time = "2026-01-19T06:47:38.619Z" }, + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, ] [[package]] -name = "mypy-extensions" -version = "1.1.0" +name = "nbconvert" +version = "7.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/47/81f886b699450d0569f7bc551df2b1673d18df7ff25cc0c21ca36ed8a5ff/nbconvert-7.17.0.tar.gz", hash = "sha256:1b2696f1b5be12309f6c7d707c24af604b87dfaf6d950794c7b07acab96dda78", size = 862855, upload-time = "2026-01-29T16:37:48.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/8d5f796a792f8a25f6925a96032f098789f448571eb92011df1ae59e8ea8/nbconvert-7.17.0-py3-none-any.whl", hash = "sha256:4f99a63b337b9a23504347afdab24a11faa7d86b405e5c8f9881cd313336d518", size = 261510, upload-time = "2026-01-29T16:37:46.322Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] [[package]] @@ -1710,18 +2073,31 @@ wheels = [ ] [[package]] -name = "nibabel" -version = "5.4.2" +name = "notebook" +version = "7.5.5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "importlib-resources" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "typing-extensions" }, + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/6d/41052c48d6f6349ca0a7c4d1f6a78464de135e6d18f5829ba2510e62184c/notebook-7.5.5.tar.gz", hash = "sha256:dc0bfab0f2372c8278c457423d3256c34154ac2cc76bf20e9925260c461013c3", size = 14169167, upload-time = "2026-03-11T16:32:51.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/cbd1deb9f07446241e88f8d5fecccd95b249bca0b4e5482214a4d1714c49/notebook-7.5.5-py3-none-any.whl", hash = "sha256:a7c14dbeefa6592e87f72290ca982e0c10f5bbf3786be2a600fda9da2764a2b8", size = 14578929, upload-time = "2026-03-11T16:32:48.021Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a3/01/3d2cc510c616bc8e27be17a063070d9126f69407961594a9ae734ea51121/nibabel-5.4.2.tar.gz", hash = "sha256:d5f4b9076a13178ae7f7acf18c8dbd503ee1c4d5c0c23b85df7be87efcbb49da", size = 4663132, upload-time = "2026-03-11T13:31:52.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/d7/601b6396b33536811668935faa790112266c70661be94555999be431f86f/nibabel-5.4.2-py3-none-any.whl", hash = "sha256:553482c5f1e1034fc312edf6fb7f32236c0056439845d1c29293b7e8c98d4854", size = 3300985, upload-time = "2026-03-11T13:31:50.028Z" }, + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, ] [[package]] @@ -1957,19 +2333,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/47/4f/4a617ee93d8208d2bcf26b2d8b9402ceaed03e3853c754940e2290fed063/ollama-0.6.1-py3-none-any.whl", hash = "sha256:fc4c984b345735c5486faeee67d8a265214a31cbb828167782dc642ce0a2bf8c", size = 14354, upload-time = "2025-11-13T23:02:16.292Z" }, ] -[[package]] -name = "omegaconf" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "antlr4-python3-runtime" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120, upload-time = "2022-12-08T20:59:22.753Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500, upload-time = "2022-12-08T20:59:19.686Z" }, -] - [[package]] name = "opencv-python" version = "4.11.0.86" @@ -2049,30 +2412,12 @@ wheels = [ ] [[package]] -name = "osteoid" -version = "0.6.0" +name = "overrides" +version = "7.7.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastremap" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "numpy" }, - { name = "pybind11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e0/abbf7fe327cf560da5d222b5a9a27efab541666dcf61c3daf04fad9dd17d/osteoid-0.6.0.tar.gz", hash = "sha256:9f1db97939ee746c64dfac0b6cc980512cc193cd27cab39917852e09fd5799eb", size = 416141, upload-time = "2025-12-06T05:08:25.808Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/dc/6d8189b280fbfdc206aa05736a2a802aade10366c935b76d19d4cf9cb3e2/osteoid-0.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:57305dcf3ae84f998b7c35f02e04e817f8e6f7e0770bfea152e4eba35c94710c", size = 140051, upload-time = "2025-12-06T05:07:42.274Z" }, - { url = "https://files.pythonhosted.org/packages/a7/99/e208482af0331c3f0eaccbbf25975589c394b1c59243c2dac08bf5701896/osteoid-0.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:124310a61f0aeb53d78cd5e52c78deb8d40f9f4129fd9d7462d7e6297a260b8e", size = 124156, upload-time = "2025-12-06T05:07:44.071Z" }, - { url = "https://files.pythonhosted.org/packages/4c/98/656e999f473bfca07b298b7898094d1826d02b5c1179ece6c46cb07e5b14/osteoid-0.6.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f2ce6900d84d937a46cbfbbfdee6fd17b429f0ff48d25575293f0b77eab6dcd", size = 145131, upload-time = "2025-12-06T05:07:45.346Z" }, - { url = "https://files.pythonhosted.org/packages/b0/58/2e3ec6630fb54ddb7b80624de69246137e9b4c524d7e02e451dc41e32240/osteoid-0.6.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99e9cda5d8aca2e076e931c28bde2513a0ff6b39849eda0a40c8e6a9282e5f36", size = 152548, upload-time = "2025-12-06T05:07:46.558Z" }, - { url = "https://files.pythonhosted.org/packages/1e/6d/08191d9f8dc9d068eac31f088a3eecb07466336d724a8ad553458de0a4c5/osteoid-0.6.0-cp310-cp310-win32.whl", hash = "sha256:a53149889da92ce18e52214a7dd6b29a8f20c14e9d955fa96c2e55b692deeeeb", size = 115941, upload-time = "2025-12-06T05:07:49.114Z" }, - { url = "https://files.pythonhosted.org/packages/28/97/896e666dd3bc38a071de21f51e6f77dcc0cbb63a818f45c71011a358fb7f/osteoid-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f96fc55039c6df54f682c90d4a2b799661cb01429e3c5463e5922ceb1f2f845a", size = 123581, upload-time = "2025-12-06T05:07:47.783Z" }, - { url = "https://files.pythonhosted.org/packages/3c/3d/c61cb66bc44a42cd08f5eb0e98f206ba3bd1476f3c436bb71ea3a1aebcb7/osteoid-0.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0574492d99612ee672e1b3f0eaa978ae76cf74c4ef5930785af442609122193", size = 142497, upload-time = "2025-12-06T05:07:49.949Z" }, - { url = "https://files.pythonhosted.org/packages/18/ac/8956eb1d638d18189cd2286bed4f20b73fcbe24e3885ef60ed4ad55269c5/osteoid-0.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:29728be4990ba55ca14700c0ffe1627d1704005149664c9d347e6a857c2b0358", size = 125398, upload-time = "2025-12-06T05:07:51.166Z" }, - { url = "https://files.pythonhosted.org/packages/8f/8e/7a005c3405310a6f535bc1dea366dacb6dca53515c9a05522aba69194a0a/osteoid-0.6.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b800d5eefb53cecbac1d1b8b461c1c33240b3e8f1d433b75e186abfe0e34c14e", size = 146040, upload-time = "2025-12-06T05:07:52.251Z" }, - { url = "https://files.pythonhosted.org/packages/6e/80/795710958f373259a521ebc78e59bad0f43de6fdbe2bd87520e13c0aea21/osteoid-0.6.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cdc76f6d4390400294cccfbf9f4f5d288c317b7681f70488c730ffc577e6cee4", size = 153290, upload-time = "2025-12-06T05:07:53.147Z" }, - { url = "https://files.pythonhosted.org/packages/8f/0e/267b984cdf824e6495800c635268ae08f79d92658a79bd4672925106ecfa/osteoid-0.6.0-cp311-cp311-win32.whl", hash = "sha256:74f336782032aad57facee460731e175ff253b55e11861e3df7bf4c3fde0fb0d", size = 117069, upload-time = "2025-12-06T05:07:55.158Z" }, - { url = "https://files.pythonhosted.org/packages/09/7a/79b57a34a39bf4f460a4161e64a9f8efeaca050d666967b31816a3b02971/osteoid-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:accfa55cb22f12e4abeba70bc5a252ee7f9c3de0500d4a2c3bda4ef49f329cc8", size = 124511, upload-time = "2025-12-06T05:07:54.341Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, ] [[package]] @@ -2085,27 +2430,30 @@ wheels = [ ] [[package]] -name = "passlib" -version = "1.7.4" +name = "pandocfilters" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/06/9da9ee59a67fae7761aab3ccc84fa4f3f33f125b370f1ccdb915bf967c11/passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04", size = 689844, upload-time = "2020-10-08T19:00:52.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/a4/ab6b7589382ca3df236e03faa71deac88cae040af60c071a78d254a62172/passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1", size = 525554, upload-time = "2020-10-08T19:00:49.856Z" }, + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, ] [[package]] -name = "pathos" -version = "0.3.5" +name = "parso" +version = "0.8.6" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dill" }, - { name = "multiprocess" }, - { name = "pox" }, - { name = "ppft" }, +sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/37/0c730979d3890f8096a86af2683fac74edd4d15cb037391098dca70dcb1d/pathos-0.3.5.tar.gz", hash = "sha256:8fe041b8545c5d3880a038f866022bdebf935e5cf68f56ed3407cb7e65193a61", size = 166975, upload-time = "2026-01-20T00:06:57.848Z" } + +[[package]] +name = "passlib" +version = "1.7.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/06/9da9ee59a67fae7761aab3ccc84fa4f3f33f125b370f1ccdb915bf967c11/passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04", size = 689844, upload-time = "2020-10-08T19:00:52.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/44/be2146c650ee9ca4d9a770c995f5c92c1ea52292dcf618ce1a336d3146dd/pathos-0.3.5-py3-none-any.whl", hash = "sha256:c95b04103c40a16c08db69cd4b5c52624d55208beadf1348681edece809ec4f8", size = 82248, upload-time = "2026-01-20T00:06:56.291Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a4/ab6b7589382ca3df236e03faa71deac88cae040af60c071a78d254a62172/passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1", size = 525554, upload-time = "2020-10-08T19:00:49.856Z" }, ] [[package]] @@ -2117,6 +2465,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + [[package]] name = "pillow" version = "12.1.0" @@ -2164,30 +2524,24 @@ wheels = [ ] [[package]] -name = "pluggy" -version = "1.6.0" +name = "prometheus-client" +version = "0.24.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/58/a794d23feb6b00fc0c72787d7e87d872a6730dd9ed7c7b3e954637d8f280/prometheus_client-0.24.1.tar.gz", hash = "sha256:7e0ced7fbbd40f7b84962d5d2ab6f17ef88a72504dcf7c0b40737b43b2a461f9", size = 85616, upload-time = "2026-01-14T15:26:26.965Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/74/c3/24a2f845e3917201628ecaba4f18bab4d18a337834c1df2a159ee9d22a42/prometheus_client-0.24.1-py3-none-any.whl", hash = "sha256:150db128af71a5c2482b36e588fc8a6b95e498750da4b17065947c16070f4055", size = 64057, upload-time = "2026-01-14T15:26:24.42Z" }, ] [[package]] -name = "pox" -version = "0.3.7" +name = "prompt-toolkit" +version = "3.0.52" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/58/4385741dea1d74fe9dfed7ff42975266634ef8000f2c8e96717079c916b1/pox-0.3.7.tar.gz", hash = "sha256:0652f6f2103fe6d4ba638beb6fa8d3e8a68fd44bcb63315c614118515bcc3afb", size = 119442, upload-time = "2026-01-19T02:09:12.573Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/ac/4d5f104edf2aae2fec85567ec1d1969010de8124c5c45514f25e14900b65/pox-0.3.7-py3-none-any.whl", hash = "sha256:82a495249d13371314c1a5b5626a115e067ef5215d49530bf5efa37fbc25b56a", size = 29402, upload-time = "2026-01-19T02:09:11.024Z" }, +dependencies = [ + { name = "wcwidth" }, ] - -[[package]] -name = "ppft" -version = "1.7.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/d2/281aa3466e948283d51b83238fb456f65e14f8ade5f8627822578cd2708f/ppft-1.7.8.tar.gz", hash = "sha256:5f696d4f397ae9b0af39b1faffb31957c51dfbc5a3815856472d4f4e872937ee", size = 136349, upload-time = "2026-01-19T03:03:13.439Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/e1/d1b380af6443e7c33aeb40617ebdc17c39dc30095235643cc518e3908203/ppft-1.7.8-py3-none-any.whl", hash = "sha256:d3e0e395215b14afc3dd5adfc032ccecfda2d4ed50dc7ded076cd1d215442843", size = 56759, upload-time = "2026-01-19T03:03:11.896Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, ] [[package]] @@ -2260,6 +2614,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, ] +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + [[package]] name = "pyasn1" version = "0.6.2" @@ -2281,15 +2653,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, ] -[[package]] -name = "pybind11" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/98/9118a0659646f1628c592ef9bb48e0056efa6bf27c951fd12a178e0136fb/pybind11-3.0.2.tar.gz", hash = "sha256:432f01aeb68e361a3a7fc7575c2c7f497595bf640f747acd909ff238dd766e06", size = 577131, upload-time = "2026-02-17T04:46:52.556Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/c5/e98d9c51f3d5300d5e40ad9037dd6b3b60736fd02ab68dcc98c96be7592d/pybind11-3.0.2-py3-none-any.whl", hash = "sha256:f8a6500548919cc33bcd220d5f984688326f574fa97f1107f2f4fdb4c6fb019f", size = 310158, upload-time = "2026-02-17T04:46:49.91Z" }, -] - [[package]] name = "pycparser" version = "3.0" @@ -2482,24 +2845,6 @@ requires-dist = [ [package.metadata.requires-dev] dev = [{ name = "black", specifier = ">=26.1.0" }] -[[package]] -name = "pytest" -version = "9.0.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, -] - [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -2535,6 +2880,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/c3/0bd11992072e6a1c513b16500a5d07f91a24017c5909b02c72c62d7ad024/python_jose-3.5.0-py2.py3-none-any.whl", hash = "sha256:abd1202f23d34dfad2c3d28cb8617b90acf34132c7afd60abd0b0b7d3cb55771", size = 34624, upload-time = "2025-05-28T17:31:52.802Z" }, ] +[[package]] +name = "python-json-logger" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, +] + [[package]] name = "python-multipart" version = "0.0.20" @@ -2565,26 +2919,18 @@ wheels = [ [[package]] name = "pytorch-connectomics" -version = "2.0.0" +version = "0.1" source = { editable = "pytorch_connectomics" } dependencies = [ - { name = "connected-components-3d" }, - { name = "crackle-codec" }, { name = "cython" }, { name = "einops" }, - { name = "fastremap" }, + { name = "gputil" }, { name = "h5py" }, { name = "imageio" }, - { name = "kimimaro" }, - { name = "mahotas" }, + { name = "jupyter" }, { name = "matplotlib" }, { name = "monai" }, - { name = "nibabel" }, - { name = "numpy" }, - { name = "omegaconf" }, { name = "opencv-python" }, - { name = "psutil" }, - { name = "pytorch-lightning" }, { name = "scikit-image", version = "0.25.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, @@ -2592,77 +2938,39 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "tensorboard" }, - { name = "torch" }, - { name = "torchmetrics" }, - { name = "torchvision" }, { name = "tqdm" }, + { name = "yacs" }, ] [package.metadata] requires-dist = [ - { name = "black", marker = "extra == 'dev'", specifier = ">=22.0.0" }, - { name = "connected-components-3d", specifier = ">=3.0.0" }, - { name = "crackle-codec", specifier = ">=0.1.0" }, { name = "cython", specifier = ">=0.29.22" }, { name = "einops", specifier = ">=0.3.0" }, - { name = "fastremap", specifier = ">=1.10.0" }, - { name = "flake8", marker = "extra == 'dev'", specifier = ">=4.0.0" }, - { name = "gputil", marker = "extra == 'full'", specifier = ">=1.4.0" }, + { name = "gputil", specifier = ">=1.4.0" }, { name = "h5py", specifier = ">=2.10.0" }, { name = "imageio", specifier = ">=2.9.0" }, - { name = "isort", marker = "extra == 'dev'", specifier = ">=5.10.0" }, - { name = "jinja2", marker = "extra == 'docs'", specifier = ">=3.0" }, - { name = "kimimaro", specifier = ">=1.0.0" }, - { name = "mahotas", specifier = ">=1.4.0" }, + { name = "jupyter", specifier = ">=1.0" }, { name = "matplotlib", specifier = ">=3.3.0" }, { name = "monai", specifier = ">=0.9.1" }, - { name = "mypy", marker = "extra == 'dev'", specifier = ">=0.950" }, - { name = "nbsphinx", marker = "extra == 'docs'", specifier = ">=0.8.0" }, - { name = "neuroglancer", marker = "extra == 'full'", specifier = ">=1.0.0" }, - { name = "nibabel", specifier = ">=3.0.0" }, - { name = "numpy", specifier = ">=1.23.0" }, - { name = "omegaconf", specifier = ">=2.1.0" }, { name = "opencv-python", specifier = ">=4.3.0" }, - { name = "optuna", marker = "extra == 'full'", specifier = ">=2.10.0" }, - { name = "psutil", specifier = ">=5.8.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=6.0.0" }, - { name = "pytest-benchmark", marker = "extra == 'dev'", specifier = ">=3.4.0" }, - { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=3.0.0" }, - { name = "pytorch-lightning", specifier = ">=2.0.0" }, - { name = "pytorch-sphinx-theme", marker = "extra == 'docs'", specifier = ">=0.0.19" }, { name = "scikit-image", specifier = ">=0.17.2" }, { name = "scikit-learn", specifier = ">=0.23.1" }, { name = "scipy", specifier = ">=1.5" }, - { name = "sphinx", marker = "extra == 'docs'", specifier = ">=4.0.0" }, - { name = "sphinx-rtd-theme", marker = "extra == 'docs'", specifier = ">=1.0.0" }, - { name = "sphinxcontrib-katex", marker = "extra == 'docs'" }, { name = "tensorboard", specifier = ">=2.2.2" }, - { name = "tifffile", marker = "extra == 'full'", specifier = ">=2021.11.2" }, - { name = "torch", specifier = ">=1.8.0" }, - { name = "torchmetrics", specifier = ">=0.11.0" }, - { name = "torchvision", specifier = ">=0.9.0" }, { name = "tqdm", specifier = ">=4.58.0" }, - { name = "wandb", marker = "extra == 'full'", specifier = ">=0.13.0" }, + { name = "yacs", specifier = ">=0.1.8" }, ] -provides-extras = ["full", "dev", "docs"] [[package]] -name = "pytorch-lightning" -version = "2.6.1" +name = "pywinpty" +version = "3.0.3" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fsspec", extra = ["http"] }, - { name = "lightning-utilities" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "torch" }, - { name = "torchmetrics" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8b/ac/ebd5f6f58691cbd4f73836e43e1727f3814311b960c41f88e259606ca2b2/pytorch_lightning-2.6.1.tar.gz", hash = "sha256:ba08f8901cf226fcca473046ad9346f414e99117762dc869c76e650d5b3d7bdc", size = 665563, upload-time = "2026-01-30T14:59:11.636Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/54/37c7370ba91f579235049dc26cd2c5e657d2a943e01820844ffc81f32176/pywinpty-3.0.3.tar.gz", hash = "sha256:523441dc34d231fb361b4b00f8c99d3f16de02f5005fd544a0183112bcc22412", size = 31309, upload-time = "2026-02-04T21:51:09.524Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/93/c8c361bf0a2fe50f828f32def460e8b8a14b93955d3fd302b1a9b63b19e4/pytorch_lightning-2.6.1-py3-none-any.whl", hash = "sha256:1f8118567ec829e3055f16cf1aa320883a86a47c836951bfd9dcfa34ec7ffd59", size = 857273, upload-time = "2026-01-30T14:59:10.141Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/a652709bd76ca7533cd1c443b03add9f5051fdf71bc6bdb8801dddd4e7a3/pywinpty-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:ff05f12d775b142b11c6fe085129bdd759b61cf7d41da6c745e78e3a1ef5bf40", size = 2114320, upload-time = "2026-02-04T21:53:50.972Z" }, + { url = "https://files.pythonhosted.org/packages/b2/13/a0181cc5c2d5635d3dbc3802b97bc8e3ad4fa7502ccef576651a5e08e54c/pywinpty-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:340ccacb4d74278a631923794ccd758471cfc8eeeeee4610b280420a17ad1e82", size = 235670, upload-time = "2026-02-04T21:50:20.324Z" }, + { url = "https://files.pythonhosted.org/packages/79/c3/3e75075c7f71735f22b66fab0481f2c98e3a4d58cba55cb50ba29114bcf6/pywinpty-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:dff25a9a6435f527d7c65608a7e62783fc12076e7d44487a4911ee91be5a8ac8", size = 2114430, upload-time = "2026-02-04T21:54:19.485Z" }, + { url = "https://files.pythonhosted.org/packages/8d/1e/8a54166a8c5e4f5cb516514bdf4090be4d51a71e8d9f6d98c0aa00fe45d4/pywinpty-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:fbc1e230e5b193eef4431cba3f39996a288f9958f9c9f092c8a961d930ee8f68", size = 236191, upload-time = "2026-02-04T21:50:36.239Z" }, ] [[package]] @@ -2691,6 +2999,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, ] +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, + { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, + { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, + { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + [[package]] name = "requests" version = "2.32.5" @@ -2718,6 +3091,88 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, ] +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +] + [[package]] name = "rsa" version = "4.9.1" @@ -2908,6 +3363,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6c/4a/465f96d42c6f33ad324a40049dfd63269891db9324aa66c4a1c108c6f994/scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379", size = 24370427, upload-time = "2026-01-10T21:25:20.514Z" }, ] +[[package]] +name = "send2trash" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, +] + [[package]] name = "setuptools" version = "80.10.2" @@ -2926,6 +3390,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] +[[package]] +name = "soupsieve" +version = "2.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/ae/2d9c981590ed9999a0d91755b47fc74f74de286b0f5cee14c9269041e6c4/soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349", size = 118627, upload-time = "2026-01-20T04:27:02.457Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, +] + [[package]] name = "sqlalchemy" version = "2.0.46" @@ -2953,6 +3426,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fc/a1/9c4efa03300926601c19c18582531b45aededfb961ab3c3585f1e24f120b/sqlalchemy-2.0.46-py3-none-any.whl", hash = "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e", size = 1937882, upload-time = "2026-01-21T18:22:10.456Z" }, ] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + [[package]] name = "starlette" version = "0.48.0" @@ -3017,6 +3504,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/c6/825dab04195756cf8ff2e12698f22513b3db2f64925bdd41671bfb33aaa5/tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530", size = 6590363, upload-time = "2023-10-23T21:23:35.583Z" }, ] +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "(os_name == 'nt' and platform_machine != 'aarch64' and sys_platform == 'linux') or (os_name == 'nt' and sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + [[package]] name = "threadpoolctl" version = "3.6.0" @@ -3060,6 +3561,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/09/19/529b28ca338c5a88315e71e672badc85eef89460c248c4164f6ce058f8c7/tifffile-2026.1.28-py3-none-any.whl", hash = "sha256:45b08a19cf603dd99952eff54a61519626a1912e4e2a4d355f05938fe4a6e9fd", size = 233011, upload-time = "2026-01-29T05:17:23.078Z" }, ] +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, +] + [[package]] name = "tomli" version = "2.4.0" @@ -3123,21 +3636,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/61/d8/15b9d9d3a6b0c01b883787bd056acbe5cc321090d4b216d3ea89a8fcfdf3/torch-2.10.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:b7bd80f3477b830dd166c707c5b0b82a898e7b16f59a7d9d42778dd058272e8b", size = 79423461, upload-time = "2026-01-21T16:24:50.266Z" }, ] -[[package]] -name = "torchmetrics" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lightning-utilities" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "torch" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/81/34/39b8b749333db56c0585d7a11fa62a283c087bb1dfc897d69fb8cedbefb1/torchmetrics-1.9.0.tar.gz", hash = "sha256:a488609948600df52d3db4fcdab02e62aab2a85ef34da67037dc3e65b8512faa", size = 581765, upload-time = "2026-03-09T17:41:22.443Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/a2/c7f6ebf546f8f644edf0f999aa98ece106986a77a7b922316bf6414ff825/torchmetrics-1.9.0-py3-none-any.whl", hash = "sha256:bfdcbff3dd1d96b3374bb2496eb39f23c4b28b8a845b6a18c313688e0d2d9ca1", size = 983384, upload-time = "2026-03-09T17:41:19.756Z" }, -] - [[package]] name = "torchvision" version = "0.25.0" @@ -3189,6 +3687,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, ] +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + [[package]] name = "triton" version = "3.6.0" @@ -3232,6 +3739,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "tzdata" +version = "2026.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/f5/cd531b2d15a671a40c0f66cf06bc3570a12cd56eef98960068ebbad1bf5a/tzdata-2026.1.tar.gz", hash = "sha256:67658a1903c75917309e753fdc349ac0efd8c27db7a0cb406a25be4840f87f98", size = 197639, upload-time = "2026-04-03T11:25:22.002Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/70/d460bd685a170790ec89317e9bd33047988e4bce507b831f5db771e142de/tzdata-2026.1-py2.py3-none-any.whl", hash = "sha256:4b1d2be7ac37ceafd7327b961aa3a54e467efbdb563a23655fbfe0d39cfc42a9", size = 348952, upload-time = "2026-04-03T11:25:20.313Z" }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + [[package]] name = "urllib3" version = "2.6.3" @@ -3284,6 +3809,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02", size = 68109, upload-time = "2025-10-18T13:46:42.958Z" }, ] +[[package]] +name = "wcwidth" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + [[package]] name = "werkzeug" version = "3.1.5" @@ -3297,23 +3858,12 @@ wheels = [ ] [[package]] -name = "xs3d" -version = "1.13.0" +name = "widgetsnbextension" +version = "4.0.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/5e/2f195c8d5e52f0dfebce62ae840ab73eae53b8edc5fe3b677b8f4d595a04/xs3d-1.13.0.tar.gz", hash = "sha256:2beb1d83ba277a1c29ff70906dffb2e171c163de5411cc8dfae3147492698ba9", size = 41784, upload-time = "2025-10-17T02:28:23.614Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/fa/54e32584cfa6b421c90f595f9d575699bb59dd6e037c752da4a1114945ca/xs3d-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:714152a8741beac991d5c43b2473655f83f5301467d212e01fa7c0a696e5bf37", size = 191574, upload-time = "2025-10-17T02:27:32.074Z" }, - { url = "https://files.pythonhosted.org/packages/e7/7b/cdd2a9ff99079ce54f20c7720b7dea6d909977de13f3814e236d36997225/xs3d-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:898cb65eef5b9d0954996d8b7a7cfc657b15bda4e3128aa1abb45bc1fbf762d3", size = 162167, upload-time = "2025-10-17T02:27:33.56Z" }, - { url = "https://files.pythonhosted.org/packages/16/53/9177cd7ad2d5cd4e8c6c9b02f23e31fa176daa68d1177001646825a979f9/xs3d-1.13.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c2ffd9bed693f8373d78b796b8897c31775d3ffb73ba016dcb3f6880a8f9a3b", size = 184594, upload-time = "2025-10-17T02:27:35.08Z" }, - { url = "https://files.pythonhosted.org/packages/a4/4b/42af8af2a5d9d052e357248c4381115ff64bdf77f8f24cfedf19bd904183/xs3d-1.13.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:613ea62c65413997c1274b15c72fddfe71154f63284c4a80d9c1e640cda40245", size = 222641, upload-time = "2025-10-17T02:27:36.433Z" }, - { url = "https://files.pythonhosted.org/packages/20/7a/4223abee4e3a249d935c3dcee0ee7abd829253afaa64587873faa20c9cfc/xs3d-1.13.0-cp310-cp310-win32.whl", hash = "sha256:4c1853077902dd2940d1b298fe16ddd1e61476d028007351d071aed1ec4d9fec", size = 132360, upload-time = "2025-10-17T02:27:38.692Z" }, - { url = "https://files.pythonhosted.org/packages/7c/67/a42c33cffc5dc9e1708c9c140e5b6a51bb394c787b49e3210678e048795e/xs3d-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:de9254fd7d2340bd2e7f61c8f797d6fff5d869a3dea491ada2a980cba9f6abd9", size = 141546, upload-time = "2025-10-17T02:27:37.736Z" }, - { url = "https://files.pythonhosted.org/packages/82/41/bade76ea52e1696856943da04ea28906cd59e2104ab27cc0f7a20ff64870/xs3d-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:73c110c19bbac2d32f9e0ad2d08557743e7865fb473d5ec78702677115dadfe2", size = 193100, upload-time = "2025-10-17T02:27:39.912Z" }, - { url = "https://files.pythonhosted.org/packages/54/a0/cde6421af76af30897cf160c1966d3e7fec714784d9387519b3cda7ee2d8/xs3d-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ca5a9519c2b78ca24632e5bbb53387f177ef2d62b2b377f0c86efff32c8f513", size = 163519, upload-time = "2025-10-17T02:27:41.226Z" }, - { url = "https://files.pythonhosted.org/packages/2d/95/1b17a69245df623c6078bff74b20a6b2c9297070467477068300b85f9168/xs3d-1.13.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a75e38a31aed8b347b1b6c3272558bfb67716f2a98dd3795f9d4bba1b86fc1b7", size = 185417, upload-time = "2025-10-17T02:27:42.152Z" }, - { url = "https://files.pythonhosted.org/packages/ed/75/da5699ebb74ea8916fdd5195336ae08c78eee237382c465a9b9d330971b7/xs3d-1.13.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c77147a4086594be98fc1aa65d471c6c484b484719cea9e5505f5cc5a9a48ce8", size = 224191, upload-time = "2025-10-17T02:27:43.399Z" }, - { url = "https://files.pythonhosted.org/packages/72/c8/97b43f69c1b8028bd28ade1649281a0a3bd5d72d6c24175510167b2b2d03/xs3d-1.13.0-cp311-cp311-win32.whl", hash = "sha256:d8a8b1cffeeb5bf78993d247a24dbb3f9f6662479979bb265dbda120c21462f8", size = 133351, upload-time = "2025-10-17T02:27:45.398Z" }, - { url = "https://files.pythonhosted.org/packages/26/94/3416e98d81d2bdd1b3f5c8ad6399c98f1a34eb349b61c523bce8a28569ac/xs3d-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb053f6ee6159f9bfb9d20ba5f828feb7c73558fb0c4dd542f5089fe42f0b74c", size = 142319, upload-time = "2025-10-17T02:27:44.511Z" }, + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, ] [[package]] @@ -3359,6 +3909,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/d9/8d95e906764a386a3d3b596f3c68bb63687dfca806373509f51ce8eea81f/xxhash-3.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d", size = 31565, upload-time = "2025-10-02T14:37:06.966Z" }, ] +[[package]] +name = "yacs" +version = "0.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/3e/4a45cb0738da6565f134c01d82ba291c746551b5bc82e781ec876eb20909/yacs-0.1.8.tar.gz", hash = "sha256:efc4c732942b3103bea904ee89af98bcd27d01f0ac12d8d4d369f1e7a2914384", size = 11100, upload-time = "2020-08-10T16:37:47.755Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/4f/fe9a4d472aa867878ce3bb7efb16654c5d63672b86dc0e6e953a67018433/yacs-0.1.8-py3-none-any.whl", hash = "sha256:99f893e30497a4b66842821bac316386f7bd5c4f47ad35c9073ef089aa33af32", size = 14747, upload-time = "2020-08-10T16:37:46.4Z" }, +] + [[package]] name = "yarl" version = "1.22.0"