Metadata-Version: 2.4
Name: distry-py
Version: 0.2.0
Summary: Distributed task execution framework
Author: Carlo Moro
License: MIT
Project-URL: Homepage, https://github.com/cnmoro/distry
Keywords: distributed,computing,parallel,processing
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: client
Requires-Dist: requests; extra == "client"
Requires-Dist: cloudpickle; extra == "client"
Provides-Extra: worker
Requires-Dist: fastapi; extra == "worker"
Requires-Dist: uvicorn[standard]; extra == "worker"
Requires-Dist: cloudpickle; extra == "worker"
Requires-Dist: pydantic; extra == "worker"
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: pytest-asyncio; extra == "dev"
Requires-Dist: requests; extra == "dev"
Requires-Dist: black; extra == "dev"
Requires-Dist: flake8; extra == "dev"
Requires-Dist: mypy; extra == "dev"
Provides-Extra: all
Requires-Dist: requests; extra == "all"
Requires-Dist: cloudpickle; extra == "all"
Requires-Dist: fastapi; extra == "all"
Requires-Dist: uvicorn[standard]; extra == "all"
Requires-Dist: cloudpickle; extra == "all"
Requires-Dist: pydantic; extra == "all"
Dynamic: license-file

<img src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAxMTExLjkgODAzLjciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDExMTEuOSA4MDMuNzsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkuc3Qwe2ZpbGw6IzEzMTYxNjt9DQoJLnN0MXtmaWxsOiMxMzE3MTc7fQ0KCS5zdDJ7ZmlsbDojMTQxNzE3O30NCgkuc3Qze2ZpbGw6IzhCOEU5Mjt9DQoJLnN0NHtmaWxsOiM4ODhBOEQ7fQ0KCS5zdDV7ZmlsbDojODg4QThFO30NCgkuc3Q2e2ZpbGw6IzQ5NEE0RDt9DQoJLnN0N3tmaWxsOiM4ODhCOEU7fQ0KCS5zdDh7ZmlsbDojNEE0QTRFO30NCgkuc3Q5e2ZpbGw6IzRBNEI0RTt9DQoJLnN0MTB7ZmlsbDojNEI0QjRGO30NCgkuc3QxMXtmaWxsOiNGQUNBMjA7fQ0KCS5zdDEye2ZpbGw6I0ZBQ0EyMTt9DQoJLnN0MTN7ZmlsbDojRkRGREZEO30NCgkuc3QxNHtmaWxsOiNGQ0ZDRkM7fQ0KPC9zdHlsZT4NCjxnPg0KCTxwYXRoIGQ9Ik04NzUuMiw0NTVjNC0xMS4xLDUuNC0xMS43LDMtMjJjLTUuOC04LTEzLjQtMTEtMjIuNi05LjdjLTAuNS0yLjQtMi4yLTMuNi0zLjYtNC44Yy00LjEtMy4zLTguOS00LjctMTQuMi00LjMNCgkJYy0yLjEsMS44LTUuMSwxLjEtNy4zLDIuOWMtMiwxLjYtNC44LDIuMS03LDMuNWMtNi40LDQuMi0xMi43LDguNy0xOS4xLDEzYy00LjQsMi45LTguOCw1LjktMTMuNSw4LjRjLTcuOSw0LjItMTYuMyw3LjMtMjUuNCw3LjgNCgkJYzAtMC4zLTAuMi0wLjgtMC4xLTAuOWMyLjYtMy40LDUuMi02LjksOC0xMC4xYzMuMS0zLjUsNS4xLTcuNSw3LjMtMTEuNWMyLjItMy45LDQuNi03LjgsNC42LTEyLjVjMi43LTcsMC4yLTEzLjctNC41LTE4LjINCgkJYy02LTUuNy0xMy4zLTYuOS0yMS42LTMuNmMtOS4zLDMuNy0xNi40LDEwLjEtMjIuNSwxNy43Yy0yLjksMy43LTUuMiw3LjgtNy44LDExLjdjLTMuMiw0LjctNi40LDkuNC05LjksMTMuOA0KCQljLTIuNSwzLjItNC42LDYuOS04LjEsOS4xYy0zLjQsMi4xLTYuNiw0LjQtOS41LDYuOWMtOCw2LjgtMTQuMywxNS0xOCwyNC45Yy0xMy4xLDQuOC0yNi4xLDkuNC0zOS4xLDE0LjINCgkJYy0xMyw0LjgtMjUuOSw5LjctMzguOCwxNC44Yy0xMi45LDUtMjYuMSw5LjMtMzguMywxNS4zYy0yNi43LTE2LjEtNTIuNC0zMy03OC40LTQ5LjNjMC4xLTIuMy0wLjItNC4zLTAuOS02LjMNCgkJYy0xLjctNS01LjktMTMuOC04LjYtMTYuNGMtNC41LTQuNS04LjctOS41LTE0LjEtMTNjLTMtMS45LTUuOC00LTkuNC01LjFjLTMuNS0xLjItNi45LTMtOS42LTUuOGMtNC4yLTQuNS04LjYtOC44LTEzLjktMTIuMQ0KCQljLTQuNi0yLjktOS4zLTUuOS0xNC4zLTcuN2MtMTAuMS0zLjUtMjAuMy03LjItMzEuMS04LjJjLTItMS41LTQuNy0wLjItNi41LTEuMmMtMi0xLjEtMy45LTAuOC01LjctMC43Yy0yLjIsMC4xLTMuOS0xLjQtNi4xLTEuMg0KCQljLTMuMywwLjQtNi43LDAuMi05LjYtMS40YzAtMi42LDAtNSwwLTcuNWM1LDAuMiw5LjUtMi4zLDE0LjMtMi4xYzEuMi0xLjcsMy4xLTAuNSw0LjYtMWM0LjEtMS40LDguNS0yLjEsMTIuNi0zLjMNCgkJYzQuMS0xLjIsOC40LTIuMiwxMi41LTMuN2M1LjgtMi4xLDExLjYtNC4yLDE3LjItNi43YzQuNC0yLDguNC00LjYsMTIuNS03LjJjNy45LTQuOSwxNC43LTExLjEsMjAuMi0xOC42DQoJCWMyLjctMy44LDUuMS03LjgsNi40LTEyLjNjMS4xLTMuOCwyLjctNy40LDIuNS0xMS40YzEuOS0xLjYsMC44LTMuNywwLjktNS42YzAuMS0xLjksMS4yLTMuNSwxLjEtNS42Yy0wLjMtNi41LDAtMTMtMC4xLTE5LjUNCgkJYy0wLjItNi40LDAuNi0xMi43LTAuOC0xOS4xYy0wLjgtMy43LDAuMS03LjctMS0xMS42Yy0wLjgtMi43LDAtNS43LTEtOC42Yy0wLjgtMi4yLTAuMi00LjctMS03LjFjLTAuNy0yLjItMC43LTQuNy0wLjktNy4xDQoJCWMtMC4zLTIuNy0xLTUuNC0xLjQtOGMtMC40LTItMC4zLTQuMi0xLTZjLTEuMy0zLjUtMS43LTcuMy0yLjYtMTAuOWMtMC42LTIuNC0wLjktNS0xLjctNy4zYy0wLjgtMi40LTEuMS00LjgtMi03LjENCgkJYy0yLjUtNi41LTMuNi0xMy41LTcuNC0xOS40Yy0wLjUtNC0zLTcuMS00LjYtMTAuNmMtMS42LTMuNS0zLjgtNi44LTUuOS0xMGMtMi42LTQtNS42LTcuNy04LjQtMTEuNmMtMi42LTMuNy02LTYuNC05LTkuNw0KCQljLTMtMy4zLTYuMy02LjQtOS41LTkuNmMtMi4yLDAtMy0yLjMtNC42LTMuMmMtNC42LTIuNi05LjEtNS40LTEzLjUtOC4zYy01LjQtMy41LTExLjctNS0xNy04LjZjLTEwLjctMi43LTIwLjktNy4yLTMyLjEtOC4yDQoJCWMtMi4zLTAuMi00LjktMC4yLTctMWMtMi40LTAuOC00LjgtMS4xLTcuMS0wLjhjLTIuNiwwLjQtNC42LTEuMi03LjEtMS4xYy04LjgsMC4xLTE3LjYsMC4xLTI2LjUsMGMtMS4yLDAtMi4zLDAuMy0zLDAuNw0KCQljLTEuNC0wLjctMS43LTEuNi0xLjUtMi42YzAuMy0zLjMtMS42LTYuMy0xLTkuNmMtMi4zLTQuNS0xLjctOS41LTIuOC0xNC4zYy0wLjctMy4xLTAuMS02LjYtMC4xLTkuNmMxLjUtMiwzLjktMS45LDUuNC0zLjQNCgkJYzEuNS0xLjUsMy4yLTMsNC42LTQuNmM0LjItNC45LDcuNS0xMC4yLDctMTcuMWMtMC4xLTEuNywwLTMuMywwLTVjLTAuMi02LjQtMi42LTExLjktNi44LTE2LjZjLTIuMi0yLjUtNC45LTQuNC03LjgtNi4yDQoJCWMtMi44LTEuNy01LjktMS45LTguNi0zLjVjLTcuNC0wLjMtMTQuNy0wLjEtMjEuMyw0Yy0zLjgsMi40LTYuOSw1LjQtOS40LDljLTMsNC4yLTUuNCw4LjUtNSwxMy45Yy0yLjcsMy42LDEuMiw3LjEsMC4xLDEwLjYNCgkJYzEuMyw1LjEsNi44LDEzLjMsMTEuMywxNi4yYzIuMywxLjUsNC43LDIuOSw3LjQsMy43YzIuMywwLjcsNSwwLjgsNy4xLDNjLTEsMTEuMSwyLDIxLjksMy41LDMzLjNjLTAuNSwwLTEuNCwwLjItMiwxLjENCgkJYy00LDAtNy44LDEuMS0xMS42LDJjLTUuNSwxLjMtMTEsMi4zLTE2LjMsNGMtOC4xLDIuNi0xNiw1LjUtMjMuNyw5LjFjLTMuNSwxLjYtNywzLjMtMTAuNCw1LjFjLTMuNSwxLjgtNi43LDQtOS45LDYuMg0KCQljLTYuMiw0LjItMTEuOSw5LjQtMTcuNiwxNC4zYy0zLjEsMi43LTUuNSw2LTguMyw5Yy0zLjUsMy44LTYuNyw3LjktOS41LDEyLjFjLTQuNSw2LjYtOC44LDEzLjUtMTEuNywyMS4xDQoJCWMtMi4zLDYuMi00LjgsMTIuMy02LjgsMTguN2MtMi42LDguMi0zLjYsMTYuNi00LjksMjUuMWMtNC41LDItNy45LDUuOC0xMS4zLDkuNWMtMi43LDMtOCwxMy4xLTguNCwxNmMtMC40LDMtMS42LDUuNy0yLDguNw0KCQljLTAuNCwzLTAuMyw2LTAuOSw5LjFjLTAuNiwzLjEsMC4xLDYuMywwLjYsOS42YzAuNiwzLjksMS4xLDcuOCwyLjEsMTEuN2MyLDcuNiw1LjEsMTQuNSw5LjYsMjFjNS4yLDcuNCwxMi40LDExLjUsMjAuNCwxNC42DQoJCWMxLjYsMC42LDMuNSwyLDUuNiwwLjljMC43LDEsMS4zLDEuNiwxLjQsMi4xYzAuMyw0LDIsNy41LDMuNSwxMWMyLjEsNC43LDQuNyw5LjEsNy42LDEzLjNjMiwzLDQuMyw1LjksNi42LDguOA0KCQljMy4xLDMuOSw3LjEsNi45LDExLDkuN2M2LjksNC45LDE0LjUsOSwyMi42LDExLjdjNS4xLDEuOCwxMC4yLDMuNywxNS42LDQuNWMxLjgsMC4zLDQuMSwwLjIsNS41LDFjMiwxLjMsNC4xLDAsNS42LDAuOQ0KCQljMi42LDEuNyw1LjQsMC4xLDgsMS4zYzIuNiwxLjMsNS41LDAuMyw4LjMsMC41YzAuNiwwLjEsMS4zLTAuMiwxLjUsMC4yYzAsMy4xLDAsNS45LDAsOS4xYy0yLTEuNS0zLDAuOS00LjcsMC43DQoJCWMtNi0wLjgtMTEuNywyLTE3LjYsMS45Yy0yLjIsMS41LTQuOCwwLjQtNywxLjJjLTMuNywxLjMtNy43LDEuNC0xMS4zLDIuOGMtMi4yLDAuOS00LjcsMC43LTYuOSwxLjRjLTcuNiwyLjUtMTUuNSw0LjUtMjIuNyw3LjkNCgkJYy0xMC45LDUtMjEuNCwxMC44LTI5LjksMTkuNmMtMy4xLDAuNS02LjIsMC4xLTkuNSwwLjljLTcuOCwxLjktMTUuMSw0LjgtMjEuNiw5LjRjLTQuOCwzLjQtOS40LDYuOS0xMy4xLDExLjgNCgkJYy0zLjMsNC4zLTYuMyw4LjYtOC4zLDEzLjZjLTIuMSw1LjEtNCwxMC4yLTMuOSwxNS45YzAuMSwyLjMsMCw0LjcsMCw2LjhjLTkuNCwxMC4zLTE5LjgsMTkuMi0yOC43LDI5LjcNCgkJYy02LjgsOC0xNC45LDE0LjktMjEuOSwyMi45Yy03LjksOC45LTE2LjcsMTctMjQuNywyNS44Yy01LjgsNi4zLTYuOCw2LjItMTMuNywxOS44Yy0yLjQsNC43LTMuNSw5LjctMy44LDE0LjkNCgkJYy0wLjIsMy43LDAsNy4zLTAuMSwxMWMtMC4xLDQuNywxLjMsOSwzLjIsMTMuMWMxLjgsMy45LDQuNiw3LjEsNy4yLDEwLjZjMi41LDMuMyw1LjgsNS4zLDguOCw3LjdjMS44LDEuNSwzLjcsMyw1LjgsNA0KCQljMi42LDEuMiwzLjQsMy45LDQuOSw1LjhjMi4zLDMsNC45LDUuNyw3LjYsOC4zYzEwLjksMTAuNCwyMC44LDIxLjgsMzIuNCwzMS41YzMuNSwyLjksNi41LDYuNSwxMC4zLDkuMWMyLjYsMS44LDQuNiw0LjIsNyw2DQoJCWM1LjQsNC4xLDExLDcuOSwxNi42LDExLjdjMi42LDEuOCw1LjIsMy40LDcuOSw1LjFjMi40LDUuMiw0LjIsMTAuOCw4LDE1LjZjMi42LDMuMyw1LjcsNS43LDksNy44YzQsMi42LDguNSw0LjMsMTMuMSw1LjcNCgkJYzMuNCwxLDcsMS45LDEwLjUsMi4yYzQuMywwLjUsOC41LDEuNCwxMi42LDIuM2MzLjcsMC44LDcuMywyLjYsMTAuMiw1LjZjNi43LDYuOCwxMy4yLDEzLjksMjAuNywxOS45YzUsNCwxMC43LDYuNiwxNyw3LjINCgkJYzUuMiwwLjUsMTAuMS0xLDEzLjgtNS4yYzEtMS4xLDIuMS0yLjEsMy4yLTMuMmMtMC41LTEuOCwwLjktMywxLjQtNC40YzIuMi0wLjEsMi4xLDAuMyw0LjEsMC44YzIuOCwwLjgsNC43LDMsNy4zLDQuMQ0KCQljNC44LDIsOS4zLDQuOCwxNC4zLDYuNmM0LjksMS43LDkuNywzLjksMTQuOCw1LjJjMi4xLDAuNSw0LjIsMS45LDYuNSwxLjJjMS41LDIuMyw0LjYtMC4zLDYuMiwyYzIuMiwwLjEsNC41LTAuNCw2LjYsMQ0KCQljNC42LTAuNiw5LDEuMywxMy42LDEuMWM1LjgtMC4zLDExLjctMC4xLDE3LjUtMC4xYzAuOCwwLDEuOSwwLjMsMi41LTAuMWMyLTEuMiw0LjEtMS4yLDYuMS0wLjljMi4yLDAuMyw0LTEuMSw2LjEtMQ0KCQljNC40LDAuMiw4LjItMi41LDEyLjYtMi4xYzYuMi0yLjksMTIuOS00LDE5LjItNi43YzcuNS0zLjMsMTQuOC03LDIxLjgtMTEuM2MzLjQtMi4xLDYuMy01LDkuNS03LjNjNi42LTQuNywxMS44LTEwLjksMTYuNy0xNy4xDQoJCWM0LjUtNS44LDguMS0xMi41LDExLjItMTkuM2MzLjYtNy44LDUuNi0xNS45LDYtMjQuNWMwLjEtMi4xLDAtNC4zLDAtNi4zYzEuMS0wLjksMS45LTEuOCwyLjgtMi4zYzcuMS0zLjksMTIuMS0xMC4xLDE2LjEtMTYuOQ0KCQljNC02LjcsNS42LTE0LjQsNy4xLTIyYzAuNS0yLjUsMC40LTUuMiwxLjEtNy41YzEtMy4xLDEuNC02LjIsMS42LTkuMmMwLjMtNCwxLjktNy45LDEuMi0xMi4xYzEuMy0xLjksMS4yLTQsMC45LTYuMQ0KCQljLTAuMy0yLjIsMC45LTQsMS4xLTYuMWMwLjItMy4yLDAuMi02LjQsMC44LTkuNmMwLjgtNC4xLDAuMy04LjMsMS0xMi42YzAuOS00LjktMC41LTEwLjEsMS4yLTE1Yy0wLjctMTAuMiwxLjUtMjAuMywxLTMwLjUNCgkJYzAtMS4xLTAuNi0yLjMsMC41LTMuMmMwLjUsMC41LDAuOSwxLjEsMS40LDEuNGM2LDMuMiwxMS44LDcsMTcuNiwxMC41YzIuOCwxLjcsNS43LDMsOC41LDQuN2M1LjIsMy4xLDEwLjMsNi4zLDE1LjYsOS4zDQoJCWM0LjMsMi40LDguOSw0LjIsMTMuMiw2LjZjNC4zLDIuNCw5LjMsMy41LDEzLjQsNi4zYzIuOSwwLDUuMywxLjgsOC4xLDIuMmMyLjgsMC4zLDQuNSwzLjIsNy4yLDQuMmMwLjMsMC4xLDAuNCwwLjYsMC43LDAuNw0KCQljNS40LDEuMiwxMC42LDMuMywxNi4yLDMuMWMzLjQtMC4yLDYuNywwLDEwLjEtMC45YzQuOS0xLjQsMTAuMy0xLjIsMTQuOC00LjFjOS41LTIuMywxOC4yLTYuOCwyNy4xLTEwLjQNCgkJYzUuNC0yLjIsMTAuNy00LjYsMTYuMS03LjFjOS4xLTQuMiwxOC4yLTguMywyNy4zLTEyLjZjMTEuNy01LjUsMjMuMi0xMS41LDM0LjktMTdjNS42LTIuNiwxMS41LTQuNiwxNi4yLTcuNg0KCQljMy45LTEuMiw2LjgsMSwxMC4xLDAuOGM5LjItMC43LDE4LjQsMS4xLDI3LjYtMS4xYzMuMSwwLjgsNi0xLjUsOS4xLTFjNS41LTIuMiwxMS4zLTMuMSwxNi45LTQuOWMxMC44LTMuNCwyMS4yLTcuNSwzMS40LTEyLjMNCgkJYzYuNi0zLjEsMTIuOC02LjksMTkuMS0xMC42YzQuNi0yLjcsOC44LTUuOSwxMy4zLTguN2MzLjItMiw2LjMtNC40LDktNy4xYzQuOS00LjksMTAuMi05LjQsMTQuMi0xNWM1LjEtNy4yLDkuOS0xNC40LDguNy0yMy42DQoJCUM4NzcuMSw0NTguNyw4NzYuMSw0NTYuOCw4NzUuMiw0NTV6IE0xNTAuOSw2NzMuNGMtMi43LTMuMS01LjEtNS41LTYuOS04LjNjLTAuOC0xLjMtMS43LTIuNS0yLjgtMy4zYy0xLjMtMS0xLjMtMi41LTIuNC0zLjYNCgkJYy0zLjktNC02LjgtOC45LTEwLjQtMTMuMWMtMi4yLTIuNi00LjMtNS4zLTYuNS03LjljLTIuMS0yLjUtNC4zLTUtNi4yLTcuOGMtMS44LTIuNi00LjEtNS02LjMtNy40Yy0yLjctMi44LTUuMS02LTcuNS05DQoJCWMtMi41LTMtNS4zLTUuNy04LjEtOWMxNS41LTEzLjYsMjkuOC0yOC41LDQ1LTQzLjZjMS41LDIuMiwzLjksMSw2LjEsMS42YzAsMi42LDAsNS4zLDAsNy45YzAsMTIuNSwwLjIsMjQuOS0wLjEsMzcuNA0KCQljLTAuMSwzLjgsMS4zLDcuMywxLjEsMTEuMWMtMC4yLDMuOC0wLjYsNy44LDAuMSwxMS40YzAuOCwzLjksMC42LDcuNywwLjksMTEuNmMwLjEsMi4yLDEuMyw0LjIsMS4xLDYuNmMtMC4yLDIuMi0wLjYsNC41LDAuOSw2LjYNCgkJYzAuMywwLjQsMCwxLjMsMCwyYzAuMSwyLjEtMC4yLDQuMSwwLjksNi4xYzAuOCwxLjYtMC41LDMuNywxLDUuNkMxNTEuNSw2NjkuNCwxNTAuOSw2NzEuMywxNTAuOSw2NzMuNHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNODA0LjcsMTM4LjVjLTEwLjUtNi41LTIxLjItMTIuNi0zMS41LTE5LjRjLTUtMy4zLTEwLjQtNi4yLTE1LjUtOS42Yy01LjMtMy40LTExLjEtNi4xLTE1LjYtMTAuNg0KCQljLTMuNi0zLjctNC4yLTcuOC0yLjktMTNjMi40LTkuNSw3LTE4LjEsOS4xLTI3LjdjMy40LTYuMSw0LjUtMTMuMSw3LjEtMTkuNWMxLjktNC43LDMuNi05LjUsNS0xNC40YzAuMy0xLjEsMC45LTIuNiwyLjItMy42DQoJCWMxLjgtMS40LDMuMy0zLjIsNS00LjljMi44LTAuMiw1LjQtMS41LDgtMi4zYzIuOS0wLjksNS45LTIsOC44LTIuNmMyLjktMC42LDUuNi0xLjksOC42LTIuM2M0LjItMC43LDguMi0yLjgsMTIuNS0zLjUNCgkJYzQuNi0wLjgsOS4xLTIuMiwxMy42LTMuNWM0LjYtMS40LDktMS45LDEzLjUtMS43YzQuNSwyLjQsOS4xLDQuNCwxMy4yLDcuMWM1LjcsMy44LDEyLDYuNywxNy43LDEwLjVjMy4xLDIsNi41LDMuNSw5LjgsNS4zDQoJCWM2LjUsMy42LDEzLjIsNi45LDE5LjMsMTEuMWM1LjUsMy43LDYuNyw5LjMsNS4xLDE0LjljLTIsNy4xLTQuNywxNC03LjEsMjFjLTMuNCwxMC4yLTYuNiwyMC41LTEwLjUsMzAuNg0KCQljLTIuMSw1LjMtMy43LDEwLjgtNS44LDE2LjFjLTEuNyw0LjUtNS4xLDYuNy05LjEsOC4yYy0zLjgsMS40LTcuOCwyLjEtMTEuNywzLjFjLTQuNCwxLTguNywyLjQtMTMuMSwzLjQNCgkJYy02LDEuNC0xMS45LDMuNS0xOC4xLDQuNmMtMS45LDAuMy0zLjgsMS43LTUuNywxLjhjLTEuOSwwLjItMy41LDEuNS01LjYsMS4yQzgwOS4yLDEzOC4yLDgwNy4yLDEzOC41LDgwNC43LDEzOC41eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMDAwLjQsODEuN2M3LDIuOCwxMi4zLDcuNywxOC4xLDExLjdjNS4zLDMuNywxMC41LDcuNiwxNS44LDExLjVjNC41LDMuMyw5LjIsNi41LDEzLjksOS42DQoJCWMzLjgsMi41LDcuNyw1LDExLjIsNy44YzIuOSwyLjMsNS41LDQuOSw2LjcsOS44YzAsMS4xLDAsMy41LDAsNS42Yy0yLDIuOC0yLjYsNi4xLTMuOSw5Yy0yLjYsNS43LTQuNiwxMS43LTcsMTcuNg0KCQljLTIuNSw2LTQuNywxMi03LjIsMThjLTIuMyw1LjUtNC4xLDExLjMtNi44LDE2LjdjLTIuNiw1LjMtNi4zLDguNC0xMi4xLDkuNGMtMi43LDAuNS01LjQsMS40LTguMSwyLjFjLTIuNSwwLjYtNS4yLDEuMS03LjUsMi4zDQoJCWMtMS44LDAuOS0zLjUtMC4xLTUuMiwwLjljLTEuMywwLjctMi45LDEuNy00LjMsMS42Yy0xLjktMC4xLTMuNCwwLjktNS4xLDEuMmMtNiwxLjQtMTIuMSwzLTE4LjEsNC41Yy0yLjksMC43LTUuOCwyLjEtOC45LDEuMw0KCQljLTMuMi0wLjgtNi4yLTIuMy04LjYtNC40Yy02LjEtNS4yLTEyLjgtOS42LTE5LTE0LjZjLTUuNi00LjUtMTEuNi04LjgtMTcuNS0xM2MtMy42LTIuNi02LjktNS43LTEwLjYtOC4yDQoJCWMtMi40LTEuNy00LjYtMy42LTYuNi01LjdjLTQuOC00LjgtNS41LTkuNy0yLjktMTZjMy4zLTgsNi40LTE2LDkuNi0yNGMxLjktNC43LDMuOS05LjQsNS45LTE0YzIuNi02LjIsNS45LTEyLjMsNy44LTE4LjcNCgkJYzEuNS01LjIsNS03LjUsOS40LTljMy45LTEuNCw4LjEtMiwxMi4yLTMuMWM2LjMtMS42LDEyLjctMy4xLDE5LTQuN2MzLjQtMC45LDcuMS0xLjUsMTAuNS0yLjRjMy44LTAuOSw3LjYtMS43LDExLjQtMi42DQoJCUM5OTUsODEuMiw5OTcuOCw4MS43LDEwMDAuNCw4MS43eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik05MTEuOCwzNTQuMmMtNy44LDIuMS0xNS42LDAuNi0yMy4zLDEuMWMtMy40LTEuOC03LTEtMTAuNi0wLjljLTguOSwwLjEtMTcuNy0xLjUtMjYuNi0xLjINCgkJYy0yLjgsMC4xLTUuNy0xLjItOC4xLTMuM2MtMi43LTIuNC00LjktNS4zLTYuOC04LjJjLTEuNi0yLjQtNC40LTMuOC01LjEtNi44Yy01LjItNS45LTkuNy0xMi4zLTE0LjYtMTguNA0KCQljLTIuMS0yLjYtNC4yLTUuMy02LjUtNy45Yy0zLjgtNC4zLTcuMi04LjktMTAuNi0xMy41Yy0zLjMtNC41LTMtMTAuNiwwLjUtMTQuOWM0LjEtNS4xLDcuNi0xMC42LDExLjgtMTUuNQ0KCQljNC40LTUuMiw4LjItMTAuNywxMi40LTE1LjljNC42LTUuOCw5LjItMTEuNiwxMy4zLTE3LjljMS4yLTEuOSwzLjEtMy42LDQuOS00LjljMy40LTIuNSw3LjQtMy4zLDExLjQtMi4xDQoJCWMxLjQsMC40LDIuOSwwLjgsNC4yLDAuNmMxLjctMC4zLDIuNSwxLjQsNC4xLDEuMWMzLjktMC44LDcuNiwxLjUsMTEuNiwxYzEuNi0wLjIsMi44LDEuMyw0LjYsMS4xYzEuNS0wLjIsMy4zLTAuNyw0LjYsMC45DQoJCWMwLjIsMC4yLDEsMCwxLjUsMGMyLjEsMCw0LjEsMCw2LjEsMC45YzEuNywwLjcsMy44LTAuNCw1LjYsMWMwLjYsMC41LDEuOSwwLjEsMi45LDAuMWMzLjUsMCw2LjgsMS4yLDEwLjIsMS45DQoJCWMyLjYsMC41LDQuNywxLjcsNiwzLjZjNC40LDYuNiw5LjcsMTIuNSwxNC4zLDE5YzIuNiwzLjYsNS41LDcuMSw4LjMsMTAuNmM0LjgsNiw5LjUsMTIsMTQuMSwxOC4xYzAuOSwxLjIsMS4zLDIuOCwyLjMsNC43DQoJCWMwLTAuMywwLDAsMC4xLDAuM2MxLDUuOS0yLDEwLjQtNS41LDE0LjdjLTEuNSwxLjgtMi41LDQtMy45LDUuOGMtNS43LDcuMi0xMC42LDE1LTE2LDIyLjRjLTQuMyw2LTksMTEuNy0xMi42LDE4LjINCgkJQzkxNS4yLDM1MS40LDkxMy40LDM1Mi42LDkxMS44LDM1NC4yeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik0xMTExLjcsMzE5LjVjMS43LDcuMi0xLjUsMTIuNy0zLjksMTguM2MtMS41LDMuNC0zLjMsNi42LTQuNywxMGMtMS40LDMuNC0zLDYuOC00LjYsMTAuMQ0KCQljLTIuNyw1LjctNC44LDExLjctOCwxNy4yYy0xLjYsMi44LTEuNiw2LjUtNC41LDguNmMtMC44LDMuNS00LjYsMy40LTYuNiw1LjVjLTQuMiwwLTguMSwxLjUtMTIuMSwyLjJjLTQuNiwwLjctOS40LDAuNy0xMy44LDIuOA0KCQljLTIuOC0wLjQtNS40LDAuNC04LjEsMWMtNC42LDEuMi05LjMsMS41LTEzLjgsMi42Yy0yLjgsMC43LTUuOSwxLjItOSwxLjRjLTMuMiwwLjEtNi0xLjItOC4xLTMuMmMtMi44LTIuNy02LjEtNS03LjktOC43DQoJCWMtMC4zLTAuNi0wLjktMS0xLjQtMS40Yy02LjQtNS43LTExLjYtMTIuNS0xNy41LTE4LjhjLTMuOC00LTcuOS03LjktMTEuMy0xMi4zYy0xLjgtMi4yLTMuOC00LjMtNS40LTYuN2MtMy00LjYtMi41LTkuMy0wLjQtMTQNCgkJYzEuOC0zLjksMy44LTcuOCw1LjYtMTEuNmMzLjEtNi40LDYuMy0xMi43LDkuMS0xOS4yYzIuMy01LjQsNS4xLTEwLjUsNy42LTE1LjhjMS4zLTIuOCwyLjItNS43LDQtOC4zYzEuNi0yLjIsMy40LTMuNSw2LjEtNA0KCQljNC4yLTAuNiw4LjQtMS40LDEyLjYtMi4xYzUuOS0wLjksMTEuOC0yLDE3LjctM2MyLjItMC40LDQuNi0wLjMsNi41LTFjMi4xLTAuOCw0LjItMC40LDYuMS0wLjljMy41LTEsNy0xLjksMTAuNy0yDQoJCWMzLjEsMCw1LjcsMS4yLDcuNywzLjFjOC42LDguMywxNy40LDE2LjUsMjUuMywyNS41YzQuOCw1LjQsMTAsMTAuNCwxNSwxNS42QzExMDcuNiwzMTMuMywxMTEwLDMxNi4zLDExMTEuNywzMTkuNXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QzIiBkPSJNMTUzLjksMjE3LjdjMC00LjUsMS4yLTguMiwyLjItMTEuOWMxLjMtNC42LDIuNi05LjIsNC43LTEzLjVjMi00LDMuMi04LjMsNS42LTEyLjJjMi41LTQuMSw0LjktOC4zLDcuMy0xMi41DQoJCWMxLTEuOCwzLjMtMi43LDMuNS01YzQuOS02LjIsMTAuNC0xMiwxNi4zLTE3LjFjNS45LTUuMSwxMi4xLTkuOCwxOC44LTEzLjdjOS40LTUuNSwxOS40LTEwLjEsMzAtMTMuMmM3LTIuMSwxNC00LjUsMjEuNC01DQoJCWMxLjctMiw0LjMtMC4zLDYuMy0xLjZjMS45LTEuMSw0LjQsMC4zLDYuMy0wLjVjMy40LTEuNSw3LjEtMC4yLDEwLjQtMS4zYzMuNS0xLjIsNy4yLTAuNCwxMC43LTAuNWMzLjUtMC4yLDcsMCwxMC41LDANCgkJYzMuNywwLDcuNC0wLjUsMTEsMC4xYzUuNCwxLDExLjEsMC41LDE2LjMsMi44YzEuMSwwLjUsMi42LDAuMiwzLjksMC4xYzEuNC0wLjEsMi4yLDEuMSwzLjYsMS4xYzIuNiwwLjEsMjEuMiw2LDIzLjYsNi45DQoJCWM5LjYsMy44LDE4LjUsOSwyNi42LDE1LjFjNS45LDQuNCwxMS43LDkuMiwxNi4xLDE1LjVjMi43LDMuOSw2LDcuNCw4LjYsMTEuNGM0LjMsNi42LDguMSwxMy41LDExLDIwLjljMy4xLDguMSw2LjMsMTYuMSw4LDI0LjYNCgkJYzAuOSw0LjUsMi41LDksMy42LDEzLjVjMC41LDIuMSwxLjEsNC40LDEuMiw2LjRjMC4xLDMuMSwxLjgsNS45LDEuMiw5LjFjMiw0LjksMS4xLDEwLjMsMywxNS4yYzAuMSwwLjMsMCwwLjcsMCwxDQoJCWMtMC40LDUuNiwwLjgsMTEuMSwxLjMsMTYuNWMwLjUsNS43LDAuNiwxMS40LDAuNywxNy4xYzAuMSw1LjcsMC4yLDExLjMsMCwxN2MtMC4yLDUuNy0xLjMsMTEuMi0yLjYsMTYuOA0KCQljLTAuOSwzLjktMi43LDcuMy00LjUsMTAuN2MtMS41LDIuNy0zLjgsNS4yLTUuOSw3LjZjLTYuMSw2LjctMTMuNSwxMS43LTIxLjcsMTUuMmMtNi44LDIuOS0xMy43LDUuNS0yMSw3LjENCgkJYy00LjEsMC45LTgsMi40LTEyLjEsMy40Yy0zLjYsMC45LTcuMywyLTEwLjksMi41Yy0yLjUsMC4zLTQuOCwxLjMtNy4zLDEuN2MtMi42LDAuNS01LjMsMC44LTgsMS4zYy01LjIsMS0xMC4zLDIuMS0xNS42LDIuMQ0KCQljLTIuOSwxLjctNi4xLDAuNi05LjEsMWMtMi4yLDAuMy00LjMsMS4yLTYuNiwxYy0yLjItMC4yLTQuNS0wLjQtNi42LDAuOWMtMC43LDAuNC0yLDAuMS0zLDAuMWMtMTEuMywwLTIyLjYtMC4zLTM0LDAuMQ0KCQljLTguMSwwLjMtMTYtMS0yNC4xLTEuM2MtNS41LTAuMi0xMS4xLTEuMy0xNi43LTEuOGMtMi40LTIuMS01LjgsMC4xLTguMi0yYy0zLDAuNS01LjgtMC43LTguNS0xLjNjLTIuOS0wLjYtNS45LTEuNi04LjgtMi42DQoJCWMtMi45LTEtNS44LTIuMS04LjUtMy41Yy0yLjgtMS40LTUuNi0yLjgtOC4xLTQuNmMtOS45LTcuMS0xOC4zLTE1LjUtMjMuNC0yNi45Yy0wLjYtMS40LTEuMS0yLjktMS42LTQuM2MtMC4xLTAuNCwwLTEsMC4xLTEuNg0KCQljNi44LTAuNCwxMi41LTMuNCwxOC4xLTYuOWM1LjItMy4zLDguMy04LjMsMTEuOC0xM2MzLjUtNC43LDQuNS0xMC41LDYuOS0xNS42Yy0wLjQtMi45LDEuMy01LjYsMS4yLTguNWMtMC4yLTUsMC4xLTEwLTAuMS0xNQ0KCQljLTAuMy02LjEtMi4xLTEyLTQuMS0xNy44Yy0xLjUtNC4xLTMuNi04LTYtMTEuNWMtMy4xLTQuNS02LjYtOC42LTExLjItMTJjLTQuMi0zLjEtOC42LTUuNi0xMy41LTcuMmMtMi43LTAuOS01LjQtMS45LTguMy0xLjcNCgkJQzE2MS45LDIxNi43LDE1OCwyMTUuNiwxNTMuOSwyMTcuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMTYwLjksNTYzLjJjNS42LTEsMTAuNy0yLjQsMTUuNS00LjRjMy44LTEuNiw3LjUtNCwxMC43LTYuN2MyLjctMi4zLDYuMy0zLjgsOC4xLTdjMS43LTMsNC42LTQuOCw2LjEtNy45DQoJCWMxLjQtMi45LDMuMy01LjYsNC41LTguNmMyLjQtNS43LDQuMi0xMS42LDUuMy0xNy44YzEuMS02LjcsMS0xMy40LDAuNi0yMC4xYy0wLjMtNi4zLTIuMi0xMi41LTQuMy0xOC42DQoJCWMtMy42LTEwLjQtMTAuMS0xOC43LTE4LjEtMjUuOWMtNC40LTMuOS05LjgtNi43LTE1LjItOC45Yy0wLjctMC4zLTEuNywwLjQtMi4xLTAuN2MtMC4xLTEuMiwwLjctMSwxLjQtMS40DQoJCWMyLjItMS4xLDQuMS0yLjgsNi40LTMuOWM0LjgtMi4yLDkuNi00LjIsMTQuNS02YzYuNS0yLjQsMTMuNC0zLjksMjAuMS01LjhjMi4yLTAuNiw0LjYtMS40LDctMS4yYzEuOSwwLjEsMy40LTAuNyw1LjEtMQ0KCQljMS43LTAuNCwzLjYsMC43LDUuMS0xYzMuMywwLjcsNi4zLTEuNSw5LjYtMWMyLjcsMC41LDQuOS0xLjYsNy42LTFjMC42LDAuMSwxLjMsMCwxLjksMGMxLjMsMS44LDIuNSwzLjUsMy44LDUuMQ0KCQljMy43LDQuNSw5LjQsNS43LDEzLjksOC44YzUuMSwwLjIsOS42LDIuOCwxNC43LDMuM2MzLjUsMC4zLDcuMiwwLjIsMTAuNiwxYzIuNiwwLjUsNS4xLDEuMSw3LjYsMC44YzUuMi0wLjcsMTAuNC0xLjEsMTUuNi0wLjkNCgkJYzEuOS0xLjMsNC0xLDYuMS0xYzIsMC4xLDMuNy0wLjgsNS41LTEuMmM3LjctMS42LDE1LjUtMy44LDIyLTguMmM0LjYtMyw4LjgtNy4yLDkuNi0xNC4xYzEuMSwxLjcsMi4zLDEuMywzLjUsMS40DQoJCWMyLjUsMC4zLDUuMS0wLjYsNy43LDAuN2MyLjMsMS4xLDUuMi0wLjYsNy41LDEuM2M0LjctMC41LDksMS45LDEzLjcsMi4xYzEuNywwLjEsMy41LDAuNiw1LDEuMWM2LjUsMi4zLDEzLjMsMy45LDE5LjUsNy4yDQoJCWM1LjcsMywxMSw2LjEsMTUuNiwxMC43YzQuMyw0LjQsOC4zLDguOCwxMC42LDE0LjZjMi4zLDUuOCw0LjQsMTEuNSw1LjgsMTcuNmMxLjIsNS40LDEuOCwxMC45LDMuMSwxNi4yYzAuNywyLjksMC4zLDUuOCwxLDguNg0KCQljMC45LDMuNiwwLjMsNy4yLDEsMTAuNmMxLjQsNi43LDAsMTMuNSwxLDIwLjFjMS41LDkuNSwwLjMsMTkuMSwwLjksMjguNmMwLjMsNS4yLTEuNCwxMC4zLTEuMSwxNS42YzAuNCw1LjMsMC44LDEwLjgtMC4xLDE1LjkNCgkJYy0xLDUuNywwLDExLjUtMSwxNy4xYy0wLjcsNC4xLTAuMiw4LjItMSwxMi4xYy0wLjcsMy43LTAuMyw3LjUtMSwxMS4xYy0wLjcsMy40LTAuMyw2LjgtMSwxMC4xYy0wLjYsMi45LTAuMiw1LjktMSw4LjYNCgkJYy0wLjksMi44LTAuMiw1LjYtMSw4LjFjLTAuNywyLjEtMC45LDQuMS0wLjgsNi4xYzAsMS45LTAuOCwzLjctMS4yLDUuNmMtMS40LDguMS0yLjgsMTYuMi02LjYsMjMuN2MtMi45LDUuOS03LjgsOS41LTEzLjEsMTIuNw0KCQljLTQuMywyLjYtOS4xLDMuOS0xMy42LDUuN2MtMy43LDEuNC03LjcsMi42LTExLjYsMy4yYy0zLjQsMC41LTYuNiwyLjMtMTAuMSwyLjFjLTIuMSwxLjktNC44LDAuOS03LjIsMS44Yy0yLjEsMC44LTQuNSwxLjktNywxLjINCgkJYy00LjUsMi05LjYsMS40LTE0LjMsMi45Yy0yLjMsMC43LTUuMi0wLjMtNy41LDEuMWMtNC42LTAuOC05LDEuNS0xMy42LDFjLTIuMi0wLjMtMy45LDEuNC02LjEsMS4xYy0yLjEtMC4zLTQuNS0wLjYtNi41LDANCgkJYy01LjIsMS43LTEwLjQsMC43LTE1LjYsMC44Yy02LjUsMC4yLTEzLjEsMi4yLTE5LjUsMC45Yy02LjktMS40LTEzLjctMC40LTIwLjgtMWMtMS0wLjktMS45LTIuMi0yLjgtMy41DQoJCWMtNC40LTYuNS05LjYtMTIuNC0xNS41LTE3LjZjLTQuMi0zLjctOC41LTcuMy0xMy4zLTEwLjJjLTUuNC0zLjMtMTAuOC02LjctMTYuOS04LjdjLTIuOS0xLTUuNy0yLjQtOC43LTMuMQ0KCQljLTQuNC0xLjEtOC44LTIuMS0xMy4zLTNjLTYuNy0xLjItMTMuNC0wLjMtMjAuMS0wLjljLTQuNC0wLjMtOC42LDEuNy0xMy4xLDEuMWMtMC44LTAuMS0xLjEsMS4zLTIuMiwwLjljLTEuMi0wLjUtMS44LTEuNS0xLjctMw0KCQljMC4xLTIuMSwwLTQuMS0wLjktNi4xYy0wLjctMS43LDAuNS0zLjktMS4xLTUuNWMtMC4xLTAuMSwwLTAuMywwLTAuNWMwLjgtNC42LTEuNC05LTEtMTMuNmMwLjItMi44LTEuNS01LjItMS4xLTguMQ0KCQljMC40LTIuOCwwLjctNS44LDAtOC40Yy0xLjYtNS40LTAuOC0xMC44LTAuOC0xNi4xQzE2MC44LDU5NC4xLDE2MC45LDU3OC44LDE2MC45LDU2My4yeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik04NjEuNSw0MzYuMWMxLjgsMS4yLDMuOCwxLjUsNC42LDMuNWMtMC4yLDQuNy0xLjgsOS01LjIsMTIuNGMtMS44LDAtMy40LDAtNC44LDBjLTQuMSwyLjItNy45LDQuNC0xMS41LDYuOQ0KCQljLTMuMSwyLjEtNi4yLDQuNC05LjIsNi43Yy03LjcsNi0xNS45LDExLjEtMjQuNywxNS4zYy0zLjMsMS42LTYuNSwzLjUtMTAuMSw0LjVjLTIuOCwwLjgtNS41LDIuNS03LjMsNS4zYzAsMS41LDAsMy4yLDAsNC44DQoJCWMwLjgsMS40LDIuNCwxLjUsMy42LDIuNWMzLjgsMC40LDcuNS0wLjksMTAuOS0yLjNjNy42LTMuMSwxNC45LTYuNywyMS44LTExLjRjNS45LTQsMTEuNy04LDE3LjMtMTIuNGM0LjEtMy4yLDcuOC02LjksMTMuMy04LjgNCgkJYzAuOSwwLDIuNCwwLDMuOSwwYzAsMS44LDAsMy40LDAsNS4xYy0zLjYsOC45LTExLDE0LjktMTcuOSwyMC45Yy02LjYsNS45LTE0LjMsMTAuNi0yMi4yLDE1Yy01LjYsMy4xLTExLjEsNi4xLTE2LjksOC43DQoJCWMtNi42LDMtMTMuMyw1LjYtMjAuMSw4LjJjLTMuOSwxLjUtOCwyLjQtMTEuOSwzLjljLTMuOCwxLjQtNy44LDItMTEuNywzLjFjLTIuNCwwLjctNC44LDAuNC03LjEsMC45Yy03LjgsMS44LTE1LjcsMC41LTIzLjYsMC45DQoJCWMtMS4yLDAuMS0yLjUsMC40LTMuNS0wLjFjLTMuMi0xLjUtNi44LTAuOC0xMC4xLTIuM2MtMi43LTEuMi01LjYtMi4xLTcuOS0zLjdjLTMtMi4yLTYuMi00LTguNS03LjVjLTIuNC0zLjYtNC42LTctNS45LTExLjENCgkJYy0wLjktMi45LTEuOS01LjctMS43LTguOGMwLjItMy43LTAuMi03LjQsMC45LTExLjFjMS44LTUuNywzLjktMTEuMiw3LjktMTUuN2MyLjgtMy4xLDUuOS01LjksOC44LTguOWMxLjctMS44LDMuOC0zLjEsNS43LTQuNA0KCQljNC43LTMuMiw4LjMtNy41LDEyLjEtMTEuNWMyLjctMi44LDQuNi02LjMsNi41LTkuN2MzLjEtNS40LDYuNC0xMC44LDEwLjMtMTUuN2MzLjMtNC4yLDcuMS04LjIsMTEuOS0xMC45DQoJCWMyLjEtMS4yLDQuNy0xLjksNy40LTEuNWMxLDAuMSwyLDAsMywwYzAuOCwwLjgsMS42LDEuNywyLjUsMi41YzAuMywzLjItMC45LDYuMy0yLjIsOWMtMi41LDUuNC02LjIsMTAuMS05LjcsMTUNCgkJYy00LjMsNi05LjQsMTEuMi0xNC42LDE2LjRjLTIuOSwzLTMsNC44LTEuNiw4LjFjMC44LDEuOCwyLjUsMi43LDMuNiwyLjhjMy41LDAuMyw1LjUsMi41LDcuNSw0LjhjMy40LDMuOCw2LjUsNy45LDguOCwxMi4zDQoJCWMyLjEsMy45LDMuMyw4LjMsNC4yLDEyLjdjMC42LDMuMiwwLjksNi40LDAuOCw5LjZjMCwxLjQsMS4yLDIuMiwxLjMsMy41YzEuOCwxLjEsMy44LDEuNSw2LjIsMS4xYzMuNS0yLjQsNC40LTYsNC42LTEwLjMNCgkJYzAuNS0xMC40LTQuOC0yMy4xLTEwLjgtMzEuM2M2LjYtMS4yLDEzLTMsMTktNmMzLjItMS42LDYuNC0zLDkuNi00LjZjNS45LTMsMTEuMS03LDE2LjYtMTAuNmM0LTIuNiw3LjctNS42LDExLjYtOC4zDQoJCWM0LjMtMi45LDktNS41LDE0LjMtNS45YzEuMSwwLjgsMC41LDEuNywwLjcsMi42Yy02LDYtMTEuNywxMi4yLTE4LDE3LjhjLTQuMywzLjgtOS4zLDYuOC0xNC4zLDkuOGMtNC45LDMtMTAuNSw0LjgtMTUsOC42DQoJCWMtMS4zLDEtMywxLjUtNC41LDIuMmMtMS44LDAuOC0zLDIuMy00LjEsMy45Yy0wLjksMS40LTEuMiwyLjktMC45LDQuN2MwLjcsMC43LDEuNSwxLjUsMi40LDIuNGMxLjEsMCwyLjMtMC4yLDMuMSwxDQoJCWMxLTEuNywzLTAuMyw0LTEuMWMyLjYtMi4yLDUuOS0yLjgsOC44LTQuM2MyLjktMS41LDUuNi0zLjMsOC42LTQuNmMzLTEuMyw1LjctMy4yLDguNC00LjljMi44LTEuOCw1LjMtNC4xLDguMS01LjgNCgkJYzIuOS0xLjgsNS43LTMuNiw3LjktNi4xYzEuMy0xLjUsMy4zLTIsNC42LTMuNGMzLTMuMSw1LjctNi41LDguMi0xMC4xYzIuMS0zLjEsNS42LTMuOSw5LjEtNC40DQoJCUM4NTkuNSw0MzYsODYwLjUsNDM2LjEsODYxLjUsNDM2LjF6Ii8+DQoJPHBhdGggY2xhc3M9InN0NiIgZD0iTTI3OC44LDczMC44YzExLjksMCwyMy40LTAuMiwzNC45LDAuMWM2LjMsMC4yLDEyLjMtMS44LDE4LjYtMS4xYzMuNi0xLjcsNy40LTAuOSwxMS4xLTENCgkJYzIuMSwwLDMuOS0xLjQsNi4xLTEuMWMyLDAuMiw0LDAuMiw2LjEtMC43YzIuMi0wLjksNS0wLjgsNy41LTFjMy41LTAuMyw2LjktMS41LDEwLjYtMS4zYzIuMSwwLjEsNC40LTAuNyw2LjUtMS4xDQoJCWMxLjktMC40LDQtMC40LDUuOS0xLjVjMS0wLjYsMi42LTAuNSwzLjgtMC4zYzEuNSwwLjMsMi4zLTAuOSwzLjYtMS4yYzQuNi0wLjksOS4xLTEuOSwxMy41LTMuNWMyLjktMSw2LTEuNSw5LTIuMg0KCQljMS4xLTAuMywxLjgtMS40LDMuMi0xLjFjMSwxLDAuOCwyLjYsMC40LDMuNWMtMS40LDMuNy0xLjYsNy42LTIuOCwxMS4zYy0xLjMsMy44LTIuOCw3LjUtNC43LDExYy0yLjEsMy45LTQuNiw3LjYtNy43LDEwLjgNCgkJYy0zLjcsMy45LTcuNSw3LjUtMTEuMywxMS4zYy00LDQtOC44LDYuOC0xMy40LDkuOWMtMi42LDEuNy01LjMsMy4zLTguMSw0LjZjLTYsMi44LTEyLjEsNS41LTE4LjQsNy4yYy00LjksMS40LTEwLDIuNy0xNS4xLDMuNA0KCQljLTUuNCwwLjctMTAuNywxLjctMTYuMiwyYy0yLjYsMC4xLTUuNCwwLjYtOC4xLDAuOWMtMi45LDAuMy01LjMtMS4yLTguMS0xLjFjLTIuOCwwLjEtNS45LDAuOC04LjQtMC4yYy0yLjktMS4xLTUuOS0wLjUtOC45LTEuNA0KCQljLTIuOC0wLjgtNS44LTEuOC04LjktMS40Yy01LjYtMi42LTExLjktMy4yLTE3LjQtNi4yYy0yLTEuMS00LjItMS45LTYuMy0yLjhjLTAuOS0wLjQtMS42LTEtMi0yYzIuMy0zLjIsNC02LjYsNS41LTEwLjYNCgkJYzEtMC41LDIuNi0xLjEsNC4yLTEuNmM0LjMtMS42LDcuNi00LjgsMTAuMy04LjVjMy42LTQuOCw1LjQtMTAuMyw1LjEtMTYuNEMyNzguNyw3MzUuNSwyNzguOCw3MzMuMywyNzguOCw3MzAuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3Q3IiBkPSJNNjgwLjMsNDkzLjFjLTAuMiwxNy45LDcuMSwzMiwyMS40LDQyLjljLTEuMSwxLjQtMi44LDEuOS00LjMsMi40Yy01LjksMi0xMS4xLDUuMy0xNi43LDcuOQ0KCQljLTEwLjMsNC44LTIwLjUsOS45LTMwLjgsMTQuN2MtNy40LDMuNS0xNC43LDcuMS0yMi4yLDEwLjJjLTguOCwzLjUtMTcuNCw3LjgtMjYuNCwxMC45Yy01LjEsMS44LTEwLDMuOS0xNS40LDUuMQ0KCQljLTUuNCwxLjMtMTAuOCwyLjMtMTYuMiwxLjZjLTIuNi0wLjQtNS41LTEtOC0yLjNjLTQuNC0yLjEtNy01LjktOS0xMC4xYy0xLjYtMy4zLTEuMS0xMC40LTAuNC0xNC43YzAuNi0zLjQsMS40LTYuNiwyLjktOS44DQoJCWMyLjYtNS41LDctOS4yLDExLjUtMTIuOGMxLjctMS40LDMuMy0yLjksNS4zLTRjNy43LTQsMTUuNy02LjksMjMuNy0xMC4xYzYuMy0yLjUsMTIuNi00LjgsMTguOS03LjRjNy43LTMuMiwxNS41LTUuOSwyMy4yLTkuMQ0KCQljNy41LTMuMSwxNS4zLTUuNiwyMy04LjNDNjY3LjEsNDk3LjgsNjczLjUsNDk1LjUsNjgwLjMsNDkzLjF6Ii8+DQoJPHBhdGggY2xhc3M9InN0NCIgZD0iTTI0NC40LDc2NS41Yy0xLjMsMC43LTIuNywxLjQtNC40LDIuM2MtMi43LDAuOC01LjQtMS45LTguOC0wLjhjLTEuNC02LjktNi4yLTExLjgtOS4zLTE3LjcNCgkJYy01LTQuMi03LjgtMTAuMy0xMy42LTEzLjhjLTIuOC0xLjctNS00LjYtNy44LTYuNmMtNS40LTMuOS0xMS4zLTYuNi0xNi44LTdjLTMuNCwwLjktNC45LDIuNy02LjcsNC42YzAsMC45LTAuMywyLjEsMC4xLDMuMQ0KCQljMC41LDEuMywwLjYsMi43LDIuNCwzLjVjMS43LDAuOSwzLjQsMi4xLDUuMiwzYzguNCw0LjUsMTYuMSwxMCwyMi4yLDE3LjNjMy4zLDMuOSw2LjUsOC4yLDguNywxMi45YzEuNCwyLjksMy4zLDYuMywyLDEwLjQNCgkJYy0wLjgsMS4zLTIuNSwyLjItNC40LDMuMWMtMy43LTAuOS02LjktMy05LjktNS44Yy0yLjUtMi4zLTUuNi00LjItNy41LTYuOWMtMi4zLTMuMy01LjItNS44LTcuOS04LjdjLTMuNi0zLjgtOC02LjctMTIuOC04LjgNCgkJYy0zLjEtMS40LTYuMy0zLTkuOS0yLjdjLTEuNywwLjEtMi45LTEuMy00LjYtMS4xYy0xLjQsMC4xLTIuOCwwLjQtNC4yLTAuN2MtMC44LTAuNy0yLjYtMC4zLTMuOS0wLjJjLTEuNCwwLjItMi4zLTAuOS0zLjYtMS4yDQoJCWMtMy4yLTAuNi02LjItMS45LTkuMy0yLjljLTIuNS0wLjgtMy44LTMuNC02LjMtNGMtMi4zLTQuMi01LjYtNy43LTYuNy0xMi44Yy0wLjctMy40LTEuMi02LjktMC42LTEwLjFjMC43LTMuNSwxLjQtNy4zLDMuNi0xMC41DQoJCWMyLjQtMy41LDUuMy02LjQsOC44LTguOGM2LjctNC42LDE0LjUtNiwyMS44LTguN2MxLjYtMC42LDMuNywwLjcsNS0xLjFjMy4xLDAuNiw2LTAuOCw5LTEuMmM2LjItMC44LDEyLjQtMC44LDE4LjYtMC44DQoJCWMyLjYsMCw1LjEsMC40LDcuNiwwLjhjMi43LDAuNCw1LjQsMC44LDgsMS4zYzIuNCwwLjQsNC43LDEuNCw3LDIuM2M5LDMuNiwxNy41LDgsMjUuMiwxNGM1LjYsNC40LDEwLjYsOS40LDE1LjIsMTQuNw0KCQljMywzLjUsNi4xLDcuNSw3LDEyLjVjMC4xLDAuNywwLjQsMi4zLDEuNiwyLjhjMC42LDEuNy0wLjEsMy4zLDAuOSw1LjJjMS4yLDIuMy0wLjUsNC45LTEuMiw3LjNjLTAuOSwzLjItMy40LDUuMS02LjIsNw0KCQljLTEuNy00LjEtNC40LTcuOS02LjMtMTEuOWMtMC45LTEuOC0zLjEtMi40LTMuMy00LjZjLTQuNi01LjItOS0xMC42LTE0LjctMTQuOWMtMy45LTIuOS03LjctNi4xLTExLjgtOC44DQoJCWMtMi4yLTEuNS00LjgtMi4zLTYuOC0zLjljLTIuMi0xLjctNC43LTEuOC03LTIuNGMtMy4xLTAuOS02LjIsMC42LTguMywzLjNjMCwxLjcsMCwzLjQsMCw1LjFjMi4zLDEuNSw0LjYsMy4xLDcuMiw0LjQNCgkJYzUuNSwyLjcsMTAuNiw2LDE1LjQsOS45YzQuNCwzLjUsOC4xLDcuNywxMi4yLDExLjRjMy4xLDIuOCw1LjMsNi4zLDcuMSwxMGMxLDEuOSwyLjMsMy42LDMuMiw1LjYNCgkJQzI0Ni43LDc1Ny44LDI0Ni45LDc2MS40LDI0NC40LDc2NS41eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDQiIGQ9Ik04Ny42LDU4OS42Yy0zLTUuNi02LTEwLjYtMTAuMi0xNC44Yy00LjEtNC4xLTguNi03LjYtMTQtOS44Yy01LjUtMi4yLTExLjEtMy43LTE4LjEtMi45DQoJCWM1LjQtNS40LDEwLjQtOS45LDE0LjgtMTQuOWMxMy0xNC45LDI3LjctMjgsNDEuNC00Mi4yYzMuOS00LDguNS03LjIsMTMuNC05LjljNC44LTIuNiwxMC4zLTQuMSwxNS43LTIuOWM0LjksMSw5LjUsMy4xLDEzLjEsNw0KCQljMi4zLDIuNiw0LjgsNSw1LjcsOC42YzAuMiwwLjksMC41LDEuOCwwLjUsMi44YzAuMSwyLTAuMSw0LDAsNmMwLjUsNS41LTIuMSwxMC4xLTQuNywxNC41Yy0yLjIsMy43LTUuMiw2LjktNy45LDEwLjMNCgkJYy0zLjksNC43LTgsOS4yLTEyLjYsMTMuMWMtOC41LDcuMi0xNS42LDE1LjctMjQsMjIuOUM5Ni41LDU4MS4yLDkyLjUsNTg1LjMsODcuNiw1ODkuNnoiLz4NCgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNMTM2LjQsNjc4LjFjLTEzLjYsNi42LTIyLjMsMTYuNi0yNC44LDMxLjljLTItMS00LjItMS41LTUuNy0yLjljLTUuMS00LjQtMTAuOC04LTE1LjktMTIuNQ0KCQljLTQuOS00LjQtOS45LTguOC0xNS0xMy4xYy0xMC44LTkuMS0yMC0xOS43LTMwLjItMjkuNGMtMS4zLTEuMi0yLjItMi44LTMuMy00Yy0xLjktMi0xLTQuNi0yLjUtNi41YzEtNC43LDEuNy05LjYsNC41LTEzLjYNCgkJYzQuNi02LjYsMTAuMy0xMiwxOC0xNS4zYzUuOC0yLjUsMTEuNC0yLjMsMTcuMi0wLjZjMC42LDAuMiwxLjUsMC41LDIuMSwxYzMuNCwzLjQsNy4zLDYuNSwxMC4xLDEwLjNjMi4yLDIuOSw0LjUsNS44LDYuOSw4LjUNCgkJYzUuMiw1LjgsOS44LDEyLDE0LjgsMTcuOGMyLjIsMi42LDQuNSw1LjIsNi41LDcuOGMzLjYsNC42LDcuOCw4LjksMTEsMTMuOGMwLjgsMS4yLDIuMSwyLjEsMy4xLDMuMg0KCQlDMTM0LjMsNjc1LjcsMTM1LjIsNjc2LjgsMTM2LjQsNjc4LjF6Ii8+DQoJPHBhdGggY2xhc3M9InN0NiIgZD0iTTE1MS4yLDU0OGMwLjQtMywyLjUtNC4xLDMuOC02YzQuMS01LjksNi4zLTEyLjcsOC43LTE5LjRjMC4zLTAuOSwwLjEtMS45LDAuMy0yLjljMC4zLTIuMi0wLjctNC41LDAuOS02LjYNCgkJYzEtMS4zLTEtMi4yLTEtMy41YzAuMS02LjQtMi41LTEyLTYuMS0xNi45Yy00LjMtNS45LTEwLjItOS45LTE3LTEyLjdjLTYuNC0yLjctMTMuMS0yLjQtMTkuNi0xLjdjLTMuOCwwLjQtNy44LDEuNy0xMS40LDMuNg0KCQljLTAuNCwwLjItMC45LDAuMi0xLjUsMC4yYzEuOS02LjgsNS40LTEyLjYsOS40LTE4YzMuNi00LjgsOS40LTcuMiwxMy45LTExYzUuMi0wLjksOS43LTQuNiwxNS4zLTRjMi45LTEuNyw2LjEtMS4xLDkuMS0wLjkNCgkJYzYuMSwwLjQsMTEuOSwyLDE3LjMsNS4zYzIuNywxLjYsNS41LDMuMiw3LjgsNS4yYzQuNiwzLjksOC42LDguOCwxMSwxNC40YzIuOSw2LjgsNS42LDEzLjcsNS4xLDIxLjRjLTAuMiwzLjUsMC4xLDctMC4xLDEwLjUNCgkJYy0wLjEsMS43LTAuMiwzLjUtMC40LDUuM2MtMC45LDYuNi0zLjUsMTIuNi02LjcsMTguMmMtNC44LDguNC0xNS4zLDE1LjQtMjUuMSwxOC42QzE2MC4yLDU0OC41LDE1NS43LDU0Ny43LDE1MS4yLDU0OHoiLz4NCgk8cGF0aCBjbGFzcz0ic3Q0IiBkPSJNNTM4LDU3Ny4zYy0xLjgtMS0yLjctMS45LTMuNi0xLjljLTMuNC0wLjEtNS4yLTMuNS04LjUtMy42Yy0zLjktMy41LTkuMS00LjctMTMuNC03LjQNCgkJYy00LjYtMi45LTkuNC01LjQtMTQuMi04Yy01LjItMi44LTEwLTYuMS0xNS4zLTguN2MtMy45LTEuOS03LjUtNC41LTExLjEtN2MtMC43LTAuNS0xLjUtMC40LTIuMi0xYzAtNC42LDAtOS4yLDAtMTQuNA0KCQljMTEuNy05LjMsMTcuNi0yMi4yLDIwLjItMzcuMWMyMS40LDE0LjEsNDIuOCwyOC4xLDY1LDQxLjNjLTcsNS45LTEyLjMsMTIuNy0xNS4zLDIxLjNDNTM2LjUsNTU5LjIsNTM1LjYsNTY3LjcsNTM4LDU3Ny4zeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDYiIGQ9Ik0xNDkuNiwzMDcuM2MtMi43LTEuOS01LjctMi42LTcuOS00LjdjLTQuOC00LjYtNy43LTEwLjMtOS43LTE2LjVjLTEuMi0zLjgtMi4xLTcuNi0yLjItMTEuNg0KCQljLTAuMS0yLjctMS4yLTUuMy0wLjgtOC4xYzAuNC0zLDAuNy02LDEuNC04LjljMS4yLTQuOCwzLjMtOS4zLDUuNy0xMy42YzEuNy0zLDQuNy01LjMsMTAuMS02LjdjNi4xLTAuNCwxMS42LDMuMiwxNiw5LjcNCgkJYzMuNiw1LjUsNS4xLDkuNCw2LjksMTYuMWMwLjYsMi4xLDAuMyw0LjIsMSw2LjFjMC44LDIuMSwxLDQuMSwwLjgsNi4xYy0wLjIsMi4yLDAuNSw0LjQtMC44LDYuN2MtMSwxLjYsMC43LDQuMi0xLjEsNg0KCQljMC4zLDUuMy0yLjgsOS40LTQuOSwxMy45Yy0xLjcsMy43LTQuOSw0LjctOC4zLDUuM0MxNTMuOCwzMDcuNiwxNTEuNywzMDcuMywxNDkuNiwzMDcuM3oiLz4NCgk8cGF0aCBjbGFzcz0ic3Q4IiBkPSJNMzQzLjYsMzg4LjJjMCw1LjksMCwxMS41LDAsMTcuNWMtMywzLjQtNyw1LjQtMTEuOCw2LjZjLTMuMSwwLjgtNi40LDEuMS05LjQsMi42Yy0wLjQsMC4yLTAuOSwwLjItMS40LDAuMg0KCQljLTcsMC40LTE0LDEuNS0yMS4xLDFjLTMuMi0wLjItNi4zLDAtOS41LDBjLTcuOSwwLTE1LjEtMi41LTIyLTZjLTEtMC41LTEuNy0xLjUtMi43LTIuM2MwLTUuNCwwLTEwLjksMC0xNi43DQoJCWM1LjUsMCwxMS0wLjQsMTYuNCwwLjJjMi43LDAuMyw1LjUsMS4zLDguMSwwLjdjNy41LTEuNiwxNS4xLTAuMSwyMi42LTFjNS4yLTAuNiwxMC40LTAuOCwxNS42LTAuOWMzLjYtMi4yLDgsMC4xLDExLjctMS45DQoJCUMzNDEsMzg3LjgsMzQyLjQsMzg4LjIsMzQzLjYsMzg4LjJ6Ii8+DQoJPHBhdGggY2xhc3M9InN0NiIgZD0iTTI2LjksNjM0LjdjLTQuMS0zLjktOC44LTcuMy0xMC4zLTEyLjhjLTAuNi0yLjItMS43LTQuNC0xLjYtNi44YzAtMS43LDAuMS0zLjMsMC01DQoJCWMtMC42LTguMSwzLjItMTQuOCw2LjktMjEuNmMzLjItNS43LDguOC04LjQsMTQuMi0xMS4yYzEuNC0wLjgsMy40LDAuNiw0LjQtMS4zYzQuNywwLjMsOS41LTAuOSwxNCwxYzMuNSwxLjUsNywyLjcsOS42LDUuNw0KCQljMS44LDIuMSw0LDMuOSw1LjcsNi4xYzEuNiwyLjEsMi43LDQuNSw0LDYuOGMtMy4yLDAuNC02LjMsMS4xLTkuNSwxLjVjLTQsMC41LTguMiwxLjktMTEuOCwzLjljLTUuMSwyLjktMTAsNi4zLTE0LjEsMTAuNg0KCQljLTUuNCw1LjctOC41LDEyLjctMTEuNSwxOS43QzI2LjcsNjMyLjMsMjcsNjMzLjYsMjYuOSw2MzQuN3oiLz4NCgk8cGF0aCBjbGFzcz0ic3Q5IiBkPSJNMTYyLjcsMjI5LjZjMi44LTAuNiw1LjEsMC44LDcuMywxLjVjMywxLDUuNCwzLDguMSw0LjdjNS4yLDMuNCw4LjEsOC40LDExLjEsMTMuNGMyLjYsNC40LDMuOCw5LjQsNC45LDE0LjUNCgkJYzEuMSw0LjksMC43LDkuNywwLjcsMTQuNmMwLDMtMC43LDYtMS40LDguOWMtMS4xLDQuOC0zLjIsOS41LTUuOCwxMy41Yy0yLjIsMy40LTUuNSw2LjUtOS4zLDguNmMtMi4zLDEuMy00LjYsMi4zLTcuMywyLjkNCgkJYzQuNi01LDYuMi0xMS4zLDguNi0xNy4zYzAuNy0xLjgsMC43LTQuMSwxLTZjMC4zLTIuNCwxLjYtNC41LDEuMy03LjFjLTAuMy0yLjUtMC4zLTUsMC03LjVjMC41LTQuMS0xLjQtOC0xLjEtMTIuMQ0KCQljLTIuOS04LjYtNC45LTE3LjYtMTEuMi0yNC45QzE2Ny41LDIzNC45LDE2NS4xLDIzMi40LDE2Mi43LDIyOS42eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDYiIGQ9Ik0yODMuOCwyNS42Yy0wLjIsNC42LDAuOSw5LjQtMi4zLDEzLjVjLTMuNywyLjktNy41LDUuOC0xMi41LDYuNWMtMi40LDAuNC00LjQtMC43LTYuNS0xLjINCgkJYy0yLjctMC42LTQuNC0zLjItNi4xLTQuOWMtMi4xLTQuMi0xLjQtOC40LTEuNS0xMmMyLjktNi43LDcuMS0xMS40LDE0LjEtMTEuOUMyNzYsMTUuMSwyODAuNCwxOS42LDI4My44LDI1LjZ6Ii8+DQoJPHBhdGggY2xhc3M9InN0MTAiIGQ9Ik00NjAuOCw0NTEuM2M3LjQsNi43LDEzLjUsMTQuNCwxNC43LDI0LjVjMS4xLDkuOSwwLjEsMTkuOC02LjUsMjguMUM0NjcuMSw0ODYuMyw0NjUuNCw0NjguNiw0NjAuOCw0NTEuM3oiDQoJCS8+DQoJPHBhdGggY2xhc3M9InN0MTEiIGQ9Ik04MDQuOSwxMjFjLTE3LjEtMTAuOC0zMy42LTIxLjEtNTAuMi0zMS41Yy0xLjEtMi41LDAuNC00LjcsMS4xLTYuOGMzLjgtMTEuMSw4LjEtMjEuOSwxMS43LTMzLjENCgkJYzEuMy00LjEsMi43LTguMiw0LjUtMTIuMWMwLjQtMS0wLjItMiwwLjYtMi43YzEuMS0wLjMsMi0wLjEsMy4xLDAuNmM1LjIsMy40LDEwLjUsNi43LDE1LjgsOS45YzUuOCwzLjYsMTEuNiw3LjIsMTcuNiwxMC41DQoJCWM1LjIsMi45LDkuOCw2LjYsMTUuMiw5LjFDODE4LDgzLjYsODExLjUsMTAyLjEsODA0LjksMTIxeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDExIiBkPSJNODE5LjgsMTIxLjFjMS41LTQuOCwyLjUtOC42LDMuNy0xMi4yYzEuNS00LjUsMy4xLTksNC44LTEzLjVjMi4zLTUuOSw0LjEtMTEuOSw2LjQtMTcuOA0KCQljMS4yLTMuMSwyLjgtNi4zLDIuNy05LjZjMS42LTIuNCw0LjItMS41LDYuMi0yLjNjNi44LTIuNiwxMy43LTQuNywyMC43LTYuN2M0LjYtMS4zLDkuMi0yLjUsMTMuNi00LjRjMC42LTAuMywxLjYtMC40LDIuMSwwLjMNCgkJYy02LjMsMTguMS0xMi43LDM2LjEtMTkuMSw1NC40Qzg0OCwxMTMuNyw4MzQuMiwxMTYuNSw4MTkuOCwxMjEuMXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTg3Ni45LDQxLjNjLTYuOSwxLjQtMTIuNSw0LTE4LjYsNS40Yy00LjIsMC45LTguMSwyLjgtMTIuMyw0Yy0zLjQsMS02LjUsMi45LTEwLjIsM2MtMC40LDAtMC43LDAuNy0xLjEsMC45DQoJCWMtMC4zLDAuMS0wLjcsMC0xLjQsMGMtMTUuNS05LjUtMzEuMy0xOS4yLTQ3LjctMjkuM2MxNC45LTMuOCwyOC45LTguMSw0My43LTExLjNjNi40LDMuOSwxMy41LDguMSwyMC41LDEyLjMNCgkJYzMuNCwyLjEsNi45LDQuMSwxMC41LDUuOGM0LjYsMi4zLDksNC45LDEzLjQsNy41Qzg3NC41LDQwLjEsODc1LjMsNDAuNSw4NzYuOSw0MS4zeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNOTY5LjUsMjAzLjhjLTE2LjEtMTMtMzIuNy0yNC44LTQ4LjctMzhjNy4xLTE3LjIsMTQuMS0zNC4yLDIxLjItNTEuNmMxNi40LDEyLjEsMzIuOCwyNC4zLDQ5LjEsMzYuNA0KCQljLTEuOCwzLjktMy41LDcuNy00LjcsMTEuNmMtMS4zLDQtMy45LDcuNS00LjIsMTEuN2MtMy40LDUuNi00LjksMTEuOS03LjYsMTcuOEM5NzIuOCwxOTUuNiw5NzEuNiwxOTkuNyw5NjkuNSwyMDMuOHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QxMSIgZD0iTTEwNDQuOSwxMzBjLTE0LjgsMy43LTI4LjYsNy4yLTQyLjUsMTAuOGMtMC4zLDAuMS0wLjUsMC40LTAuOCwwLjdjLTE1LjgtMTEuOC0zMS42LTIzLjYtNDcuOC0zNS43DQoJCWM3LjUtMi4xLDE0LjYtMy41LDIxLjctNS4yYzctMS43LDE0LTMuMSwyMS40LTQuN0MxMDEyLjQsMTA2LjksMTAyOC4zLDExOC4yLDEwNDQuOSwxMzB6Ii8+DQoJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik0xMDI3LjQsMTkzLjRjLTEzLjksMy45LTI4LjUsNy4yLTQzLjMsMTEuMWM0LjUtMTAuOCw4LjUtMjEuMiwxMi43LTMxLjVjMi4zLTUuNSw0LjktMTEsNi40LTE2LjgNCgkJYzAuMy0xLDEuNC0xLjcsMi4zLTIuN2M0LjcsMC4yLDguOS0yLjQsMTMuNi0zLjFjNC43LTAuOCw5LjQtMi4yLDE0LTMuNGM0LjUtMS4xLDktMi4zLDE0LTMuNmMtMi44LDguNi02LjYsMTYuNS05LjUsMjQuOA0KCQlDMTAzNC44LDE3Ni43LDEwMzEsMTg0LjgsMTAyNy40LDE5My40eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNODQ1LjcsMjQ0YzExLjcsMTUuNywyMy4xLDMwLjksMzQuOCw0Ni42Yy0xMC41LDE0LTIxLjEsMjguMS0zMS45LDQyLjZjLTEyLjEtMTUtMjQuMi0zMC4yLTM2LjMtNDUuMw0KCQlDODIzLjQsMjczLjMsODM0LjMsMjU4LjksODQ1LjcsMjQ0eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNOTA0LDM0Mi4xYy0wLjktMC4xLTEuMi0xLTIuMS0wLjljLTIuNywwLjEtNS4zLDAuMi04LDBjLTIuNy0wLjItNS4zLDAuNS04LjItMC43Yy0yLjMtMC45LTUuMi0wLjQtNy45LTAuMg0KCQljLTUuNSwwLjMtMTEtMC40LTE2LjctMS40YzEwLjItMTMuOCwyMC40LTI3LjQsMzAuOS00MS42YzQuNiwwLDEwLTAuNywxNS4yLDAuMmM2LjIsMS4xLDEyLjQsMC41LDE4LjYsMC44YzIuNywwLjEsNS4yLDIsOC4yLDAuNg0KCQljLTAuNiwzLjYtMy4yLDUuNC00LjgsNy43Yy00LjUsNi4zLTksMTIuNi0xMy41LDE4LjlDOTExLjgsMzMxLDkwNy42LDMzNi40LDkwNCwzNDIuMXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QxMiIgZD0iTTkwMi42LDI0NC4zYzMuNiwxLjcsNS4yLDUuMiw3LjUsNy45YzIuOCwzLjIsNS4xLDYuOCw3LjcsMTAuM2M0LjgsNi41LDEwLjIsMTIuNSwxNC41LDE5LjQNCgkJYzAuOCwxLjMsMi4yLDIuNCwzLjIsMy40Yy0xLjEsMS42LTIuNSwxLjItMy40LDAuOWMtNS4zLTEuNy0xMC44LTAuMS0xNi0xYy03LjctMS40LTE1LjQtMC41LTIzLjUtMWMtNS43LTcuMS0xMC45LTE1LTE2LjYtMjIuNg0KCQljLTUuNy03LjUtMTAuOS0xNS4zLTE3LjItMjIuN2MxLjYtMC43LDEuOCwwLjYsMi43LDAuNWM0LjEtMC44LDguMSwwLjUsMTIsMS4yYzUuMiwwLjksMTAuNywwLjgsMTUuNywyLjgNCgkJQzg5My44LDI0Mi42LDg5OC4yLDI0NS4xLDkwMi42LDI0NC4zeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDEyIiBkPSJNMTAwNS44LDI5NC43YzEyLjEsMTQsMjMuNiwyNy41LDM1LjIsNDFjLTcuNiwxNC40LTE1LjMsMjguOC0yMi4zLDQzLjVjLTYuNy01LjQtMTEuNy0xMi40LTE3LjUtMTguNg0KCQljLTMuMS0zLjMtNi41LTYuNS05LjItMTAuMWMtMi42LTMuNC01LjYtNi4zLTguNy05LjZjMy41LTYuOSw3LjQtMTMuNiwxMC4zLTIwLjhDOTk3LjIsMzExLjUsMTAwMiwzMDMuNiwxMDA1LjgsMjk0Ljd6Ii8+DQoJPHBhdGggY2xhc3M9InN0MTIiIGQ9Ik0xMDUxLjEsMzI2LjljLTMuMi00LjEtNy04LTEwLjQtMTIuM2MtMi4zLTIuOS00LjgtNS43LTcuNC04LjRjLTUuNi01LjktMTAtMTIuOC0xNi4xLTE4LjMNCgkJYy0wLjItMC4yLTAuMS0wLjYtMC4xLTEuMWMxMi43LTIuMSwyNS40LTQuMSwzOC40LTYuM2MxMy41LDEyLjIsMjUuMiwyNi42LDM4LjgsMzkuNUMxMDc5LjksMzIyLjIsMTA2NS44LDMyNC41LDEwNTEuMSwzMjYuOXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QxMiIgZD0iTTEwNzQsMzc2LjJjLTMuOC0wLjMtNywwLjgtMTAuMSwxLjdjLTIuMywwLjYtNC43LDAuNS03LDFjLTIuNiwwLjUtNS4zLDEuMi04LDEuNWMtMi41LDAuMy01LjQsMC4yLTcuNywxLjgNCgkJYy0zLjQtMC44LTYuNSwxLjgtMTAsMC44YzEuNC0yLDMuMi0zLjcsMy02LjNjMi43LTIuNSwzLjctNi4xLDUuMy05LjNjMy45LTcuOCw3LjgtMTUuNywxMS43LTIzLjVjMC45LTEuNywxLjctMy40LDMuMy00LjQNCgkJYzEzLjItMi4xLDI2LjMtNC4yLDM5LjgtNi40Yy01LjIsOS45LTguNywyMC4xLTEzLjksMjkuNEMxMDc5LjMsMzY3LjUsMTA3Ni4xLDM3MS40LDEwNzQsMzc2LjJ6Ii8+DQoJPHBhdGggY2xhc3M9InN0MCIgZD0iTTMzNS44LDI0NWMwLDIuMi0wLjEsNC4zLDAsNi41YzAuMyw0LjEtMSw3LjktMi4zLDExLjVjLTIuNSw2LjgtNi41LDEyLjgtMTIuMywxNy4zYy02LjMsNC45LTEzLjIsOC41LTIxLjYsOA0KCQljLTEuOC0wLjEtMy43LDAtNS41LDBjLTkuMiwwLjEtMTYuNy0zLjgtMjMuNC05LjdjLTEuMi0xLjEtMi40LTIuMy0zLjUtMy41Yy01LjYtNS42LTguMS0xMi44LTEwLjQtMjAuMQ0KCQljLTIuNS04LjEtMi4yLTE2LjQtMS44LTI0LjZjMC4zLTQuNywxLjQtOS42LDMuNC0xNGMyLTQuNCw0LjMtOC42LDcuMi0xMi41YzQuNC01LjksMTAuMy05LjUsMTYuNy0xMi42YzIuNS0xLjIsNS0yLDcuNy0xLjkNCgkJYzIuMiwwLjEsNC4zLDAsNi41LDBjOC41LTAuMSwxNS42LDMuMiwyMS43LDljMC4xLDAuMSwwLjIsMC4yLDAuNCwwLjRjNy43LDYuMiwxMS4zLDE0LjksMTQuMSwyNC4xQzMzNSwyMzAsMzM2LjQsMjM3LjQsMzM1LjgsMjQ1DQoJCXoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMzY0LjcsMjI2LjRjMC0yLjMtMC4yLTQuNywwLTdjMS0xMC4xLDMuOS0xOS40LDExLjItMjYuOGMxLjQtMS40LDIuNi0zLjEsNC4zLTQuMWMzLjYtMi4yLDcuMi00LjQsMTEuOC00LjINCgkJYzEuOSwwLjEsMy41LTEuNCw1LjgtMC4xYzEuNiwwLjksMy45LDAuMyw2LDEuMWM1LjksMi4zLDEwLjgsNiwxNC44LDEwLjhjMi45LDMuNSw0LjcsNy43LDYuOCwxMS42YzIuMSw0LDMuMiw4LjMsNC4yLDEyLjcNCgkJYzEuNSw2LjMsMi4xLDEyLjcsMiwxOS4xYy0wLjEsNC43LTEuNSw5LTIuNCwxMy41Yy0wLjksNC4zLTMsOC4zLTUuNywxMS41Yy00LjcsNS42LTkuOCwxMS4yLTE4LDExLjZjLTYuNCwyLjgtMTQuNC0wLjEtMjAuMS0zLjgNCgkJYy05LTUuOS0xNC40LTE0LjQtMTcuOC0yNC41QzM2NS4zLDI0MSwzNjQuMiwyMzMuOCwzNjQuNywyMjYuNHoiLz4NCgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMzE0LjgsMzEyLjdjMS40LTEuNCwyLjgtMi44LDQuMy00LjNjMy40LTAuOCw2LjUsMC44LDkuNywxLjNjMy45LDAuNyw3LjYsMS44LDExLjQsMi43DQoJCWM2LjQsMS40LDEyLjgsMS4zLDE5LjEsMC42YzcuNy0wLjgsMTUuNS0xLjgsMjIuNy01LjNjMi4zLTEuMSw0LjgtMiw3LjUtMy40YzIuMiwwLDQuOSwwLDcuOCwwYzAuOSwxLjEsMS45LDIuMywzLjMsNC4xDQoJCWMwLjIsNS44LTAuNSw2LjYtNi4zLDEwLjljLTUuNSw0LTExLjYsNi0xOS4yLDcuOWMtNC4yLDEuMS04LjUsMS4zLTEyLjYsMi4yYy00LjgsMS05LjQsMC43LTE0LjEsMC43Yy0yLjMsMC00LjcsMC42LTcuMi0wLjcNCgkJYy0xLjgtMS00LjUsMC40LTYuNS0xLjJjLTQuNywwLjEtOC43LTItMTIuOC00QzMxNS45LDMyMS4zLDMxNC43LDMxOS40LDMxNC44LDMxMi43eiIvPg0KCTxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik00MjUuNiw0ODkuNWMyLjEsMTUuMiwwLjgsMzAuNiwxLDQ1LjljMC4yLDE1LjUsMCwzMSwwLjEsNDYuNGMwLDMuMS0xLjUsNS45LTEuMSw5LjFjMC40LDMuMSwwLjcsNi41LTAuMSw5LjQNCgkJYy0xLjEsNC4xLTAuOCw4LjEtMC43LDEyLjFjMCwxLjktMS41LDMuMS0xLjIsNS4xYzAuMywxLjcsMC40LDMuNS0wLjgsNS4xYy0wLjYsMC44LTAuMSwyLjMtMC4xLDMuMWMtMC44LDEuOC0xLjMsMy41LTIuMyw0LjgNCgkJYy0yLjEsMi40LTQuNiw0LjEtNy43LDUuNWMtMy4zLDEuNS02LjgsMS45LTEwLjEsMy40Yy0yLDAuOS00LjMsMC42LTYuNCwxLjNjLTEuNywwLjYtMy44LDAtNS41LDEuMWMtMy42LTAuOC03LDEuNC0xMC42LDENCgkJYy0yLTAuMi0zLjUsMS41LTUuNiwxLjFjLTEuOC0wLjMtMy45LTAuNS01LjYsMC45Yy0wLjMsMC4yLTEsMC4xLTEuNSwwYy00LjQtMC42LTguNiwxLjYtMTMuMSwxYy0zLjYsMi4yLTgtMC4yLTExLjcsMg0KCQljLTAuMSwwLjEtMC4zLDAtMC41LDBjLTUuMS0wLjYtMTAsMS41LTE1LjEsMS4xYy0yLjItMC4yLTQuMiwxLjMtNi42LDFjLTIuMi0wLjItNC42LTAuNy02LjYsMC45Yy0wLjEsMC4xLTAuMywwLTAuNSwwDQoJCWMtNS4xLTAuNy0xMCwxLjEtMTUuMSwxYy03LjItMC4yLTE0LjMsMS45LTIxLjYsMWMtNi4xLTAuOC0xMi4yLTItMTYuNS03LjFjLTMuMy0zLjktNS4zLTguNS01LjQtMTMuN2MtMC4xLTQtMC42LTguMSwwLjEtMTINCgkJYzEuNC04LTAuMS0xNi4yLDEuMS0yNGMxLjItOC4yLTAuMi0xNi41LDAuOS0yNC42YzEuNC0xMC40LDAuNy0yMC43LDAuOC0zMS4xYzAuMi0xMC41LTAuMS0yMSwwLjEtMzEuNGMwLjEtNSwxLjgtOS41LDUuNi0xMy4yDQoJCWMzLTMsNi40LTUuMSwxMC40LTYuM2MwLjMtMC4xLDAuNi0wLjQsMC44LTAuNGMzLjgsMC41LDcuMy0xLjksMTEuMS0xYzIuNCwwLjYsNC4zLTEuMSw2LjYtMWMyLjIsMC4xLDQuNiwwLjcsNi40LTAuMQ0KCQljMi44LTEuMiw1LjUtMC45LDguMS0wLjdjMi41LDAuMSw0LjYtMS40LDcuMS0xLjFjMi41LDAuMiw1LjIsMC43LDcuNC0wLjFjMy40LTEuMiw2LjgtMC44LDEwLjEtMC44YzIuNiwwLDQuOS0xLjQsNy42LTEuMg0KCQljMi41LDAuMiw1LjIsMC45LDcuNi0wLjljMC4yLTAuMiwwLjctMC4xLDEsMGM3LjQsMC44LDE0LjctMS42LDIyLjEtMWMyLjYsMC4yLDQuOS0xLjQsNy42LTEuMWMyLjYsMC4zLDUuNSwwLjcsNy45LTAuMQ0KCQljNC4yLTEuMyw4LjQtMC45LDEyLjYtMC43YzMuNywwLjIsNy0xLjUsMTAuNi0xLjFjNy4yLDAuOCwxMy42LDMsMTYuNCwxMC43QzQyNSw0ODksNDI1LjMsNDg5LjIsNDI1LjYsNDg5LjV6Ii8+DQoJPHBhdGggY2xhc3M9InN0MTMiIGQ9Ik0zMDYuMywyNTUuM2MtMS44LDAtMy40LDAtNSwwYy00LjctMi41LTUuOS03LTYuNC0xMS43Yy0wLjQtMy4xLTAuMS02LjMtMC4xLTkuNGMwLjctMi4zLDIuMy0zLjgsNC01LjMNCgkJYzIuNi0yLjIsNS41LTIuMSw4LjEsMC4xYzMuMSwyLjUsNC42LDUuOSw0LjksOS45YzAuMSwyLDAsNCwwLDZjMCwzLjMtMC44LDYuMy0zLjUsOC41QzMwNy43LDI1My44LDMwNy4xLDI1NC41LDMwNi4zLDI1NS4zeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDE0IiBkPSJNNDAwLjIsMjQzLjNjLTYuMy01LjQtNi44LTEyLjctNi41LTIwLjNjMC43LTIuMywyLjctMy44LDQuMy01LjVjMi41LTAuNiw0LjctMC4xLDYuMSwxDQoJCWM1LjUsNi4xLDQuNywxMyw0LjQsMTkuN2MtMC4xLDIuMS0xLjQsNC41LTQuMiw1LjJjLTAuNCwwLjEtMC44LDAuNi0xLjEsMC45QzQwMi41LDI0My4xLDQwMS4zLDI0My4zLDQwMC4yLDI0My4zeiIvPg0KCTxwYXRoIGNsYXNzPSJzdDYiIGQ9Ik0yNzIuNiw1MDcuN2MyLTEuOCwzLjMtMy43LDYuNC00LjVjMi4zLDAuOCw1LjEtMS4zLDguMi0xLjJjMywwLjEsNi4yLDAuNiw4LjktMC4xYzMuNC0wLjksNi45LTAuMSwxMC4xLTENCgkJYzMuMS0wLjgsNi4zLDAsOS0xLjFjMy0xLjMsNS45LDAsOC42LTAuOGMzLjctMS4yLDcuNS0wLjMsMTEuMS0xLjFjMy43LTAuOSw3LjYtMC4xLDExLjEtMWM0LjQtMS4xLDguOC0wLjEsMTMuMS0xDQoJCWM0LjctMC45LDkuNS0wLjEsMTQtMS4xYzQuOS0xLDkuOC0wLjcsMTQuNi0wLjdjMi41LDAsNC42LTEuNCw3LjEtMS4yYzIuNSwwLjIsNS4zLDAuOCw3LjQtMC4xYzMuMS0xLjQsNS41LTAuMSw4LjMsMC40DQoJCWMyLjMsMi43LDMsNi4yLDMuMSw5LjZjMC4yLDE2LjgsMC4xLDMzLjYsMC4xLDUwLjRjLTIuMSwxMC42LTAuMSwyMS40LTEuMiwzMmMtMC41LDUuNC0wLjEsMTAuOC0xLDE2Yy0wLjcsMy45LTAuNyw3LjctMC43LDExLjYNCgkJYzAsMS42LTEuNCwyLjUtMS4xLDQuMWMwLjIsMS40LDAuMSwzLDAuMSw0LjRjLTMuNywxLjktNy42LDIuOC0xMS42LDMuNmMtNi4xLDEuMi0xMi4yLDEuOS0xOC4yLDNjLTIuNiwwLjUtNS4yLDAuMi03LjYsMC45DQoJCWMtMi42LDAuOC01LjEsMC45LTcuNiwwLjhjLTEuOCwwLTMuMSwxLjYtNS4xLDEuMWMtMS41LTAuNC0zLjMtMC41LTQuNiwwLjljLTAuMSwwLjEtMC4zLDAtMC41LDBjLTQuNi0wLjgtOSwxLjUtMTMuNiwxDQoJCWMtMi4yLTAuMy0zLjksMS4yLTYuMSwxLjFjLTEuOC0wLjEtNC0xLTUuNiwwLjljLTAuMSwwLjItMC42LDAuMS0xLDBjLTUuNi0wLjYtMTEuMSwwLjctMTYuNSwxLjJjLTYuNCwwLjYtMTIuOCwwLTE5LjEsMQ0KCQljLTQuNCwwLjYtOC43LDAuNy0xMy4xLDAuOGMtNC4yLDAuMS04LTAuOS05LjgtNi4zYzAtNy0wLjctMTUuMSwwLjItMjIuOWMwLjgtNy4yLTAuMi0xNC41LDEtMjEuNWMxLjUtOS4yLTAuMi0xOC41LDEtMjcuNQ0KCQljMS4yLTkuMiwwLjYtMTguNCwwLjktMjcuNmMwLjEtNC40LTEuMi04LjYtMS4xLTEzLjFDMjcxLjgsNTE1LjEsMjczLjcsNTExLjYsMjcyLjYsNTA3Ljd6Ii8+DQo8L2c+DQo8L3N2Zz4NCg==" alt="Logo" width="220" />

## Distry

Distributed task execution framework. Scale your Python functions across multiple workers.

## Features

* **Zero-config setup** - Auto-detects and installs dependencies
* **Simple API** - Just `client.map(func, inputs)`
* **Fault-tolerant** - Handles worker failures gracefully
* **Automatic Job Batching** - Large jobs are automatically split to fit worker RAM limits.
* **Package management** - Installs required packages on workers
* **Global indexing** - Results returned in input order

## Installation

```plaintext
# Client only (for task submission)
pip install distry-py[client]

# Worker only (for task execution)
pip install distry-py[worker]

# Full installation
pip install distry-py[all]
```

## Quick Start

### 1. Start Workers

```plaintext
# Terminal 1 - Worker 1
distry-worker --port 8001

# Terminal 2 - Worker 2 (with RAM limit)
distry-worker --port 8002 --max-ram 2g
```

### 2. Run Tasks

```python
from distry import Client

# Connect to workers
client = Client(["http://127.0.0.1:8001", "http://127.0.0.1:8002"])

# Define function (any Python function works!)
import numpy as np

def process_data(x):
    return np.mean([x, x**2, x**3])

# Process inputs in parallel
results = client.map(process_data, [1, 2, 3, 4, 5])

print(results)
# [1.0, 6.0, 19.0, 40.0, 69.0]

client.close()
```

### 2b. Using the Decorator (for single function calls)

For simpler cases where you want to execute a single function call on a worker, you can use the `@distry` decorator.

```python
from distry import register_workers, distry
import numpy as np

# Connect to workers
register_workers(["http://127.0.0.1:8001", "http://127.0.0.1:8002"])

@distry
def process_data(x, power=2):
    return np.mean([x, x**power])

# Process a single input on a randomly selected worker
result = process_data(10)
print(result)
# 55.0

# With keyword arguments
result_power_3 = process_data(10, power=3)
print(result_power_3)
# 505.0
```

### 3. Advanced Usage

```python
from distry import Client

client = Client(worker_urls)

# Custom packages (optional - auto-detection works too)
def scipy_func(x):
    from scipy.special import factorial
    return float(factorial(x))

results = client.map(
    scipy_func,
    [1, 2, 3, 4],
    required_packages=['scipy'],  # Manual specification
    max_workers=2
)

# Results with error handling
def risky_func(x):
    if x == 3:
        raise ValueError("Oops!")
    return x * 2

results = client.map(risky_func, [1, 2, 3, 4])  # [2, 4, None, 8]

client.close()
```

## API Reference

### Client

```python
from distry import Client

client = Client(worker_urls, max_concurrent_jobs=10)

# Map function across inputs
results = client.map(
    func,           # Any Python function
    inputs,         # List of inputs
    max_workers=4,  # Limit concurrent workers
    timeout=60,     # Timeout per input
    required_packages=None  # Auto-detected
)

# Cluster status
status = client.get_cluster_status()

client.close()
```

### Worker

```python
from distry import WorkerServer

# Programmatic worker
server = WorkerServer(host="0.0.0.0", port=8000)
server.run()

# Or use CLI
# distry-worker --host 0.0.0.0 --port 8000
```

## CLI

```plaintext
# Start worker
distry-worker --help
distry-worker --host 0.0.0.0 --port 8000 --max-ram 4g

# The client will automatically split large jobs into batches
# to fit the worker's RAM limit.

# View worker endpoints
# GET /health
# GET /status
# GET /installed_packages
```

## What Happens Under the Hood?

1. **Function Analysis**: Auto-detects imports from your function
2. **Package Installation**: Installs missing packages on workers
3. **Task Distribution**: Splits inputs across available workers
4. **Result Collection**: Gathers results with global indexing
5. **Error Handling**: Failed inputs return `None`, others succeed

## Use Cases

* **Data Processing**: Apply functions to large datasets
* **ML Inference**: Scale model predictions across workers
* **API Calls**: Parallelize HTTP requests
* **Computational Tasks**: CPU-intensive calculations
* **Batch Processing**: Process files, images, or documents

## Limitations

* Single function per job (no complex workflows)
* 30s timeout per input (configurable)
* Synchronous function execution on workers
* Basic package management (no virtual environments)
